/Misc/RPM/

tom feed' href='http://service.techsat.com/oss-git/cpython.git/atom/?h=v3.12.0' type='application/atom+xml'/>
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--.hgignore8
-rw-r--r--.hgtags1
-rw-r--r--Doc/c-api/dict.rst9
-rw-r--r--Doc/c-api/init.rst20
-rw-r--r--Doc/c-api/memory.rst171
-rw-r--r--Doc/c-api/module.rst11
-rw-r--r--Doc/c-api/object.rst19
-rw-r--r--Doc/c-api/typeobj.rst49
-rw-r--r--Doc/c-api/unicode.rst11
-rw-r--r--Doc/c-api/veryhigh.rst24
-rw-r--r--Doc/data/refcounts.dat11
-rw-r--r--Doc/extending/embedding.rst8
-rw-r--r--Doc/extending/newtypes.rst24
-rw-r--r--Doc/faq/library.rst8
-rw-r--r--Doc/faq/programming.rst10
-rw-r--r--Doc/glossary.rst13
-rw-r--r--Doc/howto/functional.rst144
-rw-r--r--Doc/howto/logging-cookbook.rst4
-rw-r--r--Doc/howto/urllib2.rst2
-rw-r--r--Doc/includes/mp_benchmarks.py239
-rw-r--r--Doc/includes/mp_newtype.py14
-rw-r--r--Doc/includes/mp_pool.py337
-rw-r--r--Doc/includes/mp_synchronize.py278
-rw-r--r--Doc/includes/mp_webserver.py70
-rw-r--r--Doc/includes/mp_workers.py13
-rw-r--r--Doc/includes/typestruct.h7
-rw-r--r--Doc/library/2to3.rst4
-rw-r--r--Doc/library/abc.rst38
-rw-r--r--Doc/library/aifc.rst9
-rw-r--r--Doc/library/argparse.rst20
-rw-r--r--Doc/library/collections.rst13
-rw-r--r--Doc/library/contextlib.rst20
-rw-r--r--Doc/library/datatypes.rst1
-rw-r--r--Doc/library/datetime.rst10
-rw-r--r--Doc/library/dis.rst232
-rw-r--r--Doc/library/doctest.rst18
-rw-r--r--Doc/library/email.message.rst69
-rw-r--r--Doc/library/email.policy.rst11
-rw-r--r--Doc/library/enum.rst593
-rw-r--r--Doc/library/exceptions.rst6
-rw-r--r--Doc/library/filecmp.rst32
-rw-r--r--Doc/library/functions.rst44
-rw-r--r--Doc/library/functools.rst115
-rw-r--r--Doc/library/gc.rst47
-rw-r--r--Doc/library/hashlib.rst22
-rw-r--r--Doc/library/hmac.rst18
-rw-r--r--Doc/library/http.client.rst24
-rw-r--r--Doc/library/http.server.rst15
-rw-r--r--Doc/library/idle.rst345
-rw-r--r--Doc/library/imp.rst41
-rw-r--r--Doc/library/importlib.rst474
-rw-r--r--Doc/library/inspect.rst21
-rw-r--r--Doc/library/json.rst72
-rw-r--r--Doc/library/logging.config.rst51
-rw-r--r--Doc/library/logging.handlers.rst8
-rw-r--r--Doc/library/marshal.rst9
-rw-r--r--Doc/library/multiprocessing.rst245
-rw-r--r--Doc/library/nntplib.rst3
-rw-r--r--Doc/library/operator.rst11
-rw-r--r--Doc/library/os.path.rst13
-rw-r--r--Doc/library/os.rst163
-rw-r--r--Doc/library/poplib.rst27
-rw-r--r--Doc/library/pprint.rst214
-rw-r--r--Doc/library/pty.rst3
-rw-r--r--Doc/library/py_compile.rst16
-rw-r--r--Doc/library/readline.rst20
-rw-r--r--Doc/library/rlcompleter.rst16
-rw-r--r--Doc/library/select.rst5
-rw-r--r--Doc/library/shelve.rst16
-rw-r--r--Doc/library/shutil.rst22
-rw-r--r--Doc/library/site.rst20
-rw-r--r--Doc/library/smtpd.rst19
-rw-r--r--Doc/library/smtplib.rst4
-rw-r--r--Doc/library/socket.rst37
-rw-r--r--Doc/library/sqlite3.rst14
-rw-r--r--Doc/library/ssl.rst191
-rw-r--r--Doc/library/stat.rst51
-rw-r--r--Doc/library/struct.rst20
-rw-r--r--Doc/library/subprocess.rst28
-rw-r--r--Doc/library/sys.rst37
-rw-r--r--Doc/library/sysconfig.rst2
-rw-r--r--Doc/library/textwrap.rst60
-rw-r--r--Doc/library/timeit.rst2
-rw-r--r--Doc/library/tkinter.rst26
-rw-r--r--Doc/library/traceback.rst2
-rw-r--r--Doc/library/types.rst32
-rw-r--r--Doc/library/unicodedata.rst8
-rw-r--r--Doc/library/unittest.mock-examples.rst14
-rw-r--r--Doc/library/unittest.mock.rst30
-rw-r--r--Doc/library/unittest.rst110
-rw-r--r--Doc/library/urllib.error.rst7
-rw-r--r--Doc/library/urllib.request.rst118
-rw-r--r--Doc/library/venv.rst5
-rw-r--r--Doc/library/wave.rst25
-rw-r--r--Doc/library/weakref.rst247
-rw-r--r--Doc/library/xml.etree.elementtree.rst107
-rw-r--r--Doc/library/zipfile.rst8
-rw-r--r--Doc/license.rst21
-rw-r--r--Doc/reference/compound_stmts.rst17
-rw-r--r--Doc/reference/datamodel.rst33
-rw-r--r--Doc/reference/import.rst20
-rw-r--r--Doc/tools/sphinxext/indexsidebar.html2
-rw-r--r--Doc/tools/sphinxext/pyspecific.py2
-rw-r--r--Doc/tools/sphinxext/susp-ignored.csv15
-rw-r--r--Doc/tutorial/interactive.rst153
-rw-r--r--Doc/tutorial/interpreter.rst14
-rw-r--r--Doc/tutorial/modules.rst35
-rw-r--r--Doc/tutorial/stdlib.rst2
-rw-r--r--Doc/tutorial/stdlib2.rst2
-rw-r--r--Doc/using/cmdline.rst40
-rw-r--r--Doc/using/mac.rst6
-rw-r--r--Doc/using/venv-create.inc29
-rw-r--r--Doc/whatsnew/3.4.rst498
-rw-r--r--Doc/whatsnew/index.rst1
-rw-r--r--Include/Python-ast.h31
-rw-r--r--Include/abstract.h29
-rw-r--r--Include/asdl.h1
-rw-r--r--Include/bytesobject.h10
-rw-r--r--Include/dictobject.h2
-rw-r--r--Include/frameobject.h3
-rw-r--r--Include/genobject.h2
-rw-r--r--Include/grammar.h2
-rw-r--r--Include/import.h6
-rw-r--r--Include/longobject.h13
-rw-r--r--Include/marshal.h2
-rw-r--r--Include/modsupport.h2
-rw-r--r--Include/object.h85
-rw-r--r--Include/objimpl.h104
-rw-r--r--Include/opcode.h2
-rw-r--r--Include/osdefs.h8
-rw-r--r--Include/patchlevel.h10
-rw-r--r--Include/pydebug.h1
-rw-r--r--Include/pymem.h95
-rw-r--r--Include/pyport.h45
-rw-r--r--Include/pystate.h10
-rw-r--r--Include/pythonrun.h3
-rw-r--r--Include/setobject.h4
-rw-r--r--Include/sliceobject.h3
-rw-r--r--Include/structseq.h2
-rw-r--r--Include/symtable.h4
-rw-r--r--Include/token.h2
-rw-r--r--Include/unicodeobject.h73
-rw-r--r--Include/warnings.h6
-rw-r--r--LICENSE1
-rw-r--r--Lib/_osx_support.py4
-rw-r--r--Lib/_pyio.py35
-rw-r--r--Lib/_sitebuiltins.py99
-rw-r--r--Lib/_strptime.py2
-rw-r--r--Lib/abc.py20
-rw-r--r--Lib/aifc.py29
-rw-r--r--Lib/argparse.py28
-rw-r--r--Lib/ast.py6
-rw-r--r--Lib/asynchat.py8
-rw-r--r--Lib/asyncore.py29
-rwxr-xr-xLib/base64.py115
-rw-r--r--Lib/bz2.py44
-rwxr-xr-xLib/cProfile.py53
-rwxr-xr-xLib/cgi.py6
-rw-r--r--Lib/chunk.py6
-rw-r--r--Lib/collections/__init__.py18
-rw-r--r--Lib/collections/abc.py5
-rw-r--r--Lib/colorsys.py18
-rw-r--r--Lib/compileall.py19
-rw-r--r--Lib/concurrent/futures/_base.py3
-rw-r--r--Lib/concurrent/futures/process.py8
-rw-r--r--Lib/concurrent/futures/thread.py2
-rw-r--r--Lib/configparser.py2
-rw-r--r--Lib/contextlib.py14
-rw-r--r--Lib/ctypes/__init__.py26
-rw-r--r--Lib/ctypes/test/__init__.py2
-rw-r--r--Lib/ctypes/test/test_checkretval.py2
-rw-r--r--Lib/ctypes/test/test_internals.py19
-rw-r--r--Lib/ctypes/test/test_macholib.py56
-rw-r--r--Lib/ctypes/test/test_win32.py2
-rw-r--r--Lib/ctypes/util.py5
-rw-r--r--Lib/datetime.py390
-rw-r--r--Lib/dbm/__init__.py16
-rw-r--r--Lib/dbm/dumb.py10
-rw-r--r--Lib/decimal.py4
-rw-r--r--Lib/difflib.py35
-rw-r--r--Lib/dis.py335
-rw-r--r--Lib/distutils/__init__.py2
-rw-r--r--Lib/distutils/ccompiler.py5
-rw-r--r--Lib/distutils/command/bdist.py3
-rw-r--r--Lib/distutils/command/bdist_dumb.py8
-rw-r--r--Lib/distutils/command/build_ext.py26
-rw-r--r--Lib/distutils/command/build_py.py10
-rw-r--r--Lib/distutils/command/build_scripts.py2
-rw-r--r--Lib/distutils/command/install.py15
-rw-r--r--Lib/distutils/command/install_lib.py6
-rw-r--r--Lib/distutils/command/upload.py2
-rw-r--r--Lib/distutils/config.py11
-rw-r--r--Lib/distutils/core.py2
-rw-r--r--Lib/distutils/cygwinccompiler.py2
-rw-r--r--Lib/distutils/dir_util.py4
-rw-r--r--Lib/distutils/emxccompiler.py315
-rw-r--r--Lib/distutils/errors.py4
-rw-r--r--Lib/distutils/file_util.py16
-rw-r--r--Lib/distutils/msvc9compiler.py2
-rw-r--r--Lib/distutils/spawn.py24
-rw-r--r--Lib/distutils/sysconfig.py30
-rw-r--r--Lib/distutils/tests/test_bdist_dumb.py5
-rw-r--r--Lib/distutils/tests/test_build_py.py10
-rw-r--r--Lib/distutils/tests/test_config.py4
-rw-r--r--Lib/distutils/tests/test_install.py6
-rw-r--r--Lib/distutils/tests/test_install_lib.py8
-rw-r--r--Lib/distutils/tests/test_upload.py14
-rw-r--r--Lib/distutils/tests/test_util.py2
-rw-r--r--Lib/distutils/util.py17
-rw-r--r--Lib/doctest.py47
-rw-r--r--Lib/email/_header_value_parser.py37
-rw-r--r--Lib/email/feedparser.py27
-rw-r--r--Lib/email/iterators.py6
-rw-r--r--Lib/email/message.py44
-rw-r--r--Lib/email/parser.py3
-rw-r--r--Lib/email/utils.py14
-rw-r--r--Lib/encodings/cp037.py1
-rw-r--r--Lib/encodings/cp500.py1
-rw-r--r--Lib/encodings/iso8859_1.py1
-rw-r--r--Lib/enum.py481
-rw-r--r--Lib/filecmp.py25
-rw-r--r--Lib/fileinput.py12
-rw-r--r--Lib/fractions.py14
-rw-r--r--Lib/ftplib.py164
-rw-r--r--Lib/functools.py253
-rw-r--r--Lib/genericpath.py34
-rw-r--r--Lib/getpass.py99
-rw-r--r--Lib/gettext.py14
-rw-r--r--Lib/glob.py5
-rw-r--r--Lib/gzip.py101
-rw-r--r--Lib/hashlib.py15
-rw-r--r--Lib/hmac.py10
-rw-r--r--Lib/html/__init__.py13
-rw-r--r--Lib/html/parser.py2
-rw-r--r--Lib/http/client.py44
-rw-r--r--Lib/http/cookiejar.py31
-rw-r--r--Lib/http/server.py28
-rw-r--r--Lib/idlelib/EditorWindow.py4
-rw-r--r--Lib/idlelib/FileList.py2
-rw-r--r--Lib/idlelib/GrepDialog.py1
-rw-r--r--Lib/idlelib/IOBinding.py2
-rw-r--r--Lib/idlelib/NEWS.txt6
-rw-r--r--Lib/idlelib/PathBrowser.py2
-rw-r--r--Lib/idlelib/PyShell.py12
-rw-r--r--Lib/idlelib/TreeWidget.py4
-rw-r--r--Lib/idlelib/configHandler.py4
-rw-r--r--Lib/idlelib/help.txt556
-rw-r--r--Lib/idlelib/idlever.py2
-rw-r--r--Lib/idlelib/rpc.py8
-rw-r--r--Lib/idlelib/run.py4
-rw-r--r--Lib/imaplib.py10
-rw-r--r--Lib/imghdr.py2
-rw-r--r--Lib/imp.py194
-rw-r--r--Lib/importlib/__init__.py42
-rw-r--r--Lib/importlib/_bootstrap.py814
-rw-r--r--Lib/importlib/abc.py318
-rw-r--r--Lib/importlib/util.py50
-rw-r--r--Lib/inspect.py70
-rw-r--r--Lib/io.py2
-rw-r--r--Lib/json/__init__.py25
-rw-r--r--Lib/json/decoder.py28
-rw-r--r--Lib/json/encoder.py56
-rw-r--r--Lib/json/scanner.py4
-rw-r--r--Lib/json/tool.py3
-rwxr-xr-xLib/keyword.py23
-rw-r--r--Lib/lib2to3/btm_utils.py6
-rw-r--r--Lib/lib2to3/fixer_util.py23
-rw-r--r--Lib/lib2to3/fixes/fix_intern.py21
-rw-r--r--Lib/lib2to3/fixes/fix_reload.py28
-rw-r--r--Lib/lib2to3/main.py4
-rw-r--r--Lib/lib2to3/pgen2/conv.py4
-rw-r--r--Lib/lib2to3/pgen2/driver.py2
-rw-r--r--Lib/lib2to3/pgen2/grammar.py10
-rw-r--r--Lib/lib2to3/pytree.py9
-rw-r--r--Lib/lib2to3/refactor.py6
-rwxr-xr-xLib/lib2to3/tests/pytree_idempotency.py2
-rw-r--r--Lib/lib2to3/tests/test_fixers.py59
-rw-r--r--Lib/linecache.py8
-rw-r--r--Lib/logging/__init__.py78
-rw-r--r--Lib/logging/config.py76
-rw-r--r--Lib/logging/handlers.py102
-rw-r--r--Lib/lzma.py130
-rw-r--r--Lib/macpath.py2
-rw-r--r--Lib/mailbox.py83
-rw-r--r--Lib/mailcap.py2
-rw-r--r--Lib/mimetypes.py6
-rw-r--r--Lib/modulefinder.py7
-rw-r--r--Lib/multiprocessing/__init__.py145
-rw-r--r--Lib/multiprocessing/connection.py84
-rw-r--r--Lib/multiprocessing/dummy/__init__.py31
-rw-r--r--Lib/multiprocessing/dummy/connection.py27
-rw-r--r--Lib/multiprocessing/forking.py474
-rw-r--r--Lib/multiprocessing/forkserver.py238
-rw-r--r--Lib/multiprocessing/heap.py56
-rw-r--r--Lib/multiprocessing/managers.py46
-rw-r--r--Lib/multiprocessing/pool.py127
-rw-r--r--Lib/multiprocessing/popen.py78
-rw-r--r--Lib/multiprocessing/popen_fork.py87
-rw-r--r--Lib/multiprocessing/popen_forkserver.py75
-rw-r--r--Lib/multiprocessing/popen_spawn_posix.py75
-rw-r--r--Lib/multiprocessing/popen_spawn_win32.py102
-rw-r--r--Lib/multiprocessing/process.py60
-rw-r--r--Lib/multiprocessing/queues.py99
-rw-r--r--Lib/multiprocessing/reduction.py363
-rw-r--r--Lib/multiprocessing/resource_sharer.py158
-rw-r--r--Lib/multiprocessing/semaphore_tracker.py135
-rw-r--r--Lib/multiprocessing/sharedctypes.py7
-rw-r--r--Lib/multiprocessing/spawn.py258
-rw-r--r--Lib/multiprocessing/synchronize.py73
-rw-r--r--Lib/multiprocessing/util.py70
-rw-r--r--Lib/netrc.py2
-rw-r--r--Lib/nntplib.py4
-rw-r--r--Lib/ntpath.py60
-rw-r--r--Lib/nturl2path.py4
-rw-r--r--Lib/opcode.py4
-rw-r--r--Lib/operator.py412
-rw-r--r--Lib/os.py68
-rw-r--r--Lib/os2emxpath.py158
-rwxr-xr-xLib/pdb.py10
-rw-r--r--Lib/pickle.py240
-rw-r--r--Lib/pickletools.py225
-rw-r--r--Lib/pkgutil.py95
-rw-r--r--Lib/plat-os2emx/IN.py82
-rw-r--r--Lib/plat-os2emx/SOCKET.py106
-rw-r--r--Lib/plat-os2emx/_emx_link.py79
-rw-r--r--Lib/plat-os2emx/grp.py182
-rw-r--r--Lib/plat-os2emx/pwd.py208
-rwxr-xr-xLib/plat-os2emx/regen7
-rwxr-xr-xLib/platform.py91
-rw-r--r--Lib/poplib.py91
-rw-r--r--Lib/posixpath.py57
-rw-r--r--Lib/pprint.py39
-rwxr-xr-xLib/profile.py63
-rw-r--r--Lib/pstats.py12
-rw-r--r--Lib/pty.py22
-rw-r--r--Lib/py_compile.py77
-rwxr-xr-xLib/pydoc.py83
-rw-r--r--Lib/pydoc_data/topics.py24
-rwxr-xr-xLib/quopri.py2
-rw-r--r--Lib/random.py10
-rw-r--r--Lib/rlcompleter.py5
-rw-r--r--Lib/runpy.py11
-rw-r--r--Lib/sched.py11
-rw-r--r--Lib/shelve.py9
-rw-r--r--Lib/shutil.py39
-rw-r--r--Lib/site.py175
-rwxr-xr-xLib/smtpd.py19
-rw-r--r--Lib/smtplib.py10
-rw-r--r--Lib/sndhdr.py17
-rw-r--r--Lib/socket.py35
-rw-r--r--Lib/socketserver.py8
-rw-r--r--Lib/sqlite3/test/dbapi.py18
-rw-r--r--Lib/sre_compile.py7
-rw-r--r--Lib/ssl.py196
-rw-r--r--Lib/stat.py6
-rw-r--r--Lib/struct.py1
-rw-r--r--Lib/subprocess.py84
-rwxr-xr-xLib/symbol.py4
-rw-r--r--Lib/symtable.py3
-rw-r--r--Lib/sysconfig.py35
-rwxr-xr-xLib/tabnanny.py2
-rw-r--r--Lib/tarfile.py29
-rw-r--r--Lib/telnetlib.py6
-rw-r--r--Lib/tempfile.py11
-rw-r--r--Lib/test/__main__.py14
-rw-r--r--Lib/test/_test_multiprocessing.py (renamed from Lib/test/test_multiprocessing.py)510
-rw-r--r--Lib/test/badsyntax_future10.py3
-rw-r--r--Lib/test/bytecode_helper.py72
-rw-r--r--Lib/test/datetimetester.py4
-rw-r--r--Lib/test/final_a.py19
-rw-r--r--Lib/test/final_b.py19
-rw-r--r--Lib/test/fork_wait.py2
-rw-r--r--Lib/test/keycert3.pem73
-rw-r--r--Lib/test/keycert4.pem73
-rw-r--r--Lib/test/leakers/test_gestalt.py14
-rw-r--r--Lib/test/lock_tests.py5
-rw-r--r--Lib/test/make_ssl_certs.py112
-rw-r--r--Lib/test/mock_socket.py8
-rw-r--r--Lib/test/mp_fork_bomb.py5
-rw-r--r--Lib/test/multibytecodec_support.py2
-rw-r--r--Lib/test/pickletester.py53
-rw-r--r--Lib/test/pycacert.pem78
-rw-r--r--Lib/test/pycakey.pem28
-rwxr-xr-xLib/test/regrtest.py681
-rw-r--r--Lib/test/script_helper.py18
-rw-r--r--Lib/test/sortperf.py6
-rw-r--r--Lib/test/ssl_servers.py10
-rw-r--r--Lib/test/support/__init__.py61
-rw-r--r--Lib/test/test___all__.py30
-rw-r--r--Lib/test/test_abc.py16
-rw-r--r--Lib/test/test_aifc.py50
-rw-r--r--Lib/test/test_argparse.py32
-rwxr-xr-xLib/test/test_array.py4
-rw-r--r--Lib/test/test_ast.py98
-rw-r--r--Lib/test/test_asynchat.py35
-rw-r--r--Lib/test/test_asyncore.py19
-rw-r--r--Lib/test/test_atexit.py42
-rw-r--r--Lib/test/test_bisect.py10
-rw-r--r--Lib/test/test_buffer.py6
-rw-r--r--Lib/test/test_builtin.py52
-rw-r--r--Lib/test/test_bytes.py25
-rw-r--r--Lib/test/test_bz2.py155
-rw-r--r--Lib/test/test_capi.py7
-rw-r--r--Lib/test/test_cmd_line.py100
-rw-r--r--Lib/test/test_codeccallbacks.py4
-rw-r--r--Lib/test/test_codecs.py4
-rw-r--r--Lib/test/test_coding.py63
-rw-r--r--Lib/test/test_collections.py122
-rw-r--r--Lib/test/test_colorsys.py32
-rw-r--r--Lib/test/test_compileall.py50
-rw-r--r--Lib/test/test_complex.py2
-rw-r--r--Lib/test/test_concurrent_futures.py22
-rw-r--r--Lib/test/test_contextlib.py26
-rw-r--r--Lib/test/test_cprofile.py2
-rw-r--r--Lib/test/test_crypt.py6
-rw-r--r--Lib/test/test_csv.py21
-rw-r--r--Lib/test/test_dbm.py2
-rw-r--r--Lib/test/test_decimal.py1
-rw-r--r--Lib/test/test_deque.py4
-rw-r--r--Lib/test/test_descr.py15
-rw-r--r--Lib/test/test_devpoll.py2
-rw-r--r--Lib/test/test_dis.py339
-rw-r--r--Lib/test/test_doctest.py281
-rw-r--r--Lib/test/test_email/test_email.py33
-rw-r--r--Lib/test/test_email/torture_test.py2
-rw-r--r--Lib/test/test_enum.py1007
-rw-r--r--Lib/test/test_enumerate.py10
-rw-r--r--Lib/test/test_epoll.py19
-rw-r--r--Lib/test/test_exceptions.py28
-rw-r--r--Lib/test/test_faulthandler.py13
-rw-r--r--Lib/test/test_fcntl.py15
-rw-r--r--Lib/test/test_file.py6
-rw-r--r--Lib/test/test_filecmp.py23
-rw-r--r--Lib/test/test_fileinput.py22
-rw-r--r--Lib/test/test_fileio.py20
-rw-r--r--Lib/test/test_finalization.py513
-rw-r--r--Lib/test/test_fork1.py2
-rw-r--r--Lib/test/test_format.py19
-rw-r--r--Lib/test/test_fractions.py32
-rw-r--r--Lib/test/test_frame.py116
-rw-r--r--Lib/test/test_frozen.py6
-rw-r--r--Lib/test/test_ftplib.py54
-rw-r--r--Lib/test/test_functools.py694
-rw-r--r--Lib/test/test_future.py8
-rw-r--r--Lib/test/test_gc.py80
-rw-r--r--Lib/test/test_gdb.py1
-rw-r--r--Lib/test/test_generators.py74
-rw-r--r--Lib/test/test_genericpath.py82
-rw-r--r--Lib/test/test_getargs2.py88
-rw-r--r--Lib/test/test_getpass.py155
-rw-r--r--[-rwxr-xr-x]Lib/test/test_gzip.py14
-rw-r--r--Lib/test/test_hashlib.py147
-rw-r--r--Lib/test/test_hmac.py14
-rw-r--r--Lib/test/test_httplib.py30
-rw-r--r--Lib/test/test_httpservers.py21
-rw-r--r--Lib/test/test_imaplib.py2
-rw-r--r--Lib/test/test_imp.py87
-rw-r--r--Lib/test/test_import.py67
-rw-r--r--Lib/test/test_importhooks.py250
-rw-r--r--Lib/test/test_importlib/extension/test_case_sensitivity.py9
-rw-r--r--Lib/test/test_importlib/extension/test_path_hook.py1
-rw-r--r--Lib/test/test_importlib/extension/util.py1
-rw-r--r--Lib/test/test_importlib/frozen/test_loader.py12
-rw-r--r--Lib/test/test_importlib/import_/test___loader__.py44
-rw-r--r--Lib/test/test_importlib/import_/test_api.py6
-rw-r--r--Lib/test/test_importlib/import_/test_fromlist.py1
-rw-r--r--Lib/test/test_importlib/source/test_abc_loader.py906
-rw-r--r--Lib/test/test_importlib/source/test_case_sensitivity.py6
-rw-r--r--Lib/test/test_importlib/source/test_file_loader.py55
-rw-r--r--Lib/test/test_importlib/source/test_finder.py1
-rw-r--r--Lib/test/test_importlib/source/test_path_hook.py1
-rw-r--r--Lib/test/test_importlib/source/util.py1
-rw-r--r--Lib/test/test_importlib/test_abc.py768
-rw-r--r--Lib/test/test_importlib/test_api.py73
-rw-r--r--Lib/test/test_importlib/test_util.py299
-rw-r--r--Lib/test/test_importlib/util.py4
-rw-r--r--Lib/test/test_inspect.py82
-rw-r--r--Lib/test/test_int.py41
-rw-r--r--Lib/test/test_io.py116
-rw-r--r--Lib/test/test_ioctl.py6
-rw-r--r--Lib/test/test_iterlen.py62
-rw-r--r--Lib/test/test_itertools.py5
-rw-r--r--Lib/test/test_json/test_enum.py81
-rw-r--r--Lib/test/test_json/test_fail.py89
-rw-r--r--Lib/test/test_json/test_indent.py4
-rw-r--r--Lib/test/test_keyword.py138
-rw-r--r--Lib/test/test_keywordonlyarg.py12
-rw-r--r--Lib/test/test_kqueue.py2
-rw-r--r--Lib/test/test_largefile.py2
-rw-r--r--Lib/test/test_logging.py323
-rw-r--r--Lib/test/test_long.py2
-rw-r--r--Lib/test/test_lzma.py14
-rw-r--r--Lib/test/test_mailbox.py2
-rw-r--r--Lib/test/test_marshal.py155
-rw-r--r--Lib/test/test_memoryio.py12
-rw-r--r--Lib/test/test_mmap.py26
-rw-r--r--Lib/test/test_module.py52
-rw-r--r--Lib/test/test_multibytecodec.py73
-rw-r--r--Lib/test/test_multiprocessing_fork.py7
-rw-r--r--Lib/test/test_multiprocessing_forkserver.py7
-rw-r--r--Lib/test/test_multiprocessing_spawn.py7
-rw-r--r--Lib/test/test_namespace_pkgs.py29
-rw-r--r--Lib/test/test_nntplib.py2
-rw-r--r--Lib/test/test_normalization.py2
-rw-r--r--Lib/test/test_ntpath.py34
-rw-r--r--Lib/test/test_openpty.py2
-rw-r--r--Lib/test/test_operator.py122
-rw-r--r--Lib/test/test_optparse.py8
-rw-r--r--Lib/test/test_os.py151
-rw-r--r--Lib/test/test_ossaudiodev.py4
-rw-r--r--Lib/test/test_pdb.py4
-rw-r--r--Lib/test/test_peepholer.py295
-rw-r--r--Lib/test/test_pep277.py4
-rw-r--r--Lib/test/test_pep352.py5
-rw-r--r--Lib/test/test_pkgimport.py2
-rw-r--r--Lib/test/test_pkgutil.py4
-rw-r--r--Lib/test/test_poll.py20
-rw-r--r--Lib/test/test_poplib.py157
-rw-r--r--Lib/test/test_posix.py2
-rw-r--r--Lib/test/test_posixpath.py62
-rw-r--r--Lib/test/test_pprint.py38
-rw-r--r--Lib/test/test_print.py74
-rw-r--r--Lib/test/test_profile.py29
-rw-r--r--Lib/test/test_pty.py2
-rw-r--r--Lib/test/test_py_compile.py43
-rw-r--r--Lib/test/test_pyclbr.py2
-rw-r--r--Lib/test/test_pydoc.py29
-rw-r--r--Lib/test/test_random.py207
-rw-r--r--Lib/test/test_range.py2
-rw-r--r--Lib/test/test_regrtest.py100
-rw-r--r--Lib/test/test_reprlib.py5
-rw-r--r--Lib/test/test_resource.py2
-rw-r--r--Lib/test/test_runpy.py9
-rw-r--r--Lib/test/test_sched.py5
-rw-r--r--Lib/test/test_scope.py17
-rw-r--r--Lib/test/test_select.py4
-rw-r--r--Lib/test/test_set.py2
-rw-r--r--Lib/test/test_shelve.py13
-rw-r--r--Lib/test/test_shutil.py37
-rw-r--r--Lib/test/test_signal.py60
-rw-r--r--Lib/test/test_site.py10
-rw-r--r--Lib/test/test_slice.py114
-rw-r--r--Lib/test/test_smtplib.py14
-rw-r--r--Lib/test/test_sndhdr.py2
-rw-r--r--Lib/test/test_socket.py237
-rw-r--r--Lib/test/test_socketserver.py20
-rw-r--r--Lib/test/test_source_encoding.py (renamed from Lib/test/test_pep263.py)67
-rw-r--r--Lib/test/test_ssl.py423
-rw-r--r--Lib/test/test_stat.py61
-rw-r--r--Lib/test/test_strftime.py4
-rw-r--r--Lib/test/test_struct.py89
-rw-r--r--Lib/test/test_subprocess.py54
-rw-r--r--Lib/test/test_sundry.py39
-rw-r--r--Lib/test/test_super.py33
-rw-r--r--Lib/test/test_syntax.py4
-rw-r--r--Lib/test/test_sys.py44
-rw-r--r--Lib/test/test_sysconfig.py44
-rw-r--r--Lib/test/test_tarfile.py10
-rw-r--r--Lib/test/test_tempfile.py14
-rw-r--r--Lib/test/test_textwrap.py68
-rw-r--r--Lib/test/test_thread.py2
-rw-r--r--Lib/test/test_threaded_import.py2
-rw-r--r--Lib/test/test_threading.py27
-rw-r--r--Lib/test/test_threadsignals.py2
-rw-r--r--Lib/test/test_timeout.py2
-rw-r--r--Lib/test/test_traceback.py52
-rw-r--r--Lib/test/test_types.py37
-rw-r--r--Lib/test/test_ucn.py2
-rw-r--r--Lib/test/test_unicode.py333
-rw-r--r--Lib/test/test_unicodedata.py2
-rw-r--r--Lib/test/test_urllib.py103
-rw-r--r--Lib/test/test_urllib2.py128
-rw-r--r--Lib/test/test_urllib2_localnet.py30
-rw-r--r--Lib/test/test_urllib2net.py43
-rw-r--r--Lib/test/test_urllibnet.py19
-rwxr-xr-xLib/test/test_urlparse.py8
-rw-r--r--Lib/test/test_venv.py59
-rw-r--r--Lib/test/test_wait3.py12
-rw-r--r--Lib/test/test_wave.py71
-rw-r--r--Lib/test/test_weakref.py316
-rw-r--r--Lib/test/test_winreg.py28
-rw-r--r--Lib/test/test_winsound.py2
-rw-r--r--Lib/test/test_xml_etree.py204
-rw-r--r--Lib/test/test_xml_etree_c.py9
-rw-r--r--Lib/test/test_xmlrpc.py57
-rw-r--r--Lib/test/test_xmlrpc_net.py4
-rw-r--r--Lib/test/test_zipfile.py13
-rw-r--r--Lib/test/test_zipimport.py37
-rw-r--r--Lib/test/tf_inherit_check.py2
-rw-r--r--Lib/textwrap.py53
-rw-r--r--Lib/threading.py25
-rw-r--r--Lib/timeit.py46
-rw-r--r--Lib/tkinter/__init__.py39
-rw-r--r--Lib/tkinter/filedialog.py4
-rwxr-xr-xLib/token.py6
-rw-r--r--Lib/tokenize.py2
-rw-r--r--Lib/trace.py10
-rw-r--r--Lib/traceback.py250
-rw-r--r--Lib/turtle.py22
-rwxr-xr-xLib/turtledemo/__main__.py2
-rw-r--r--Lib/unittest/case.py252
-rw-r--r--Lib/unittest/loader.py18
-rw-r--r--Lib/unittest/main.py5
-rw-r--r--Lib/unittest/mock.py229
-rw-r--r--Lib/unittest/result.py16
-rw-r--r--Lib/unittest/test/support.py38
-rw-r--r--Lib/unittest/test/test_case.py94
-rw-r--r--Lib/unittest/test/test_discovery.py34
-rw-r--r--Lib/unittest/test/test_program.py35
-rw-r--r--Lib/unittest/test/test_result.py92
-rw-r--r--Lib/unittest/test/test_runner.py12
-rw-r--r--Lib/unittest/test/test_skipping.py74
-rw-r--r--Lib/unittest/test/testmock/testhelpers.py59
-rw-r--r--Lib/unittest/test/testmock/testmock.py125
-rw-r--r--Lib/unittest/test/testmock/testwith.py83
-rw-r--r--Lib/urllib/error.py14
-rw-r--r--Lib/urllib/parse.py9
-rw-r--r--Lib/urllib/request.py180
-rw-r--r--Lib/uuid.py4
-rw-r--r--Lib/venv/__init__.py23
-rw-r--r--Lib/venv/scripts/nt/Activate.ps145
-rw-r--r--Lib/venv/scripts/nt/Deactivate.ps119
-rw-r--r--Lib/venv/scripts/posix/activate.csh37
-rw-r--r--Lib/venv/scripts/posix/activate.fish74
-rw-r--r--Lib/warnings.py2
-rw-r--r--Lib/wave.py52
-rw-r--r--Lib/weakref.py198
-rw-r--r--Lib/webbrowser.py92
-rw-r--r--Lib/xml/dom/expatbuilder.py10
-rw-r--r--Lib/xml/etree/ElementInclude.py6
-rw-r--r--Lib/xml/etree/ElementPath.py15
-rw-r--r--Lib/xml/etree/ElementTree.py1373
-rw-r--r--Lib/xmlrpc/client.py9
-rw-r--r--Lib/zipfile.py18
-rwxr-xr-xMac/BuildScript/build-installer.py56
-rw-r--r--Mac/Tools/bundlebuilder.py2
-rw-r--r--Makefile.pre.in95
-rw-r--r--Misc/ACKS42
-rw-r--r--Misc/HISTORY4101
-rw-r--r--Misc/NEWS1374
-rw-r--r--Misc/README4
-rw-r--r--Misc/RPM/python-3.4.spec (renamed from Misc/RPM/python-3.3.spec)7
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Commands/2 to 3 - Module Deletion.tmCommand64
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Commands/Build Docs.tmCommand23
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Commands/Build.tmCommand25
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Commands/Go to Issue.tmCommand20
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Commands/Open Docs.tmCommand32
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Commands/Open PEP.tmCommand23
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet16
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/info.plist37
-rw-r--r--Misc/Vim/python.vim148
-rw-r--r--Misc/Vim/syntax_test.py62
-rw-r--r--Misc/Vim/vim_syntax.py229
-rw-r--r--Misc/Vim/vimrc87
-rw-r--r--Misc/coverity_model.c132
-rw-r--r--Misc/python-config.in2
-rw-r--r--Misc/python-config.sh.in111
-rw-r--r--Misc/python.man14
-rw-r--r--Modules/Setup.dist5
-rw-r--r--Modules/_bz2module.c37
-rw-r--r--Modules/_codecsmodule.c6
-rw-r--r--Modules/_collectionsmodule.c410
-rw-r--r--Modules/_csv.c13
-rw-r--r--Modules/_ctypes/_ctypes.c26
-rw-r--r--Modules/_ctypes/callbacks.c23
-rw-r--r--Modules/_ctypes/callproc.c105
-rw-r--r--Modules/_ctypes/libffi_osx/ffi.c11
-rw-r--r--Modules/_ctypes/libffi_osx/x86/x86-ffi64.c11
-rw-r--r--Modules/_curses_panel.c8
-rw-r--r--Modules/_cursesmodule.c26
-rw-r--r--Modules/_datetimemodule.c78
-rw-r--r--Modules/_dbmmodule.c18
-rw-r--r--Modules/_elementtree.c398
-rw-r--r--Modules/_freeze_importlib.c6
-rw-r--r--Modules/_gdbmmodule.c22
-rw-r--r--Modules/_gestalt.c84
-rw-r--r--Modules/_hashopenssl.c22
-rw-r--r--Modules/_heapqmodule.c5
-rw-r--r--Modules/_io/_iomodule.c25
-rw-r--r--Modules/_io/_iomodule.h4
-rw-r--r--Modules/_io/bufferedio.c84
-rw-r--r--Modules/_io/fileio.c165
-rw-r--r--Modules/_io/iobase.c96
-rw-r--r--Modules/_io/textio.c105
-rw-r--r--Modules/_json.c177
-rw-r--r--Modules/_localemodule.c36
-rw-r--r--Modules/_lsprof.c32
-rw-r--r--Modules/_lzmamodule.c28
-rw-r--r--Modules/_multiprocessing/multiprocessing.c26
-rw-r--r--Modules/_multiprocessing/multiprocessing.h16
-rw-r--r--Modules/_multiprocessing/semaphore.c98
-rw-r--r--Modules/_operator.c (renamed from Modules/operator.c)125
-rw-r--r--Modules/_pickle.c204
-rw-r--r--Modules/_posixsubprocess.c2
-rw-r--r--Modules/_randommodule.c105
-rwxr-xr-xModules/_sha3/cleanup.py49
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-32-rvk.macros555
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-32-s1.macros1187
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-32-s2.macros1187
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-32.macros26
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-64.macros728
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-int-set.h6
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-interface.h46
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-opt32-settings.h6
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-opt32.c524
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-opt64-settings.h9
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-opt64.c510
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-simd128.macros651
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-simd64.macros517
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-unrolling.macros124
-rw-r--r--Modules/_sha3/keccak/KeccakF-1600-xop.macros573
-rw-r--r--Modules/_sha3/keccak/KeccakNISTInterface.c83
-rw-r--r--Modules/_sha3/keccak/KeccakNISTInterface.h72
-rw-r--r--Modules/_sha3/keccak/KeccakSponge.c266
-rw-r--r--Modules/_sha3/keccak/KeccakSponge.h76
-rwxr-xr-xModules/_sha3/keccak/brg_endian.h142
-rw-r--r--Modules/_sha3/keccak/crypto_hash.h (renamed from Modules/_ctypes/libffi/testsuite/libffi.call/a.out)0
-rw-r--r--Modules/_sha3/sha3module.c585
-rw-r--r--Modules/_sqlite/cache.c1
-rw-r--r--Modules/_sqlite/connection.c64
-rw-r--r--Modules/_sqlite/cursor.c6
-rw-r--r--Modules/_sqlite/module.c16
-rw-r--r--Modules/_sqlite/prepare_protocol.c1
-rw-r--r--Modules/_sqlite/row.c1
-rw-r--r--Modules/_sqlite/sqlitecompat.h63
-rw-r--r--Modules/_sqlite/statement.c1
-rw-r--r--Modules/_sqlite/util.c2
-rw-r--r--Modules/_sre.c31
-rw-r--r--Modules/_ssl.c751
-rw-r--r--Modules/_stat.c563
-rw-r--r--Modules/_struct.c359
-rw-r--r--Modules/_testbuffer.c60
-rw-r--r--Modules/_testcapimodule.c315
-rw-r--r--Modules/_testimportmultiple.c57
-rw-r--r--Modules/_threadmodule.c2
-rw-r--r--Modules/_tkinter.c662
-rw-r--r--Modules/_winapi.c7
-rw-r--r--Modules/arraymodule.c59
-rw-r--r--Modules/atexitmodule.c121
-rw-r--r--Modules/audioop.c12
-rw-r--r--Modules/binascii.c23
-rw-r--r--Modules/cjkcodecs/_codecs_cn.c210
-rw-r--r--Modules/cjkcodecs/_codecs_hk.c72
-rw-r--r--Modules/cjkcodecs/_codecs_iso2022.c283
-rw-r--r--Modules/cjkcodecs/_codecs_jp.c325
-rw-r--r--Modules/cjkcodecs/_codecs_kr.c152
-rw-r--r--Modules/cjkcodecs/_codecs_tw.c60
-rw-r--r--Modules/cjkcodecs/alg_jisx0201.h21
-rw-r--r--Modules/cjkcodecs/cjkcodecs.h158
-rw-r--r--Modules/cjkcodecs/emu_jisx0213_2000.h5
-rw-r--r--Modules/cjkcodecs/mappings_cn.h2
-rw-r--r--Modules/cjkcodecs/mappings_jisx0213_pair.h2
-rw-r--r--Modules/cjkcodecs/multibytecodec.c340
-rw-r--r--Modules/cjkcodecs/multibytecodec.h17
-rw-r--r--Modules/faulthandler.c20
-rw-r--r--Modules/fcntlmodule.c172
-rw-r--r--Modules/gcmodule.c302
-rw-r--r--Modules/getpath.c24
-rw-r--r--Modules/grpmodule.c11
-rw-r--r--Modules/hashlib.h33
-rw-r--r--Modules/main.c71
-rw-r--r--Modules/md5module.c10
-rw-r--r--Modules/mmapmodule.c8
-rw-r--r--Modules/ossaudiodev.c6
-rw-r--r--Modules/parsermodule.c101
-rw-r--r--Modules/posixmodule.c1801
-rw-r--r--Modules/pwdmodule.c9
-rw-r--r--Modules/pyexpat.c64
-rw-r--r--Modules/python.c27
-rw-r--r--Modules/readline.c160
-rw-r--r--Modules/resource.c43
-rw-r--r--Modules/selectmodule.c83
-rw-r--r--Modules/sha1module.c10
-rw-r--r--Modules/sha256module.c30
-rw-r--r--Modules/sha512module.c30
-rw-r--r--Modules/signalmodule.c44
-rw-r--r--Modules/socketmodule.c814
-rw-r--r--Modules/socketmodule.h6
-rw-r--r--Modules/spwdmodule.c8
-rw-r--r--Modules/symtablemodule.c32
-rw-r--r--Modules/syslogmodule.c66
-rw-r--r--Modules/timemodule.c75
-rw-r--r--Modules/unicodedata_db.h616
-rw-r--r--Modules/unicodename_db.h22399
-rw-r--r--Modules/zipimport.c29
-rw-r--r--Modules/zlibmodule.c110
-rw-r--r--Objects/abstract.c122
-rw-r--r--Objects/bytearrayobject.c84
-rw-r--r--Objects/bytes_methods.c30
-rw-r--r--Objects/bytesobject.c157
-rw-r--r--Objects/classobject.c6
-rw-r--r--Objects/complexobject.c16
-rw-r--r--Objects/descrobject.c10
-rw-r--r--Objects/dictobject.c179
-rw-r--r--Objects/exceptions.c2
-rw-r--r--Objects/fileobject.c2
-rw-r--r--Objects/floatobject.c28
-rw-r--r--Objects/frameobject.c47
-rw-r--r--Objects/funcobject.c101
-rw-r--r--Objects/genobject.c105
-rw-r--r--Objects/iterobject.c13
-rw-r--r--Objects/listobject.c55
-rw-r--r--Objects/longobject.c171
-rw-r--r--Objects/methodobject.c53
-rw-r--r--Objects/moduleobject.c62
-rw-r--r--Objects/namespaceobject.c60
-rw-r--r--Objects/object.c149
-rw-r--r--Objects/obmalloc.c558
-rw-r--r--Objects/rangeobject.c205
-rw-r--r--Objects/setobject.c190
-rw-r--r--Objects/sliceobject.c191
-rw-r--r--Objects/stringlib/asciilib.h1
-rw-r--r--Objects/stringlib/codecs.h12
-rw-r--r--Objects/stringlib/eq.h4
-rw-r--r--Objects/stringlib/fastsearch.h8
-rw-r--r--Objects/stringlib/find_max_char.h4
-rw-r--r--Objects/stringlib/join.h133
-rw-r--r--Objects/stringlib/replace.h53
-rw-r--r--Objects/stringlib/split.h4
-rw-r--r--Objects/stringlib/stringdefs.h1
-rw-r--r--Objects/stringlib/ucs1lib.h1
-rw-r--r--Objects/stringlib/ucs2lib.h1
-rw-r--r--Objects/stringlib/ucs4lib.h1
-rw-r--r--Objects/stringlib/undef.h1
-rw-r--r--Objects/stringlib/unicode_format.h139
-rw-r--r--Objects/stringlib/unicodedefs.h6
-rw-r--r--Objects/structseq.c86
-rw-r--r--Objects/tupleobject.c57
-rw-r--r--Objects/typeobject.c192
-rw-r--r--Objects/unicodectype.c2
-rw-r--r--Objects/unicodeobject.c4106
-rw-r--r--Objects/unicodetype_db.h17
-rw-r--r--Objects/weakrefobject.c7
-rw-r--r--PC/VC6/_ctypes.dsp131
-rw-r--r--PC/VC6/_ctypes_test.dsp99
-rw-r--r--PC/VC6/_elementtree.dsp111
-rw-r--r--PC/VC6/_msi.dsp99
-rw-r--r--PC/VC6/_multiprocessing.dsp107
-rw-r--r--PC/VC6/_socket.dsp99
-rw-r--r--PC/VC6/_sqlite3.dsp131
-rw-r--r--PC/VC6/_ssl.dsp89
-rw-r--r--PC/VC6/_ssl.mak22
-rw-r--r--PC/VC6/_testcapi.dsp99
-rw-r--r--PC/VC6/_tkinter.dsp103
-rw-r--r--PC/VC6/build_ssl.py228
-rw-r--r--PC/VC6/build_tkinter.py81
-rw-r--r--PC/VC6/bz2.dsp99
-rw-r--r--PC/VC6/make_versioninfo.dsp108
-rw-r--r--PC/VC6/pcbuild.dsw306
-rw-r--r--PC/VC6/pyexpat.dsp111
-rw-r--r--PC/VC6/python.dsp100
-rw-r--r--PC/VC6/pythoncore.dsp780
-rw-r--r--PC/VC6/pythonw.dsp101
-rw-r--r--PC/VC6/readme.txt192
-rw-r--r--PC/VC6/rmpyc.py25
-rwxr-xr-xPC/VC6/rt.bat41
-rw-r--r--PC/VC6/select.dsp99
-rw-r--r--PC/VC6/tcl852.patch11
-rw-r--r--PC/VC6/unicodedata.dsp99
-rw-r--r--PC/VC6/w9xpopen.dsp97
-rw-r--r--PC/VC6/winsound.dsp99
-rw-r--r--PC/VS7.1/Uninstal.wse514
-rw-r--r--PC/VS7.1/_ctypes.vcproj311
-rw-r--r--PC/VS7.1/_ctypes_test.vcproj242
-rw-r--r--PC/VS7.1/_elementtree.vcproj264
-rw-r--r--PC/VS7.1/_msi.vcproj252
-rw-r--r--PC/VS7.1/_socket.vcproj254
-rw-r--r--PC/VS7.1/_sqlite3.vcproj283
-rw-r--r--PC/VS7.1/_ssl.mak38
-rw-r--r--PC/VS7.1/_ssl.vcproj84
-rw-r--r--PC/VS7.1/_testcapi.vcproj247
-rw-r--r--PC/VS7.1/_tkinter.vcproj261
-rw-r--r--PC/VS7.1/amd64_ml64.bat17
-rw-r--r--PC/VS7.1/build_ssl.bat12
-rw-r--r--PC/VS7.1/build_ssl.py181
-rw-r--r--PC/VS7.1/bz2.vcproj271
-rw-r--r--PC/VS7.1/db.build10
-rw-r--r--PC/VS7.1/field3.py35
-rw-r--r--PC/VS7.1/installer.bmpbin58806 -> 0 bytes
-rw-r--r--PC/VS7.1/make_buildinfo.c92
-rw-r--r--PC/VS7.1/make_buildinfo.vcproj122
-rw-r--r--PC/VS7.1/make_versioninfo.vcproj142
-rw-r--r--PC/VS7.1/pcbuild.sln275
-rw-r--r--PC/VS7.1/pyexpat.vcproj263
-rw-r--r--PC/VS7.1/python.build20
-rw-r--r--PC/VS7.1/python.iss341
-rw-r--r--PC/VS7.1/python.vcproj274
-rw-r--r--PC/VS7.1/python20.wse3117
-rw-r--r--PC/VS7.1/pythoncore.vcproj826
-rw-r--r--PC/VS7.1/pythonw.vcproj261
-rw-r--r--PC/VS7.1/readme.txt337
-rw-r--r--PC/VS7.1/rmpyc.py25
-rwxr-xr-xPC/VS7.1/rt.bat52
-rw-r--r--PC/VS7.1/select.vcproj258
-rw-r--r--PC/VS7.1/unicodedata.vcproj247
-rw-r--r--PC/VS7.1/w9xpopen.vcproj121
-rw-r--r--PC/VS7.1/winsound.vcproj251
-rw-r--r--PC/VS8.0/_ctypes.vcproj705
-rw-r--r--PC/VS8.0/_elementtree.vcproj613
-rw-r--r--PC/VS8.0/_hashlib.vcproj537
-rw-r--r--PC/VS8.0/_msi.vcproj529
-rw-r--r--PC/VS8.0/_multiprocessing.vcproj545
-rw-r--r--PC/VS8.0/_socket.vcproj537
-rw-r--r--PC/VS8.0/_sqlite3.vcproj613
-rw-r--r--PC/VS8.0/_ssl.vcproj537
-rw-r--r--PC/VS8.0/_tkinter.vcproj541
-rw-r--r--PC/VS8.0/bdist_wininst.vcproj270
-rw-r--r--PC/VS8.0/build.bat17
-rw-r--r--PC/VS8.0/build_env.bat1
-rw-r--r--PC/VS8.0/build_pgo.bat41
-rw-r--r--PC/VS8.0/build_ssl.bat12
-rw-r--r--PC/VS8.0/build_ssl.py277
-rw-r--r--PC/VS8.0/build_tkinter.py85
-rw-r--r--PC/VS8.0/bz2.vcproj581
-rw-r--r--PC/VS8.0/debug.vsprops15
-rw-r--r--PC/VS8.0/env.bat5
-rw-r--r--PC/VS8.0/field3.py35
-rw-r--r--PC/VS8.0/idle.bat15
-rw-r--r--PC/VS8.0/kill_python.c178
-rw-r--r--PC/VS8.0/kill_python.vcproj279
-rw-r--r--PC/VS8.0/make_buildinfo.c116
-rw-r--r--PC/VS8.0/make_buildinfo.vcproj101
-rw-r--r--PC/VS8.0/make_versioninfo.vcproj324
-rw-r--r--PC/VS8.0/pcbuild.sln560
-rw-r--r--PC/VS8.0/pginstrument.vsprops34
-rw-r--r--PC/VS8.0/pgupdate.vsprops14
-rw-r--r--PC/VS8.0/pyd.vsprops28
-rw-r--r--PC/VS8.0/pyd_d.vsprops36
-rw-r--r--PC/VS8.0/pyexpat.vcproj553
-rw-r--r--PC/VS8.0/pyproject.vsprops87
-rw-r--r--PC/VS8.0/python.vcproj637
-rw-r--r--PC/VS8.0/pythoncore.vcproj1921
-rw-r--r--PC/VS8.0/pythonw.vcproj618
-rw-r--r--PC/VS8.0/release.vsprops15
-rw-r--r--PC/VS8.0/rmpyc.py25
-rw-r--r--PC/VS8.0/rt.bat52
-rw-r--r--PC/VS8.0/select.vcproj537
-rw-r--r--PC/VS8.0/sqlite3.vcproj537
-rw-r--r--PC/VS8.0/sqlite3.vsprops14
-rw-r--r--PC/VS8.0/ssl.vcproj189
-rw-r--r--PC/VS8.0/unicodedata.vcproj533
-rw-r--r--PC/VS8.0/w9xpopen.vcproj576
-rw-r--r--PC/VS8.0/winsound.vcproj523
-rw-r--r--PC/VS8.0/x64.vsprops22
-rw-r--r--PC/VS9.0/_sha3.vcproj (renamed from PC/VS8.0/_ctypes_test.vcproj)18
-rw-r--r--PC/VS9.0/_sqlite3.vcproj4
-rw-r--r--PC/VS9.0/_ssl.vcproj18
-rw-r--r--PC/VS9.0/_testimportmultiple.vcproj (renamed from PC/VS8.0/_testcapi.vcproj)10
-rw-r--r--PC/VS9.0/kill_python.c2
-rw-r--r--PC/VS9.0/pcbuild.sln44
-rw-r--r--PC/VS9.0/pyproject.vsprops2
-rw-r--r--PC/VS9.0/pythoncore.vcproj10
-rw-r--r--PC/VS9.0/w9xpopen.vcproj576
-rw-r--r--PC/_msi.c68
-rw-r--r--PC/config.c6
-rw-r--r--PC/example_nt/example.vcproj4
-rw-r--r--PC/getpathp.c43
-rw-r--r--PC/launcher.c254
-rwxr-xr-xPC/msvcrtmodule.c5
-rw-r--r--PC/os2emx/Makefile672
-rw-r--r--PC/os2emx/README.os2emx663
-rw-r--r--PC/os2emx/config.c164
-rw-r--r--PC/os2emx/dlfcn.c223
-rw-r--r--PC/os2emx/dlfcn.h51
-rw-r--r--PC/os2emx/dllentry.c42
-rw-r--r--PC/os2emx/getpathp.c418
-rw-r--r--PC/os2emx/pyconfig.h332
-rw-r--r--PC/os2emx/python33.def1314
-rw-r--r--PC/os2emx/pythonpm.c124
-rw-r--r--PC/os2vacpp/_tkinter.def8
-rw-r--r--PC/os2vacpp/config.c99
-rw-r--r--PC/os2vacpp/getpathp.c482
-rw-r--r--PC/os2vacpp/makefile1549
-rw-r--r--PC/os2vacpp/makefile.omk1047
-rw-r--r--PC/os2vacpp/pyconfig.h212
-rw-r--r--PC/os2vacpp/python.def479
-rw-r--r--PC/os2vacpp/readme.txt119
-rw-r--r--PC/pyconfig.h19
-rw-r--r--PC/python.mk5
-rw-r--r--PC/python3.def1395
-rw-r--r--PC/python3.mak10
-rw-r--r--PC/python34gen.py (renamed from PC/python33gen.py)8
-rw-r--r--PC/python34stub.def (renamed from PC/python33stub.def)3
-rw-r--r--PC/readme.txt13
-rw-r--r--PC/w9xpopen.c112
-rw-r--r--PC/winreg.c8
-rw-r--r--PCbuild/_sha3.vcxproj (renamed from PCbuild/w9xpopen.vcxproj)165
-rw-r--r--PCbuild/_sqlite3.vcxproj1
-rw-r--r--PCbuild/_sqlite3.vcxproj.filters3
-rw-r--r--PCbuild/_ssl.vcxproj16
-rw-r--r--PCbuild/_testimportmultiple.vcxproj218
-rw-r--r--PCbuild/_testimportmultiple.vcxproj.filters (renamed from PCbuild/w9xpopen.vcxproj.filters)6
-rw-r--r--PCbuild/build_ssl.bat4
-rw-r--r--PCbuild/build_tkinter.py6
-rw-r--r--PCbuild/kill_python.c2
-rw-r--r--PCbuild/pcbuild.sln38
-rw-r--r--PCbuild/pyproject.props2
-rw-r--r--PCbuild/python.vcxproj8
-rw-r--r--PCbuild/pythoncore.vcxproj4
-rw-r--r--PCbuild/pythoncore.vcxproj.filters8
-rw-r--r--PCbuild/readme.txt2
-rw-r--r--Parser/Python.asdl12
-rw-r--r--Parser/asdl.py20
-rwxr-xr-xParser/asdl_c.py65
-rw-r--r--Parser/grammar1.c8
-rw-r--r--Parser/myreadline.c2
-rw-r--r--Parser/node.c2
-rw-r--r--Parser/parser.c34
-rw-r--r--Parser/parsetok.c2
-rw-r--r--Parser/pgenmain.c1
-rw-r--r--Parser/tokenizer.c17
-rw-r--r--Python/Python-ast.c276
-rw-r--r--Python/_warnings.c53
-rw-r--r--Python/ast.c122
-rw-r--r--Python/bltinmodule.c87
-rw-r--r--Python/ceval.c2253
-rw-r--r--Python/codecs.c12
-rw-r--r--Python/compile.c133
-rw-r--r--Python/condvar.h2
-rw-r--r--Python/dynload_aix.c12
-rw-r--r--Python/dynload_os2.c42
-rw-r--r--Python/dynload_shlib.c36
-rw-r--r--Python/errors.c57
-rw-r--r--Python/fileutils.c39
-rw-r--r--Python/formatter_unicode.c19
-rw-r--r--Python/frozen.c4
-rw-r--r--Python/frozenmain.c58
-rw-r--r--Python/future.c26
-rw-r--r--Python/getargs.c65
-rw-r--r--Python/import.c236
-rw-r--r--Python/importdl.c2
-rw-r--r--Python/importdl.h5
-rw-r--r--Python/importlib.h7821
-rw-r--r--Python/marshal.c365
-rw-r--r--Python/mystrtoul.c10
-rw-r--r--Python/opcode_targets.h4
-rw-r--r--Python/peephole.c54
-rw-r--r--Python/pyarena.c12
-rw-r--r--Python/pystate.c121
-rw-r--r--Python/pystrtod.c4
-rw-r--r--Python/pythonrun.c98
-rw-r--r--Python/random.c33
-rw-r--r--Python/strdup.c2
-rw-r--r--Python/symtable.c138
-rw-r--r--Python/sysmodule.c117
-rw-r--r--Python/thread.c18
-rw-r--r--Python/thread_nt.h10
-rw-r--r--Python/thread_os2.h267
-rw-r--r--Python/thread_pth.h177
-rw-r--r--Python/thread_pthread.h12
-rw-r--r--Python/traceback.c6
-rw-r--r--README16
-rw-r--r--Tools/buildbot/external-amd64.bat10
-rw-r--r--Tools/buildbot/external.bat8
-rw-r--r--Tools/freeze/bkfile.py4
-rwxr-xr-xTools/freeze/freeze.py4
-rw-r--r--Tools/gdb/libpython.py4
-rw-r--r--Tools/importbench/importbench.py31
-rw-r--r--Tools/msi/msi.py11
-rw-r--r--Tools/parser/unparse.py15
-rw-r--r--Tools/scripts/README126
-rwxr-xr-x[-rw-r--r--]Tools/scripts/analyze_dxp.py0
-rwxr-xr-xTools/scripts/byext.py2
-rwxr-xr-xTools/scripts/byteyears.py2
-rwxr-xr-xTools/scripts/checkpyc.py12
-rwxr-xr-xTools/scripts/copytime.py4
-rwxr-xr-xTools/scripts/finddiv.py2
-rwxr-xr-xTools/scripts/findlinksto.py2
-rwxr-xr-xTools/scripts/fixcid.py8
-rwxr-xr-xTools/scripts/ftpmirror.py20
-rwxr-xr-xTools/scripts/linktree.py6
-rwxr-xr-xTools/scripts/parse_html5_entities.py105
-rwxr-xr-xTools/scripts/pathfix.py10
-rwxr-xr-xTools/scripts/pindent.py4
-rwxr-xr-x[-rw-r--r--]Tools/scripts/pydocgui.pyw0
-rwxr-xr-xTools/scripts/reindent.py2
-rwxr-xr-xTools/scripts/treesync.py2
-rwxr-xr-xTools/scripts/untabify.py4
-rwxr-xr-xTools/scripts/which.py2
-rwxr-xr-x[-rw-r--r--]Tools/scripts/win_add2path.py2
-rwxr-xr-xTools/stringbench/stringbench.py2
-rw-r--r--Tools/unicode/makeunicodedata.py6
-rwxr-xr-xconfigure122
-rw-r--r--configure.ac61
-rw-r--r--pyconfig.h.in9
-rw-r--r--setup.py31
1087 files changed, 69457 insertions, 80108 deletions
diff --git a/.gitignore b/.gitignore
index 49299ee..59d3832 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,11 +15,13 @@ Doc/tools/jinja2/
Doc/tools/pygments/
Doc/tools/sphinx/
Lib/lib2to3/*.pickle
+Lib/test/data/*
Lib/_sysconfigdata.py
Lib/plat-mac/errors.rsrc.df.rsrc
Makefile
Makefile.pre
Misc/python.pc
+Misc/python-config.sh
Modules/Setup
Modules/Setup.config
Modules/Setup.local
@@ -57,6 +59,8 @@ platform
pybuilddir.txt
pyconfig.h
python
+python-config
+python-config.py
python.exe
python-gdb.py
python.exe-gdb.py
diff --git a/.hgignore b/.hgignore
index 42ab040..73e1e56 100644
--- a/.hgignore
+++ b/.hgignore
@@ -18,6 +18,8 @@ platform$
pyconfig.h$
python$
python.exe$
+python-config$
+python-config.py$
reflog.txt$
tags$
Lib/plat-mac/errors.rsrc.df.rsrc
@@ -27,12 +29,14 @@ Doc/tools/jinja/
Doc/tools/jinja2/
Doc/tools/pygments/
Misc/python.pc
+Misc/python-config.sh$
Modules/Setup$
Modules/Setup.config
Modules/Setup.local
Modules/config.c
Modules/ld_so_aix$
Parser/pgen$
+^lcov-report/
^core
^python-gdb.py
^python.exe-gdb.py
@@ -88,3 +92,7 @@ Modules/_testembed
.coverage
coverage/
htmlcov/
+*.gcda
+*.gcno
+*.gcov
+coverage.info
diff --git a/.hgtags b/.hgtags
index 1bcb10e..83a91c9 100644
--- a/.hgtags
+++ b/.hgtags
@@ -114,3 +114,4 @@ bd8afb90ebf28ba4edc901d4a235f75e7bbc79fd v3.3.0
92c2cfb924055ce68c4f78f836dcfe688437ceb8 v3.3.1rc1
d9893d13c6289aa03d33559ec67f97dcbf5c9e3c v3.3.1
d047928ae3f6314a13b6137051315453d0ae89b6 v3.3.2
+46535f65e7f3bcdcf176f36d34bc1fed719ffd2b v3.4.0a1
diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst
index 6bacc32..1f599fe 100644
--- a/Doc/c-api/dict.rst
+++ b/Doc/c-api/dict.rst
@@ -110,6 +110,15 @@ Dictionary Objects
:c:type:`char\*`, rather than a :c:type:`PyObject\*`.
+.. c:function:: PyObject* PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *default)
+
+ This is the same as the Python-level :meth:`dict.setdefault`. If present, it
+ returns the value corresponding to *key* from the dictionary *p*. If the key
+ is not in the dict, it is inserted with value *defaultobj* and *defaultobj*
+ is returned. This function evaluates the hash function of *key* only once,
+ instead of evaluating it independently for the lookup and the insertion.
+
+
.. c:function:: PyObject* PyDict_Items(PyObject *p)
Return a :c:type:`PyListObject` containing all the items from the dictionary.
diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
index 95ff4ee..32007d5 100644
--- a/Doc/c-api/init.rst
+++ b/Doc/c-api/init.rst
@@ -329,7 +329,11 @@ Process-wide parameters
.. c:function:: void PySys_SetArgv(int argc, wchar_t **argv)
- This function works like :c:func:`PySys_SetArgvEx` with *updatepath* set to 1.
+ This function works like :c:func:`PySys_SetArgvEx` with *updatepath* set
+ to 1 unless the :program:`python` interpreter was started with the
+ :option:`-I`.
+
+ .. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`.
.. c:function:: void Py_SetPythonHome(wchar_t *home)
@@ -654,6 +658,20 @@ with sub-interpreters:
made on the main thread. This is mainly a helper/diagnostic function.
+.. c:function:: int PyGILState_Check()
+
+ Return 1 if the current thread is holding the GIL and 0 otherwise.
+ This function can be called from any thread at any time.
+ Only if it has had its Python thread state initialized and currently is
+ holding the GIL will it return 1.
+ This is mainly a helper/diagnostic function. It can be useful
+ for example in callback contexts or memory allocation functions when
+ knowing that the GIL is locked can allow the caller to perform sensitive
+ actions or otherwise behave differently.
+
+ .. versionadded:: 3.4
+
+
The following macros are normally used without a trailing semicolon; look for
example usage in the Python source distribution.
diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst
index 8afa56a..e4a759b 100644
--- a/Doc/c-api/memory.rst
+++ b/Doc/c-api/memory.rst
@@ -84,6 +84,48 @@ the C library allocator as shown in the previous example, the allocated memory
for the I/O buffer escapes completely the Python memory manager.
+Raw Memory Interface
+====================
+
+The following function sets are wrappers to the system allocator. These
+functions are thread-safe, the :term:`GIL <global interpreter lock>` does not
+need to be held.
+
+The default raw memory block allocator uses the following functions:
+:c:func:`malloc`, :c:func:`realloc` and :c:func:`free`; call ``malloc(1)`` when
+requesting zero bytes.
+
+.. versionadded:: 3.4
+
+.. c:function:: void* PyMem_RawMalloc(size_t n)
+
+ Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
+ allocated memory, or *NULL* if the request fails. Requesting zero bytes
+ returns a distinct non-*NULL* pointer if possible, as if
+ ``PyMem_RawMalloc(1)`` had been called instead. The memory will not have
+ been initialized in any way.
+
+
+.. c:function:: void* PyMem_RawRealloc(void *p, size_t n)
+
+ Resizes the memory block pointed to by *p* to *n* bytes. The contents will
+ be unchanged to the minimum of the old and the new sizes. If *p* is *NULL*,
+ the call is equivalent to ``PyMem_RawMalloc(n)``; else if *n* is equal to
+ zero, the memory block is resized but is not freed, and the returned pointer
+ is non-*NULL*. Unless *p* is *NULL*, it must have been returned by a
+ previous call to :c:func:`PyMem_RawMalloc` or :c:func:`PyMem_RawRealloc`. If
+ the request fails, :c:func:`PyMem_RawRealloc` returns *NULL* and *p* remains
+ a valid pointer to the previous memory area.
+
+
+.. c:function:: void PyMem_RawFree(void *p)
+
+ Frees the memory block pointed to by *p*, which must have been returned by a
+ previous call to :c:func:`PyMem_RawMalloc` or :c:func:`PyMem_RawRealloc`.
+ Otherwise, or if ``PyMem_Free(p)`` has been called before, undefined
+ behavior occurs. If *p* is *NULL*, no operation is performed.
+
+
.. _memoryinterface:
Memory Interface
@@ -91,8 +133,16 @@ Memory Interface
The following function sets, modeled after the ANSI C standard, but specifying
behavior when requesting zero bytes, are available for allocating and releasing
-memory from the Python heap:
+memory from the Python heap.
+
+The default memory block allocator uses the following functions:
+:c:func:`malloc`, :c:func:`realloc` and :c:func:`free`; call ``malloc(1)`` when
+requesting zero bytes.
+
+.. warning::
+ The :term:`GIL <global interpreter lock>` must be held when using these
+ functions.
.. c:function:: void* PyMem_Malloc(size_t n)
@@ -155,6 +205,125 @@ versions and is therefore deprecated in extension modules.
:c:func:`PyMem_NEW`, :c:func:`PyMem_RESIZE`, :c:func:`PyMem_DEL`.
+Customize Memory Allocators
+===========================
+
+.. versionadded:: 3.4
+
+.. c:type:: PyMemAllocator
+
+ Structure used to describe a memory block allocator. The structure has
+ four fields:
+
+ +----------------------------------------------------------+---------------------------------------+
+ | Field | Meaning |
+ +==========================================================+=======================================+
+ | ``void *ctx`` | user context passed as first argument |
+ +----------------------------------------------------------+---------------------------------------+
+ | ``void* malloc(void *ctx, size_t size)`` | allocate a memory block |
+ +----------------------------------------------------------+---------------------------------------+
+ | ``void* realloc(void *ctx, void *ptr, size_t new_size)`` | allocate or resize a memory block |
+ +----------------------------------------------------------+---------------------------------------+
+ | ``void free(void *ctx, void *ptr)`` | free a memory block |
+ +----------------------------------------------------------+---------------------------------------+
+
+.. c:type:: PyMemAllocatorDomain
+
+ Enum used to identify an allocator domain. Domains:
+
+ * :c:data:`PYMEM_DOMAIN_RAW`: functions :c:func:`PyMem_RawMalloc`,
+ :c:func:`PyMem_RawRealloc` and :c:func:`PyMem_RawFree`
+ * :c:data:`PYMEM_DOMAIN_MEM`: functions :c:func:`PyMem_Malloc`,
+ :c:func:`PyMem_Realloc` and :c:func:`PyMem_Free`
+ * :c:data:`PYMEM_DOMAIN_OBJ`: functions :c:func:`PyObject_Malloc`,
+ :c:func:`PyObject_Realloc` and :c:func:`PyObject_Free`
+
+
+.. c:function:: void PyMem_GetAllocator(PyMemAllocatorDomain domain, PyMemAllocator *allocator)
+
+ Get the memory block allocator of the specified domain.
+
+
+.. c:function:: void PyMem_SetAllocator(PyMemAllocatorDomain domain, PyMemAllocator *allocator)
+
+ Set the memory block allocator of the specified domain.
+
+ The new allocator must return a distinct non-NULL pointer when requesting
+ zero bytes.
+
+ For the :c:data:`PYMEM_DOMAIN_RAW` domain, the allocator must be
+ thread-safe: the :term:`GIL <global interpreter lock>` is not held when the
+ allocator is called.
+
+ If the new allocator is not a hook (does not call the previous allocator),
+ the :c:func:`PyMem_SetupDebugHooks` function must be called to reinstall the
+ debug hooks on top on the new allocator.
+
+
+.. c:function:: void PyMem_SetupDebugHooks(void)
+
+ Setup hooks to detect bugs in the following Python memory allocator
+ functions:
+
+ - :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc`,
+ :c:func:`PyMem_RawFree`
+ - :c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc`, :c:func:`PyMem_Free`
+ - :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc`,
+ :c:func:`PyObject_Free`
+
+ Newly allocated memory is filled with the byte ``0xCB``, freed memory is
+ filled with the byte ``0xDB``. Additionnal checks:
+
+ - detect API violations, ex: :c:func:`PyObject_Free` called on a buffer
+ allocated by :c:func:`PyMem_Malloc`
+ - detect write before the start of the buffer (buffer underflow)
+ - detect write after the end of the buffer (buffer overflow)
+
+ The function does nothing if Python is not compiled is debug mode.
+
+
+Customize PyObject Arena Allocator
+==================================
+
+Python has a *pymalloc* allocator for allocations smaller than 512 bytes. This
+allocator is optimized for small objects with a short lifetime. It uses memory
+mappings called "arenas" with a fixed size of 256 KB. It falls back to
+:c:func:`PyMem_Malloc` and :c:func:`PyMem_Realloc` for allocations larger than
+512 bytes. *pymalloc* is the default allocator used by
+:c:func:`PyObject_Malloc`.
+
+The default arena allocator uses the following functions:
+
+* :c:func:`VirtualAlloc` and :c:func:`VirtualFree` on Windows,
+* :c:func:`mmap` and :c:func:`munmap` if available,
+* :c:func:`malloc` and :c:func:`free` otherwise.
+
+.. versionadded:: 3.4
+
+.. c:type:: PyObjectArenaAllocator
+
+ Structure used to describe an arena allocator. The structure has
+ three fields:
+
+ +--------------------------------------------------+---------------------------------------+
+ | Field | Meaning |
+ +==================================================+=======================================+
+ | ``void *ctx`` | user context passed as first argument |
+ +--------------------------------------------------+---------------------------------------+
+ | ``void* alloc(void *ctx, size_t size)`` | allocate an arena of size bytes |
+ +--------------------------------------------------+---------------------------------------+
+ | ``void free(void *ctx, size_t size, void *ptr)`` | free an arena |
+ +--------------------------------------------------+---------------------------------------+
+
+.. c:function:: PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator)
+
+ Get the arena allocator.
+
+.. c:function:: PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator)
+
+ Set the arena allocator.
+
+
.. _memoryexamples:
Examples
diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst
index e80e0ea..26c4384 100644
--- a/Doc/c-api/module.rst
+++ b/Doc/c-api/module.rst
@@ -35,13 +35,20 @@ There are only a few functions special to module objects.
single: __name__ (module attribute)
single: __doc__ (module attribute)
single: __file__ (module attribute)
+ single: __package__ (module attribute)
+ single: __loader__ (module attribute)
Return a new module object with the :attr:`__name__` attribute set to *name*.
- Only the module's :attr:`__doc__` and :attr:`__name__` attributes are filled in;
- the caller is responsible for providing a :attr:`__file__` attribute.
+ The module's :attr:`__name__`, :attr:`__doc__`, :attr:`__package__`, and
+ :attr:`__loader__` attributes are filled in (all but :attr:`__name__` are set
+ to ``None``); the caller is responsible for providing a :attr:`__file__`
+ attribute.
.. versionadded:: 3.3
+ .. versionchanged:: 3.4
+ :attr:`__package__` and :attr:`__loader__` are set to ``None``.
+
.. c:function:: PyObject* PyModule_New(const char *name)
diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst
index a47183c..791cdbb 100644
--- a/Doc/c-api/object.rst
+++ b/Doc/c-api/object.rst
@@ -240,7 +240,7 @@ is considered sufficient for this determination.
of the Python expression ``callable_object(*args)``.
-.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, char *format, ...)
+.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...)
Call a callable Python object *callable*, with a variable number of C arguments.
The C arguments are described using a :c:func:`Py_BuildValue` style format
@@ -250,8 +250,11 @@ is considered sufficient for this determination.
pass :c:type:`PyObject \*` args, :c:func:`PyObject_CallFunctionObjArgs` is a
faster alternative.
+ .. versionchanged:: 3.4
+ The type of *format* was changed from ``char *``.
-.. c:function:: PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
+
+.. c:function:: PyObject* PyObject_CallMethod(PyObject *o, const char *method, const char *format, ...)
Call the method named *method* of object *o* with a variable number of C
arguments. The C arguments are described by a :c:func:`Py_BuildValue` format
@@ -261,6 +264,9 @@ is considered sufficient for this determination.
Note that if you only pass :c:type:`PyObject \*` args,
:c:func:`PyObject_CallMethodObjArgs` is a faster alternative.
+ .. versionchanged:: 3.4
+ The types of *method* and *format* were changed from ``char *``.
+
.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)
@@ -342,6 +348,15 @@ is considered sufficient for this determination.
returned. This is the equivalent to the Python expression ``len(o)``.
+.. c:function:: Py_ssize_t PyObject_LengthHint(PyObject *o, Py_ssize_t default)
+
+ Return an estimated length for the object *o*. First trying to return its
+ actual length, then an estimate using ``__length_hint__``, and finally
+ returning the default value. On error ``-1`` is returned. This is the
+ equivalent to the Python expression ``operator.length_hint(o, default)``.
+
+ .. versionadded:: 3.4
+
.. c:function:: PyObject* PyObject_GetItem(PyObject *o, PyObject *key)
Return element of *o* corresponding to the object *key* or *NULL* on failure.
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index 118fa50..8e8af24 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -465,6 +465,14 @@ type objects) *must* have the :attr:`ob_size` field.
:const:`Py_TPFLAGS_HAVE_VERSION_TAG`.
+ .. data:: Py_TPFLAGS_HAVE_FINALIZE
+
+ This bit is set when the :c:member:`~PyTypeObject.tp_finalize` slot is present in the
+ type structure.
+
+ .. versionadded:: 3.4
+
+
.. c:member:: char* PyTypeObject.tp_doc
An optional pointer to a NUL-terminated C string giving the docstring for this
@@ -968,6 +976,47 @@ type objects) *must* have the :attr:`ob_size` field.
This field is not inherited; it is calculated fresh by :c:func:`PyType_Ready`.
+.. c:member:: destructor PyTypeObject.tp_finalize
+
+ An optional pointer to an instance finalization function. Its signature is
+ :c:type:`destructor`::
+
+ void tp_finalize(PyObject *)
+
+ If :c:member:`~PyTypeObject.tp_finalize` is set, the interpreter calls it once when
+ finalizing an instance. It is called either from the garbage
+ collector (if the instance is part of an isolated reference cycle) or
+ just before the object is deallocated. Either way, it is guaranteed
+ to be called before attempting to break reference cycles, ensuring
+ that it finds the object in a sane state.
+
+ :c:member:`~PyTypeObject.tp_finalize` should not mutate the current exception status;
+ therefore, a recommended way to write a non-trivial finalizer is::
+
+ static void
+ local_finalize(PyObject *self)
+ {
+ PyObject *error_type, *error_value, *error_traceback;
+
+ /* Save the current exception, if any. */
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+
+ /* ... */
+
+ /* Restore the saved exception. */
+ PyErr_Restore(error_type, error_value, error_traceback);
+ }
+
+ For this field to be taken into account (even through inheritance),
+ you must also set the :const:`Py_TPFLAGS_HAVE_FINALIZE` flags bit.
+
+ This field is inherited by subtypes.
+
+ .. versionadded:: 3.4
+
+ .. seealso:: "Safe object finalization" (:pep:`442`)
+
+
.. c:member:: PyObject* PyTypeObject.tp_cache
Unused. Not inherited. Internal use only.
diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst
index 6cc8cce..216088e 100644
--- a/Doc/c-api/unicode.rst
+++ b/Doc/c-api/unicode.rst
@@ -526,12 +526,23 @@ APIs:
The `"%lld"` and `"%llu"` format specifiers are only available
when :const:`HAVE_LONG_LONG` is defined.
+ .. note::
+ The width formatter unit is number of characters rather than bytes.
+ The precision formatter unit is number of bytes for ``"%s"`` and
+ ``"%V"`` (if the ``PyObject*`` argument is NULL), and a number of
+ characters for ``"%A"``, ``"%U"``, ``"%S"``, ``"%R"`` and ``"%V"``
+ (if the ``PyObject*`` argument is not NULL).
+
.. versionchanged:: 3.2
Support for ``"%lld"`` and ``"%llu"`` added.
.. versionchanged:: 3.3
Support for ``"%li"``, ``"%lli"`` and ``"%zi"`` added.
+ .. versionchanged:: 3.4
+ Support width and precision formatter for ``"%s"``, ``"%A"``, ``"%U"``,
+ ``"%V"``, ``"%S"``, ``"%R"`` added.
+
.. c:function:: PyObject* PyUnicode_FromFormatV(const char *format, va_list vargs)
diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst
index 499eb3e..284eee8 100644
--- a/Doc/c-api/veryhigh.rst
+++ b/Doc/c-api/veryhigh.rst
@@ -144,6 +144,29 @@ the same library that the Python runtime is using.
(:func:`sys.getfilesystemencoding`). Returns ``0`` at EOF.
+.. c:var:: int (*PyOS_InputHook)(void)
+
+ Can be set to point to a function with the prototype
+ ``int func(void)``. The function will be called when Python's
+ interpreter prompt is about to become idle and wait for user input
+ from the terminal. The return value is ignored. Overriding this
+ hook can be used to integrate the interpreter's prompt with other
+ event loops, as done in the :file:`Modules/_tkinter.c` in the
+ Python source code.
+
+
+.. c:var:: char* (*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *)
+
+ Can be set to point to a function with the prototype
+ ``char *func(FILE *stdin, FILE *stdout, char *prompt)``,
+ overriding the default function used to read a single line of input
+ at the interpreter's prompt. The function is expected to output
+ the string *prompt* if it's not *NULL*, and then read a line of
+ input from the provided standard input file, returning the
+ resulting string. For example, The :mod:`readline` module sets
+ this hook to provide line-editing and tab-completion features.
+
+
.. c:function:: struct _node* PyParser_SimpleParseString(const char *str, int start)
This is a simplified interface to
@@ -338,4 +361,3 @@ the same library that the Python runtime is using.
This bit can be set in *flags* to cause division operator ``/`` to be
interpreted as "true division" according to :pep:`238`.
-
diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat
index a42584c..83f23eb 100644
--- a/Doc/data/refcounts.dat
+++ b/Doc/data/refcounts.dat
@@ -220,6 +220,11 @@ PyDict_GetItemString:PyObject*::0:
PyDict_GetItemString:PyObject*:p:0:
PyDict_GetItemString:const char*:key::
+PyDict_SetDefault:PyObject*::0:
+PyDict_SetDefault:PyObject*:p:0:
+PyDict_SetDefault:PyObject*:key:0:conditionally +1 if inserted into the dict
+PyDict_SetDefault:PyObject*:default:0:conditionally +1 if inserted into the dict
+
PyDict_Items:PyObject*::+1:
PyDict_Items:PyObject*:p:0:
@@ -912,7 +917,7 @@ PyObject_Call:PyObject*:kw:0:
PyObject_CallFunction:PyObject*::+1:
PyObject_CallFunction:PyObject*:callable_object:0:
-PyObject_CallFunction:char*:format::
+PyObject_CallFunction:const char*:format::
PyObject_CallFunction::...::
PyObject_CallFunctionObjArgs:PyObject*::+1:
@@ -921,8 +926,8 @@ PyObject_CallFunctionObjArgs::...::
PyObject_CallMethod:PyObject*::+1:
PyObject_CallMethod:PyObject*:o:0:
-PyObject_CallMethod:char*:m::
-PyObject_CallMethod:char*:format::
+PyObject_CallMethod:const char*:m::
+PyObject_CallMethod:const char*:format::
PyObject_CallMethod::...::
PyObject_CallMethodObjArgs:PyObject*::+1:
diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst
index bd66086..6cb686a 100644
--- a/Doc/extending/embedding.rst
+++ b/Doc/extending/embedding.rst
@@ -285,14 +285,14 @@ be directly useful to you:
* ``pythonX.Y-config --cflags`` will give you the recommended flags when
compiling::
- $ /opt/bin/python3.3-config --cflags
- -I/opt/include/python3.3m -I/opt/include/python3.3m -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
+ $ /opt/bin/python3.4-config --cflags
+ -I/opt/include/python3.4m -I/opt/include/python3.4m -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
* ``pythonX.Y-config --ldflags`` will give you the recommended flags when
linking::
- $ /opt/bin/python3.3-config --ldflags
- -L/opt/lib/python3.3/config-3.3m -lpthread -ldl -lutil -lm -lpython3.3m -Xlinker -export-dynamic
+ $ /opt/bin/python3.4-config --ldflags
+ -L/opt/lib/python3.4/config-3.4m -lpthread -ldl -lutil -lm -lpython3.4m -Xlinker -export-dynamic
.. note::
To avoid confusion between several Python installations (and especially
diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst
index f65c183..f981684 100644
--- a/Doc/extending/newtypes.rst
+++ b/Doc/extending/newtypes.rst
@@ -157,7 +157,8 @@ to :const:`Py_TPFLAGS_DEFAULT`. ::
Py_TPFLAGS_DEFAULT, /* tp_flags */
All types should include this constant in their flags. It enables all of the
-members defined by the current version of Python.
+members defined until at least Python 3.3. If you need further members,
+you will need to OR the corresponding flags.
We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`. ::
@@ -928,8 +929,9 @@ Finalization and De-allocation
This function is called when the reference count of the instance of your type is
reduced to zero and the Python interpreter wants to reclaim it. If your type
-has memory to free or other clean-up to perform, put it here. The object itself
-needs to be freed here as well. Here is an example of this function::
+has memory to free or other clean-up to perform, you can put it here. The
+object itself needs to be freed here as well. Here is an example of this
+function::
static void
newdatatype_dealloc(newdatatypeobject * obj)
@@ -980,6 +982,22 @@ done. This can be done using the :c:func:`PyErr_Fetch` and
Py_TYPE(obj)->tp_free((PyObject*)self);
}
+.. note::
+ There are limitations to what you can safely do in a deallocator function.
+ First, if your type supports garbage collection (using :c:member:`~PyTypeObject.tp_traverse`
+ and/or :c:member:`~PyTypeObject.tp_clear`), some of the object's members can have been
+ cleared or finalized by the time :c:member:`~PyTypeObject.tp_dealloc` is called. Second, in
+ :c:member:`~PyTypeObject.tp_dealloc`, your object is in an unstable state: its reference
+ count is equal to zero. Any call to a non-trivial object or API (as in the
+ example above) might end up calling :c:member:`~PyTypeObject.tp_dealloc` again, causing a
+ double free and a crash.
+
+ Starting with Python 3.4, it is recommended not to put any complex
+ finalization code in :c:member:`~PyTypeObject.tp_dealloc`, and instead use the new
+ :c:member:`~PyTypeObject.tp_finalize` type method.
+
+ .. seealso::
+ :pep:`442` explains the new finalization scheme.
.. index::
single: string; object representation
diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst
index c8ef9e7..8bd774b 100644
--- a/Doc/faq/library.rst
+++ b/Doc/faq/library.rst
@@ -211,7 +211,7 @@ using curses, but curses is a fairly large module to learn.
try:
c = sys.stdin.read(1)
print("Got character", repr(c))
- except IOError:
+ except OSError:
pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
@@ -224,7 +224,11 @@ using curses, but curses is a fairly large module to learn.
:func:`termios.tcsetattr` turns off stdin's echoing and disables canonical
mode. :func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags
and modify them for non-blocking mode. Since reading stdin when it is empty
- results in an :exc:`IOError`, this error is caught and ignored.
+ results in an :exc:`OSError`, this error is caught and ignored.
+
+ .. versionchanged:: 3.3
+ *sys.stdin.read* used to raise :exc:`IOError`. Starting from Python 3.3
+ :exc:`IOError` is alias for :exc:`OSError`.
Threads
diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst
index 2fbe92a..bf73935 100644
--- a/Doc/faq/programming.rst
+++ b/Doc/faq/programming.rst
@@ -1739,12 +1739,12 @@ When I edit an imported module and reimport it, the changes don't show up. Why
For reasons of efficiency as well as consistency, Python only reads the module
file on the first time a module is imported. If it didn't, in a program
consisting of many modules where each one imports the same basic module, the
-basic module would be parsed and re-parsed many times. To force rereading of a
+basic module would be parsed and re-parsed many times. To force re-reading of a
changed module, do this::
- import imp
+ import importlib
import modname
- imp.reload(modname)
+ importlib.reload(modname)
Warning: this technique is not 100% fool-proof. In particular, modules
containing statements like ::
@@ -1756,10 +1756,10 @@ module contains class definitions, existing class instances will *not* be
updated to use the new class definition. This can result in the following
paradoxical behaviour:
- >>> import imp
+ >>> import importlib
>>> import cls
>>> c = cls.C() # Create an instance of C
- >>> imp.reload(cls)
+ >>> importlib.reload(cls)
<module 'cls' from 'cls.py'>
>>> isinstance(c, cls.C) # isinstance is false?!?
False
diff --git a/Doc/glossary.rst b/Doc/glossary.rst
index 63f1021..0d3a5f5 100644
--- a/Doc/glossary.rst
+++ b/Doc/glossary.rst
@@ -302,6 +302,15 @@ Glossary
>>> sum(i*i for i in range(10)) # sum of squares 0, 1, 4, ... 81
285
+ generic function
+ A function composed of multiple functions implementing the same operation
+ for different types. Which implementation should be used during a call is
+ determined by the dispatch algorithm.
+
+ See also the :term:`single dispatch` glossary entry, the
+ :func:`functools.singledispatch` decorator, and :pep:`443`.
+
+
GIL
See :term:`global interpreter lock`.
@@ -745,6 +754,10 @@ Glossary
mapping rather than a sequence because the lookups use arbitrary
:term:`immutable` keys rather than integers.
+ single dispatch
+ A form of :term:`generic function` dispatch where the implementation is
+ chosen based on the type of a single argument.
+
slice
An object usually containing a portion of a :term:`sequence`. A slice is
created using the subscript notation, ``[]`` with colons between numbers
diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst
index d241f1a..0f4c4e4 100644
--- a/Doc/howto/functional.rst
+++ b/Doc/howto/functional.rst
@@ -3,7 +3,7 @@
********************************
:Author: A. M. Kuchling
-:Release: 0.31
+:Release: 0.32
In this document, we'll take a tour of Python's features suitable for
implementing programs in a functional style. After an introduction to the
@@ -15,9 +15,9 @@ concepts of functional programming, we'll look at language features such as
Introduction
============
-This section explains the basic concept of functional programming; if you're
-just interested in learning about Python language features, skip to the next
-section.
+This section explains the basic concept of functional programming; if
+you're just interested in learning about Python language features,
+skip to the next section on :ref:`functional-howto-iterators`.
Programming languages support decomposing problems in several different ways:
@@ -173,6 +173,8 @@ new programs by arranging existing functions in a new configuration and writing
a few functions specialized for the current task.
+.. _functional-howto-iterators:
+
Iterators
=========
@@ -670,7 +672,7 @@ indexes at which certain conditions are met::
:func:`sorted(iterable, key=None, reverse=False) <sorted>` collects all the
elements of the iterable into a list, sorts the list, and returns the sorted
-result. The *key*, and *reverse* arguments are passed through to the
+result. The *key* and *reverse* arguments are passed through to the
constructed list's :meth:`~list.sort` method. ::
>>> import random
@@ -836,7 +838,8 @@ Another group of functions chooses a subset of an iterator's elements based on a
predicate.
:func:`itertools.filterfalse(predicate, iter) <itertools.filterfalse>` is the
-opposite, returning all elements for which the predicate returns false::
+opposite of :func:`filter`, returning all elements for which the predicate
+returns false::
itertools.filterfalse(is_even, itertools.count()) =>
1, 3, 5, 7, 9, 11, 13, 15, ...
@@ -864,6 +867,77 @@ iterable's results. ::
itertools.dropwhile(is_even, itertools.count()) =>
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
+:func:`itertools.compress(data, selectors) <itertools.compress>` takes two
+iterators and returns only those elements of *data* for which the corresponding
+element of *selectors* is true, stopping whenever either one is exhausted::
+
+ itertools.compress([1,2,3,4,5], [True, True, False, False, True]) =>
+ 1, 2, 5
+
+
+Combinatoric functions
+----------------------
+
+The :func:`itertools.combinations(iterable, r) <itertools.combinations>`
+returns an iterator giving all possible *r*-tuple combinations of the
+elements contained in *iterable*. ::
+
+ itertools.combinations([1, 2, 3, 4, 5], 2) =>
+ (1, 2), (1, 3), (1, 4), (1, 5),
+ (2, 3), (2, 4), (2, 5),
+ (3, 4), (3, 5),
+ (4, 5)
+
+ itertools.combinations([1, 2, 3, 4, 5], 3) =>
+ (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),
+ (2, 3, 4), (2, 3, 5), (2, 4, 5),
+ (3, 4, 5)
+
+The elements within each tuple remain in the same order as
+*iterable* returned them. For example, the number 1 is always before
+2, 3, 4, or 5 in the examples above. A similar function,
+:func:`itertools.permutations(iterable, r=None) <itertools.permutations>`,
+removes this constraint on the order, returning all possible
+arrangements of length *r*::
+
+ itertools.permutations([1, 2, 3, 4, 5], 2) =>
+ (1, 2), (1, 3), (1, 4), (1, 5),
+ (2, 1), (2, 3), (2, 4), (2, 5),
+ (3, 1), (3, 2), (3, 4), (3, 5),
+ (4, 1), (4, 2), (4, 3), (4, 5),
+ (5, 1), (5, 2), (5, 3), (5, 4)
+
+ itertools.permutations([1, 2, 3, 4, 5]) =>
+ (1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),
+ ...
+ (5, 4, 3, 2, 1)
+
+If you don't supply a value for *r* the length of the iterable is used,
+meaning that all the elements are permuted.
+
+Note that these functions produce all of the possible combinations by
+position and don't require that the contents of *iterable* are unique::
+
+ itertools.permutations('aba', 3) =>
+ ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),
+ ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')
+
+The identical tuple ``('a', 'a', 'b')`` occurs twice, but the two 'a'
+strings came from different positions.
+
+The :func:`itertools.combinations_with_replacement(iterable, r) <itertools.combinations_with_replacement>`
+function relaxes a different constraint: elements can be repeated
+within a single tuple. Conceptually an element is selected for the
+first position of each tuple and then is replaced before the second
+element is selected. ::
+
+ itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>
+ (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
+ (2, 2), (2, 3), (2, 4), (2, 5),
+ (3, 3), (3, 4), (3, 5),
+ (4, 4), (4, 5),
+ (5, 5)
+
Grouping elements
-----------------
@@ -986,6 +1060,17 @@ write the obvious :keyword:`for` loop::
for i in [1,2,3]:
product *= i
+A related function is `itertools.accumulate(iterable, func=operator.add) <itertools.accumulate`.
+It performs the same calculation, but instead of returning only the
+final result, :func:`accumulate` returns an iterator that also yields
+each partial result::
+
+ itertools.accumulate([1,2,3,4,5]) =>
+ 1, 3, 6, 10, 15
+
+ itertools.accumulate([1,2,3,4,5], operator.mul) =>
+ 1, 2, 6, 24, 120
+
The operator module
-------------------
@@ -1159,51 +1244,6 @@ features in Python 2.5.
.. comment
- Topics to place
- -----------------------------
-
- XXX os.walk()
-
- XXX Need a large example.
-
- But will an example add much? I'll post a first draft and see
- what the comments say.
-
-.. comment
-
- Original outline:
- Introduction
- Idea of FP
- Programs built out of functions
- Functions are strictly input-output, no internal state
- Opposed to OO programming, where objects have state
-
- Why FP?
- Formal provability
- Assignment is difficult to reason about
- Not very relevant to Python
- Modularity
- Small functions that do one thing
- Debuggability:
- Easy to test due to lack of state
- Easy to verify output from intermediate steps
- Composability
- You assemble a toolbox of functions that can be mixed
-
- Tackling a problem
- Need a significant example
-
- Iterators
- Generators
- The itertools module
- List comprehensions
- Small functions and the lambda statement
- Built-in functions
- map
- filter
-
-.. comment
-
Handy little function for printing part of an iterator -- used
while writing this document.
@@ -1214,5 +1254,3 @@ features in Python 2.5.
sys.stdout.write(str(elem))
sys.stdout.write(', ')
print(elem[-1])
-
-
diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst
index 83b479c..1ad3c25 100644
--- a/Doc/howto/logging-cookbook.rst
+++ b/Doc/howto/logging-cookbook.rst
@@ -704,9 +704,7 @@ the basis for code meeting your own specific requirements::
break
logger = logging.getLogger(record.name)
logger.handle(record) # No level or filter logic applied - just do it!
- except (KeyboardInterrupt, SystemExit):
- raise
- except:
+ except Exception:
import sys, traceback
print('Whoops! Problem:', file=sys.stderr)
traceback.print_exc(file=sys.stderr)
diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
index 7afe9a6..b683ab6 100644
--- a/Doc/howto/urllib2.rst
+++ b/Doc/howto/urllib2.rst
@@ -507,7 +507,7 @@ than the URL you pass to .add_password() will also match. ::
-- ``ProxyHandler`` (if a proxy setting such as an :envvar:`http_proxy`
environment variable is set), ``UnknownHandler``, ``HTTPHandler``,
``HTTPDefaultErrorHandler``, ``HTTPRedirectHandler``, ``FTPHandler``,
- ``FileHandler``, ``HTTPErrorProcessor``.
+ ``FileHandler``, ``DataHandler``, ``HTTPErrorProcessor``.
``top_level_url`` is in fact *either* a full URL (including the 'http:' scheme
component and the hostname and optionally the port number)
diff --git a/Doc/includes/mp_benchmarks.py b/Doc/includes/mp_benchmarks.py
deleted file mode 100644
index 3763ea9..0000000
--- a/Doc/includes/mp_benchmarks.py
+++ /dev/null
@@ -1,239 +0,0 @@
-#
-# Simple benchmarks for the multiprocessing package
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-
-import time
-import multiprocessing
-import threading
-import queue
-import gc
-
-_timer = time.perf_counter
-
-delta = 1
-
-
-#### TEST_QUEUESPEED
-
-def queuespeed_func(q, c, iterations):
- a = '0' * 256
- c.acquire()
- c.notify()
- c.release()
-
- for i in range(iterations):
- q.put(a)
-
- q.put('STOP')
-
-def test_queuespeed(Process, q, c):
- elapsed = 0
- iterations = 1
-
- while elapsed < delta:
- iterations *= 2
-
- p = Process(target=queuespeed_func, args=(q, c, iterations))
- c.acquire()
- p.start()
- c.wait()
- c.release()
-
- result = None
- t = _timer()
-
- while result != 'STOP':
- result = q.get()
-
- elapsed = _timer() - t
-
- p.join()
-
- print(iterations, 'objects passed through the queue in', elapsed, 'seconds')
- print('average number/sec:', iterations/elapsed)
-
-
-#### TEST_PIPESPEED
-
-def pipe_func(c, cond, iterations):
- a = '0' * 256
- cond.acquire()
- cond.notify()
- cond.release()
-
- for i in range(iterations):
- c.send(a)
-
- c.send('STOP')
-
-def test_pipespeed():
- c, d = multiprocessing.Pipe()
- cond = multiprocessing.Condition()
- elapsed = 0
- iterations = 1
-
- while elapsed < delta:
- iterations *= 2
-
- p = multiprocessing.Process(target=pipe_func,
- args=(d, cond, iterations))
- cond.acquire()
- p.start()
- cond.wait()
- cond.release()
-
- result = None
- t = _timer()
-
- while result != 'STOP':
- result = c.recv()
-
- elapsed = _timer() - t
- p.join()
-
- print(iterations, 'objects passed through connection in',elapsed,'seconds')
- print('average number/sec:', iterations/elapsed)
-
-
-#### TEST_SEQSPEED
-
-def test_seqspeed(seq):
- elapsed = 0
- iterations = 1
-
- while elapsed < delta:
- iterations *= 2
-
- t = _timer()
-
- for i in range(iterations):
- a = seq[5]
-
- elapsed = _timer() - t
-
- print(iterations, 'iterations in', elapsed, 'seconds')
- print('average number/sec:', iterations/elapsed)
-
-
-#### TEST_LOCK
-
-def test_lockspeed(l):
- elapsed = 0
- iterations = 1
-
- while elapsed < delta:
- iterations *= 2
-
- t = _timer()
-
- for i in range(iterations):
- l.acquire()
- l.release()
-
- elapsed = _timer() - t
-
- print(iterations, 'iterations in', elapsed, 'seconds')
- print('average number/sec:', iterations/elapsed)
-
-
-#### TEST_CONDITION
-
-def conditionspeed_func(c, N):
- c.acquire()
- c.notify()
-
- for i in range(N):
- c.wait()
- c.notify()
-
- c.release()
-
-def test_conditionspeed(Process, c):
- elapsed = 0
- iterations = 1
-
- while elapsed < delta:
- iterations *= 2
-
- c.acquire()
- p = Process(target=conditionspeed_func, args=(c, iterations))
- p.start()
-
- c.wait()
-
- t = _timer()
-
- for i in range(iterations):
- c.notify()
- c.wait()
-
- elapsed = _timer() - t
-
- c.release()
- p.join()
-
- print(iterations * 2, 'waits in', elapsed, 'seconds')
- print('average number/sec:', iterations * 2 / elapsed)
-
-####
-
-def test():
- manager = multiprocessing.Manager()
-
- gc.disable()
-
- print('\n\t######## testing Queue.Queue\n')
- test_queuespeed(threading.Thread, queue.Queue(),
- threading.Condition())
- print('\n\t######## testing multiprocessing.Queue\n')
- test_queuespeed(multiprocessing.Process, multiprocessing.Queue(),
- multiprocessing.Condition())
- print('\n\t######## testing Queue managed by server process\n')
- test_queuespeed(multiprocessing.Process, manager.Queue(),
- manager.Condition())
- print('\n\t######## testing multiprocessing.Pipe\n')
- test_pipespeed()
-
- print()
-
- print('\n\t######## testing list\n')
- test_seqspeed(list(range(10)))
- print('\n\t######## testing list managed by server process\n')
- test_seqspeed(manager.list(list(range(10))))
- print('\n\t######## testing Array("i", ..., lock=False)\n')
- test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=False))
- print('\n\t######## testing Array("i", ..., lock=True)\n')
- test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=True))
-
- print()
-
- print('\n\t######## testing threading.Lock\n')
- test_lockspeed(threading.Lock())
- print('\n\t######## testing threading.RLock\n')
- test_lockspeed(threading.RLock())
- print('\n\t######## testing multiprocessing.Lock\n')
- test_lockspeed(multiprocessing.Lock())
- print('\n\t######## testing multiprocessing.RLock\n')
- test_lockspeed(multiprocessing.RLock())
- print('\n\t######## testing lock managed by server process\n')
- test_lockspeed(manager.Lock())
- print('\n\t######## testing rlock managed by server process\n')
- test_lockspeed(manager.RLock())
-
- print()
-
- print('\n\t######## testing threading.Condition\n')
- test_conditionspeed(threading.Thread, threading.Condition())
- print('\n\t######## testing multiprocessing.Condition\n')
- test_conditionspeed(multiprocessing.Process, multiprocessing.Condition())
- print('\n\t######## testing condition managed by a server process\n')
- test_conditionspeed(multiprocessing.Process, manager.Condition())
-
- gc.enable()
-
-if __name__ == '__main__':
- multiprocessing.freeze_support()
- test()
diff --git a/Doc/includes/mp_newtype.py b/Doc/includes/mp_newtype.py
index 7291743..1c796a5 100644
--- a/Doc/includes/mp_newtype.py
+++ b/Doc/includes/mp_newtype.py
@@ -1,11 +1,3 @@
-#
-# This module shows how to use arbitrary callables with a subclass of
-# `BaseManager`.
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager, BaseProxy
import operator
@@ -27,12 +19,10 @@ def baz():
# Proxy type for generator objects
class GeneratorProxy(BaseProxy):
- _exposed_ = ('next', '__next__')
+ _exposed_ = ['__next__']
def __iter__(self):
return self
def __next__(self):
- return self._callmethod('next')
- def __next__(self):
return self._callmethod('__next__')
# Function to return the operator module
@@ -90,8 +80,6 @@ def test():
op = manager.operator()
print('op.add(23, 45) =', op.add(23, 45))
print('op.pow(2, 94) =', op.pow(2, 94))
- print('op.getslice(range(10), 2, 6) =', op.getslice(list(range(10)), 2, 6))
- print('op.repeat(range(5), 3) =', op.repeat(list(range(5)), 3))
print('op._exposed_ =', op._exposed_)
##
diff --git a/Doc/includes/mp_pool.py b/Doc/includes/mp_pool.py
index 1578498..11101e1 100644
--- a/Doc/includes/mp_pool.py
+++ b/Doc/includes/mp_pool.py
@@ -1,10 +1,3 @@
-#
-# A test of `multiprocessing.Pool` class
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-
import multiprocessing
import time
import random
@@ -46,269 +39,115 @@ def noop(x):
#
def test():
- print('cpu_count() = %d\n' % multiprocessing.cpu_count())
-
- #
- # Create pool
- #
-
PROCESSES = 4
print('Creating pool with %d processes\n' % PROCESSES)
- pool = multiprocessing.Pool(PROCESSES)
- print('pool = %s' % pool)
- print()
-
- #
- # Tests
- #
-
- TASKS = [(mul, (i, 7)) for i in range(10)] + \
- [(plus, (i, 8)) for i in range(10)]
-
- results = [pool.apply_async(calculate, t) for t in TASKS]
- imap_it = pool.imap(calculatestar, TASKS)
- imap_unordered_it = pool.imap_unordered(calculatestar, TASKS)
-
- print('Ordered results using pool.apply_async():')
- for r in results:
- print('\t', r.get())
- print()
-
- print('Ordered results using pool.imap():')
- for x in imap_it:
- print('\t', x)
- print()
-
- print('Unordered results using pool.imap_unordered():')
- for x in imap_unordered_it:
- print('\t', x)
- print()
-
- print('Ordered results using pool.map() --- will block till complete:')
- for x in pool.map(calculatestar, TASKS):
- print('\t', x)
- print()
-
- #
- # Simple benchmarks
- #
-
- N = 100000
- print('def pow3(x): return x**3')
- t = time.time()
- A = list(map(pow3, range(N)))
- print('\tmap(pow3, range(%d)):\n\t\t%s seconds' % \
- (N, time.time() - t))
+ with multiprocessing.Pool(PROCESSES) as pool:
+ #
+ # Tests
+ #
- t = time.time()
- B = pool.map(pow3, range(N))
- print('\tpool.map(pow3, range(%d)):\n\t\t%s seconds' % \
- (N, time.time() - t))
+ TASKS = [(mul, (i, 7)) for i in range(10)] + \
+ [(plus, (i, 8)) for i in range(10)]
- t = time.time()
- C = list(pool.imap(pow3, range(N), chunksize=N//8))
- print('\tlist(pool.imap(pow3, range(%d), chunksize=%d)):\n\t\t%s' \
- ' seconds' % (N, N//8, time.time() - t))
+ results = [pool.apply_async(calculate, t) for t in TASKS]
+ imap_it = pool.imap(calculatestar, TASKS)
+ imap_unordered_it = pool.imap_unordered(calculatestar, TASKS)
- assert A == B == C, (len(A), len(B), len(C))
- print()
+ print('Ordered results using pool.apply_async():')
+ for r in results:
+ print('\t', r.get())
+ print()
- L = [None] * 1000000
- print('def noop(x): pass')
- print('L = [None] * 1000000')
+ print('Ordered results using pool.imap():')
+ for x in imap_it:
+ print('\t', x)
+ print()
- t = time.time()
- A = list(map(noop, L))
- print('\tmap(noop, L):\n\t\t%s seconds' % \
- (time.time() - t))
+ print('Unordered results using pool.imap_unordered():')
+ for x in imap_unordered_it:
+ print('\t', x)
+ print()
- t = time.time()
- B = pool.map(noop, L)
- print('\tpool.map(noop, L):\n\t\t%s seconds' % \
- (time.time() - t))
+ print('Ordered results using pool.map() --- will block till complete:')
+ for x in pool.map(calculatestar, TASKS):
+ print('\t', x)
+ print()
- t = time.time()
- C = list(pool.imap(noop, L, chunksize=len(L)//8))
- print('\tlist(pool.imap(noop, L, chunksize=%d)):\n\t\t%s seconds' % \
- (len(L)//8, time.time() - t))
+ #
+ # Test error handling
+ #
- assert A == B == C, (len(A), len(B), len(C))
- print()
+ print('Testing error handling:')
- del A, B, C, L
-
- #
- # Test error handling
- #
-
- print('Testing error handling:')
-
- try:
- print(pool.apply(f, (5,)))
- except ZeroDivisionError:
- print('\tGot ZeroDivisionError as expected from pool.apply()')
- else:
- raise AssertionError('expected ZeroDivisionError')
-
- try:
- print(pool.map(f, list(range(10))))
- except ZeroDivisionError:
- print('\tGot ZeroDivisionError as expected from pool.map()')
- else:
- raise AssertionError('expected ZeroDivisionError')
-
- try:
- print(list(pool.imap(f, list(range(10)))))
- except ZeroDivisionError:
- print('\tGot ZeroDivisionError as expected from list(pool.imap())')
- else:
- raise AssertionError('expected ZeroDivisionError')
-
- it = pool.imap(f, list(range(10)))
- for i in range(10):
try:
- x = next(it)
+ print(pool.apply(f, (5,)))
except ZeroDivisionError:
- if i == 5:
- pass
- except StopIteration:
- break
+ print('\tGot ZeroDivisionError as expected from pool.apply()')
else:
- if i == 5:
- raise AssertionError('expected ZeroDivisionError')
-
- assert i == 9
- print('\tGot ZeroDivisionError as expected from IMapIterator.next()')
- print()
+ raise AssertionError('expected ZeroDivisionError')
- #
- # Testing timeouts
- #
-
- print('Testing ApplyResult.get() with timeout:', end=' ')
- res = pool.apply_async(calculate, TASKS[0])
- while 1:
- sys.stdout.flush()
try:
- sys.stdout.write('\n\t%s' % res.get(0.02))
- break
- except multiprocessing.TimeoutError:
- sys.stdout.write('.')
- print()
- print()
+ print(pool.map(f, list(range(10))))
+ except ZeroDivisionError:
+ print('\tGot ZeroDivisionError as expected from pool.map()')
+ else:
+ raise AssertionError('expected ZeroDivisionError')
- print('Testing IMapIterator.next() with timeout:', end=' ')
- it = pool.imap(calculatestar, TASKS)
- while 1:
- sys.stdout.flush()
try:
- sys.stdout.write('\n\t%s' % it.next(0.02))
- except StopIteration:
- break
- except multiprocessing.TimeoutError:
- sys.stdout.write('.')
- print()
- print()
-
- #
- # Testing callback
- #
-
- print('Testing callback:')
-
- A = []
- B = [56, 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
-
- r = pool.apply_async(mul, (7, 8), callback=A.append)
- r.wait()
-
- r = pool.map_async(pow3, list(range(10)), callback=A.extend)
- r.wait()
-
- if A == B:
- print('\tcallbacks succeeded\n')
- else:
- print('\t*** callbacks failed\n\t\t%s != %s\n' % (A, B))
-
- #
- # Check there are no outstanding tasks
- #
-
- assert not pool._cache, 'cache = %r' % pool._cache
-
- #
- # Check close() methods
- #
-
- print('Testing close():')
-
- for worker in pool._pool:
- assert worker.is_alive()
-
- result = pool.apply_async(time.sleep, [0.5])
- pool.close()
- pool.join()
-
- assert result.get() is None
-
- for worker in pool._pool:
- assert not worker.is_alive()
-
- print('\tclose() succeeded\n')
-
- #
- # Check terminate() method
- #
-
- print('Testing terminate():')
-
- pool = multiprocessing.Pool(2)
- DELTA = 0.1
- ignore = pool.apply(pow3, [2])
- results = [pool.apply_async(time.sleep, [DELTA]) for i in range(100)]
- pool.terminate()
- pool.join()
-
- for worker in pool._pool:
- assert not worker.is_alive()
-
- print('\tterminate() succeeded\n')
-
- #
- # Check garbage collection
- #
-
- print('Testing garbage collection:')
-
- pool = multiprocessing.Pool(2)
- DELTA = 0.1
- processes = pool._pool
- ignore = pool.apply(pow3, [2])
- results = [pool.apply_async(time.sleep, [DELTA]) for i in range(100)]
-
- results = pool = None
-
- time.sleep(DELTA * 2)
-
- for worker in processes:
- assert not worker.is_alive()
-
- print('\tgarbage collection succeeded\n')
+ print(list(pool.imap(f, list(range(10)))))
+ except ZeroDivisionError:
+ print('\tGot ZeroDivisionError as expected from list(pool.imap())')
+ else:
+ raise AssertionError('expected ZeroDivisionError')
+
+ it = pool.imap(f, list(range(10)))
+ for i in range(10):
+ try:
+ x = next(it)
+ except ZeroDivisionError:
+ if i == 5:
+ pass
+ except StopIteration:
+ break
+ else:
+ if i == 5:
+ raise AssertionError('expected ZeroDivisionError')
+
+ assert i == 9
+ print('\tGot ZeroDivisionError as expected from IMapIterator.next()')
+ print()
+
+ #
+ # Testing timeouts
+ #
+
+ print('Testing ApplyResult.get() with timeout:', end=' ')
+ res = pool.apply_async(calculate, TASKS[0])
+ while 1:
+ sys.stdout.flush()
+ try:
+ sys.stdout.write('\n\t%s' % res.get(0.02))
+ break
+ except multiprocessing.TimeoutError:
+ sys.stdout.write('.')
+ print()
+ print()
+
+ print('Testing IMapIterator.next() with timeout:', end=' ')
+ it = pool.imap(calculatestar, TASKS)
+ while 1:
+ sys.stdout.flush()
+ try:
+ sys.stdout.write('\n\t%s' % it.next(0.02))
+ except StopIteration:
+ break
+ except multiprocessing.TimeoutError:
+ sys.stdout.write('.')
+ print()
+ print()
if __name__ == '__main__':
multiprocessing.freeze_support()
-
- assert len(sys.argv) in (1, 2)
-
- if len(sys.argv) == 1 or sys.argv[1] == 'processes':
- print(' Using processes '.center(79, '-'))
- elif sys.argv[1] == 'threads':
- print(' Using threads '.center(79, '-'))
- import multiprocessing.dummy as multiprocessing
- else:
- print('Usage:\n\t%s [processes | threads]' % sys.argv[0])
- raise SystemExit(2)
-
test()
diff --git a/Doc/includes/mp_synchronize.py b/Doc/includes/mp_synchronize.py
deleted file mode 100644
index 81dbc38..0000000
--- a/Doc/includes/mp_synchronize.py
+++ /dev/null
@@ -1,278 +0,0 @@
-#
-# A test file for the `multiprocessing` package
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-
-import time
-import sys
-import random
-from queue import Empty
-
-import multiprocessing # may get overwritten
-
-
-#### TEST_VALUE
-
-def value_func(running, mutex):
- random.seed()
- time.sleep(random.random()*4)
-
- mutex.acquire()
- print('\n\t\t\t' + str(multiprocessing.current_process()) + ' has finished')
- running.value -= 1
- mutex.release()
-
-def test_value():
- TASKS = 10
- running = multiprocessing.Value('i', TASKS)
- mutex = multiprocessing.Lock()
-
- for i in range(TASKS):
- p = multiprocessing.Process(target=value_func, args=(running, mutex))
- p.start()
-
- while running.value > 0:
- time.sleep(0.08)
- mutex.acquire()
- print(running.value, end=' ')
- sys.stdout.flush()
- mutex.release()
-
- print()
- print('No more running processes')
-
-
-#### TEST_QUEUE
-
-def queue_func(queue):
- for i in range(30):
- time.sleep(0.5 * random.random())
- queue.put(i*i)
- queue.put('STOP')
-
-def test_queue():
- q = multiprocessing.Queue()
-
- p = multiprocessing.Process(target=queue_func, args=(q,))
- p.start()
-
- o = None
- while o != 'STOP':
- try:
- o = q.get(timeout=0.3)
- print(o, end=' ')
- sys.stdout.flush()
- except Empty:
- print('TIMEOUT')
-
- print()
-
-
-#### TEST_CONDITION
-
-def condition_func(cond):
- cond.acquire()
- print('\t' + str(cond))
- time.sleep(2)
- print('\tchild is notifying')
- print('\t' + str(cond))
- cond.notify()
- cond.release()
-
-def test_condition():
- cond = multiprocessing.Condition()
-
- p = multiprocessing.Process(target=condition_func, args=(cond,))
- print(cond)
-
- cond.acquire()
- print(cond)
- cond.acquire()
- print(cond)
-
- p.start()
-
- print('main is waiting')
- cond.wait()
- print('main has woken up')
-
- print(cond)
- cond.release()
- print(cond)
- cond.release()
-
- p.join()
- print(cond)
-
-
-#### TEST_SEMAPHORE
-
-def semaphore_func(sema, mutex, running):
- sema.acquire()
-
- mutex.acquire()
- running.value += 1
- print(running.value, 'tasks are running')
- mutex.release()
-
- random.seed()
- time.sleep(random.random()*2)
-
- mutex.acquire()
- running.value -= 1
- print('%s has finished' % multiprocessing.current_process())
- mutex.release()
-
- sema.release()
-
-def test_semaphore():
- sema = multiprocessing.Semaphore(3)
- mutex = multiprocessing.RLock()
- running = multiprocessing.Value('i', 0)
-
- processes = [
- multiprocessing.Process(target=semaphore_func,
- args=(sema, mutex, running))
- for i in range(10)
- ]
-
- for p in processes:
- p.start()
-
- for p in processes:
- p.join()
-
-
-#### TEST_JOIN_TIMEOUT
-
-def join_timeout_func():
- print('\tchild sleeping')
- time.sleep(5.5)
- print('\n\tchild terminating')
-
-def test_join_timeout():
- p = multiprocessing.Process(target=join_timeout_func)
- p.start()
-
- print('waiting for process to finish')
-
- while 1:
- p.join(timeout=1)
- if not p.is_alive():
- break
- print('.', end=' ')
- sys.stdout.flush()
-
-
-#### TEST_EVENT
-
-def event_func(event):
- print('\t%r is waiting' % multiprocessing.current_process())
- event.wait()
- print('\t%r has woken up' % multiprocessing.current_process())
-
-def test_event():
- event = multiprocessing.Event()
-
- processes = [multiprocessing.Process(target=event_func, args=(event,))
- for i in range(5)]
-
- for p in processes:
- p.start()
-
- print('main is sleeping')
- time.sleep(2)
-
- print('main is setting event')
- event.set()
-
- for p in processes:
- p.join()
-
-
-#### TEST_SHAREDVALUES
-
-def sharedvalues_func(values, arrays, shared_values, shared_arrays):
- for i in range(len(values)):
- v = values[i][1]
- sv = shared_values[i].value
- assert v == sv
-
- for i in range(len(values)):
- a = arrays[i][1]
- sa = list(shared_arrays[i][:])
- assert a == sa
-
- print('Tests passed')
-
-def test_sharedvalues():
- values = [
- ('i', 10),
- ('h', -2),
- ('d', 1.25)
- ]
- arrays = [
- ('i', list(range(100))),
- ('d', [0.25 * i for i in range(100)]),
- ('H', list(range(1000)))
- ]
-
- shared_values = [multiprocessing.Value(id, v) for id, v in values]
- shared_arrays = [multiprocessing.Array(id, a) for id, a in arrays]
-
- p = multiprocessing.Process(
- target=sharedvalues_func,
- args=(values, arrays, shared_values, shared_arrays)
- )
- p.start()
- p.join()
-
- assert p.exitcode == 0
-
-
-####
-
-def test(namespace=multiprocessing):
- global multiprocessing
-
- multiprocessing = namespace
-
- for func in [test_value, test_queue, test_condition,
- test_semaphore, test_join_timeout, test_event,
- test_sharedvalues]:
-
- print('\n\t######## %s\n' % func.__name__)
- func()
-
- ignore = multiprocessing.active_children() # cleanup any old processes
- if hasattr(multiprocessing, '_debug_info'):
- info = multiprocessing._debug_info()
- if info:
- print(info)
- raise ValueError('there should be no positive refcounts left')
-
-
-if __name__ == '__main__':
- multiprocessing.freeze_support()
-
- assert len(sys.argv) in (1, 2)
-
- if len(sys.argv) == 1 or sys.argv[1] == 'processes':
- print(' Using processes '.center(79, '-'))
- namespace = multiprocessing
- elif sys.argv[1] == 'manager':
- print(' Using processes and a manager '.center(79, '-'))
- namespace = multiprocessing.Manager()
- namespace.Process = multiprocessing.Process
- namespace.current_process = multiprocessing.current_process
- namespace.active_children = multiprocessing.active_children
- elif sys.argv[1] == 'threads':
- print(' Using threads '.center(79, '-'))
- import multiprocessing.dummy as namespace
- else:
- print('Usage:\n\t%s [processes | manager | threads]' % sys.argv[0])
- raise SystemExit(2)
-
- test(namespace)
diff --git a/Doc/includes/mp_webserver.py b/Doc/includes/mp_webserver.py
deleted file mode 100644
index 651024d..0000000
--- a/Doc/includes/mp_webserver.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# Example where a pool of http servers share a single listening socket
-#
-# On Windows this module depends on the ability to pickle a socket
-# object so that the worker processes can inherit a copy of the server
-# object. (We import `multiprocessing.reduction` to enable this pickling.)
-#
-# Not sure if we should synchronize access to `socket.accept()` method by
-# using a process-shared lock -- does not seem to be necessary.
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-
-import os
-import sys
-
-from multiprocessing import Process, current_process, freeze_support
-from http.server import HTTPServer
-from http.server import SimpleHTTPRequestHandler
-
-if sys.platform == 'win32':
- import multiprocessing.reduction # make sockets pickable/inheritable
-
-
-def note(format, *args):
- sys.stderr.write('[%s]\t%s\n' % (current_process().name, format % args))
-
-
-class RequestHandler(SimpleHTTPRequestHandler):
- # we override log_message() to show which process is handling the request
- def log_message(self, format, *args):
- note(format, *args)
-
-def serve_forever(server):
- note('starting server')
- try:
- server.serve_forever()
- except KeyboardInterrupt:
- pass
-
-
-def runpool(address, number_of_processes):
- # create a single server object -- children will each inherit a copy
- server = HTTPServer(address, RequestHandler)
-
- # create child processes to act as workers
- for i in range(number_of_processes - 1):
- Process(target=serve_forever, args=(server,)).start()
-
- # main process also acts as a worker
- serve_forever(server)
-
-
-def test():
- DIR = os.path.join(os.path.dirname(__file__), '..')
- ADDRESS = ('localhost', 8000)
- NUMBER_OF_PROCESSES = 4
-
- print('Serving at http://%s:%d using %d worker processes' % \
- (ADDRESS[0], ADDRESS[1], NUMBER_OF_PROCESSES))
- print('To exit press Ctrl-' + ['C', 'Break'][sys.platform=='win32'])
-
- os.chdir(DIR)
- runpool(ADDRESS, NUMBER_OF_PROCESSES)
-
-
-if __name__ == '__main__':
- freeze_support()
- test()
diff --git a/Doc/includes/mp_workers.py b/Doc/includes/mp_workers.py
index e66d97b..3b92269 100644
--- a/Doc/includes/mp_workers.py
+++ b/Doc/includes/mp_workers.py
@@ -1,16 +1,3 @@
-#
-# Simple example which uses a pool of workers to carry out some tasks.
-#
-# Notice that the results will probably not come out of the output
-# queue in the same in the same order as the corresponding tasks were
-# put on the input queue. If it is important to get the results back
-# in the original order then consider using `Pool.map()` or
-# `Pool.imap()` (which will save on the amount of code needed anyway).
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-
import time
import random
diff --git a/Doc/includes/typestruct.h b/Doc/includes/typestruct.h
index 32647c0..fcb846a 100644
--- a/Doc/includes/typestruct.h
+++ b/Doc/includes/typestruct.h
@@ -70,4 +70,11 @@ typedef struct _typeobject {
PyObject *tp_subclasses;
PyObject *tp_weaklist;
+ destructor tp_del;
+
+ /* Type attribute cache version tag. Added in version 2.6 */
+ unsigned int tp_version_tag;
+
+ destructor tp_finalize;
+
} PyTypeObject;
diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst
index 97e692f..158b3be 100644
--- a/Doc/library/2to3.rst
+++ b/Doc/library/2to3.rst
@@ -342,6 +342,10 @@ and off individually. They are described here in more detail.
Handles the move of :func:`reduce` to :func:`functools.reduce`.
+.. 2to3fixer:: reload
+
+ Converts :func:`reload` to :func:`imp.reload`.
+
.. 2to3fixer:: renames
Changes :data:`sys.maxint` to :data:`sys.maxsize`.
diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst
index 6f23596..1f21b57 100644
--- a/Doc/library/abc.rst
+++ b/Doc/library/abc.rst
@@ -12,9 +12,9 @@
--------------
This module provides the infrastructure for defining :term:`abstract base
-classes <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this
-was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
-regarding a type hierarchy for numbers based on ABCs.)
+classes <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`;
+see the PEP for why this was added to Python. (See also :pep:`3141` and the
+:mod:`numbers` module regarding a type hierarchy for numbers based on ABCs.)
The :mod:`collections` module has some concrete classes that derive from
ABCs; these can, of course, be further derived. In addition the
@@ -23,7 +23,7 @@ a class or instance provides a particular interface, for example, is it
hashable or a mapping.
-This module provides the following class:
+This module provides the following classes:
.. class:: ABCMeta
@@ -58,6 +58,10 @@ This module provides the following class:
.. versionchanged:: 3.3
Returns the registered subclass, to allow usage as a class decorator.
+ .. versionchanged:: 3.4
+ To detect calls to :meth:`register`, you can use the
+ :func:`get_cache_token` function.
+
You can also override this method in an abstract base class:
.. method:: __subclasshook__(subclass)
@@ -127,6 +131,19 @@ This module provides the following class:
available as a method of ``Foo``, so it is provided separately.
+.. class:: ABC
+
+ A helper class that has :class:`ABCMeta` as its metaclass. With this class,
+ an abstract base class can be created by simply deriving from :class:`ABC`,
+ avoiding sometimes confusing metaclass usage.
+
+ Note that the type of :class:`ABC` is still :class:`ABCMeta`, therefore
+ inheriting from :class:`ABC` requires the usual precautions regarding metaclass
+ usage, as multiple inheritance may lead to metaclass conflicts.
+
+ .. versionadded:: 3.4
+
+
The :mod:`abc` module also provides the following decorators:
.. decorator:: abstractmethod
@@ -295,6 +312,19 @@ The :mod:`abc` module also provides the following decorators:
:func:`abstractmethod`, making this decorator redundant.
+The :mod:`abc` module also provides the following functions:
+
+.. function:: get_cache_token()
+
+ Returns the current abstract base class cache token.
+
+ The token is an opaque integer identifying the current version of the
+ abstract base class cache for virtual subclasses. This number changes
+ with every call to :meth:`ABCMeta.register` on any ABC.
+
+ .. versionadded:: 3.4
+
+
.. rubric:: Footnotes
.. [#] C++ programmers should note that Python's virtual base class
diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst
index 999bad8..44a0a24 100644
--- a/Doc/library/aifc.rst
+++ b/Doc/library/aifc.rst
@@ -51,6 +51,11 @@ Module :mod:`aifc` defines the following function:
used for writing, the file object should be seekable, unless you know ahead of
time how many samples you are going to write in total and use
:meth:`writeframesraw` and :meth:`setnframes`.
+ The :func:`.open` function may be used in a :keyword:`with` statement. When
+ the :keyword:`with` block completes, the :meth:`~aifc.close` method is called.
+
+.. versionchanged:: 3.4
+ Support for the :keyword:`with` statement was added.
Objects returned by :func:`.open` when a file is opened for reading have the
following methods:
@@ -92,7 +97,9 @@ following methods:
.. method:: aifc.getparams()
- Return a tuple consisting of all of the above values in the above order.
+ Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth,
+ framerate, nframes, comptype, compname)``, equivalent to output of the
+ :meth:`get\*` methods.
.. method:: aifc.getmarkers()
diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst
index 7267ae4..f3eb9dd 100644
--- a/Doc/library/argparse.rst
+++ b/Doc/library/argparse.rst
@@ -977,9 +977,9 @@ See the section on the default_ keyword argument for information on when the
``type`` argument is applied to default arguments.
To ease the use of various types of files, the argparse module provides the
-factory FileType which takes the ``mode=`` and ``bufsize=`` arguments of the
-:func:`open` function. For example, ``FileType('w')`` can be used to create a
-writable file::
+factory FileType which takes the ``mode=``, ``bufsize=``, ``encoding=`` and
+``errors=`` arguments of the :func:`open` function. For example,
+``FileType('w')`` can be used to create a writable file::
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar', type=argparse.FileType('w'))
@@ -1619,17 +1619,19 @@ Sub-commands
FileType objects
^^^^^^^^^^^^^^^^
-.. class:: FileType(mode='r', bufsize=None)
+.. class:: FileType(mode='r', bufsize=-1, encoding=None, errors=None)
The :class:`FileType` factory creates objects that can be passed to the type
argument of :meth:`ArgumentParser.add_argument`. Arguments that have
- :class:`FileType` objects as their type will open command-line arguments as files
- with the requested modes and buffer sizes::
+ :class:`FileType` objects as their type will open command-line arguments as
+ files with the requested modes, buffer sizes, encodings and error handling
+ (see the :func:`open` function for more details)::
>>> parser = argparse.ArgumentParser()
- >>> parser.add_argument('--output', type=argparse.FileType('wb', 0))
- >>> parser.parse_args(['--output', 'out'])
- Namespace(output=<_io.BufferedWriter name='out'>)
+ >>> parser.add_argument('--raw', type=argparse.FileType('wb', 0))
+ >>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8'))
+ >>> parser.parse_args(['--raw', 'raw.dat', 'file.txt'])
+ Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)
FileType objects understand the pseudo-argument ``'-'`` and automatically
convert this into ``sys.stdin`` for readable :class:`FileType` objects and
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
index a65fe5b..96c5aef 100644
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -76,14 +76,19 @@ The class can be used to simulate nested scopes and is useful in templating.
be modified to change which mappings are searched. The list should
always contain at least one mapping.
- .. method:: new_child()
+ .. method:: new_child(m=None)
- Returns a new :class:`ChainMap` containing a new :class:`dict` followed by
- all of the maps in the current instance. A call to ``d.new_child()`` is
- equivalent to: ``ChainMap({}, *d.maps)``. This method is used for
+ Returns a new :class:`ChainMap` containing a new map followed by
+ all of the maps in the current instance. If ``m`` is specified,
+ it becomes the new map at the front of the list of mappings; if not
+ specified, an empty dict is used, so that a call to ``d.new_child()``
+ is equivalent to: ``ChainMap({}, *d.maps)``. This method is used for
creating subcontexts that can be updated without altering values in any
of the parent mappings.
+ .. versionchanged:: 3.4
+ The optional ``m`` parameter was added.
+
.. attribute:: parents
Property returning a new :class:`ChainMap` containing all of the maps in
diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst
index fba48f4..349b805 100644
--- a/Doc/library/contextlib.rst
+++ b/Doc/library/contextlib.rst
@@ -94,6 +94,26 @@ Functions and classes provided:
without needing to explicitly close ``page``. Even if an error occurs,
``page.close()`` will be called when the :keyword:`with` block is exited.
+.. function:: ignored(*exceptions)
+
+ Return a context manager that ignores the specified exceptions if they
+ occur in the body of a with-statement.
+
+ For example::
+
+ from contextlib import ignored
+
+ with ignored(OSError):
+ os.remove('somefile.tmp')
+
+ This code is equivalent to::
+
+ try:
+ os.remove('somefile.tmp')
+ except OSError:
+ pass
+
+ .. versionadded:: 3.4
.. class:: ContextDecorator()
diff --git a/Doc/library/datatypes.rst b/Doc/library/datatypes.rst
index d0382e0..48af082 100644
--- a/Doc/library/datatypes.rst
+++ b/Doc/library/datatypes.rst
@@ -30,3 +30,4 @@ The following modules are documented in this chapter:
copy.rst
pprint.rst
reprlib.rst
+ enum.rst
diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst
index 30b63e1..bb268e1 100644
--- a/Doc/library/datetime.rst
+++ b/Doc/library/datetime.rst
@@ -170,10 +170,12 @@ dates or times.
* ``0 <= seconds < 3600*24`` (the number of seconds in one day)
* ``-999999999 <= days <= 999999999``
- If any argument is a float and there are fractional microseconds, the fractional
- microseconds left over from all arguments are combined and their sum is rounded
- to the nearest microsecond. If no argument is a float, the conversion and
- normalization processes are exact (no information is lost).
+ If any argument is a float and there are fractional microseconds,
+ the fractional microseconds left over from all arguments are
+ combined and their sum is rounded to the nearest microsecond using
+ round-half-to-even tiebreaker. If no argument is a float, the
+ conversion and normalization processes are exact (no information is
+ lost).
If the normalized value of days lies outside the indicated range,
:exc:`OverflowError` is raised.
diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst
index 4339f55..468ce92 100644
--- a/Doc/library/dis.rst
+++ b/Doc/library/dis.rst
@@ -26,7 +26,8 @@ Example: Given the function :func:`myfunc`::
def myfunc(alist):
return len(alist)
-the following command can be used to get the disassembly of :func:`myfunc`::
+the following command can be used to display the disassembly of
+:func:`myfunc`::
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
@@ -36,8 +37,62 @@ the following command can be used to get the disassembly of :func:`myfunc`::
(The "2" is a line number).
-The :mod:`dis` module defines the following functions and constants:
+Bytecode analysis
+-----------------
+The bytecode analysis API allows pieces of Python code to be wrapped in a
+:class:`Bytecode` object that provides easy access to details of the
+compiled code.
+
+.. class:: Bytecode
+
+ The bytecode operations of a piece of code
+
+ This is a convenient wrapper around many of the functions listed below.
+ Instantiate it with a function, method, string of code, or a code object
+ (as returned by :func:`compile`).
+
+ Iterating over this yields the bytecode operations as :class:`Instruction`
+ instances.
+
+ .. data:: codeobj
+
+ The compiled code object.
+
+ .. method:: display_code(*, file=None)
+
+ Print a formatted view of the bytecode operations, like :func:`dis`.
+
+ .. method:: info()
+
+ Return a formatted multi-line string with detailed information about the
+ code object, like :func:`code_info`.
+
+ .. method:: show_info(*, file=None)
+
+ Print the information about the code object as returned by :meth:`info`.
+
+ .. versionadded:: 3.4
+
+Example::
+
+ >>> bytecode = dis.Bytecode(myfunc)
+ >>> for instr in bytecode:
+ ... print(instr.opname)
+ ...
+ LOAD_GLOBAL
+ LOAD_FAST
+ CALL_FUNCTION
+ RETURN_VALUE
+
+
+Analysis functions
+------------------
+
+The :mod:`dis` module also defines the following analysis functions that
+convert the input directly to the desired output. They can be useful if
+only a single operation is being performed, so the intermediate analysis
+object isn't useful:
.. function:: code_info(x)
@@ -51,17 +106,21 @@ The :mod:`dis` module defines the following functions and constants:
.. versionadded:: 3.2
-.. function:: show_code(x)
+.. function:: show_code(x, *, file=None)
Print detailed code object information for the supplied function, method,
source code string or code object to stdout.
- This is a convenient shorthand for ``print(code_info(x))``, intended for
- interactive exploration at the interpreter prompt.
+ This is a convenient shorthand for ``print(code_info(x), file=file)``,
+ intended for interactive exploration at the interpreter prompt.
.. versionadded:: 3.2
-.. function:: dis(x=None)
+ .. versionchanged:: 3.4
+ Added ``file`` parameter
+
+
+.. function:: dis(x=None, *, file=None)
Disassemble the *x* object. *x* can denote either a module, a class, a
method, a function, a code object, a string of source code or a byte sequence
@@ -72,16 +131,28 @@ The :mod:`dis` module defines the following functions and constants:
disassembled. If no object is provided, this function disassembles the last
traceback.
+ The disassembly is written as text to the supplied ``file`` argument if
+ provided and to ``sys.stdout`` otherwise.
+
+ .. versionchanged:: 3.4
+ Added ``file`` parameter
+
-.. function:: distb(tb=None)
+.. function:: distb(tb=None, *, file=None)
Disassemble the top-of-stack function of a traceback, using the last
traceback if none was passed. The instruction causing the exception is
indicated.
+ The disassembly is written as text to the supplied ``file`` argument if
+ provided and to ``sys.stdout`` otherwise.
-.. function:: disassemble(code, lasti=-1)
- disco(code, lasti=-1)
+ .. versionchanged:: 3.4
+ Added ``file`` parameter
+
+
+.. function:: disassemble(code, lasti=-1, *, file=None)
+ disco(code, lasti=-1, *, file=None)
Disassemble a code object, indicating the last instruction if *lasti* was
provided. The output is divided in the following columns:
@@ -97,6 +168,26 @@ The :mod:`dis` module defines the following functions and constants:
The parameter interpretation recognizes local and global variable names,
constant values, branch targets, and compare operators.
+ The disassembly is written as text to the supplied ``file`` argument if
+ provided and to ``sys.stdout`` otherwise.
+
+ .. versionchanged:: 3.4
+ Added ``file`` parameter
+
+
+.. function:: get_instructions(x, *, line_offset=0)
+
+ Return an iterator over the instructions in the supplied function, method,
+ source code string or code object.
+
+ The iterator generates a series of :class:`Instruction` named tuples
+ giving the details of each operation in the supplied code.
+
+ The given *line_offset* is added to the ``starts_line`` attribute of any
+ instructions that start a new line.
+
+ .. versionadded:: 3.4
+
.. function:: findlinestarts(code)
@@ -110,61 +201,60 @@ The :mod:`dis` module defines the following functions and constants:
Detect all offsets in the code object *code* which are jump targets, and
return a list of these offsets.
+.. _bytecodes:
-.. data:: opname
+Python Bytecode Instructions
+----------------------------
- Sequence of operation names, indexable using the bytecode.
+The :func:`get_instructions` function and :class:`Bytecode` class provide
+details of bytecode instructions as :class:`Instruction` instances:
+.. class:: Instruction
-.. data:: opmap
+ Details for a bytecode operation
- Dictionary mapping operation names to bytecodes.
+ .. data:: opcode
+ numeric code for operation, corresponding to the opcode values listed
+ below and the bytecode values in the :ref:`opcode_collections`.
-.. data:: cmp_op
- Sequence of all compare operation names.
+ .. data:: opname
+ human readable name for operation
-.. data:: hasconst
- Sequence of bytecodes that have a constant parameter.
+ .. data:: arg
+ numeric argument to operation (if any), otherwise None
-.. data:: hasfree
- Sequence of bytecodes that access a free variable.
+ .. data:: argval
-
-.. data:: hasname
-
- Sequence of bytecodes that access an attribute by name.
+ resolved arg value (if known), otherwise same as arg
-.. data:: hasjrel
-
- Sequence of bytecodes that have a relative jump target.
+ .. data:: argrepr
+ human readable description of operation argument
-.. data:: hasjabs
- Sequence of bytecodes that have an absolute jump target.
+ .. data:: offset
+ start index of operation within bytecode sequence
-.. data:: haslocal
- Sequence of bytecodes that access a local variable.
+ .. data:: starts_line
+ line started by this opcode (if any), otherwise None
-.. data:: hascompare
- Sequence of bytecodes of Boolean operations.
+ .. data:: is_jump_target
+ True if other code jumps to here, otherwise False
-.. _bytecodes:
+ .. versionadded:: 3.4
-Python Bytecode Instructions
-----------------------------
The Python compiler currently generates the following bytecode instructions.
@@ -506,12 +596,6 @@ the stack so that it is available for further iterations of the loop.
.. XXX explain the WHY stuff!
-.. opcode:: STORE_LOCALS
-
- Pops TOS from the stack and stores it as the current frame's ``f_locals``.
- This is used in class construction.
-
-
All of the following opcodes expect arguments. An argument is two bytes, with
the more significant byte last.
@@ -722,6 +806,13 @@ the more significant byte last.
Pushes a reference to the object the cell contains on the stack.
+.. opcode:: LOAD_CLASSDEREF (i)
+
+ Much like :opcode:`LOAD_DEREF` but first checks the locals dictionary before
+ consulting the cell. This is used for loading free variables in class
+ bodies.
+
+
.. opcode:: STORE_DEREF (i)
Stores TOS into the cell contained in slot *i* of the cell and free variable
@@ -813,3 +904,62 @@ the more significant byte last.
which don't take arguments ``< HAVE_ARGUMENT`` and those which do ``>=
HAVE_ARGUMENT``.
+.. _opcode_collections:
+
+Opcode collections
+------------------
+
+These collections are provided for automatic introspection of bytecode
+instructions:
+
+.. data:: opname
+
+ Sequence of operation names, indexable using the bytecode.
+
+
+.. data:: opmap
+
+ Dictionary mapping operation names to bytecodes.
+
+
+.. data:: cmp_op
+
+ Sequence of all compare operation names.
+
+
+.. data:: hasconst
+
+ Sequence of bytecodes that have a constant parameter.
+
+
+.. data:: hasfree
+
+ Sequence of bytecodes that access a free variable (note that 'free' in
+ this context refers to names in the current scope that are referenced by
+ inner scopes or names in outer scopes that are referenced from this scope.
+ It does *not* include references to global or builtin scopes).
+
+
+.. data:: hasname
+
+ Sequence of bytecodes that access an attribute by name.
+
+
+.. data:: hasjrel
+
+ Sequence of bytecodes that have a relative jump target.
+
+
+.. data:: hasjabs
+
+ Sequence of bytecodes that have an absolute jump target.
+
+
+.. data:: haslocal
+
+ Sequence of bytecodes that access a local variable.
+
+
+.. data:: hascompare
+
+ Sequence of bytecodes of Boolean operations.
diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst
index 222c719..6138e30 100644
--- a/Doc/library/doctest.rst
+++ b/Doc/library/doctest.rst
@@ -495,7 +495,10 @@ Option Flags
A number of option flags control various aspects of doctest's behavior.
Symbolic names for the flags are supplied as module constants, which can be
or'ed together and passed to various functions. The names can also be used in
-:ref:`doctest directives <doctest-directives>`.
+:ref:`doctest directives <doctest-directives>`, and may be passed to the
+doctest command line interface via the ``-o`` option.
+
+.. versionadded:: 3.4 the ``-o`` command line option
The first group of options define test semantics, controlling aspects of how
doctest decides whether actual output matches an example's expected output:
@@ -633,6 +636,19 @@ The second group of options controls how test failures are reported:
the output is suppressed.
+.. data:: FAIL_FAST
+
+ When specified, exit after the first failing example and don't attempt to run
+ the remaining examples. Thus, the number of failures reported will be at most
+ 1. This flag may be useful during debugging, since examples after the first
+ failure won't even produce debugging output.
+
+ The doctest command line accepts the option ``-f`` as a shorthand for ``-o
+ FAIL_FAST``.
+
+ .. versionadded:: 3.4
+
+
.. data:: REPORTING_FLAGS
A bitmask or'ing together all the reporting flags above.
diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst
index 576531d..4a34c36 100644
--- a/Doc/library/email.message.rst
+++ b/Doc/library/email.message.rst
@@ -42,14 +42,21 @@ Here are the methods of the :class:`Message` class:
.. versionchanged:: 3.3 The *policy* keyword argument was added.
- .. method:: as_string(unixfrom=False, maxheaderlen=0)
+ .. method:: as_string(unixfrom=False, maxheaderlen=0, policy=None)
Return the entire message flattened as a string. When optional *unixfrom*
- is ``True``, the envelope header is included in the returned string.
- *unixfrom* defaults to ``False``. Flattening the message may trigger
- changes to the :class:`Message` if defaults need to be filled in to
- complete the transformation to a string (for example, MIME boundaries may
- be generated or modified).
+ is true, the envelope header is included in the returned string.
+ *unixfrom* defaults to ``False``. For backward compabitility reasons,
+ *maxheaderlen* defaults to ``0``, so if you want a different value you
+ must override it explicitly (the value specified for *max_line_length* in
+ the policy will be ignored by this method). The *policy* argument may be
+ used to override the default policy obtained from the message instance.
+ This can be used to control some of the formatting produced by the
+ method, since the specified *policy* will be passed to the ``Generator``.
+
+ Flattening the message may trigger changes to the :class:`Message` if
+ defaults need to be filled in to complete the transformation to a string
+ (for example, MIME boundaries may be generated or modified).
Note that this method is provided as a convenience and may not always
format the message the way you want. For example, by default it does
@@ -65,10 +72,58 @@ Here are the methods of the :class:`Message` class:
g.flatten(msg)
text = fp.getvalue()
+ If the message object contains binary data that is not encoded according
+ to RFC standards, the non-compliant data will be replaced by unicode
+ "unknown character" code points. (See also :meth:`.as_bytes` and
+ :class:`~email.generator.BytesGenerator`.)
+
+ .. versionchanged:: 3.4 the *policy* keyword argument was added.
+
.. method:: __str__()
- Equivalent to ``as_string(unixfrom=True)``.
+ Equivalent to :meth:`.as_string()`. Allows ``str(msg)`` to produce a
+ string containing the formatted message.
+
+
+ .. method:: as_bytes(unixfrom=False, policy=None)
+
+ Return the entire message flattened as a bytes object. When optional
+ *unixfrom* is true, the envelope header is included in the returned
+ string. *unixfrom* defaults to ``False``. The *policy* argument may be
+ used to override the default policy obtained from the message instance.
+ This can be used to control some of the formatting produced by the
+ method, since the specified *policy* will be passed to the
+ ``BytesGenerator``.
+
+ Flattening the message may trigger changes to the :class:`Message` if
+ defaults need to be filled in to complete the transformation to a string
+ (for example, MIME boundaries may be generated or modified).
+
+ Note that this method is provided as a convenience and may not always
+ format the message the way you want. For example, by default it does
+ not do the mangling of lines that begin with ``From`` that is
+ required by the unix mbox format. For more flexibility, instantiate a
+ :class:`~email.generator.BytesGenerator` instance and use its
+ :meth:`~email.generator.BytesGenerator.flatten` method directly.
+ For example::
+
+ from io import BytesIO
+ from email.generator import BytesGenerator
+ fp = BytesIO()
+ g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
+ g.flatten(msg)
+ text = fp.getvalue()
+
+ .. versionadded:: 3.4
+
+
+ .. method:: __bytes__()
+
+ Equivalent to :meth:`.as_bytes()`. Allows ``bytes(msg)`` to produce a
+ bytes object containing the formatted message.
+
+ .. versionadded:: 3.4
.. method:: is_multipart()
diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst
index cb2023c..5856879 100644
--- a/Doc/library/email.policy.rst
+++ b/Doc/library/email.policy.rst
@@ -97,6 +97,17 @@ correct line separator characters when creating the binary string to feed into
``sendmail's`` ``stdin``, where the default policy would use ``\n`` line
separators.
+Some email package methods accept a *policy* keyword argument, allowing the
+policy to be overridden for that method. For example, the following code uses
+the :meth:`~email.message.Message.as_string` method of the *msg* object from
+the previous example and writes the message to a file using the native line
+separators for the platform on which it is running::
+
+ >>> import os
+ >>> with open('converted.txt', 'wb') as f:
+ ... f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))
+ 17
+
Policy objects can also be combined using the addition operator, producing a
policy object whose settings are a combination of the non-default values of the
summed objects::
diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst
new file mode 100644
index 0000000..6864705
--- /dev/null
+++ b/Doc/library/enum.rst
@@ -0,0 +1,593 @@
+:mod:`enum` --- Support for enumerations
+========================================
+
+.. module:: enum
+ :synopsis: Implementation of an enumeration class.
+
+.. :moduleauthor:: Ethan Furman <ethan@stoneleaf.us>
+.. :sectionauthor:: Barry Warsaw <barry@python.org>,
+.. :sectionauthor:: Eli Bendersky <eliben@gmail.com>,
+.. :sectionauthor:: Ethan Furman <ethan@stoneleaf.us>
+
+**Source code:** :source:`Lib/enum.py`
+
+----------------
+
+An enumeration is a set of symbolic names (members) bound to unique, constant
+values. Within an enumeration, the members can be compared by identity, and
+the enumeration itself can be iterated over.
+
+This module defines two enumeration classes that can be used to define unique
+sets of names and values: :class:`Enum` and :class:`IntEnum`. It also defines
+one decorator, :func:`unique`, that ensures only unique member values are
+present in an enumeration.
+
+
+Creating an Enum
+----------------
+
+Enumerations are created using the :keyword:`class` syntax, which makes them
+easy to read and write. An alternative creation method is described in
+`Functional API`_. To define an enumeration, subclass :class:`Enum` as
+follows::
+
+ >>> from enum import Enum
+ >>> class Color(Enum):
+ ... red = 1
+ ... green = 2
+ ... blue = 3
+
+**A note on nomenclature**: we call :class:`Color` an *enumeration* (or *enum*)
+and :attr:`Color.red`, :attr:`Color.green` are *enumeration members* (or
+*enum members*). Enumeration members also have *values* (the value of
+:attr:`Color.red` is ``1``, etc.)
+
+Enumeration members have human readable string representations::
+
+ >>> print(Color.red)
+ Color.red
+
+...while their ``repr`` has more information::
+
+ >>> print(repr(Color.red))
+ <Color.red: 1>
+
+The *type* of an enumeration member is the enumeration it belongs to::
+
+ >>> type(Color.red)
+ <enum 'Color'>
+ >>> isinstance(Color.green, Color)
+ True
+ >>>
+
+Enum members also have a property that contains just their item name::
+
+ >>> print(Color.red.name)
+ red
+
+Enumerations support iteration, in definition order::
+
+ >>> class Shake(Enum):
+ ... vanilla = 7
+ ... chocolate = 4
+ ... cookies = 9
+ ... mint = 3
+ ...
+ >>> for shake in Shake:
+ ... print(shake)
+ ...
+ Shake.vanilla
+ Shake.chocolate
+ Shake.cookies
+ Shake.mint
+
+Enumeration members are hashable, so they can be used in dictionaries and sets::
+
+ >>> apples = {}
+ >>> apples[Color.red] = 'red delicious'
+ >>> apples[Color.green] = 'granny smith'
+ >>> apples == {Color.red: 'red delicious', Color.green: 'granny smith'}
+ True
+
+
+Programmatic access to enumeration members and their attributes
+---------------------------------------------------------------
+
+Sometimes it's useful to access members in enumerations programmatically (i.e.
+situations where ``Color.red`` won't do because the exact color is not known
+at program-writing time). ``Enum`` allows such access::
+
+ >>> Color(1)
+ <Color.red: 1>
+ >>> Color(3)
+ <Color.blue: 3>
+
+If you want to access enum members by *name*, use item access::
+
+ >>> Color['red']
+ <Color.red: 1>
+ >>> Color['green']
+ <Color.green: 2>
+
+If have an enum member and need its :attr:`name` or :attr:`value`::
+
+ >>> member = Color.red
+ >>> member.name
+ 'red'
+ >>> member.value
+ 1
+
+
+Duplicating enum members and values
+-----------------------------------
+
+Having two enum members with the same name is invalid::
+
+ >>> class Shape(Enum):
+ ... square = 2
+ ... square = 3
+ ...
+ Traceback (most recent call last):
+ ...
+ TypeError: Attempted to reuse key: 'square'
+
+However, two enum members are allowed to have the same value. Given two members
+A and B with the same value (and A defined first), B is an alias to A. By-value
+lookup of the value of A and B will return A. By-name lookup of B will also
+return A::
+
+ >>> class Shape(Enum):
+ ... square = 2
+ ... diamond = 1
+ ... circle = 3
+ ... alias_for_square = 2
+ ...
+ >>> Shape.square
+ <Shape.square: 2>
+ >>> Shape.alias_for_square
+ <Shape.square: 2>
+ >>> Shape(2)
+ <Shape.square: 2>
+
+
+Ensuring unique enumeration values
+==================================
+
+By default, enumerations allow multiple names as aliases for the same value.
+When this behavior isn't desired, the following decorator can be used to
+ensure each value is used only once in the enumeration:
+
+.. decorator:: unique
+
+A :keyword:`class` decorator specifically for enumerations. It searches an
+enumeration's :attr:`__members__` gathering any aliases it finds; if any are
+found :exc:`ValueError` is raised with the details::
+
+ >>> from enum import Enum, unique
+ >>> @unique
+ ... class Mistake(Enum):
+ ... one = 1
+ ... two = 2
+ ... three = 3
+ ... four = 3
+ Traceback (most recent call last):
+ ...
+ ValueError: duplicate values found in <enum 'Mistake'>: four -> three
+
+
+Iteration
+=========
+
+Iterating over the members of an enum does not provide the aliases::
+
+ >>> list(Shape)
+ [<Shape.square: 2>, <Shape.diamond: 1>, <Shape.circle: 3>]
+
+The special attribute ``__members__`` is an ordered dictionary mapping names
+to members. It includes all names defined in the enumeration, including the
+aliases::
+
+ >>> for name, member in Shape.__members__.items():
+ ... name, member
+ ...
+ ('square', <Shape.square: 2>)
+ ('diamond', <Shape.diamond: 1>)
+ ('circle', <Shape.circle: 3>)
+ ('alias_for_square', <Shape.square: 2>)
+
+The ``__members__`` attribute can be used for detailed programmatic access to
+the enumeration members. For example, finding all the aliases::
+
+ >>> [name for name, member in Shape.__members__.items() if member.name != name]
+ ['alias_for_square']
+
+
+Comparisons
+-----------
+
+Enumeration members are compared by identity::
+
+ >>> Color.red is Color.red
+ True
+ >>> Color.red is Color.blue
+ False
+ >>> Color.red is not Color.blue
+ True
+
+Ordered comparisons between enumeration values are *not* supported. Enum
+members are not integers (but see `IntEnum`_ below)::
+
+ >>> Color.red < Color.blue
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ TypeError: unorderable types: Color() < Color()
+
+Equality comparisons are defined though::
+
+ >>> Color.blue == Color.red
+ False
+ >>> Color.blue != Color.red
+ True
+ >>> Color.blue == Color.blue
+ True
+
+Comparisons against non-enumeration values will always compare not equal
+(again, class:`IntEnum` was explicitly designed to behave differently, see
+below)::
+
+ >>> Color.blue == 2
+ False
+
+
+Allowed members and attributes of enumerations
+----------------------------------------------
+
+The examples above use integers for enumeration values. Using integers is
+short and handy (and provided by default by the `Functional API`_), but not
+strictly enforced. In the vast majority of use-cases, one doesn't care what
+the actual value of an enumeration is. But if the value *is* important,
+enumerations can have arbitrary values.
+
+Enumerations are Python classes, and can have methods and special methods as
+usual. If we have this enumeration::
+
+ >>> class Mood(Enum):
+ ... funky = 1
+ ... happy = 3
+ ...
+ ... def describe(self):
+ ... # self is the member here
+ ... return self.name, self.value
+ ...
+ ... def __str__(self):
+ ... return 'my custom str! {0}'.format(self.value)
+ ...
+ ... @classmethod
+ ... def favorite_mood(cls):
+ ... # cls here is the enumeration
+ ... return cls.happy
+
+Then::
+
+ >>> Mood.favorite_mood()
+ <Mood.happy: 3>
+ >>> Mood.happy.describe()
+ ('happy', 3)
+ >>> str(Mood.funky)
+ 'my custom str! 1'
+
+The rules for what is allowed are as follows: _sunder_ names (starting and
+ending with a single underscore) are reserved by enum and cannot be used;
+all other attributes defined within an enumeration will become members of this
+enumeration, with the exception of *__dunder__* names and descriptors (methods
+are also descriptors).
+
+Note: if your enumeration defines :meth:`__new__` and/or :meth:`__init__` then
+whatever value(s) were given to the enum member will be passed into those
+methods. See `Planet`_ for an example.
+
+
+Restricted subclassing of enumerations
+--------------------------------------
+
+Subclassing an enumeration is allowed only if the enumeration does not define
+any members. So this is forbidden::
+
+ >>> class MoreColor(Color):
+ ... pink = 17
+ Traceback (most recent call last):
+ ...
+ TypeError: Cannot extend enumerations
+
+But this is allowed::
+
+ >>> class Foo(Enum):
+ ... def some_behavior(self):
+ ... pass
+ ...
+ >>> class Bar(Foo):
+ ... happy = 1
+ ... sad = 2
+ ...
+
+Allowing subclassing of enums that define members would lead to a violation of
+some important invariants of types and instances. On the other hand, it makes
+sense to allow sharing some common behavior between a group of enumerations.
+(See `OrderedEnum`_ for an example.)
+
+
+Pickling
+--------
+
+Enumerations can be pickled and unpickled::
+
+ >>> from test.test_enum import Fruit
+ >>> from pickle import dumps, loads
+ >>> Fruit.tomato is loads(dumps(Fruit.tomato))
+ True
+
+The usual restrictions for pickling apply: picklable enums must be defined in
+the top level of a module, since unpickling requires them to be importable
+from that module.
+
+.. warning::
+
+ In order to support the singleton nature of enumeration members, pickle
+ protocol version 2 or higher must be used.
+
+
+Functional API
+--------------
+
+The :class:`Enum` class is callable, providing the following functional API::
+
+ >>> Animal = Enum('Animal', 'ant bee cat dog')
+ >>> Animal
+ <enum 'Animal'>
+ >>> Animal.ant
+ <Animal.ant: 1>
+ >>> Animal.ant.value
+ 1
+ >>> list(Animal)
+ [<Animal.ant: 1>, <Animal.bee: 2>, <Animal.cat: 3>, <Animal.dog: 4>]
+
+The semantics of this API resemble :class:`namedtuple`. The first argument
+of the call to :class:`Enum` is the name of the enumeration.
+
+The second argument is the *source* of enumeration member names. It can be a
+whitespace-separated string of names, a sequence of names, a sequence of
+2-tuples with key/value pairs, or a mapping (e.g. dictionary) of names to
+values. The last two options enable assigning arbitrary values to
+enumerations; the others auto-assign increasing integers starting with 1. A
+new class derived from :class:`Enum` is returned. In other words, the above
+assignment to :class:`Animal` is equivalent to::
+
+ >>> class Animals(Enum):
+ ... ant = 1
+ ... bee = 2
+ ... cat = 3
+ ... dog = 4
+
+The reason for defaulting to ``1`` as the starting number and not ``0`` is
+that ``0`` is ``False`` in a boolean sense, but enum members all evaluate
+to ``True``.
+
+Pickling enums created with the functional API can be tricky as frame stack
+implementation details are used to try and figure out which module the
+enumeration is being created in (e.g. it will fail if you use a utility
+function in separate module, and also may not work on IronPython or Jython).
+The solution is to specify the module name explicitly as follows::
+
+ >>> Animals = Enum('Animals', 'ant bee cat dog', module=__name__)
+
+Derived Enumerations
+====================
+
+IntEnum
+-------
+
+A variation of :class:`Enum` is provided which is also a subclass of
+:class:`int`. Members of an :class:`IntEnum` can be compared to integers;
+by extension, integer enumerations of different types can also be compared
+to each other::
+
+ >>> from enum import IntEnum
+ >>> class Shape(IntEnum):
+ ... circle = 1
+ ... square = 2
+ ...
+ >>> class Request(IntEnum):
+ ... post = 1
+ ... get = 2
+ ...
+ >>> Shape == 1
+ False
+ >>> Shape.circle == 1
+ True
+ >>> Shape.circle == Request.post
+ True
+
+However, they still can't be compared to standard :class:`Enum` enumerations::
+
+ >>> class Shape(IntEnum):
+ ... circle = 1
+ ... square = 2
+ ...
+ >>> class Color(Enum):
+ ... red = 1
+ ... green = 2
+ ...
+ >>> Shape.circle == Color.red
+ False
+
+:class:`IntEnum` values behave like integers in other ways you'd expect::
+
+ >>> int(Shape.circle)
+ 1
+ >>> ['a', 'b', 'c'][Shape.circle]
+ 'b'
+ >>> [i for i in range(Shape.square)]
+ [0, 1]
+
+For the vast majority of code, :class:`Enum` is strongly recommended,
+since :class:`IntEnum` breaks some semantic promises of an enumeration (by
+being comparable to integers, and thus by transitivity to other
+unrelated enumerations). It should be used only in special cases where
+there's no other choice; for example, when integer constants are
+replaced with enumerations and backwards compatibility is required with code
+that still expects integers.
+
+
+Others
+------
+
+While :class:`IntEnum` is part of the :mod:`enum` module, it would be very
+simple to implement independently::
+
+ class IntEnum(int, Enum):
+ pass
+
+This demonstrates how similar derived enumerations can be defined; for example
+a :class:`StrEnum` that mixes in :class:`str` instead of :class:`int`.
+
+Some rules:
+
+1. When subclassing :class:`Enum`, mix-in types must appear before
+ :class:`Enum` itself in the sequence of bases, as in the :class:`IntEnum`
+ example above.
+2. While :class:`Enum` can have members of any type, once you mix in an
+ additional type, all the members must have values of that type, e.g.
+ :class:`int` above. This restriction does not apply to mix-ins which only
+ add methods and don't specify another data type such as :class:`int` or
+ :class:`str`.
+3. When another data type is mixed in, the :attr:`value` attribute is *not the
+ same* as the enum member itself, although it is equivalant and will compare
+ equal.
+
+
+Interesting examples
+====================
+
+While :class:`Enum` and :class:`IntEnum` are expected to cover the majority of
+use-cases, they cannot cover them all. Here are recipes for some different
+types of enumerations that can be used directly, or as examples for creating
+one's own.
+
+
+AutoNumber
+----------
+
+Avoids having to specify the value for each enumeration member::
+
+ >>> class AutoNumber(Enum):
+ ... def __new__(cls):
+ ... value = len(cls.__members__) + 1
+ ... obj = object.__new__(cls)
+ ... obj._value_ = value
+ ... return obj
+ ...
+ >>> class Color(AutoNumber):
+ ... red = ()
+ ... green = ()
+ ... blue = ()
+ ...
+ >>> Color.green.value == 2
+ True
+
+
+OrderedEnum
+-----------
+
+An ordered enumeration that is not based on :class:`IntEnum` and so maintains
+the normal :class:`Enum` invariants (such as not being comparable to other
+enumerations)::
+
+ >>> class OrderedEnum(Enum):
+ ... def __ge__(self, other):
+ ... if self.__class__ is other.__class__:
+ ... return self.value >= other.value
+ ... return NotImplemented
+ ... def __gt__(self, other):
+ ... if self.__class__ is other.__class__:
+ ... return self.value > other.value
+ ... return NotImplemented
+ ... def __le__(self, other):
+ ... if self.__class__ is other.__class__:
+ ... return self.value <= other.value
+ ... return NotImplemented
+ ... def __lt__(self, other):
+ ... if self.__class__ is other.__class__:
+ ... return self.value < other.value
+ ... return NotImplemented
+ ...
+ >>> class Grade(OrderedEnum):
+ ... A = 5
+ ... B = 4
+ ... C = 3
+ ... D = 2
+ ... F = 1
+ ...
+ >>> Grade.C < Grade.A
+ True
+
+
+DuplicateFreeEnum
+-----------------
+
+Raises an error if a duplicate member name is found instead of creating an
+alias::
+
+ >>> class DuplicateFreeEnum(Enum):
+ ... def __init__(self, *args):
+ ... cls = self.__class__
+ ... if any(self.value == e.value for e in cls):
+ ... a = self.name
+ ... e = cls(self.value).name
+ ... raise ValueError(
+ ... "aliases not allowed in DuplicateFreeEnum: %r --> %r"
+ ... % (a, e))
+ ...
+ >>> class Color(DuplicateFreeEnum):
+ ... red = 1
+ ... green = 2
+ ... blue = 3
+ ... grene = 2
+ Traceback (most recent call last):
+ ...
+ ValueError: aliases not allowed in DuplicateFreeEnum: 'grene' --> 'green'
+
+.. note::
+
+ This is a useful example for subclassing Enum to add or change other
+ behaviors as well as disallowing aliases. If the only change desired is
+ no aliases allowed the :func:`unique` decorator can be used instead.
+
+
+Planet
+------
+
+If :meth:`__new__` or :meth:`__init__` is defined the value of the enum member
+will be passed to those methods::
+
+ >>> class Planet(Enum):
+ ... MERCURY = (3.303e+23, 2.4397e6)
+ ... VENUS = (4.869e+24, 6.0518e6)
+ ... EARTH = (5.976e+24, 6.37814e6)
+ ... MARS = (6.421e+23, 3.3972e6)
+ ... JUPITER = (1.9e+27, 7.1492e7)
+ ... SATURN = (5.688e+26, 6.0268e7)
+ ... URANUS = (8.686e+25, 2.5559e7)
+ ... NEPTUNE = (1.024e+26, 2.4746e7)
+ ... def __init__(self, mass, radius):
+ ... self.mass = mass # in kilograms
+ ... self.radius = radius # in meters
+ ... @property
+ ... def surface_gravity(self):
+ ... # universal gravitational constant (m3 kg-1 s-2)
+ ... G = 6.67300E-11
+ ... return G * self.mass / (self.radius * self.radius)
+ ...
+ >>> Planet.EARTH.value
+ (5.976e+24, 6378140.0)
+ >>> Planet.EARTH.surface_gravity
+ 9.802652743337129
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
index 9595221..ece035d 100644
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -260,6 +260,12 @@ The following exceptions are the exceptions that are usually raised.
:exc:`VMSError`, :exc:`socket.error`, :exc:`select.error` and
:exc:`mmap.error` have been merged into :exc:`OSError`.
+ .. versionchanged:: 3.4
+
+ The :attr:`filename` attribute is now the original file name passed to
+ the function, instead of the name encoded to or decoded from the
+ filesystem encoding.
+
.. exception:: OverflowError
diff --git a/Doc/library/filecmp.rst b/Doc/library/filecmp.rst
index 8a88f8c..8471a72 100644
--- a/Doc/library/filecmp.rst
+++ b/Doc/library/filecmp.rst
@@ -27,6 +27,10 @@ The :mod:`filecmp` module defines the following functions:
Note that no external programs are called from this function, giving it
portability and efficiency.
+ This function uses a cache for past comparisons and the results,
+ with a cache invalidation mechanism relying on stale signatures
+ or by explicitly calling :func:`clear_cache`.
+
.. function:: cmpfiles(dir1, dir2, common, shallow=True)
@@ -48,6 +52,15 @@ The :mod:`filecmp` module defines the following functions:
one of the three returned lists.
+.. function:: clear_cache()
+
+ .. versionadded:: 3.4
+
+ Clear the filecmp cache. This may be useful if a file is compared so quickly
+ after it is modified that it is within the mtime resolution of
+ the underlying filesystem.
+
+
.. _dircmp-objects:
The :class:`dircmp` class
@@ -55,28 +68,25 @@ The :class:`dircmp` class
.. class:: dircmp(a, b, ignore=None, hide=None)
- Construct a new directory comparison object, to compare the directories *a* and
- *b*. *ignore* is a list of names to ignore, and defaults to ``['RCS', 'CVS',
- 'tags']``. *hide* is a list of names to hide, and defaults to ``[os.curdir,
- os.pardir]``.
+ Construct a new directory comparison object, to compare the directories *a*
+ and *b*. *ignore* is a list of names to ignore, and defaults to
+ :attr:`filecmp.DEFAULT_IGNORES`. *hide* is a list of names to hide, and
+ defaults to ``[os.curdir, os.pardir]``.
The :class:`dircmp` class compares files by doing *shallow* comparisons
as described for :func:`filecmp.cmp`.
The :class:`dircmp` class provides the following methods:
-
.. method:: report()
Print (to :data:`sys.stdout`) a comparison between *a* and *b*.
-
.. method:: report_partial_closure()
Print a comparison between *a* and *b* and common immediate
subdirectories.
-
.. method:: report_full_closure()
Print a comparison between *a* and *b* and common subdirectories
@@ -133,7 +143,7 @@ The :class:`dircmp` class
.. attribute:: common_files
- Files in both *a* and *b*
+ Files in both *a* and *b*.
.. attribute:: common_funny
@@ -164,6 +174,12 @@ The :class:`dircmp` class
A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp`
objects.
+.. attribute:: DEFAULT_IGNORES
+
+ .. versionadded:: 3.4
+
+ List of directories ignored by :class:`dircmp` by default.
+
Here is a simplified example of using the ``subdirs`` attribute to search
recursively through two directories to show common different files::
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index b94c434..a37d496 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -543,6 +543,10 @@ are always available. They are listed here in alphabetical order.
:exc:`TypeError` exception is raised if the method is not found or if either
the *format_spec* or the return value are not strings.
+ .. versionadded:: 3.4
+ ``object().__format__(format_spec)`` raises :exc:`TypeError`
+ if *format_spec* is not empty string.
+
.. _func-frozenset:
.. function:: frozenset([iterable])
@@ -666,6 +670,12 @@ are always available. They are listed here in alphabetical order.
The integer type is described in :ref:`typesnumeric`.
+ .. versionchanged:: 3.4
+ If *base* is not an instance of :class:`int` and the *base* object has a
+ :meth:`base.__index__ <object.__index__>` method, that method is called
+ to obtain an integer for the base. Previous versions used
+ :meth:`base.__int__ <object.__int__>` instead of :meth:`base.__index__
+ <object.__index__>`.
.. function:: isinstance(object, classinfo)
@@ -748,19 +758,22 @@ are always available. They are listed here in alphabetical order.
already arranged into argument tuples, see :func:`itertools.starmap`\.
-.. function:: max(iterable, *[, key])
+.. function:: max(iterable, *[, default, key])
max(arg1, arg2, *args[, key])
Return the largest item in an iterable or the largest of two or more
arguments.
- If one positional argument is provided, *iterable* must be a non-empty
- iterable (such as a non-empty string, tuple or list). The largest item
- in the iterable is returned. If two or more positional arguments are
- provided, the largest of the positional arguments is returned.
+ If one positional argument is provided, it should be an :term:`iterable`.
+ The largest item in the iterable is returned. If two or more positional
+ arguments are provided, the smallest of the positional arguments is
+ returned.
- The optional keyword-only *key* argument specifies a one-argument ordering
- function like that used for :meth:`list.sort`.
+ There are two optional keyword-only arguments. The *key* argument specifies
+ a one-argument ordering function like that used for :meth:`list.sort`. The
+ *default* argument specifies an object to return if the provided iterable is
+ empty. If the iterable is empty and *default* is not provided, a
+ :exc:`ValueError` is raised.
If multiple items are maximal, the function returns the first one
encountered. This is consistent with other sort-stability preserving tools
@@ -776,19 +789,22 @@ are always available. They are listed here in alphabetical order.
:ref:`typememoryview` for more information.
-.. function:: min(iterable, *[, key])
+.. function:: min(iterable, *[, default, key])
min(arg1, arg2, *args[, key])
Return the smallest item in an iterable or the smallest of two or more
arguments.
- If one positional argument is provided, *iterable* must be a non-empty
- iterable (such as a non-empty string, tuple or list). The smallest item
- in the iterable is returned. If two or more positional arguments are
- provided, the smallest of the positional arguments is returned.
+ If one positional argument is provided, it should be an :term:`iterable`.
+ The smallest item in the iterable is returned. If two or more positional
+ arguments are provided, the smallest of the positional arguments is
+ returned.
- The optional keyword-only *key* argument specifies a one-argument ordering
- function like that used for :meth:`list.sort`.
+ There are two optional keyword-only arguments. The *key* argument specifies
+ a one-argument ordering function like that used for :meth:`list.sort`. The
+ *default* argument specifies an object to return if the provided iterable is
+ empty. If the iterable is empty and *default* is not provided, a
+ :exc:`ValueError` is raised.
If multiple items are minimal, the function returns the first one
encountered. This is consistent with other sort-stability preserving tools
diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst
index d8fcf0f..2f6d9af 100644
--- a/Doc/library/functools.rst
+++ b/Doc/library/functools.rst
@@ -6,6 +6,7 @@
.. moduleauthor:: Peter Harris <scav@blueyonder.co.uk>
.. moduleauthor:: Raymond Hettinger <python@rcn.com>
.. moduleauthor:: Nick Coghlan <ncoghlan@gmail.com>
+.. moduleauthor:: Åukasz Langa <lukasz@langa.pl>
.. sectionauthor:: Peter Harris <scav@blueyonder.co.uk>
**Source code:** :source:`Lib/functools.py`
@@ -186,6 +187,111 @@ The :mod:`functools` module defines the following functions:
*sequence* contains only one item, the first item is returned.
+.. decorator:: singledispatch(default)
+
+ Transforms a function into a :term:`single-dispatch <single
+ dispatch>` :term:`generic function`.
+
+ To define a generic function, decorate it with the ``@singledispatch``
+ decorator. Note that the dispatch happens on the type of the first argument,
+ create your function accordingly::
+
+ >>> from functools import singledispatch
+ >>> @singledispatch
+ ... def fun(arg, verbose=False):
+ ... if verbose:
+ ... print("Let me just say,", end=" ")
+ ... print(arg)
+
+ To add overloaded implementations to the function, use the :func:`register`
+ attribute of the generic function. It is a decorator, taking a type
+ parameter and decorating a function implementing the operation for that
+ type::
+
+ >>> @fun.register(int)
+ ... def _(arg, verbose=False):
+ ... if verbose:
+ ... print("Strength in numbers, eh?", end=" ")
+ ... print(arg)
+ ...
+ >>> @fun.register(list)
+ ... def _(arg, verbose=False):
+ ... if verbose:
+ ... print("Enumerate this:")
+ ... for i, elem in enumerate(arg):
+ ... print(i, elem)
+
+ To enable registering lambdas and pre-existing functions, the
+ :func:`register` attribute can be used in a functional form::
+
+ >>> def nothing(arg, verbose=False):
+ ... print("Nothing.")
+ ...
+ >>> fun.register(type(None), nothing)
+
+ The :func:`register` attribute returns the undecorated function which
+ enables decorator stacking, pickling, as well as creating unit tests for
+ each variant independently::
+
+ >>> @fun.register(float)
+ ... @fun.register(Decimal)
+ ... def fun_num(arg, verbose=False):
+ ... if verbose:
+ ... print("Half of your number:", end=" ")
+ ... print(arg / 2)
+ ...
+ >>> fun_num is fun
+ False
+
+ When called, the generic function dispatches on the type of the first
+ argument::
+
+ >>> fun("Hello, world.")
+ Hello, world.
+ >>> fun("test.", verbose=True)
+ Let me just say, test.
+ >>> fun(42, verbose=True)
+ Strength in numbers, eh? 42
+ >>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
+ Enumerate this:
+ 0 spam
+ 1 spam
+ 2 eggs
+ 3 spam
+ >>> fun(None)
+ Nothing.
+ >>> fun(1.23)
+ 0.615
+
+ Where there is no registered implementation for a specific type, its
+ method resolution order is used to find a more generic implementation.
+ The original function decorated with ``@singledispatch`` is registered
+ for the base ``object`` type, which means it is used if no better
+ implementation is found.
+
+ To check which implementation will the generic function choose for
+ a given type, use the ``dispatch()`` attribute::
+
+ >>> fun.dispatch(float)
+ <function fun_num at 0x1035a2840>
+ >>> fun.dispatch(dict) # note: default implementation
+ <function fun at 0x103fe0000>
+
+ To access all registered implementations, use the read-only ``registry``
+ attribute::
+
+ >>> fun.registry.keys()
+ dict_keys([<class 'NoneType'>, <class 'int'>, <class 'object'>,
+ <class 'decimal.Decimal'>, <class 'list'>,
+ <class 'float'>])
+ >>> fun.registry[float]
+ <function fun_num at 0x1035a2840>
+ >>> fun.registry[object]
+ <function fun at 0x103fe0000>
+
+ .. versionadded:: 3.4
+
+
.. function:: update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
Update a *wrapper* function to look like the *wrapped* function. The optional
@@ -200,8 +306,8 @@ The :mod:`functools` module defines the following functions:
To allow access to the original function for introspection and other purposes
(e.g. bypassing a caching decorator such as :func:`lru_cache`), this function
- automatically adds a __wrapped__ attribute to the wrapper that refers to
- the original function.
+ automatically adds a ``__wrapped__`` attribute to the wrapper that refers to
+ the function being wrapped.
The main intended use for this function is in :term:`decorator` functions which
wrap the decorated function and return the wrapper. If the wrapper function is
@@ -224,6 +330,11 @@ The :mod:`functools` module defines the following functions:
.. versionchanged:: 3.2
Missing attributes no longer trigger an :exc:`AttributeError`.
+ .. versionchanged:: 3.4
+ The ``__wrapped__`` attribute now always refers to the wrapped
+ function, even if that function defined a ``__wrapped__`` attribute.
+ (see :issue:`17482`)
+
.. decorator:: wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst
index 5878da5..8e3a4bd 100644
--- a/Doc/library/gc.rst
+++ b/Doc/library/gc.rst
@@ -67,6 +67,24 @@ The :mod:`gc` module provides the following functions:
returned.
+.. function:: get_stats()
+
+ Return a list of 3 per-generation dictionaries containing collection
+ statistics since interpreter start. At this moment, each dictionary will
+ contain the following items:
+
+ * ``collections`` is the number of times this generation was collected;
+
+ * ``collected`` is the total number of objects collected inside this
+ generation;
+
+ * ``uncollectable`` is the total number of objects which were found
+ to be uncollectable (and were therefore moved to the :data:`garbage`
+ list) inside this generation.
+
+ .. versionadded:: 3.4
+
+
.. function:: set_threshold(threshold0[, threshold1[, threshold2]])
Set the garbage collection thresholds (the collection frequency). Setting
@@ -158,24 +176,13 @@ values but should not rebind them):
.. data:: garbage
- A list of objects which the collector found to be unreachable but could not be
- freed (uncollectable objects). By default, this list contains only objects with
- :meth:`__del__` methods. Objects that have :meth:`__del__` methods and are
- part of a reference cycle cause the entire reference cycle to be uncollectable,
- including objects not necessarily in the cycle but reachable only from it.
- Python doesn't collect such cycles automatically because, in general, it isn't
- possible for Python to guess a safe order in which to run the :meth:`__del__`
- methods. If you know a safe order, you can force the issue by examining the
- *garbage* list, and explicitly breaking cycles due to your objects within the
- list. Note that these objects are kept alive even so by virtue of being in the
- *garbage* list, so they should be removed from *garbage* too. For example,
- after breaking cycles, do ``del gc.garbage[:]`` to empty the list. It's
- generally better to avoid the issue by not creating cycles containing objects
- with :meth:`__del__` methods, and *garbage* can be examined in that case to
- verify that no such cycles are being created.
-
- If :const:`DEBUG_SAVEALL` is set, then all unreachable objects will be added
- to this list rather than freed.
+ A list of objects which the collector found to be unreachable but could
+ not be freed (uncollectable objects). Starting with Python 3.4, this
+ list should be empty most of the time, except when using instances of
+ C extension types with a non-NULL ``tp_del`` slot.
+
+ If :const:`DEBUG_SAVEALL` is set, then all unreachable objects will be
+ added to this list rather than freed.
.. versionchanged:: 3.2
If this list is non-empty at interpreter shutdown, a
@@ -183,6 +190,10 @@ values but should not rebind them):
:const:`DEBUG_UNCOLLECTABLE` is set, in addition all uncollectable objects
are printed.
+ .. versionchanged:: 3.4
+ Following :pep:`442`, objects with a :meth:`__del__` method don't end
+ up in :attr:`gc.garbage` anymore.
+
.. data:: callbacks
A list of callbacks that will be invoked by the garbage collector before and
diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst
index 0a1b208..db41db4 100644
--- a/Doc/library/hashlib.rst
+++ b/Doc/library/hashlib.rst
@@ -51,9 +51,13 @@ concatenation of the data fed to it so far using the :meth:`digest` or
.. index:: single: OpenSSL; (use in module hashlib)
Constructors for hash algorithms that are always present in this module are
-:func:`md5`, :func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`, and
-:func:`sha512`. Additional algorithms may also be available depending upon the
-OpenSSL library that Python uses on your platform.
+:func:`md5`, :func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`,
+:func:`sha512`, :func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, and
+:func:`sha3_512`. Additional algorithms may also be available depending upon
+the OpenSSL library that Python uses on your platform.
+
+ .. versionchanged:: 3.4
+ Add sha3 family of hash algorithms.
For example, to obtain the digest of the byte string ``b'Nobody inspects the
spammish repetition'``::
@@ -120,6 +124,18 @@ returned by the constructors:
The internal block size of the hash algorithm in bytes.
+A hash object has the following attributes:
+
+.. attribute:: hash.name
+
+ The canonical name of this hash, always lowercase and always suitable as a
+ parameter to :func:`new` to create another hash of this type.
+
+ .. versionchanged:: 3.4
+ The name attribute has been present in CPython since its inception, but
+ until Python 3.4 was not formally specified, so may not exist on some
+ platforms.
+
A hash object has the following methods:
diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst
index c2066a7..4c707e9 100644
--- a/Doc/library/hmac.rst
+++ b/Doc/library/hmac.rst
@@ -16,20 +16,26 @@ This module implements the HMAC algorithm as described by :rfc:`2104`.
.. function:: new(key, msg=None, digestmod=None)
- Return a new hmac object. *key* is a bytes object giving the secret key. If
- *msg* is present, the method call ``update(msg)`` is made. *digestmod* is
- the digest constructor or module for the HMAC object to use. It defaults to
- the :func:`hashlib.md5` constructor.
+ Return a new hmac object. *key* is a bytes or bytearray object giving the
+ secret key. If *msg* is present, the method call ``update(msg)`` is made.
+ *digestmod* is the digest constructor or module for the HMAC object to use.
+ It defaults to the :func:`hashlib.md5` constructor.
+ .. versionchanged:: 3.4
+ Parameter *key* can be a bytes or bytearray object. Parameter *msg* can
+ be of any type supported by :mod:`hashlib`.
An HMAC object has the following methods:
.. method:: HMAC.update(msg)
- Update the hmac object with the bytes object *msg*. Repeated calls are
- equivalent to a single call with the concatenation of all the arguments:
+ Update the hmac object with *msg*. Repeated calls are equivalent to a
+ single call with the concatenation of all the arguments:
``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``.
+ .. versionchanged:: 3.4
+ Parameter *msg* can be of any type supported by :mod:`hashlib`.
+
.. method:: HMAC.digest()
diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst
index 8137573..0fad566 100644
--- a/Doc/library/http.client.rst
+++ b/Doc/library/http.client.rst
@@ -27,7 +27,7 @@ HTTPS protocols. It is normally not used directly --- the module
The module provides the following classes:
-.. class:: HTTPConnection(host, port=None[, strict][, timeout], \
+.. class:: HTTPConnection(host, port=None[, timeout], \
source_address=None)
An :class:`HTTPConnection` instance represents one transaction with an HTTP
@@ -51,13 +51,13 @@ The module provides the following classes:
.. versionchanged:: 3.2
*source_address* was added.
- .. deprecated-removed:: 3.2 3.4
- The *strict* parameter is deprecated. HTTP 0.9-style "Simple Responses"
- are not supported anymore.
+ .. versionchanged:: 3.4
+ The *strict* parameter is removed. HTTP 0.9-style "Simple Responses" are
+ not supported.
.. class:: HTTPSConnection(host, port=None, key_file=None, \
- cert_file=None[, strict][, timeout], \
+ cert_file=None[, timeout], \
source_address=None, *, context=None, \
check_hostname=None)
@@ -89,19 +89,19 @@ The module provides the following classes:
This class now supports HTTPS virtual hosts if possible (that is,
if :data:`ssl.HAS_SNI` is true).
- .. deprecated-removed:: 3.2 3.4
- The *strict* parameter is deprecated. HTTP 0.9-style "Simple Responses"
- are not supported anymore.
+ .. versionchanged:: 3.4
+ The *strict* parameter is removed. HTTP 0.9-style "Simple Responses" are
+ not supported anymore.
-.. class:: HTTPResponse(sock, debuglevel=0[, strict], method=None, url=None)
+.. class:: HTTPResponse(sock, debuglevel=0, method=None, url=None)
Class whose instances are returned upon successful connection. Not
instantiated directly by user.
- .. deprecated-removed:: 3.2 3.4
- The *strict* parameter is deprecated. HTTP 0.9-style "Simple Responses"
- are not supported anymore.
+ .. versionchanged:: 3.4
+ The *strict* parameter is removed. HTTP 0.9 style "Simple Responses" are
+ not supported anymore.
The following exceptions are raised as appropriate:
diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst
index cbad3ed..53139a2 100644
--- a/Doc/library/http.server.rst
+++ b/Doc/library/http.server.rst
@@ -170,12 +170,19 @@ of which this module provides three different variants:
.. versionadded:: 3.2
- .. method:: send_error(code, message=None)
+ .. method:: send_error(code, message=None, explain=None)
Sends and logs a complete error reply to the client. The numeric *code*
- specifies the HTTP error code, with *message* as optional, more specific text. A
- complete set of headers is sent, followed by text composed using the
- :attr:`error_message_format` class variable.
+ specifies the HTTP error code, with *message* as optional, more specific
+ text, usually referring to short message response. The *explain*
+ argument can be used to send a detailed information about the error in
+ response content body. A complete set of headers is sent, followed by
+ text composed using the :attr:`error_message_format` class variable.
+
+ .. versionchanged:: 3.4
+ The error response includes a Content-Length header.
+ Added the *explain* argument.
+
.. method:: send_response(code, message=None)
diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst
index 36d78b0..2718cef 100644
--- a/Doc/library/idle.rst
+++ b/Doc/library/idle.rst
@@ -16,70 +16,82 @@ IDLE has the following features:
* coded in 100% pure Python, using the :mod:`tkinter` GUI toolkit
-* cross-platform: works on Windows and Unix
+* cross-platform: works on Windows, Unix, and Mac OS X
-* multi-window text editor with multiple undo, Python colorizing and many other
- features, e.g. smart indent and call tips
+* multi-window text editor with multiple undo, Python colorizing,
+ smart indent, call tips, and many other features
* Python shell window (a.k.a. interactive interpreter)
-* debugger (not complete, but you can set breakpoints, view and step)
+* debugger (not complete, but you can set breakpoints, view and step)
Menus
-----
+IDLE has two window types, the Shell window and the Editor window. It is
+possible to have multiple editor windows simultaneously. IDLE's
+menus dynamically change based on which window is currently selected. Each menu
+documented below indicates which window type it is associated with. Click on
+the dotted line at the top of a menu to "tear it off": a separate window
+containing the menu is created (for Unix and Windows only).
-File menu
-^^^^^^^^^
+File menu (Shell and Editor)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
New file
- create a new file editing window
+ Create a new file editing window
Open...
- open an existing file
+ Open an existing file
Open module...
- open an existing module (searches sys.path)
+ Open an existing module (searches sys.path)
+
+Recent Files
+ Open a list of recent files
Class browser
- show classes and methods in current file
+ Show classes and methods in current file
Path browser
- show sys.path directories, modules, classes and methods
+ Show sys.path directories, modules, classes and methods
.. index::
single: Class browser
single: Path browser
Save
- save current window to the associated file (unsaved windows have a \* before and
- after the window title)
+ Save current window to the associated file (unsaved windows have a
+ \* before and after the window title)
Save As...
- save current window to new file, which becomes the associated file
+ Save current window to new file, which becomes the associated file
Save Copy As...
- save current window to different file without changing the associated file
+ Save current window to different file without changing the associated file
+
+Print Window
+ Print the current window
Close
- close current window (asks to save if unsaved)
+ Close current window (asks to save if unsaved)
Exit
- close all windows and quit IDLE (asks to save if unsaved)
+ Close all windows and quit IDLE (asks to save if unsaved)
-Edit menu
-^^^^^^^^^
+Edit menu (Shell and Editor)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Undo
- Undo last change to current window (max 1000 changes)
+ Undo last change to current window (a maximum of 1000 changes may be undone)
Redo
Redo last undone change to current window
Cut
- Copy selection into system-wide clipboard; then delete selection
+ Copy selection into system-wide clipboard; then delete the selection
Copy
Copy selection into system-wide clipboard
@@ -108,11 +120,30 @@ Replace...
Go to line
Ask for a line number and show that line
+Expand word
+ Expand the word you have typed to match another word in the same buffer;
+ repeat to get a different expansion
+
+Show call tip
+ After an unclosed parenthesis for a function, open a small window with
+ function parameter hints
+
+Show surrounding parens
+ Highlight the surrounding parenthesis
+
+Show Completions
+ Open a scroll window allowing selection keywords and attributes. See
+ Completions below.
+
+
+Format menu (Editor window only)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
Indent region
- Shift selected lines right 4 spaces
+ Shift selected lines right by the indent width (default 4 spaces)
Dedent region
- Shift selected lines left 4 spaces
+ Shift selected lines left by the indent width (default 4 spaces)
Comment out region
Insert ## in front of selected lines
@@ -121,67 +152,121 @@ Uncomment region
Remove leading # or ## from selected lines
Tabify region
- Turns *leading* stretches of spaces into tabs
+ Turns *leading* stretches of spaces into tabs. (Note: We recommend using
+ 4 space blocks to indent Python code.)
Untabify region
- Turn *all* tabs into the right number of spaces
+ Turn *all* tabs into the correct number of spaces
-Expand word
- Expand the word you have typed to match another word in the same buffer; repeat
- to get a different expansion
+Toggle tabs
+ Open a dialog to switch between indenting with spaces and tabs.
-Format Paragraph
- Reformat the current blank-line-separated paragraph
+New Indent Width
+ Open a dialog to change indent width. The accepted default by the Python
+ community is 4 spaces.
-Import module
- Import or reload the current module
+Format Paragraph
+ Reformat the current blank-line-separated paragraph. All lines in the
+ paragraph will be formatted to less than 80 columns.
-Run script
- Execute the current file in the __main__ namespace
+Strip trailing whitespace
+ Removes any space characters after the end of the last non-space character
.. index::
single: Import module
single: Run script
-Windows menu
-^^^^^^^^^^^^
+Run menu (Editor window only)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Zoom Height
- toggles the window between normal size (24x80) and maximum height.
+Python Shell
+ Open or wake up the Python Shell window
-The rest of this menu lists the names of all open windows; select one to bring
-it to the foreground (deiconifying it if necessary).
+Check module
+ Check the syntax of the module currently open in the Editor window. If the
+ module has not been saved IDLE will prompt the user to save the code.
+
+Run module
+ Restart the shell to clean the environment, then execute the currently
+ open module. If the module has not been saved IDLE will prompt the user
+ to save the code.
+Shell menu (Shell window only)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Debug menu
-^^^^^^^^^^
+View Last Restart
+ Scroll the shell window to the last Shell restart
-* in the Python Shell window only
+Restart Shell
+ Restart the shell to clean the environment
+
+Debug menu (Shell window only)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Go to file/line
Look around the insert point for a filename and line number, open the file,
and show the line. Useful to view the source lines referenced in an
- exception traceback.
+ exception traceback. Available in the context menu of the Shell window.
-Debugger
- Run commands in the shell under the debugger.
+Debugger (toggle)
+ This feature is not complete and considered experimental. Run commands in
+ the shell under the debugger
Stack viewer
- Show the stack traceback of the last exception.
+ Show the stack traceback of the last exception
Auto-open Stack Viewer
- Open stack viewer on traceback.
+ Toggle automatically opening the stack viewer on unhandled exception
.. index::
single: stack viewer
single: debugger
+Options menu (Shell and Editor)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Configure IDLE
+ Open a configuration dialog. Fonts, indentation, keybindings, and color
+ themes may be altered. Startup Preferences may be set, and additional
+ help sources can be specified.
+
+Code Context (toggle)(Editor Window only)
+ Open a pane at the top of the edit window which shows the block context
+ of the section of code which is scrolling off the top of the window.
+
+Windows menu (Shell and Editor)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Zoom Height
+ Toggles the window between normal size (40x80 initial setting) and maximum
+ height. The initial size is in the Configure IDLE dialog under the general
+ tab.
+
+The rest of this menu lists the names of all open windows; select one to bring
+it to the foreground (deiconifying it if necessary).
+
+Help menu (Shell and Editor)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+About IDLE
+ Version, copyright, license, credits
+
+IDLE Help
+ Display a help file for IDLE detailing the menu options, basic editing and
+ navigation, and other tips.
+
+Python Docs
+ Access local Python documentation, if installed. Or will start a web browser
+ and open docs.python.org showing the latest Python documentation.
-Edit context menu
-^^^^^^^^^^^^^^^^^
+Additional help sources may be added here with the Configure IDLE dialog under
+the General tab.
-* Right-click in Edit window (Control-click on OS X)
+Editor Window context menu
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+* Right-click in Editor window (Control-click on OS X)
Cut
Copy selection into system-wide clipboard; then delete selection
@@ -207,8 +292,8 @@ Clear Breakpoint
single: breakpoints
-Shell context menu
-^^^^^^^^^^^^^^^^^^
+Shell Window context menu
+^^^^^^^^^^^^^^^^^^^^^^^^^
* Right-click in Python Shell window (Control-click on OS X)
@@ -225,19 +310,44 @@ Go to file/line
Same as in Debug menu.
-Basic editing and navigation
-----------------------------
+Editing and navigation
+----------------------
* :kbd:`Backspace` deletes to the left; :kbd:`Del` deletes to the right
+* :kbd:`C-Backspace` delete word left; :kbd:`C-Del` delete word to the right
+
* Arrow keys and :kbd:`Page Up`/:kbd:`Page Down` to move around
+* :kbd:`C-LeftArrow` and :kbd:`C-RightArrow` moves by words
+
* :kbd:`Home`/:kbd:`End` go to begin/end of line
* :kbd:`C-Home`/:kbd:`C-End` go to begin/end of file
-* Some :program:`Emacs` bindings may also work, including :kbd:`C-B`,
- :kbd:`C-P`, :kbd:`C-A`, :kbd:`C-E`, :kbd:`C-D`, :kbd:`C-L`
+* Some useful Emacs bindings are inherited from Tcl/Tk:
+
+ * :kbd:`C-a` beginning of line
+
+ * :kbd:`C-e` end of line
+
+ * :kbd:`C-k` kill line (but doesn't put it in clipboard)
+
+ * :kbd:`C-l` center window around the insertion point
+
+ * :kbd:`C-b` go backwards one character without deleting (usually you can
+ also use the cursor key for this)
+
+ * :kbd:`C-f` go forward one character without deleting (usually you can
+ also use the cursor key for this)
+
+ * :kbd:`C-p` go up one line (usually you can also use the cursor key for
+ this)
+
+ * :kbd:`C-d` delete next character
+
+Standard keybindings (like :kbd:`C-c` to copy and :kbd:`C-v` to paste)
+may work. Keybindings are selected in the Configure IDLE dialog.
Automatic indentation
@@ -246,27 +356,76 @@ Automatic indentation
After a block-opening statement, the next line is indented by 4 spaces (in the
Python Shell window by one tab). After certain keywords (break, return etc.)
the next line is dedented. In leading indentation, :kbd:`Backspace` deletes up
-to 4 spaces if they are there. :kbd:`Tab` inserts 1-4 spaces (in the Python
-Shell window one tab). See also the indent/dedent region commands in the edit
-menu.
-
+to 4 spaces if they are there. :kbd:`Tab` inserts spaces (in the Python
+Shell window one tab), number depends on Indent width. Currently tabs
+are restricted to four spaces due to Tcl/Tk limitations.
+
+See also the indent/dedent region commands in the edit menu.
+
+Completions
+^^^^^^^^^^^
+
+Completions are supplied for functions, classes, and attributes of classes,
+both built-in and user-defined. Completions are also provided for
+filenames.
+
+The AutoCompleteWindow (ACW) will open after a predefined delay (default is
+two seconds) after a '.' or (in a string) an os.sep is typed. If after one
+of those characters (plus zero or more other characters) a tab is typed
+the ACW will open immediately if a possible continuation is found.
+
+If there is only one possible completion for the characters entered, a
+:kbd:`Tab` will supply that completion without opening the ACW.
+
+'Show Completions' will force open a completions window, by default the
+:kbd:`C-space` will open a completions window. In an empty
+string, this will contain the files in the current directory. On a
+blank line, it will contain the built-in and user-defined functions and
+classes in the current name spaces, plus any modules imported. If some
+characters have been entered, the ACW will attempt to be more specific.
+
+If a string of characters is typed, the ACW selection will jump to the
+entry most closely matching those characters. Entering a :kbd:`tab` will
+cause the longest non-ambiguous match to be entered in the Editor window or
+Shell. Two :kbd:`tab` in a row will supply the current ACW selection, as
+will return or a double click. Cursor keys, Page Up/Down, mouse selection,
+and the scroll wheel all operate on the ACW.
+
+"Hidden" attributes can be accessed by typing the beginning of hidden
+name after a '.', e.g. '_'. This allows access to modules with
+``__all__`` set, or to class-private attributes.
+
+Completions and the 'Expand Word' facility can save a lot of typing!
+
+Completions are currently limited to those in the namespaces. Names in
+an Editor window which are not via ``__main__`` and :data:`sys.modules` will
+not be found. Run the module once with your imports to correct this situation.
+Note that IDLE itself places quite a few modules in sys.modules, so
+much can be found by default, e.g. the re module.
+
+If you don't like the ACW popping up unbidden, simply make the delay
+longer or disable the extension. Or another option is the delay could
+be set to zero. Another alternative to preventing ACW popups is to
+disable the call tips extension.
Python Shell window
^^^^^^^^^^^^^^^^^^^
-* :kbd:`C-C` interrupts executing command
+* :kbd:`C-c` interrupts executing command
-* :kbd:`C-D` sends end-of-file; closes window if typed at a ``>>>`` prompt
+* :kbd:`C-d` sends end-of-file; closes window if typed at a ``>>>`` prompt
+ (this is :kbd:`C-z` on Windows).
-* :kbd:`Alt-p` retrieves previous command matching what you have typed
+* :kbd:`Alt-/` (Expand word) is also useful to reduce typing
-* :kbd:`Alt-n` retrieves next
+ Command history
-* :kbd:`Return` while on any previous command retrieves that command
+ * :kbd:`Alt-p` retrieves previous command matching what you have typed. On
+ OS X use :kbd:`C-p`.
-* :kbd:`Alt-/` (Expand word) is also useful here
+ * :kbd:`Alt-n` retrieves next. On OS X use :kbd:`C-n`.
-.. index:: single: indentation
+ * :kbd:`Return` while on any previous command retrieves that command
Syntax colors
@@ -308,17 +467,17 @@ Startup
Upon startup with the ``-s`` option, IDLE will execute the file referenced by
the environment variables :envvar:`IDLESTARTUP` or :envvar:`PYTHONSTARTUP`.
-Idle first checks for ``IDLESTARTUP``; if ``IDLESTARTUP`` is present the file
-referenced is run. If ``IDLESTARTUP`` is not present, Idle checks for
+IDLE first checks for ``IDLESTARTUP``; if ``IDLESTARTUP`` is present the file
+referenced is run. If ``IDLESTARTUP`` is not present, IDLE checks for
``PYTHONSTARTUP``. Files referenced by these environment variables are
-convenient places to store functions that are used frequently from the Idle
+convenient places to store functions that are used frequently from the IDLE
shell, or for executing import statements to import common modules.
In addition, ``Tk`` also loads a startup file if it is present. Note that the
Tk file is loaded unconditionally. This additional file is ``.Idle.py`` and is
looked for in the user's home directory. Statements in this file will be
executed in the Tk namespace, so this file is not useful for importing functions
-to be used from Idle's Python shell.
+to be used from IDLE's Python shell.
Command line usage
@@ -349,3 +508,45 @@ If there are arguments:
the arguments are still available in ``sys.argv``.
+Additional help sources
+-----------------------
+
+IDLE includes a help menu entry called "Python Docs" that will open the
+extensive sources of help, including tutorials, available at docs.python.org.
+Selected URLs can be added or removed from the help menu at any time using the
+Configure IDLE dialog. See the IDLE help option in the help menu of IDLE for
+more information.
+
+
+Other preferences
+-----------------
+
+The font preferences, highlighting, keys, and general preferences can be
+changed via the Configure IDLE menu option. Be sure to note that
+keys can be user defined, IDLE ships with four built in key sets. In
+addition a user can create a custom key set in the Configure IDLE dialog
+under the keys tab.
+
+Extensions
+----------
+
+IDLE contains an extension facility. See the beginning of
+config-extensions.def in the idlelib directory for further information. The
+default extensions are currently:
+
+* FormatParagraph
+
+* AutoExpand
+
+* ZoomHeight
+
+* ScriptBinding
+
+* CallTips
+
+* ParenMatch
+
+* AutoComplete
+
+* CodeContext
+
diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst
index af98489..5253e69 100644
--- a/Doc/library/imp.rst
+++ b/Doc/library/imp.rst
@@ -1,6 +1,9 @@
:mod:`imp` --- Access the :ref:`import <importsystem>` internals
================================================================
+.. deprecated:: 3.4
+ The :mod:`imp` package is pending deprecation in favor of :mod:`importlib`.
+
.. module:: imp
:synopsis: Access the implementation of the import statement.
@@ -11,10 +14,6 @@ This module provides an interface to the mechanisms used to implement the
:keyword:`import` statement. It defines the following constants and functions:
-.. note::
- New programs should use :mod:`importlib` rather than this module.
-
-
.. function:: get_magic()
.. index:: pair: file; byte-code
@@ -22,6 +21,9 @@ This module provides an interface to the mechanisms used to implement the
Return the magic string value used to recognize byte-compiled code files
(:file:`.pyc` files). (This value may be different for each Python version.)
+ .. deprecated:: 3.4
+ Use :attr:`importlib.util.MAGIC_NUMBER` instead.
+
.. function:: get_suffixes()
@@ -101,8 +103,10 @@ This module provides an interface to the mechanisms used to implement the
using a :keyword:`try` ... :keyword:`finally` statement.
.. deprecated:: 3.3
- Unneeded as loaders should be used to load modules and
- :func:`find_module` is deprecated.
+ If previously used in conjunction with :func:`imp.find_module` then
+ call ``load_module()`` on the returned loader. If you wish to load a
+ module from a specific file, then use one of the file-based loaders found
+ in :mod:`importlib.machinery`.
.. function:: new_module(name)
@@ -110,6 +114,9 @@ This module provides an interface to the mechanisms used to implement the
Return a new empty module object called *name*. This object is *not* inserted
in ``sys.modules``.
+ .. deprecated:: 3.4
+ Use :class:`types.ModuleType` instead.
+
.. function:: reload(module)
@@ -172,6 +179,9 @@ This module provides an interface to the mechanisms used to implement the
the class does not affect the method definitions of the instances --- they
continue to use the old class definition. The same is true for derived classes.
+ .. deprecated:: 3.4
+ Use :func:`importlib.reload` instead.
+
The following functions are conveniences for handling :pep:`3147` byte-compiled
file paths.
@@ -197,6 +207,9 @@ file paths.
If :attr:`sys.implementation.cache_tag` is ``None``, then
:exc:`NotImplementedError` is raised.
+ .. deprecated:: 3.4
+ Use :func:`importlib.util.cache_from_source` instead.
+
.. function:: source_from_cache(path)
@@ -212,14 +225,17 @@ file paths.
Raise :exc:`NotImplementedError` when
:attr:`sys.implementation.cache_tag` is not defined.
+ .. deprecated:: 3.4
+ Use :func:`importlib.util.source_from_cache` instead.
+
.. function:: get_tag()
Return the :pep:`3147` magic tag string matching this version of Python's
magic number, as returned by :func:`get_magic`.
- .. note::
- You may use :attr:`sys.implementation.cache_tag` directly starting
+ .. deprecated:: 3.4
+ Use :attr:`sys.implementation.cache_tag` directly starting
in Python 3.3.
@@ -247,6 +263,8 @@ that circular imports work without any deadlocks.
the most part. A global import lock is kept for some critical tasks,
such as initializing the per-module locks.
+.. deprecated:: 3.4
+
.. function:: acquire_lock()
@@ -265,6 +283,8 @@ that circular imports work without any deadlocks.
the most part. A global import lock is kept for some critical tasks,
such as initializing the per-module locks.
+.. deprecated:: 3.4
+
.. function:: release_lock()
@@ -276,6 +296,8 @@ that circular imports work without any deadlocks.
the most part. A global import lock is kept for some critical tasks,
such as initializing the per-module locks.
+.. deprecated:: 3.4
+
The following constants with integer values, defined in this module, are used
to indicate the search result of :func:`find_module`.
@@ -341,6 +363,9 @@ to indicate the search result of :func:`find_module`.
``None`` is inserted into ``sys.path_importer_cache`` instead of an
instance of :class:`NullImporter`.
+ .. deprecated:: 3.4
+ Insert ``None`` into ``sys.path_importer_cache`` instead.
+
.. _examples-imp:
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
index efd027b..1c0eff7 100644
--- a/Doc/library/importlib.rst
+++ b/Doc/library/importlib.rst
@@ -90,7 +90,7 @@ Functions
Find the loader for a module, optionally within the specified *path*. If the
module is in :attr:`sys.modules`, then ``sys.modules[name].__loader__`` is
- returned (unless the loader would be ``None``, in which case
+ returned (unless the loader would be ``None`` or is not set, in which case
:exc:`ValueError` is raised). Otherwise a search using :attr:`sys.meta_path`
is done. ``None`` is returned if no loader is found.
@@ -99,6 +99,12 @@ Functions
will need to import all parent packages of the submodule and use the correct
argument to *path*.
+ .. versionadded:: 3.3
+
+ .. versionchanged:: 3.4
+ If ``__loader__`` is not set, raise :exc:`ValueError`, just like when the
+ attribute is set to ``None``.
+
.. function:: invalidate_caches()
Invalidate the internal caches of finders stored at
@@ -109,6 +115,73 @@ Functions
.. versionadded:: 3.3
+.. function:: reload(module)
+
+ Reload a previously imported *module*. The argument must be a module object,
+ so it must have been successfully imported before. This is useful if you
+ have edited the module source file using an external editor and want to try
+ out the new version without leaving the Python interpreter. The return value
+ is the module object (the same as the *module* argument).
+
+ When :func:`.reload` is executed:
+
+ * Python modules' code is recompiled and the module-level code re-executed,
+ defining a new set of objects which are bound to names in the module's
+ dictionary by reusing the :term:`loader` which originally loaded the
+ module. The ``init`` function of extension modules is not called a second
+ time.
+
+ * As with all other objects in Python the old objects are only reclaimed
+ after their reference counts drop to zero.
+
+ * The names in the module namespace are updated to point to any new or
+ changed objects.
+
+ * Other references to the old objects (such as names external to the module) are
+ not rebound to refer to the new objects and must be updated in each namespace
+ where they occur if that is desired.
+
+ There are a number of other caveats:
+
+ If a module is syntactically correct but its initialization fails, the first
+ :keyword:`import` statement for it does not bind its name locally, but does
+ store a (partially initialized) module object in ``sys.modules``. To reload
+ the module you must first :keyword:`import` it again (this will bind the name
+ to the partially initialized module object) before you can :func:`reload` it.
+
+ When a module is reloaded, its dictionary (containing the module's global
+ variables) is retained. Redefinitions of names will override the old
+ definitions, so this is generally not a problem. If the new version of a
+ module does not define a name that was defined by the old version, the old
+ definition remains. This feature can be used to the module's advantage if it
+ maintains a global table or cache of objects --- with a :keyword:`try`
+ statement it can test for the table's presence and skip its initialization if
+ desired::
+
+ try:
+ cache
+ except NameError:
+ cache = {}
+
+ It is legal though generally not very useful to reload built-in or
+ dynamically loaded modules (this is not true for e.g. :mod:`sys`,
+ :mod:`__main__`, :mod:`__builtin__` and other key modules where reloading is
+ frowned upon). In many cases, however, extension modules are not designed to
+ be initialized more than once, and may fail in arbitrary ways when reloaded.
+
+ If a module imports objects from another module using :keyword:`from` ...
+ :keyword:`import` ..., calling :func:`reload` for the other module does not
+ redefine the objects imported from it --- one way around this is to
+ re-execute the :keyword:`from` statement, another is to use :keyword:`import`
+ and qualified names (*module.name*) instead.
+
+ If a module instantiates instances of a class, reloading the module that
+ defines the class does not affect the method definitions of the instances ---
+ they continue to use the old class definition. The same is true for derived
+ classes.
+
+ .. versionadded:: 3.4
+
:mod:`importlib.abc` -- Abstract base classes related to import
---------------------------------------------------------------
@@ -132,8 +205,6 @@ ABC hierarchy::
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
- +-- PyLoader (deprecated)
- +-- PyPycLoader (deprecated)
.. class:: Finder
@@ -149,6 +220,10 @@ ABC hierarchy::
module. Originally specified in :pep:`302`, this method was meant
for use in :data:`sys.meta_path` and in the path-based import subsystem.
+ .. versionchanged:: 3.4
+ Returns ``None`` when called instead of raising
+ :exc:`NotImplementedError`.
+
.. class:: MetaPathFinder
@@ -165,12 +240,19 @@ ABC hierarchy::
will be the value of :attr:`__path__` from the parent
package. If a loader cannot be found, ``None`` is returned.
+ .. versionchanged:: 3.4
+ Returns ``None`` when called instead of raising
+ :exc:`NotImplementedError`.
+
.. method:: invalidate_caches()
An optional method which, when called, should invalidate any internal
cache used by the finder. Used by :func:`importlib.invalidate_caches`
when invalidating the caches of all finders on :data:`sys.meta_path`.
+ .. versionchanged:: 3.4
+ Returns ``None`` when called instead of ``NotImplemented``.
+
.. class:: PathEntryFinder
@@ -178,7 +260,7 @@ ABC hierarchy::
it bears some similarities to :class:`MetaPathFinder`, ``PathEntryFinder``
is meant for use only within the path-based import subsystem provided
by :class:`PathFinder`. This ABC is a subclass of :class:`Finder` for
- compatibility.
+ compatibility reasons only.
.. versionadded:: 3.3
@@ -190,9 +272,12 @@ ABC hierarchy::
package. The loader may be ``None`` while specifying ``portion`` to
signify the contribution of the file system locations to a namespace
package. An empty list can be used for ``portion`` to signify the loader
- is not part of a package. If ``loader`` is ``None`` and ``portion`` is
- the empty list then no loader or location for a namespace package were
- found (i.e. failure to find anything for the module).
+ is not part of a namespace package. If ``loader`` is ``None`` and
+ ``portion`` is the empty list then no loader or location for a namespace
+ package were found (i.e. failure to find anything for the module).
+
+ .. versionchanged:: 3.4
+ Returns ``(None, [])`` instead of raising :exc:`NotImplementedError`.
.. method:: find_module(fullname)
@@ -224,12 +309,11 @@ ABC hierarchy::
from the import. If the loader inserted a module and the load fails, it
must be removed by the loader from :data:`sys.modules`; modules already
in :data:`sys.modules` before the loader began execution should be left
- alone. The :func:`importlib.util.module_for_loader` decorator handles
- all of these details.
+ alone (see :func:`importlib.util.module_to_load`).
The loader should set several attributes on the module.
(Note that some of these attributes can change when a module is
- reloaded.)
+ reloaded; see :meth:`init_module_attrs`):
- :attr:`__name__`
The name of the module.
@@ -249,20 +333,39 @@ ABC hierarchy::
- :attr:`__package__`
The parent package for the module/package. If the module is
top-level then it has a value of the empty string. The
- :func:`importlib.util.set_package` decorator can handle the details
- for :attr:`__package__`.
+ :func:`importlib.util.module_for_loader` decorator can handle the
+ details for :attr:`__package__`.
- :attr:`__loader__`
- The loader used to load the module.
- (This is not set by the built-in import machinery,
- but it should be set whenever a :term:`loader` is used.)
+ The loader used to load the module. The
+ :func:`importlib.util.module_for_loader` decorator can handle the
+ details for :attr:`__package__`.
+
+ .. versionchanged:: 3.4
+ Raise :exc:`ImportError` when called instead of
+ :exc:`NotImplementedError`.
.. method:: module_repr(module)
- An abstract method which when implemented calculates and returns the
- given module's repr, as a string.
+ An optional method which when implemented calculates and returns the
+ given module's repr, as a string. The module type's default repr() will
+ use the result of this method as appropriate.
+
+ .. versionadded:: 3.3
+
+ .. versionchanged:: 3.4
+ Made optional instead of an abstractmethod.
+
+ .. method:: init_module_attrs(module)
+
+ Set the :attr:`__loader__` attribute on the module.
+
+ Subclasses overriding this method should set whatever appropriate
+ attributes it can, getting the module's name from :attr:`__name__` when
+ needed. All values should also be overridden so that reloading works as
+ expected.
- .. versionadded: 3.3
+ .. versionadded:: 3.4
.. class:: ResourceLoader
@@ -281,6 +384,9 @@ ABC hierarchy::
be found. The *path* is expected to be constructed using a module's
:attr:`__file__` attribute or an item from a package's :attr:`__path__`.
+ .. versionchanged:: 3.4
+ Raises :exc:`IOError` instead of :exc:`NotImplementedError`.
+
.. class:: InspectLoader
@@ -289,14 +395,21 @@ ABC hierarchy::
.. method:: get_code(fullname)
- An abstract method to return the :class:`code` object for a module.
- ``None`` is returned if the module does not have a code object
+ Return the code object for a module.
+ ``None`` should be returned if the module does not have a code object
(e.g. built-in module). :exc:`ImportError` is raised if loader cannot
find the requested module.
+ .. note::
+ While the method has a default implementation, it is suggested that
+ it be overridden if possible for performance.
+
.. index::
single: universal newlines; importlib.abc.InspectLoader.get_source method
+ .. versionchanged:: 3.4
+ No longer abstract and a concrete implementation is provided.
+
.. method:: get_source(fullname)
An abstract method to return the source of a module. It is returned as
@@ -305,12 +418,41 @@ ABC hierarchy::
if no source is available (e.g. a built-in module). Raises
:exc:`ImportError` if the loader cannot find the module specified.
+ .. versionchanged:: 3.4
+ Raises :exc:`ImportError` instead of :exc:`NotImplementedError`.
+
.. method:: is_package(fullname)
An abstract method to return a true value if the module is a package, a
false value otherwise. :exc:`ImportError` is raised if the
:term:`loader` cannot find the module.
+ .. versionchanged:: 3.4
+ Raises :exc:`ImportError` instead of :exc:`NotImplementedError`.
+
+ .. method:: source_to_code(data, path='<string>')
+
+ Create a code object from Python source.
+
+ The *data* argument can be whatever the :func:`compile` function
+ supports (i.e. string or bytes). The *path* argument should be
+ the "path" to where the source code originated from, which can be an
+ abstract concept (e.g. location in a zip file).
+
+ .. versionadded:: 3.4
+
+ .. method:: init_module_attrs(module)
+
+ Set the :attr:`__package__` attribute and :attr:`__path__` attribute to
+ the empty list if appropriate along with what
+ :meth:`importlib.abc.Loader.init_module_attrs` sets.
+
+ .. versionadded:: 3.4
+
+ .. method:: load_module(fullname)
+
+ Implementation of :meth:`Loader.load_module`.
+
.. class:: ExecutionLoader
@@ -328,6 +470,18 @@ ABC hierarchy::
the source file, regardless of whether a bytecode was used to load the
module.
+ .. versionchanged:: 3.4
+ Raises :exc:`ImportError` instead of :exc:`NotImplementedError`.
+
+ .. method:: init_module_attrs(module)
+
+ Set :attr:`__file__` and if initializing a package then set
+ :attr:`__path__` to ``[os.path.dirname(__file__)]`` along with
+ all attributes set by
+ :meth:`importlib.abc.InspectLoader.init_module_attrs`.
+
+ .. versionadded:: 3.4
+
.. class:: FileLoader(fullname, path)
@@ -358,7 +512,7 @@ ABC hierarchy::
.. method:: get_data(path)
- Returns the open, binary file for *path*.
+ Reads *path* as a binary file and returns the bytes from it.
.. class:: SourceLoader
@@ -373,7 +527,8 @@ ABC hierarchy::
loading is not supported.
The abstract methods defined by this class are to add optional bytecode
- file support. Not implementing these optional methods causes the loader to
+ file support. Not implementing these optional methods (or causing them to
+ raise :exc:`NotImplementedError`) causes the loader to
only work with source code. Implementing the methods allows the loader to
work with source *and* bytecode files; it does not allow for *sourceless*
loading where only bytecode is provided. Bytecode files are an
@@ -390,10 +545,13 @@ ABC hierarchy::
- ``'size'`` (optional): the size in bytes of the source code.
Any other keys in the dictionary are ignored, to allow for future
- extensions.
+ extensions. If the path cannot be handled, :exc:`IOError` is raised.
.. versionadded:: 3.3
+ .. versionchanged:: 3.4
+ Raise :exc:`IOError` instead of :exc:`NotImplementedError`.
+
.. method:: path_mtime(path)
Optional abstract method which returns the modification time for the
@@ -402,7 +560,10 @@ ABC hierarchy::
.. deprecated:: 3.3
This method is deprecated in favour of :meth:`path_stats`. You don't
have to implement it, but it is still available for compatibility
- purposes.
+ purposes. Raise :exc:`IOError` if the path cannot be handled.
+
+ .. versionchanged:: 3.4
+ Raise :exc:`IOError` instead of :exc:`NotImplementedError`.
.. method:: set_data(path, data)
@@ -414,6 +575,9 @@ ABC hierarchy::
(:attr:`errno.EACCES`/:exc:`PermissionError`), do not propagate the
exception.
+ .. versionchanged:: 3.4
+ No longer raises :exc:`NotImplementedError` when called.
+
.. method:: get_code(fullname)
Concrete implementation of :meth:`InspectLoader.get_code`.
@@ -434,141 +598,13 @@ ABC hierarchy::
``__init__`` when the file extension is removed **and** the module name
itself does not end in ``__init__``.
+ .. method:: init_module_attr(module)
-.. class:: PyLoader
-
- An abstract base class inheriting from
- :class:`ExecutionLoader` and
- :class:`ResourceLoader` designed to ease the loading of
- Python source modules (bytecode is not handled; see
- :class:`SourceLoader` for a source/bytecode ABC). A subclass
- implementing this ABC will only need to worry about exposing how the source
- code is stored; all other details for loading Python source code will be
- handled by the concrete implementations of key methods.
-
- .. deprecated:: 3.2
- This class has been deprecated in favor of :class:`SourceLoader` and is
- slated for removal in Python 3.4. See below for how to create a
- subclass that is compatible with Python 3.1 onwards.
-
- If compatibility with Python 3.1 is required, then use the following idiom
- to implement a subclass that will work with Python 3.1 onwards (make sure
- to implement :meth:`ExecutionLoader.get_filename`)::
-
- try:
- from importlib.abc import SourceLoader
- except ImportError:
- from importlib.abc import PyLoader as SourceLoader
-
-
- class CustomLoader(SourceLoader):
- def get_filename(self, fullname):
- """Return the path to the source file."""
- # Implement ...
+ Set :attr:`__cached__` using :func:`imp.cache_from_source`. Other
+ attributes set by
+ :meth:`importlib.abc.ExecutionLoader.init_module_attrs`.
- def source_path(self, fullname):
- """Implement source_path in terms of get_filename."""
- try:
- return self.get_filename(fullname)
- except ImportError:
- return None
-
- def is_package(self, fullname):
- """Implement is_package by looking for an __init__ file
- name as returned by get_filename."""
- filename = os.path.basename(self.get_filename(fullname))
- return os.path.splitext(filename)[0] == '__init__'
-
-
- .. method:: source_path(fullname)
-
- An abstract method that returns the path to the source code for a
- module. Should return ``None`` if there is no source code.
- Raises :exc:`ImportError` if the loader knows it cannot handle the
- module.
-
- .. method:: get_filename(fullname)
-
- A concrete implementation of
- :meth:`importlib.abc.ExecutionLoader.get_filename` that
- relies on :meth:`source_path`. If :meth:`source_path` returns
- ``None``, then :exc:`ImportError` is raised.
-
- .. method:: load_module(fullname)
-
- A concrete implementation of :meth:`importlib.abc.Loader.load_module`
- that loads Python source code. All needed information comes from the
- abstract methods required by this ABC. The only pertinent assumption
- made by this method is that when loading a package
- :attr:`__path__` is set to ``[os.path.dirname(__file__)]``.
-
- .. method:: get_code(fullname)
-
- A concrete implementation of
- :meth:`importlib.abc.InspectLoader.get_code` that creates code objects
- from Python source code, by requesting the source code (using
- :meth:`source_path` and :meth:`get_data`) and compiling it with the
- built-in :func:`compile` function.
-
- .. method:: get_source(fullname)
-
- A concrete implementation of
- :meth:`importlib.abc.InspectLoader.get_source`. Uses
- :meth:`importlib.abc.ResourceLoader.get_data` and :meth:`source_path`
- to get the source code. It tries to guess the source encoding using
- :func:`tokenize.detect_encoding`.
-
-
-.. class:: PyPycLoader
-
- An abstract base class inheriting from :class:`PyLoader`.
- This ABC is meant to help in creating loaders that support both Python
- source and bytecode.
-
- .. deprecated:: 3.2
- This class has been deprecated in favor of :class:`SourceLoader` and to
- properly support :pep:`3147`. If compatibility is required with
- Python 3.1, implement both :class:`SourceLoader` and :class:`PyLoader`;
- instructions on how to do so are included in the documentation for
- :class:`PyLoader`. Do note that this solution will not support
- sourceless/bytecode-only loading; only source *and* bytecode loading.
-
- .. versionchanged:: 3.3
- Updated to parse (but not use) the new source size field in bytecode
- files when reading and to write out the field properly when writing.
-
- .. method:: source_mtime(fullname)
-
- An abstract method which returns the modification time for the source
- code of the specified module. The modification time should be an
- integer. If there is no source code, return ``None``. If the
- module cannot be found then :exc:`ImportError` is raised.
-
- .. method:: bytecode_path(fullname)
-
- An abstract method which returns the path to the bytecode for the
- specified module, if it exists. It returns ``None``
- if no bytecode exists (yet).
- Raises :exc:`ImportError` if the loader knows it cannot handle the
- module.
-
- .. method:: get_filename(fullname)
-
- A concrete implementation of
- :meth:`ExecutionLoader.get_filename` that relies on
- :meth:`PyLoader.source_path` and :meth:`bytecode_path`.
- If :meth:`source_path` returns a path, then that value is returned.
- Else if :meth:`bytecode_path` returns a path, that path will be
- returned. If a path is not available from both methods,
- :exc:`ImportError` is raised.
-
- .. method:: write_bytecode(fullname, bytecode)
-
- An abstract method which has the loader write *bytecode* for future
- use. If the bytecode is written, return ``True``. Return
- ``False`` if the bytecode could not be written. This method
- should not be called if :data:`sys.dont_write_bytecode` is true.
- The *bytecode* argument should be a bytes string or bytes array.
+ .. versionadded:: 3.4
:mod:`importlib.machinery` -- Importers and path hooks
@@ -844,6 +880,51 @@ find and load modules.
This module contains the various objects that help in the construction of
an :term:`importer`.
+.. attribute:: MAGIC_NUMBER
+
+ The bytes which represent the bytecode version number. If you need help with
+ loading/writing bytecode then consider :class:`importlib.abc.SourceLoader`.
+
+ .. versionadded:: 3.4
+
+.. function:: cache_from_source(path, debug_override=None)
+
+ Return the :pep:`3147` path to the byte-compiled file associated with the
+ source *path*. For example, if *path* is ``/foo/bar/baz.py`` the return
+ value would be ``/foo/bar/__pycache__/baz.cpython-32.pyc`` for Python 3.2.
+ The ``cpython-32`` string comes from the current magic tag (see
+ :func:`get_tag`; if :attr:`sys.implementation.cache_tag` is not defined then
+ :exc:`NotImplementedError` will be raised). The returned path will end in
+ ``.pyc`` when ``__debug__`` is True or ``.pyo`` for an optimized Python
+ (i.e. ``__debug__`` is False). By passing in True or False for
+ *debug_override* you can override the system's value for ``__debug__`` for
+ extension selection.
+
+ *path* need not exist.
+
+ .. versionadded:: 3.4
+
+
+.. function:: source_from_cache(path)
+
+ Given the *path* to a :pep:`3147` file name, return the associated source code
+ file path. For example, if *path* is
+ ``/foo/bar/__pycache__/baz.cpython-32.pyc`` the returned path would be
+ ``/foo/bar/baz.py``. *path* need not exist, however if it does not conform
+ to :pep:`3147` format, a ``ValueError`` is raised. If
+ :attr:`sys.implementation.cache_tag` is not defined,
+ :exc:`NotImplementedError` is raised.
+
+ .. versionadded:: 3.4
+
+.. function:: decode_source(source_bytes)
+
+ Decode the given bytes representing source code and return it as a string
+ with universal newlines (as required by
+ :meth:`importlib.abc.InspectLoader.get_source`).
+
+ .. versionadded:: 3.4
+
.. function:: resolve_name(name, package)
Resolve a relative module name to an absolute one.
@@ -860,9 +941,23 @@ an :term:`importer`.
.. versionadded:: 3.3
+.. function:: module_to_load(name, *, reset_name=True)
+
+ Returns a :term:`context manager` which provides the module to load. The
+ module will either come from :attr:`sys.modules` in the case of reloading or
+ a fresh module if loading a new module. Proper cleanup of
+ :attr:`sys.modules` occurs if the module was new and an exception was
+ raised.
+
+ If **reset_name** is true and the module requested is being reloaded then
+ the module's :attr:`__name__` attribute will
+ be reset to **name**, else it will be left untouched.
+
+ .. versionadded:: 3.4
+
.. decorator:: module_for_loader
- A :term:`decorator` for a :term:`loader` method,
+ A :term:`decorator` for :meth:`importlib.abc.Loader.load_module`
to handle selecting the proper
module object to load with. The decorated method is expected to have a call
signature taking two positional arguments
@@ -873,55 +968,54 @@ an :term:`importer`.
The decorated method will take in the **name** of the module to be loaded
as expected for a :term:`loader`. If the module is not found in
- :data:`sys.modules` then a new one is constructed with its
- :attr:`__name__` attribute set to **name**, :attr:`__loader__` set to
- **self**, and :attr:`__package__` set if
- :meth:`importlib.abc.InspectLoader.is_package` is defined for **self** and
- does not raise :exc:`ImportError` for **name**. If a new module is not
- needed then the module found in :data:`sys.modules` will be passed into the
- method.
+ :data:`sys.modules` then a new one is constructed. Regardless of where the
+ module came from, :attr:`__loader__` set to **self** and :attr:`__package__`
+ is set based on what :meth:`importlib.abc.InspectLoader.is_package` returns
+ (if available). These attributes are set unconditionally to support
+ reloading.
If an exception is raised by the decorated method and a module was added to
:data:`sys.modules` it will be removed to prevent a partially initialized
module from being in left in :data:`sys.modules`. If the module was already
in :data:`sys.modules` then it is left alone.
- Use of this decorator handles all the details of which module object a
- loader should initialize as specified by :pep:`302` as best as possible.
-
.. versionchanged:: 3.3
:attr:`__loader__` and :attr:`__package__` are automatically set
(when possible).
+ .. versionchanged:: 3.4
+ Set :attr:`__name__`, :attr:`__loader__` :attr:`__package__`
+ unconditionally to support reloading.
+
+ .. deprecated:: 3.4
+ For the benefit of :term:`loader` subclasses, please use
+ :func:`module_to_load` and
+ :meth:`importlib.abc.Loader.init_module_attrs` instead.
+
.. decorator:: set_loader
- A :term:`decorator` for a :term:`loader` method,
- to set the :attr:`__loader__`
- attribute on loaded modules. If the attribute is already set the decorator
- does nothing. It is assumed that the first positional argument to the
- wrapped method (i.e. ``self``) is what :attr:`__loader__` should be set to.
+ A :term:`decorator` for :meth:`importlib.abc.Loader.load_module`
+ to set the :attr:`__loader__`
+ attribute on the returned module. If the attribute is already set the
+ decorator does nothing. It is assumed that the first positional argument to
+ the wrapped method (i.e. ``self``) is what :attr:`__loader__` should be set
+ to.
.. note::
+ As this decorator sets :attr:`__loader__` after loading the module, it is
+ recommended to use :meth:`importlib.abc.Loader.init_module_attrs` instead
+ when appropriate.
- It is recommended that :func:`module_for_loader` be used over this
- decorator as it subsumes this functionality.
-
+ .. versionchanged:: 3.4
+ Set ``__loader__`` if set to ``None``, as if the attribute does not
+ exist.
.. decorator:: set_package
- A :term:`decorator` for a :term:`loader` to set the :attr:`__package__`
- attribute on the module returned by the loader. If :attr:`__package__` is
- set and has a value other than ``None`` it will not be changed.
- Note that the module returned by the loader is what has the attribute
- set on and not the module found in :data:`sys.modules`.
-
- Reliance on this decorator is discouraged when it is possible to set
- :attr:`__package__` before importing. By
- setting it beforehand the code for the module is executed with the
- attribute set and thus can be used by global level code during
- initialization.
+ A :term:`decorator` for :meth:`importlib.abc.Loader.load_module` to set the :attr:`__package__` attribute on the returned module. If :attr:`__package__`
+ is set and has a value other than ``None`` it will not be changed.
.. note::
-
- It is recommended that :func:`module_for_loader` be used over this
- decorator as it subsumes this functionality.
+ As this decorator sets :attr:`__package__` after loading the module, it is
+ recommended to use :meth:`importlib.abc.Loader.init_module_attrs` instead
+ when appropriate.
diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
index 40f482b..9f784fd 100644
--- a/Doc/library/inspect.rst
+++ b/Doc/library/inspect.rst
@@ -797,6 +797,23 @@ Classes and functions
.. versionadded:: 3.3
+.. function:: unwrap(func, *, stop=None)
+
+ Get the object wrapped by *func*. It follows the chain of :attr:`__wrapped__`
+ attributes returning the last object in the chain.
+
+ *stop* is an optional callback accepting an object in the wrapper chain
+ as its sole argument that allows the unwrapping to be terminated early if
+ the callback returns a true value. If the callback never returns a true
+ value, the last object in the chain is returned as usual. For example,
+ :func:`signature` uses this to stop unwrapping if any object in the
+ chain has a ``__signature__`` attribute defined.
+
+ :exc:`ValueError` is raised if a cycle is encountered.
+
+ .. versionadded:: 3.4
+
+
.. _inspect-stack:
The interpreter stack
@@ -829,6 +846,10 @@ index of the current line within that list.
finally:
del frame
+ If you want to keep the frame around (for example to print a traceback
+ later), you can also break reference cycles by using the
+ :meth:`frame.clear` method.
+
The optional *context* argument supported by most of these functions specifies
the number of lines of context to return, which are centered around the current
line.
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
index f652039..5d97ee8 100644
--- a/Doc/library/json.rst
+++ b/Doc/library/json.rst
@@ -42,8 +42,7 @@ Compact encoding::
Pretty printing::
>>> import json
- >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True,
- ... indent=4, separators=(',', ': ')))
+ >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
@@ -158,15 +157,13 @@ Basic Usage
.. versionchanged:: 3.2
Allow strings for *indent* in addition to integers.
- .. note::
-
- Since the default item separator is ``', '``, the output might include
- trailing whitespace when *indent* is specified. You can use
- ``separators=(',', ': ')`` to avoid this.
+ If specified, *separators* should be an ``(item_separator, key_separator)``
+ tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and
+ ``(',', ': ')`` otherwise. To get the most compact JSON representation,
+ you should specify ``(',', ':')`` to eliminate whitespace.
- If *separators* is an ``(item_separator, dict_separator)`` tuple, then it
- will be used instead of the default ``(', ', ': ')`` separators. ``(',',
- ':')`` is the most compact JSON representation.
+ .. versionchanged:: 3.4
+ Use ``(',', ': ')`` as default if *indent* is not ``None``.
*default(obj)* is a function that should return a serializable version of
*obj* or raise :exc:`TypeError`. The default simply raises :exc:`TypeError`.
@@ -248,6 +245,8 @@ Basic Usage
kwarg; otherwise :class:`JSONDecoder` is used. Additional keyword arguments
will be passed to the constructor of the class.
+ If the data being deserialized is not a valid JSON document, a
+ :exc:`ValueError` will be raised.
.. function:: loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
@@ -257,6 +256,8 @@ Basic Usage
The other arguments have the same meaning as in :func:`load`, except
*encoding* which is ignored and deprecated.
+ If the data being deserialized is not a valid JSON document, a
+ :exc:`ValueError` will be raised.
Encoders and Decoders
---------------------
@@ -354,23 +355,26 @@ Encoders and Decoders
.. _py-to-json-table:
- +-------------------+---------------+
- | Python | JSON |
- +===================+===============+
- | dict | object |
- +-------------------+---------------+
- | list, tuple | array |
- +-------------------+---------------+
- | str | string |
- +-------------------+---------------+
- | int, float | number |
- +-------------------+---------------+
- | True | true |
- +-------------------+---------------+
- | False | false |
- +-------------------+---------------+
- | None | null |
- +-------------------+---------------+
+ +----------------------------------------+---------------+
+ | Python | JSON |
+ +========================================+===============+
+ | dict | object |
+ +----------------------------------------+---------------+
+ | list, tuple | array |
+ +----------------------------------------+---------------+
+ | str | string |
+ +----------------------------------------+---------------+
+ | int, float, int- & float-derived Enums | number |
+ +----------------------------------------+---------------+
+ | True | true |
+ +----------------------------------------+---------------+
+ | False | false |
+ +----------------------------------------+---------------+
+ | None | null |
+ +----------------------------------------+---------------+
+
+ .. versionchanged:: 3.4
+ Added support for int- and float-derived Enum classes.
To extend this to recognize other objects, subclass and implement a
:meth:`default` method with another method that returns a serializable object
@@ -410,15 +414,13 @@ Encoders and Decoders
.. versionchanged:: 3.2
Allow strings for *indent* in addition to integers.
- .. note::
-
- Since the default item separator is ``', '``, the output might include
- trailing whitespace when *indent* is specified. You can use
- ``separators=(',', ': ')`` to avoid this.
-
If specified, *separators* should be an ``(item_separator, key_separator)``
- tuple. The default is ``(', ', ': ')``. To get the most compact JSON
- representation, you should specify ``(',', ':')`` to eliminate whitespace.
+ tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and
+ ``(',', ': ')`` otherwise. To get the most compact JSON representation,
+ you should specify ``(',', ':')`` to eliminate whitespace.
+
+ .. versionchanged:: 3.4
+ Use ``(',', ': ')`` as default if *indent* is not ``None``.
If specified, *default* is a function that gets called for objects that can't
otherwise be serialized. It should return a JSON encodable version of the
diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst
index e34e010..37f29a0 100644
--- a/Doc/library/logging.config.rst
+++ b/Doc/library/logging.config.rst
@@ -76,11 +76,23 @@ in :mod:`logging` itself) and defining handlers which are declared either in
.. function:: fileConfig(fname, defaults=None, disable_existing_loggers=True)
- Reads the logging configuration from a :mod:`configparser`\-format file
- named *fname*. This function can be called several times from an
- application, allowing an end user to select from various pre-canned
- configurations (if the developer provides a mechanism to present the choices
- and load the chosen configuration).
+ Reads the logging configuration from a :mod:`configparser`\-format file.
+ This function can be called several times from an application, allowing an
+ end user to select from various pre-canned configurations (if the developer
+ provides a mechanism to present the choices and load the chosen
+ configuration).
+
+ :param fname: A filename, or a file-like object, or an instance derived
+ from :class:`~configparser.RawConfigParser`. If a
+ ``RawConfigParser``-derived instance is passed, it is used as
+ is. Otherwise, a :class:`~configparser.Configparser` is
+ instantiated, and the configuration read by it from the
+ object passed in ``fname``. If that has a :meth:`readline`
+ method, it is assumed to be a file-like object and read using
+ :meth:`~configparser.ConfigParser.read_file`; otherwise,
+ it is assumed to be a filename and passed to
+ :meth:`~configparser.ConfigParser.read`.
+
:param defaults: Defaults to be passed to the ConfigParser can be specified
in this argument.
@@ -94,8 +106,17 @@ in :mod:`logging` itself) and defining handlers which are declared either in
their ancestors are explicitly named in the
logging configuration.
+ .. versionchanged:: 3.4
+ An instance of a subclass of :class:`~configparser.RawConfigParser` is
+ now accepted as a value for ``fname``. This facilitates:
+
+ * Use of a configuration file where logging configuration is just part
+ of the overall application configuration.
+ * Use of a configuration read from a file, and then modified by the using
+ application (e.g. based on command-line parameters or other aspects
+ of the runtime environment) before being passed to ``fileConfig``.
-.. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT)
+.. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None)
Starts up a socket server on the specified port, and listens for new
configurations. If no port is specified, the module's default
@@ -106,6 +127,17 @@ in :mod:`logging` itself) and defining handlers which are declared either in
:meth:`~threading.Thread.join` when appropriate. To stop the server,
call :func:`stopListening`.
+ The ``verify`` argument, if specified, should be a callable which should
+ verify whether bytes received across the socket are valid and should be
+ processed. This could be done by encrypting and/or signing what is sent
+ across the socket, such that the ``verify`` callable can perform
+ signature verification and/or decryption. The ``verify`` callable is called
+ with a single argument - the bytes received across the socket - and should
+ return the bytes to be processed, or None to indicate that the bytes should
+ be discarded. The returned bytes could be the same as the passed in bytes
+ (e.g. when only verification is done), or they could be completely different
+ (perhaps if decryption were performed).
+
To send a configuration to the socket, read in the configuration file and
send it to the socket as a string of bytes preceded by a four-byte length
string packed in binary using ``struct.pack('>L', n)``.
@@ -122,7 +154,12 @@ in :mod:`logging` itself) and defining handlers which are declared either in
:func:`listen` socket and sending a configuration which runs whatever
code the attacker wants to have executed in the victim's process. This is
especially easy to do if the default port is used, but not hard even if a
- different port is used).
+ different port is used). To avoid the risk of this happening, use the
+ ``verify`` argument to :func:`listen` to prevent unrecognised
+ configurations from being applied.
+
+ .. versionchanged:: 3.4.
+ The ``verify`` argument was added.
.. function:: stopListening()
diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst
index 0855050..35a81f7 100644
--- a/Doc/library/logging.handlers.rst
+++ b/Doc/library/logging.handlers.rst
@@ -296,7 +296,7 @@ The :class:`TimedRotatingFileHandler` class, located in the
timed intervals.
-.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)
+.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)
Returns a new instance of the :class:`TimedRotatingFileHandler` class. The
specified file is opened and used as the stream for logging. On rotating it also
@@ -346,6 +346,12 @@ timed intervals.
If *delay* is true, then file opening is deferred until the first call to
:meth:`emit`.
+ If *atTime* is not ``None``, it must be a ``datetime.time`` instance which
+ specifies the time of day when rollover occurs, for the cases where rollover
+ is set to happen "at midnight" or "on a particular weekday".
+
+ .. versionchanged:: 3.4
+ *atTime* parameter was added.
.. method:: doRollover()
diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst
index 3b9e3d2..124eb61 100644
--- a/Doc/library/marshal.rst
+++ b/Doc/library/marshal.rst
@@ -40,10 +40,11 @@ this module. The following types are supported: booleans, integers, floating
point numbers, complex numbers, strings, bytes, bytearrays, tuples, lists, sets,
frozensets, dictionaries, and code objects, where it should be understood that
tuples, lists, sets, frozensets and dictionaries are only supported as long as
-the values contained therein are themselves supported; and recursive lists, sets
-and dictionaries should not be written (they will cause infinite loops). The
+the values contained therein are themselves supported.
singletons :const:`None`, :const:`Ellipsis` and :exc:`StopIteration` can also be
marshalled and unmarshalled.
+For format *version* lower than 3, recursive lists, sets and dictionaries cannot
+be written (see below).
There are functions that read/write files as well as functions operating on
strings.
@@ -103,7 +104,9 @@ In addition, the following constants are defined:
Indicates the format that the module uses. Version 0 is the historical
format, version 1 shares interned strings and version 2 uses a binary format
- for floating point numbers. The current version is 2.
+ for floating point numbers.
+ Version 3 adds support for object instancing and recursion.
+ The current version is 3.
.. rubric:: Footnotes
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst
index 03be928..f58c308 100644
--- a/Doc/library/multiprocessing.rst
+++ b/Doc/library/multiprocessing.rst
@@ -93,11 +93,80 @@ To show the individual process IDs involved, here is an expanded example::
p.start()
p.join()
-For an explanation of why (on Windows) the ``if __name__ == '__main__'`` part is
+For an explanation of why the ``if __name__ == '__main__'`` part is
necessary, see :ref:`multiprocessing-programming`.
+Start methods
+~~~~~~~~~~~~~
+
+Depending on the platform, :mod:`multiprocessing` supports three ways
+to start a process. These *start methods* are
+
+ *spawn*
+ The parent process starts a fresh python interpreter process. The
+ child process will only inherit those resources necessary to run
+ the process objects :meth:`~Process.run` method. In particular,
+ unnecessary file descriptors and handles from the parent process
+ will not be inherited. Starting a process using this method is
+ rather slow compared to using *fork* or *forkserver*.
+
+ Available on Unix and Windows. The default on Windows.
+
+ *fork*
+ The parent process uses :func:`os.fork` to fork the Python
+ interpreter. The child process, when it begins, is effectively
+ identical to the parent process. All resources of the parent are
+ inherited by the child process. Note that safely forking a
+ multithreaded process is problematic.
+
+ Available on Unix only. The default on Unix.
+
+ *forkserver*
+ When the program starts and selects the *forkserver* start method,
+ a server process is started. From then on, whenever a new process
+ is need the parent process connects to the server and requests
+ that it fork a new process. The fork server process is single
+ threaded so it is safe for it to use :func:`os.fork`. No
+ unnecessary resources are inherited.
+
+ Available on Unix platforms which support passing file descriptors
+ over unix pipes.
+
+Before Python 3.4 *fork* was the only option available on Unix. Also,
+prior to Python 3.4, child processes would inherit all the parents
+inheritable handles on Windows.
+
+On Unix using the *spawn* or *forkserver* start methods will also
+start a *semaphore tracker* process which tracks the unlinked named
+semaphores created by processes of the program. When all processes
+have exited the semaphore tracker unlinks any remaining semaphores.
+Usually there should be none, but if a process was killed by a signal
+there may some "leaked" semaphores. (Unlinking the named semaphores
+is a serious matter since the system allows only a limited number, and
+they will not be automatically unlinked until the next reboot.)
+
+To select the a start method you use the :func:`set_start_method` in
+the ``if __name__ == '__main__'`` clause of the main module. For
+example::
+
+ import multiprocessing as mp
+
+ def foo():
+ print('hello')
+
+ if __name__ == '__main__':
+ mp.set_start_method('spawn')
+ p = mp.Process(target=foo)
+ p.start()
+ p.join()
+
+:func:`set_start_method` should not be used more than once in the
+program.
+
+
+
Exchanging objects between processes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -274,15 +343,31 @@ processes in a few different ways.
For example::
from multiprocessing import Pool
+ from time import sleep
def f(x):
return x*x
if __name__ == '__main__':
- with Pool(processes=4) as pool: # start 4 worker processes
- result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously
- print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
- print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
+ # start 4 worker processes
+ with Pool(processes=4) as pool:
+
+ # print "[0, 1, 4,..., 81]"
+ print(pool.map(f, range(10)))
+
+ # print same numbers in arbitrary order
+ for i in pool.imap_unordered(f, range(10)):
+ print(i)
+
+ # evaluate "f(10)" asynchronously
+ res = pool.apply_async(f, [10])
+ print(res.get(timeout=1)) # prints "100"
+
+ # make worker sleep for 10 secs
+ res = pool.apply_async(sleep, 10)
+ print(res.get(timeout=1)) # raises multiprocessing.TimeoutError
+
+ # exiting the 'with'-block has stopped the pool
Note that the methods of a pool should only ever be used by the
process which created it.
@@ -730,6 +815,9 @@ Miscellaneous
Return the number of CPUs in the system. May raise
:exc:`NotImplementedError`.
+ .. seealso::
+ :func:`os.cpu_count`
+
.. function:: current_process()
Return the :class:`Process` object corresponding to the current process.
@@ -760,6 +848,24 @@ Miscellaneous
If the module is being run normally by the Python interpreter then
:func:`freeze_support` has no effect.
+.. function:: get_all_start_methods()
+
+ Returns a list of the supported start methods, the first of which
+ is the default. The possible start methods are ``'fork'``,
+ ``'spawn'`` and ``'forkserver'``. On Windows only ``'spawn'`` is
+ available. On Unix ``'fork'`` and ``'spawn'`` are always
+ supported, with ``'fork'`` being the default.
+
+ .. versionadded:: 3.4
+
+.. function:: get_start_method()
+
+ Return the current start method. This can be ``'fork'``,
+ ``'spawn'`` or ``'forkserver'``. ``'fork'`` is the default on
+ Unix, while ``'spawn'`` is the default on Windows.
+
+ .. versionadded:: 3.4
+
.. function:: set_executable()
Sets the path of the Python interpreter to use when starting a child process.
@@ -768,8 +874,21 @@ Miscellaneous
set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
- before they can create child processes. (Windows only)
+ before they can create child processes.
+
+ .. versionchanged:: 3.4
+ Now supported on Unix when the ``'spawn'`` start method is used.
+
+.. function:: set_start_method(method)
+
+ Set the method which should be used to start child processes.
+ *method* can be ``'fork'``, ``'spawn'`` or ``'forkserver'``.
+
+ Note that this should be called at most once, and it should be
+ protected inside the ``if __name__ == '__main__'`` clause of the
+ main module.
+ .. versionadded:: 3.4
.. note::
@@ -1671,7 +1790,7 @@ with the :class:`Pool` class.
callbacks and has a parallel map implementation.
*processes* is the number of worker processes to use. If *processes* is
- ``None`` then the number returned by :func:`cpu_count` is used. If
+ ``None`` then the number returned by :func:`os.cpu_count` is used. If
*initializer* is not ``None`` then each worker process will call
``initializer(*initargs)`` when it starts.
@@ -2172,43 +2291,8 @@ Below is an example session with logging turned on::
[INFO/MainProcess] sending shutdown message to manager
[INFO/SyncManager-...] manager exiting with exitcode 0
-In addition to having these two logging functions, the multiprocessing also
-exposes two additional logging level attributes. These are :const:`SUBWARNING`
-and :const:`SUBDEBUG`. The table below illustrates where theses fit in the
-normal level hierarchy.
-
-+----------------+----------------+
-| Level | Numeric value |
-+================+================+
-| ``SUBWARNING`` | 25 |
-+----------------+----------------+
-| ``SUBDEBUG`` | 5 |
-+----------------+----------------+
-
For a full table of logging levels, see the :mod:`logging` module.
-These additional logging levels are used primarily for certain debug messages
-within the multiprocessing module. Below is the same example as above, except
-with :const:`SUBDEBUG` enabled::
-
- >>> import multiprocessing, logging
- >>> logger = multiprocessing.log_to_stderr()
- >>> logger.setLevel(multiprocessing.SUBDEBUG)
- >>> logger.warning('doomed')
- [WARNING/MainProcess] doomed
- >>> m = multiprocessing.Manager()
- [INFO/SyncManager-...] child process calling self.run()
- [INFO/SyncManager-...] created temp directory /.../pymp-...
- [INFO/SyncManager-...] manager serving at '/.../pymp-djGBXN/listener-...'
- >>> del m
- [SUBDEBUG/MainProcess] finalizer calling ...
- [INFO/MainProcess] sending shutdown message to manager
- [DEBUG/SyncManager-...] manager received shutdown message
- [SUBDEBUG/SyncManager-...] calling <Finalize object, callback=unlink, ...
- [SUBDEBUG/SyncManager-...] finalizer calling <built-in function unlink> ...
- [SUBDEBUG/SyncManager-...] calling <Finalize object, dead>
- [SUBDEBUG/SyncManager-...] finalizer calling <function rmtree at 0x5aa730> ...
- [INFO/SyncManager-...] manager exiting with exitcode 0
The :mod:`multiprocessing.dummy` module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2229,8 +2313,10 @@ There are certain guidelines and idioms which should be adhered to when using
:mod:`multiprocessing`.
-All platforms
-~~~~~~~~~~~~~
+All start methods
+~~~~~~~~~~~~~~~~~
+
+The following applies to all start methods.
Avoid shared state
@@ -2263,11 +2349,13 @@ Joining zombie processes
Better to inherit than pickle/unpickle
- On Windows many types from :mod:`multiprocessing` need to be picklable so
- that child processes can use them. However, one should generally avoid
- sending shared objects to other processes using pipes or queues. Instead
- you should arrange the program so that a process which needs access to a
- shared resource created elsewhere can inherit it from an ancestor process.
+ When using the *spawn* or *forkserver* start methods many types
+ from :mod:`multiprocessing` need to be picklable so that child
+ processes can use them. However, one should generally avoid
+ sending shared objects to other processes using pipes or queues.
+ Instead you should arrange the program so that a process which
+ needs access to a shared resource created elsewhere can inherit it
+ from an ancestor process.
Avoid terminating processes
@@ -2311,15 +2399,17 @@ Joining processes that use queues
Explicitly pass resources to child processes
- On Unix a child process can make use of a shared resource created in a
- parent process using a global resource. However, it is better to pass the
- object as an argument to the constructor for the child process.
+ On Unix using the *fork* start method, a child process can make
+ use of a shared resource created in a parent process using a
+ global resource. However, it is better to pass the object as an
+ argument to the constructor for the child process.
- Apart from making the code (potentially) compatible with Windows this also
- ensures that as long as the child process is still alive the object will not
- be garbage collected in the parent process. This might be important if some
- resource is freed when the object is garbage collected in the parent
- process.
+ Apart from making the code (potentially) compatible with Windows
+ and the other start methods this also ensures that as long as the
+ child process is still alive the object will not be garbage
+ collected in the parent process. This might be important if some
+ resource is freed when the object is garbage collected in the
+ parent process.
So for instance ::
@@ -2378,17 +2468,19 @@ Beware of replacing :data:`sys.stdin` with a "file like object"
For more information, see :issue:`5155`, :issue:`5313` and :issue:`5331`
-Windows
-~~~~~~~
+The *spawn* and *forkserver* start methods
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Since Windows lacks :func:`os.fork` it has a few extra restrictions:
+There are a few extra restriction which don't apply to the *fork*
+start method.
More picklability
- Ensure that all arguments to :meth:`Process.__init__` are picklable. This
- means, in particular, that bound or unbound methods cannot be used directly
- as the ``target`` argument on Windows --- just define a function and use
- that instead.
+ Ensure that all arguments to :meth:`Process.__init__` are
+ picklable. This means, in particular, that bound or unbound
+ methods cannot be used directly as the ``target`` (unless you use
+ the *fork* start method) --- just define a function and use that
+ instead.
Also, if you subclass :class:`Process` then make sure that instances will be
picklable when the :meth:`Process.start` method is called.
@@ -2408,7 +2500,8 @@ Safe importing of main module
interpreter without causing unintended side effects (such a starting a new
process).
- For example, under Windows running the following module would fail with a
+ For example, using the *spawn* or *forkserver* start method
+ running the following module would fail with a
:exc:`RuntimeError`::
from multiprocessing import Process
@@ -2422,13 +2515,14 @@ Safe importing of main module
Instead one should protect the "entry point" of the program by using ``if
__name__ == '__main__':`` as follows::
- from multiprocessing import Process, freeze_support
+ from multiprocessing import Process, freeze_support, set_start_method
def foo():
print('hello')
if __name__ == '__main__':
freeze_support()
+ set_start_method('spawn')
p = Process(target=foo)
p.start()
@@ -2459,26 +2553,7 @@ Using :class:`Pool`:
:language: python3
-Synchronization types like locks, conditions and queues:
-
-.. literalinclude:: ../includes/mp_synchronize.py
- :language: python3
-
-
An example showing how to use queues to feed tasks to a collection of worker
processes and collect the results:
.. literalinclude:: ../includes/mp_workers.py
-
-
-An example of how a pool of worker processes can each run a
-:class:`~http.server.SimpleHTTPRequestHandler` instance while sharing a single
-listening socket.
-
-.. literalinclude:: ../includes/mp_webserver.py
-
-
-Some simple benchmarks comparing :mod:`multiprocessing` with :mod:`threading`:
-
-.. literalinclude:: ../includes/mp_benchmarks.py
-
diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst
index 1d1aa40..73b51c0 100644
--- a/Doc/library/nntplib.rst
+++ b/Doc/library/nntplib.rst
@@ -1,4 +1,3 @@
-
:mod:`nntplib` --- NNTP protocol client
=======================================
@@ -71,7 +70,7 @@ The module itself defines the following classes:
reader-specific commands, such as ``group``. If you get unexpected
:exc:`NNTPPermanentError`\ s, you might need to set *readermode*.
:class:`NNTP` class supports the :keyword:`with` statement to
- unconditionally consume :exc:`socket.error` exceptions and to close the NNTP
+ unconditionally consume :exc:`OSError` exceptions and to close the NNTP
connection when done. Here is a sample on how using it:
>>> from nntplib import NNTP
diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst
index de7a542..d01d33a 100644
--- a/Doc/library/operator.rst
+++ b/Doc/library/operator.rst
@@ -11,6 +11,9 @@
import operator
from operator import itemgetter, iadd
+**Source code:** :source:`Lib/operator.py`
+
+--------------
The :mod:`operator` module exports a set of efficient functions corresponding to
the intrinsic operators of Python. For example, ``operator.add(x, y)`` is
@@ -235,6 +238,14 @@ their character equivalents.
.. XXX: find a better, readable, example
+.. function:: length_hint(obj, default=0)
+
+ Return an estimated length for the object *o*. First trying to return its
+ actual length, then an estimate using :meth:`object.__length_hint__`, and
+ finally returning the default value.
+
+ .. versionadded:: 3.4
+
The :mod:`operator` module also defines tools for generalized attribute and item
lookups. These are useful for making fast field extractors as arguments for
:func:`map`, :func:`sorted`, :meth:`itertools.groupby`, or other functions that
diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst
index 1d46bf2..a0f006c 100644
--- a/Doc/library/os.path.rst
+++ b/Doc/library/os.path.rst
@@ -42,7 +42,6 @@ the :mod:`glob` module.)
* :mod:`posixpath` for UNIX-style paths
* :mod:`ntpath` for Windows paths
* :mod:`macpath` for old-style MacOS paths
- * :mod:`os2emxpath` for OS/2 EMX paths
.. function:: abspath(path)
@@ -250,15 +249,14 @@ the :mod:`glob` module.)
On Unix, this is determined by the device number and i-node number and raises an
exception if a :func:`os.stat` call on either pathname fails.
- On Windows, two files are the same if they resolve to the same final path
- name using the Windows API call GetFinalPathNameByHandle. This function
- raises an exception if handles cannot be obtained to either file.
-
Availability: Unix, Windows.
.. versionchanged:: 3.2
Added Windows support.
+ .. versionchanged:: 3.4
+ Windows now uses the same implementation as all other platforms.
+
.. function:: sameopenfile(fp1, fp2)
@@ -277,7 +275,10 @@ the :mod:`glob` module.)
:func:`stat`. This function implements the underlying comparison used by
:func:`samefile` and :func:`sameopenfile`.
- Availability: Unix.
+ Availability: Unix, Windows.
+
+ .. versionchanged:: 3.4
+ Added Windows support.
.. function:: split(path)
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 8bbb2ec..82d05ed 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -54,7 +54,7 @@ Notes on the availability of these functions:
The name of the operating system dependent module imported. The following
names have currently been registered: ``'posix'``, ``'nt'``, ``'mac'``,
- ``'os2'``, ``'ce'``, ``'java'``.
+ ``'ce'``, ``'java'``.
.. seealso::
:attr:`sys.platform` has a finer granularity. :func:`os.uname` gives
@@ -851,11 +851,11 @@ as internal buffering of data.
For a description of the flag and mode values, see the C run-time documentation;
flag constants (like :const:`O_RDONLY` and :const:`O_WRONLY`) are defined in
- this module too (see :ref:`open-constants`). In particular, on Windows adding
+ the :mod:`os` module. In particular, on Windows adding
:const:`O_BINARY` is needed to open files in binary mode.
This function can support :ref:`paths relative to directory descriptors
- <dir_fd>`.
+ <dir_fd>` with the *dir_fd* parameter.
Availability: Unix, Windows.
@@ -869,6 +869,65 @@ as internal buffering of data.
.. versionadded:: 3.3
The *dir_fd* argument.
+The following constants are options for the *flags* parameter to the
+:func:`~os.open` function. They can be combined using the bitwise OR operator
+``|``. Some of them are not available on all platforms. For descriptions of
+their availability and use, consult the :manpage:`open(2)` manual page on Unix
+or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>`_ on Windows.
+
+
+.. data:: O_RDONLY
+ O_WRONLY
+ O_RDWR
+ O_APPEND
+ O_CREAT
+ O_EXCL
+ O_TRUNC
+
+ These constants are available on Unix and Windows.
+
+
+.. data:: O_DSYNC
+ O_RSYNC
+ O_SYNC
+ O_NDELAY
+ O_NONBLOCK
+ O_NOCTTY
+ O_SHLOCK
+ O_EXLOCK
+ O_CLOEXEC
+
+ These constants are only available on Unix.
+
+ .. versionchanged:: 3.3
+ Add :data:`O_CLOEXEC` constant.
+
+.. data:: O_BINARY
+ O_NOINHERIT
+ O_SHORT_LIVED
+ O_TEMPORARY
+ O_RANDOM
+ O_SEQUENTIAL
+ O_TEXT
+
+ These constants are only available on Windows.
+
+
+.. data:: O_ASYNC
+ O_DIRECT
+ O_DIRECTORY
+ O_NOFOLLOW
+ O_NOATIME
+ O_PATH
+ O_TMPFILE
+
+ These constants are GNU extensions and not present if they are not defined by
+ the C library.
+
+ .. versionchanged:: 3.4
+ Add :data:`O_TMPFILE` constant. It's only available on Linux Kernel 3.11
+ or newer.
+
.. function:: openpty()
@@ -1082,78 +1141,6 @@ as internal buffering of data.
.. versionadded:: 3.3
-.. _open-constants:
-
-``open()`` flag constants
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The following constants are options for the *flags* parameter to the
-:func:`~os.open` function. They can be combined using the bitwise OR operator
-``|``. Some of them are not available on all platforms. For descriptions of
-their availability and use, consult the :manpage:`open(2)` manual page on Unix
-or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>`_ on Windows.
-
-
-.. data:: O_RDONLY
- O_WRONLY
- O_RDWR
- O_APPEND
- O_CREAT
- O_EXCL
- O_TRUNC
-
- These constants are available on Unix and Windows.
-
-
-.. data:: O_DSYNC
- O_RSYNC
- O_SYNC
- O_NDELAY
- O_NONBLOCK
- O_NOCTTY
- O_SHLOCK
- O_EXLOCK
- O_CLOEXEC
-
- These constants are only available on Unix.
-
- .. versionchanged:: 3.3
- Add :data:`O_CLOEXEC` constant.
-
-.. data:: O_BINARY
- O_NOINHERIT
- O_SHORT_LIVED
- O_TEMPORARY
- O_RANDOM
- O_SEQUENTIAL
- O_TEXT
-
- These constants are only available on Windows.
-
-
-.. data:: O_ASYNC
- O_DIRECT
- O_DIRECTORY
- O_NOFOLLOW
- O_NOATIME
-
- These constants are GNU extensions and not present if they are not defined by
- the C library.
-
-
-.. data:: RTLD_LAZY
- RTLD_NOW
- RTLD_GLOBAL
- RTLD_LOCAL
- RTLD_NODELETE
- RTLD_NOLOAD
- RTLD_DEEPBIND
-
- See the Unix manual page :manpage:`dlopen(3)`.
-
- .. versionadded:: 3.3
-
-
.. _terminal-size:
Querying the size of a terminal
@@ -3047,7 +3034,7 @@ information, consult your Unix manpages.
.. versionadded:: 3.3
-The following scheduling policies are exposed if they are a supported by the
+The following scheduling policies are exposed if they are supported by the
operating system.
.. data:: SCHED_OTHER
@@ -3156,10 +3143,6 @@ operating system.
Return the set of CPUs the process with PID *pid* (or the current process
if zero) is restricted to.
- .. seealso::
- :func:`multiprocessing.cpu_count` returns the number of CPUs in the
- system.
-
.. _os-path:
@@ -3197,6 +3180,13 @@ Miscellaneous System Information
Availability: Unix.
+.. function:: cpu_count()
+
+ Return the number of CPUs in the system. Returns None if undetermined.
+
+ .. versionadded:: 3.4
+
+
.. function:: getloadavg()
Return the number of processes in the system run queue averaged over the last
@@ -3294,6 +3284,19 @@ Higher-level operations on pathnames are defined in the :mod:`os.path` module.
The file path of the null device. For example: ``'/dev/null'`` for
POSIX, ``'nul'`` for Windows. Also available via :mod:`os.path`.
+.. data:: RTLD_LAZY
+ RTLD_NOW
+ RTLD_GLOBAL
+ RTLD_LOCAL
+ RTLD_NODELETE
+ RTLD_NOLOAD
+ RTLD_DEEPBIND
+
+ Flags for use with the :func:`~sys.setdlopenflags` and
+ :func:`~sys.getdlopenflags` functions. See the Unix manual page
+ :manpage:`dlopen(3)` for what the different flags mean.
+
+ .. versionadded:: 3.3
.. _os-miscfunc:
diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst
index b4080d6..e248d6b 100644
--- a/Doc/library/poplib.rst
+++ b/Doc/library/poplib.rst
@@ -13,8 +13,11 @@
--------------
This module defines a class, :class:`POP3`, which encapsulates a connection to a
-POP3 server and implements the protocol as defined in :rfc:`1725`. The
-:class:`POP3` class supports both the minimal and optional command sets.
+POP3 server and implements the protocol as defined in :rfc:`1939`. The
+:class:`POP3` class supports both the minimal and optional command sets from
+:rfc:`1939`. The :class:`POP3` class also supports the `STLS` command introduced
+in :rfc:`2595` to enable encrypted communication on an already established connection.
+
Additionally, this module provides a class :class:`POP3_SSL`, which provides
support for connecting to POP3 servers that use SSL as an underlying protocol
layer.
@@ -97,6 +100,14 @@ An :class:`POP3` instance has the following methods:
Returns the greeting string sent by the POP3 server.
+.. method:: POP3.capa()
+
+ Query the server's capabilities as specified in :rfc:`2449`.
+ Returns a dictionary in the form ``{'name': ['param'...]}``.
+
+ .. versionadded:: 3.4
+
+
.. method:: POP3.user(username)
Send user command, response should indicate that a password is required.
@@ -176,6 +187,18 @@ An :class:`POP3` instance has the following methods:
the unique id for that message in the form ``'response mesgnum uid``, otherwise
result is list ``(response, ['mesgnum uid', ...], octets)``.
+.. method:: POP3.stls(context=None)
+
+ Start a TLS session on the active connection as specified in :rfc:`2595`.
+ This is only allowed before user authentication
+
+ *context* parameter is a :class:`ssl.SSLContext` object which allows
+ bundling SSL configuration options, certificates and private keys into
+ a single (potentially long-lived) structure.
+
+ .. versionadded:: 3.4
+
+
Instances of :class:`POP3_SSL` have no additional methods. The interface of this
subclass is identical to its parent.
diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst
index 3a86331..8d57c5d 100644
--- a/Doc/library/pprint.rst
+++ b/Doc/library/pprint.rst
@@ -14,8 +14,8 @@ The :mod:`pprint` module provides a capability to "pretty-print" arbitrary
Python data structures in a form which can be used as input to the interpreter.
If the formatted structures include objects which are not fundamental Python
types, the representation may not be loadable. This may be the case if objects
-such as files, sockets, classes, or instances are included, as well as many
-other built-in objects which are not representable as Python constants.
+such as files, sockets or classes are included, as well as many other
+objects which are not representable as Python literals.
The formatted representation keeps objects on a single line if it can, and
breaks them onto multiple lines if they don't fit within the allowed width.
@@ -65,7 +65,7 @@ The :mod:`pprint` module defines one class:
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
-The :class:`PrettyPrinter` class supports several derivative functions:
+The :mod:`pprint` module also provides several shortcut functions:
.. function:: pformat(object, indent=1, width=80, depth=None)
@@ -193,101 +193,141 @@ Example
-------
To demonstrate several uses of the :func:`pprint` function and its parameters,
-let's fetch information about a project from PyPI::
+let's fetch information about a project from `PyPI <https://pypi.python.org>`_::
>>> import json
>>> import pprint
>>> from urllib.request import urlopen
- >>> with urlopen('http://pypi.python.org/pypi/configparser/json') as url:
+ >>> with urlopen('http://pypi.python.org/pypi/Twisted/json') as url:
... http_info = url.info()
... raw_data = url.read().decode(http_info.get_content_charset())
>>> project_info = json.loads(raw_data)
- >>> result = {'headers': http_info.items(), 'body': project_info}
In its basic form, :func:`pprint` shows the whole object::
- >>> pprint.pprint(result)
- {'body': {'info': {'_pypi_hidden': False,
- '_pypi_ordering': 12,
- 'classifiers': ['Development Status :: 4 - Beta',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: MIT License',
- 'Natural Language :: English',
- 'Operating System :: OS Independent',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.6',
- 'Programming Language :: Python :: 2.7',
- 'Topic :: Software Development :: Libraries',
- 'Topic :: Software Development :: Libraries :: Python Modules'],
- 'download_url': 'UNKNOWN',
- 'home_page': 'http://docs.python.org/py3k/library/configparser.html',
- 'keywords': 'configparser ini parsing conf cfg configuration file',
- 'license': 'MIT',
- 'name': 'configparser',
- 'package_url': 'http://pypi.python.org/pypi/configparser',
- 'platform': 'any',
- 'release_url': 'http://pypi.python.org/pypi/configparser/3.2.0r3',
- 'requires_python': None,
- 'stable_version': None,
- 'summary': 'This library brings the updated configparser from Python 3.2+ to Python 2.6-2.7.',
- 'version': '3.2.0r3'},
- 'urls': [{'comment_text': '',
- 'downloads': 47,
- 'filename': 'configparser-3.2.0r3.tar.gz',
- 'has_sig': False,
- 'md5_digest': '8500fd87c61ac0de328fc996fce69b96',
- 'packagetype': 'sdist',
- 'python_version': 'source',
- 'size': 32281,
- 'upload_time': '2011-05-10T16:28:50',
- 'url': 'http://pypi.python.org/packages/source/c/configparser/configparser-3.2.0r3.tar.gz'}]},
- 'headers': [('Date', 'Sat, 14 May 2011 12:48:52 GMT'),
- ('Server', 'Apache/2.2.16 (Debian)'),
- ('Content-Disposition', 'inline'),
- ('Connection', 'close'),
- ('Transfer-Encoding', 'chunked'),
- ('Content-Type', 'application/json; charset="UTF-8"')]}
+ >>> pprint.pprint(project_info)
+ {'info': {'_pypi_hidden': False,
+ '_pypi_ordering': 125,
+ 'author': 'Glyph Lefkowitz',
+ 'author_email': 'glyph@twistedmatrix.com',
+ 'bugtrack_url': '',
+ 'cheesecake_code_kwalitee_id': None,
+ 'cheesecake_documentation_id': None,
+ 'cheesecake_installability_id': None,
+ 'classifiers': ['Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
+ 'Programming Language :: Python :: 2 :: Only'],
+ 'description': 'An extensible framework for Python programming, '
+ 'with special focus\r\n'
+ 'on event-based network programming and '
+ 'multiprotocol integration.',
+ 'docs_url': '',
+ 'download_url': 'UNKNOWN',
+ 'home_page': 'http://twistedmatrix.com/',
+ 'keywords': '',
+ 'license': 'MIT',
+ 'maintainer': '',
+ 'maintainer_email': '',
+ 'name': 'Twisted',
+ 'package_url': 'http://pypi.python.org/pypi/Twisted',
+ 'platform': 'UNKNOWN',
+ 'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
+ 'requires_python': None,
+ 'stable_version': None,
+ 'summary': 'An asynchronous networking framework written in Python',
+ 'version': '12.3.0'},
+ 'urls': [{'comment_text': '',
+ 'downloads': 71844,
+ 'filename': 'Twisted-12.3.0.tar.bz2',
+ 'has_sig': False,
+ 'md5_digest': '6e289825f3bf5591cfd670874cc0862d',
+ 'packagetype': 'sdist',
+ 'python_version': 'source',
+ 'size': 2615733,
+ 'upload_time': '2012-12-26T12:47:03',
+ 'url': 'https://pypi.python.org/packages/source/T/Twisted/Twisted-12.3.0.tar.bz2'},
+ {'comment_text': '',
+ 'downloads': 5224,
+ 'filename': 'Twisted-12.3.0.win32-py2.7.msi',
+ 'has_sig': False,
+ 'md5_digest': '6b778f5201b622a5519a2aca1a2fe512',
+ 'packagetype': 'bdist_msi',
+ 'python_version': '2.7',
+ 'size': 2916352,
+ 'upload_time': '2012-12-26T12:48:15',
+ 'url': 'https://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.3.0.win32-py2.7.msi'}]}
The result can be limited to a certain *depth* (ellipsis is used for deeper
contents)::
- >>> pprint.pprint(result, depth=3)
- {'body': {'info': {'_pypi_hidden': False,
- '_pypi_ordering': 12,
- 'classifiers': [...],
- 'download_url': 'UNKNOWN',
- 'home_page': 'http://docs.python.org/py3k/library/configparser.html',
- 'keywords': 'configparser ini parsing conf cfg configuration file',
- 'license': 'MIT',
- 'name': 'configparser',
- 'package_url': 'http://pypi.python.org/pypi/configparser',
- 'platform': 'any',
- 'release_url': 'http://pypi.python.org/pypi/configparser/3.2.0r3',
- 'requires_python': None,
- 'stable_version': None,
- 'summary': 'This library brings the updated configparser from Python 3.2+ to Python 2.6-2.7.',
- 'version': '3.2.0r3'},
- 'urls': [{...}]},
- 'headers': [('Date', 'Sat, 14 May 2011 12:48:52 GMT'),
- ('Server', 'Apache/2.2.16 (Debian)'),
- ('Content-Disposition', 'inline'),
- ('Connection', 'close'),
- ('Transfer-Encoding', 'chunked'),
- ('Content-Type', 'application/json; charset="UTF-8"')]}
-
-Additionally, maximum *width* can be suggested. If a long object cannot be
-split, the specified width will be exceeded::
-
- >>> pprint.pprint(result['headers'], width=30)
- [('Date',
- 'Sat, 14 May 2011 12:48:52 GMT'),
- ('Server',
- 'Apache/2.2.16 (Debian)'),
- ('Content-Disposition',
- 'inline'),
- ('Connection', 'close'),
- ('Transfer-Encoding',
- 'chunked'),
- ('Content-Type',
- 'application/json; charset="UTF-8"')]
+ >>> pprint.pprint(project_info, depth=2)
+ {'info': {'_pypi_hidden': False,
+ '_pypi_ordering': 125,
+ 'author': 'Glyph Lefkowitz',
+ 'author_email': 'glyph@twistedmatrix.com',
+ 'bugtrack_url': '',
+ 'cheesecake_code_kwalitee_id': None,
+ 'cheesecake_documentation_id': None,
+ 'cheesecake_installability_id': None,
+ 'classifiers': [...],
+ 'description': 'An extensible framework for Python programming, '
+ 'with special focus\r\n'
+ 'on event-based network programming and '
+ 'multiprotocol integration.',
+ 'docs_url': '',
+ 'download_url': 'UNKNOWN',
+ 'home_page': 'http://twistedmatrix.com/',
+ 'keywords': '',
+ 'license': 'MIT',
+ 'maintainer': '',
+ 'maintainer_email': '',
+ 'name': 'Twisted',
+ 'package_url': 'http://pypi.python.org/pypi/Twisted',
+ 'platform': 'UNKNOWN',
+ 'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
+ 'requires_python': None,
+ 'stable_version': None,
+ 'summary': 'An asynchronous networking framework written in Python',
+ 'version': '12.3.0'},
+ 'urls': [{...}, {...}]}
+
+Additionally, maximum character *width* can be suggested. If a long object
+cannot be split, the specified width will be exceeded::
+
+ >>> pprint.pprint(project_info, depth=2, width=50)
+ {'info': {'_pypi_hidden': False,
+ '_pypi_ordering': 125,
+ 'author': 'Glyph Lefkowitz',
+ 'author_email': 'glyph@twistedmatrix.com',
+ 'bugtrack_url': '',
+ 'cheesecake_code_kwalitee_id': None,
+ 'cheesecake_documentation_id': None,
+ 'cheesecake_installability_id': None,
+ 'classifiers': [...],
+ 'description': 'An extensible '
+ 'framework for '
+ 'Python programming, '
+ 'with special '
+ 'focus\r\n'
+ 'on event-based '
+ 'network programming '
+ 'and multiprotocol '
+ 'integration.',
+ 'docs_url': '',
+ 'download_url': 'UNKNOWN',
+ 'home_page': 'http://twistedmatrix.com/',
+ 'keywords': '',
+ 'license': 'MIT',
+ 'maintainer': '',
+ 'maintainer_email': '',
+ 'name': 'Twisted',
+ 'package_url': 'http://pypi.python.org/pypi/Twisted',
+ 'platform': 'UNKNOWN',
+ 'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
+ 'requires_python': None,
+ 'stable_version': None,
+ 'summary': 'An asynchronous '
+ 'networking framework '
+ 'written in Python',
+ 'version': '12.3.0'},
+ 'urls': [{...}, {...}]}
diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst
index 2b9385b..90baec5 100644
--- a/Doc/library/pty.rst
+++ b/Doc/library/pty.rst
@@ -45,6 +45,9 @@ The :mod:`pty` module defines the following functions:
a file descriptor. The defaults try to read 1024 bytes each time they are
called.
+ .. versionchanged:: 3.4
+ :func:`spawn` now returns the status value from :func:`os.waitpid`
+ on the child process.
Example
-------
diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst
index 07ddc25..bae8450 100644
--- a/Doc/library/py_compile.rst
+++ b/Doc/library/py_compile.rst
@@ -28,7 +28,7 @@ byte-code cache files in the directory containing the source code.
.. function:: compile(file, cfile=None, dfile=None, doraise=False, optimize=-1)
- Compile a source file to byte-code and write out the byte-code cache file.
+ Compile a source file to byte-code and write out the byte-code cache file.
The source code is loaded from the file name *file*. The byte-code is
written to *cfile*, which defaults to the :PEP:`3147` path, ending in
``.pyc`` (``.pyo`` if optimization is enabled in the current interpreter).
@@ -41,6 +41,13 @@ byte-code cache files in the directory containing the source code.
is raised. This function returns the path to byte-compiled file, i.e.
whatever *cfile* value was used.
+ If the path that *cfile* becomes (either explicitly specified or computed)
+ is a symlink or non-regular file, :exc:`FileExistsError` will be raised.
+ This is to act as a warning that import will turn those paths into regular
+ files if it is allowed to write byte-compiled files to those paths. This is
+ a side-effect of import using file renaming to place the final byte-compiled
+ file into place to prevent concurrent file writing issues.
+
*optimize* controls the optimization level and is passed to the built-in
:func:`compile` function. The default of ``-1`` selects the optimization
level of the current interpreter.
@@ -50,6 +57,13 @@ byte-code cache files in the directory containing the source code.
default was *file* + ``'c'`` (``'o'`` if optimization was enabled).
Also added the *optimize* parameter.
+ .. versionchanged:: 3.4
+ Changed code to use :mod:`importlib` for the byte-code cache file writing.
+ This means file creation/writing semantics now match what :mod:`importlib`
+ does, e.g. permissions, write-and-move semantics, etc. Also added the
+ caveat that :exc:`FileExistsError` is raised if *cfile* is a symlink or
+ non-regular file.
+
.. function:: main(args=None)
diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst
index 1134619..692310b 100644
--- a/Doc/library/readline.rst
+++ b/Doc/library/readline.rst
@@ -190,28 +190,32 @@ Example
The following example demonstrates how to use the :mod:`readline` module's
history reading and writing functions to automatically load and save a history
-file named :file:`.pyhist` from the user's home directory. The code below would
-normally be executed automatically during interactive sessions from the user's
-:envvar:`PYTHONSTARTUP` file. ::
+file named :file:`.python_history` from the user's home directory. The code
+below would normally be executed automatically during interactive sessions
+from the user's :envvar:`PYTHONSTARTUP` file. ::
+ import atexit
import os
import readline
- histfile = os.path.join(os.path.expanduser("~"), ".pyhist")
+
+ histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
except FileNotFoundError:
pass
- import atexit
+
atexit.register(readline.write_history_file, histfile)
- del os, histfile
+
+This code is actually automatically run when Python is run in
+:ref:`interactive mode <tut-interactive>` (see :ref:`rlcompleter-config`).
The following example extends the :class:`code.InteractiveConsole` class to
support history save/restore. ::
- import code
- import readline
import atexit
+ import code
import os
+ import readline
class HistoryConsole(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>",
diff --git a/Doc/library/rlcompleter.rst b/Doc/library/rlcompleter.rst
index 633088d..9ed01c7 100644
--- a/Doc/library/rlcompleter.rst
+++ b/Doc/library/rlcompleter.rst
@@ -27,18 +27,10 @@ Example::
readline.__name__ readline.parse_and_bind(
>>> readline.
-The :mod:`rlcompleter` module is designed for use with Python's interactive
-mode. A user can add the following lines to his or her initialization file
-(identified by the :envvar:`PYTHONSTARTUP` environment variable) to get
-automatic :kbd:`Tab` completion::
-
- try:
- import readline
- except ImportError:
- print("Module readline not available.")
- else:
- import rlcompleter
- readline.parse_and_bind("tab: complete")
+The :mod:`rlcompleter` module is designed for use with Python's
+:ref:`interactive mode <tut-interactive>`. Unless Python is run with the
+:option:`-S` option, the module is automatically imported and configured
+(see :ref:`rlcompleter-config`).
On platforms without :mod:`readline`, the :class:`Completer` class defined by
this module can still be used for custom purposes.
diff --git a/Doc/library/select.rst b/Doc/library/select.rst
index 4e60f4a..b73f11e 100644
--- a/Doc/library/select.rst
+++ b/Doc/library/select.rst
@@ -47,11 +47,14 @@ The module defines the following:
to :const:`EPOLL_CLOEXEC`, which causes the epoll descriptor to be closed
automatically when :func:`os.execve` is called. See section
:ref:`epoll-objects` below for the methods supported by epolling objects.
-
+ They also support the :keyword:`with` statement.
.. versionchanged:: 3.3
Added the *flags* parameter.
+ .. versionchanged:: 3.4
+ Support for the :keyword:`with` statement was added.
+
.. function:: poll()
diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst
index 9d7d504..b60a548 100644
--- a/Doc/library/shelve.rst
+++ b/Doc/library/shelve.rst
@@ -44,8 +44,11 @@ lots of shared sub-objects. The keys are ordinary strings.
.. note::
Do not rely on the shelf being closed automatically; always call
- :meth:`close` explicitly when you don't need it any more, or use a
- :keyword:`with` statement with :func:`contextlib.closing`.
+ :meth:`~Shelf.close` explicitly when you don't need it any more, or
+ use :func:`shelve.open` as a context manager::
+
+ with shelve.open('spam') as db:
+ db['eggs'] = 'eggs'
.. warning::
@@ -118,10 +121,15 @@ Restrictions
The *keyencoding* parameter is the encoding used to encode keys before they
are used with the underlying dict.
- .. versionadded:: 3.2
- The *keyencoding* parameter; previously, keys were always encoded in
+ :class:`Shelf` objects can also be used as context managers.
+
+ .. versionchanged:: 3.2
+ Added the *keyencoding* parameter; previously, keys were always encoded in
UTF-8.
+ .. versionchanged:: 3.4
+ Added context manager support.
+
.. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8')
diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst
index a1457d0..e4f348c 100644
--- a/Doc/library/shutil.rst
+++ b/Doc/library/shutil.rst
@@ -53,7 +53,7 @@ Directory and files operations
*dst* and return *dst*. *src* and *dst* are path names given as strings.
*dst* must be the complete target file name; look at :func:`shutil.copy`
for a copy that accepts a target directory path. If *src* and *dst*
- specify the same file, :exc:`Error` is raised.
+ specify the same file, :exc:`SameFileError` is raised.
The destination location must be writable; otherwise, an :exc:`OSError`
exception will be raised. If *dst* already exists, it will be replaced.
@@ -69,6 +69,19 @@ Directory and files operations
Added *follow_symlinks* argument.
Now returns *dst*.
+ .. versionchanged:: 3.4
+ Raise :exc:`SameFileError` instead of :exc:`Error`. Since the former is
+ a subclass of the latter, this change is backward compatible.
+
+
+.. exception:: SameFileError
+
+ This exception is raised if source and destination in :func:`copyfile`
+ are the same file.
+
+ .. versionadded:: 3.4
+
+
.. function:: copymode(src, dst, *, follow_symlinks=True)
Copy the permission bits from *src* to *dst*. The file contents, owner, and
@@ -380,11 +393,10 @@ provided by this module. ::
errors.extend(err.args[0])
try:
copystat(src, dst)
- except WindowsError:
- # can't copy file access times on Windows
- pass
except OSError as why:
- errors.extend((src, dst, str(why)))
+ # can't copy file access times on Windows
+ if why.winerror is None:
+ errors.extend((src, dst, str(why)))
if errors:
raise Error(errors)
diff --git a/Doc/library/site.rst b/Doc/library/site.rst
index 36b80c3..2175c3e 100644
--- a/Doc/library/site.rst
+++ b/Doc/library/site.rst
@@ -111,6 +111,23 @@ empty, and the path manipulations are skipped; however the import of
:mod:`sitecustomize` and :mod:`usercustomize` is still attempted.
+.. _rlcompleter-config:
+
+Readline configuration
+----------------------
+
+On systems that support :mod:`readline`, this module will also import and
+configure the :mod:`rlcompleter` module, if Python is started in
+:ref:`interactive mode <tut-interactive>` and without the :option:`-S` option.
+The default behavior is enable tab-completion and to use
+:file:`~/.python_history` as the history save file. To disable it, override
+the :data:`sys.__interactivehook__` attribute in your :mod:`sitecustomize`
+or :mod:`usercustomize` module or your :envvar:`PYTHONSTARTUP` file.
+
+
+Module contents
+---------------
+
.. data:: PREFIXES
A list of prefixes for site-packages directories.
@@ -153,8 +170,7 @@ empty, and the path manipulations are skipped; however the import of
Adds all the standard site-specific directories to the module search
path. This function is called automatically when this module is imported,
- unless the :program:`python` interpreter was started with the :option:`-S`
- flag.
+ unless the Python interpreter was started with the :option:`-S` flag.
.. versionchanged:: 3.3
This function used to be called unconditionnally.
diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst
index 2ca71ff..2c2df8a 100644
--- a/Doc/library/smtpd.rst
+++ b/Doc/library/smtpd.rst
@@ -27,7 +27,8 @@ SMTPServer Objects
------------------
-.. class:: SMTPServer(localaddr, remoteaddr, data_size_limit=33554432)
+.. class:: SMTPServer(localaddr, remoteaddr, data_size_limit=33554432,
+ map=None)
Create a new :class:`SMTPServer` object, which binds to local address
*localaddr*. It will treat *remoteaddr* as an upstream SMTP relayer. It
@@ -38,6 +39,8 @@ SMTPServer Objects
accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
limit.
+ A dictionary can be specified in *map* to avoid using a global socket map.
+
.. method:: process_message(peer, mailfrom, rcpttos, data)
Raise :exc:`NotImplementedError` exception. Override this in subclasses to
@@ -53,6 +56,9 @@ SMTPServer Objects
Override this in subclasses to use a custom :class:`SMTPChannel` for
managing SMTP clients.
+ .. versionchanged:: 3.4
+ The *map* argument was added.
+
DebuggingServer Objects
-----------------------
@@ -90,11 +96,20 @@ MailmanProxy Objects
SMTPChannel Objects
-------------------
-.. class:: SMTPChannel(server, conn, addr)
+.. class:: SMTPChannel(server, conn, addr, data_size_limit=33554432,
+ map=None))
Create a new :class:`SMTPChannel` object which manages the communication
between the server and a single SMTP client.
+ *conn* and *addr* are as per the instance variables described below.
+
+ *data_size_limit* specifies the maximum number of bytes that will be
+ accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
+ limit.
+
+ A dictionary can be specified in *map* to avoid using a global socket map.
+
To use a custom SMTPChannel implementation you need to override the
:attr:`SMTPServer.channel_class` of your :class:`SMTPServer`.
diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst
index addc6be..a7d1538 100644
--- a/Doc/library/smtplib.rst
+++ b/Doc/library/smtplib.rst
@@ -110,8 +110,8 @@ A nice selection of exceptions is defined as well:
.. exception:: SMTPException
- The base exception class for all the other exceptions provided by this
- module.
+ Subclass of :exc:`OSError` that is the base exception class for all
+ the other exceptions provided by this module.
.. exception:: SMTPServerDisconnected
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index b442b7c..edd196a 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -107,8 +107,8 @@ created. Socket addresses are represented as follows:
.. versionadded:: 3.3
-- Certain other address families (:const:`AF_BLUETOOTH`, :const:`AF_PACKET`)
- support specific representations.
+- Certain other address families (:const:`AF_BLUETOOTH`, :const:`AF_PACKET`,
+ :const:`AF_CAN`) support specific representations.
.. XXX document them!
@@ -257,6 +257,16 @@ The module :mod:`socket` exports the following constants and functions:
.. versionadded:: 3.3
+.. data:: CAN_BCM
+ CAN_BCM_*
+
+ CAN_BCM, in the CAN protocol family, is the broadcast manager (BCM) protocol.
+ Broadcast manager constants, documented in the Linux documentation, are also
+ defined in the socket module.
+
+ Availability: Linux >= 2.6.25.
+
+ .. versionadded:: 3.4
.. data:: AF_RDS
PF_RDS
@@ -283,6 +293,11 @@ The module :mod:`socket` exports the following constants and functions:
TIPC related constants, matching the ones exported by the C socket API. See
the TIPC documentation for more information.
+.. data:: AF_LINK
+
+ Availability: BSD, OSX.
+
+ .. versionadded:: 3.4
.. data:: has_ipv6
@@ -452,13 +467,16 @@ The module :mod:`socket` exports the following constants and functions:
:const:`AF_INET6`, :const:`AF_UNIX`, :const:`AF_CAN` or :const:`AF_RDS`. The
socket type should be :const:`SOCK_STREAM` (the default),
:const:`SOCK_DGRAM`, :const:`SOCK_RAW` or perhaps one of the other ``SOCK_``
- constants. The protocol number is usually zero and may be omitted in that
- case or :const:`CAN_RAW` in case the address family is :const:`AF_CAN`.
+ constants. The protocol number is usually zero and may be omitted or in the
+ case where the address family is :const:`AF_CAN` the protocol should be one
+ of :const:`CAN_RAW` or :const:`CAN_BCM`.
.. versionchanged:: 3.3
The AF_CAN family was added.
The AF_RDS family was added.
+ .. versionchanged:: 3.4
+ The CAN_BCM protocol was added.
.. function:: socketpair([family[, type[, proto]]])
@@ -1331,7 +1349,16 @@ the interface::
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
The last example shows how to use the socket interface to communicate to a CAN
-network. This example might require special priviledge::
+network using the raw socket protocol. To use CAN with the broadcast
+manager protocol instead, open a socket with::
+
+ socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
+
+After binding (:const:`CAN_RAW`) or connecting (:const:`CAN_BCM`) the socket, you
+can use the :meth:`socket.send`, and the :meth:`socket.recv` operations (and
+their counterparts) on the socket object as usual.
+
+This example might require special priviledge::
import socket
import struct
diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst
index 08e3a2e..529dc94 100644
--- a/Doc/library/sqlite3.rst
+++ b/Doc/library/sqlite3.rst
@@ -159,7 +159,7 @@ Module functions and constants
first blank for the column name: the column name would simply be "x".
-.. function:: connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements])
+.. function:: connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri])
Opens a connection to the SQLite database file *database*. You can use
``":memory:"`` to open a database connection to a database that resides in RAM
@@ -195,6 +195,18 @@ Module functions and constants
for the connection, you can set the *cached_statements* parameter. The currently
implemented default is to cache 100 statements.
+ If *uri* is true, *database* is interpreted as a URI. This allows you
+ to specify options. For example, to open a database in read-only mode
+ you can use::
+
+ db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)
+
+ More information about this feature, including a list of recognized options, can
+ be found in the `SQLite URI documentation <http://www.sqlite.org/uri.html>`_.
+
+ .. versionchanged:: 3.4
+ Added the *uri* parameter.
+
.. function:: register_converter(typename, callable)
diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
index abb95c3..983c144 100644
--- a/Doc/library/ssl.rst
+++ b/Doc/library/ssl.rst
@@ -26,7 +26,8 @@ probably additional platforms, as long as OpenSSL is installed on that platform.
Some behavior may be platform dependent, since calls are made to the
operating system socket APIs. The installed version of OpenSSL may also
- cause variations in behavior.
+ cause variations in behavior. For example, TLSv1.1 and TLSv1.2 come with
+ openssl version 1.0.1.
This section documents the objects and functions in the ``ssl`` module; for more
general information about TLS, SSL, and certificates, the reader is referred to
@@ -177,14 +178,16 @@ instead.
.. table::
- ======================== ========= ========= ========== =========
- *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
- ------------------------ --------- --------- ---------- ---------
- *SSLv2* yes no yes no
- *SSLv3* no yes yes no
- *SSLv23* yes no yes no
- *TLSv1* no no yes yes
- ======================== ========= ========= ========== =========
+ ======================== ========= ========= ========== ========= =========== ===========
+ *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1** **TLSv1.1** **TLSv1.2**
+ ------------------------ --------- --------- ---------- --------- ----------- -----------
+ *SSLv2* yes no yes no no no
+ *SSLv3* no yes yes no no no
+ *SSLv23* yes no yes no no no
+ *TLSv1* no no yes yes no no
+ *TLSv1.1* no no yes no yes no
+ *TLSv1.2* no no yes no no yes
+ ======================== ========= ========= ========== ========= =========== ===========
.. note::
@@ -340,6 +343,37 @@ Certificate handling
Given a certificate as an ASCII PEM string, returns a DER-encoded sequence of
bytes for that same certificate.
+.. function:: get_default_verify_paths()
+
+ Returns a named tuple with paths to OpenSSL's default cafile and capath.
+ The paths are the same as used by
+ :meth:`SSLContext.set_default_verify_paths`. The return value is a
+ :term:`named tuple` ``DefaultVerifyPaths``:
+
+ * :attr:`cafile` - resolved path to cafile or None if the file doesn't exist,
+ * :attr:`capath` - resolved path to capath or None if the directory doesn't exist,
+ * :attr:`openssl_cafile_env` - OpenSSL's environment key that points to a cafile,
+ * :attr:`openssl_cafile` - hard coded path to a cafile,
+ * :attr:`openssl_capath_env` - OpenSSL's environment key that points to a capath,
+ * :attr:`openssl_capath` - hard coded path to a capath directory
+
+ .. versionadded:: 3.4
+
+.. function:: enum_cert_store(store_name, cert_type='certificate')
+
+ Retrieve certificates from Windows' system cert store. *store_name* may be
+ one of ``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert
+ stores, too. *cert_type* is either ``certificate`` for X.509 certificates
+ or ``crl`` for X.509 certificate revocation lists.
+
+ The function returns a list of (bytes, encoding_type) tuples. The
+ encoding_type flag can be interpreted with :const:`X509_ASN_ENCODING` or
+ :const:`PKCS_7_ASN_ENCODING`.
+
+ Availability: Windows.
+
+ .. versionadded:: 3.4
+
Constants
^^^^^^^^^
@@ -401,9 +435,25 @@ Constants
.. data:: PROTOCOL_TLSv1
- Selects TLS version 1 as the channel encryption protocol. This is the most
+ Selects TLS version 1.0 as the channel encryption protocol.
+
+.. data:: PROTOCOL_TLSv1_1
+
+
+ Selects TLS version 1.1 as the channel encryption protocol.
+ Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+
+.. data:: PROTOCOL_TLSv1_2
+
+
+ Selects TLS version 1.2 as the channel encryption protocol. This is the most
modern version, and probably the best choice for maximum protection, if both
sides can speak it.
+ Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
.. data:: OP_ALL
@@ -437,6 +487,22 @@ Constants
.. versionadded:: 3.2
+.. data:: OP_NO_TLSv1_1
+
+ Prevents a TLSv1.1 connection. This option is only applicable in conjunction
+ with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.1 as
+ the protocol version. Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+
+.. data:: OP_NO_TLSv1_2
+
+ Prevents a TLSv1.2 connection. This option is only applicable in conjunction
+ with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.2 as
+ the protocol version. Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+
.. data:: OP_CIPHER_SERVER_PREFERENCE
Use the server's cipher ordering preference, rather than the client's.
@@ -533,6 +599,28 @@ Constants
.. versionadded:: 3.2
+.. data:: ALERT_DESCRIPTION_HANDSHAKE_FAILURE
+ ALERT_DESCRIPTION_INTERNAL_ERROR
+ ALERT_DESCRIPTION_*
+
+ Alert Descriptions from :rfc:`5246` and others. The `IANA TLS Alert Registry
+ <http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6>`_
+ contains this list and references to the RFCs where their meaning is defined.
+
+ Used as the return value of the callback function in
+ :meth:`SSLContext.set_servername_callback`.
+
+ .. versionadded:: 3.4
+
+.. data:: X509_ASN_ENCODING
+ PKCS_7_ASN_ENCODING
+
+ Encoding flags for :func:`enum_cert_store`.
+
+ Availability: Windows.
+
+ .. versionadded:: 3.4
+
SSL Sockets
-----------
@@ -703,6 +791,19 @@ to speed up repeated connections from the same clients.
:class:`SSLContext` objects have the following methods and attributes:
+.. method:: SSLContext.cert_store_stats()
+
+ Get statistics about quantities of loaded X.509 certificates, count of
+ X.509 certificates flagged as CA certificates and certificate revocation
+ lists as dictionary.
+
+ Example for a context with one CA cert and one other cert::
+
+ >>> context.cert_store_stats()
+ {'crl': 0, 'x509_ca': 1, 'x509': 2}
+
+ .. versionadded:: 3.4
+
.. method:: SSLContext.load_cert_chain(certfile, keyfile=None, password=None)
Load a private key and the corresponding certificate. The *certfile*
@@ -749,6 +850,17 @@ to speed up repeated connections from the same clients.
following an `OpenSSL specific layout
<http://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html>`_.
+.. method:: SSLContext.get_ca_certs(binary_form=False)
+
+ Get a list of loaded "certification authority" (CA) certificates. If the
+ ``binary_form`` parameter is :const:`False` each list
+ entry is a dict like the output of :meth:`SSLSocket.getpeercert`. Otherwise
+ the method returns a list of DER-encoded certificates. The returned list
+ does not contain certificates from *capath* unless a certificate was
+ requested and loaded by a SSL connection.
+
+ .. versionadded:: 3.4
+
.. method:: SSLContext.set_default_verify_paths()
Load a set of default "certification authority" (CA) certificates from
@@ -786,6 +898,56 @@ to speed up repeated connections from the same clients.
.. versionadded:: 3.3
+.. method:: SSLContext.set_servername_callback(server_name_callback)
+
+ Register a callback function that will be called after the TLS Client Hello
+ handshake message has been received by the SSL/TLS server when the TLS client
+ specifies a server name indication. The server name indication mechanism
+ is specified in :rfc:`6066` section 3 - Server Name Indication.
+
+ Only one callback can be set per ``SSLContext``. If *server_name_callback*
+ is ``None`` then the callback is disabled. Calling this function a
+ subsequent time will disable the previously registered callback.
+
+ The callback function, *server_name_callback*, will be called with three
+ arguments; the first being the :class:`ssl.SSLSocket`, the second is a string
+ that represents the server name that the client is intending to communicate
+ (or :const:`None` if the TLS Client Hello does not contain a server name)
+ and the third argument is the original :class:`SSLContext`. The server name
+ argument is the IDNA decoded server name.
+
+ A typical use of this callback is to change the :class:`ssl.SSLSocket`'s
+ :attr:`SSLSocket.context` attribute to a new object of type
+ :class:`SSLContext` representing a certificate chain that matches the server
+ name.
+
+ Due to the early negotiation phase of the TLS connection, only limited
+ methods and attributes are usable like
+ :meth:`SSLSocket.selected_npn_protocol` and :attr:`SSLSocket.context`.
+ :meth:`SSLSocket.getpeercert`, :meth:`SSLSocket.getpeercert`,
+ :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compress` methods require that
+ the TLS connection has progressed beyond the TLS Client Hello and therefore
+ will not contain return meaningful values nor can they be called safely.
+
+ The *server_name_callback* function must return ``None`` to allow the
+ TLS negotiation to continue. If a TLS failure is required, a constant
+ :const:`ALERT_DESCRIPTION_* <ALERT_DESCRIPTION_INTERNAL_ERROR>` can be
+ returned. Other return values will result in a TLS fatal error with
+ :const:`ALERT_DESCRIPTION_INTERNAL_ERROR`.
+
+ If there is a IDNA decoding error on the server name, the TLS connection
+ will terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS
+ alert message to the client.
+
+ If an exception is raised from the *server_name_callback* function the TLS
+ connection will terminate with a fatal TLS alert message
+ :const:`ALERT_DESCRIPTION_HANDSHAKE_FAILURE`.
+
+ This method will raise :exc:`NotImplementedError` if the OpenSSL library
+ had OPENSSL_NO_TLSEXT defined when it was built.
+
+ .. versionadded:: 3.4
+
.. method:: SSLContext.load_dh_params(dhfile)
Load the key generation parameters for Diffie-Helman (DH) key exchange.
@@ -1319,3 +1481,12 @@ use the ``openssl ciphers`` command on your system.
`RFC 4366: Transport Layer Security (TLS) Extensions <http://www.ietf.org/rfc/rfc4366>`_
Blake-Wilson et. al.
+
+ `RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 <http://www.ietf.org/rfc/rfc5246>`_
+ T. Dierks et. al.
+
+ `RFC 6066: Transport Layer Security (TLS) Extensions <http://www.ietf.org/rfc/rfc6066>`_
+ D. Eastlake
+
+ `IANA TLS: Transport Layer Security (TLS) Parameters <http://www.iana.org/assignments/tls-parameters/tls-parameters.xml>`_
+ IANA
diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst
index 02513df..a021fe2 100644
--- a/Doc/library/stat.rst
+++ b/Doc/library/stat.rst
@@ -6,7 +6,8 @@
os.lstat() and os.fstat().
.. sectionauthor:: Skip Montanaro <skip@automatrix.com>
-**Source code:** :source:`Lib/stat.py`
+**Source code:** :source:`Modules/_stat.c`
+ :source:`Lib/stat.py`
--------------
@@ -15,6 +16,9 @@ results of :func:`os.stat`, :func:`os.fstat` and :func:`os.lstat` (if they
exist). For complete details about the :c:func:`stat`, :c:func:`fstat` and
:c:func:`lstat` calls, consult the documentation for your system.
+.. versionchanged:: 3.4
+ The stat module is backed by a C implementation.
+
The :mod:`stat` module defines the following functions to test for specific file
types:
@@ -53,6 +57,24 @@ types:
Return non-zero if the mode is from a socket.
+.. function:: S_ISDOOR(mode)
+
+ Return non-zero if the mode is from a door.
+
+ .. versionadded:: 3.4
+
+.. function:: S_ISPORT(mode)
+
+ Return non-zero if the mode is from an event port.
+
+ .. versionadded:: 3.4
+
+.. function:: S_ISWHT(mode)
+
+ Return non-zero if the mode is from a whiteout.
+
+ .. versionadded:: 3.4
+
Two additional functions are defined for more general manipulation of the file's
mode:
@@ -113,6 +135,10 @@ readable string:
.. versionadded:: 3.3
+ .. versionchanged:: 3.4
+ The function supports :data:`S_IFDOOR`, :data:`S_IFPORT` and
+ :data:`S_IFWHT`.
+
All the variables below are simply symbolic indexes into the 10-tuple returned
by :func:`os.stat`, :func:`os.fstat` or :func:`os.lstat`.
@@ -210,6 +236,29 @@ Use of the functions above is more portable than use of the first set of flags:
FIFO.
+.. data:: S_IFDOOR
+
+ Door.
+
+ .. versionadded:: 3.4
+
+.. data:: S_IFPORT
+
+ Event port.
+
+ .. versionadded:: 3.4
+
+.. data:: S_IFWHT
+
+ Whiteout.
+
+ .. versionadded:: 3.4
+
+.. note::
+
+ :data:`S_IFDOOR`, :data:`S_IFPORT` or :data:`S_IFWHT` are defined as
+ 0 when the platform does not have support for the file types.
+
The following flags can also be used in the *mode* argument of :func:`os.chmod`:
.. data:: S_ISUID
diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst
index 994506c..f2ea361 100644
--- a/Doc/library/struct.rst
+++ b/Doc/library/struct.rst
@@ -66,6 +66,19 @@ The module defines the following exception and functions:
format (``len(buffer[offset:])`` must be at least ``calcsize(fmt)``).
+.. function:: iter_unpack(fmt, buffer)
+
+ Iteratively unpack from the buffer *buffer* according to the format
+ string *fmt*. This function returns an iterator which will read
+ equally-sized chunks from the buffer until all its contents have been
+ consumed. The buffer's size in bytes must be a multiple of the amount
+ of data required by the format, as reflected by :func:`calcsize`.
+
+ Each iteration yields a tuple as specified by the format string.
+
+ .. versionadded:: 3.4
+
+
.. function:: calcsize(fmt)
Return the size of the struct (and hence of the bytes object produced by
@@ -388,6 +401,13 @@ The :mod:`struct` module also defines the following type:
(``len(buffer[offset:])`` must be at least :attr:`self.size`).
+ .. method:: iter_unpack(buffer)
+
+ Identical to the :func:`iter_unpack` function, using the compiled format.
+ (``len(buffer)`` must be a multiple of :attr:`self.size`).
+
+ .. versionadded:: 3.4
+
.. attribute:: format
The format string used to construct this Struct object.
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index 3a30821..dc7d0b3 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -116,7 +116,7 @@ use cases, the underlying :class:`Popen` interface can be used directly.
*timeout* was added.
-.. function:: check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
+.. function:: check_output(args, *, input=None, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
Run command with arguments and return its output.
@@ -129,15 +129,21 @@ use cases, the underlying :class:`Popen` interface can be used directly.
in :ref:`frequently-used-arguments` (hence the use of keyword-only notation
in the abbreviated signature). The full function signature is largely the
same as that of the :class:`Popen` constructor - this functions passes all
- supplied arguments other than *timeout* directly through to that interface.
- In addition, *stdout* is not permitted as an argument, as it is used
- internally to collect the output from the subprocess.
+ supplied arguments other than *input* and *timeout* directly through to
+ that interface. In addition, *stdout* is not permitted as an argument, as
+ it is used internally to collect the output from the subprocess.
The *timeout* argument is passed to :meth:`Popen.wait`. If the timeout
expires, the child process will be killed and then waited for again. The
:exc:`TimeoutExpired` exception will be re-raised after the child process
has terminated.
+ The *input* argument is passed to :meth:`Popen.communicate` and thus to the
+ subprocess's stdin. If used it must be a byte sequence, or a string if
+ ``universal_newlines=True``. When used, the internal :class:`Popen` object
+ is automatically created with ``stdin=PIPE``, and the *stdin* argument may
+ not be used as well.
+
Examples::
>>> subprocess.check_output(["echo", "Hello World!"])
@@ -146,6 +152,10 @@ use cases, the underlying :class:`Popen` interface can be used directly.
>>> subprocess.check_output(["echo", "Hello World!"], universal_newlines=True)
'Hello World!\n'
+ >>> subprocess.check_output(["sed", "-e", "s/foo/bar/"],
+ ... input=b"when in the course of fooman events\n")
+ b'when in the course of barman events\n'
+
>>> subprocess.check_output("exit 1", shell=True)
Traceback (most recent call last):
...
@@ -167,10 +177,6 @@ use cases, the underlying :class:`Popen` interface can be used directly.
... shell=True)
'ls: non_existent_file: No such file or directory\n'
- .. versionadded:: 3.1
-
- ..
-
.. warning::
Invoking the system shell with ``shell=True`` can be a security hazard
@@ -183,9 +189,13 @@ use cases, the underlying :class:`Popen` interface can be used directly.
read in the current process, the child process may block if it
generates enough output to the pipe to fill up the OS pipe buffer.
+ .. versionadded:: 3.1
+
.. versionchanged:: 3.3
*timeout* was added.
+ .. versionchanged:: 3.4
+ *input* was added.
.. data:: DEVNULL
@@ -834,8 +844,6 @@ The :mod:`subprocess` module exposes the following constants.
The new process has a new console, instead of inheriting its parent's
console (the default).
- This flag is always set when :class:`Popen` is created with ``shell=True``.
-
.. data:: CREATE_NEW_PROCESS_GROUP
A :class:`Popen` ``creationflags`` parameter to specify that a new process
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index bc1d9fe..341764a 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -380,6 +380,21 @@ always available.
.. versionadded:: 3.1
+.. function:: getallocatedblocks()
+
+ Return the number of memory blocks currently allocated by the interpreter,
+ regardless of their size. This function is mainly useful for tracking
+ and debugging memory leaks. Because of the interpreter's internal
+ caches, the result can vary from call to call; you may have to call
+ :func:`_clear_type_cache()` and :func:`gc.collect()` to get more
+ predictable results.
+
+ If a Python build or implementation cannot reasonably compute this
+ information, :func:`getallocatedblocks()` is allowed to return 0 instead.
+
+ .. versionadded:: 3.4
+
+
.. function:: getcheckinterval()
Return the interpreter's "check interval"; see :func:`setcheckinterval`.
@@ -396,9 +411,10 @@ always available.
.. function:: getdlopenflags()
- Return the current value of the flags that are used for :c:func:`dlopen` calls.
- The flag constants are defined in the :mod:`ctypes` and :mod:`DLFCN` modules.
- Availability: Unix.
+ Return the current value of the flags that are used for
+ :c:func:`dlopen` calls. Symbolic names for the flag values can be
+ found in the :mod:`os` module (``RTLD_xxx`` constants, e.g.
+ :data:`os.RTLD_LAZY`). Availability: Unix.
.. function:: getfilesystemencoding()
@@ -664,6 +680,16 @@ always available.
.. versionadded:: 3.1
+.. data:: __interactivehook__
+
+ When present, this function is automatically called (with no arguments)
+ when the interpreter is launched in :ref:`interactive mode <tut-interactive>`.
+ This is done after the :envvar:`PYTHONSTARTUP` file is read, so that you
+ can set this hook there.
+
+ .. versionadded:: 3.4
+
+
.. function:: intern(string)
Enter *string* in the table of "interned" strings and return the interned string
@@ -811,8 +837,6 @@ always available.
Windows ``'win32'``
Windows/Cygwin ``'cygwin'``
Mac OS X ``'darwin'``
- OS/2 ``'os2'``
- OS/2 EMX ``'os2emx'``
================ ===========================
.. versionchanged:: 3.3
@@ -883,7 +907,7 @@ always available.
the interpreter loads extension modules. Among other things, this will enable a
lazy resolving of symbols when importing a module, if called as
``sys.setdlopenflags(0)``. To share symbols across extension modules, call as
- ``sys.setdlopenflags(os.RTLD_GLOBAL)``. Symbolic names for the flag modules
+ ``sys.setdlopenflags(os.RTLD_GLOBAL)``. Symbolic names for the flag values
can be found in the :mod:`os` module (``RTLD_xxx`` constants, e.g.
:data:`os.RTLD_LAZY`).
@@ -1093,7 +1117,6 @@ always available.
| :const:`name` | Name of the thread implementation: |
| | |
| | * ``'nt'``: Windows threads |
- | | * ``'os2'``: OS/2 threads |
| | * ``'pthread'``: POSIX threads |
| | * ``'solaris'``: Solaris threads |
+------------------+---------------------------------------------------------+
diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst
index c47dcce..535ac54 100644
--- a/Doc/library/sysconfig.rst
+++ b/Doc/library/sysconfig.rst
@@ -83,8 +83,6 @@ Python currently supports seven schemes:
located under the user home directory.
- *nt*: scheme for NT platforms like Windows.
- *nt_user*: scheme for NT platforms, when the *user* option is used.
-- *os2*: scheme for OS/2 platforms.
-- *os2_home*: scheme for OS/2 patforms, when the *user* option is used.
Each scheme is itself composed of a series of paths and each path has a unique
identifier. Python currently uses eight paths:
diff --git a/Doc/library/textwrap.rst b/Doc/library/textwrap.rst
index c625254..6ac1e77 100644
--- a/Doc/library/textwrap.rst
+++ b/Doc/library/textwrap.rst
@@ -10,11 +10,11 @@
--------------
-The :mod:`textwrap` module provides two convenience functions, :func:`wrap` and
-:func:`fill`, as well as :class:`TextWrapper`, the class that does all the work,
-and two utility functions, :func:`dedent` and :func:`indent`. If you're just wrapping or filling one
-or two text strings, the convenience functions should be good enough;
-otherwise, you should use an instance of :class:`TextWrapper` for efficiency.
+The :mod:`textwrap` module provides some convenience functions,
+as well as :class:`TextWrapper`, the class that does all the work.
+If you're just wrapping or filling one or two text strings, the convenience
+functions should be good enough; otherwise, you should use an instance of
+:class:`TextWrapper` for efficiency.
.. function:: wrap(text, width=70, **kwargs)
@@ -39,19 +39,24 @@ otherwise, you should use an instance of :class:`TextWrapper` for efficiency.
In particular, :func:`fill` accepts exactly the same keyword arguments as
:func:`wrap`.
-Both :func:`wrap` and :func:`fill` work by creating a :class:`TextWrapper`
-instance and calling a single method on it. That instance is not reused, so for
-applications that wrap/fill many text strings, it will be more efficient for you
-to create your own :class:`TextWrapper` object.
-Text is preferably wrapped on whitespaces and right after the hyphens in
-hyphenated words; only then will long words be broken if necessary, unless
-:attr:`TextWrapper.break_long_words` is set to false.
+.. function:: shorten(text, width=70, *, placeholder=" [...]")
+
+ Collapse and truncate the given text to fit in the given width.
+
+ The text first has its whitespace collapsed. If it then fits in
+ the *width*, it is returned unchanged. Otherwise, as many words
+ as possible are joined and then the *placeholder* is appended::
+
+ >>> textwrap.shorten("Hello world!", width=12)
+ 'Hello world!'
+ >>> textwrap.shorten("Hello world!", width=11)
+ 'Hello [...]'
+ >>> textwrap.shorten("Hello world", width=10, placeholder="...")
+ 'Hello...'
+
+ .. versionadded:: 3.4
-Two additional utility function, :func:`dedent` and :func:`indent`, are
-provided to remove indentation from strings that have unwanted whitespace
-to the left of the text and to add an arbitrary prefix to selected lines
-in a block of text.
.. function:: dedent(text)
@@ -102,6 +107,16 @@ in a block of text.
+ world
+:func:`wrap`, :func:`fill` and :func:`shorten` work by creating a
+:class:`TextWrapper` instance and calling a single method on it. That
+instance is not reused, so for applications that process many text
+strings, it may be more efficient to create your own
+:class:`TextWrapper` object.
+
+Text is preferably wrapped on whitespaces and right after the hyphens in
+hyphenated words; only then will long words be broken if necessary, unless
+:attr:`TextWrapper.break_long_words` is set to false.
+
.. class:: TextWrapper(**kwargs)
The :class:`TextWrapper` constructor accepts a number of optional keyword
@@ -235,7 +250,7 @@ in a block of text.
was to always allow breaking hyphenated words.
- :class:`TextWrapper` also provides two public methods, analogous to the
+ :class:`TextWrapper` also provides some public methods, analogous to the
module-level convenience functions:
.. method:: wrap(text)
@@ -252,3 +267,14 @@ in a block of text.
Wraps the single paragraph in *text*, and returns a single string
containing the wrapped paragraph.
+
+ .. function:: shorten(text, *, placeholder=" [...]")
+
+ Collapse and truncate the given text to fit in :attr:`width`
+ characters.
+
+ The text first has its whitespace collapsed. If it then fits in
+ :attr:`width`, it is returned as-is. Otherwise, as many words
+ as possible are joined and then the *placeholder* is appended.
+
+ .. versionadded:: 3.4
diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst
index a487917..0cc1586 100644
--- a/Doc/library/timeit.rst
+++ b/Doc/library/timeit.rst
@@ -151,7 +151,7 @@ The module defines three convenience functions and a public class:
t = Timer(...) # outside the try/except
try:
t.timeit(...) # or t.repeat(...)
- except:
+ except Exception:
t.print_exc()
The advantage over the standard traceback is that source lines in the
diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst
index 83a5375..377694f 100644
--- a/Doc/library/tkinter.rst
+++ b/Doc/library/tkinter.rst
@@ -750,32 +750,6 @@ Entry widget indexes (index, view index, etc.)
displayed. You can use these :mod:`tkinter` functions to access these special
points in text widgets:
-.. function:: AtEnd()
- refers to the last position in the text
-
- .. deprecated:: 3.3
-
-.. function:: AtInsert()
- refers to the point where the text cursor is
-
- .. deprecated:: 3.3
-
-.. function:: AtSelFirst()
- indicates the beginning point of the selected text
-
- .. deprecated:: 3.3
-
-.. function:: AtSelLast()
- denotes the last point of the selected text and finally
-
- .. deprecated:: 3.3
-
-.. function:: At(x[, y])
- refers to the character at pixel location *x*, *y* (with *y* not used in the
- case of a text entry widget, which contains a single line of text).
-
- .. deprecated:: 3.3
-
Text widget indexes
The index notation for Text widgets is very rich and is best described in the Tk
man pages.
diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst
index 32e5733..0533bea 100644
--- a/Doc/library/traceback.rst
+++ b/Doc/library/traceback.rst
@@ -146,7 +146,7 @@ module. ::
source = input(">>> ")
try:
exec(source, envdir)
- except:
+ except Exception:
print("Exception in user code:")
print("-"*60)
traceback.print_exc(file=sys.stdout)
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index 695480f..c4f57e4 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -107,9 +107,35 @@ Standard names are defined for the following types:
C".)
-.. data:: ModuleType
+.. class:: ModuleType(name, doc=None)
- The type of modules.
+ The type of :term:`modules <module>`. Constructor takes the name of the
+ module to be created and optionally its :term:`docstring`.
+
+ .. attribute:: __doc__
+
+ The :term:`docstring` of the module. Defaults to ``None``.
+
+ .. attribute:: __loader__
+
+ The :term:`loader` which loaded the module. Defaults to ``None``.
+
+ .. versionchanged:: 3.4
+ Defaults to ``None``. Previously the attribute was optional.
+
+ .. attribute:: __name__
+
+ The name of the module.
+
+ .. attribute:: __package__
+
+ Which :term:`package` a module belongs to. If the module is top-level
+ (i.e. not a part of any specific package) then the attribute should be set
+ to ``''``, else it should be set to the name of the package (which can be
+ :attr:`__name__` if the module is a package itself). Defaults to ``None``.
+
+ .. versionchanged:: 3.4
+ Defaults to ``None``. Previously the attribute was optional.
.. data:: TracebackType
@@ -212,6 +238,8 @@ Standard names are defined for the following types:
keys = sorted(self.__dict__)
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
return "{}({})".format(type(self).__name__, ", ".join(items))
+ def __eq__(self, other):
+ return self.__dict__ == other.__dict__
``SimpleNamespace`` may be useful as a replacement for ``class NS: pass``.
However, for a structured record type use :func:`~collections.namedtuple`
diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst
index ad70dd9..26eced6 100644
--- a/Doc/library/unicodedata.rst
+++ b/Doc/library/unicodedata.rst
@@ -15,8 +15,8 @@
This module provides access to the Unicode Character Database (UCD) which
defines character properties for all Unicode characters. The data contained in
-this database is compiled from the `UCD version 6.1.0
-<http://www.unicode.org/Public/6.1.0/ucd>`_.
+this database is compiled from the `UCD version 6.2.0
+<http://www.unicode.org/Public/6.2.0/ucd>`_.
The module uses the same names and symbols as defined by Unicode
Standard Annex #44, `"Unicode Character Database"
@@ -166,6 +166,6 @@ Examples:
.. rubric:: Footnotes
-.. [#] http://www.unicode.org/Public/6.1.0/ucd/NameAliases.txt
+.. [#] http://www.unicode.org/Public/6.2.0/ucd/NameAliases.txt
-.. [#] http://www.unicode.org/Public/6.1.0/ucd/NamedSequences.txt
+.. [#] http://www.unicode.org/Public/6.2.0/ucd/NamedSequences.txt
diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst
index d7d697d..444c208 100644
--- a/Doc/library/unittest.mock-examples.rst
+++ b/Doc/library/unittest.mock-examples.rst
@@ -277,6 +277,20 @@ instantiate the class in those tests.
...
AttributeError: object has no attribute 'old_method'
+Using a specification also enables a smarter matching of calls made to the
+mock, regardless of whether some parameters were passed as positional or
+named arguments::
+
+ >>> def f(a, b, c): pass
+ ...
+ >>> mock = Mock(spec=f)
+ >>> mock(1, 2, 3)
+ <Mock name='mock()' id='140161580456576'>
+ >>> mock.assert_called_with(a=1, b=2, c=3)
+
+If you want this smarter matching to also work with method calls on the mock,
+you can use :ref:`auto-speccing <auto-speccing>`.
+
If you want a stronger form of specification that prevents the setting
of arbitrary attributes as well as the getting of them then you can use
`spec_set` instead of `spec`.
diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst
index 6f3f693..4a7d647 100644
--- a/Doc/library/unittest.mock.rst
+++ b/Doc/library/unittest.mock.rst
@@ -264,7 +264,6 @@ the `new_callable` argument to `patch`.
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_with(1, 2, 3, test='wow')
-
.. method:: assert_called_once_with(*args, **kwargs)
Assert that the mock was called exactly once and with the specified
@@ -685,6 +684,27 @@ have to create a dictionary and unpack it using `**`:
...
KeyError
+A callable mock which was created with a *spec* (or a *spec_set*) will
+introspect the specification object's signature when matching calls to
+the mock. Therefore, it can match the actual call's arguments regardless
+of whether they were passed positionally or by name::
+
+ >>> def f(a, b, c): pass
+ ...
+ >>> mock = Mock(spec=f)
+ >>> mock(1, 2, c=3)
+ <Mock name='mock()' id='140161580456576'>
+ >>> mock.assert_called_with(1, 2, 3)
+ >>> mock.assert_called_with(a=1, b=2, c=3)
+
+This applies to :meth:`~Mock.assert_called_with`,
+:meth:`~Mock.assert_called_once_with`, :meth:`~Mock.assert_has_calls` and
+:meth:`~Mock.assert_any_call`. When :ref:`auto-speccing`, it will also
+apply to method calls on the mock object.
+
+ .. versionchanged:: 3.4
+ Added signature introspection on specced and autospecced mock objects.
+
.. class:: PropertyMock(*args, **kwargs)
@@ -1969,8 +1989,12 @@ mock_open
default) then a `MagicMock` will be created for you, with the API limited
to methods or attributes available on standard file handles.
- `read_data` is a string for the `read` method of the file handle to return.
- This is an empty string by default.
+ `read_data` is a string for the `read`, `readline`, and `readlines` methods
+ of the file handle to return. Calls to those methods will take data from
+ `read_data` until it is depleted. The mock of these methods is pretty
+ simplistic. If you need more control over the data that you are feeding to
+ the tested code you will need to customize this mock for yourself.
+ `read_data` is an empty string by default.
Using `open` as a context manager is a great way to ensure your file handles
are closed properly and is becoming common::
diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst
index 0c00a26..66e427a 100644
--- a/Doc/library/unittest.rst
+++ b/Doc/library/unittest.rst
@@ -563,6 +563,68 @@ Skipped tests will not have :meth:`setUp` or :meth:`tearDown` run around them.
Skipped classes will not have :meth:`setUpClass` or :meth:`tearDownClass` run.
+.. _subtests:
+
+Distinguishing test iterations using subtests
+---------------------------------------------
+
+.. versionadded:: 3.4
+
+When some of your tests differ only by a some very small differences, for
+instance some parameters, unittest allows you to distinguish them inside
+the body of a test method using the :meth:`~TestCase.subTest` context manager.
+
+For example, the following test::
+
+ class NumbersTest(unittest.TestCase):
+
+ def test_even(self):
+ """
+ Test that numbers between 0 and 5 are all even.
+ """
+ for i in range(0, 6):
+ with self.subTest(i=i):
+ self.assertEqual(i % 2, 0)
+
+will produce the following output::
+
+ ======================================================================
+ FAIL: test_even (__main__.NumbersTest) (i=1)
+ ----------------------------------------------------------------------
+ Traceback (most recent call last):
+ File "subtests.py", line 32, in test_even
+ self.assertEqual(i % 2, 0)
+ AssertionError: 1 != 0
+
+ ======================================================================
+ FAIL: test_even (__main__.NumbersTest) (i=3)
+ ----------------------------------------------------------------------
+ Traceback (most recent call last):
+ File "subtests.py", line 32, in test_even
+ self.assertEqual(i % 2, 0)
+ AssertionError: 1 != 0
+
+ ======================================================================
+ FAIL: test_even (__main__.NumbersTest) (i=5)
+ ----------------------------------------------------------------------
+ Traceback (most recent call last):
+ File "subtests.py", line 32, in test_even
+ self.assertEqual(i % 2, 0)
+ AssertionError: 1 != 0
+
+Without using a subtest, execution would stop after the first failure,
+and the error would be less easy to diagnose because the value of ``i``
+wouldn't be displayed::
+
+ ======================================================================
+ FAIL: test_even (__main__.NumbersTest)
+ ----------------------------------------------------------------------
+ Traceback (most recent call last):
+ File "subtests.py", line 32, in test_even
+ self.assertEqual(i % 2, 0)
+ AssertionError: 1 != 0
+
+
.. _unittest-contents:
Classes and functions
@@ -676,6 +738,21 @@ Test cases
.. versionadded:: 3.1
+ .. method:: subTest(msg=None, **params)
+
+ Return a context manager which executes the enclosed code block as a
+ subtest. *msg* and *params* are optional, arbitrary values which are
+ displayed whenever a subtest fails, allowing you to identify them
+ clearly.
+
+ A test case can contain any number of subtest declarations, and
+ they can be arbitrarily nested.
+
+ See :ref:`subtests` for more information.
+
+ .. versionadded:: 3.4
+
+
.. method:: debug()
Run the test without collecting the result. This allows exceptions raised
@@ -1500,7 +1577,9 @@ Loading and running tests
directory must be specified separately.
If importing a module fails, for example due to a syntax error, then this
- will be recorded as a single error and discovery will continue.
+ will be recorded as a single error and discovery will continue. If the
+ import failure is due to :exc:`SkipTest` being raised, it will be recorded
+ as a skip instead of an error.
If a test package name (directory with :file:`__init__.py`) matches the
pattern then the package will be checked for a ``load_tests``
@@ -1519,6 +1598,15 @@ Loading and running tests
.. versionadded:: 3.2
+ .. versionchanged:: 3.4
+ Modules that raise :exc:`SkipTest` on import are recorded as skips,
+ not errors.
+
+ .. versionchanged:: 3.4
+ Paths are sorted before being imported to ensure execution order for a
+ given test suite is the same even if the underlying file system's ordering
+ is not dependent on file name like in ext3/4.
+
The following attributes of a :class:`TestLoader` can be configured either by
subclassing or assignment on an instance:
@@ -1729,6 +1817,22 @@ Loading and running tests
:attr:`unexpectedSuccesses` attribute.
+ .. method:: addSubTest(test, subtest, outcome)
+
+ Called when a subtest finishes. *test* is the test case
+ corresponding to the test method. *subtest* is a custom
+ :class:`TestCase` instance describing the subtest.
+
+ If *outcome* is :const:`None`, the subtest succeeded. Otherwise,
+ it failed with an exception where *outcome* is a tuple of the form
+ returned by :func:`sys.exc_info`: ``(type, value, traceback)``.
+
+ The default implementation does nothing when the outcome is a
+ success, and records subtest failures as normal failures.
+
+ .. versionadded:: 3.4
+
+
.. class:: TextTestResult(stream, descriptions, verbosity)
A concrete implementation of :class:`TestResult` used by the
@@ -1838,6 +1942,10 @@ Loading and running tests
The *verbosity*, *failfast*, *catchbreak*, *buffer*
and *warnings* parameters were added.
+ .. versionchanged:: 3.4
+ The *defaultTest* parameter was changed to also accept an iterable of
+ test names.
+
load_tests Protocol
###################
diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst
index 9c3fe91..7bd04b1 100644
--- a/Doc/library/urllib.error.rst
+++ b/Doc/library/urllib.error.rst
@@ -45,6 +45,13 @@ The following exceptions are raised by :mod:`urllib.error` as appropriate:
This is usually a string explaining the reason for this error.
+ .. attribute:: headers
+
+ The HTTP response headers for the HTTP request that cause the
+ :exc:`HTTPError`.
+
+ .. versionadded:: 3.4
+
.. exception:: ContentTooShortError(msg, content)
This exception is raised when the :func:`urlretrieve` function detects that
diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
index 9f3e12e..91673f4 100644
--- a/Doc/library/urllib.request.rst
+++ b/Doc/library/urllib.request.rst
@@ -356,6 +356,11 @@ The following classes are provided:
Open local files.
+.. class:: DataHandler()
+
+ Open data URLs.
+
+ .. versionadded:: 3.4
.. class:: FTPHandler()
@@ -391,6 +396,12 @@ request.
The original URL passed to the constructor.
+ .. versionchanged:: 3.4
+
+ Request.full_url is a property with setter, getter and a deleter. Getting
+ :attr:`~Request.full_url` returns the original request URL with the
+ fragment, if it was present.
+
.. attribute:: Request.type
The URI scheme.
@@ -413,6 +424,10 @@ request.
The entity body for the request, or None if not specified.
+ .. versionchanged:: 3.4
+ Changing value of :attr:`Request.data` now deletes "Content-Length"
+ header if it was previously set or calculated.
+
.. attribute:: Request.unverifiable
boolean, indicates whether the request is unverifiable as defined
@@ -461,65 +476,29 @@ request.
unredirected).
-.. method:: Request.get_full_url()
-
- Return the URL given in the constructor.
-
-
-.. method:: Request.set_proxy(host, type)
-
- Prepare the request by connecting to a proxy server. The *host* and *type* will
- replace those of the instance, and the instance's selector will be the original
- URL given in the constructor.
-
-
-.. method:: Request.add_data(data)
-
- Set the :class:`Request` data to *data*. This is ignored by all handlers except
- HTTP handlers --- and there it should be a byte string, and will change the
- request to be ``POST`` rather than ``GET``. Deprecated in 3.3, use
- :attr:`Request.data`.
-
- .. deprecated-removed:: 3.3 3.4
-
-
-.. method:: Request.has_data()
-
- Return whether the instance has a non-\ ``None`` data. Deprecated in 3.3,
- use :attr:`Request.data`.
-
- .. deprecated-removed:: 3.3 3.4
-
-
-.. method:: Request.get_data()
-
- Return the instance's data. Deprecated in 3.3, use :attr:`Request.data`.
+.. method:: Request.remove_header(header)
- .. deprecated-removed:: 3.3 3.4
+ Remove named header from the request instance (both from regular and
+ unredirected headers).
+ .. versionadded:: 3.4
-.. method:: Request.get_type()
-
- Return the type of the URL --- also known as the scheme. Deprecated in 3.3,
- use :attr:`Request.type`.
-
- .. deprecated-removed:: 3.3 3.4
+.. method:: Request.get_full_url()
-.. method:: Request.get_host()
+ Return the URL given in the constructor.
- Return the host to which a connection will be made. Deprecated in 3.3, use
- :attr:`Request.host`.
+ .. versionchanged:: 3.4
- .. deprecated-removed:: 3.3 3.4
+ Returns :attr:`Request.full_url`
-.. method:: Request.get_selector()
+.. method:: Request.set_proxy(host, type)
- Return the selector --- the part of the URL that is sent to the server.
- Deprecated in 3.3, use :attr:`Request.selector`.
+ Prepare the request by connecting to a proxy server. The *host* and *type* will
+ replace those of the instance, and the instance's selector will be the original
+ URL given in the constructor.
- .. deprecated-removed:: 3.3 3.4
.. method:: Request.get_header(header_name, default=None)
@@ -531,26 +510,10 @@ request.
Return a list of tuples (header_name, header_value) of the Request headers.
-
-.. method:: Request.set_proxy(host, type)
-
-.. method:: Request.get_origin_req_host()
-
- Return the request-host of the origin transaction, as defined by
- :rfc:`2965`. See the documentation for the :class:`Request` constructor.
- Deprecated in 3.3, use :attr:`Request.origin_req_host`.
-
- .. deprecated-removed:: 3.3 3.4
-
-
-.. method:: Request.is_unverifiable()
-
- Return whether the request is unverifiable, as defined by RFC 2965. See the
- documentation for the :class:`Request` constructor. Deprecated in 3.3, use
- :attr:`Request.unverifiable`.
-
- .. deprecated-removed:: 3.3 3.4
-
+.. versionchanged:: 3.4
+ Request methods add_data, has_data, get_data, get_type, get_host,
+ get_selector, get_origin_req_host and is_unverifiable deprecated since 3.3
+ have been removed.
.. _opener-director-objects:
@@ -982,6 +945,21 @@ FileHandler Objects
hostname is given, an :exc:`URLError` is raised.
+.. _data-handler-objects:
+
+DataHandler Objects
+-------------------
+
+.. method:: DataHandler.data_open(req)
+
+ Read a data URL. This kind of URL contains the content encoded in the URL
+ itself. The data URL syntax is specified in :rfc:`2397`. This implementation
+ ignores white spaces in base64 encoded data URLs so the URL may be wrapped
+ in whatever source file it comes from. But even though some browsers don't
+ mind about a missing padding at the end of a base64 encoded data URL, this
+ implementation will raise an :exc:`ValueError` in that case.
+
+
.. _ftp-handler-objects:
FTPHandler Objects
@@ -1397,7 +1375,9 @@ some point in the future.
pair: FTP; protocol
* Currently, only the following protocols are supported: HTTP (versions 0.9 and
- 1.0), FTP, and local files.
+ 1.0), FTP, local files, and data URLs.
+
+ .. versionchanged:: 3.4 Added support for data URLs.
* The caching feature of :func:`urlretrieve` has been disabled until someone
finds the time to hack proper processing of Expiration time headers.
diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst
index 80c75c2..74effae 100644
--- a/Doc/library/venv.rst
+++ b/Doc/library/venv.rst
@@ -79,8 +79,8 @@ creation according to their needs, the :class:`EnvBuilder` class.
* ``system_site_packages`` -- a Boolean value indicating that the system Python
site-packages should be available to the environment (defaults to ``False``).
- * ``clear`` -- a Boolean value which, if True, will delete any existing target
- directory instead of raising an exception (defaults to ``False``).
+ * ``clear`` -- a Boolean value which, if True, will delete the contents of
+ any existing target directory, before creating the environment.
* ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the
Python binary (and any necessary DLLs or other binaries,
@@ -92,7 +92,6 @@ creation according to their needs, the :class:`EnvBuilder` class.
upgraded in-place (defaults to ``False``).
-
Creators of third-party virtual environment tools will be free to use the
provided ``EnvBuilder`` class as a base class.
diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst
index afafb45..9d12455 100644
--- a/Doc/library/wave.rst
+++ b/Doc/library/wave.rst
@@ -19,26 +19,30 @@ The :mod:`wave` module defines the following function and exception:
.. function:: open(file, mode=None)
If *file* is a string, open the file by that name, otherwise treat it as a
- seekable file-like object. *mode* can be any of
+ seekable file-like object. *mode* can be:
- ``'r'``, ``'rb'``
+ ``'rb'``
Read only mode.
- ``'w'``, ``'wb'``
+ ``'wb'``
Write only mode.
Note that it does not allow read/write WAV files.
- A *mode* of ``'r'`` or ``'rb'`` returns a :class:`Wave_read` object, while a
- *mode* of ``'w'`` or ``'wb'`` returns a :class:`Wave_write` object. If
- *mode* is omitted and a file-like object is passed as *file*, ``file.mode``
- is used as the default value for *mode* (the ``'b'`` flag is still added if
- necessary).
+ A *mode* of ``'rb'`` returns a :class:`Wave_read` object, while a *mode* of
+ ``'wb'`` returns a :class:`Wave_write` object. If *mode* is omitted and a
+ file-like object is passed as *file*, ``file.mode`` is used as the default
+ value for *mode*.
If you pass in a file-like object, the wave object will not close it when its
:meth:`close` method is called; it is the caller's responsibility to close
the file object.
+ The :func:`.open` function may be used in a :keyword:`with` statement. When
+ the :keyword:`with` block completes, the :meth:`Wave_read.close()
+ <wave.Wave_read.close>` or :meth:`Wave_write.close()
+ <wave.Wave_write.close()>` method is called.
+
.. function:: openfp(file, mode)
@@ -98,8 +102,9 @@ Wave_read objects, as returned by :func:`.open`, have the following methods:
.. method:: Wave_read.getparams()
- Returns a tuple ``(nchannels, sampwidth, framerate, nframes, comptype,
- compname)``, equivalent to output of the :meth:`get\*` methods.
+ Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth,
+ framerate, nframes, comptype, compname)``, equivalent to output of the
+ :meth:`get\*` methods.
.. method:: Wave_read.readframes(n)
diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst
index 224f442..818a6fa 100644
--- a/Doc/library/weakref.rst
+++ b/Doc/library/weakref.rst
@@ -51,10 +51,15 @@ garbage collection. :class:`WeakSet` implements the :class:`set` interface,
but keeps weak references to its elements, just like a
:class:`WeakKeyDictionary` does.
-Most programs should find that using one of these weak container types is all
-they need -- it's not usually necessary to create your own weak references
-directly. The low-level machinery used by the weak dictionary implementations
-is exposed by the :mod:`weakref` module for the benefit of advanced uses.
+:class:`finalize` provides a straight forward way to register a
+cleanup function to be called when an object is garbage collected.
+This is simpler to use than setting up a callback function on a raw
+weak reference.
+
+Most programs should find that using one of these weak container types
+or :class:`finalize` is all they need -- it's not usually necessary to
+create your own weak references directly. The low-level machinery is
+exposed by the :mod:`weakref` module for the benefit of advanced uses.
Not all objects can be weakly referenced; those objects which can include class
instances, functions written in Python (but not in C), instance methods, sets,
@@ -111,6 +116,24 @@ Extension types can easily be made to support weak references; see
This is a subclassable type rather than a factory function.
+ .. attribute:: __callback__
+
+ This read-only attribute returns the callback currently associated to the
+ weakref. If there is no callback or if the referent of the weakref is
+ no longer alive then this attribute will have value ``None``.
+
+ .. note::
+
+ Like :meth:`__del__` methods, weak reference callbacks can be
+ called during interpreter shutdown when module globals have been
+ overwritten with :const:`None`. This can make writing robust
+ weak reference callbacks a challenge. Callbacks registered
+ using :class:`finalize` do not have to worry about this issue
+ because they will not be run after module teardown has begun.
+
+ .. versionchanged:: 3.4
+ Added the :attr:`__callback__` attribute.
+
.. function:: proxy(object[, callback])
@@ -192,6 +215,95 @@ These method have the same issues as the and :meth:`keyrefs` method of
discarded when no strong reference to it exists any more.
+.. class:: WeakMethod(method)
+
+ A custom :class:`ref` subclass which simulates a weak reference to a bound
+ method (i.e., a method defined on a class and looked up on an instance).
+ Since a bound method is ephemeral, a standard weak reference cannot keep
+ hold of it. :class:`WeakMethod` has special code to recreate the bound
+ method until either the object or the original function dies::
+
+ >>> class C:
+ ... def method(self):
+ ... print("method called!")
+ ...
+ >>> c = C()
+ >>> r = weakref.ref(c.method)
+ >>> r()
+ >>> r = weakref.WeakMethod(c.method)
+ >>> r()
+ <bound method C.method of <__main__.C object at 0x7fc859830220>>
+ >>> r()()
+ method called!
+ >>> del c
+ >>> gc.collect()
+ 0
+ >>> r()
+ >>>
+
+ .. versionadded:: 3.4
+
+.. class:: finalize(obj, func, *args, **kwargs)
+
+ Return a callable finalizer object which will be called when *obj*
+ is garbage collected. A finalizer is *alive* until it is called
+ (either explicitly or at garbage collection), and after that it is
+ *dead*. Calling a live finalizer returns the result of evaluating
+ ``func(*arg, **kwargs)``, whereas calling a dead finalizer returns
+ :const:`None`.
+
+ Exceptions raised by finalizer callbacks during garbage collection
+ will be shown on the standard error output, but cannot be
+ propagated. They are handled in the same way as exceptions raised
+ from an object's :meth:`__del__` method or a weak reference's
+ callback.
+
+ When the program exits, each remaining live finalizer is called
+ unless its :attr:`atexit` attribute has been set to false. They
+ are called in reverse order of creation.
+
+ A finalizer will never invoke its callback during the later part of
+ the interpreter shutdown when module globals are liable to have
+ been replaced by :const:`None`.
+
+ .. method:: __call__()
+
+ If *self* is alive then mark it as dead and return the result of
+ calling ``func(*args, **kwargs)``. If *self* is dead then return
+ :const:`None`.
+
+ .. method:: detach()
+
+ If *self* is alive then mark it as dead and return the tuple
+ ``(obj, func, args, kwargs)``. If *self* is dead then return
+ :const:`None`.
+
+ .. method:: peek()
+
+ If *self* is alive then return the tuple ``(obj, func, args,
+ kwargs)``. If *self* is dead then return :const:`None`.
+
+ .. attribute:: alive
+
+ Property which is true if the finalizer is alive, false otherwise.
+
+ .. attribute:: atexit
+
+ A writable boolean property which by default is true. When the
+ program exits, it calls all remaining live finalizers for which
+ :attr:`.atexit` is true. They are called in reverse order of
+ creation.
+
+ .. note::
+
+ It is important to ensure that *func*, *args* and *kwargs* do
+ not own any references to *obj*, either directly or indirectly,
+ since otherwise *obj* will never be garbage collected. In
+ particular, *func* should not be a bound method of *obj*.
+
+ .. versionadded:: 3.4
+
+
.. data:: ReferenceType
The type object for weak references objects.
@@ -232,8 +344,9 @@ These method have the same issues as the and :meth:`keyrefs` method of
Weak Reference Objects
----------------------
-Weak reference objects have no attributes or methods, but do allow the referent
-to be obtained, if it still exists, by calling it:
+Weak reference objects have no methods and no attributes besides
+:attr:`ref.__callback__`. A weak reference object allows the referent to be
+obtained, if it still exists, by calling it:
>>> import weakref
>>> class Object:
@@ -326,3 +439,125 @@ objects can still be retrieved by ID if they do.
def id2obj(oid):
return _id2obj_dict[oid]
+
+.. _finalize-examples:
+
+Finalizer Objects
+-----------------
+
+Often one uses :class:`finalize` to register a callback without
+bothering to keep the returned finalizer object. For instance
+
+ >>> import weakref
+ >>> class Object:
+ ... pass
+ ...
+ >>> kenny = Object()
+ >>> weakref.finalize(kenny, print, "You killed Kenny!") #doctest:+ELLIPSIS
+ <finalize object at ...; for 'Object' at ...>
+ >>> del kenny
+ You killed Kenny!
+
+The finalizer can be called directly as well. However the finalizer
+will invoke the callback at most once.
+
+ >>> def callback(x, y, z):
+ ... print("CALLBACK")
+ ... return x + y + z
+ ...
+ >>> obj = Object()
+ >>> f = weakref.finalize(obj, callback, 1, 2, z=3)
+ >>> assert f.alive
+ >>> assert f() == 6
+ CALLBACK
+ >>> assert not f.alive
+ >>> f() # callback not called because finalizer dead
+ >>> del obj # callback not called because finalizer dead
+
+You can unregister a finalizer using its :meth:`~finalize.detach`
+method. This kills the finalizer and returns the arguments passed to
+the constructor when it was created.
+
+ >>> obj = Object()
+ >>> f = weakref.finalize(obj, callback, 1, 2, z=3)
+ >>> f.detach() #doctest:+ELLIPSIS
+ (<__main__.Object object ...>, <function callback ...>, (1, 2), {'z': 3})
+ >>> newobj, func, args, kwargs = _
+ >>> assert not f.alive
+ >>> assert newobj is obj
+ >>> assert func(*args, **kwargs) == 6
+ CALLBACK
+
+Unless you set the :attr:`~finalize.atexit` attribute to
+:const:`False`, a finalizer will be called when the program exit if it
+is still alive. For instance
+
+ >>> obj = Object()
+ >>> weakref.finalize(obj, print, "obj dead or exiting") #doctest:+ELLIPSIS
+ <finalize object at ...; for 'Object' at ...>
+ >>> exit() #doctest:+SKIP
+ obj dead or exiting
+
+
+Comparing finalizers with :meth:`__del__` methods
+-------------------------------------------------
+
+Suppose we want to create a class whose instances represent temporary
+directories. The directories should be deleted with their contents
+when the first of the following events occurs:
+
+* the object is garbage collected,
+* the object's :meth:`remove` method is called, or
+* the program exits.
+
+We might try to implement the class using a :meth:`__del__` method as
+follows::
+
+ class TempDir:
+ def __init__(self):
+ self.name = tempfile.mkdtemp()
+
+ def remove(self):
+ if self.name is not None:
+ shutil.rmtree(self.name)
+ self.name = None
+
+ @property
+ def removed(self):
+ return self.name is None
+
+ def __del__(self):
+ self.remove()
+
+This solution has a serious problem: the :meth:`__del__` method may be
+called at shutdown after the :mod:`shutil` module has been cleaned up,
+in which case :attr:`shutil.rmtree` will have been replaced by :const:`None`.
+This will cause the :meth:`__del__` method to fail and the directory
+will not be removed.
+
+Using finalizers we can avoid this problem::
+
+ class TempDir:
+ def __init__(self):
+ self.name = tempfile.mkdtemp()
+ self._finalizer = weakref.finalize(self, shutil.rmtree, self.name)
+
+ def remove(self):
+ self._finalizer()
+
+ @property
+ def removed(self):
+ return not self._finalizer.alive
+
+Defined like this, even if a :class:`TempDir` object is part of a
+reference cycle, that reference cycle can still be garbage collected.
+If the object never gets garbage collected the finalizer will still be
+called at exit.
+
+.. note::
+
+ If you create a finalizer object in a daemonic thread just as the
+ the program exits then there is the possibility that the finalizer
+ does not get called at exit. However, in a daemonic thread
+ :func:`atexit.register`, ``try: ... finally: ...`` and ``with: ...``
+ do not guarantee that cleanup occurs either.
diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
index 00cdacd..c0cc683 100644
--- a/Doc/library/xml.etree.elementtree.rst
+++ b/Doc/library/xml.etree.elementtree.rst
@@ -105,6 +105,38 @@ Children are nested, and we can access specific child nodes by index::
>>> root[0][1].text
'2008'
+Incremental parsing
+^^^^^^^^^^^^^^^^^^^
+
+It's possible to parse XML incrementally (i.e. not the whole document at once).
+The most powerful tool for doing this is :class:`IncrementalParser`. It does
+not require a blocking read to obtain the XML data, and is instead fed with
+data incrementally with :meth:`IncrementalParser.data_received` calls. To get
+the parsed XML elements, call :meth:`IncrementalParser.events`. Here's an
+example::
+
+ >>> incparser = ET.IncrementalParser(['start', 'end'])
+ >>> incparser.data_received('<mytag>sometext')
+ >>> list(incparser.events())
+ [('start', <Element 'mytag' at 0x7fba3f2a8688>)]
+ >>> incparser.data_received(' more text</mytag>')
+ >>> for event, elem in incparser.events():
+ ... print(event)
+ ... print(elem.tag, 'text=', elem.text)
+ ...
+ end
+ mytag text= sometext more text
+
+The obvious use case is applications that operate in an asynchronous fashion
+where the XML data is being received from a socket or read incrementally from
+some storage device. In such cases, blocking reads are unacceptable.
+
+Because it's so flexible, :class:`IncrementalParser` can be inconvenient
+to use for simpler use-cases. If you don't mind your application blocking on
+reading XML data but would still like to have incremental parsing capabilities,
+take a look at :func:`iterparse`. It can be useful when you're reading a large
+XML document and don't want to hold it wholly in memory.
+
Finding interesting elements
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -379,7 +411,7 @@ Functions
Parses an XML section into an element tree incrementally, and reports what's
going on to the user. *source* is a filename or :term:`file object`
- containing XML data. *events* is a list of events to report back. The
+ containing XML data. *events* is a sequence of events to report back. The
supported events are the strings ``"start"``, ``"end"``, ``"start-ns"``
and ``"end-ns"`` (the "ns" events are used to get detailed namespace
information). If *events* is omitted, only ``"end"`` events are reported.
@@ -388,6 +420,11 @@ Functions
:class:`TreeBuilder` as a target. Returns an :term:`iterator` providing
``(event, elem)`` pairs.
+ Note that while :func:`iterparse` builds the tree incrementally, it issues
+ blocking reads on *source* (or the file it names). As such, it's unsuitable
+ for asynchronous applications where blocking reads can't be made. For fully
+ asynchronous parsing, see :class:`IncrementalParser`.
+
.. note::
:func:`iterparse` only guarantees that it has seen the ">"
@@ -398,7 +435,6 @@ Functions
If you need a fully populated element, look for "end" events instead.
-
.. function:: parse(source, parser=None)
Parses an XML section into an element tree. *source* is a filename or file
@@ -438,29 +474,39 @@ Functions
arguments. Returns an element instance.
-.. function:: tostring(element, encoding="us-ascii", method="xml")
+.. function:: tostring(element, encoding="us-ascii", method="xml", *, \
+ short_empty_elements=True)
Generates a string representation of an XML element, including all
subelements. *element* is an :class:`Element` instance. *encoding* [1]_ is
the output encoding (default is US-ASCII). Use ``encoding="unicode"`` to
generate a Unicode string (otherwise, a bytestring is generated). *method*
is either ``"xml"``, ``"html"`` or ``"text"`` (default is ``"xml"``).
+ *short_empty_elements* has the same meaning as in :meth:`ElementTree.write`.
Returns an (optionally) encoded string containing the XML data.
+ .. versionadded:: 3.4
+ The *short_empty_elements* parameter.
-.. function:: tostringlist(element, encoding="us-ascii", method="xml")
+
+.. function:: tostringlist(element, encoding="us-ascii", method="xml", *, \
+ short_empty_elements=True)
Generates a string representation of an XML element, including all
subelements. *element* is an :class:`Element` instance. *encoding* [1]_ is
the output encoding (default is US-ASCII). Use ``encoding="unicode"`` to
generate a Unicode string (otherwise, a bytestring is generated). *method*
is either ``"xml"``, ``"html"`` or ``"text"`` (default is ``"xml"``).
+ *short_empty_elements* has the same meaning as in :meth:`ElementTree.write`.
Returns a list of (optionally) encoded strings containing the XML data.
It does not guarantee any specific sequence, except that
``"".join(tostringlist(element)) == tostring(element)``.
.. versionadded:: 3.2
+ .. versionadded:: 3.4
+ The *short_empty_elements* parameter.
+
.. function:: XML(text, parser=None)
@@ -752,7 +798,8 @@ ElementTree Objects
.. method:: write(file, encoding="us-ascii", xml_declaration=None, \
- default_namespace=None, method="xml")
+ default_namespace=None, method="xml", *, \
+ short_empty_elements=True)
Writes the element tree to a file, as XML. *file* is a file name, or a
:term:`file object` opened for writing. *encoding* [1]_ is the output
@@ -763,6 +810,10 @@ ElementTree Objects
*default_namespace* sets the default XML namespace (for "xmlns").
*method* is either ``"xml"``, ``"html"`` or ``"text"`` (default is
``"xml"``).
+ The keyword-only *short_empty_elements* parameter controls the formatting
+ of elements that contain no content. If *True* (the default), they are
+ emitted as a single self-closed tag, otherwise they are emitted as a pair
+ of start/end tags.
The output is either a string (:class:`str`) or binary (:class:`bytes`).
This is controlled by the *encoding* argument. If *encoding* is
@@ -771,6 +822,9 @@ ElementTree Objects
:term:`file object`; make sure you do not try to write a string to a
binary stream and vice versa.
+ .. versionadded:: 3.4
+ The *short_empty_elements* parameter.
+
This is the XML file that is going to be manipulated::
@@ -816,6 +870,49 @@ QName Objects
:class:`QName` instances are opaque.
+IncrementalParser Objects
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. class:: IncrementalParser(events=None, parser=None)
+
+ An incremental, event-driven parser suitable for non-blocking applications.
+ *events* is a sequence of events to report back. The supported events are
+ the strings ``"start"``, ``"end"``, ``"start-ns"`` and ``"end-ns"`` (the "ns"
+ events are used to get detailed namespace information). If *events* is
+ omitted, only ``"end"`` events are reported. *parser* is an optional
+ parser instance. If not given, the standard :class:`XMLParser` parser is
+ used. *parser* can only use the default :class:`TreeBuilder` as a target.
+
+ .. method:: data_received(data)
+
+ Feed the given bytes data to the incremental parser.
+
+ .. method:: eof_received()
+
+ Signal the incremental parser that the data stream is terminated.
+
+ .. method:: events()
+
+ Iterate over the events which have been encountered in the data fed
+ to the parser. This method yields ``(event, elem)`` pairs, where
+ *event* is a string representing the type of event (e.g. ``"end"``)
+ and *elem* is the encountered :class:`Element` object. Events
+ provided in a previous call to :meth:`events` will not be yielded
+ again.
+
+ .. note::
+
+ :class:`IncrementalParser` only guarantees that it has seen the ">"
+ character of a starting tag when it emits a "start" event, so the
+ attributes are defined, but the contents of the text and tail attributes
+ are undefined at that point. The same applies to the element children;
+ they may or may not be present.
+
+ If you need a fully populated element, look for "end" events instead.
+
+ .. versionadded:: 3.4
+
+
.. _elementtree-treebuilder-objects:
TreeBuilder Objects
diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst
index 75e8fd5..7122120 100644
--- a/Doc/library/zipfile.rst
+++ b/Doc/library/zipfile.rst
@@ -144,7 +144,7 @@ ZipFile Objects
and should be :const:`ZIP_STORED`, :const:`ZIP_DEFLATED`,
:const:`ZIP_BZIP2` or :const:`ZIP_LZMA`; unrecognized
values will cause :exc:`RuntimeError` to be raised. If :const:`ZIP_DEFLATED`,
- :const:`ZIP_BZIP2` or :const:`ZIP_LZMA` is specified but the corresponded module
+ :const:`ZIP_BZIP2` or :const:`ZIP_LZMA` is specified but the corresponding module
(:mod:`zlib`, :mod:`bz2` or :mod:`lzma`) is not available, :exc:`RuntimeError`
is also raised. The default is :const:`ZIP_STORED`. If *allowZip64* is
``True`` zipfile will create ZIP files that use the ZIP64 extensions when
@@ -265,10 +265,8 @@ ZipFile Objects
Never extract archives from untrusted sources without prior inspection.
It is possible that files are created outside of *path*, e.g. members
that have absolute filenames starting with ``"/"`` or filenames with two
- dots ``".."``.
-
- .. versionchanged:: 3.3.1
- The zipfile module attempts to prevent that. See :meth:`extract` note.
+ dots ``".."``. This module attempts to prevent that.
+ See :meth:`extract` note.
.. method:: ZipFile.printdir()
diff --git a/Doc/license.rst b/Doc/license.rst
index aacfaa1..b09e9a8 100644
--- a/Doc/license.rst
+++ b/Doc/license.rst
@@ -126,6 +126,8 @@ been GPL-compatible; the table below summarizes the various releases.
+----------------+--------------+------------+------------+-----------------+
| 3.3.1 | 3.3.0 | 2013 | PSF | yes |
+----------------+--------------+------------+------------+-----------------+
+| 3.4.0 | 3.3.0 | 2014 | PSF | yes |
++----------------+--------------+------------+------------+-----------------+
.. note::
@@ -660,6 +662,25 @@ The :mod:`select` and contains the following notice for the kqueue interface::
SUCH DAMAGE.
+SHA-3
+-----
+
+The module :mod:`_sha3` and :mod:`hashlib` are using the reference
+implementation of Keccak. The files at :file:`Modules/_sha3/keccak/` contain
+the following note::
+
+ The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+ Michaël Peeters and Gilles Van Assche. For more information, feedback or
+ questions, please refer to our website: http://keccak.noekeon.org/
+
+ Implementation by the designers,
+ hereby denoted as "the implementer".
+
+ To the extent possible under law, the implementer has waived all copyright
+ and related or neighboring rights to the source code in this file.
+ http://creativecommons.org/publicdomain/zero/1.0/
+
+
strtod and dtoa
---------------
diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst
index d0d0646..c25c767 100644
--- a/Doc/reference/compound_stmts.rst
+++ b/Doc/reference/compound_stmts.rst
@@ -493,14 +493,15 @@ case the parameter's default value is substituted. If a parameter has a default
value, all following parameters up until the "``*``" must also have a default
value --- this is a syntactic restriction that is not expressed by the grammar.
-**Default parameter values are evaluated when the function definition is
-executed.** This means that the expression is evaluated once, when the function
-is defined, and that the same "pre-computed" value is used for each call. This
-is especially important to understand when a default parameter is a mutable
-object, such as a list or a dictionary: if the function modifies the object
-(e.g. by appending an item to a list), the default value is in effect modified.
-This is generally not what was intended. A way around this is to use ``None``
-as the default, and explicitly test for it in the body of the function, e.g.::
+**Default parameter values are evaluated from left to right when the function
+definition is executed.** This means that the expression is evaluated once, when
+the function is defined, and that the same "pre-computed" value is used for each
+call. This is especially important to understand when a default parameter is a
+mutable object, such as a list or a dictionary: if the function modifies the
+object (e.g. by appending an item to a list), the default value is in effect
+modified. This is generally not what was intended. A way around this is to use
+``None`` as the default, and explicitly test for it in the body of the function,
+e.g.::
def whats_on_the_telly(penguin=None):
if penguin is None:
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst
index f8e9280..a88d562 100644
--- a/Doc/reference/datamodel.rst
+++ b/Doc/reference/datamodel.rst
@@ -934,6 +934,20 @@ Internal types
frame). A debugger can implement a Jump command (aka Set Next Statement)
by writing to f_lineno.
+ Frame objects support one method:
+
+ .. method:: frame.clear()
+
+ This method clears all references to local variables held by the
+ frame. Also, if the frame belonged to a generator, the generator
+ is finalized. This helps break reference cycles involving frame
+ objects (for example when catching an exception and storing its
+ traceback for later use).
+
+ :exc:`RuntimeError` is raised if the frame is currently executing.
+
+ .. versionadded:: 3.4
+
Traceback objects
.. index::
object: traceback
@@ -1120,12 +1134,10 @@ Basic customization
``sys.last_traceback`` keeps the stack frame alive). The first situation
can only be remedied by explicitly breaking the cycles; the latter two
situations can be resolved by storing ``None`` in ``sys.last_traceback``.
- Circular references which are garbage are detected when the option cycle
- detector is enabled (it's on by default), but can only be cleaned up if
- there are no Python- level :meth:`__del__` methods involved. Refer to the
- documentation for the :mod:`gc` module for more information about how
- :meth:`__del__` methods are handled by the cycle detector, particularly
- the description of the ``garbage`` value.
+ Circular references which are garbage are detected and cleaned up when
+ the cyclic garbage collector is enabled (it's on by default). Refer to the
+ documentation for the :mod:`gc` module for more information about this
+ topic.
.. warning::
@@ -1828,6 +1840,15 @@ through the container; for mappings, :meth:`__iter__` should be the same as
considered to be false in a Boolean context.
+.. method:: object.__length_hint__(self)
+
+ Called to implement :func:`operator.length_hint`. Should return an estimated
+ length for the object (which may be greater or less than the actual length).
+ The length must be an integer ``>=`` 0. This method is purely an
+ optimization and is never required for correctness.
+
+ .. versionadded:: 3.4
+
.. note::
Slicing is done exclusively with the following three methods. A call like ::
diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst
index eb497a1..b587fc9 100644
--- a/Doc/reference/import.rst
+++ b/Doc/reference/import.rst
@@ -373,16 +373,18 @@ Loaders must satisfy the following requirements:
* The ``__loader__`` attribute must be set to the loader object that loaded
the module. This is mostly for introspection and reloading, but can be
used for additional loader-specific functionality, for example getting
- data associated with a loader.
+ data associated with a loader. If the attribute is missing or set to ``None``
+ then the import machinery will automatically set it **after** the module has
+ been imported.
- * The module's ``__package__`` attribute should be set. Its value must be a
+ * The module's ``__package__`` attribute must be set. Its value must be a
string, but it can be the same value as its ``__name__``. If the attribute
is set to ``None`` or is missing, the import system will fill it in with a
- more appropriate value. When the module is a package, its ``__package__``
- value should be set to its ``__name__``. When the module is not a package,
- ``__package__`` should be set to the empty string for top-level modules, or
- for submodules, to the parent package's name. See :pep:`366` for further
- details.
+ more appropriate value **after** the module has been imported.
+ When the module is a package, its ``__package__`` value should be set to its
+ ``__name__``. When the module is not a package, ``__package__`` should be
+ set to the empty string for top-level modules, or for submodules, to the
+ parent package's name. See :pep:`366` for further details.
This attribute is used instead of ``__name__`` to calculate explicit
relative imports for main modules, as defined in :pep:`366`.
@@ -425,8 +427,8 @@ Here are the exact rules used:
* If the module has a ``__file__`` attribute, this is used as part of the
module's repr.
- * If the module has no ``__file__`` but does have a ``__loader__``, then the
- loader's repr is used as part of the module's repr.
+ * If the module has no ``__file__`` but does have a ``__loader__`` that is not
+ ``None``, then the loader's repr is used as part of the module's repr.
* Otherwise, just use the module's ``__name__`` in the repr.
diff --git a/Doc/tools/sphinxext/indexsidebar.html b/Doc/tools/sphinxext/indexsidebar.html
index a0ec32f..ed5da0c 100644
--- a/Doc/tools/sphinxext/indexsidebar.html
+++ b/Doc/tools/sphinxext/indexsidebar.html
@@ -3,7 +3,7 @@
<h3>Docs for other versions</h3>
<ul>
<li><a href="http://docs.python.org/2.7/">Python 2.7 (stable)</a></li>
- <li><a href="http://docs.python.org/3.4/">Python 3.4 (in development)</a></li>
+ <li><a href="http://docs.python.org/3.3/">Python 3.3 (stable)</a></li>
<li><a href="http://www.python.org/doc/versions/">Old versions</a></li>
</ul>
diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/sphinxext/pyspecific.py
index e8eb703..df6e48a 100644
--- a/Doc/tools/sphinxext/pyspecific.py
+++ b/Doc/tools/sphinxext/pyspecific.py
@@ -10,7 +10,7 @@
"""
ISSUE_URI = 'http://bugs.python.org/issue%s'
-SOURCE_URI = 'http://hg.python.org/cpython/file/3.3/%s'
+SOURCE_URI = 'http://hg.python.org/cpython/file/default/%s'
from docutils import nodes, utils
from sphinx.util.nodes import split_explicit_title
diff --git a/Doc/tools/sphinxext/susp-ignored.csv b/Doc/tools/sphinxext/susp-ignored.csv
index 72c5255..d951dad 100644
--- a/Doc/tools/sphinxext/susp-ignored.csv
+++ b/Doc/tools/sphinxext/susp-ignored.csv
@@ -162,17 +162,9 @@ library/os.path,,:foo,c:foo
library/pdb,,:lineno,filename:lineno
library/pickle,,:memory,"conn = sqlite3.connect("":memory:"")"
library/posix,,`,"CFLAGS=""`getconf LFS_CFLAGS`"" OPT=""-g -O2 $CFLAGS"""
-library/pprint,209,::,"'classifiers': ['Development Status :: 4 - Beta',"
-library/pprint,209,::,"'Intended Audience :: Developers',"
-library/pprint,209,::,"'License :: OSI Approved :: MIT License',"
-library/pprint,209,::,"'Natural Language :: English',"
-library/pprint,209,::,"'Operating System :: OS Independent',"
-library/pprint,209,::,"'Programming Language :: Python',"
-library/pprint,209,::,"'Programming Language :: Python :: 2',"
-library/pprint,209,::,"'Programming Language :: Python :: 2.6',"
-library/pprint,209,::,"'Programming Language :: Python :: 2.7',"
-library/pprint,209,::,"'Topic :: Software Development :: Libraries',"
-library/pprint,209,::,"'Topic :: Software Development :: Libraries :: Python Modules'],"
+library/pprint,,::,"'Programming Language :: Python :: 2 :: Only'],"
+library/pprint,,::,"'Programming Language :: Python :: 2.6',"
+library/pprint,,::,"'Programming Language :: Python :: 2.7',"
library/profile,,:lineno,filename:lineno(function)
library/pyexpat,,:elem1,<py:elem1 />
library/pyexpat,,:py,"xmlns:py = ""http://www.python.org/ns/"">"
@@ -184,6 +176,7 @@ library/socket,,:len,fds.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data)
library/sqlite3,,:age,"cur.execute(""select * from people where name_last=:who and age=:age"", {""who"": who, ""age"": age})"
library/sqlite3,,:memory,
library/sqlite3,,:who,"cur.execute(""select * from people where name_last=:who and age=:age"", {""who"": who, ""age"": age})"
+library/sqlite3,,:path,"db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)"
library/ssl,,:My,"Organizational Unit Name (eg, section) []:My Group"
library/ssl,,:My,"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc."
library/ssl,,:myserver,"Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com"
diff --git a/Doc/tutorial/interactive.rst b/Doc/tutorial/interactive.rst
index 36acb06..abf30f0 100644
--- a/Doc/tutorial/interactive.rst
+++ b/Doc/tutorial/interactive.rst
@@ -7,140 +7,27 @@ Interactive Input Editing and History Substitution
Some versions of the Python interpreter support editing of the current input
line and history substitution, similar to facilities found in the Korn shell and
the GNU Bash shell. This is implemented using the `GNU Readline`_ library,
-which supports Emacs-style and vi-style editing. This library has its own
-documentation which I won't duplicate here; however, the basics are easily
-explained. The interactive editing and history described here are optionally
-available in the Unix and Cygwin versions of the interpreter.
-
-This chapter does *not* document the editing facilities of Mark Hammond's
-PythonWin package or the Tk-based environment, IDLE, distributed with Python.
-The command line history recall which operates within DOS boxes on NT and some
-other DOS and Windows flavors is yet another beast.
-
-
-.. _tut-lineediting:
-
-Line Editing
-============
-
-If supported, input line editing is active whenever the interpreter prints a
-primary or secondary prompt. The current line can be edited using the
-conventional Emacs control characters. The most important of these are:
-:kbd:`C-A` (Control-A) moves the cursor to the beginning of the line, :kbd:`C-E`
-to the end, :kbd:`C-B` moves it one position to the left, :kbd:`C-F` to the
-right. Backspace erases the character to the left of the cursor, :kbd:`C-D` the
-character to its right. :kbd:`C-K` kills (erases) the rest of the line to the
-right of the cursor, :kbd:`C-Y` yanks back the last killed string.
-:kbd:`C-underscore` undoes the last change you made; it can be repeated for
-cumulative effect.
-
-
-.. _tut-history:
-
-History Substitution
-====================
-
-History substitution works as follows. All non-empty input lines issued are
-saved in a history buffer, and when a new prompt is given you are positioned on
-a new line at the bottom of this buffer. :kbd:`C-P` moves one line up (back) in
-the history buffer, :kbd:`C-N` moves one down. Any line in the history buffer
-can be edited; an asterisk appears in front of the prompt to mark a line as
-modified. Pressing the :kbd:`Return` key passes the current line to the
-interpreter. :kbd:`C-R` starts an incremental reverse search; :kbd:`C-S` starts
-a forward search.
+which supports various styles of editing. This library has its own
+documentation which we won't duplicate here.
.. _tut-keybindings:
-Key Bindings
-============
-
-The key bindings and some other parameters of the Readline library can be
-customized by placing commands in an initialization file called
-:file:`~/.inputrc`. Key bindings have the form ::
-
- key-name: function-name
-
-or ::
-
- "string": function-name
-
-and options can be set with ::
-
- set option-name value
-
-For example::
-
- # I prefer vi-style editing:
- set editing-mode vi
-
- # Edit using a single line:
- set horizontal-scroll-mode On
+Tab Completion and History Editing
+==================================
- # Rebind some keys:
- Meta-h: backward-kill-word
- "\C-u": universal-argument
- "\C-x\C-r": re-read-init-file
-
-Note that the default binding for :kbd:`Tab` in Python is to insert a :kbd:`Tab`
-character instead of Readline's default filename completion function. If you
-insist, you can override this by putting ::
-
- Tab: complete
-
-in your :file:`~/.inputrc`. (Of course, this makes it harder to type indented
-continuation lines if you're accustomed to using :kbd:`Tab` for that purpose.)
-
-.. index::
- module: rlcompleter
- module: readline
-
-Automatic completion of variable and module names is optionally available. To
-enable it in the interpreter's interactive mode, add the following to your
-startup file: [#]_ ::
-
- import rlcompleter, readline
- readline.parse_and_bind('tab: complete')
-
-This binds the :kbd:`Tab` key to the completion function, so hitting the
-:kbd:`Tab` key twice suggests completions; it looks at Python statement names,
-the current local variables, and the available module names. For dotted
-expressions such as ``string.a``, it will evaluate the expression up to the
-final ``'.'`` and then suggest completions from the attributes of the resulting
-object. Note that this may execute application-defined code if an object with a
-:meth:`__getattr__` method is part of the expression.
-
-A more capable startup file might look like this example. Note that this
-deletes the names it creates once they are no longer needed; this is done since
-the startup file is executed in the same namespace as the interactive commands,
-and removing the names avoids creating side effects in the interactive
-environment. You may find it convenient to keep some of the imported modules,
-such as :mod:`os`, which turn out to be needed in most sessions with the
-interpreter. ::
-
- # Add auto-completion and a stored history file of commands to your Python
- # interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
- # bound to the Esc key by default (you can change it - see readline docs).
- #
- # Store the file in ~/.pystartup, and set an environment variable to point
- # to it: "export PYTHONSTARTUP=~/.pystartup" in bash.
-
- import atexit
- import os
- import readline
- import rlcompleter
-
- historyPath = os.path.expanduser("~/.pyhistory")
-
- def save_history(historyPath=historyPath):
- import readline
- readline.write_history_file(historyPath)
-
- if os.path.exists(historyPath):
- readline.read_history_file(historyPath)
-
- atexit.register(save_history)
- del os, atexit, readline, rlcompleter, save_history, historyPath
+Completion of variable and module names is
+:ref:`automatically enabled <rlcompleter-config>` at interpreter startup so
+that the :kbd:`Tab` key invokes the completion function; it looks at
+Python statement names, the current local variables, and the available
+module names. For dotted expressions such as ``string.a``, it will evaluate
+the expression up to the final ``'.'`` and then suggest completions from
+the attributes of the resulting object. Note that this may execute
+application-defined code if an object with a :meth:`__getattr__` method
+is part of the expression. The default configuration also saves your
+history into a file named :file:`.python_history` in your user directory.
+The history will be available again during the next interactive interpreter
+session.
.. _tut-commentary:
@@ -162,14 +49,6 @@ into other applications. Another similar enhanced interactive environment is
bpython_.
-.. rubric:: Footnotes
-
-.. [#] Python will execute the contents of a file identified by the
- :envvar:`PYTHONSTARTUP` environment variable when you start an interactive
- interpreter. To customize Python even for non-interactive mode, see
- :ref:`tut-customize`.
-
-
.. _GNU Readline: http://tiswww.case.edu/php/chet/readline/rltop.html
.. _IPython: http://ipython.scipy.org/
.. _bpython: http://www.bpython-interpreter.org/
diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst
index cdc2bf2..c182511 100644
--- a/Doc/tutorial/interpreter.rst
+++ b/Doc/tutorial/interpreter.rst
@@ -10,13 +10,13 @@ Using the Python Interpreter
Invoking the Interpreter
========================
-The Python interpreter is usually installed as :file:`/usr/local/bin/python3.3`
+The Python interpreter is usually installed as :file:`/usr/local/bin/python3.4`
on those machines where it is available; putting :file:`/usr/local/bin` in your
Unix shell's search path makes it possible to start it by typing the command:
.. code-block:: text
- python3.3
+ python3.4
to the shell. [#]_ Since the choice of the directory where the interpreter lives
is an installation option, other places are possible; check with your local
@@ -24,11 +24,11 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a
popular alternative location.)
On Windows machines, the Python installation is usually placed in
-:file:`C:\\Python33`, though you can change this when you're running the
+:file:`C:\\Python34`, though you can change this when you're running the
installer. To add this directory to your path, you can type the following
command into the command prompt in a DOS box::
- set path=%path%;C:\python33
+ set path=%path%;C:\python34
Typing an end-of-file character (:kbd:`Control-D` on Unix, :kbd:`Control-Z` on
Windows) at the primary prompt causes the interpreter to exit with a zero exit
@@ -95,8 +95,8 @@ with the *secondary prompt*, by default three dots (``...``). The interpreter
prints a welcome message stating its version number and a copyright notice
before printing the first prompt::
- $ python3.3
- Python 3.3 (default, Sep 24 2012, 09:25:04)
+ $ python3.4
+ Python 3.4 (default, Sep 24 2012, 09:25:04)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
@@ -149,7 +149,7 @@ Executable Python Scripts
On BSD'ish Unix systems, Python scripts can be made directly executable, like
shell scripts, by putting the line ::
- #! /usr/bin/env python3.3
+ #! /usr/bin/env python3.4
(assuming that the interpreter is on the user's :envvar:`PATH`) at the beginning
of the script and giving the file an executable mode. The ``#!`` must be the
diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst
index e2ce0ef..99e15bc 100644
--- a/Doc/tutorial/modules.rst
+++ b/Doc/tutorial/modules.rst
@@ -290,24 +290,23 @@ defines. It returns a sorted list of strings::
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys) # doctest: +NORMALIZE_WHITESPACE
- ['__displayhook__', '__doc__', '__egginsert', '__excepthook__',
- '__loader__', '__name__', '__package__', '__plen', '__stderr__',
- '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames',
- '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions',
- 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix',
- 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
- 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
- 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
- 'float_repr_style', 'getcheckinterval', 'getdefaultencoding',
- 'getdlopenflags', 'getfilesystemencoding', 'getobjects', 'getprofile',
- 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
- 'gettotalrefcount', 'gettrace', 'hash_info', 'hexversion',
- 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode',
- 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
- 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setdlopenflags',
- 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace',
- 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info',
- 'warnoptions']
+ ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
+ '__package__', '__stderr__', '__stdin__', '__stdout__',
+ '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
+ '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
+ 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
+ 'call_tracing', 'callstats', 'copyright', 'displayhook',
+ 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
+ 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
+ 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
+ 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
+ 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
+ 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
+ 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
+ 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
+ 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
+ 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
+ 'thread_info', 'version', 'version_info', 'warnoptions']
Without arguments, :func:`dir` lists the names you have defined currently::
diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst
index 7e7a154..2e3ed18 100644
--- a/Doc/tutorial/stdlib.rst
+++ b/Doc/tutorial/stdlib.rst
@@ -15,7 +15,7 @@ operating system::
>>> import os
>>> os.getcwd() # Return the current working directory
- 'C:\\Python33'
+ 'C:\\Python34'
>>> os.chdir('/server/accesslogs') # Change current working directory
>>> os.system('mkdir today') # Run the command mkdir in the system shell
0
diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst
index 4b6e036..3b9122f 100644
--- a/Doc/tutorial/stdlib2.rst
+++ b/Doc/tutorial/stdlib2.rst
@@ -275,7 +275,7 @@ applications include caching objects that are expensive to create::
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
d['primary'] # entry was automatically removed
- File "C:/python33/lib/weakref.py", line 46, in __getitem__
+ File "C:/python34/lib/weakref.py", line 46, in __getitem__
o = self.data[key]()
KeyError: 'primary'
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
index 4e7168f..c14f6c7 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
@@ -24,7 +24,7 @@ Command line
When invoking Python, you may specify any of these options::
- python [-bBdEhiOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
+ python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
The most common use case is, of course, a simple invocation of a script::
@@ -147,7 +147,12 @@ source.
If no interface option is given, :option:`-i` is implied, ``sys.argv[0]`` is
an empty string (``""``) and the current directory will be added to the
-start of :data:`sys.path`.
+start of :data:`sys.path`. Also, tab-completion and history editing is
+automatically enabled, if available on your platform (see
+:ref:`rlcompleter-config`).
+
+.. versionchanged:: 3.4
+ Automatic enabling of tab-completion and history editing.
.. seealso:: :ref:`tut-invoking`
@@ -170,6 +175,8 @@ Generic options
Python 3.0
+.. _using-on-misc-options:
+
Miscellaneous options
~~~~~~~~~~~~~~~~~~~~~
@@ -208,6 +215,17 @@ Miscellaneous options
raises an exception. See also :envvar:`PYTHONINSPECT`.
+.. cmdoption:: -I
+
+ Run Python in isolated mode. This also implies -E and -s.
+ In isolated mode :data:`sys.path` contains neither the script's directory nor
+ the user's site-packages directory. All :envvar:`PYTHON*` environment
+ variables are ignored, too. Further restrictions may be imposed to prevent
+ the user from injecting malicious code.
+
+ .. versionadded:: 3.4
+
+
.. cmdoption:: -O
Turn on basic optimizations. This changes the filename extension for
@@ -358,9 +376,14 @@ Miscellaneous options
.. cmdoption:: -X
Reserved for various implementation-specific options. CPython currently
- defines just one, you can use ``-X faulthandler`` to enable
- :mod:`faulthandler`. It also allows to pass arbitrary values and retrieve
- them through the :data:`sys._xoptions` dictionary.
+ defines two possible values:
+
+ * ``-X faulthandler`` to enable :mod:`faulthandler`;
+ * ``-X showrefcount`` to enable the output of the total reference count
+ and memory blocks (only works on debug builds);
+
+ It also allows to pass arbitrary values and retrieve them through the
+ :data:`sys._xoptions` dictionary.
.. versionchanged:: 3.2
It is now allowed to pass :option:`-X` with CPython.
@@ -368,6 +391,9 @@ Miscellaneous options
.. versionadded:: 3.3
The ``-X faulthandler`` option.
+ .. versionadded:: 3.4
+ The ``-X showrefcount`` option.
+
Options you shouldn't use
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -385,7 +411,7 @@ Environment variables
---------------------
These environment variables influence Python's behavior, they are processed
-before the command-line switches other than -E. It is customary that
+before the command-line switches other than -E or -I. It is customary that
command-line switches override environmental variables where there is a
conflict.
@@ -430,7 +456,7 @@ conflict.
is executed in the same namespace where interactive commands are executed so
that objects defined or imported in it can be used without qualification in
the interactive session. You can also change the prompts :data:`sys.ps1` and
- :data:`sys.ps2` in this file.
+ :data:`sys.ps2` and the hook :data:`sys.__interactivehook__` in this file.
.. envvar:: PYTHONY2K
diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst
index 3e1b74d..5be439f 100644
--- a/Doc/using/mac.rst
+++ b/Doc/using/mac.rst
@@ -25,7 +25,7 @@ there.
What you get after installing is a number of things:
-* A :file:`MacPython 3.3` folder in your :file:`Applications` folder. In here
+* A :file:`MacPython 3.4` folder in your :file:`Applications` folder. In here
you find IDLE, the development environment that is a standard part of official
Python distributions; PythonLauncher, which handles double-clicking Python
scripts from the Finder; and the "Build Applet" tool, which allows you to
@@ -93,7 +93,7 @@ aware of: programs that talk to the Aqua window manager (in other words,
anything that has a GUI) need to be run in a special way. Use :program:`pythonw`
instead of :program:`python` to start such scripts.
-With Python 3.3, you can use either :program:`python` or :program:`pythonw`.
+With Python 3.4, you can use either :program:`python` or :program:`pythonw`.
Configuration
@@ -158,7 +158,7 @@ http://www.riverbankcomputing.co.uk/software/pyqt/intro.
Distributing Python Applications on the Mac
===========================================
-The "Build Applet" tool that is placed in the MacPython 3.3 folder is fine for
+The "Build Applet" tool that is placed in the MacPython 3.4 folder is fine for
packaging small Python scripts on your own machine to run as a standard Mac
application. This tool, however, is not robust enough to distribute Python
applications to other users.
diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc
index 5fdbc9b..706ac5d 100644
--- a/Doc/using/venv-create.inc
+++ b/Doc/using/venv-create.inc
@@ -56,20 +56,21 @@ virtualenv will be created, according to the given options, at each
provided path.
Once a venv has been created, it can be "activated" using a script in the
-venv's binary directory. The invocation of the script is platform-specific: on
-a Posix platform, you would typically do::
-
- $ source <venv>/bin/activate
-
-whereas on Windows, you might do::
-
- C:\> <venv>/Scripts/activate
-
-if you are using the ``cmd.exe`` shell, or perhaps::
-
- PS C:\> <venv>/Scripts/Activate.ps1
-
-if you use PowerShell.
+venv's binary directory. The invocation of the script is platform-specific:
+
++-------------+-----------------+-----------------------------------------+
+| Platform | Shell | Command to activate virtual environment |
++=============+=================+=========================================+
+| Posix | bash/zsh | $ source <venv>/bin/activate |
++-------------+-----------------+-----------------------------------------+
+| | fish | $ . <venv>/bin/activate.fish |
++-------------+-----------------+-----------------------------------------+
+| | csh/tcsh | $ source <venv>/bin/activate.csh |
++-------------+-----------------+-----------------------------------------+
+| Windows | cmd.exe | C:\> <venv>/Scripts/activate.bat |
++-------------+-----------------+-----------------------------------------+
+| | PowerShell | PS C:\> <venv>/Scripts/Activate.ps1 |
++-------------+-----------------+-----------------------------------------+
You don't specifically *need* to activate an environment; activation just
prepends the venv's binary directory to your path, so that "python" invokes the
diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
new file mode 100644
index 0000000..d56b422
--- /dev/null
+++ b/Doc/whatsnew/3.4.rst
@@ -0,0 +1,498 @@
+****************************
+ What's New In Python 3.4
+****************************
+
+.. :Author: Someone <email>
+ (uncomment if there is a principal author)
+
+.. Rules for maintenance:
+
+ * Anyone can add text to this document, but the maintainer reserves the
+ right to rewrite any additions. In particular, for obscure or esoteric
+ features, the maintainer may reduce any addition to a simple reference to
+ the new documentation rather than explaining the feature inline.
+
+ * While the maintainer will periodically go through Misc/NEWS
+ and add changes, it's best not to rely on this. We know from experience
+ that any changes that aren't in the What's New documentation around the
+ time of the original release will remain largely unknown to the community
+ for years, even if they're added later. We also know from experience that
+ other priorities can arise, and the maintainer will run out of time to do
+ updates - in such cases, end users will be much better served by partial
+ notifications that at least give a hint about new features to
+ investigate.
+
+ * This is not a complete list of every single change; completeness
+ is the purpose of Misc/NEWS. The What's New should focus on changes that
+ are visible to Python *users* and that *require* a feature release (i.e.
+ most bug fixes should only be recorded in Misc/NEWS)
+
+ * PEPs should not be marked Final until they have an entry in What's New.
+ A placeholder entry that is just a section header and a link to the PEP
+ (e.g ":pep:`397` has been implemented") is acceptable. If a PEP has been
+ implemented and noted in What's New, don't forget to mark it as Final!
+
+ * If you want to draw your new text to the attention of the
+ maintainer, add 'XXX' to the beginning of the paragraph or
+ section.
+
+ * It's OK to add just a very brief note about a change. For
+ example: "The :ref:`~socket.transmogrify()` function was added to the
+ :mod:`socket` module." The maintainer will research the change and
+ write the necessary text (if appropriate). The advantage of doing this
+ is that even if no more descriptive text is ever added, readers will at
+ least have a notification that the new feature exists and a link to the
+ relevant documentation.
+
+ * You can comment out your additions if you like, but it's not
+ necessary (especially when a final release is some months away).
+
+ * Credit the author of a patch or bugfix. Just the name is
+ sufficient; the e-mail address isn't necessary.
+
+ * It's helpful to add the bug/patch number as a comment:
+
+ The :ref:`~socket.transmogrify()` function was added to the
+ :mod:`socket` module. (Contributed by P.Y. Developer in :issue:`12345`.)
+
+ This saves the maintainer the effort of going through the Mercurial log
+ when researching a change.
+
+ * Cross referencing tip: :ref:`mod.attr` will display as ``mod.attr``,
+ while :ref:`~mod.attr` will display as ``attr``.
+
+This article explains the new features in Python 3.4, compared to 3.3.
+
+.. Python 3.4 was released on TBD.
+
+For full details, see the
+`changelog <http://docs.python.org/3.4/whatsnew/changelog.html>`_.
+
+.. note:: Prerelease users should be aware that this document is currently in
+ draft form. It will be updated substantially as Python 3.4 moves towards
+ release, so it's worth checking back even after reading earlier versions.
+
+
+.. seealso::
+
+ .. :pep:`4XX` - Python 3.4 Release Schedule
+
+
+Summary -- Release highlights
+=============================
+
+.. This section singles out the most important changes in Python 3.4.
+ Brevity is key.
+
+New syntax features:
+
+* None yet.
+
+New library modules:
+
+* :mod:`enum`: Implementation of the :pep:`435`.
+
+New built-in features:
+
+* :ref:`PEP 442: Safe object finalization <pep-442>`.
+* :ref:`PEP 445: Configurable memory allocators <pep-445>`.
+
+Implementation improvements:
+
+* A more efficient :mod:`marshal` format (:issue:`16475`).
+* Improve finalization of Python modules to avoid setting their globals
+ to None, in most cases (:issue:`18214`).
+
+Significantly Improved Library Modules:
+
+* Single-dispatch generic functions (:pep:`443`)
+* SHA-3 (Keccak) support for :mod:`hashlib`.
+* TLSv1.1 and TLSv1.2 support for :mod:`ssl`.
+* :mod:`multiprocessing` now has option to avoid using :func:`os.fork`
+ on Unix (:issue:`8713`).
+
+Security improvements:
+
+* command line option for :ref:`isolated mode <using-on-misc-options>`,
+ :issue:`16499`.
+
+Please read on for a comprehensive list of user-facing changes.
+
+.. _pep-445:
+
+PEP 445: Add new APIs to customize Python memory allocators
+===========================================================
+
+The :pep:`445` adds new Application Programming Interfaces (API) to customize
+Python memory allocators.
+
+
+.. _pep-442:
+
+PEP 442: Safe object finalization
+=================================
+
+This PEP removes the current limitations and quirks of object finalization.
+With it, objects with :meth:`__del__` methods, as well as generators
+with :keyword:`finally` clauses, can be finalized when they are part of a
+reference cycle.
+
+.. seealso::
+
+ :pep:`442` - Safe object finalization
+ PEP written and implemented by Antoine Pitrou
+
+
+Other Language Changes
+======================
+
+Some smaller changes made to the core Python language are:
+
+* Unicode database updated to UCD version 6.2.
+
+* :func:`min` and :func:`max` now accept a *default* argument that can be used
+ to specify the value they return if the iterable they are evaluating has no
+ elements. Contributed by Julian Berman in :issue:`18111`.
+
+* Module objects are now :mod:`weakref`'able.
+
+
+New Modules
+===========
+
+.. module name
+.. -----------
+
+* None yet.
+
+
+Improved Modules
+================
+
+aifc
+----
+
+The :meth:`~aifc.getparams` method now returns a namedtuple rather than a
+plain tuple. (Contributed by Claudiu Popa in :issue:`17818`.)
+
+
+colorsys
+--------
+
+The number of digits in the coefficients for the RGB --- YIQ conversions have
+been expanded so that they match the FCC NTSC versions. The change in
+results should be less than 1% and may better match results found elsewhere.
+
+
+dis
+---
+
+The :mod:`dis` module is now built around an :class:`Instruction` class that
+provides details of individual bytecode operations and a
+:func:`get_instructions` iterator that emits the Instruction stream for a
+given piece of Python code. The various display tools in the :mod:`dis`
+module have been updated to be based on these new components.
+
+The new :class:`dis.Bytecode` class provides an object-oriented API for
+inspecting bytecode, both in human-readable form and for iterating over
+instructions.
+
+(Contributed by Nick Coghlan, Ryan Kelly and Thomas Kluyver in :issue:`11816`)
+
+
+doctest
+-------
+
+Added :data:`~doctest.FAIL_FAST` flag to halt test running as soon as the first
+failure is detected. (Contributed by R. David Murray and Daniel Urban in
+:issue:`16522`.)
+
+Updated the doctest command line interface to use :mod:`argparse`, and added
+``-o`` and ``-f`` options to the interface. ``-o`` allows doctest options to
+be specified on the command line, and ``-f`` is a shorthand for ``-o
+FAIL_FAST`` (to parallel the similar option supported by the :mod:`unittest`
+CLI). (Contributed by R. David Murray in :issue:`11390`.)
+
+
+email
+-----
+
+:meth:`~email.message.Message.as_string` now accepts a *policy* argument to
+override the default policy of the message when generating a string
+representation of it. This means that ``as_string`` can now be used in more
+circumstances, instead of having to create and use a :mod:`~email.generator` in
+order to pass formatting parameters to its ``flatten`` method.
+
+New method :meth:`~email.message.Message.as_bytes` added to produce a bytes
+representation of the message in a fashion similar to how ``as_string``
+produces a string representation. It does not accept the *maxheaderlen*
+argument, but does accept the *unixfrom* and *policy* arguments. The
+:class:`~email.message.Message` :meth:`~email.message.Message.__bytes__` method
+calls it, meaning that ``bytes(mymsg)`` will now produce the intuitive
+result: a bytes object containing the fully formatted message.
+
+(Contributed by R. David Murray in :issue:`18600`.)
+
+
+functools
+---------
+
+New :func:`functools.singledispatch` decorator: see the :pep:`443`.
+
+
+inspect
+-------
+
+:func:`~inspect.unwrap` makes it easy to unravel wrapper function chains
+created by :func:`functools.wraps` (and any other API that sets the
+``__wrapped__`` attribute on a wrapper function).
+
+
+mmap
+----
+
+mmap objects can now be weakref'ed.
+
+(Contributed by Valerie Lambert in :issue:`4885`.)
+
+
+multiprocessing
+---------------
+
+On Unix two new *start methods* have been added for starting processes
+using :mod:`multiprocessing`. These make the mixing of processes with
+threads more robust. See :issue:`8713`.
+
+Also, except when using the old *fork* start method, child processes
+will no longer inherit unneeded handles/file descriptors from their parents.
+
+
+poplib
+------
+
+New :meth:`~poplib.POP3.stls` method to switch a clear-text POP3 session into
+an encrypted POP3 session.
+
+New :meth:`~poplib.POP3.capa` method to query the capabilities advertised by the
+POP3 server.
+
+(Contributed by Lorenzo Catucci in :issue:`4473`.)
+
+
+smtplib
+-------
+
+:exc:`~smtplib.SMTPException` is now a subclass of :exc:`OSError`, which allows
+both socket level errors and SMTP protocol level errors to be caught in one
+try/except statement by code that only cares whether or not an error occurred.
+(:issue:`2118`).
+
+
+ssl
+---
+
+TLSv1.1 and TLSv1.2 support.
+
+(Contributed by Michele Orrù and Antoine Pitrou in :issue:`16692`)
+
+* New diagnostic functions :func:`~ssl.get_default_verify_paths`,
+ :meth:`~ssl.SSLContext.cert_store_stats` and
+ :meth:`~ssl.SSLContext.get_ca_certs`
+
+* Add :func:`ssl.enum_cert_store` to retrieve certificates and CRL from Windows'
+ cert store.
+
+(Contributed by Christian Heimes in :issue:`18143`, :issue:`18147` and
+ :issue:`17134`.)
+
+Support for server-side SNI using the new
+:meth:`ssl.SSLContext.set_servername_callback` method.
+
+(Contributed by Daniel Black in :issue:`8109`.)
+
+
+stat
+----
+
+The :mod:`stat` module is now backed by a C implementation in :mod:`_stat`. A C
+implementation is required as most of the values aren't standardized and
+platform-dependent. (Contributed by Christian Heimes in :issue:`11016`.)
+
+The module supports new file types: door, event port and whiteout.
+
+
+struct
+------
+
+Streaming struct unpacking using :func:`struct.iter_unpack`.
+
+(Contributed by Antoine Pitrou in :issue:`17804`.)
+
+
+urllib
+------
+
+Add support.for ``data:`` URLs in :mod:`urllib.request`.
+
+(Contributed by Mathias Panzenböck in :issue:`16423`.)
+
+
+unittest
+--------
+
+Support for easy dynamically-generated subtests using the
+:meth:`~unittest.TestCase.subTest` context manager.
+
+(Contributed by Antoine Pitrou in :issue:`16997`.)
+
+
+wave
+----
+
+The :meth:`~wave.getparams` method now returns a namedtuple rather than a
+plain tuple. (Contributed by Claudiu Popa in :issue:`17487`.)
+
+:meth:`wave.open` now supports the context manager protocol. (Contributed
+by Claudiu Popa in :issue:`17616`.)
+
+
+weakref
+-------
+
+New :class:`~weakref.WeakMethod` class simulates weak references to bound
+methods.
+
+(Contributed by Antoine Pitrou in :issue:`14631`.)
+
+
+xml.etree
+---------
+
+Add an event-driven parser for non-blocking applications,
+:class:`~xml.etree.ElementTree.IncrementalParser`.
+
+(Contributed by Antoine Pitrou in :issue:`17782`.)
+
+
+Other improvements
+==================
+
+Tab-completion is now enabled by default in the interactive interpreter.
+
+(Contributed by Antoine Pitrou and Éric Araujo in :issue:`5845`.)
+
+
+Optimizations
+=============
+
+Major performance enhancements have been added:
+
+* The UTF-32 decoder is now 3x to 4x faster.
+
+* The cost of hash collisions for sets is now reduced. Each hash table
+ probe now checks a second key/hash pair for each cache line retrieved.
+ This exploits cache locality to make collision resolution less expensive.
+
+ (Contributed by Raymond Hettinger in :issue"`18771`.)
+
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* None yet.
+
+
+Deprecated
+==========
+
+Unsupported Operating Systems
+-----------------------------
+
+* OS/2
+* Windows 2000
+
+
+Deprecated Python modules, functions and methods
+------------------------------------------------
+
+* :meth:`difflib.SequenceMatcher.isbjunk` and
+ :meth:`difflib.SequenceMatcher.isbpopular` were removed: use ``x in sm.bjunk`` and
+ ``x in sm.bpopular``, where *sm* is a :class:`~difflib.SequenceMatcher` object.
+
+* :func:`importlib.util.module_for_loader` is pending deprecation. Using
+ :func:`importlib.util.module_to_load` and
+ :meth:`importlib.abc.Loader.init_module_attrs` allows subclasses of a loader
+ to more easily customize module loading.
+
+* The :mod:`imp` module is pending deprecation. To keep compatibility with
+ Python 2/3 code bases, the module's removal is currently not scheduled.
+
+
+Deprecated functions and types of the C API
+-------------------------------------------
+
+* None yet.
+
+
+Deprecated features
+-------------------
+
+* None yet.
+
+
+Porting to Python 3.4
+=====================
+
+This section lists previously described changes and other bugfixes
+that may require changes to your code.
+
+* The ABCs defined in :mod:`importlib.abc` now either raise the appropriate
+ exception or return a default value instead of raising
+ :exc:`NotImplementedError` blindly. This will only affect code calling
+ :func:`super` and falling through all the way to the ABCs. For compatibility,
+ catch both :exc:`NotImplementedError` or the appropriate exception as needed.
+
+* The module type now initializes the :attr:`__package__` and :attr:`__loader__`
+ attributes to ``None`` by default. To determine if these attributes were set
+ in a backwards-compatible fashion, use e.g.
+ ``getattr(module, '__loader__', None) is not None``.
+
+* :meth:`importlib.util.module_for_loader` now sets ``__loader__`` and
+ ``__package__`` unconditionally to properly support reloading. If this is not
+ desired then you will need to set these attributes manually. You can use
+ :func:`importlib.util.module_to_load` for module management.
+
+* Import now resets relevant attributes (e.g. ``__name__``, ``__loader__``,
+ ``__package__``, ``__file__``, ``__cached__``) unconditionally when reloading.
+
+* Frozen packages no longer set ``__path__`` to a list containg the package name
+ but an empty list instead. Determing if a module is a package should be done
+ using ``hasattr(module, '__path__')``.
+
+* :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg**
+ argument is not set. Previously only ``NULL`` was returned with no exception
+ set.
+
+* :func:`py_compile.compile` now raises :exc:`FileExistsError` if the file path
+ it would write to is a symlink or a non-regular file. This is to act as a
+ warning that import will overwrite those files with a regular file regardless
+ of what type of file path they were originally.
+
+* :meth:`importlib.abc.SourceLoader.get_source` no longer raises
+ :exc:`ImportError` when the source code being loaded triggers a
+ :exc:`SyntaxError` or :exc:`UnicodeDecodeError`. As :exc:`ImportError` is
+ meant to be raised only when source code cannot be found but it should, it was
+ felt to be over-reaching/overloading of that meaning when the source code is
+ found but improperly structured. If you were catching ImportError before and
+ wish to continue to ignore syntax or decoding issues, catch all three
+ exceptions now.
+
+* :func:`functools.update_wrapper` and :func:`functools.wraps` now correctly
+ set the ``__wrapped__`` attribute even if the wrapped function had a
+ wrapped attribute set. This means ``__wrapped__`` attributes now correctly
+ link a stack of decorated functions rather than every ``__wrapped__``
+ attribute in the chain referring to the innermost function. Introspection
+ libraries that assumed the previous behaviour was intentional can use
+ :func:`inspect.unwrap` to gain equivalent behaviour.
diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst
index bc1206b..29902e4 100644
--- a/Doc/whatsnew/index.rst
+++ b/Doc/whatsnew/index.rst
@@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release.
.. toctree::
:maxdepth: 2
+ 3.4.rst
3.3.rst
3.2.rst
3.1.rst
diff --git a/Include/Python-ast.h b/Include/Python-ast.h
index 00e92d0..67d677b 100644
--- a/Include/Python-ast.h
+++ b/Include/Python-ast.h
@@ -182,8 +182,9 @@ enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4,
SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11,
Yield_kind=12, YieldFrom_kind=13, Compare_kind=14,
Call_kind=15, Num_kind=16, Str_kind=17, Bytes_kind=18,
- Ellipsis_kind=19, Attribute_kind=20, Subscript_kind=21,
- Starred_kind=22, Name_kind=23, List_kind=24, Tuple_kind=25};
+ NameConstant_kind=19, Ellipsis_kind=20, Attribute_kind=21,
+ Subscript_kind=22, Starred_kind=23, Name_kind=24,
+ List_kind=25, Tuple_kind=26};
struct _expr {
enum _expr_kind kind;
union {
@@ -279,6 +280,10 @@ struct _expr {
} Bytes;
struct {
+ singleton value;
+ } NameConstant;
+
+ struct {
expr_ty value;
identifier attr;
expr_context_ty ctx;
@@ -359,18 +364,18 @@ struct _excepthandler {
struct _arguments {
asdl_seq *args;
- identifier vararg;
- expr_ty varargannotation;
+ arg_ty vararg;
asdl_seq *kwonlyargs;
- identifier kwarg;
- expr_ty kwargannotation;
- asdl_seq *defaults;
asdl_seq *kw_defaults;
+ arg_ty kwarg;
+ asdl_seq *defaults;
};
struct _arg {
identifier arg;
expr_ty annotation;
+ int lineno;
+ int col_offset;
};
struct _keyword {
@@ -509,6 +514,9 @@ expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena);
expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena);
#define Bytes(a0, a1, a2, a3) _Py_Bytes(a0, a1, a2, a3)
expr_ty _Py_Bytes(bytes s, int lineno, int col_offset, PyArena *arena);
+#define NameConstant(a0, a1, a2, a3) _Py_NameConstant(a0, a1, a2, a3)
+expr_ty _Py_NameConstant(singleton value, int lineno, int col_offset, PyArena
+ *arena);
#define Ellipsis(a0, a1, a2) _Py_Ellipsis(a0, a1, a2)
expr_ty _Py_Ellipsis(int lineno, int col_offset, PyArena *arena);
#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5)
@@ -542,11 +550,10 @@ comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq *
excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq *
body, int lineno, int col_offset, PyArena
*arena);
-#define arguments(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_arguments(a0, a1, a2, a3, a4, a5, a6, a7, a8)
-arguments_ty _Py_arguments(asdl_seq * args, identifier vararg, expr_ty
- varargannotation, asdl_seq * kwonlyargs, identifier
- kwarg, expr_ty kwargannotation, asdl_seq * defaults,
- asdl_seq * kw_defaults, PyArena *arena);
+#define arguments(a0, a1, a2, a3, a4, a5, a6) _Py_arguments(a0, a1, a2, a3, a4, a5, a6)
+arguments_ty _Py_arguments(asdl_seq * args, arg_ty vararg, asdl_seq *
+ kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg,
+ asdl_seq * defaults, PyArena *arena);
#define arg(a0, a1, a2) _Py_arg(a0, a1, a2)
arg_ty _Py_arg(identifier arg, expr_ty annotation, PyArena *arena);
#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2)
diff --git a/Include/abstract.h b/Include/abstract.h
index 44b5af7..6516bfe 100644
--- a/Include/abstract.h
+++ b/Include/abstract.h
@@ -284,7 +284,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
*/
PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object,
- char *format, ...);
+ const char *format, ...);
/*
Call a callable Python object, callable_object, with a
@@ -296,8 +296,9 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
*/
- PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *method,
- char *format, ...);
+ PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o,
+ const char *method,
+ const char *format, ...);
/*
Call the method named m of object o with a variable number of
@@ -308,8 +309,9 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
Python expression: o.method(args).
*/
- PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o, _Py_Identifier *method,
- char *format, ...);
+ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o,
+ _Py_Identifier *method,
+ const char *format, ...);
/*
Like PyObject_CallMethod, but expect a _Py_Identifier* as the
@@ -317,13 +319,16 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
*/
PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable,
- char *format, ...);
+ const char *format,
+ ...);
PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o,
- char *name,
- char *format, ...);
+ const char *name,
+ const char *format,
+ ...);
PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *o,
_Py_Identifier *name,
- char *format, ...);
+ const char *format,
+ ...);
PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable,
...);
@@ -339,11 +344,10 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs(PyObject *o,
PyObject *method, ...);
- PyAPI_FUNC(PyObject *) _PyObject_CallMethodObjIdArgs(PyObject *o,
+ PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs(PyObject *o,
struct _Py_Identifier *method,
...);
-
/*
Call the method named m of object o with a variable number of
C arguments. The C arguments are provided as PyObject *
@@ -404,8 +408,9 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
#define PyObject_Length PyObject_Size
#ifndef Py_LIMITED_API
- PyAPI_FUNC(Py_ssize_t) _PyObject_LengthHint(PyObject *o, Py_ssize_t);
+ PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o);
#endif
+PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t);
/*
Guess the size of object o using len(o) or o.__length_hint__().
diff --git a/Include/asdl.h b/Include/asdl.h
index 6bf618f..0789ad8 100644
--- a/Include/asdl.h
+++ b/Include/asdl.h
@@ -5,6 +5,7 @@ typedef PyObject * identifier;
typedef PyObject * string;
typedef PyObject * bytes;
typedef PyObject * object;
+typedef PyObject * singleton;
/* It would be nice if the code generated by asdl_c.py was completely
independent of Python, but it is a goal the requires too much work
diff --git a/Include/bytesobject.h b/Include/bytesobject.h
index d7c7ffd..0ee8d36 100644
--- a/Include/bytesobject.h
+++ b/Include/bytesobject.h
@@ -86,11 +86,11 @@ PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x);
0-terminated (passing a string with embedded NULL characters will
cause an exception). */
PyAPI_FUNC(int) PyBytes_AsStringAndSize(
- register PyObject *obj, /* string or Unicode object */
- register char **s, /* pointer to buffer variable */
- register Py_ssize_t *len /* pointer to length variable or NULL
- (only possible for 0-terminated
- strings) */
+ PyObject *obj, /* string or Unicode object */
+ char **s, /* pointer to buffer variable */
+ Py_ssize_t *len /* pointer to length variable or NULL
+ (only possible for 0-terminated
+ strings) */
);
/* Using the current locale, insert the thousands grouping
diff --git a/Include/dictobject.h b/Include/dictobject.h
index d89aac8..16bd1d6 100644
--- a/Include/dictobject.h
+++ b/Include/dictobject.h
@@ -53,6 +53,8 @@ PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key);
PyAPI_FUNC(PyObject *) PyDict_GetItemWithError(PyObject *mp, PyObject *key);
PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp,
struct _Py_Identifier *key);
+PyAPI_FUNC(PyObject *) PyDict_SetDefault(
+ PyObject *mp, PyObject *key, PyObject *defaultobj);
PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item);
PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key);
PyAPI_FUNC(void) PyDict_Clear(PyObject *mp);
diff --git a/Include/frameobject.h b/Include/frameobject.h
index 33f73af..18419bf 100644
--- a/Include/frameobject.h
+++ b/Include/frameobject.h
@@ -36,6 +36,8 @@ typedef struct _frame {
non-generator frames. See the save_exc_state and swap_exc_state
functions in ceval.c for details of their use. */
PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
+ /* Borrowed reference to a generator, or NULL */
+ PyObject *f_gen;
PyThreadState *f_tstate;
int f_lasti; /* Last instruction if called */
@@ -46,6 +48,7 @@ typedef struct _frame {
bytecode index. */
int f_lineno; /* Current line number */
int f_iblock; /* index in f_blockstack */
+ char f_executing; /* whether the frame is still executing */
PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
} PyFrameObject;
diff --git a/Include/genobject.h b/Include/genobject.h
index ed451ba..65f1ecf 100644
--- a/Include/genobject.h
+++ b/Include/genobject.h
@@ -36,6 +36,8 @@ PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *);
PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *);
PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
PyObject *_PyGen_Send(PyGenObject *, PyObject *);
+PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self);
+
#ifdef __cplusplus
}
diff --git a/Include/grammar.h b/Include/grammar.h
index 8426da3..862f6a8 100644
--- a/Include/grammar.h
+++ b/Include/grammar.h
@@ -76,7 +76,7 @@ dfa *PyGrammar_FindDFA(grammar *g, int type);
int addlabel(labellist *ll, int type, char *str);
int findlabel(labellist *ll, int type, char *str);
-char *PyGrammar_LabelRepr(label *lb);
+const char *PyGrammar_LabelRepr(label *lb);
void translatelabels(grammar *g);
void addfirstsets(grammar *g);
diff --git a/Include/import.h b/Include/import.h
index fdc2733..90049e0 100644
--- a/Include/import.h
+++ b/Include/import.h
@@ -113,15 +113,15 @@ PyAPI_FUNC(int) PyImport_AppendInittab(
#ifndef Py_LIMITED_API
struct _frozen {
- char *name; /* ASCII encoded string */
- unsigned char *code;
+ const char *name; /* ASCII encoded string */
+ const unsigned char *code;
int size;
};
/* Embedding apps may change this pointer to point to their favorite
collection of frozen modules: */
-PyAPI_DATA(struct _frozen *) PyImport_FrozenModules;
+PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules;
#endif
#ifdef __cplusplus
diff --git a/Include/longobject.h b/Include/longobject.h
index bcb93b9..24cf401 100644
--- a/Include/longobject.h
+++ b/Include/longobject.h
@@ -52,6 +52,19 @@ PyAPI_FUNC(PyObject *) PyLong_GetInfo(void);
#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
#endif /* SIZEOF_PID_T */
+#if SIZEOF_VOID_P == SIZEOF_INT
+# define _Py_PARSE_INTPTR "i"
+# define _Py_PARSE_UINTPTR "I"
+#elif SIZEOF_VOID_P == SIZEOF_LONG
+# define _Py_PARSE_INTPTR "l"
+# define _Py_PARSE_UINTPTR "k"
+#elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG
+# define _Py_PARSE_INTPTR "L"
+# define _Py_PARSE_UINTPTR "K"
+#else
+# error "void* different in size from int, long and long long"
+#endif /* SIZEOF_VOID_P */
+
/* Used by Python/mystrtoul.c. */
#ifndef Py_LIMITED_API
PyAPI_DATA(unsigned char) _PyLong_DigitValue[256];
diff --git a/Include/marshal.h b/Include/marshal.h
index e96d062..0c69655 100644
--- a/Include/marshal.h
+++ b/Include/marshal.h
@@ -7,7 +7,7 @@
extern "C" {
#endif
-#define Py_MARSHAL_VERSION 2
+#define Py_MARSHAL_VERSION 3
PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int);
PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int);
diff --git a/Include/modsupport.h b/Include/modsupport.h
index ecf1dcc..ab725f6 100644
--- a/Include/modsupport.h
+++ b/Include/modsupport.h
@@ -26,7 +26,7 @@ PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list);
/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */
#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...);
-PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...) Py_FORMAT_PARSETUPLE(PyArg_ParseTuple, 2, 3);
+PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);
PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
const char *, char **, ...);
PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *);
diff --git a/Include/object.h b/Include/object.h
index 387cadb..25b96e8 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -362,7 +362,7 @@ typedef struct _typeobject {
PyBufferProcs *tp_as_buffer;
/* Flags to define presence of optional/expanded features */
- long tp_flags;
+ unsigned long tp_flags;
const char *tp_doc; /* Documentation string */
@@ -408,6 +408,8 @@ typedef struct _typeobject {
/* Type attribute cache version tag. Added in version 2.6 */
unsigned int tp_version_tag;
+ destructor tp_finalize;
+
#ifdef COUNT_ALLOCS
/* these must be last and never explicitly initialized */
Py_ssize_t tp_allocs;
@@ -428,7 +430,7 @@ typedef struct{
const char* name;
int basicsize;
int itemsize;
- int flags;
+ unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
@@ -470,7 +472,7 @@ PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */
PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */
PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */
-PyAPI_FUNC(long) PyType_GetFlags(PyTypeObject*);
+PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*);
#define PyType_Check(op) \
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS)
@@ -529,6 +531,8 @@ PyAPI_FUNC(int) PyObject_Not(PyObject *);
PyAPI_FUNC(int) PyCallable_Check(PyObject *);
PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *);
+PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *);
+PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *);
/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes
dict as the last parameter. */
@@ -603,50 +607,55 @@ given type object has a specified feature.
*/
/* Set if the type object is dynamically allocated */
-#define Py_TPFLAGS_HEAPTYPE (1L<<9)
+#define Py_TPFLAGS_HEAPTYPE (1UL << 9)
/* Set if the type allows subclassing */
-#define Py_TPFLAGS_BASETYPE (1L<<10)
+#define Py_TPFLAGS_BASETYPE (1UL << 10)
/* Set if the type is 'ready' -- fully initialized */
-#define Py_TPFLAGS_READY (1L<<12)
+#define Py_TPFLAGS_READY (1UL << 12)
/* Set while the type is being 'readied', to prevent recursive ready calls */
-#define Py_TPFLAGS_READYING (1L<<13)
+#define Py_TPFLAGS_READYING (1UL << 13)
/* Objects support garbage collection (see objimp.h) */
-#define Py_TPFLAGS_HAVE_GC (1L<<14)
+#define Py_TPFLAGS_HAVE_GC (1UL << 14)
/* These two bits are preserved for Stackless Python, next after this is 17 */
#ifdef STACKLESS
-#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3L<<15)
+#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3UL << 15)
#else
#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0
#endif
/* Objects support type attribute cache */
-#define Py_TPFLAGS_HAVE_VERSION_TAG (1L<<18)
-#define Py_TPFLAGS_VALID_VERSION_TAG (1L<<19)
+#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18)
+#define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19)
/* Type is abstract and cannot be instantiated */
-#define Py_TPFLAGS_IS_ABSTRACT (1L<<20)
+#define Py_TPFLAGS_IS_ABSTRACT (1UL << 20)
/* These flags are used to determine if a type is a subclass. */
-#define Py_TPFLAGS_INT_SUBCLASS (1L<<23)
-#define Py_TPFLAGS_LONG_SUBCLASS (1L<<24)
-#define Py_TPFLAGS_LIST_SUBCLASS (1L<<25)
-#define Py_TPFLAGS_TUPLE_SUBCLASS (1L<<26)
-#define Py_TPFLAGS_BYTES_SUBCLASS (1L<<27)
-#define Py_TPFLAGS_UNICODE_SUBCLASS (1L<<28)
-#define Py_TPFLAGS_DICT_SUBCLASS (1L<<29)
-#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1L<<30)
-#define Py_TPFLAGS_TYPE_SUBCLASS (1L<<31)
+#define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24)
+#define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25)
+#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26)
+#define Py_TPFLAGS_BYTES_SUBCLASS (1UL << 27)
+#define Py_TPFLAGS_UNICODE_SUBCLASS (1UL << 28)
+#define Py_TPFLAGS_DICT_SUBCLASS (1UL << 29)
+#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1UL << 30)
+#define Py_TPFLAGS_TYPE_SUBCLASS (1UL << 31)
#define Py_TPFLAGS_DEFAULT ( \
Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \
Py_TPFLAGS_HAVE_VERSION_TAG | \
0)
+/* NOTE: The following flags reuse lower bits (removed as part of the
+ * Python 3.0 transition). */
+
+/* Type structure has tp_finalize member (3.4) */
+#define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0)
+
#ifdef Py_LIMITED_API
#define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0)
#else
@@ -681,12 +690,6 @@ is not considered to be a reference to the type object, to save
complications in the deallocation function. (This is actually a
decision that's up to the implementer of each new type so if you want,
you can count such references to the type object.)
-
-*** WARNING*** The Py_DECREF macro must have a side-effect-free argument
-since it may evaluate its argument multiple times. (The alternative
-would be to mace it a proper function or assign it to a global temporary
-variable first, both of which are slower; and in a multi-threaded
-environment the global variable trick is not safe.)
*/
/* First define a pile of simple helper macros, one set per special
@@ -765,15 +768,16 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
#define Py_INCREF(op) ( \
_Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \
- ((PyObject*)(op))->ob_refcnt++)
+ ((PyObject *)(op))->ob_refcnt++)
#define Py_DECREF(op) \
do { \
+ PyObject *_py_decref_tmp = (PyObject *)(op); \
if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \
- --((PyObject*)(op))->ob_refcnt != 0) \
- _Py_CHECK_REFCNT(op) \
+ --(_py_decref_tmp)->ob_refcnt != 0) \
+ _Py_CHECK_REFCNT(_py_decref_tmp) \
else \
- _Py_Dealloc((PyObject *)(op)); \
+ _Py_Dealloc(_py_decref_tmp); \
} while (0)
/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear
@@ -812,16 +816,27 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
*/
#define Py_CLEAR(op) \
do { \
- if (op) { \
- PyObject *_py_tmp = (PyObject *)(op); \
+ PyObject *_py_tmp = (PyObject *)(op); \
+ if (_py_tmp != NULL) { \
(op) = NULL; \
Py_DECREF(_py_tmp); \
} \
} while (0)
/* Macros to use in case the object pointer may be NULL: */
-#define Py_XINCREF(op) do { if ((op) == NULL) ; else Py_INCREF(op); } while (0)
-#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0)
+#define Py_XINCREF(op) \
+ do { \
+ PyObject *_py_xincref_tmp = (PyObject *)(op); \
+ if (_py_xincref_tmp != NULL) \
+ Py_INCREF(_py_xincref_tmp); \
+ } while (0)
+
+#define Py_XDECREF(op) \
+ do { \
+ PyObject *_py_xdecref_tmp = (PyObject *)(op); \
+ if (_py_xdecref_tmp != NULL) \
+ Py_DECREF(_py_xdecref_tmp); \
+ } while (0)
/*
These are provided as conveniences to Python runtime embedders, so that
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 3d5f509..264c120 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -94,51 +94,27 @@ PyObject_{New, NewVar, Del}.
the object gets initialized via PyObject_{Init, InitVar} after obtaining
the raw memory.
*/
-PyAPI_FUNC(void *) PyObject_Malloc(size_t);
-PyAPI_FUNC(void *) PyObject_Realloc(void *, size_t);
-PyAPI_FUNC(void) PyObject_Free(void *);
+PyAPI_FUNC(void *) PyObject_Malloc(size_t size);
+PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size);
+PyAPI_FUNC(void) PyObject_Free(void *ptr);
+/* This function returns the number of allocated memory blocks, regardless of size */
+PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void);
/* Macros */
#ifdef WITH_PYMALLOC
#ifndef Py_LIMITED_API
PyAPI_FUNC(void) _PyObject_DebugMallocStats(FILE *out);
#endif /* #ifndef Py_LIMITED_API */
-#ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */
-PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes);
-PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes);
-PyAPI_FUNC(void) _PyObject_DebugFree(void *p);
-PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p);
-PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p);
-PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes);
-PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes);
-PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p);
-PyAPI_FUNC(void) _PyObject_DebugCheckAddressApi(char api, const void *p);
-PyAPI_FUNC(void *) _PyMem_DebugMalloc(size_t nbytes);
-PyAPI_FUNC(void *) _PyMem_DebugRealloc(void *p, size_t nbytes);
-PyAPI_FUNC(void) _PyMem_DebugFree(void *p);
-#define PyObject_MALLOC _PyObject_DebugMalloc
-#define PyObject_Malloc _PyObject_DebugMalloc
-#define PyObject_REALLOC _PyObject_DebugRealloc
-#define PyObject_Realloc _PyObject_DebugRealloc
-#define PyObject_FREE _PyObject_DebugFree
-#define PyObject_Free _PyObject_DebugFree
-
-#else /* WITH_PYMALLOC && ! PYMALLOC_DEBUG */
+#endif
+
+/* Macros */
#define PyObject_MALLOC PyObject_Malloc
#define PyObject_REALLOC PyObject_Realloc
#define PyObject_FREE PyObject_Free
-#endif
-
-#else /* ! WITH_PYMALLOC */
-#define PyObject_MALLOC PyMem_MALLOC
-#define PyObject_REALLOC PyMem_REALLOC
-#define PyObject_FREE PyMem_FREE
-
-#endif /* WITH_PYMALLOC */
-
#define PyObject_Del PyObject_Free
-#define PyObject_DEL PyObject_FREE
+#define PyObject_DEL PyObject_Free
+
/*
* Generic object allocator interface
@@ -222,6 +198,26 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
constructor you would start directly with PyObject_Init/InitVar
*/
+#ifndef Py_LIMITED_API
+typedef struct {
+ /* user context passed as the first argument to the 2 functions */
+ void *ctx;
+
+ /* allocate an arena of size bytes */
+ void* (*alloc) (void *ctx, size_t size);
+
+ /* free an arena */
+ void (*free) (void *ctx, void *ptr, size_t size);
+} PyObjectArenaAllocator;
+
+/* Get the arena allocator. */
+PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator);
+
+/* Set the arena allocator. */
+PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator);
+#endif
+
+
/*
* Garbage Collection Support
* ==========================
@@ -230,6 +226,10 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
/* C equivalent of gc.collect(). */
PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void);
+#endif
+
/* Test if a type has a GC head */
#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
@@ -249,13 +249,37 @@ typedef union _gc_head {
union _gc_head *gc_prev;
Py_ssize_t gc_refs;
} gc;
- long double dummy; /* force worst-case alignment */
+ double dummy; /* force worst-case alignment */
} PyGC_Head;
extern PyGC_Head *_PyGC_generation0;
#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1)
+/* Bit 0 is set when tp_finalize is called */
+#define _PyGC_REFS_MASK_FINALIZED (1 << 0)
+/* The (N-1) most significant bits contain the gc state / refcount */
+#define _PyGC_REFS_SHIFT (1)
+#define _PyGC_REFS_MASK (((size_t) -1) << _PyGC_REFS_SHIFT)
+
+#define _PyGCHead_REFS(g) ((g)->gc.gc_refs >> _PyGC_REFS_SHIFT)
+#define _PyGCHead_SET_REFS(g, v) do { \
+ (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK) \
+ | (v << _PyGC_REFS_SHIFT); \
+ } while (0)
+#define _PyGCHead_DECREF(g) ((g)->gc.gc_refs -= 1 << _PyGC_REFS_SHIFT)
+
+#define _PyGCHead_FINALIZED(g) (((g)->gc.gc_refs & _PyGC_REFS_MASK_FINALIZED) != 0)
+#define _PyGCHead_SET_FINALIZED(g, v) do { \
+ (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK_FINALIZED) \
+ | (v != 0); \
+ } while (0)
+
+#define _PyGC_FINALIZED(o) _PyGCHead_FINALIZED(_Py_AS_GC(o))
+#define _PyGC_SET_FINALIZED(o, v) _PyGCHead_SET_FINALIZED(_Py_AS_GC(o), v)
+
+#define _PyGC_REFS(o) _PyGCHead_REFS(_Py_AS_GC(o))
+
#define _PyGC_REFS_UNTRACKED (-2)
#define _PyGC_REFS_REACHABLE (-3)
#define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4)
@@ -264,9 +288,9 @@ extern PyGC_Head *_PyGC_generation0;
* collector it must be safe to call the ob_traverse method. */
#define _PyObject_GC_TRACK(o) do { \
PyGC_Head *g = _Py_AS_GC(o); \
- if (g->gc.gc_refs != _PyGC_REFS_UNTRACKED) \
+ if (_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED) \
Py_FatalError("GC object already tracked"); \
- g->gc.gc_refs = _PyGC_REFS_REACHABLE; \
+ _PyGCHead_SET_REFS(g, _PyGC_REFS_REACHABLE); \
g->gc.gc_next = _PyGC_generation0; \
g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \
g->gc.gc_prev->gc.gc_next = g; \
@@ -279,8 +303,8 @@ extern PyGC_Head *_PyGC_generation0;
*/
#define _PyObject_GC_UNTRACK(o) do { \
PyGC_Head *g = _Py_AS_GC(o); \
- assert(g->gc.gc_refs != _PyGC_REFS_UNTRACKED); \
- g->gc.gc_refs = _PyGC_REFS_UNTRACKED; \
+ assert(_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED); \
+ _PyGCHead_SET_REFS(g, _PyGC_REFS_UNTRACKED); \
g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \
g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \
g->gc.gc_next = NULL; \
@@ -288,7 +312,7 @@ extern PyGC_Head *_PyGC_generation0;
/* True if the object is currently tracked by the GC. */
#define _PyObject_GC_IS_TRACKED(o) \
- ((_Py_AS_GC(o))->gc.gc_refs != _PyGC_REFS_UNTRACKED)
+ (_PyGC_REFS(o) != _PyGC_REFS_UNTRACKED)
/* True if the object may be tracked by the GC in the future, or already is.
This can be useful to implement some optimizations. */
diff --git a/Include/opcode.h b/Include/opcode.h
index a90184d..0936f2d 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -49,7 +49,6 @@ extern "C" {
#define BINARY_OR 66
#define INPLACE_POWER 67
#define GET_ITER 68
-#define STORE_LOCALS 69
#define PRINT_EXPR 70
#define LOAD_BUILD_CLASS 71
#define YIELD_FROM 72
@@ -140,6 +139,7 @@ extern "C" {
#define SET_ADD 146
#define MAP_ADD 147
+#define LOAD_CLASSDEREF 148
/* EXCEPT_HANDLER is a special, implicit block type which is created when
entering an except handler. It is not an opcode but we define it here
diff --git a/Include/osdefs.h b/Include/osdefs.h
index 05c0c8e..0c2e34b 100644
--- a/Include/osdefs.h
+++ b/Include/osdefs.h
@@ -9,16 +9,10 @@ extern "C" {
/* Mod by chrish: QNX has WATCOM, but isn't DOS */
#if !defined(__QNX__)
-#if defined(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__) || defined(PYOS_OS2)
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-#define MAXPATHLEN 260
-#define SEP L'/'
-#define ALTSEP L'\\'
-#else
+#if defined(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__)
#define SEP L'\\'
#define ALTSEP L'/'
#define MAXPATHLEN 256
-#endif
#define DELIM L';'
#endif
#endif
diff --git a/Include/patchlevel.h b/Include/patchlevel.h
index bfd67a5..5cb0c75 100644
--- a/Include/patchlevel.h
+++ b/Include/patchlevel.h
@@ -17,13 +17,13 @@
/* Version parsed out into numeric values */
/*--start constants--*/
#define PY_MAJOR_VERSION 3
-#define PY_MINOR_VERSION 3
-#define PY_MICRO_VERSION 2
-#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL
-#define PY_RELEASE_SERIAL 0
+#define PY_MINOR_VERSION 4
+#define PY_MICRO_VERSION 0
+#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA
+#define PY_RELEASE_SERIAL 1
/* Version as a string */
-#define PY_VERSION "3.3.2+"
+#define PY_VERSION "3.4.0a1+"
/*--end constants--*/
/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
diff --git a/Include/pydebug.h b/Include/pydebug.h
index 97c2f8c..8fe9818 100644
--- a/Include/pydebug.h
+++ b/Include/pydebug.h
@@ -20,6 +20,7 @@ PyAPI_DATA(int) Py_DontWriteBytecodeFlag;
PyAPI_DATA(int) Py_NoUserSiteDirectory;
PyAPI_DATA(int) Py_UnbufferedStdioFlag;
PyAPI_DATA(int) Py_HashRandomizationFlag;
+PyAPI_DATA(int) Py_IsolatedFlag;
/* this is a wrapper around getenv() that pays attention to
Py_IgnoreEnvironmentFlag. It should be used for getting variables like
diff --git a/Include/pymem.h b/Include/pymem.h
index 10b5bea..83f1537 100644
--- a/Include/pymem.h
+++ b/Include/pymem.h
@@ -11,6 +11,11 @@
extern "C" {
#endif
+PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size);
+PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size);
+PyAPI_FUNC(void) PyMem_RawFree(void *ptr);
+
+
/* BEWARE:
Each interface exports both functions and macros. Extension modules should
@@ -49,21 +54,14 @@ extern "C" {
performed on failure (no exception is set, no warning is printed, etc).
*/
-PyAPI_FUNC(void *) PyMem_Malloc(size_t);
-PyAPI_FUNC(void *) PyMem_Realloc(void *, size_t);
-PyAPI_FUNC(void) PyMem_Free(void *);
+PyAPI_FUNC(void *) PyMem_Malloc(size_t size);
+PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size);
+PyAPI_FUNC(void) PyMem_Free(void *ptr);
-/* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are
- no longer supported. They used to call PyErr_NoMemory() on failure. */
+PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str);
+PyAPI_FUNC(char *) _PyMem_Strdup(const char *str);
/* Macros. */
-#ifdef PYMALLOC_DEBUG
-/* Redirect all memory operations to Python's debugging allocator. */
-#define PyMem_MALLOC _PyMem_DebugMalloc
-#define PyMem_REALLOC _PyMem_DebugRealloc
-#define PyMem_FREE _PyMem_DebugFree
-
-#else /* ! PYMALLOC_DEBUG */
/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL
for malloc(0), which would be treated as an error. Some platforms
@@ -71,13 +69,9 @@ PyAPI_FUNC(void) PyMem_Free(void *);
pymalloc. To solve these problems, allocate an extra byte. */
/* Returns NULL to indicate error if a negative size or size larger than
Py_ssize_t can represent is supplied. Helps prevents security holes. */
-#define PyMem_MALLOC(n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
- : malloc((n) ? (n) : 1))
-#define PyMem_REALLOC(p, n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
- : realloc((p), (n) ? (n) : 1))
-#define PyMem_FREE free
-
-#endif /* PYMALLOC_DEBUG */
+#define PyMem_MALLOC(n) PyMem_Malloc(n)
+#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n)
+#define PyMem_FREE(p) PyMem_Free(p)
/*
* Type-oriented memory interface
@@ -115,6 +109,69 @@ PyAPI_FUNC(void) PyMem_Free(void *);
#define PyMem_Del PyMem_Free
#define PyMem_DEL PyMem_FREE
+#ifndef Py_LIMITED_API
+typedef enum {
+ /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */
+ PYMEM_DOMAIN_RAW,
+
+ /* PyMem_Malloc(), PyMem_Realloc() and PyMem_Free() */
+ PYMEM_DOMAIN_MEM,
+
+ /* PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() */
+ PYMEM_DOMAIN_OBJ
+} PyMemAllocatorDomain;
+
+typedef struct {
+ /* user context passed as the first argument to the 3 functions */
+ void *ctx;
+
+ /* allocate a memory block */
+ void* (*malloc) (void *ctx, size_t size);
+
+ /* allocate or resize a memory block */
+ void* (*realloc) (void *ctx, void *ptr, size_t new_size);
+
+ /* release a memory block */
+ void (*free) (void *ctx, void *ptr);
+} PyMemAllocator;
+
+/* Get the memory block allocator of the specified domain. */
+PyAPI_FUNC(void) PyMem_GetAllocator(PyMemAllocatorDomain domain,
+ PyMemAllocator *allocator);
+
+/* Set the memory block allocator of the specified domain.
+
+ The new allocator must return a distinct non-NULL pointer when requesting
+ zero bytes.
+
+ For the PYMEM_DOMAIN_RAW domain, the allocator must be thread-safe: the GIL
+ is not held when the allocator is called.
+
+ If the new allocator is not a hook (don't call the previous allocator), the
+ PyMem_SetupDebugHooks() function must be called to reinstall the debug hooks
+ on top on the new allocator. */
+PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain,
+ PyMemAllocator *allocator);
+
+/* Setup hooks to detect bugs in the following Python memory allocator
+ functions:
+
+ - PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree()
+ - PyMem_Malloc(), PyMem_Realloc(), PyMem_Free()
+ - PyObject_Malloc(), PyObject_Realloc() and PyObject_Free()
+
+ Newly allocated memory is filled with the byte 0xCB, freed memory is filled
+ with the byte 0xDB. Additionnal checks:
+
+ - detect API violations, ex: PyObject_Free() called on a buffer allocated
+ by PyMem_Malloc()
+ - detect write before the start of the buffer (buffer underflow)
+ - detect write after the end of the buffer (buffer overflow)
+
+ The function does nothing if Python is not compiled is debug mode. */
+PyAPI_FUNC(void) PyMem_SetupDebugHooks(void);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/pyport.h b/Include/pyport.h
index e4e3601..acb6d5d 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -219,10 +219,6 @@ typedef size_t Py_uhash_t;
/* Smallest negative value of type Py_ssize_t. */
#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
-#if SIZEOF_PID_T > SIZEOF_LONG
-# error "Python doesn't support sizeof(pid_t) > sizeof(long)"
-#endif
-
/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
* format to convert an argument with the width of a size_t or Py_ssize_t.
* C99 introduced "z" for this purpose, but not all platforms support that;
@@ -267,7 +263,7 @@ typedef size_t Py_uhash_t;
*/
#ifdef HAVE_LONG_LONG
# ifndef PY_FORMAT_LONG_LONG
-# if defined(MS_WIN64) || defined(MS_WINDOWS)
+# ifdef MS_WINDOWS
# define PY_FORMAT_LONG_LONG "I64"
# else
# error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG"
@@ -392,17 +388,20 @@ typedef size_t Py_uhash_t;
#endif
#ifdef HAVE_SYS_STAT_H
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-#include <sys/types.h>
-#endif
#include <sys/stat.h>
#elif defined(HAVE_STAT_H)
#include <stat.h>
#endif
-#if defined(PYCC_VACPP)
+#ifndef S_IFMT
/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
-#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
+#define S_IFMT 0170000
+#endif
+
+#ifndef S_IFLNK
+/* Windows doesn't define S_IFLNK but posixmodule.c maps
+ * IO_REPARSE_TAG_SYMLINK to S_IFLNK */
+# define S_IFLNK 0120000
#endif
#ifndef S_ISREG
@@ -413,6 +412,9 @@ typedef size_t Py_uhash_t;
#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
#endif
+#ifndef S_ISCHR
+#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR)
+#endif
#ifdef __cplusplus
/* Move this down here since some C++ #include's don't like to be included
@@ -835,15 +837,6 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
#endif
/*
- * Add PyArg_ParseTuple format where available.
- */
-#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE
-#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2)))
-#else
-#define Py_FORMAT_PARSETUPLE(func,p1,p2)
-#endif
-
-/*
* Specify alignment on compilers that support it.
*/
#if defined(__GNUC__) && __GNUC__ >= 3
@@ -881,4 +874,18 @@ extern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
#endif
#endif
+/*
+ * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is
+ * detected by configure and defined in pyconfig.h. The code in pyconfig.h
+ * also takes care of Apple's universal builds.
+ */
+
+#ifdef WORDS_BIGENDIAN
+#define PY_BIG_ENDIAN 1
+#define PY_LITTLE_ENDIAN 0
+#else
+#define PY_BIG_ENDIAN 0
+#define PY_LITTLE_ENDIAN 1
+#endif
+
#endif /* Py_PYPORT_H */
diff --git a/Include/pystate.h b/Include/pystate.h
index 2017b02..e41fe4c 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -69,6 +69,7 @@ typedef struct _ts PyThreadState;
typedef struct _ts {
/* See Python/ceval.c for comments explaining most fields */
+ struct _ts *prev;
struct _ts *next;
PyInterpreterState *interp;
@@ -133,12 +134,16 @@ PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*);
#endif
PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void) _PyState_ClearModules(void);
+#endif
PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);
PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *);
PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
+PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate);
#ifdef WITH_THREAD
PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
PyAPI_FUNC(void) _PyGILState_Reinit(void);
@@ -212,6 +217,11 @@ PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
*/
PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
+/* Helper/diagnostic function - return 1 if the current thread
+ * currently holds the GIL, 0 otherwise
+ */
+PyAPI_FUNC(int) PyGILState_Check(void);
+
#endif /* #ifdef WITH_THREAD */
/* The implementation of sys._current_frames() Returns a dict mapping
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index e8a582d..1a40b06 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -197,7 +197,7 @@ PyAPI_FUNC(void) _PyImport_Init(void);
PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
PyAPI_FUNC(void) _PyImportHooks_Init(void);
PyAPI_FUNC(int) _PyFrame_Init(void);
-PyAPI_FUNC(void) _PyFloat_Init(void);
+PyAPI_FUNC(int) _PyFloat_Init(void);
PyAPI_FUNC(int) PyByteArray_Init(void);
PyAPI_FUNC(void) _PyRandom_Init(void);
#endif
@@ -217,6 +217,7 @@ PyAPI_FUNC(void) PyBytes_Fini(void);
PyAPI_FUNC(void) PyByteArray_Fini(void);
PyAPI_FUNC(void) PyFloat_Fini(void);
PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
+PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void);
PyAPI_FUNC(void) _PyGC_Fini(void);
PyAPI_FUNC(void) PySlice_Fini(void);
PyAPI_FUNC(void) _PyType_Fini(void);
diff --git a/Include/setobject.h b/Include/setobject.h
index a14874b..cbb21a1 100644
--- a/Include/setobject.h
+++ b/Include/setobject.h
@@ -23,8 +23,8 @@ no meaning otherwise.
typedef struct {
/* Cached hash code of the key. */
- Py_hash_t hash;
PyObject *key;
+ Py_hash_t hash;
} setentry;
@@ -51,9 +51,9 @@ struct _setobject {
*/
setentry *table;
setentry *(*lookup)(PySetObject *so, PyObject *key, Py_hash_t hash);
+ Py_hash_t hash; /* only used by frozenset objects */
setentry smalltable[PySet_MINSIZE];
- Py_hash_t hash; /* only used by frozenset objects */
PyObject *weakreflist; /* List of weak references */
};
#endif /* Py_LIMITED_API */
diff --git a/Include/sliceobject.h b/Include/sliceobject.h
index 8bec179..f7ee90c 100644
--- a/Include/sliceobject.h
+++ b/Include/sliceobject.h
@@ -34,6 +34,9 @@ PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop,
PyObject* step);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop);
+PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
+ PyObject **start_ptr, PyObject **stop_ptr,
+ PyObject **step_ptr);
#endif
PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
diff --git a/Include/structseq.h b/Include/structseq.h
index 30c52ac..af22716 100644
--- a/Include/structseq.h
+++ b/Include/structseq.h
@@ -24,6 +24,8 @@ extern char* PyStructSequence_UnnamedField;
#ifndef Py_LIMITED_API
PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type,
PyStructSequence_Desc *desc);
+PyAPI_FUNC(int) PyStructSequence_InitType2(PyTypeObject *type,
+ PyStructSequence_Desc *desc);
#endif
PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc);
diff --git a/Include/symtable.h b/Include/symtable.h
index 6ed3a2b..44535d0 100644
--- a/Include/symtable.h
+++ b/Include/symtable.h
@@ -41,6 +41,7 @@ typedef struct _symtable_entry {
PyObject *ste_name; /* string: name of current block */
PyObject *ste_varnames; /* list of function parameters */
PyObject *ste_children; /* list of child blocks */
+ PyObject *ste_directives;/* locations of global and nonlocal statements */
_Py_block_ty ste_type; /* module, class, or function */
int ste_unoptimized; /* false if namespace is optimized */
int ste_nested; /* true if block is nested */
@@ -52,6 +53,9 @@ typedef struct _symtable_entry {
unsigned ste_varkeywords : 1; /* true if block has varkeywords */
unsigned ste_returns_value : 1; /* true if namespace uses return with
an argument */
+ unsigned ste_needs_class_closure : 1; /* for class scopes, true if a
+ closure over __class__
+ should be created */
int ste_lineno; /* first line of block */
int ste_col_offset; /* offset of first line of block */
int ste_opt_lineno; /* lineno of last exec or import * */
diff --git a/Include/token.h b/Include/token.h
index f7f6504..905022b 100644
--- a/Include/token.h
+++ b/Include/token.h
@@ -75,7 +75,7 @@ extern "C" {
#define ISEOF(x) ((x) == ENDMARKER)
-PyAPI_DATA(char *) _PyParser_TokenNames[]; /* Token names */
+PyAPI_DATA(const char *) _PyParser_TokenNames[]; /* Token names */
PyAPI_FUNC(int) PyToken_OneChar(int);
PyAPI_FUNC(int) PyToken_TwoChars(int, int);
PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int);
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index a8f5b5d..6d830c0 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -180,9 +180,9 @@ typedef unsigned char Py_UCS1;
} while (0)
/* macros to work with surrogates */
-#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= ch && ch <= 0xDFFF)
-#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= ch && ch <= 0xDBFF)
-#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= ch && ch <= 0xDFFF)
+#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF)
+#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDBFF)
+#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= (ch) && (ch) <= 0xDFFF)
/* Join two surrogate characters and return a single Py_UCS4 value. */
#define Py_UNICODE_JOIN_SURROGATES(high, low) \
(((((Py_UCS4)(high) & 0x03FF) << 10) | \
@@ -859,7 +859,7 @@ PyAPI_FUNC(int) PyUnicode_Resize(
*/
PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject(
- register PyObject *obj, /* Object */
+ PyObject *obj, /* Object */
const char *encoding, /* encoding */
const char *errors /* error handling */
);
@@ -878,7 +878,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject(
*/
PyAPI_FUNC(PyObject*) PyUnicode_FromObject(
- register PyObject *obj /* Object */
+ PyObject *obj /* Object */
);
PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV(
@@ -898,22 +898,28 @@ typedef struct {
Py_UCS4 maxchar;
Py_ssize_t size;
Py_ssize_t pos;
- /* minimum length of the buffer when overallocation is enabled,
- see _PyUnicodeWriter_Init() */
+
+ /* minimum number of allocated characters (default: 0) */
Py_ssize_t min_length;
+
+ /* minimum character (default: 127, ASCII) */
+ Py_UCS4 min_char;
+
+ /* If non-zero, overallocate the buffer by 25% (default: 0). */
unsigned char overallocate;
+
/* If readonly is 1, buffer is a shared string (cannot be modified)
and size is set to 0. */
unsigned char readonly;
} _PyUnicodeWriter ;
/* Initialize a Unicode writer.
-
- If min_length is greater than zero, _PyUnicodeWriter_Prepare()
- overallocates the buffer and min_length is the minimum length in characters
- of the buffer. */
+ *
+ * By default, the minimum buffer size is 0 character and overallocation is
+ * disabled. Set min_length, min_char and overallocate attributes to control
+ * the allocation of the buffer. */
PyAPI_FUNC(void)
-_PyUnicodeWriter_Init(_PyUnicodeWriter *writer, Py_ssize_t min_length);
+_PyUnicodeWriter_Init(_PyUnicodeWriter *writer);
/* Prepare the buffer to write 'length' characters
with the specified maximum character.
@@ -933,12 +939,44 @@ PyAPI_FUNC(int)
_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
Py_ssize_t length, Py_UCS4 maxchar);
+/* Append a Unicode character.
+ Return 0 on success, raise an exception and return -1 on error. */
+PyAPI_FUNC(int)
+_PyUnicodeWriter_WriteChar(_PyUnicodeWriter *writer,
+ Py_UCS4 ch
+ );
+
+/* Append a Unicode string.
+ Return 0 on success, raise an exception and return -1 on error. */
+PyAPI_FUNC(int)
+_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer,
+ PyObject *str /* Unicode string */
+ );
+
+/* Append a substring of a Unicode string.
+ Return 0 on success, raise an exception and return -1 on error. */
PyAPI_FUNC(int)
-_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str);
+_PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer,
+ PyObject *str, /* Unicode string */
+ Py_ssize_t start,
+ Py_ssize_t end
+ );
+/* Append a latin1-encoded byte string.
+ Return 0 on success, raise an exception and return -1 on error. */
+PyAPI_FUNC(int)
+_PyUnicodeWriter_WriteCstr(_PyUnicodeWriter *writer,
+ const char *str, /* latin1-encoded byte string */
+ Py_ssize_t len /* length in bytes */
+ );
+
+/* Get the value of the writer as an Unicode string. Clear the
+ buffer of the writer. Raise an exception and return NULL
+ on error. */
PyAPI_FUNC(PyObject *)
_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer);
+/* Deallocate memory of a writer (clear its internal buffer). */
PyAPI_FUNC(void)
_PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer);
#endif
@@ -977,7 +1015,7 @@ PyAPI_FUNC(void) _Py_ReleaseInternedUnicodeStrings(void);
The buffer is copied into the new object. */
PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar(
- register const wchar_t *w, /* wchar_t buffer */
+ const wchar_t *w, /* wchar_t buffer */
Py_ssize_t size /* size of buffer */
);
@@ -995,7 +1033,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar(
PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar(
PyObject *unicode, /* Unicode object */
- register wchar_t *w, /* wchar_t buffer */
+ wchar_t *w, /* wchar_t buffer */
Py_ssize_t size /* size of buffer */
);
@@ -1726,7 +1764,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocale(
/* Encode a Unicode object to the current locale encoding. The encoder is
strict is *surrogateescape* is equal to zero, otherwise the
"surrogateescape" error handler is used. Return a bytes object. The string
- cannot contain embedded null characters.. */
+ cannot contain embedded null characters. */
PyAPI_FUNC(PyObject*) PyUnicode_EncodeLocale(
PyObject *unicode,
@@ -1950,7 +1988,8 @@ PyAPI_FUNC(PyObject *) PyUnicode_Replace(
);
/* Compare two strings and return -1, 0, 1 for less than, equal,
- greater than resp. */
+ greater than resp.
+ Raise an exception and return -1 on error. */
PyAPI_FUNC(int) PyUnicode_Compare(
PyObject *left, /* Left string */
diff --git a/Include/warnings.h b/Include/warnings.h
index b7db681..5a7dfb1 100644
--- a/Include/warnings.h
+++ b/Include/warnings.h
@@ -25,6 +25,12 @@ PyAPI_FUNC(int) PyErr_WarnExplicit(
const char *module, /* UTF-8 encoded string */
PyObject *registry);
+PyAPI_FUNC(int)
+PyErr_WarnExplicitFormat(PyObject *category,
+ const char *filename, int lineno,
+ const char *module, PyObject *registry,
+ const char *format, ...);
+
/* DEPRECATED: Use PyErr_WarnEx() instead. */
#ifndef Py_LIMITED_API
#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1)
diff --git a/LICENSE b/LICENSE
index 6cbd963..c9cb72c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -77,6 +77,7 @@ the various releases.
3.2.4 3.2.3 2013 PSF yes
3.3.0 3.2 2012 PSF yes
3.3.1 3.3.0 2013 PSF yes
+ 3.4.0 3.3.0 2014 PSF yes
Footnotes:
diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py
index 66566d0..3c11943 100644
--- a/Lib/_osx_support.py
+++ b/Lib/_osx_support.py
@@ -38,7 +38,7 @@ def _find_executable(executable, path=None):
paths = path.split(os.pathsep)
base, ext = os.path.splitext(executable)
- if (sys.platform == 'win32' or os.name == 'os2') and (ext != '.exe'):
+ if (sys.platform == 'win32') and (ext != '.exe'):
executable = executable + '.exe'
if not os.path.isfile(executable):
@@ -94,7 +94,7 @@ def _get_system_version():
_SYSTEM_VERSION = ''
try:
f = open('/System/Library/CoreServices/SystemVersion.plist')
- except IOError:
+ except OSError:
# We're on a plain darwin box, fall back to the default
# behaviour.
pass
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index aab60db..137ebcb 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -34,7 +34,7 @@ BlockingIOError = BlockingIOError
def open(file, mode="r", buffering=-1, encoding=None, errors=None,
newline=None, closefd=True, opener=None):
- r"""Open file and return a stream. Raise IOError upon failure.
+ r"""Open file and return a stream. Raise OSError upon failure.
file is either a text or byte string giving the name (and the path
if the file isn't in the current working directory) of the file to
@@ -200,7 +200,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
buffering = DEFAULT_BUFFER_SIZE
try:
bs = os.fstat(raw.fileno()).st_blksize
- except (os.error, AttributeError):
+ except (OSError, AttributeError):
pass
else:
if bs > 1:
@@ -254,7 +254,7 @@ class OpenWrapper:
try:
UnsupportedOperation = io.UnsupportedOperation
except AttributeError:
- class UnsupportedOperation(ValueError, IOError):
+ class UnsupportedOperation(ValueError, OSError):
pass
@@ -278,7 +278,7 @@ class IOBase(metaclass=abc.ABCMeta):
readinto) needed. Text I/O classes work with str data.
Note that calling any method (even inquiries) on a closed stream is
- undefined. Implementations may raise IOError in this case.
+ undefined. Implementations may raise OSError in this case.
IOBase (and its subclasses) support the iterator protocol, meaning
that an IOBase object can be iterated over yielding the lines in a
@@ -294,7 +294,7 @@ class IOBase(metaclass=abc.ABCMeta):
### Internal ###
def _unsupported(self, name):
- """Internal: raise an IOError exception for unsupported operations."""
+ """Internal: raise an OSError exception for unsupported operations."""
raise UnsupportedOperation("%s.%s() not supported" %
(self.__class__.__name__, name))
@@ -441,7 +441,7 @@ class IOBase(metaclass=abc.ABCMeta):
def fileno(self):
"""Returns underlying file descriptor (an int) if one exists.
- An IOError is raised if the IO object does not use a file descriptor.
+ An OSError is raised if the IO object does not use a file descriptor.
"""
self._unsupported("fileno")
@@ -699,13 +699,13 @@ class _BufferedIOMixin(BufferedIOBase):
def seek(self, pos, whence=0):
new_position = self.raw.seek(pos, whence)
if new_position < 0:
- raise IOError("seek() returned an invalid position")
+ raise OSError("seek() returned an invalid position")
return new_position
def tell(self):
pos = self.raw.tell()
if pos < 0:
- raise IOError("tell() returned an invalid position")
+ raise OSError("tell() returned an invalid position")
return pos
def truncate(self, pos=None):
@@ -927,7 +927,7 @@ class BufferedReader(_BufferedIOMixin):
"""Create a new buffered reader using the given readable raw IO object.
"""
if not raw.readable():
- raise IOError('"raw" argument must be readable.')
+ raise OSError('"raw" argument must be readable.')
_BufferedIOMixin.__init__(self, raw)
if buffer_size <= 0:
@@ -1074,7 +1074,7 @@ class BufferedWriter(_BufferedIOMixin):
def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
if not raw.writable():
- raise IOError('"raw" argument must be writable.')
+ raise OSError('"raw" argument must be writable.')
_BufferedIOMixin.__init__(self, raw)
if buffer_size <= 0:
@@ -1138,7 +1138,7 @@ class BufferedWriter(_BufferedIOMixin):
errno.EAGAIN,
"write could not complete without blocking", 0)
if n > len(self._write_buf) or n < 0:
- raise IOError("write() returned incorrect number of bytes")
+ raise OSError("write() returned incorrect number of bytes")
del self._write_buf[:n]
def tell(self):
@@ -1174,10 +1174,10 @@ class BufferedRWPair(BufferedIOBase):
The arguments are two RawIO instances.
"""
if not reader.readable():
- raise IOError('"reader" argument must be readable.')
+ raise OSError('"reader" argument must be readable.')
if not writer.writable():
- raise IOError('"writer" argument must be writable.')
+ raise OSError('"writer" argument must be writable.')
self.reader = BufferedReader(reader, buffer_size)
self.writer = BufferedWriter(writer, buffer_size)
@@ -1248,7 +1248,7 @@ class BufferedRandom(BufferedWriter, BufferedReader):
with self._read_lock:
self._reset_read_buf()
if pos < 0:
- raise IOError("seek() returned invalid position")
+ raise OSError("seek() returned invalid position")
return pos
def tell(self):
@@ -1727,7 +1727,7 @@ class TextIOWrapper(TextIOBase):
if not self._seekable:
raise UnsupportedOperation("underlying stream is not seekable")
if not self._telling:
- raise IOError("telling position disabled by next() call")
+ raise OSError("telling position disabled by next() call")
self.flush()
position = self.buffer.tell()
decoder = self._decoder
@@ -1814,7 +1814,7 @@ class TextIOWrapper(TextIOBase):
chars_decoded += len(decoder.decode(b'', final=True))
need_eof = 1
if chars_decoded < chars_to_skip:
- raise IOError("can't reconstruct logical file position")
+ raise OSError("can't reconstruct logical file position")
# The returned cookie corresponds to the last safe start point.
return self._pack_cookie(
@@ -1891,7 +1891,7 @@ class TextIOWrapper(TextIOBase):
# Skip chars_to_skip of the decoded characters.
if len(self._decoded_chars) < chars_to_skip:
- raise IOError("can't restore logical file position")
+ raise OSError("can't restore logical file position")
self._decoded_chars_used = chars_to_skip
# Finally, reset the encoder (merely useful for proper BOM handling)
@@ -2054,7 +2054,6 @@ class StringIO(TextIOWrapper):
if not isinstance(initial_value, str):
raise TypeError("initial_value must be str or None, not {0}"
.format(type(initial_value).__name__))
- initial_value = str(initial_value)
self.write(initial_value)
self.seek(0)
diff --git a/Lib/_sitebuiltins.py b/Lib/_sitebuiltins.py
new file mode 100644
index 0000000..1f21358
--- /dev/null
+++ b/Lib/_sitebuiltins.py
@@ -0,0 +1,99 @@
+"""
+The objects used by the site module to add custom builtins.
+"""
+
+# Those objects are almost immortal and they keep a reference to their module
+# globals. Defining them in the site module would keep too many references
+# alive.
+# Note this means this module should also avoid keep things alive in its
+# globals.
+
+import sys
+
+class Quitter(object):
+ def __init__(self, name, eof):
+ self.name = name
+ self.eof = eof
+ def __repr__(self):
+ return 'Use %s() or %s to exit' % (self.name, self.eof)
+ def __call__(self, code=None):
+ # Shells like IDLE catch the SystemExit, but listen when their
+ # stdin wrapper is closed.
+ try:
+ sys.stdin.close()
+ except:
+ pass
+ raise SystemExit(code)
+
+
+class _Printer(object):
+ """interactive prompt objects for printing the license text, a list of
+ contributors and the copyright notice."""
+
+ MAXLINES = 23
+
+ def __init__(self, name, data, files=(), dirs=()):
+ import os
+ self.__name = name
+ self.__data = data
+ self.__lines = None
+ self.__filenames = [os.path.join(dir, filename)
+ for dir in dirs
+ for filename in files]
+
+ def __setup(self):
+ if self.__lines:
+ return
+ data = None
+ for filename in self.__filenames:
+ try:
+ with open(filename, "r") as fp:
+ data = fp.read()
+ break
+ except OSError:
+ pass
+ if not data:
+ data = self.__data
+ self.__lines = data.split('\n')
+ self.__linecnt = len(self.__lines)
+
+ def __repr__(self):
+ self.__setup()
+ if len(self.__lines) <= self.MAXLINES:
+ return "\n".join(self.__lines)
+ else:
+ return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+ def __call__(self):
+ self.__setup()
+ prompt = 'Hit Return for more, or q (and Return) to quit: '
+ lineno = 0
+ while 1:
+ try:
+ for i in range(lineno, lineno + self.MAXLINES):
+ print(self.__lines[i])
+ except IndexError:
+ break
+ else:
+ lineno += self.MAXLINES
+ key = None
+ while key is None:
+ key = input(prompt)
+ if key not in ('', 'q'):
+ key = None
+ if key == 'q':
+ break
+
+
+class _Helper(object):
+ """Define the builtin 'help'.
+ This is a wrapper around pydoc.help (with a twist).
+
+ """
+
+ def __repr__(self):
+ return "Type help() for interactive help, " \
+ "or help(object) for help about object."
+ def __call__(self, *args, **kwds):
+ import pydoc
+ return pydoc.help(*args, **kwds)
diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index 264d4fa..3884a67 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -21,7 +21,7 @@ from datetime import (date as datetime_date,
timezone as datetime_timezone)
try:
from _thread import allocate_lock as _thread_allocate_lock
-except:
+except ImportError:
from _dummy_thread import allocate_lock as _thread_allocate_lock
__all__ = []
diff --git a/Lib/abc.py b/Lib/abc.py
index 09778e8..264c60c 100644
--- a/Lib/abc.py
+++ b/Lib/abc.py
@@ -5,6 +5,7 @@
from _weakrefset import WeakSet
+
def abstractmethod(funcobj):
"""A decorator indicating abstract methods.
@@ -124,6 +125,8 @@ class ABCMeta(type):
# A global counter that is incremented each time a class is
# registered as a virtual subclass of anything. It forces the
# negative cache to be cleared before its next use.
+ # Note: this counter is private. Use `abc.get_cache_token()` for
+ # external code.
_abc_invalidation_counter = 0
def __new__(mcls, name, bases, namespace):
@@ -226,3 +229,20 @@ class ABCMeta(type):
# No dice; update negative cache
cls._abc_negative_cache.add(subclass)
return False
+
+
+class ABC(metaclass=ABCMeta):
+ """Helper class that provides a standard way to create an ABC using
+ inheritance.
+ """
+ pass
+
+
+def get_cache_token():
+ """Returns the current ABC cache token.
+
+ The token is an opaque integer identifying the current version of
+ the ABC cache for virtual subclasses. This number changes with
+ every call to ``register()`` on any ABC.
+ """
+ return ABCMeta._abc_invalidation_counter
diff --git a/Lib/aifc.py b/Lib/aifc.py
index 29545a5..c02c485 100644
--- a/Lib/aifc.py
+++ b/Lib/aifc.py
@@ -69,7 +69,7 @@ This returns an instance of a class with the following public methods:
getcomptype() -- returns compression type ('NONE' for AIFF files)
getcompname() -- returns human-readable version of
compression type ('not compressed' for AIFF files)
- getparams() -- returns a tuple consisting of all of the
+ getparams() -- returns a namedtuple consisting of all of the
above in the above order
getmarkers() -- get the list of marks in the audio file or None
if there are no marks
@@ -252,6 +252,11 @@ def _write_float(f, x):
_write_ulong(f, lomant)
from chunk import Chunk
+from collections import namedtuple
+
+_aifc_params = namedtuple('_aifc_params',
+ 'nchannels sampwidth framerate nframes comptype compname')
+
class Aifc_read:
# Variables used in this class:
@@ -334,6 +339,12 @@ class Aifc_read:
# else, assume it is an open file object already
self.initfp(f)
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
#
# User visible methods.
#
@@ -372,9 +383,9 @@ class Aifc_read:
## return self._version
def getparams(self):
- return self.getnchannels(), self.getsampwidth(), \
- self.getframerate(), self.getnframes(), \
- self.getcomptype(), self.getcompname()
+ return _aifc_params(self.getnchannels(), self.getsampwidth(),
+ self.getframerate(), self.getnframes(),
+ self.getcomptype(), self.getcompname())
def getmarkers(self):
if len(self._markers) == 0:
@@ -553,6 +564,12 @@ class Aifc_write:
def __del__(self):
self.close()
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
#
# User visible methods.
#
@@ -646,8 +663,8 @@ class Aifc_write:
def getparams(self):
if not self._nchannels or not self._sampwidth or not self._framerate:
raise Error('not all parameters set')
- return self._nchannels, self._sampwidth, self._framerate, \
- self._nframes, self._comptype, self._compname
+ return _aifc_params(self._nchannels, self._sampwidth, self._framerate,
+ self._nframes, self._comptype, self._compname)
def setmark(self, id, pos, name):
if id <= 0:
diff --git a/Lib/argparse.py b/Lib/argparse.py
index f25b1b6..5ff755c 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -606,8 +606,7 @@ class HelpFormatter(object):
pass
else:
self._indent()
- for subaction in get_subactions():
- yield subaction
+ yield from get_subactions()
self._dedent()
def _split_lines(self, text, width):
@@ -1141,11 +1140,17 @@ class FileType(object):
same values as the builtin open() function.
- bufsize -- The file's desired buffer size. Accepts the same values as
the builtin open() function.
+ - encoding -- The file's encoding. Accepts the same values as the
+ builtin open() function.
+ - errors -- A string indicating how encoding and decoding errors are to
+ be handled. Accepts the same value as the builtin open() function.
"""
- def __init__(self, mode='r', bufsize=-1):
+ def __init__(self, mode='r', bufsize=-1, encoding=None, errors=None):
self._mode = mode
self._bufsize = bufsize
+ self._encoding = encoding
+ self._errors = errors
def __call__(self, string):
# the special argument "-" means sys.std{in,out}
@@ -1160,14 +1165,18 @@ class FileType(object):
# all other arguments are used as file names
try:
- return open(string, self._mode, self._bufsize)
- except IOError as e:
+ return open(string, self._mode, self._bufsize, self._encoding,
+ self._errors)
+ except OSError as e:
message = _("can't open '%s': %s")
raise ArgumentTypeError(message % (string, e))
def __repr__(self):
args = self._mode, self._bufsize
- args_str = ', '.join(repr(arg) for arg in args if arg != -1)
+ kwargs = [('encoding', self._encoding), ('errors', self._errors)]
+ args_str = ', '.join([repr(arg) for arg in args if arg != -1] +
+ ['%s=%r' % (kw, arg) for kw, arg in kwargs
+ if arg is not None])
return '%s(%s)' % (type(self).__name__, args_str)
# ===========================
@@ -2001,17 +2010,14 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# replace arguments referencing files with the file content
else:
try:
- args_file = open(arg_string[1:])
- try:
+ with open(arg_string[1:]) as args_file:
arg_strings = []
for arg_line in args_file.read().splitlines():
for arg in self.convert_arg_line_to_args(arg_line):
arg_strings.append(arg)
arg_strings = self._read_args_from_files(arg_strings)
new_arg_strings.extend(arg_strings)
- finally:
- args_file.close()
- except IOError:
+ except OSError:
err = _sys.exc_info()[1]
self.error(str(err))
diff --git a/Lib/ast.py b/Lib/ast.py
index 13f59f9..02c3b28 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -42,7 +42,6 @@ def literal_eval(node_or_string):
Python literal structures: strings, bytes, numbers, tuples, lists, dicts,
sets, booleans, and None.
"""
- _safe_names = {'None': None, 'True': True, 'False': False}
if isinstance(node_or_string, str):
node_or_string = parse(node_or_string, mode='eval')
if isinstance(node_or_string, Expression):
@@ -61,9 +60,8 @@ def literal_eval(node_or_string):
elif isinstance(node, Dict):
return dict((_convert(k), _convert(v)) for k, v
in zip(node.keys, node.values))
- elif isinstance(node, Name):
- if node.id in _safe_names:
- return _safe_names[node.id]
+ elif isinstance(node, NameConstant):
+ return node.value
elif isinstance(node, UnaryOp) and \
isinstance(node.op, (UAdd, USub)) and \
isinstance(node.operand, (Num, UnaryOp, BinOp)):
diff --git a/Lib/asynchat.py b/Lib/asynchat.py
index 4e26bb5..f055d63 100644
--- a/Lib/asynchat.py
+++ b/Lib/asynchat.py
@@ -56,8 +56,8 @@ class async_chat (asyncore.dispatcher):
# these are overridable defaults
- ac_in_buffer_size = 4096
- ac_out_buffer_size = 4096
+ ac_in_buffer_size = 65536
+ ac_out_buffer_size = 65536
# we don't want to enable the use of encoding by default, because that is a
# sign of an application bug that we don't want to pass silently
@@ -114,7 +114,7 @@ class async_chat (asyncore.dispatcher):
try:
data = self.recv (self.ac_in_buffer_size)
- except socket.error as why:
+ except OSError as why:
self.handle_error()
return
@@ -243,7 +243,7 @@ class async_chat (asyncore.dispatcher):
# send the data
try:
num_sent = self.send(data)
- except socket.error:
+ except OSError:
self.handle_error()
return
diff --git a/Lib/asyncore.py b/Lib/asyncore.py
index 909d9f6..75481dd 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -112,7 +112,7 @@ def readwrite(obj, flags):
obj.handle_expt_event()
if flags & (select.POLLHUP | select.POLLERR | select.POLLNVAL):
obj.handle_close()
- except socket.error as e:
+ except OSError as e:
if e.args[0] not in _DISCONNECTED:
obj.handle_error()
else:
@@ -240,7 +240,7 @@ class dispatcher:
# passed be connected.
try:
self.addr = sock.getpeername()
- except socket.error as err:
+ except OSError as err:
if err.args[0] in (ENOTCONN, EINVAL):
# To handle the case where we got an unconnected
# socket.
@@ -304,7 +304,7 @@ class dispatcher:
self.socket.getsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR) | 1
)
- except socket.error:
+ except OSError:
pass
# ==================================================
@@ -345,7 +345,7 @@ class dispatcher:
self.addr = address
self.handle_connect_event()
else:
- raise socket.error(err, errorcode[err])
+ raise OSError(err, errorcode[err])
def accept(self):
# XXX can return either an address pair or None
@@ -353,7 +353,7 @@ class dispatcher:
conn, addr = self.socket.accept()
except TypeError:
return None
- except socket.error as why:
+ except OSError as why:
if why.args[0] in (EWOULDBLOCK, ECONNABORTED, EAGAIN):
return None
else:
@@ -365,7 +365,7 @@ class dispatcher:
try:
result = self.socket.send(data)
return result
- except socket.error as why:
+ except OSError as why:
if why.args[0] == EWOULDBLOCK:
return 0
elif why.args[0] in _DISCONNECTED:
@@ -384,7 +384,7 @@ class dispatcher:
return b''
else:
return data
- except socket.error as why:
+ except OSError as why:
# winsock sometimes raises ENOTCONN
if why.args[0] in _DISCONNECTED:
self.handle_close()
@@ -397,11 +397,12 @@ class dispatcher:
self.accepting = False
self.connecting = False
self.del_channel()
- try:
- self.socket.close()
- except socket.error as why:
- if why.args[0] not in (ENOTCONN, EBADF):
- raise
+ if self.socket is not None:
+ try:
+ self.socket.close()
+ except OSError as why:
+ if why.args[0] not in (ENOTCONN, EBADF):
+ raise
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.
@@ -443,7 +444,7 @@ class dispatcher:
def handle_connect_event(self):
err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
if err != 0:
- raise socket.error(err, _strerror(err))
+ raise OSError(err, _strerror(err))
self.handle_connect()
self.connected = True
self.connecting = False
@@ -532,7 +533,7 @@ class dispatcher_with_send(dispatcher):
def initiate_send(self):
num_sent = 0
- num_sent = dispatcher.send(self, self.out_buffer[:512])
+ num_sent = dispatcher.send(self, self.out_buffer[:65536])
self.out_buffer = self.out_buffer[num_sent:]
def handle_write(self):
diff --git a/Lib/base64.py b/Lib/base64.py
index b6e82b6..9c15752 100755
--- a/Lib/base64.py
+++ b/Lib/base64.py
@@ -138,21 +138,10 @@ def urlsafe_b64decode(s):
# Base32 encoding/decoding must be done in Python
-_b32alphabet = {
- 0: b'A', 9: b'J', 18: b'S', 27: b'3',
- 1: b'B', 10: b'K', 19: b'T', 28: b'4',
- 2: b'C', 11: b'L', 20: b'U', 29: b'5',
- 3: b'D', 12: b'M', 21: b'V', 30: b'6',
- 4: b'E', 13: b'N', 22: b'W', 31: b'7',
- 5: b'F', 14: b'O', 23: b'X',
- 6: b'G', 15: b'P', 24: b'Y',
- 7: b'H', 16: b'Q', 25: b'Z',
- 8: b'I', 17: b'R', 26: b'2',
- }
-
-_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
-_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
-
+_b32alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
+_b32tab = [bytes([i]) for i in _b32alphabet]
+_b32tab2 = [a + b for a in _b32tab for b in _b32tab]
+_b32rev = {v: k for k, v in enumerate(_b32alphabet)}
def b32encode(s):
"""Encode a byte string using Base32.
@@ -161,30 +150,20 @@ def b32encode(s):
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- quanta, leftover = divmod(len(s), 5)
+ leftover = len(s) % 5
# Pad the last quantum with zero bits if necessary
if leftover:
s = s + bytes(5 - leftover) # Don't use += !
- quanta += 1
encoded = bytearray()
- for i in range(quanta):
- # c1 and c2 are 16 bits wide, c3 is 8 bits wide. The intent of this
- # code is to process the 40 bits in units of 5 bits. So we take the 1
- # leftover bit of c1 and tack it onto c2. Then we take the 2 leftover
- # bits of c2 and tack them onto c3. The shifts and masks are intended
- # to give us values of exactly 5 bits in width.
- c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5])
- c2 += (c1 & 1) << 16 # 17 bits wide
- c3 += (c2 & 3) << 8 # 10 bits wide
- encoded += bytes([_b32tab[c1 >> 11], # bits 1 - 5
- _b32tab[(c1 >> 6) & 0x1f], # bits 6 - 10
- _b32tab[(c1 >> 1) & 0x1f], # bits 11 - 15
- _b32tab[c2 >> 12], # bits 16 - 20 (1 - 5)
- _b32tab[(c2 >> 7) & 0x1f], # bits 21 - 25 (6 - 10)
- _b32tab[(c2 >> 2) & 0x1f], # bits 26 - 30 (11 - 15)
- _b32tab[c3 >> 5], # bits 31 - 35 (1 - 5)
- _b32tab[c3 & 0x1f], # bits 36 - 40 (1 - 5)
- ])
+ from_bytes = int.from_bytes
+ b32tab2 = _b32tab2
+ for i in range(0, len(s), 5):
+ c = from_bytes(s[i: i + 5], 'big')
+ encoded += (b32tab2[c >> 30] + # bits 1 - 10
+ b32tab2[(c >> 20) & 0x3ff] + # bits 11 - 20
+ b32tab2[(c >> 10) & 0x3ff] + # bits 21 - 30
+ b32tab2[c & 0x3ff] # bits 31 - 40
+ )
# Adjust for any leftover partial quanta
if leftover == 1:
encoded[-6:] = b'======'
@@ -196,7 +175,6 @@ def b32encode(s):
encoded[-1:] = b'='
return bytes(encoded)
-
def b32decode(s, casefold=False, map01=None):
"""Decode a Base32 encoded byte string.
@@ -217,8 +195,7 @@ def b32decode(s, casefold=False, map01=None):
characters present in the input.
"""
s = _bytes_from_decode_data(s)
- quanta, leftover = divmod(len(s), 8)
- if leftover:
+ if len(s) % 8:
raise binascii.Error('Incorrect padding')
# Handle section 2.4 zero and one mapping. The flag map01 will be either
# False, or the character to map the digit 1 (one) to. It should be
@@ -232,42 +209,36 @@ def b32decode(s, casefold=False, map01=None):
# Strip off pad characters from the right. We need to count the pad
# characters because this will tell us how many null bytes to remove from
# the end of the decoded string.
- padchars = 0
- mo = re.search(b'(?P<pad>[=]*)$', s)
- if mo:
- padchars = len(mo.group('pad'))
- if padchars > 0:
- s = s[:-padchars]
+ l = len(s)
+ s = s.rstrip(b'=')
+ padchars = l - len(s)
# Now decode the full quanta
- parts = []
- acc = 0
- shift = 35
- for c in s:
- val = _b32rev.get(c)
- if val is None:
- raise binascii.Error('Non-base32 digit found')
- acc += _b32rev[c] << shift
- shift -= 5
- if shift < 0:
- parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii")))
- acc = 0
- shift = 35
+ decoded = bytearray()
+ b32rev = _b32rev
+ for i in range(0, len(s), 8):
+ quanta = s[i: i + 8]
+ acc = 0
+ try:
+ for c in quanta:
+ acc = (acc << 5) + b32rev[c]
+ except KeyError:
+ raise binascii.Error('Non-base32 digit found') from None
+ decoded += acc.to_bytes(5, 'big')
# Process the last, partial quanta
- last = binascii.unhexlify(bytes('%010x' % acc, "ascii"))
- if padchars == 0:
- last = b'' # No characters
- elif padchars == 1:
- last = last[:-1]
- elif padchars == 3:
- last = last[:-2]
- elif padchars == 4:
- last = last[:-3]
- elif padchars == 6:
- last = last[:-4]
- else:
- raise binascii.Error('Incorrect padding')
- parts.append(last)
- return b''.join(parts)
+ if padchars:
+ acc <<= 5 * padchars
+ last = acc.to_bytes(5, 'big')
+ if padchars == 1:
+ decoded[-5:] = last[:-1]
+ elif padchars == 3:
+ decoded[-5:] = last[:-2]
+ elif padchars == 4:
+ decoded[-5:] = last[:-3]
+ elif padchars == 6:
+ decoded[-5:] = last[:-4]
+ else:
+ raise binascii.Error('Incorrect padding')
+ return bytes(decoded)
diff --git a/Lib/bz2.py b/Lib/bz2.py
index c307507..6e6a2b9 100644
--- a/Lib/bz2.py
+++ b/Lib/bz2.py
@@ -9,7 +9,6 @@ __all__ = ["BZ2File", "BZ2Compressor", "BZ2Decompressor",
__author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
-import builtins
import io
import warnings
@@ -28,6 +27,8 @@ _MODE_WRITE = 3
_BUFFER_SIZE = 8192
+_builtin_open = open
+
class BZ2File(io.BufferedIOBase):
@@ -43,12 +44,13 @@ class BZ2File(io.BufferedIOBase):
def __init__(self, filename, mode="r", buffering=None, compresslevel=9):
"""Open a bzip2-compressed file.
- If filename is a str or bytes object, is gives the name of the file to
- be opened. Otherwise, it should be a file object, which will be used to
- read or write the compressed data.
+ If filename is a str or bytes object, it gives the name
+ of the file to be opened. Otherwise, it should be a file object,
+ which will be used to read or write the compressed data.
- mode can be 'r' for reading (default), 'w' for (over)writing, or 'a' for
- appending. These can equivalently be given as 'rb', 'wb', and 'ab'.
+ mode can be 'r' for reading (default), 'w' for (over)writing,
+ or 'a' for appending. These can equivalently be given as 'rb',
+ 'wb', and 'ab'.
buffering is ignored. Its use is deprecated.
@@ -90,10 +92,10 @@ class BZ2File(io.BufferedIOBase):
mode_code = _MODE_WRITE
self._compressor = BZ2Compressor(compresslevel)
else:
- raise ValueError("Invalid mode: {!r}".format(mode))
+ raise ValueError("Invalid mode: %r" % (mode,))
if isinstance(filename, (str, bytes)):
- self._fp = builtins.open(filename, mode)
+ self._fp = _builtin_open(filename, mode)
self._closefp = True
self._mode = mode_code
elif hasattr(filename, "read") or hasattr(filename, "write"):
@@ -189,15 +191,17 @@ class BZ2File(io.BufferedIOBase):
if not rawblock:
if self._decompressor.eof:
+ # End-of-stream marker and end of file. We're good.
self._mode = _MODE_READ_EOF
self._size = self._pos
return False
else:
+ # Problem - we were expecting more compressed data.
raise EOFError("Compressed file ended before the "
"end-of-stream marker was reached")
- # Continue to next stream.
if self._decompressor.eof:
+ # Continue to next stream.
self._decompressor = BZ2Decompressor()
self._buffer = self._decompressor.decompress(rawblock)
@@ -412,7 +416,7 @@ class BZ2File(io.BufferedIOBase):
self._read_all(return_data=False)
offset = self._size + offset
else:
- raise ValueError("Invalid value for whence: {}".format(whence))
+ raise ValueError("Invalid value for whence: %s" % (whence,))
# Make it so that offset is the number of bytes to skip forward.
if offset < self._pos:
@@ -436,20 +440,20 @@ def open(filename, mode="rb", compresslevel=9,
encoding=None, errors=None, newline=None):
"""Open a bzip2-compressed file in binary or text mode.
- The filename argument can be an actual filename (a str or bytes object), or
- an existing file object to read from or write to.
+ The filename argument can be an actual filename (a str or bytes
+ object), or an existing file object to read from or write to.
- The mode argument can be "r", "rb", "w", "wb", "a" or "ab" for binary mode,
- or "rt", "wt" or "at" for text mode. The default mode is "rb", and the
- default compresslevel is 9.
+ The mode argument can be "r", "rb", "w", "wb", "a" or "ab" for
+ binary mode, or "rt", "wt" or "at" for text mode. The default mode
+ is "rb", and the default compresslevel is 9.
- For binary mode, this function is equivalent to the BZ2File constructor:
- BZ2File(filename, mode, compresslevel). In this case, the encoding, errors
- and newline arguments must not be provided.
+ For binary mode, this function is equivalent to the BZ2File
+ constructor: BZ2File(filename, mode, compresslevel). In this case,
+ the encoding, errors and newline arguments must not be provided.
For text mode, a BZ2File object is created, and wrapped in an
- io.TextIOWrapper instance with the specified encoding, error handling
- behavior, and line ending(s).
+ io.TextIOWrapper instance with the specified encoding, error
+ handling behavior, and line ending(s).
"""
if "t" in mode:
diff --git a/Lib/cProfile.py b/Lib/cProfile.py
index c24d45b..1184385 100755
--- a/Lib/cProfile.py
+++ b/Lib/cProfile.py
@@ -7,54 +7,20 @@
__all__ = ["run", "runctx", "Profile"]
import _lsprof
+import profile as _pyprofile
# ____________________________________________________________
# Simple interface
def run(statement, filename=None, sort=-1):
- """Run statement under profiler optionally saving results in filename
-
- This function takes a single argument that can be passed to the
- "exec" statement, and an optional file name. In all cases this
- routine attempts to "exec" its first argument and gather profiling
- statistics from the execution. If no file name is present, then this
- function automatically prints a simple profiling report, sorted by the
- standard name string (file/line/function-name) that is presented in
- each line.
- """
- prof = Profile()
- result = None
- try:
- try:
- prof = prof.run(statement)
- except SystemExit:
- pass
- finally:
- if filename is not None:
- prof.dump_stats(filename)
- else:
- result = prof.print_stats(sort)
- return result
+ return _pyprofile._Utils(Profile).run(statement, filename, sort)
def runctx(statement, globals, locals, filename=None, sort=-1):
- """Run statement under profiler, supplying your own globals and locals,
- optionally saving results in filename.
+ return _pyprofile._Utils(Profile).runctx(statement, globals, locals,
+ filename, sort)
- statement and filename have the same semantics as profile.run
- """
- prof = Profile()
- result = None
- try:
- try:
- prof = prof.runctx(statement, globals, locals)
- except SystemExit:
- pass
- finally:
- if filename is not None:
- prof.dump_stats(filename)
- else:
- result = prof.print_stats(sort)
- return result
+run.__doc__ = _pyprofile.run.__doc__
+runctx.__doc__ = _pyprofile.runctx.__doc__
# ____________________________________________________________
@@ -77,10 +43,9 @@ class Profile(_lsprof.Profiler):
def dump_stats(self, file):
import marshal
- f = open(file, 'wb')
- self.create_stats()
- marshal.dump(self.stats, f)
- f.close()
+ with open(file, 'wb') as f:
+ self.create_stats()
+ marshal.dump(self.stats, f)
def create_stats(self):
self.disable()
diff --git a/Lib/cgi.py b/Lib/cgi.py
index 06e03b5..4de82ea 100755
--- a/Lib/cgi.py
+++ b/Lib/cgi.py
@@ -80,7 +80,7 @@ def initlog(*allargs):
if logfile and not logfp:
try:
logfp = open(logfile, "a")
- except IOError:
+ except OSError:
pass
if not logfp:
log = nolog
@@ -958,8 +958,8 @@ def print_directory():
print("<H3>Current Working Directory:</H3>")
try:
pwd = os.getcwd()
- except os.error as msg:
- print("os.error:", html.escape(str(msg)))
+ except OSError as msg:
+ print("OSError:", html.escape(str(msg)))
else:
print(html.escape(pwd))
print()
diff --git a/Lib/chunk.py b/Lib/chunk.py
index 5863ed0..dc90a75 100644
--- a/Lib/chunk.py
+++ b/Lib/chunk.py
@@ -70,7 +70,7 @@ class Chunk:
self.size_read = 0
try:
self.offset = self.file.tell()
- except (AttributeError, IOError):
+ except (AttributeError, OSError):
self.seekable = False
else:
self.seekable = True
@@ -102,7 +102,7 @@ class Chunk:
if self.closed:
raise ValueError("I/O operation on closed file")
if not self.seekable:
- raise IOError("cannot seek")
+ raise OSError("cannot seek")
if whence == 1:
pos = pos + self.size_read
elif whence == 2:
@@ -158,7 +158,7 @@ class Chunk:
self.file.seek(n, 1)
self.size_read = self.size_read + n
return
- except IOError:
+ except OSError:
pass
while self.size_read < self.chunksize:
n = min(8192, self.chunksize - self.size_read)
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
index d737295..0f19f30 100644
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -12,7 +12,7 @@ from operator import itemgetter as _itemgetter, eq as _eq
from keyword import iskeyword as _iskeyword
import sys as _sys
import heapq as _heapq
-from weakref import proxy as _proxy
+from _weakref import proxy as _proxy
from itertools import repeat as _repeat, chain as _chain, starmap as _starmap
from reprlib import recursive_repr as _recursive_repr
@@ -199,13 +199,10 @@ class OrderedDict(dict):
def __reduce__(self):
'Return state information for pickling'
- items = [[k, self[k]] for k in self]
inst_dict = vars(self).copy()
for k in vars(OrderedDict()):
inst_dict.pop(k, None)
- if inst_dict:
- return (self.__class__, (items,), inst_dict)
- return self.__class__, (items,)
+ return self.__class__, (), inst_dict or None, None, iter(self.items())
def copy(self):
'od.copy() -> a shallow copy of od'
@@ -822,9 +819,14 @@ class ChainMap(MutableMapping):
__copy__ = copy
- def new_child(self): # like Django's Context.push()
- 'New ChainMap with a new dict followed by all previous maps.'
- return self.__class__({}, *self.maps)
+ def new_child(self, m=None): # like Django's Context.push()
+ '''
+ New ChainMap with a new map followed by all previous maps. If no
+ map is provided, an empty dict is used.
+ '''
+ if m is None:
+ m = {}
+ return self.__class__(m, *self.maps)
@property
def parents(self): # like Django's Context.pop()
diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py
index 7939268..a8681ea 100644
--- a/Lib/collections/abc.py
+++ b/Lib/collections/abc.py
@@ -454,8 +454,7 @@ class KeysView(MappingView, Set):
return key in self._mapping
def __iter__(self):
- for key in self._mapping:
- yield key
+ yield from self._mapping
KeysView.register(dict_keys)
@@ -663,7 +662,7 @@ class MutableSequence(Sequence):
__slots__ = ()
- """All the operations on a read-only sequence.
+ """All the operations on a read-write sequence.
Concrete subclasses must provide __new__ or __init__,
__getitem__, __setitem__, __delitem__, __len__, and insert().
diff --git a/Lib/colorsys.py b/Lib/colorsys.py
index a6c0cf6..b93e384 100644
--- a/Lib/colorsys.py
+++ b/Lib/colorsys.py
@@ -33,17 +33,25 @@ TWO_THIRD = 2.0/3.0
# YIQ: used by composite video signals (linear combinations of RGB)
# Y: perceived grey level (0.0 == black, 1.0 == white)
# I, Q: color components
+#
+# There are a great many versions of the constants used in these formulae.
+# The ones in this library uses constants from the FCC version of NTSC.
def rgb_to_yiq(r, g, b):
y = 0.30*r + 0.59*g + 0.11*b
- i = 0.60*r - 0.28*g - 0.32*b
- q = 0.21*r - 0.52*g + 0.31*b
+ i = 0.74*(r-y) - 0.27*(b-y)
+ q = 0.48*(r-y) + 0.41*(b-y)
return (y, i, q)
def yiq_to_rgb(y, i, q):
- r = y + 0.948262*i + 0.624013*q
- g = y - 0.276066*i - 0.639810*q
- b = y - 1.105450*i + 1.729860*q
+ # r = y + (0.27*q + 0.41*i) / (0.74*0.41 + 0.27*0.48)
+ # b = y + (0.74*q - 0.48*i) / (0.74*0.41 + 0.27*0.48)
+ # g = y - (0.30*(r-y) + 0.11*(b-y)) / 0.59
+
+ r = y + 0.9468822170900693*i + 0.6235565819861433*q
+ g = y - 0.27478764629897834*i - 0.6356910791873801*q
+ b = y - 1.1085450346420322*i + 1.7090069284064666*q
+
if r < 0.0:
r = 0.0
if g < 0.0:
diff --git a/Lib/compileall.py b/Lib/compileall.py
index d3cff6a..475dc1c 100644
--- a/Lib/compileall.py
+++ b/Lib/compileall.py
@@ -13,7 +13,7 @@ See module py_compile for details of the actual byte-compilation.
import os
import sys
import errno
-import imp
+import importlib.util
import py_compile
import struct
@@ -38,7 +38,7 @@ def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None,
print('Listing {!r}...'.format(dir))
try:
names = os.listdir(dir)
- except os.error:
+ except OSError:
print("Can't list {!r}".format(dir))
names = []
names.sort()
@@ -91,22 +91,23 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=False,
cfile = fullname + ('c' if __debug__ else 'o')
else:
if optimize >= 0:
- cfile = imp.cache_from_source(fullname,
- debug_override=not optimize)
+ cfile = importlib.util.cache_from_source(
+ fullname, debug_override=not optimize)
else:
- cfile = imp.cache_from_source(fullname)
+ cfile = importlib.util.cache_from_source(fullname)
cache_dir = os.path.dirname(cfile)
head, tail = name[:-3], name[-3:]
if tail == '.py':
if not force:
try:
mtime = int(os.stat(fullname).st_mtime)
- expect = struct.pack('<4sl', imp.get_magic(), mtime)
+ expect = struct.pack('<4sl', importlib.util.MAGIC_NUMBER,
+ mtime)
with open(cfile, 'rb') as chandle:
actual = chandle.read(8)
if expect == actual:
return success
- except IOError:
+ except OSError:
pass
if not quiet:
print('Compiling {!r}...'.format(fullname))
@@ -124,7 +125,7 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=False,
msg = msg.decode(sys.stdout.encoding)
print(msg)
success = 0
- except (SyntaxError, UnicodeError, IOError) as e:
+ except (SyntaxError, UnicodeError, OSError) as e:
if quiet:
print('*** Error compiling {!r}...'.format(fullname))
else:
@@ -209,7 +210,7 @@ def main():
with (sys.stdin if args.flist=='-' else open(args.flist)) as f:
for line in f:
compile_dests.append(line.strip())
- except EnvironmentError:
+ except OSError:
print("Error reading file list {}".format(args.flist))
return False
diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py
index ca3aebd..3d03280 100644
--- a/Lib/concurrent/futures/_base.py
+++ b/Lib/concurrent/futures/_base.py
@@ -198,8 +198,7 @@ def as_completed(fs, timeout=None):
waiter = _create_and_install_waiters(fs, _AS_COMPLETED)
try:
- for future in finished:
- yield future
+ yield from finished
while pending:
if timeout is None:
diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py
index adf2ab4..6298c65 100644
--- a/Lib/concurrent/futures/process.py
+++ b/Lib/concurrent/futures/process.py
@@ -40,7 +40,7 @@ Local worker thread:
Process #1..n:
- reads _CallItems from "Call Q", executes the calls, and puts the resulting
- _ResultItems in "Request Q"
+ _ResultItems in "Result Q"
"""
__author__ = 'Brian Quinlan (brian@sweetapp.com)'
@@ -240,6 +240,8 @@ def _queue_management_worker(executor_reference,
"terminated abruptly while the future was "
"running or pending."
))
+ # Delete references to object. See issue16284
+ del work_item
pending_work_items.clear()
# Terminate remaining workers forcibly: the queues or their
# locks may be in a dirty state and block forever.
@@ -264,6 +266,8 @@ def _queue_management_worker(executor_reference,
work_item.future.set_exception(result_item.exception)
else:
work_item.future.set_result(result_item.result)
+ # Delete references to object. See issue16284
+ del work_item
# Check whether we should start shutting down.
executor = executor_reference()
# No more work items can be added if:
@@ -327,7 +331,7 @@ class ProcessPoolExecutor(_base.Executor):
_check_system_limits()
if max_workers is None:
- self._max_workers = multiprocessing.cpu_count()
+ self._max_workers = os.cpu_count() or 1
else:
self._max_workers = max_workers
diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py
index 95bb682..f9beb0f 100644
--- a/Lib/concurrent/futures/thread.py
+++ b/Lib/concurrent/futures/thread.py
@@ -63,6 +63,8 @@ def _worker(executor_reference, work_queue):
work_item = work_queue.get(block=True)
if work_item is not None:
work_item.run()
+ # Delete references to object. See issue16284
+ del work_item
continue
executor = executor_reference()
# Exit if:
diff --git a/Lib/configparser.py b/Lib/configparser.py
index fde1c12..794f857 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -687,7 +687,7 @@ class RawConfigParser(MutableMapping):
try:
with open(filename, encoding=encoding) as fp:
self._read(fp, filename)
- except IOError:
+ except OSError:
continue
read_ok.append(filename)
return read_ok
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
index 0b6bf71..3222ac8 100644
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -4,7 +4,7 @@ import sys
from collections import deque
from functools import wraps
-__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack"]
+__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", "ignored"]
class ContextDecorator(object):
@@ -140,6 +140,18 @@ class closing(object):
def __exit__(self, *exc_info):
self.thing.close()
+@contextmanager
+def ignored(*exceptions):
+ """Context manager to ignore specified exceptions
+
+ with ignored(OSError):
+ os.remove(somefile)
+
+ """
+ try:
+ yield
+ except exceptions:
+ pass
# Inspired by discussions on http://bugs.python.org/issue13585
class ExitStack(object):
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
index c92e130..e34c646 100644
--- a/Lib/ctypes/__init__.py
+++ b/Lib/ctypes/__init__.py
@@ -34,17 +34,15 @@ from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \
FUNCFLAG_USE_ERRNO as _FUNCFLAG_USE_ERRNO, \
FUNCFLAG_USE_LASTERROR as _FUNCFLAG_USE_LASTERROR
-"""
-WINOLEAPI -> HRESULT
-WINOLEAPI_(type)
-
-STDMETHODCALLTYPE
-
-STDMETHOD(name)
-STDMETHOD_(type, name)
-
-STDAPICALLTYPE
-"""
+# WINOLEAPI -> HRESULT
+# WINOLEAPI_(type)
+#
+# STDMETHODCALLTYPE
+#
+# STDMETHOD(name)
+# STDMETHOD_(type, name)
+#
+# STDAPICALLTYPE
def create_string_buffer(init, size=None):
"""create_string_buffer(aBytes) -> character array
@@ -395,7 +393,7 @@ if _os.name in ("nt", "ce"):
_type_ = "l"
# _check_retval_ is called with the function's result when it
# is used as restype. It checks for the FAILED bit, and
- # raises a WindowsError if it is set.
+ # raises an OSError if it is set.
#
# The _check_retval_ method is implemented in C, so that the
# method definition itself is not included in the traceback
@@ -407,7 +405,7 @@ if _os.name in ("nt", "ce"):
class OleDLL(CDLL):
"""This class represents a dll exporting functions using the
Windows stdcall calling convention, and returning HRESULT.
- HRESULT error values are automatically raised as WindowsError
+ HRESULT error values are automatically raised as OSError
exceptions.
"""
_func_flags_ = _FUNCFLAG_STDCALL
@@ -456,7 +454,7 @@ if _os.name in ("nt", "ce"):
code = GetLastError()
if descr is None:
descr = FormatError(code).strip()
- return WindowsError(None, descr, None, code)
+ return OSError(None, descr, None, code)
if sizeof(c_uint) == sizeof(c_void_p):
c_size_t = c_uint
diff --git a/Lib/ctypes/test/__init__.py b/Lib/ctypes/test/__init__.py
index cc5fe02..7c72210 100644
--- a/Lib/ctypes/test/__init__.py
+++ b/Lib/ctypes/test/__init__.py
@@ -37,7 +37,7 @@ def requires(resource, msg=None):
def find_package_modules(package, mask):
import fnmatch
- if (hasattr(package, "__loader__") and
+ if (package.__loader__ is not None and
hasattr(package.__loader__, '_files')):
path = package.__name__.replace(".", os.path.sep)
mask = os.path.join(path, mask)
diff --git a/Lib/ctypes/test/test_checkretval.py b/Lib/ctypes/test/test_checkretval.py
index 01ccc57..19bb813 100644
--- a/Lib/ctypes/test/test_checkretval.py
+++ b/Lib/ctypes/test/test_checkretval.py
@@ -31,7 +31,7 @@ class Test(unittest.TestCase):
pass
else:
def test_oledll(self):
- self.assertRaises(WindowsError,
+ self.assertRaises(OSError,
oledll.oleaut32.CreateTypeLib2,
0, None, None)
diff --git a/Lib/ctypes/test/test_internals.py b/Lib/ctypes/test/test_internals.py
index cbf2e05..271e3f5 100644
--- a/Lib/ctypes/test/test_internals.py
+++ b/Lib/ctypes/test/test_internals.py
@@ -5,17 +5,14 @@ from sys import getrefcount as grc
# XXX This test must be reviewed for correctness!!!
-"""
-ctypes' types are container types.
-
-They have an internal memory block, which only consists of some bytes,
-but it has to keep references to other objects as well. This is not
-really needed for trivial C types like int or char, but it is important
-for aggregate types like strings or pointers in particular.
-
-What about pointers?
-
-"""
+# ctypes' types are container types.
+#
+# They have an internal memory block, which only consists of some bytes,
+# but it has to keep references to other objects as well. This is not
+# really needed for trivial C types like int or char, but it is important
+# for aggregate types like strings or pointers in particular.
+#
+# What about pointers?
class ObjectsTestCase(unittest.TestCase):
def assertSame(self, a, b):
diff --git a/Lib/ctypes/test/test_macholib.py b/Lib/ctypes/test/test_macholib.py
index eda846d..fd26837 100644
--- a/Lib/ctypes/test/test_macholib.py
+++ b/Lib/ctypes/test/test_macholib.py
@@ -3,35 +3,33 @@ import sys
import unittest
# Bob Ippolito:
-"""
-Ok.. the code to find the filename for __getattr__ should look
-something like:
-
-import os
-from macholib.dyld import dyld_find
-
-def find_lib(name):
- possible = ['lib'+name+'.dylib', name+'.dylib',
- name+'.framework/'+name]
- for dylib in possible:
- try:
- return os.path.realpath(dyld_find(dylib))
- except ValueError:
- pass
- raise ValueError, "%s not found" % (name,)
-
-It'll have output like this:
-
- >>> find_lib('pthread')
-'/usr/lib/libSystem.B.dylib'
- >>> find_lib('z')
-'/usr/lib/libz.1.dylib'
- >>> find_lib('IOKit')
-'/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit'
-
--bob
-
-"""
+#
+# Ok.. the code to find the filename for __getattr__ should look
+# something like:
+#
+# import os
+# from macholib.dyld import dyld_find
+#
+# def find_lib(name):
+# possible = ['lib'+name+'.dylib', name+'.dylib',
+# name+'.framework/'+name]
+# for dylib in possible:
+# try:
+# return os.path.realpath(dyld_find(dylib))
+# except ValueError:
+# pass
+# raise ValueError, "%s not found" % (name,)
+#
+# It'll have output like this:
+#
+# >>> find_lib('pthread')
+# '/usr/lib/libSystem.B.dylib'
+# >>> find_lib('z')
+# '/usr/lib/libz.1.dylib'
+# >>> find_lib('IOKit')
+# '/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit'
+#
+# -bob
from ctypes.macholib.dyld import dyld_find
diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py
index da21336..91ad314 100644
--- a/Lib/ctypes/test/test_win32.py
+++ b/Lib/ctypes/test/test_win32.py
@@ -41,7 +41,7 @@ if sys.platform == "win32":
# Call functions with invalid arguments, and make sure
# that access violations are trapped and raise an
# exception.
- self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32)
+ self.assertRaises(OSError, windll.kernel32.GetModuleHandleA, 32)
def test_noargs(self):
# This is a special case on win32 x64
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index 054c511..d2c04d2 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -102,9 +102,8 @@ elif os.name == "posix":
finally:
try:
os.unlink(ccout)
- except OSError as e:
- if e.errno != errno.ENOENT:
- raise
+ except FileNotFoundError:
+ pass
if rv == 10:
raise OSError('gcc or cc command not found')
res = re.search(expr, trace)
diff --git a/Lib/datetime.py b/Lib/datetime.py
index 4bba70b..0423237 100644
--- a/Lib/datetime.py
+++ b/Lib/datetime.py
@@ -1917,203 +1917,203 @@ timezone.utc = timezone._create(timedelta(0))
timezone.min = timezone._create(timezone._minoffset)
timezone.max = timezone._create(timezone._maxoffset)
_EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc)
-"""
-Some time zone algebra. For a datetime x, let
- x.n = x stripped of its timezone -- its naive time.
- x.o = x.utcoffset(), and assuming that doesn't raise an exception or
- return None
- x.d = x.dst(), and assuming that doesn't raise an exception or
- return None
- x.s = x's standard offset, x.o - x.d
-
-Now some derived rules, where k is a duration (timedelta).
-
-1. x.o = x.s + x.d
- This follows from the definition of x.s.
-
-2. If x and y have the same tzinfo member, x.s = y.s.
- This is actually a requirement, an assumption we need to make about
- sane tzinfo classes.
-
-3. The naive UTC time corresponding to x is x.n - x.o.
- This is again a requirement for a sane tzinfo class.
-
-4. (x+k).s = x.s
- This follows from #2, and that datimetimetz+timedelta preserves tzinfo.
-
-5. (x+k).n = x.n + k
- Again follows from how arithmetic is defined.
-
-Now we can explain tz.fromutc(x). Let's assume it's an interesting case
-(meaning that the various tzinfo methods exist, and don't blow up or return
-None when called).
-
-The function wants to return a datetime y with timezone tz, equivalent to x.
-x is already in UTC.
-
-By #3, we want
-
- y.n - y.o = x.n [1]
-
-The algorithm starts by attaching tz to x.n, and calling that y. So
-x.n = y.n at the start. Then it wants to add a duration k to y, so that [1]
-becomes true; in effect, we want to solve [2] for k:
-
- (y+k).n - (y+k).o = x.n [2]
-
-By #1, this is the same as
-
- (y+k).n - ((y+k).s + (y+k).d) = x.n [3]
-
-By #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.
-Substituting that into [3],
-
- x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving
- k - (y+k).s - (y+k).d = 0; rearranging,
- k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so
- k = y.s - (y+k).d
-
-On the RHS, (y+k).d can't be computed directly, but y.s can be, and we
-approximate k by ignoring the (y+k).d term at first. Note that k can't be
-very large, since all offset-returning methods return a duration of magnitude
-less than 24 hours. For that reason, if y is firmly in std time, (y+k).d must
-be 0, so ignoring it has no consequence then.
-
-In any case, the new value is
- z = y + y.s [4]
+# Some time zone algebra. For a datetime x, let
+# x.n = x stripped of its timezone -- its naive time.
+# x.o = x.utcoffset(), and assuming that doesn't raise an exception or
+# return None
+# x.d = x.dst(), and assuming that doesn't raise an exception or
+# return None
+# x.s = x's standard offset, x.o - x.d
+#
+# Now some derived rules, where k is a duration (timedelta).
+#
+# 1. x.o = x.s + x.d
+# This follows from the definition of x.s.
+#
+# 2. If x and y have the same tzinfo member, x.s = y.s.
+# This is actually a requirement, an assumption we need to make about
+# sane tzinfo classes.
+#
+# 3. The naive UTC time corresponding to x is x.n - x.o.
+# This is again a requirement for a sane tzinfo class.
+#
+# 4. (x+k).s = x.s
+# This follows from #2, and that datimetimetz+timedelta preserves tzinfo.
+#
+# 5. (x+k).n = x.n + k
+# Again follows from how arithmetic is defined.
+#
+# Now we can explain tz.fromutc(x). Let's assume it's an interesting case
+# (meaning that the various tzinfo methods exist, and don't blow up or return
+# None when called).
+#
+# The function wants to return a datetime y with timezone tz, equivalent to x.
+# x is already in UTC.
+#
+# By #3, we want
+#
+# y.n - y.o = x.n [1]
+#
+# The algorithm starts by attaching tz to x.n, and calling that y. So
+# x.n = y.n at the start. Then it wants to add a duration k to y, so that [1]
+# becomes true; in effect, we want to solve [2] for k:
+#
+# (y+k).n - (y+k).o = x.n [2]
+#
+# By #1, this is the same as
+#
+# (y+k).n - ((y+k).s + (y+k).d) = x.n [3]
+#
+# By #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.
+# Substituting that into [3],
+#
+# x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving
+# k - (y+k).s - (y+k).d = 0; rearranging,
+# k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so
+# k = y.s - (y+k).d
+#
+# On the RHS, (y+k).d can't be computed directly, but y.s can be, and we
+# approximate k by ignoring the (y+k).d term at first. Note that k can't be
+# very large, since all offset-returning methods return a duration of magnitude
+# less than 24 hours. For that reason, if y is firmly in std time, (y+k).d must
+# be 0, so ignoring it has no consequence then.
+#
+# In any case, the new value is
+#
+# z = y + y.s [4]
+#
+# It's helpful to step back at look at [4] from a higher level: it's simply
+# mapping from UTC to tz's standard time.
+#
+# At this point, if
+#
+# z.n - z.o = x.n [5]
+#
+# we have an equivalent time, and are almost done. The insecurity here is
+# at the start of daylight time. Picture US Eastern for concreteness. The wall
+# time jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good
+# sense then. The docs ask that an Eastern tzinfo class consider such a time to
+# be EDT (because it's "after 2"), which is a redundant spelling of 1:MM EST
+# on the day DST starts. We want to return the 1:MM EST spelling because that's
+# the only spelling that makes sense on the local wall clock.
+#
+# In fact, if [5] holds at this point, we do have the standard-time spelling,
+# but that takes a bit of proof. We first prove a stronger result. What's the
+# difference between the LHS and RHS of [5]? Let
+#
+# diff = x.n - (z.n - z.o) [6]
+#
+# Now
+# z.n = by [4]
+# (y + y.s).n = by #5
+# y.n + y.s = since y.n = x.n
+# x.n + y.s = since z and y are have the same tzinfo member,
+# y.s = z.s by #2
+# x.n + z.s
+#
+# Plugging that back into [6] gives
+#
+# diff =
+# x.n - ((x.n + z.s) - z.o) = expanding
+# x.n - x.n - z.s + z.o = cancelling
+# - z.s + z.o = by #2
+# z.d
+#
+# So diff = z.d.
+#
+# If [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time
+# spelling we wanted in the endcase described above. We're done. Contrarily,
+# if z.d = 0, then we have a UTC equivalent, and are also done.
+#
+# If [5] is not true now, diff = z.d != 0, and z.d is the offset we need to
+# add to z (in effect, z is in tz's standard time, and we need to shift the
+# local clock into tz's daylight time).
+#
+# Let
+#
+# z' = z + z.d = z + diff [7]
+#
+# and we can again ask whether
+#
+# z'.n - z'.o = x.n [8]
+#
+# If so, we're done. If not, the tzinfo class is insane, according to the
+# assumptions we've made. This also requires a bit of proof. As before, let's
+# compute the difference between the LHS and RHS of [8] (and skipping some of
+# the justifications for the kinds of substitutions we've done several times
+# already):
+#
+# diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7]
+# x.n - (z.n + diff - z'.o) = replacing diff via [6]
+# x.n - (z.n + x.n - (z.n - z.o) - z'.o) =
+# x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n
+# - z.n + z.n - z.o + z'.o = cancel z.n
+# - z.o + z'.o = #1 twice
+# -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo
+# z'.d - z.d
+#
+# So z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal,
+# we've found the UTC-equivalent so are done. In fact, we stop with [7] and
+# return z', not bothering to compute z'.d.
+#
+# How could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by
+# a dst() offset, and starting *from* a time already in DST (we know z.d != 0),
+# would have to change the result dst() returns: we start in DST, and moving
+# a little further into it takes us out of DST.
+#
+# There isn't a sane case where this can happen. The closest it gets is at
+# the end of DST, where there's an hour in UTC with no spelling in a hybrid
+# tzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During
+# that hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM
+# UTC) because the docs insist on that, but 0:MM is taken as being in daylight
+# time (4:MM UTC). There is no local time mapping to 5:MM UTC. The local
+# clock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in
+# standard time. Since that's what the local clock *does*, we want to map both
+# UTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous
+# in local time, but so it goes -- it's the way the local clock works.
+#
+# When x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,
+# so z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going.
+# z' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]
+# (correctly) concludes that z' is not UTC-equivalent to x.
+#
+# Because we know z.d said z was in daylight time (else [5] would have held and
+# we would have stopped then), and we know z.d != z'.d (else [8] would have held
+# and we have stopped then), and there are only 2 possible values dst() can
+# return in Eastern, it follows that z'.d must be 0 (which it is in the example,
+# but the reasoning doesn't depend on the example -- it depends on there being
+# two possible dst() outcomes, one zero and the other non-zero). Therefore
+# z' must be in standard time, and is the spelling we want in this case.
+#
+# Note again that z' is not UTC-equivalent as far as the hybrid tzinfo class is
+# concerned (because it takes z' as being in standard time rather than the
+# daylight time we intend here), but returning it gives the real-life "local
+# clock repeats an hour" behavior when mapping the "unspellable" UTC hour into
+# tz.
+#
+# When the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with
+# the 1:MM standard time spelling we want.
+#
+# So how can this break? One of the assumptions must be violated. Two
+# possibilities:
+#
+# 1) [2] effectively says that y.s is invariant across all y belong to a given
+# time zone. This isn't true if, for political reasons or continental drift,
+# a region decides to change its base offset from UTC.
+#
+# 2) There may be versions of "double daylight" time where the tail end of
+# the analysis gives up a step too early. I haven't thought about that
+# enough to say.
+#
+# In any case, it's clear that the default fromutc() is strong enough to handle
+# "almost all" time zones: so long as the standard offset is invariant, it
+# doesn't matter if daylight time transition points change from year to year, or
+# if daylight time is skipped in some years; it doesn't matter how large or
+# small dst() may get within its bounds; and it doesn't even matter if some
+# perverse time zone returns a negative dst()). So a breaking case must be
+# pretty bizarre, and a tzinfo subclass can override fromutc() if it is.
-It's helpful to step back at look at [4] from a higher level: it's simply
-mapping from UTC to tz's standard time.
-
-At this point, if
-
- z.n - z.o = x.n [5]
-
-we have an equivalent time, and are almost done. The insecurity here is
-at the start of daylight time. Picture US Eastern for concreteness. The wall
-time jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good
-sense then. The docs ask that an Eastern tzinfo class consider such a time to
-be EDT (because it's "after 2"), which is a redundant spelling of 1:MM EST
-on the day DST starts. We want to return the 1:MM EST spelling because that's
-the only spelling that makes sense on the local wall clock.
-
-In fact, if [5] holds at this point, we do have the standard-time spelling,
-but that takes a bit of proof. We first prove a stronger result. What's the
-difference between the LHS and RHS of [5]? Let
-
- diff = x.n - (z.n - z.o) [6]
-
-Now
- z.n = by [4]
- (y + y.s).n = by #5
- y.n + y.s = since y.n = x.n
- x.n + y.s = since z and y are have the same tzinfo member,
- y.s = z.s by #2
- x.n + z.s
-
-Plugging that back into [6] gives
-
- diff =
- x.n - ((x.n + z.s) - z.o) = expanding
- x.n - x.n - z.s + z.o = cancelling
- - z.s + z.o = by #2
- z.d
-
-So diff = z.d.
-
-If [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time
-spelling we wanted in the endcase described above. We're done. Contrarily,
-if z.d = 0, then we have a UTC equivalent, and are also done.
-
-If [5] is not true now, diff = z.d != 0, and z.d is the offset we need to
-add to z (in effect, z is in tz's standard time, and we need to shift the
-local clock into tz's daylight time).
-
-Let
-
- z' = z + z.d = z + diff [7]
-
-and we can again ask whether
-
- z'.n - z'.o = x.n [8]
-
-If so, we're done. If not, the tzinfo class is insane, according to the
-assumptions we've made. This also requires a bit of proof. As before, let's
-compute the difference between the LHS and RHS of [8] (and skipping some of
-the justifications for the kinds of substitutions we've done several times
-already):
-
- diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7]
- x.n - (z.n + diff - z'.o) = replacing diff via [6]
- x.n - (z.n + x.n - (z.n - z.o) - z'.o) =
- x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n
- - z.n + z.n - z.o + z'.o = cancel z.n
- - z.o + z'.o = #1 twice
- -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo
- z'.d - z.d
-
-So z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal,
-we've found the UTC-equivalent so are done. In fact, we stop with [7] and
-return z', not bothering to compute z'.d.
-
-How could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by
-a dst() offset, and starting *from* a time already in DST (we know z.d != 0),
-would have to change the result dst() returns: we start in DST, and moving
-a little further into it takes us out of DST.
-
-There isn't a sane case where this can happen. The closest it gets is at
-the end of DST, where there's an hour in UTC with no spelling in a hybrid
-tzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During
-that hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM
-UTC) because the docs insist on that, but 0:MM is taken as being in daylight
-time (4:MM UTC). There is no local time mapping to 5:MM UTC. The local
-clock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in
-standard time. Since that's what the local clock *does*, we want to map both
-UTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous
-in local time, but so it goes -- it's the way the local clock works.
-
-When x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,
-so z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going.
-z' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]
-(correctly) concludes that z' is not UTC-equivalent to x.
-
-Because we know z.d said z was in daylight time (else [5] would have held and
-we would have stopped then), and we know z.d != z'.d (else [8] would have held
-and we have stopped then), and there are only 2 possible values dst() can
-return in Eastern, it follows that z'.d must be 0 (which it is in the example,
-but the reasoning doesn't depend on the example -- it depends on there being
-two possible dst() outcomes, one zero and the other non-zero). Therefore
-z' must be in standard time, and is the spelling we want in this case.
-
-Note again that z' is not UTC-equivalent as far as the hybrid tzinfo class is
-concerned (because it takes z' as being in standard time rather than the
-daylight time we intend here), but returning it gives the real-life "local
-clock repeats an hour" behavior when mapping the "unspellable" UTC hour into
-tz.
-
-When the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with
-the 1:MM standard time spelling we want.
-
-So how can this break? One of the assumptions must be violated. Two
-possibilities:
-
-1) [2] effectively says that y.s is invariant across all y belong to a given
- time zone. This isn't true if, for political reasons or continental drift,
- a region decides to change its base offset from UTC.
-
-2) There may be versions of "double daylight" time where the tail end of
- the analysis gives up a step too early. I haven't thought about that
- enough to say.
-
-In any case, it's clear that the default fromutc() is strong enough to handle
-"almost all" time zones: so long as the standard offset is invariant, it
-doesn't matter if daylight time transition points change from year to year, or
-if daylight time is skipped in some years; it doesn't matter how large or
-small dst() may get within its bounds; and it doesn't even matter if some
-perverse time zone returns a negative dst()). So a breaking case must be
-pretty bizarre, and a tzinfo subclass can override fromutc() if it is.
-"""
try:
from _datetime import *
except ImportError:
diff --git a/Lib/dbm/__init__.py b/Lib/dbm/__init__.py
index a783fde..5f4664a 100644
--- a/Lib/dbm/__init__.py
+++ b/Lib/dbm/__init__.py
@@ -42,7 +42,7 @@ _names = ['dbm.gnu', 'dbm.ndbm', 'dbm.dumb']
_defaultmod = None
_modules = {}
-error = (error, IOError)
+error = (error, OSError)
try:
from dbm import ndbm
@@ -111,12 +111,10 @@ def whichdb(filename):
try:
f = io.open(filename + ".pag", "rb")
f.close()
- # dbm linked with gdbm on OS/2 doesn't have .dir file
- if not (ndbm.library == "GNU gdbm" and sys.platform == "os2emx"):
- f = io.open(filename + ".dir", "rb")
- f.close()
+ f = io.open(filename + ".dir", "rb")
+ f.close()
return "dbm.ndbm"
- except IOError:
+ except OSError:
# some dbm emulations based on Berkeley DB generate a .db file
# some do not, but they should be caught by the bsd checks
try:
@@ -129,7 +127,7 @@ def whichdb(filename):
d = ndbm.open(filename)
d.close()
return "dbm.ndbm"
- except IOError:
+ except OSError:
pass
# Check for dumbdbm next -- this has a .dir and a .dat file
@@ -146,13 +144,13 @@ def whichdb(filename):
return "dbm.dumb"
finally:
f.close()
- except (OSError, IOError):
+ except OSError:
pass
# See if the file exists, return None if not
try:
f = io.open(filename, "rb")
- except IOError:
+ except OSError:
return None
# Read the start of the file -- the magic number
diff --git a/Lib/dbm/dumb.py b/Lib/dbm/dumb.py
index cfb9123..9ac7852 100644
--- a/Lib/dbm/dumb.py
+++ b/Lib/dbm/dumb.py
@@ -29,7 +29,7 @@ __all__ = ["error", "open"]
_BLOCKSIZE = 512
-error = IOError
+error = OSError
class _Database(collections.MutableMapping):
@@ -67,7 +67,7 @@ class _Database(collections.MutableMapping):
# Mod by Jack: create data file if needed
try:
f = _io.open(self._datfile, 'r', encoding="Latin-1")
- except IOError:
+ except OSError:
f = _io.open(self._datfile, 'w', encoding="Latin-1")
self._chmod(self._datfile)
f.close()
@@ -78,7 +78,7 @@ class _Database(collections.MutableMapping):
self._index = {}
try:
f = _io.open(self._dirfile, 'r', encoding="Latin-1")
- except IOError:
+ except OSError:
pass
else:
for line in f:
@@ -100,12 +100,12 @@ class _Database(collections.MutableMapping):
try:
self._os.unlink(self._bakfile)
- except self._os.error:
+ except OSError:
pass
try:
self._os.rename(self._dirfile, self._bakfile)
- except self._os.error:
+ except OSError:
pass
f = self._io.open(self._dirfile, 'w', encoding="Latin-1")
diff --git a/Lib/decimal.py b/Lib/decimal.py
index 1826deb..d39ac1d 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -703,8 +703,7 @@ class Decimal(object):
raise TypeError("Cannot convert %r to Decimal" % value)
- # @classmethod, but @decorator is not valid Python 2.3 syntax, so
- # don't use it (see notes on Py2.3 compatibility at top of file)
+ @classmethod
def from_float(cls, f):
"""Converts a float to a decimal number, exactly.
@@ -743,7 +742,6 @@ class Decimal(object):
return result
else:
return cls(result)
- from_float = classmethod(from_float)
def _isnan(self):
"""Returns whether the number is not actually one.
diff --git a/Lib/difflib.py b/Lib/difflib.py
index fe94cc4..159cbe4 100644
--- a/Lib/difflib.py
+++ b/Lib/difflib.py
@@ -336,20 +336,6 @@ class SequenceMatcher:
for elt in popular: # ditto; as fast for 1% deletion
del b2j[elt]
- def isbjunk(self, item):
- "Deprecated; use 'item in SequenceMatcher().bjunk'."
- warnings.warn("'SequenceMatcher().isbjunk(item)' is deprecated;\n"
- "use 'item in SMinstance.bjunk' instead.",
- DeprecationWarning, 2)
- return item in self.bjunk
-
- def isbpopular(self, item):
- "Deprecated; use 'item in SequenceMatcher().bpopular'."
- warnings.warn("'SequenceMatcher().isbpopular(item)' is deprecated;\n"
- "use 'item in SMinstance.bpopular' instead.",
- DeprecationWarning, 2)
- return item in self.bpopular
-
def find_longest_match(self, alo, ahi, blo, bhi):
"""Find longest matching block in a[alo:ahi] and b[blo:bhi].
@@ -922,8 +908,7 @@ class Differ:
else:
raise ValueError('unknown tag %r' % (tag,))
- for line in g:
- yield line
+ yield from g
def _dump(self, tag, x, lo, hi):
"""Generate comparison results for a same-tagged range."""
@@ -942,8 +927,7 @@ class Differ:
second = self._dump('+', b, blo, bhi)
for g in first, second:
- for line in g:
- yield line
+ yield from g
def _fancy_replace(self, a, alo, ahi, b, blo, bhi):
r"""
@@ -997,8 +981,7 @@ class Differ:
# no non-identical "pretty close" pair
if eqi is None:
# no identical pair either -- treat it as a straight replace
- for line in self._plain_replace(a, alo, ahi, b, blo, bhi):
- yield line
+ yield from self._plain_replace(a, alo, ahi, b, blo, bhi)
return
# no close pair, but an identical pair -- synch up on that
best_i, best_j, best_ratio = eqi, eqj, 1.0
@@ -1010,8 +993,7 @@ class Differ:
# identical
# pump out diffs from before the synch point
- for line in self._fancy_helper(a, alo, best_i, b, blo, best_j):
- yield line
+ yield from self._fancy_helper(a, alo, best_i, b, blo, best_j)
# do intraline marking on the synch pair
aelt, belt = a[best_i], b[best_j]
@@ -1033,15 +1015,13 @@ class Differ:
btags += ' ' * lb
else:
raise ValueError('unknown tag %r' % (tag,))
- for line in self._qformat(aelt, belt, atags, btags):
- yield line
+ yield from self._qformat(aelt, belt, atags, btags)
else:
# the synch pair is identical
yield ' ' + aelt
# pump out diffs from after the synch point
- for line in self._fancy_helper(a, best_i+1, ahi, b, best_j+1, bhi):
- yield line
+ yield from self._fancy_helper(a, best_i+1, ahi, b, best_j+1, bhi)
def _fancy_helper(self, a, alo, ahi, b, blo, bhi):
g = []
@@ -1053,8 +1033,7 @@ class Differ:
elif blo < bhi:
g = self._dump('+', b, blo, bhi)
- for line in g:
- yield line
+ yield from g
def _qformat(self, aline, bline, atags, btags):
r"""
diff --git a/Lib/dis.py b/Lib/dis.py
index 543fdc7..ca4094c 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -2,12 +2,14 @@
import sys
import types
+import collections
from opcode import *
from opcode import __all__ as _opcodes_all
__all__ = ["code_info", "dis", "disassemble", "distb", "disco",
- "findlinestarts", "findlabels", "show_code"] + _opcodes_all
+ "findlinestarts", "findlabels", "show_code",
+ "get_instructions", "Instruction", "Bytecode"] + _opcodes_all
del _opcodes_all
_have_code = (types.MethodType, types.FunctionType, types.CodeType, type)
@@ -25,7 +27,7 @@ def _try_compile(source, name):
c = compile(source, name, 'exec')
return c
-def dis(x=None):
+def dis(x=None, *, file=None):
"""Disassemble classes, methods, functions, or code.
With no argument, disassemble the last traceback.
@@ -42,23 +44,23 @@ def dis(x=None):
items = sorted(x.__dict__.items())
for name, x1 in items:
if isinstance(x1, _have_code):
- print("Disassembly of %s:" % name)
+ print("Disassembly of %s:" % name, file=file)
try:
dis(x1)
except TypeError as msg:
- print("Sorry:", msg)
- print()
+ print("Sorry:", msg, file=file)
+ print(file=file)
elif hasattr(x, 'co_code'): # Code object
- disassemble(x)
+ disassemble(x, file=file)
elif isinstance(x, (bytes, bytearray)): # Raw bytecode
- _disassemble_bytes(x)
+ _disassemble_bytes(x, file=file)
elif isinstance(x, str): # Source code
- _disassemble_str(x)
+ _disassemble_str(x, file=file)
else:
raise TypeError("don't know how to disassemble %s objects" %
type(x).__name__)
-def distb(tb=None):
+def distb(tb=None, *, file=None):
"""Disassemble a traceback (default: last traceback)."""
if tb is None:
try:
@@ -66,7 +68,7 @@ def distb(tb=None):
except AttributeError:
raise RuntimeError("no last traceback to disassemble")
while tb.tb_next: tb = tb.tb_next
- disassemble(tb.tb_frame.f_code, tb.tb_lasti)
+ disassemble(tb.tb_frame.f_code, tb.tb_lasti, file=file)
# The inspect module interrogates this dictionary to build its
# list of CO_* constants. It is also used by pretty_flags to
@@ -95,19 +97,22 @@ def pretty_flags(flags):
names.append(hex(flags))
return ", ".join(names)
-def code_info(x):
- """Formatted details of methods, functions, or code."""
+def _get_code_object(x):
+ """Helper to handle methods, functions, strings and raw code objects"""
if hasattr(x, '__func__'): # Method
x = x.__func__
if hasattr(x, '__code__'): # Function
x = x.__code__
if isinstance(x, str): # Source code
- x = _try_compile(x, "<code_info>")
+ x = _try_compile(x, "<disassembly>")
if hasattr(x, 'co_code'): # Code object
- return _format_code_info(x)
- else:
- raise TypeError("don't know how to disassemble %s objects" %
- type(x).__name__)
+ return x
+ raise TypeError("don't know how to disassemble %s objects" %
+ type(x).__name__)
+
+def code_info(x):
+ """Formatted details of methods, functions, or code."""
+ return _format_code_info(_get_code_object(x))
def _format_code_info(co):
lines = []
@@ -140,106 +145,196 @@ def _format_code_info(co):
lines.append("%4d: %s" % i_n)
return "\n".join(lines)
-def show_code(co):
+def show_code(co, *, file=None):
"""Print details of methods, functions, or code to stdout."""
- print(code_info(co))
+ print(code_info(co), file=file)
-def disassemble(co, lasti=-1):
- """Disassemble a code object."""
- code = co.co_code
- labels = findlabels(code)
+_Instruction = collections.namedtuple("_Instruction",
+ "opname opcode arg argval argrepr offset starts_line is_jump_target")
+
+class Instruction(_Instruction):
+ """Details for a bytecode operation
+
+ Defined fields:
+ opname - human readable name for operation
+ opcode - numeric code for operation
+ arg - numeric argument to operation (if any), otherwise None
+ argval - resolved arg value (if known), otherwise same as arg
+ argrepr - human readable description of operation argument
+ offset - start index of operation within bytecode sequence
+ starts_line - line started by this opcode (if any), otherwise None
+ is_jump_target - True if other code jumps to here, otherwise False
+ """
+
+ def _disassemble(self, lineno_width=3, mark_as_current=False):
+ """Format instruction details for inclusion in disassembly output
+
+ *lineno_width* sets the width of the line number field (0 omits it)
+ *mark_as_current* inserts a '-->' marker arrow as part of the line
+ """
+ fields = []
+ # Column: Source code line number
+ if lineno_width:
+ if self.starts_line is not None:
+ lineno_fmt = "%%%dd" % lineno_width
+ fields.append(lineno_fmt % self.starts_line)
+ else:
+ fields.append(' ' * lineno_width)
+ # Column: Current instruction indicator
+ if mark_as_current:
+ fields.append('-->')
+ else:
+ fields.append(' ')
+ # Column: Jump target marker
+ if self.is_jump_target:
+ fields.append('>>')
+ else:
+ fields.append(' ')
+ # Column: Instruction offset from start of code sequence
+ fields.append(repr(self.offset).rjust(4))
+ # Column: Opcode name
+ fields.append(self.opname.ljust(20))
+ # Column: Opcode argument
+ if self.arg is not None:
+ fields.append(repr(self.arg).rjust(5))
+ # Column: Opcode argument details
+ if self.argrepr:
+ fields.append('(' + self.argrepr + ')')
+ return ' '.join(fields)
+
+
+def get_instructions(x, *, line_offset=0):
+ """Iterator for the opcodes in methods, functions or code
+
+ Generates a series of Instruction named tuples giving the details of
+ each operations in the supplied code.
+
+ The given line offset is added to the 'starts_line' attribute of any
+ instructions that start a new line.
+ """
+ co = _get_code_object(x)
+ cell_names = co.co_cellvars + co.co_freevars
linestarts = dict(findlinestarts(co))
- n = len(code)
- i = 0
+ return _get_instructions_bytes(co.co_code, co.co_varnames, co.co_names,
+ co.co_consts, cell_names, linestarts,
+ line_offset)
+
+def _get_const_info(const_index, const_list):
+ """Helper to get optional details about const references
+
+ Returns the dereferenced constant and its repr if the constant
+ list is defined.
+ Otherwise returns the constant index and its repr().
+ """
+ argval = const_index
+ if const_list is not None:
+ argval = const_list[const_index]
+ return argval, repr(argval)
+
+def _get_name_info(name_index, name_list):
+ """Helper to get optional details about named references
+
+ Returns the dereferenced name as both value and repr if the name
+ list is defined.
+ Otherwise returns the name index and its repr().
+ """
+ argval = name_index
+ if name_list is not None:
+ argval = name_list[name_index]
+ argrepr = argval
+ else:
+ argrepr = repr(argval)
+ return argval, argrepr
+
+
+def _get_instructions_bytes(code, varnames=None, names=None, constants=None,
+ cells=None, linestarts=None, line_offset=0):
+ """Iterate over the instructions in a bytecode string.
+
+ Generates a sequence of Instruction namedtuples giving the details of each
+ opcode. Additional information about the code's runtime environment
+ (e.g. variable names, constants) can be specified using optional
+ arguments.
+
+ """
+ labels = findlabels(code)
extended_arg = 0
+ starts_line = None
free = None
+ # enumerate() is not an option, since we sometimes process
+ # multiple elements on a single pass through the loop
+ n = len(code)
+ i = 0
while i < n:
op = code[i]
- if i in linestarts:
- if i > 0:
- print()
- print("%3d" % linestarts[i], end=' ')
- else:
- print(' ', end=' ')
-
- if i == lasti: print('-->', end=' ')
- else: print(' ', end=' ')
- if i in labels: print('>>', end=' ')
- else: print(' ', end=' ')
- print(repr(i).rjust(4), end=' ')
- print(opname[op].ljust(20), end=' ')
+ offset = i
+ if linestarts is not None:
+ starts_line = linestarts.get(i, None)
+ if starts_line is not None:
+ starts_line += line_offset
+ is_jump_target = i in labels
i = i+1
+ arg = None
+ argval = None
+ argrepr = ''
if op >= HAVE_ARGUMENT:
- oparg = code[i] + code[i+1]*256 + extended_arg
+ arg = code[i] + code[i+1]*256 + extended_arg
extended_arg = 0
i = i+2
if op == EXTENDED_ARG:
- extended_arg = oparg*65536
- print(repr(oparg).rjust(5), end=' ')
+ extended_arg = arg*65536
+ # Set argval to the dereferenced value of the argument when
+ # availabe, and argrepr to the string representation of argval.
+ # _disassemble_bytes needs the string repr of the
+ # raw name index for LOAD_GLOBAL, LOAD_CONST, etc.
+ argval = arg
if op in hasconst:
- print('(' + repr(co.co_consts[oparg]) + ')', end=' ')
+ argval, argrepr = _get_const_info(arg, constants)
elif op in hasname:
- print('(' + co.co_names[oparg] + ')', end=' ')
+ argval, argrepr = _get_name_info(arg, names)
elif op in hasjrel:
- print('(to ' + repr(i + oparg) + ')', end=' ')
+ argval = i + arg
+ argrepr = "to " + repr(argval)
elif op in haslocal:
- print('(' + co.co_varnames[oparg] + ')', end=' ')
+ argval, argrepr = _get_name_info(arg, varnames)
elif op in hascompare:
- print('(' + cmp_op[oparg] + ')', end=' ')
+ argval = cmp_op[arg]
+ argrepr = argval
elif op in hasfree:
- if free is None:
- free = co.co_cellvars + co.co_freevars
- print('(' + free[oparg] + ')', end=' ')
+ argval, argrepr = _get_name_info(arg, cells)
elif op in hasnargs:
- print('(%d positional, %d keyword pair)'
- % (code[i-2], code[i-1]), end=' ')
- print()
+ argrepr = "%d positional, %d keyword pair" % (code[i-2], code[i-1])
+ yield Instruction(opname[op], op,
+ arg, argval, argrepr,
+ offset, starts_line, is_jump_target)
+
+def disassemble(co, lasti=-1, *, file=None):
+ """Disassemble a code object."""
+ cell_names = co.co_cellvars + co.co_freevars
+ linestarts = dict(findlinestarts(co))
+ _disassemble_bytes(co.co_code, lasti, co.co_varnames, co.co_names,
+ co.co_consts, cell_names, linestarts, file=file)
def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
- constants=None):
- labels = findlabels(code)
- n = len(code)
- i = 0
- while i < n:
- op = code[i]
- if i == lasti: print('-->', end=' ')
- else: print(' ', end=' ')
- if i in labels: print('>>', end=' ')
- else: print(' ', end=' ')
- print(repr(i).rjust(4), end=' ')
- print(opname[op].ljust(15), end=' ')
- i = i+1
- if op >= HAVE_ARGUMENT:
- oparg = code[i] + code[i+1]*256
- i = i+2
- print(repr(oparg).rjust(5), end=' ')
- if op in hasconst:
- if constants:
- print('(' + repr(constants[oparg]) + ')', end=' ')
- else:
- print('(%d)'%oparg, end=' ')
- elif op in hasname:
- if names is not None:
- print('(' + names[oparg] + ')', end=' ')
- else:
- print('(%d)'%oparg, end=' ')
- elif op in hasjrel:
- print('(to ' + repr(i + oparg) + ')', end=' ')
- elif op in haslocal:
- if varnames:
- print('(' + varnames[oparg] + ')', end=' ')
- else:
- print('(%d)' % oparg, end=' ')
- elif op in hascompare:
- print('(' + cmp_op[oparg] + ')', end=' ')
- elif op in hasnargs:
- print('(%d positional, %d keyword pair)'
- % (code[i-2], code[i-1]), end=' ')
- print()
+ constants=None, cells=None, linestarts=None,
+ *, file=None):
+ # Omit the line number column entirely if we have no line number info
+ show_lineno = linestarts is not None
+ # TODO?: Adjust width upwards if max(linestarts.values()) >= 1000?
+ lineno_width = 3 if show_lineno else 0
+ for instr in _get_instructions_bytes(code, varnames, names,
+ constants, cells, linestarts):
+ new_source_line = (show_lineno and
+ instr.starts_line is not None and
+ instr.offset > 0)
+ if new_source_line:
+ print(file=file)
+ is_current_instr = instr.offset == lasti
+ print(instr._disassemble(lineno_width, is_current_instr), file=file)
-def _disassemble_str(source):
+def _disassemble_str(source, *, file=None):
"""Compile the source string, then disassemble the code object."""
- disassemble(_try_compile(source, '<dis>'))
+ disassemble(_try_compile(source, '<dis>'), file=file)
disco = disassemble # XXX For backwards compatibility
@@ -250,19 +345,21 @@ def findlabels(code):
"""
labels = []
+ # enumerate() is not an option, since we sometimes process
+ # multiple elements on a single pass through the loop
n = len(code)
i = 0
while i < n:
op = code[i]
i = i+1
if op >= HAVE_ARGUMENT:
- oparg = code[i] + code[i+1]*256
+ arg = code[i] + code[i+1]*256
i = i+2
label = -1
if op in hasjrel:
- label = i+oparg
+ label = i+arg
elif op in hasjabs:
- label = oparg
+ label = arg
if label >= 0:
if label not in labels:
labels.append(label)
@@ -290,6 +387,50 @@ def findlinestarts(code):
if lineno != lastlineno:
yield (addr, lineno)
+class Bytecode:
+ """The bytecode operations of a piece of code
+
+ Instantiate this with a function, method, string of code, or a code object
+ (as returned by compile()).
+
+ Iterating over this yields the bytecode operations as Instruction instances.
+ """
+ def __init__(self, x):
+ self.codeobj = _get_code_object(x)
+ self.cell_names = self.codeobj.co_cellvars + self.codeobj.co_freevars
+ self.linestarts = dict(findlinestarts(self.codeobj))
+ self.line_offset = 0
+ self.original_object = x
+
+ def __iter__(self):
+ co = self.codeobj
+ return _get_instructions_bytes(co.co_code, co.co_varnames, co.co_names,
+ co.co_consts, self.cell_names,
+ self.linestarts, self.line_offset)
+
+ def __repr__(self):
+ return "{}({!r})".format(self.__class__.__name__, self.original_object)
+
+ def info(self):
+ """Return formatted information about the code object."""
+ return _format_code_info(self.codeobj)
+
+ def show_info(self, *, file=None):
+ """Print the information about the code object as returned by info()."""
+ print(self.info(), file=file)
+
+ def display_code(self, *, file=None):
+ """Print a formatted view of the bytecode operations.
+ """
+ co = self.codeobj
+ return _disassemble_bytes(co.co_code, varnames=co.co_varnames,
+ names=co.co_names, constants=co.co_consts,
+ cells=self.cell_names,
+ linestarts=self.linestarts,
+ file=file
+ )
+
+
def _test():
"""Simple test program to disassemble a file."""
if sys.argv[1:]:
diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py
index 83d7cb7..f4076d7 100644
--- a/Lib/distutils/__init__.py
+++ b/Lib/distutils/__init__.py
@@ -13,5 +13,5 @@ used from a setup script as
# Updated automatically by the Python release process.
#
#--start constants--
-__version__ = "3.3.2"
+__version__ = "3.4.0a1"
#--end constants--
diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py
index c795c95..911e84d 100644
--- a/Lib/distutils/ccompiler.py
+++ b/Lib/distutils/ccompiler.py
@@ -351,7 +351,7 @@ class CCompiler:
return macros, objects, extra, pp_opts, build
def _get_cc_args(self, pp_opts, debug, before):
- # works for unixccompiler, emxccompiler, cygwinccompiler
+ # works for unixccompiler, cygwinccompiler
cc_args = pp_opts + ['-c']
if debug:
cc_args[:0] = ['-g']
@@ -926,7 +926,6 @@ _default_compilers = (
# on a cygwin built python we can use gcc like an ordinary UNIXish
# compiler
('cygwin.*', 'unix'),
- ('os2emx', 'emx'),
# OS name mappings
('posix', 'unix'),
@@ -968,8 +967,6 @@ compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler',
"Mingw32 port of GNU C Compiler for Win32"),
'bcpp': ('bcppcompiler', 'BCPPCompiler',
"Borland C++ Compiler"),
- 'emx': ('emxccompiler', 'EMXCCompiler',
- "EMX port of GNU C Compiler for OS/2"),
}
def show_compilers():
diff --git a/Lib/distutils/command/bdist.py b/Lib/distutils/command/bdist.py
index c5188eb..38b169a 100644
--- a/Lib/distutils/command/bdist.py
+++ b/Lib/distutils/command/bdist.py
@@ -52,8 +52,7 @@ class bdist(Command):
# This won't do in reality: will need to distinguish RPM-ish Linux,
# Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS.
default_format = {'posix': 'gztar',
- 'nt': 'zip',
- 'os2': 'zip'}
+ 'nt': 'zip'}
# Establish the preferred order (for the --help-formats option).
format_commands = ['rpm', 'gztar', 'bztar', 'ztar', 'tar',
diff --git a/Lib/distutils/command/bdist_dumb.py b/Lib/distutils/command/bdist_dumb.py
index 1ab09d1..eefdfea 100644
--- a/Lib/distutils/command/bdist_dumb.py
+++ b/Lib/distutils/command/bdist_dumb.py
@@ -38,8 +38,7 @@ class bdist_dumb(Command):
boolean_options = ['keep-temp', 'skip-build', 'relative']
default_format = { 'posix': 'gztar',
- 'nt': 'zip',
- 'os2': 'zip' }
+ 'nt': 'zip' }
def initialize_options(self):
self.bdist_dir = None
@@ -85,11 +84,6 @@ class bdist_dumb(Command):
archive_basename = "%s.%s" % (self.distribution.get_fullname(),
self.plat_name)
- # OS/2 objects to any ":" characters in a filename (such as when
- # a timestamp is used in a version) so change them to hyphens.
- if os.name == "os2":
- archive_basename = archive_basename.replace(":", "-")
-
pseudoinstall_root = os.path.join(self.dist_dir, archive_basename)
if not self.relative:
archive_root = self.bdist_dir
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
index 1ad0d5f..a6aad53 100644
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -230,11 +230,6 @@ class build_ext(Command):
self.library_dirs.append(os.path.join(sys.exec_prefix,
'PC', 'VC6'))
- # OS/2 (EMX) doesn't support Debug vs Release builds, but has the
- # import libraries in its "Config" subdirectory
- if os.name == 'os2':
- self.library_dirs.append(os.path.join(sys.exec_prefix, 'Config'))
-
# for extensions under Cygwin and AtheOS Python's library directory must be
# appended to library_dirs
if sys.platform[:6] == 'cygwin' or sys.platform[:6] == 'atheos':
@@ -620,9 +615,6 @@ class build_ext(Command):
return fn
else:
return "swig.exe"
- elif os.name == "os2":
- # assume swig available in the PATH.
- return "swig.exe"
else:
raise DistutilsPlatformError(
"I don't know how to find (much less run) SWIG "
@@ -673,9 +665,6 @@ class build_ext(Command):
"""
from distutils.sysconfig import get_config_var
ext_path = ext_name.split('.')
- # OS/2 has an 8 character module (extension) limit :-(
- if os.name == "os2":
- ext_path[len(ext_path) - 1] = ext_path[len(ext_path) - 1][:8]
# extensions in debug_mode are named 'module_d.pyd' under windows
ext_suffix = get_config_var('EXT_SUFFIX')
if os.name == 'nt' and self.debug:
@@ -696,7 +685,7 @@ class build_ext(Command):
def get_libraries(self, ext):
"""Return the list of libraries to link against when building a
shared extension. On most platforms, this is just 'ext.libraries';
- on Windows and OS/2, we add the Python library (eg. python20.dll).
+ on Windows, we add the Python library (eg. python20.dll).
"""
# The python library is always needed on Windows. For MSVC, this
# is redundant, since the library is mentioned in a pragma in
@@ -716,19 +705,6 @@ class build_ext(Command):
return ext.libraries + [pythonlib]
else:
return ext.libraries
- elif sys.platform == "os2emx":
- # EMX/GCC requires the python library explicitly, and I
- # believe VACPP does as well (though not confirmed) - AIM Apr01
- template = "python%d%d"
- # debug versions of the main DLL aren't supported, at least
- # not at this time - AIM Apr01
- #if self.debug:
- # template = template + '_d'
- pythonlib = (template %
- (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
- # don't extend ext.libraries, it may be shared with other
- # extensions, it is a reference to the original list
- return ext.libraries + [pythonlib]
elif sys.platform[:6] == "cygwin":
template = "python%d.%d"
pythonlib = (template %
diff --git a/Lib/distutils/command/build_py.py b/Lib/distutils/command/build_py.py
index 1371b3d..677723f 100644
--- a/Lib/distutils/command/build_py.py
+++ b/Lib/distutils/command/build_py.py
@@ -3,7 +3,7 @@
Implements the Distutils 'build_py' command."""
import os
-import imp
+import importlib.util
import sys
from glob import glob
@@ -312,11 +312,11 @@ class build_py (Command):
outputs.append(filename)
if include_bytecode:
if self.compile:
- outputs.append(imp.cache_from_source(filename,
- debug_override=True))
+ outputs.append(importlib.util.cache_from_source(
+ filename, debug_override=True))
if self.optimize > 0:
- outputs.append(imp.cache_from_source(filename,
- debug_override=False))
+ outputs.append(importlib.util.cache_from_source(
+ filename, debug_override=False))
outputs += [
os.path.join(build_dir, filename)
diff --git a/Lib/distutils/command/build_scripts.py b/Lib/distutils/command/build_scripts.py
index 4b5b22e..90a8380 100644
--- a/Lib/distutils/command/build_scripts.py
+++ b/Lib/distutils/command/build_scripts.py
@@ -74,7 +74,7 @@ class build_scripts(Command):
# script.
try:
f = open(script, "rb")
- except IOError:
+ except OSError:
if not self.dry_run:
raise
f = None
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
index 3c675d1..456511c 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -58,13 +58,6 @@ INSTALL_SCHEMES = {
'data' : '$base',
},
'nt': WINDOWS_SCHEME,
- 'os2': {
- 'purelib': '$base/Lib/site-packages',
- 'platlib': '$base/Lib/site-packages',
- 'headers': '$base/Include/$dist_name',
- 'scripts': '$base/Scripts',
- 'data' : '$base',
- },
}
# user site schemes
@@ -86,14 +79,6 @@ if HAS_USER_SITE:
'data' : '$userbase',
}
- INSTALL_SCHEMES['os2_home'] = {
- 'purelib': '$usersite',
- 'platlib': '$usersite',
- 'headers': '$userbase/include/python$py_version_short/$dist_name',
- 'scripts': '$userbase/bin',
- 'data' : '$userbase',
- }
-
# The keys to an installation scheme; if any new types of files are to be
# installed, be sure to add an entry to every installation scheme above,
# and to SCHEME_KEYS here.
diff --git a/Lib/distutils/command/install_lib.py b/Lib/distutils/command/install_lib.py
index 15c08f1..215813b 100644
--- a/Lib/distutils/command/install_lib.py
+++ b/Lib/distutils/command/install_lib.py
@@ -4,7 +4,7 @@ Implements the Distutils 'install_lib' command
(install all Python modules)."""
import os
-import imp
+import importlib.util
import sys
from distutils.core import Command
@@ -165,10 +165,10 @@ class install_lib(Command):
if ext != PYTHON_SOURCE_EXTENSION:
continue
if self.compile:
- bytecode_files.append(imp.cache_from_source(
+ bytecode_files.append(importlib.util.cache_from_source(
py_file, debug_override=True))
if self.optimize > 0:
- bytecode_files.append(imp.cache_from_source(
+ bytecode_files.append(importlib.util.cache_from_source(
py_file, debug_override=False))
return bytecode_files
diff --git a/Lib/distutils/command/upload.py b/Lib/distutils/command/upload.py
index 8b36851..88990b2 100644
--- a/Lib/distutils/command/upload.py
+++ b/Lib/distutils/command/upload.py
@@ -186,7 +186,7 @@ class upload(PyPIRCCommand):
http.putheader('Authorization', auth)
http.endheaders()
http.send(body)
- except socket.error as e:
+ except OSError as e:
self.announce(str(e), log.ERROR)
return
diff --git a/Lib/distutils/config.py b/Lib/distutils/config.py
index 1fd5334..7439a83 100644
--- a/Lib/distutils/config.py
+++ b/Lib/distutils/config.py
@@ -21,7 +21,7 @@ password:%s
class PyPIRCCommand(Command):
"""Base command that knows how to handle the .pypirc file
"""
- DEFAULT_REPOSITORY = 'http://pypi.python.org/pypi'
+ DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi'
DEFAULT_REALM = 'pypi'
repository = None
realm = None
@@ -83,6 +83,15 @@ class PyPIRCCommand(Command):
current[key] = config.get(server, key)
else:
current[key] = default
+
+ # work around people having "repository" for the "pypi"
+ # section of their config set to the HTTP (rather than
+ # HTTPS) URL
+ if (server == 'pypi' and
+ repository in (self.DEFAULT_REPOSITORY, 'pypi')):
+ current['repository'] = self.DEFAULT_REPOSITORY
+ return current
+
if (current['server'] == repository or
current['repository'] == repository):
return current
diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
index 260332a..91e5132 100644
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -148,7 +148,7 @@ def setup (**attrs):
dist.run_commands()
except KeyboardInterrupt:
raise SystemExit("interrupted")
- except (IOError, os.error) as exc:
+ except OSError as exc:
error = grok_environment_error(exc)
if DEBUG:
diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py
index 0bdd539..0c23ab1 100644
--- a/Lib/distutils/cygwinccompiler.py
+++ b/Lib/distutils/cygwinccompiler.py
@@ -359,7 +359,7 @@ def check_config_h():
return CONFIG_H_NOTOK, "'%s' does not mention '__GNUC__'" % fn
finally:
config_h.close()
- except IOError as exc:
+ except OSError as exc:
return (CONFIG_H_UNCERTAIN,
"couldn't read '%s': %s" % (fn, exc.strerror))
diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py
index 2826ff8..2b35aa3 100644
--- a/Lib/distutils/dir_util.py
+++ b/Lib/distutils/dir_util.py
@@ -124,7 +124,7 @@ def copy_tree(src, dst, preserve_mode=1, preserve_times=1,
"cannot copy tree '%s': not a directory" % src)
try:
names = os.listdir(src)
- except os.error as e:
+ except OSError as e:
(errno, errstr) = e
if dry_run:
names = []
@@ -198,7 +198,7 @@ def remove_tree(directory, verbose=1, dry_run=0):
abspath = os.path.abspath(cmd[1])
if abspath in _path_created:
del _path_created[abspath]
- except (IOError, OSError) as exc:
+ except OSError as exc:
log.warn(grok_environment_error(
exc, "error removing %s: " % directory))
diff --git a/Lib/distutils/emxccompiler.py b/Lib/distutils/emxccompiler.py
deleted file mode 100644
index 3675f8d..0000000
--- a/Lib/distutils/emxccompiler.py
+++ /dev/null
@@ -1,315 +0,0 @@
-"""distutils.emxccompiler
-
-Provides the EMXCCompiler class, a subclass of UnixCCompiler that
-handles the EMX port of the GNU C compiler to OS/2.
-"""
-
-# issues:
-#
-# * OS/2 insists that DLLs can have names no longer than 8 characters
-# We put export_symbols in a def-file, as though the DLL can have
-# an arbitrary length name, but truncate the output filename.
-#
-# * only use OMF objects and use LINK386 as the linker (-Zomf)
-#
-# * always build for multithreading (-Zmt) as the accompanying OS/2 port
-# of Python is only distributed with threads enabled.
-#
-# tested configurations:
-#
-# * EMX gcc 2.81/EMX 0.9d fix03
-
-import os,sys,copy
-from distutils.ccompiler import gen_preprocess_options, gen_lib_options
-from distutils.unixccompiler import UnixCCompiler
-from distutils.file_util import write_file
-from distutils.errors import DistutilsExecError, CompileError, UnknownFileError
-from distutils import log
-
-class EMXCCompiler (UnixCCompiler):
-
- compiler_type = 'emx'
- obj_extension = ".obj"
- static_lib_extension = ".lib"
- shared_lib_extension = ".dll"
- static_lib_format = "%s%s"
- shared_lib_format = "%s%s"
- res_extension = ".res" # compiled resource file
- exe_extension = ".exe"
-
- def __init__ (self,
- verbose=0,
- dry_run=0,
- force=0):
-
- UnixCCompiler.__init__ (self, verbose, dry_run, force)
-
- (status, details) = check_config_h()
- self.debug_print("Python's GCC status: %s (details: %s)" %
- (status, details))
- if status is not CONFIG_H_OK:
- self.warn(
- "Python's pyconfig.h doesn't seem to support your compiler. " +
- ("Reason: %s." % details) +
- "Compiling may fail because of undefined preprocessor macros.")
-
- (self.gcc_version, self.ld_version) = \
- get_versions()
- self.debug_print(self.compiler_type + ": gcc %s, ld %s\n" %
- (self.gcc_version,
- self.ld_version) )
-
- # Hard-code GCC because that's what this is all about.
- # XXX optimization, warnings etc. should be customizable.
- self.set_executables(compiler='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
- compiler_so='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
- linker_exe='gcc -Zomf -Zmt -Zcrtdll',
- linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll')
-
- # want the gcc library statically linked (so that we don't have
- # to distribute a version dependent on the compiler we have)
- self.dll_libraries=["gcc"]
-
- # __init__ ()
-
- def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
- if ext == '.rc':
- # gcc requires '.rc' compiled to binary ('.res') files !!!
- try:
- self.spawn(["rc", "-r", src])
- except DistutilsExecError as msg:
- raise CompileError(msg)
- else: # for other files use the C-compiler
- try:
- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
- extra_postargs)
- except DistutilsExecError as msg:
- raise CompileError(msg)
-
- def link (self,
- target_desc,
- objects,
- output_filename,
- output_dir=None,
- libraries=None,
- library_dirs=None,
- runtime_library_dirs=None,
- export_symbols=None,
- debug=0,
- extra_preargs=None,
- extra_postargs=None,
- build_temp=None,
- target_lang=None):
-
- # use separate copies, so we can modify the lists
- extra_preargs = copy.copy(extra_preargs or [])
- libraries = copy.copy(libraries or [])
- objects = copy.copy(objects or [])
-
- # Additional libraries
- libraries.extend(self.dll_libraries)
-
- # handle export symbols by creating a def-file
- # with executables this only works with gcc/ld as linker
- if ((export_symbols is not None) and
- (target_desc != self.EXECUTABLE)):
- # (The linker doesn't do anything if output is up-to-date.
- # So it would probably better to check if we really need this,
- # but for this we had to insert some unchanged parts of
- # UnixCCompiler, and this is not what we want.)
-
- # we want to put some files in the same directory as the
- # object files are, build_temp doesn't help much
- # where are the object files
- temp_dir = os.path.dirname(objects[0])
- # name of dll to give the helper files the same base name
- (dll_name, dll_extension) = os.path.splitext(
- os.path.basename(output_filename))
-
- # generate the filenames for these files
- def_file = os.path.join(temp_dir, dll_name + ".def")
-
- # Generate .def file
- contents = [
- "LIBRARY %s INITINSTANCE TERMINSTANCE" % \
- os.path.splitext(os.path.basename(output_filename))[0],
- "DATA MULTIPLE NONSHARED",
- "EXPORTS"]
- for sym in export_symbols:
- contents.append(' "%s"' % sym)
- self.execute(write_file, (def_file, contents),
- "writing %s" % def_file)
-
- # next add options for def-file and to creating import libraries
- # for gcc/ld the def-file is specified as any other object files
- objects.append(def_file)
-
- #end: if ((export_symbols is not None) and
- # (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
-
- # who wants symbols and a many times larger output file
- # should explicitly switch the debug mode on
- # otherwise we let dllwrap/ld strip the output file
- # (On my machine: 10KB < stripped_file < ??100KB
- # unstripped_file = stripped_file + XXX KB
- # ( XXX=254 for a typical python extension))
- if not debug:
- extra_preargs.append("-s")
-
- UnixCCompiler.link(self,
- target_desc,
- objects,
- output_filename,
- output_dir,
- libraries,
- library_dirs,
- runtime_library_dirs,
- None, # export_symbols, we do this in our def-file
- debug,
- extra_preargs,
- extra_postargs,
- build_temp,
- target_lang)
-
- # link ()
-
- # -- Miscellaneous methods -----------------------------------------
-
- # override the object_filenames method from CCompiler to
- # support rc and res-files
- def object_filenames (self,
- source_filenames,
- strip_dir=0,
- output_dir=''):
- if output_dir is None: output_dir = ''
- obj_names = []
- for src_name in source_filenames:
- # use normcase to make sure '.rc' is really '.rc' and not '.RC'
- (base, ext) = os.path.splitext (os.path.normcase(src_name))
- if ext not in (self.src_extensions + ['.rc']):
- raise UnknownFileError("unknown file type '%s' (from '%s')" % \
- (ext, src_name))
- if strip_dir:
- base = os.path.basename (base)
- if ext == '.rc':
- # these need to be compiled to object files
- obj_names.append (os.path.join (output_dir,
- base + self.res_extension))
- else:
- obj_names.append (os.path.join (output_dir,
- base + self.obj_extension))
- return obj_names
-
- # object_filenames ()
-
- # override the find_library_file method from UnixCCompiler
- # to deal with file naming/searching differences
- def find_library_file(self, dirs, lib, debug=0):
- shortlib = '%s.lib' % lib
- longlib = 'lib%s.lib' % lib # this form very rare
-
- # get EMX's default library directory search path
- try:
- emx_dirs = os.environ['LIBRARY_PATH'].split(';')
- except KeyError:
- emx_dirs = []
-
- for dir in dirs + emx_dirs:
- shortlibp = os.path.join(dir, shortlib)
- longlibp = os.path.join(dir, longlib)
- if os.path.exists(shortlibp):
- return shortlibp
- elif os.path.exists(longlibp):
- return longlibp
-
- # Oops, didn't find it in *any* of 'dirs'
- return None
-
-# class EMXCCompiler
-
-
-# Because these compilers aren't configured in Python's pyconfig.h file by
-# default, we should at least warn the user if he is using a unmodified
-# version.
-
-CONFIG_H_OK = "ok"
-CONFIG_H_NOTOK = "not ok"
-CONFIG_H_UNCERTAIN = "uncertain"
-
-def check_config_h():
-
- """Check if the current Python installation (specifically, pyconfig.h)
- appears amenable to building extensions with GCC. Returns a tuple
- (status, details), where 'status' is one of the following constants:
- CONFIG_H_OK
- all is well, go ahead and compile
- CONFIG_H_NOTOK
- doesn't look good
- CONFIG_H_UNCERTAIN
- not sure -- unable to read pyconfig.h
- 'details' is a human-readable string explaining the situation.
-
- Note there are two ways to conclude "OK": either 'sys.version' contains
- the string "GCC" (implying that this Python was built with GCC), or the
- installed "pyconfig.h" contains the string "__GNUC__".
- """
-
- # XXX since this function also checks sys.version, it's not strictly a
- # "pyconfig.h" check -- should probably be renamed...
-
- from distutils import sysconfig
- # if sys.version contains GCC then python was compiled with
- # GCC, and the pyconfig.h file should be OK
- if sys.version.find("GCC") >= 0:
- return (CONFIG_H_OK, "sys.version mentions 'GCC'")
-
- fn = sysconfig.get_config_h_filename()
- try:
- # It would probably better to read single lines to search.
- # But we do this only once, and it is fast enough
- f = open(fn)
- try:
- s = f.read()
- finally:
- f.close()
-
- except IOError as exc:
- # if we can't read this file, we cannot say it is wrong
- # the compiler will complain later about this file as missing
- return (CONFIG_H_UNCERTAIN,
- "couldn't read '%s': %s" % (fn, exc.strerror))
-
- else:
- # "pyconfig.h" contains an "#ifdef __GNUC__" or something similar
- if s.find("__GNUC__") >= 0:
- return (CONFIG_H_OK, "'%s' mentions '__GNUC__'" % fn)
- else:
- return (CONFIG_H_NOTOK, "'%s' does not mention '__GNUC__'" % fn)
-
-
-def get_versions():
- """ Try to find out the versions of gcc and ld.
- If not possible it returns None for it.
- """
- from distutils.version import StrictVersion
- from distutils.spawn import find_executable
- import re
-
- gcc_exe = find_executable('gcc')
- if gcc_exe:
- out = os.popen(gcc_exe + ' -dumpversion','r')
- try:
- out_string = out.read()
- finally:
- out.close()
- result = re.search('(\d+\.\d+\.\d+)', out_string, re.ASCII)
- if result:
- gcc_version = StrictVersion(result.group(1))
- else:
- gcc_version = None
- else:
- gcc_version = None
- # EMX ld has no way of reporting version number, and we use GCC
- # anyway - so we can link OMF DLLs
- ld_version = None
- return (gcc_version, ld_version)
diff --git a/Lib/distutils/errors.py b/Lib/distutils/errors.py
index eb13c98..8b93059 100644
--- a/Lib/distutils/errors.py
+++ b/Lib/distutils/errors.py
@@ -35,8 +35,8 @@ class DistutilsArgError (DistutilsError):
class DistutilsFileError (DistutilsError):
"""Any problems in the filesystem: expected file not found, etc.
- Typically this is for problems that we detect before IOError or
- OSError could be raised."""
+ Typically this is for problems that we detect before OSError
+ could be raised."""
pass
class DistutilsOptionError (DistutilsError):
diff --git a/Lib/distutils/file_util.py b/Lib/distutils/file_util.py
index 9bdd14e..f6ed290 100644
--- a/Lib/distutils/file_util.py
+++ b/Lib/distutils/file_util.py
@@ -27,26 +27,26 @@ def _copy_file_contents(src, dst, buffer_size=16*1024):
try:
try:
fsrc = open(src, 'rb')
- except os.error as e:
+ except OSError as e:
raise DistutilsFileError("could not open '%s': %s" % (src, e.strerror))
if os.path.exists(dst):
try:
os.unlink(dst)
- except os.error as e:
+ except OSError as e:
raise DistutilsFileError(
"could not delete '%s': %s" % (dst, e.strerror))
try:
fdst = open(dst, 'wb')
- except os.error as e:
+ except OSError as e:
raise DistutilsFileError(
"could not create '%s': %s" % (dst, e.strerror))
while True:
try:
buf = fsrc.read(buffer_size)
- except os.error as e:
+ except OSError as e:
raise DistutilsFileError(
"could not read from '%s': %s" % (src, e.strerror))
@@ -55,7 +55,7 @@ def _copy_file_contents(src, dst, buffer_size=16*1024):
try:
fdst.write(buf)
- except os.error as e:
+ except OSError as e:
raise DistutilsFileError(
"could not write to '%s': %s" % (dst, e.strerror))
finally:
@@ -193,7 +193,7 @@ def move_file (src, dst,
copy_it = False
try:
os.rename(src, dst)
- except os.error as e:
+ except OSError as e:
(num, msg) = e
if num == errno.EXDEV:
copy_it = True
@@ -205,11 +205,11 @@ def move_file (src, dst,
copy_file(src, dst, verbose=verbose)
try:
os.unlink(src)
- except os.error as e:
+ except OSError as e:
(num, msg) = e
try:
os.unlink(dst)
- except os.error:
+ except OSError:
pass
raise DistutilsFileError(
"couldn't move '%s' to '%s' by copy/delete: "
diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py
index b3f6ce1..9688f20 100644
--- a/Lib/distutils/msvc9compiler.py
+++ b/Lib/distutils/msvc9compiler.py
@@ -729,7 +729,7 @@ class MSVCCompiler(CCompiler) :
return manifest_file
finally:
manifest_f.close()
- except IOError:
+ except OSError:
pass
# -- Miscellaneous methods -----------------------------------------
diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py
index f58c55f..b1c5a44 100644
--- a/Lib/distutils/spawn.py
+++ b/Lib/distutils/spawn.py
@@ -32,8 +32,6 @@ def spawn(cmd, search_path=1, verbose=0, dry_run=0):
_spawn_posix(cmd, search_path, dry_run=dry_run)
elif os.name == 'nt':
_spawn_nt(cmd, search_path, dry_run=dry_run)
- elif os.name == 'os2':
- _spawn_os2(cmd, search_path, dry_run=dry_run)
else:
raise DistutilsPlatformError(
"don't know how to spawn programs on platform '%s'" % os.name)
@@ -74,26 +72,6 @@ def _spawn_nt(cmd, search_path=1, verbose=0, dry_run=0):
raise DistutilsExecError(
"command '%s' failed with exit status %d" % (cmd[0], rc))
-def _spawn_os2(cmd, search_path=1, verbose=0, dry_run=0):
- executable = cmd[0]
- if search_path:
- # either we find one or it stays the same
- executable = find_executable(executable) or executable
- log.info(' '.join([executable] + cmd[1:]))
- if not dry_run:
- # spawnv for OS/2 EMX requires a full path to the .exe
- try:
- rc = os.spawnv(os.P_WAIT, executable, cmd)
- except OSError as exc:
- # this seems to happen when the command isn't found
- raise DistutilsExecError(
- "command '%s' failed: %s" % (cmd[0], exc.args[-1]))
- if rc != 0:
- # and this reflects the command running but failing
- log.debug("command '%s' failed with exit status %d" % (cmd[0], rc))
- raise DistutilsExecError(
- "command '%s' failed with exit status %d" % (cmd[0], rc))
-
if sys.platform == 'darwin':
from distutils import sysconfig
_cfg_target = None
@@ -180,7 +158,7 @@ def find_executable(executable, path=None):
paths = path.split(os.pathsep)
base, ext = os.path.splitext(executable)
- if (sys.platform == 'win32' or os.name == 'os2') and (ext != '.exe'):
+ if (sys.platform == 'win32') and (ext != '.exe'):
executable = executable + '.exe'
if not os.path.isfile(executable):
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index b947988..d9c9d65 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -114,8 +114,6 @@ def get_python_inc(plat_specific=0, prefix=None):
return os.path.join(prefix, "include", python_dir)
elif os.name == "nt":
return os.path.join(prefix, "include")
- elif os.name == "os2":
- return os.path.join(prefix, "Include")
else:
raise DistutilsPlatformError(
"I don't know where Python installs its C header files "
@@ -157,11 +155,6 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
return prefix
else:
return os.path.join(prefix, "Lib", "site-packages")
- elif os.name == "os2":
- if standard_lib:
- return os.path.join(prefix, "Lib")
- else:
- return os.path.join(prefix, "Lib", "site-packages")
else:
raise DistutilsPlatformError(
"I don't know where Python installs its library "
@@ -442,7 +435,7 @@ def _init_posix():
try:
filename = get_makefile_filename()
parse_makefile(filename, g)
- except IOError as msg:
+ except OSError as msg:
my_msg = "invalid Python installation: unable to open %s" % filename
if hasattr(msg, "strerror"):
my_msg = my_msg + " (%s)" % msg.strerror
@@ -454,7 +447,7 @@ def _init_posix():
filename = get_config_h_filename()
with open(filename) as file:
parse_config_h(file, g)
- except IOError as msg:
+ except OSError as msg:
my_msg = "invalid Python installation: unable to open %s" % filename
if hasattr(msg, "strerror"):
my_msg = my_msg + " (%s)" % msg.strerror
@@ -492,7 +485,6 @@ def _init_nt():
# XXX hmmm.. a normal install puts include files here
g['INCLUDEPY'] = get_python_inc(plat_specific=0)
- g['SO'] = '.pyd'
g['EXT_SUFFIX'] = '.pyd'
g['EXE'] = ".exe"
g['VERSION'] = get_python_version().replace(".", "")
@@ -502,24 +494,6 @@ def _init_nt():
_config_vars = g
-def _init_os2():
- """Initialize the module as appropriate for OS/2"""
- g = {}
- # set basic install directories
- g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
- g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
-
- # XXX hmmm.. a normal install puts include files here
- g['INCLUDEPY'] = get_python_inc(plat_specific=0)
-
- g['SO'] = '.pyd'
- g['EXT_SUFFIX'] = '.pyd'
- g['EXE'] = ".exe"
-
- global _config_vars
- _config_vars = g
-
-
def get_config_vars(*args):
"""With no arguments, return a dictionary of all configuration
variables relevant for the current platform. Generally this includes
diff --git a/Lib/distutils/tests/test_bdist_dumb.py b/Lib/distutils/tests/test_bdist_dumb.py
index 0ad32d4..c8ccdc2 100644
--- a/Lib/distutils/tests/test_bdist_dumb.py
+++ b/Lib/distutils/tests/test_bdist_dumb.py
@@ -1,7 +1,6 @@
"""Tests for distutils.command.bdist_dumb."""
import os
-import imp
import sys
import zipfile
import unittest
@@ -75,8 +74,6 @@ class BuildDumbTestCase(support.TempdirManager,
# see what we have
dist_created = os.listdir(os.path.join(pkg_dir, 'dist'))
base = "%s.%s.zip" % (dist.get_fullname(), cmd.plat_name)
- if os.name == 'os2':
- base = base.replace(':', '-')
self.assertEqual(dist_created, [base])
@@ -90,7 +87,7 @@ class BuildDumbTestCase(support.TempdirManager,
contents = sorted(os.path.basename(fn) for fn in contents)
wanted = ['foo-0.1-py%s.%s.egg-info' % sys.version_info[:2], 'foo.py']
if not sys.dont_write_bytecode:
- wanted.append('foo.%s.pyc' % imp.get_tag())
+ wanted.append('foo.%s.pyc' % sys.implementation.cache_tag)
self.assertEqual(contents, sorted(wanted))
def test_suite():
diff --git a/Lib/distutils/tests/test_build_py.py b/Lib/distutils/tests/test_build_py.py
index e416edd..1b410c3 100644
--- a/Lib/distutils/tests/test_build_py.py
+++ b/Lib/distutils/tests/test_build_py.py
@@ -2,7 +2,6 @@
import os
import sys
-import imp
import unittest
from distutils.command.build_py import build_py
@@ -63,7 +62,8 @@ class BuildPyTestCase(support.TempdirManager,
self.assertFalse(os.path.exists(pycache_dir))
else:
pyc_files = os.listdir(pycache_dir)
- self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files)
+ self.assertIn("__init__.%s.pyc" % sys.implementation.cache_tag,
+ pyc_files)
def test_empty_package_dir(self):
# See bugs #1668596/#1720897
@@ -102,7 +102,8 @@ class BuildPyTestCase(support.TempdirManager,
found = os.listdir(cmd.build_lib)
self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py'])
found = os.listdir(os.path.join(cmd.build_lib, '__pycache__'))
- self.assertEqual(found, ['boiledeggs.%s.pyc' % imp.get_tag()])
+ self.assertEqual(found,
+ ['boiledeggs.%s.pyc' % sys.implementation.cache_tag])
@unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled')
def test_byte_compile_optimized(self):
@@ -119,7 +120,8 @@ class BuildPyTestCase(support.TempdirManager,
found = os.listdir(cmd.build_lib)
self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py'])
found = os.listdir(os.path.join(cmd.build_lib, '__pycache__'))
- self.assertEqual(sorted(found), ['boiledeggs.%s.pyo' % imp.get_tag()])
+ self.assertEqual(sorted(found),
+ ['boiledeggs.%s.pyo' % sys.implementation.cache_tag])
def test_dont_write_bytecode(self):
# makes sure byte_compile is not used
diff --git a/Lib/distutils/tests/test_config.py b/Lib/distutils/tests/test_config.py
index 525bee9..1259361 100644
--- a/Lib/distutils/tests/test_config.py
+++ b/Lib/distutils/tests/test_config.py
@@ -87,7 +87,7 @@ class PyPIRCCommandTestCase(support.TempdirManager,
config = list(sorted(config.items()))
waited = [('password', 'secret'), ('realm', 'pypi'),
- ('repository', 'http://pypi.python.org/pypi'),
+ ('repository', 'https://pypi.python.org/pypi'),
('server', 'server1'), ('username', 'me')]
self.assertEqual(config, waited)
@@ -96,7 +96,7 @@ class PyPIRCCommandTestCase(support.TempdirManager,
config = cmd._read_pypirc()
config = list(sorted(config.items()))
waited = [('password', 'secret'), ('realm', 'pypi'),
- ('repository', 'http://pypi.python.org/pypi'),
+ ('repository', 'https://pypi.python.org/pypi'),
('server', 'server-login'), ('username', 'tarek')]
self.assertEqual(config, waited)
diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
index b190127..42bd269 100644
--- a/Lib/distutils/tests/test_install.py
+++ b/Lib/distutils/tests/test_install.py
@@ -1,7 +1,6 @@
"""Tests for distutils.command.install."""
import os
-import imp
import sys
import unittest
import site
@@ -94,7 +93,7 @@ class InstallTestCase(support.TempdirManager,
self.addCleanup(cleanup)
- for key in ('nt_user', 'unix_user', 'os2_home'):
+ for key in ('nt_user', 'unix_user'):
self.assertIn(key, INSTALL_SCHEMES)
dist = Distribution({'name': 'xx'})
@@ -193,7 +192,8 @@ class InstallTestCase(support.TempdirManager,
f.close()
found = [os.path.basename(line) for line in content.splitlines()]
- expected = ['hello.py', 'hello.%s.pyc' % imp.get_tag(), 'sayhi',
+ expected = ['hello.py', 'hello.%s.pyc' % sys.implementation.cache_tag,
+ 'sayhi',
'UNKNOWN-0.0.0-py%s.%s.egg-info' % sys.version_info[:2]]
self.assertEqual(found, expected)
diff --git a/Lib/distutils/tests/test_install_lib.py b/Lib/distutils/tests/test_install_lib.py
index 2bd4dc6..dbb3e9a 100644
--- a/Lib/distutils/tests/test_install_lib.py
+++ b/Lib/distutils/tests/test_install_lib.py
@@ -1,7 +1,7 @@
"""Tests for distutils.command.install_data."""
import sys
import os
-import imp
+import importlib.util
import unittest
from distutils.command.install_lib import install_lib
@@ -44,8 +44,10 @@ class InstallLibTestCase(support.TempdirManager,
f = os.path.join(project_dir, 'foo.py')
self.write_file(f, '# python file')
cmd.byte_compile([f])
- pyc_file = imp.cache_from_source('foo.py', debug_override=True)
- pyo_file = imp.cache_from_source('foo.py', debug_override=False)
+ pyc_file = importlib.util.cache_from_source('foo.py',
+ debug_override=True)
+ pyo_file = importlib.util.cache_from_source('foo.py',
+ debug_override=False)
self.assertTrue(os.path.exists(pyc_file))
self.assertTrue(os.path.exists(pyo_file))
diff --git a/Lib/distutils/tests/test_upload.py b/Lib/distutils/tests/test_upload.py
index 4c6464a..4a71ca4 100644
--- a/Lib/distutils/tests/test_upload.py
+++ b/Lib/distutils/tests/test_upload.py
@@ -72,12 +72,12 @@ class uploadTestCase(PyPIRCCommandTestCase):
def setUp(self):
super(uploadTestCase, self).setUp()
- self.old_class = httpclient.HTTPConnection
- self.conn = httpclient.HTTPConnection = FakeConnection()
-
- def tearDown(self):
- httpclient.HTTPConnection = self.old_class
- super(uploadTestCase, self).tearDown()
+ if hasattr(httpclient, 'HTTPSConnection'):
+ self.addCleanup(setattr, httpclient, 'HTTPSConnection',
+ httpclient.HTTPSConnection)
+ else:
+ self.addCleanup(delattr, httpclient, 'HTTPSConnection')
+ self.conn = httpclient.HTTPSConnection = FakeConnection()
def test_finalize_options(self):
@@ -88,7 +88,7 @@ class uploadTestCase(PyPIRCCommandTestCase):
cmd.finalize_options()
for attr, waited in (('username', 'me'), ('password', 'secret'),
('realm', 'pypi'),
- ('repository', 'http://pypi.python.org/pypi')):
+ ('repository', 'https://pypi.python.org/pypi')):
self.assertEqual(getattr(cmd, attr), waited)
def test_saved_password(self):
diff --git a/Lib/distutils/tests/test_util.py b/Lib/distutils/tests/test_util.py
index eac9b51..b73cfe9 100644
--- a/Lib/distutils/tests/test_util.py
+++ b/Lib/distutils/tests/test_util.py
@@ -236,7 +236,7 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
self.assertRaises(DistutilsPlatformError,
change_root, 'c:\\root', 'its\\here')
- # XXX platforms to be covered: os2, mac
+ # XXX platforms to be covered: mac
def test_check_environ(self):
util._environ_checked = 0
diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
index 67d8166..efb3834 100644
--- a/Lib/distutils/util.py
+++ b/Lib/distutils/util.py
@@ -6,7 +6,7 @@ one of the other *util.py modules.
import os
import re
-import imp
+import importlib.util
import sys
import string
from distutils.errors import DistutilsPlatformError
@@ -154,12 +154,6 @@ def change_root (new_root, pathname):
path = path[1:]
return os.path.join(new_root, path)
- elif os.name == 'os2':
- (drive, path) = os.path.splitdrive(pathname)
- if path[0] == os.sep:
- path = path[1:]
- return os.path.join(new_root, path)
-
else:
raise DistutilsPlatformError("nothing known about platform '%s'" % os.name)
@@ -213,8 +207,8 @@ def subst_vars (s, local_vars):
def grok_environment_error (exc, prefix="error: "):
- """Generate a useful error message from an EnvironmentError (IOError or
- OSError) exception object. Handles Python 1.5.1 and 1.5.2 styles, and
+ """Generate a useful error message from an OSError
+ exception object. Handles Python 1.5.1 and 1.5.2 styles, and
does what it can to deal with exception objects that don't have a
filename (which happens when the error is due to a two-file operation,
such as 'rename()' or 'link()'. Returns the error message as a string
@@ -459,9 +453,10 @@ byte_compile(files, optimize=%r, force=%r,
# cfile - byte-compiled file
# dfile - purported source filename (same as 'file' by default)
if optimize >= 0:
- cfile = imp.cache_from_source(file, debug_override=not optimize)
+ cfile = importlib.util.cache_from_source(
+ file, debug_override=not optimize)
else:
- cfile = imp.cache_from_source(file)
+ cfile = importlib.util.cache_from_source(file)
dfile = file
if prefix:
if file[:len(prefix)] != prefix:
diff --git a/Lib/doctest.py b/Lib/doctest.py
index 0b485f1..a26c040 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -62,6 +62,7 @@ __all__ = [
'REPORT_NDIFF',
'REPORT_ONLY_FIRST_FAILURE',
'REPORTING_FLAGS',
+ 'FAIL_FAST',
# 1. Utility Functions
# 2. Example & DocTest
'Example',
@@ -92,6 +93,7 @@ __all__ = [
]
import __future__
+import argparse
import difflib
import inspect
import linecache
@@ -150,11 +152,13 @@ REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
+FAIL_FAST = register_optionflag('FAIL_FAST')
REPORTING_FLAGS = (REPORT_UDIFF |
REPORT_CDIFF |
REPORT_NDIFF |
- REPORT_ONLY_FIRST_FAILURE)
+ REPORT_ONLY_FIRST_FAILURE |
+ FAIL_FAST)
# Special string markers for use in `want` strings:
BLANKLINE_MARKER = '<BLANKLINE>'
@@ -212,7 +216,7 @@ def _load_testfile(filename, package, module_relative, encoding):
if module_relative:
package = _normalize_module(package, 3)
filename = _module_relative_path(package, filename)
- if hasattr(package, '__loader__'):
+ if getattr(package, '__loader__', None) is not None:
if hasattr(package.__loader__, 'get_data'):
file_contents = package.__loader__.get_data(filename)
file_contents = file_contents.decode(encoding)
@@ -1342,6 +1346,9 @@ class DocTestRunner:
else:
assert False, ("unknown outcome", outcome)
+ if failures and self.optionflags & FAIL_FAST:
+ break
+
# Restore the option flags (in case they were modified)
self.optionflags = original_optionflags
@@ -2702,13 +2709,30 @@ __test__ = {"_TestClass": _TestClass,
def _test():
- testfiles = [arg for arg in sys.argv[1:] if arg and arg[0] != '-']
- if not testfiles:
- name = os.path.basename(sys.argv[0])
- if '__loader__' in globals(): # python -m
- name, _ = os.path.splitext(name)
- print("usage: {0} [-v] file ...".format(name))
- return 2
+ parser = argparse.ArgumentParser(description="doctest runner")
+ parser.add_argument('-v', '--verbose', action='store_true', default=False,
+ help='print very verbose output for all tests')
+ parser.add_argument('-o', '--option', action='append',
+ choices=OPTIONFLAGS_BY_NAME.keys(), default=[],
+ help=('specify a doctest option flag to apply'
+ ' to the test run; may be specified more'
+ ' than once to apply multiple options'))
+ parser.add_argument('-f', '--fail-fast', action='store_true',
+ help=('stop running tests after first failure (this'
+ ' is a shorthand for -o FAIL_FAST, and is'
+ ' in addition to any other -o options)'))
+ parser.add_argument('file', nargs='+',
+ help='file containing the tests to run')
+ args = parser.parse_args()
+ testfiles = args.file
+ # Verbose used to be handled by the "inspect argv" magic in DocTestRunner,
+ # but since we are using argparse we are passing it manually now.
+ verbose = args.verbose
+ options = 0
+ for option in args.option:
+ options |= OPTIONFLAGS_BY_NAME[option]
+ if args.fail_fast:
+ options |= FAIL_FAST
for filename in testfiles:
if filename.endswith(".py"):
# It is a module -- insert its dir into sys.path and try to
@@ -2718,9 +2742,10 @@ def _test():
sys.path.insert(0, dirname)
m = __import__(filename[:-3])
del sys.path[0]
- failures, _ = testmod(m)
+ failures, _ = testmod(m, verbose=verbose, optionflags=options)
else:
- failures, _ = testfile(filename, module_relative=False)
+ failures, _ = testfile(filename, module_relative=False,
+ verbose=verbose, optionflags=options)
if failures:
return 1
return 0
diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py
index 291437c..0392379 100644
--- a/Lib/email/_header_value_parser.py
+++ b/Lib/email/_header_value_parser.py
@@ -368,8 +368,7 @@ class TokenList(list):
yield (indent + ' !! invalid element in token '
'list: {!r}'.format(token))
else:
- for line in token._pp(indent+' '):
- yield line
+ yield from token._pp(indent+' ')
if self.defects:
extra = ' Defects: {}'.format(self.defects)
else:
@@ -1315,24 +1314,22 @@ RouteComponentMarker = ValueTerminal('@', 'route-component-marker')
# Parser
#
-"""Parse strings according to RFC822/2047/2822/5322 rules.
-
-This is a stateless parser. Each get_XXX function accepts a string and
-returns either a Terminal or a TokenList representing the RFC object named
-by the method and a string containing the remaining unparsed characters
-from the input. Thus a parser method consumes the next syntactic construct
-of a given type and returns a token representing the construct plus the
-unparsed remainder of the input string.
-
-For example, if the first element of a structured header is a 'phrase',
-then:
-
- phrase, value = get_phrase(value)
-
-returns the complete phrase from the start of the string value, plus any
-characters left in the string after the phrase is removed.
-
-"""
+# Parse strings according to RFC822/2047/2822/5322 rules.
+#
+# This is a stateless parser. Each get_XXX function accepts a string and
+# returns either a Terminal or a TokenList representing the RFC object named
+# by the method and a string containing the remaining unparsed characters
+# from the input. Thus a parser method consumes the next syntactic construct
+# of a given type and returns a token representing the construct plus the
+# unparsed remainder of the input string.
+#
+# For example, if the first element of a structured header is a 'phrase',
+# then:
+#
+# phrase, value = get_phrase(value)
+#
+# returns the complete phrase from the start of the string value, plus any
+# characters left in the string after the phrase is removed.
_wsp_splitter = re.compile(r'([{}]+)'.format(''.join(WSP))).split
_non_atom_end_matcher = re.compile(r"[^{}]+".format(
diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py
index ea41e95..eb75fe3 100644
--- a/Lib/email/feedparser.py
+++ b/Lib/email/feedparser.py
@@ -98,24 +98,15 @@ class BufferedSubFile(object):
"""Push some new data into this object."""
# Handle any previous leftovers
data, self._partial = self._partial + data, ''
- # Crack into lines, but preserve the newlines on the end of each
- parts = NLCRE_crack.split(data)
- # The *ahem* interesting behaviour of re.split when supplied grouping
- # parentheses is that the last element of the resulting list is the
- # data after the final RE. In the case of a NL/CR terminated string,
- # this is the empty string.
- self._partial = parts.pop()
- #GAN 29Mar09 bugs 1555570, 1721862 Confusion at 8K boundary ending with \r:
- # is there a \n to follow later?
- if not self._partial and parts and parts[-1].endswith('\r'):
- self._partial = parts.pop(-2)+parts.pop()
- # parts is a list of strings, alternating between the line contents
- # and the eol character(s). Gather up a list of lines after
- # re-attaching the newlines.
- lines = []
- for i in range(len(parts) // 2):
- lines.append(parts[i*2] + parts[i*2+1])
- self.pushlines(lines)
+ # Crack into lines, but preserve the linesep characters on the end of each
+ parts = data.splitlines(True)
+ # If the last element of the list does not end in a newline, then treat
+ # it as a partial line. We only check for '\n' here because a line
+ # ending with '\r' might be a line that was split in the middle of a
+ # '\r\n' sequence (see bugs 1555570 and 1721862).
+ if parts and not parts[-1].endswith('\n'):
+ self._partial = parts.pop()
+ self.pushlines(parts)
def pushlines(self, lines):
# Reverse and insert at the front of the lines.
diff --git a/Lib/email/iterators.py b/Lib/email/iterators.py
index 3adc4a0..b5502ee 100644
--- a/Lib/email/iterators.py
+++ b/Lib/email/iterators.py
@@ -26,8 +26,7 @@ def walk(self):
yield self
if self.is_multipart():
for subpart in self.get_payload():
- for subsubpart in subpart.walk():
- yield subsubpart
+ yield from subpart.walk()
@@ -40,8 +39,7 @@ def body_line_iterator(msg, decode=False):
for subpart in msg.walk():
payload = subpart.get_payload(decode=decode)
if isinstance(payload, str):
- for line in StringIO(payload):
- yield line
+ yield from StringIO(payload)
def typed_subpart_iterator(msg, maintype='text', subtype=None):
diff --git a/Lib/email/message.py b/Lib/email/message.py
index 3feab52..b5f7b3a 100644
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -132,22 +132,50 @@ class Message:
def __str__(self):
"""Return the entire formatted message as a string.
- This includes the headers, body, and envelope header.
"""
return self.as_string()
- def as_string(self, unixfrom=False, maxheaderlen=0):
+ def as_string(self, unixfrom=False, maxheaderlen=0, policy=None):
"""Return the entire formatted message as a string.
- Optional `unixfrom' when True, means include the Unix From_ envelope
- header.
- This is a convenience method and may not generate the message exactly
- as you intend. For more flexibility, use the flatten() method of a
- Generator instance.
+ Optional 'unixfrom', when true, means include the Unix From_ envelope
+ header. For backward compatibility reasons, if maxheaderlen is
+ not specified it defaults to 0, so you must override it explicitly
+ if you want a different maxheaderlen. 'policy' is passed to the
+ Generator instance used to serialize the mesasge; if it is not
+ specified the policy associated with the message instance is used.
+
+ If the message object contains binary data that is not encoded
+ according to RFC standards, the non-compliant data will be replaced by
+ unicode "unknown character" code points.
"""
from email.generator import Generator
+ policy = self.policy if policy is None else policy
fp = StringIO()
- g = Generator(fp, mangle_from_=False, maxheaderlen=maxheaderlen)
+ g = Generator(fp,
+ mangle_from_=False,
+ maxheaderlen=maxheaderlen,
+ policy=policy)
+ g.flatten(self, unixfrom=unixfrom)
+ return fp.getvalue()
+
+ def __bytes__(self):
+ """Return the entire formatted message as a bytes object.
+ """
+ return self.as_bytes()
+
+ def as_bytes(self, unixfrom=False, policy=None):
+ """Return the entire formatted message as a bytes object.
+
+ Optional 'unixfrom', when true, means include the Unix From_ envelope
+ header. 'policy' is passed to the BytesGenerator instance used to
+ serialize the message; if not specified the policy associated with
+ the message instance is used.
+ """
+ from email.generator import BytesGenerator
+ policy = self.policy if policy is None else policy
+ fp = BytesIO()
+ g = BytesGenerator(fp, mangle_from_=False, policy=policy)
g.flatten(self, unixfrom=unixfrom)
return fp.getvalue()
diff --git a/Lib/email/parser.py b/Lib/email/parser.py
index 752bf35..f49d31d 100644
--- a/Lib/email/parser.py
+++ b/Lib/email/parser.py
@@ -4,7 +4,8 @@
"""A parser of RFC 2822 and MIME email messages."""
-__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser']
+__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser',
+ 'FeedParser', 'BytesFeedParser']
import warnings
from io import StringIO, TextIOWrapper
diff --git a/Lib/email/utils.py b/Lib/email/utils.py
index 93a625c..b3b42bb 100644
--- a/Lib/email/utils.py
+++ b/Lib/email/utils.py
@@ -54,10 +54,16 @@ TICK = "'"
specialsre = re.compile(r'[][\\()<>@,:;".]')
escapesre = re.compile(r'[\\"]')
-# How to figure out if we are processing strings that come from a byte
-# source with undecodable characters.
-_has_surrogates = re.compile(
- '([^\ud800-\udbff]|\A)[\udc00-\udfff]([^\udc00-\udfff]|\Z)').search
+def _has_surrogates(s):
+ """Return True if s contains surrogate-escaped binary data."""
+ # This check is based on the fact that unless there are surrogates, utf8
+ # (Python's default encoding) can encode any string. This is the fastest
+ # way to check for surrogates, see issue 11454 for timings.
+ try:
+ s.encode()
+ return False
+ except UnicodeEncodeError:
+ return True
# How to deal with a string containing bytes before handing it to the
# application through the 'normal' interface.
diff --git a/Lib/encodings/cp037.py b/Lib/encodings/cp037.py
index bfe2c1e..4edd708 100644
--- a/Lib/encodings/cp037.py
+++ b/Lib/encodings/cp037.py
@@ -301,7 +301,6 @@ decoding_table = (
'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE
'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE
'\x9f' # 0xFF -> CONTROL
- '\ufffe' ## Widen to UCS2 for optimization
)
### Encoding table
diff --git a/Lib/encodings/cp500.py b/Lib/encodings/cp500.py
index a975be7..5f61535 100644
--- a/Lib/encodings/cp500.py
+++ b/Lib/encodings/cp500.py
@@ -301,7 +301,6 @@ decoding_table = (
'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE
'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE
'\x9f' # 0xFF -> CONTROL
- '\ufffe' ## Widen to UCS2 for optimization
)
### Encoding table
diff --git a/Lib/encodings/iso8859_1.py b/Lib/encodings/iso8859_1.py
index d9cc516..8cfc01f 100644
--- a/Lib/encodings/iso8859_1.py
+++ b/Lib/encodings/iso8859_1.py
@@ -301,7 +301,6 @@ decoding_table = (
'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE
'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic)
'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS
- '\ufffe' ## Widen to UCS2 for optimization
)
### Encoding table
diff --git a/Lib/enum.py b/Lib/enum.py
new file mode 100644
index 0000000..5722b5f
--- /dev/null
+++ b/Lib/enum.py
@@ -0,0 +1,481 @@
+import sys
+from collections import OrderedDict
+from types import MappingProxyType
+
+__all__ = ['Enum', 'IntEnum', 'unique']
+
+
+class _RouteClassAttributeToGetattr:
+ """Route attribute access on a class to __getattr__.
+
+ This is a descriptor, used to define attributes that act differently when
+ accessed through an instance and through a class. Instance access remains
+ normal, but access to an attribute through a class will be routed to the
+ class's __getattr__ method; this is done by raising AttributeError.
+
+ """
+ def __init__(self, fget=None):
+ self.fget = fget
+
+ def __get__(self, instance, ownerclass=None):
+ if instance is None:
+ raise AttributeError()
+ return self.fget(instance)
+
+ def __set__(self, instance, value):
+ raise AttributeError("can't set attribute")
+
+ def __delete__(self, instance):
+ raise AttributeError("can't delete attribute")
+
+
+def _is_dunder(name):
+ """Returns True if a __dunder__ name, False otherwise."""
+ return (name[:2] == name[-2:] == '__' and
+ name[2:3] != '_' and
+ name[-3:-2] != '_')
+
+
+def _is_sunder(name):
+ """Returns True if a _sunder_ name, False otherwise."""
+ return (name[0] == name[-1] == '_' and
+ name[1:2] != '_' and
+ name[-2:-1] != '_')
+
+
+def _make_class_unpicklable(cls):
+ """Make the given class un-picklable."""
+ def _break_on_call_reduce(self):
+ raise TypeError('%r cannot be pickled' % self)
+ cls.__reduce__ = _break_on_call_reduce
+ cls.__module__ = '<unknown>'
+
+
+class _EnumDict(dict):
+ """Keeps track of definition order of the enum items.
+
+ EnumMeta will use the names found in self._member_names as the
+ enumeration member names.
+
+ """
+ def __init__(self):
+ super().__init__()
+ self._member_names = []
+
+ def __setitem__(self, key, value):
+ """Changes anything not dundered or that doesn't have __get__.
+
+ If a descriptor is added with the same name as an enum member, the name
+ is removed from _member_names (this may leave a hole in the numerical
+ sequence of values).
+
+ If an enum member name is used twice, an error is raised; duplicate
+ values are not checked for.
+
+ Single underscore (sunder) names are reserved.
+
+ """
+ if _is_sunder(key):
+ raise ValueError('_names_ are reserved for future Enum use')
+ elif _is_dunder(key) or hasattr(value, '__get__'):
+ if key in self._member_names:
+ # overwriting an enum with a method? then remove the name from
+ # _member_names or it will become an enum anyway when the class
+ # is created
+ self._member_names.remove(key)
+ else:
+ if key in self._member_names:
+ raise TypeError('Attempted to reuse key: %r' % key)
+ self._member_names.append(key)
+ super().__setitem__(key, value)
+
+
+# Dummy value for Enum as EnumMeta explicitly checks for it, but of course
+# until EnumMeta finishes running the first time the Enum class doesn't exist.
+# This is also why there are checks in EnumMeta like `if Enum is not None`
+Enum = None
+
+
+class EnumMeta(type):
+ """Metaclass for Enum"""
+ @classmethod
+ def __prepare__(metacls, cls, bases):
+ return _EnumDict()
+
+ def __new__(metacls, cls, bases, classdict):
+ # an Enum class is final once enumeration items have been defined; it
+ # cannot be mixed with other types (int, float, etc.) if it has an
+ # inherited __new__ unless a new __new__ is defined (or the resulting
+ # class will fail).
+ member_type, first_enum = metacls._get_mixins_(bases)
+ __new__, save_new, use_args = metacls._find_new_(classdict, member_type,
+ first_enum)
+
+ # save enum items into separate mapping so they don't get baked into
+ # the new class
+ members = {k: classdict[k] for k in classdict._member_names}
+ for name in classdict._member_names:
+ del classdict[name]
+
+ # check for illegal enum names (any others?)
+ invalid_names = set(members) & {'mro', }
+ if invalid_names:
+ raise ValueError('Invalid enum member name: {0}'.format(
+ ','.join(invalid_names)))
+
+ # create our new Enum type
+ enum_class = super().__new__(metacls, cls, bases, classdict)
+ enum_class._member_names_ = [] # names in definition order
+ enum_class._member_map_ = OrderedDict() # name->value map
+ enum_class._member_type_ = member_type
+
+ # Reverse value->name map for hashable values.
+ enum_class._value2member_map_ = {}
+
+ # check for a __getnewargs__, and if not present sabotage
+ # pickling, since it won't work anyway
+ if (member_type is not object and
+ member_type.__dict__.get('__getnewargs__') is None
+ ):
+ _make_class_unpicklable(enum_class)
+
+ # instantiate them, checking for duplicates as we go
+ # we instantiate first instead of checking for duplicates first in case
+ # a custom __new__ is doing something funky with the values -- such as
+ # auto-numbering ;)
+ for member_name in classdict._member_names:
+ value = members[member_name]
+ if not isinstance(value, tuple):
+ args = (value, )
+ else:
+ args = value
+ if member_type is tuple: # special case for tuple enums
+ args = (args, ) # wrap it one more time
+ if not use_args:
+ enum_member = __new__(enum_class)
+ if not hasattr(enum_member, '_value_'):
+ enum_member._value_ = value
+ else:
+ enum_member = __new__(enum_class, *args)
+ if not hasattr(enum_member, '_value_'):
+ enum_member._value_ = member_type(*args)
+ value = enum_member._value_
+ enum_member._name_ = member_name
+ enum_member.__init__(*args)
+ # If another member with the same value was already defined, the
+ # new member becomes an alias to the existing one.
+ for name, canonical_member in enum_class._member_map_.items():
+ if canonical_member.value == enum_member._value_:
+ enum_member = canonical_member
+ break
+ else:
+ # Aliases don't appear in member names (only in __members__).
+ enum_class._member_names_.append(member_name)
+ enum_class._member_map_[member_name] = enum_member
+ try:
+ # This may fail if value is not hashable. We can't add the value
+ # to the map, and by-value lookups for this value will be
+ # linear.
+ enum_class._value2member_map_[value] = enum_member
+ except TypeError:
+ pass
+
+ # double check that repr and friends are not the mixin's or various
+ # things break (such as pickle)
+ for name in ('__repr__', '__str__', '__getnewargs__'):
+ class_method = getattr(enum_class, name)
+ obj_method = getattr(member_type, name, None)
+ enum_method = getattr(first_enum, name, None)
+ if obj_method is not None and obj_method is class_method:
+ setattr(enum_class, name, enum_method)
+
+ # replace any other __new__ with our own (as long as Enum is not None,
+ # anyway) -- again, this is to support pickle
+ if Enum is not None:
+ # if the user defined their own __new__, save it before it gets
+ # clobbered in case they subclass later
+ if save_new:
+ enum_class.__new_member__ = __new__
+ enum_class.__new__ = Enum.__new__
+ return enum_class
+
+ def __call__(cls, value, names=None, *, module=None, type=None):
+ """Either returns an existing member, or creates a new enum class.
+
+ This method is used both when an enum class is given a value to match
+ to an enumeration member (i.e. Color(3)) and for the functional API
+ (i.e. Color = Enum('Color', names='red green blue')).
+
+ When used for the functional API: `module`, if set, will be stored in
+ the new class' __module__ attribute; `type`, if set, will be mixed in
+ as the first base class.
+
+ Note: if `module` is not set this routine will attempt to discover the
+ calling module by walking the frame stack; if this is unsuccessful
+ the resulting class will not be pickleable.
+
+ """
+ if names is None: # simple value lookup
+ return cls.__new__(cls, value)
+ # otherwise, functional API: we're creating a new Enum type
+ return cls._create_(value, names, module=module, type=type)
+
+ def __contains__(cls, member):
+ return isinstance(member, cls) and member.name in cls._member_map_
+
+ def __dir__(self):
+ return ['__class__', '__doc__', '__members__'] + self._member_names_
+
+ @property
+ def __members__(cls):
+ """Returns a mapping of member name->value.
+
+ This mapping lists all enum members, including aliases. Note that this
+ is a read-only view of the internal mapping.
+
+ """
+ return MappingProxyType(cls._member_map_)
+
+ def __getattr__(cls, name):
+ """Return the enum member matching `name`
+
+ We use __getattr__ instead of descriptors or inserting into the enum
+ class' __dict__ in order to support `name` and `value` being both
+ properties for enum members (which live in the class' __dict__) and
+ enum members themselves.
+
+ """
+ if _is_dunder(name):
+ raise AttributeError(name)
+ try:
+ return cls._member_map_[name]
+ except KeyError:
+ raise AttributeError(name) from None
+
+ def __getitem__(cls, name):
+ return cls._member_map_[name]
+
+ def __iter__(cls):
+ return (cls._member_map_[name] for name in cls._member_names_)
+
+ def __len__(cls):
+ return len(cls._member_names_)
+
+ def __repr__(cls):
+ return "<enum %r>" % cls.__name__
+
+ def _create_(cls, class_name, names=None, *, module=None, type=None):
+ """Convenience method to create a new Enum class.
+
+ `names` can be:
+
+ * A string containing member names, separated either with spaces or
+ commas. Values are auto-numbered from 1.
+ * An iterable of member names. Values are auto-numbered from 1.
+ * An iterable of (member name, value) pairs.
+ * A mapping of member name -> value.
+
+ """
+ metacls = cls.__class__
+ bases = (cls, ) if type is None else (type, cls)
+ classdict = metacls.__prepare__(class_name, bases)
+
+ # special processing needed for names?
+ if isinstance(names, str):
+ names = names.replace(',', ' ').split()
+ if isinstance(names, (tuple, list)) and isinstance(names[0], str):
+ names = [(e, i) for (i, e) in enumerate(names, 1)]
+
+ # Here, names is either an iterable of (name, value) or a mapping.
+ for item in names:
+ if isinstance(item, str):
+ member_name, member_value = item, names[item]
+ else:
+ member_name, member_value = item
+ classdict[member_name] = member_value
+ enum_class = metacls.__new__(metacls, class_name, bases, classdict)
+
+ # TODO: replace the frame hack if a blessed way to know the calling
+ # module is ever developed
+ if module is None:
+ try:
+ module = sys._getframe(2).f_globals['__name__']
+ except (AttributeError, ValueError) as exc:
+ pass
+ if module is None:
+ _make_class_unpicklable(enum_class)
+ else:
+ enum_class.__module__ = module
+
+ return enum_class
+
+ @staticmethod
+ def _get_mixins_(bases):
+ """Returns the type for creating enum members, and the first inherited
+ enum class.
+
+ bases: the tuple of bases that was given to __new__
+
+ """
+ if not bases:
+ return object, Enum
+
+ # double check that we are not subclassing a class with existing
+ # enumeration members; while we're at it, see if any other data
+ # type has been mixed in so we can use the correct __new__
+ member_type = first_enum = None
+ for base in bases:
+ if (base is not Enum and
+ issubclass(base, Enum) and
+ base._member_names_):
+ raise TypeError("Cannot extend enumerations")
+ # base is now the last base in bases
+ if not issubclass(base, Enum):
+ raise TypeError("new enumerations must be created as "
+ "`ClassName([mixin_type,] enum_type)`")
+
+ # get correct mix-in type (either mix-in type of Enum subclass, or
+ # first base if last base is Enum)
+ if not issubclass(bases[0], Enum):
+ member_type = bases[0] # first data type
+ first_enum = bases[-1] # enum type
+ else:
+ for base in bases[0].__mro__:
+ # most common: (IntEnum, int, Enum, object)
+ # possible: (<Enum 'AutoIntEnum'>, <Enum 'IntEnum'>,
+ # <class 'int'>, <Enum 'Enum'>,
+ # <class 'object'>)
+ if issubclass(base, Enum):
+ if first_enum is None:
+ first_enum = base
+ else:
+ if member_type is None:
+ member_type = base
+
+ return member_type, first_enum
+
+ @staticmethod
+ def _find_new_(classdict, member_type, first_enum):
+ """Returns the __new__ to be used for creating the enum members.
+
+ classdict: the class dictionary given to __new__
+ member_type: the data type whose __new__ will be used by default
+ first_enum: enumeration to check for an overriding __new__
+
+ """
+ # now find the correct __new__, checking to see of one was defined
+ # by the user; also check earlier enum classes in case a __new__ was
+ # saved as __new_member__
+ __new__ = classdict.get('__new__', None)
+
+ # should __new__ be saved as __new_member__ later?
+ save_new = __new__ is not None
+
+ if __new__ is None:
+ # check all possibles for __new_member__ before falling back to
+ # __new__
+ for method in ('__new_member__', '__new__'):
+ for possible in (member_type, first_enum):
+ target = getattr(possible, method, None)
+ if target not in {
+ None,
+ None.__new__,
+ object.__new__,
+ Enum.__new__,
+ }:
+ __new__ = target
+ break
+ if __new__ is not None:
+ break
+ else:
+ __new__ = object.__new__
+
+ # if a non-object.__new__ is used then whatever value/tuple was
+ # assigned to the enum member name will be passed to __new__ and to the
+ # new enum member's __init__
+ if __new__ is object.__new__:
+ use_args = False
+ else:
+ use_args = True
+
+ return __new__, save_new, use_args
+
+
+class Enum(metaclass=EnumMeta):
+ """Generic enumeration.
+
+ Derive from this class to define new enumerations.
+
+ """
+ def __new__(cls, value):
+ # all enum instances are actually created during class construction
+ # without calling this method; this method is called by the metaclass'
+ # __call__ (i.e. Color(3) ), and by pickle
+ if type(value) is cls:
+ # For lookups like Color(Color.red)
+ return value
+ # by-value search for a matching enum member
+ # see if it's in the reverse mapping (for hashable values)
+ try:
+ if value in cls._value2member_map_:
+ return cls._value2member_map_[value]
+ except TypeError:
+ # not there, now do long search -- O(n) behavior
+ for member in cls._member_map_.values():
+ if member.value == value:
+ return member
+ raise ValueError("%s is not a valid %s" % (value, cls.__name__))
+
+ def __repr__(self):
+ return "<%s.%s: %r>" % (
+ self.__class__.__name__, self._name_, self._value_)
+
+ def __str__(self):
+ return "%s.%s" % (self.__class__.__name__, self._name_)
+
+ def __dir__(self):
+ return (['__class__', '__doc__', 'name', 'value'])
+
+ def __eq__(self, other):
+ if type(other) is self.__class__:
+ return self is other
+ return NotImplemented
+
+ def __getnewargs__(self):
+ return (self._value_, )
+
+ def __hash__(self):
+ return hash(self._name_)
+
+ # _RouteClassAttributeToGetattr is used to provide access to the `name`
+ # and `value` properties of enum members while keeping some measure of
+ # protection from modification, while still allowing for an enumeration
+ # to have members named `name` and `value`. This works because enumeration
+ # members are not set directly on the enum class -- __getattr__ is
+ # used to look them up.
+
+ @_RouteClassAttributeToGetattr
+ def name(self):
+ return self._name_
+
+ @_RouteClassAttributeToGetattr
+ def value(self):
+ return self._value_
+
+
+class IntEnum(int, Enum):
+ """Enum where members are also (and must be) ints"""
+
+
+def unique(enumeration):
+ """Class decorator for enumerations ensuring unique member values."""
+ duplicates = []
+ for name, member in enumeration.__members__.items():
+ if name != member.name:
+ duplicates.append((name, member.name))
+ if duplicates:
+ alias_details = ', '.join(
+ ["%s -> %s" % (alias, name) for (alias, name) in duplicates])
+ raise ValueError('duplicate values found in %r: %s' %
+ (enumeration, alias_details))
+ return enumeration
diff --git a/Lib/filecmp.py b/Lib/filecmp.py
index f5cea1d..3285288 100644
--- a/Lib/filecmp.py
+++ b/Lib/filecmp.py
@@ -6,6 +6,7 @@ Classes:
Functions:
cmp(f1, f2, shallow=True) -> int
cmpfiles(a, b, common) -> ([], [], [])
+ clear_cache()
"""
@@ -13,11 +14,18 @@ import os
import stat
from itertools import filterfalse
-__all__ = ["cmp", "dircmp", "cmpfiles"]
+__all__ = ['clear_cache', 'cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES']
_cache = {}
BUFSIZE = 8*1024
+DEFAULT_IGNORES = [
+ 'RCS', 'CVS', 'tags', '.git', '.hg', '.bzr', '_darcs', '__pycache__']
+
+def clear_cache():
+ """Clear the filecmp cache."""
+ _cache.clear()
+
def cmp(f1, f2, shallow=True):
"""Compare two files.
@@ -35,7 +43,8 @@ def cmp(f1, f2, shallow=True):
True if the files are the same, False otherwise.
This function uses a cache for past comparisons and the results,
- with a cache invalidation mechanism relying on stale signatures.
+ with a cache invalidation mechanism relying on stale signatures
+ or by explicitly calling clear_cache().
"""
@@ -52,7 +61,7 @@ def cmp(f1, f2, shallow=True):
if outcome is None:
outcome = _do_cmp(f1, f2)
if len(_cache) > 100: # limit the maximum size of the cache
- _cache.clear()
+ clear_cache()
_cache[f1, f2, s1, s2] = outcome
return outcome
@@ -80,7 +89,7 @@ class dircmp:
dircmp(a, b, ignore=None, hide=None)
A and B are directories.
IGNORE is a list of names to ignore,
- defaults to ['RCS', 'CVS', 'tags'].
+ defaults to DEFAULT_IGNORES.
HIDE is a list of names to hide,
defaults to [os.curdir, os.pardir].
@@ -116,7 +125,7 @@ class dircmp:
else:
self.hide = hide
if ignore is None:
- self.ignore = ['RCS', 'CVS', 'tags'] # Names ignored in comparison
+ self.ignore = DEFAULT_IGNORES
else:
self.ignore = ignore
@@ -147,12 +156,12 @@ class dircmp:
ok = 1
try:
a_stat = os.stat(a_path)
- except os.error as why:
+ except OSError as why:
# print('Can\'t stat', a_path, ':', why.args[1])
ok = 0
try:
b_stat = os.stat(b_path)
- except os.error as why:
+ except OSError as why:
# print('Can\'t stat', b_path, ':', why.args[1])
ok = 0
@@ -268,7 +277,7 @@ def cmpfiles(a, b, common, shallow=True):
def _cmp(a, b, sh, abs=abs, cmp=cmp):
try:
return not abs(cmp(a, b, sh))
- except os.error:
+ except OSError:
return 2
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 879a0fd..3215154 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -30,7 +30,7 @@ pertaining to the last line read; nextfile() has no effect.
All files are opened in text mode by default, you can override this by
setting the mode parameter to input() or FileInput.__init__().
-If an I/O error occurs during opening or reading a file, the IOError
+If an I/O error occurs during opening or reading a file, the OSError
exception is raised.
If sys.stdin is used more than once, the second and further use will
@@ -322,9 +322,11 @@ class FileInput:
if self._inplace:
self._backupfilename = (
self._filename + (self._backup or ".bak"))
- try: os.unlink(self._backupfilename)
- except os.error: pass
- # The next few lines may raise IOError
+ try:
+ os.unlink(self._backupfilename)
+ except OSError:
+ pass
+ # The next few lines may raise OSError
os.rename(self._filename, self._backupfilename)
self._file = open(self._backupfilename, self._mode)
try:
@@ -346,7 +348,7 @@ class FileInput:
self._savestdout = sys.stdout
sys.stdout = self._output
else:
- # This may raise IOError
+ # This may raise OSError
if self._openhook:
self._file = self._openhook(self._filename, self._mode)
else:
diff --git a/Lib/fractions.py b/Lib/fractions.py
index 8be52d2..79e83ff 100644
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -182,8 +182,10 @@ class Fraction(numbers.Rational):
elif not isinstance(f, float):
raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
(cls.__name__, f, type(f).__name__))
- if math.isnan(f) or math.isinf(f):
- raise TypeError("Cannot convert %r to %s." % (f, cls.__name__))
+ if math.isnan(f):
+ raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
+ if math.isinf(f):
+ raise OverflowError("Cannot convert %r to %s." % (f, cls.__name__))
return cls(*f.as_integer_ratio())
@classmethod
@@ -196,9 +198,11 @@ class Fraction(numbers.Rational):
raise TypeError(
"%s.from_decimal() only takes Decimals, not %r (%s)" %
(cls.__name__, dec, type(dec).__name__))
- if not dec.is_finite():
- # Catches infinities and nans.
- raise TypeError("Cannot convert %s to %s." % (dec, cls.__name__))
+ if dec.is_infinite():
+ raise OverflowError(
+ "Cannot convert %s to %s." % (dec, cls.__name__))
+ if dec.is_nan():
+ raise ValueError("Cannot convert %s to %s." % (dec, cls.__name__))
sign, digits, exp = dec.as_tuple()
digits = int(''.join(map(str, digits)))
if sign:
diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index 741e647..fcd4b14 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -39,9 +39,10 @@ python ftplib.py -d localhost -l -p -l
import os
import sys
import socket
+import warnings
from socket import _GLOBAL_DEFAULT_TIMEOUT
-__all__ = ["FTP","Netrc"]
+__all__ = ["FTP", "Netrc"]
# Magic number from <socket.h>
MSG_OOB = 0x1 # Process data out of band
@@ -61,7 +62,7 @@ class error_proto(Error): pass # response does not begin with [1-5]
# All exceptions (hopefully) that may be raised here and that aren't
# (always) programming errors on our side
-all_errors = (Error, IOError, EOFError)
+all_errors = (Error, OSError, EOFError)
# Line terminators (we always output CRLF, but accept any of CRLF, CR, LF)
@@ -123,7 +124,7 @@ class FTP:
if self.sock is not None:
try:
self.quit()
- except (socket.error, EOFError):
+ except (OSError, EOFError):
pass
finally:
if self.sock is not None:
@@ -133,6 +134,7 @@ class FTP:
'''Connect to host. Arguments are:
- host: hostname to connect to (string, default previous host)
- port: port to connect to (integer, default previous port)
+ - timeout: the timeout to set against the ftp socket(s)
- source_address: a 2-tuple (host, port) for the socket to bind
to as its source address before connecting.
'''
@@ -183,7 +185,8 @@ class FTP:
# Internal: send one line to the server, appending CRLF
def putline(self, line):
line = line + CRLF
- if self.debugging > 1: print('*put*', self.sanitize(line))
+ if self.debugging > 1:
+ print('*put*', self.sanitize(line))
self.sock.sendall(line.encode(self.encoding))
# Internal: send one command to the server (through putline())
@@ -197,9 +200,12 @@ class FTP:
line = self.file.readline()
if self.debugging > 1:
print('*get*', self.sanitize(line))
- if not line: raise EOFError
- if line[-2:] == CRLF: line = line[:-2]
- elif line[-1:] in CRLF: line = line[:-1]
+ if not line:
+ raise EOFError
+ if line[-2:] == CRLF:
+ line = line[:-2]
+ elif line[-1:] in CRLF:
+ line = line[:-1]
return line
# Internal: get a response from the server, which may possibly
@@ -222,7 +228,8 @@ class FTP:
# Raise various errors if the response indicates an error
def getresp(self):
resp = self.getmultiline()
- if self.debugging: print('*resp*', self.sanitize(resp))
+ if self.debugging:
+ print('*resp*', self.sanitize(resp))
self.lastresp = resp[:3]
c = resp[:1]
if c in {'1', '2', '3'}:
@@ -246,7 +253,8 @@ class FTP:
IP and Synch; that doesn't seem to work with the servers I've
tried. Instead, just send the ABOR command as OOB data.'''
line = b'ABOR' + B_CRLF
- if self.debugging > 1: print('*put urgent*', self.sanitize(line))
+ if self.debugging > 1:
+ print('*put urgent*', self.sanitize(line))
self.sock.sendall(line, MSG_OOB)
resp = self.getmultiline()
if resp[:3] not in {'426', '225', '226'}:
@@ -295,7 +303,7 @@ class FTP:
try:
sock = socket.socket(af, socktype, proto)
sock.bind(sa)
- except socket.error as _:
+ except OSError as _:
err = _
if sock:
sock.close()
@@ -306,8 +314,8 @@ class FTP:
if err is not None:
raise err
else:
- raise socket.error("getaddrinfo returns an empty list")
- raise socket.error(msg)
+ raise OSError("getaddrinfo returns an empty list")
+ raise OSError(msg)
sock.listen(1)
port = sock.getsockname()[1] # Get proper port
host = self.sock.getsockname()[0] # Get proper host
@@ -387,9 +395,12 @@ class FTP:
def login(self, user = '', passwd = '', acct = ''):
'''Login, default anonymous.'''
- if not user: user = 'anonymous'
- if not passwd: passwd = ''
- if not acct: acct = ''
+ if not user:
+ user = 'anonymous'
+ if not passwd:
+ passwd = ''
+ if not acct:
+ acct = ''
if user == 'anonymous' and passwd in {'', '-'}:
# If there is no anonymous ftp password specified
# then we'll just use anonymous@
@@ -400,8 +411,10 @@ class FTP:
# host or country.
passwd = passwd + 'anonymous@'
resp = self.sendcmd('USER ' + user)
- if resp[0] == '3': resp = self.sendcmd('PASS ' + passwd)
- if resp[0] == '3': resp = self.sendcmd('ACCT ' + acct)
+ if resp[0] == '3':
+ resp = self.sendcmd('PASS ' + passwd)
+ if resp[0] == '3':
+ resp = self.sendcmd('ACCT ' + acct)
if resp[0] != '2':
raise error_reply(resp)
return resp
@@ -427,6 +440,9 @@ class FTP:
if not data:
break
callback(data)
+ # shutdown ssl layer
+ if _SSLSocket is not None and isinstance(conn, _SSLSocket):
+ conn.unwrap()
return self.voidresp()
def retrlines(self, cmd, callback = None):
@@ -441,13 +457,15 @@ class FTP:
Returns:
The response code.
"""
- if callback is None: callback = print_line
+ if callback is None:
+ callback = print_line
resp = self.sendcmd('TYPE A')
with self.transfercmd(cmd) as conn, \
conn.makefile('r', encoding=self.encoding) as fp:
while 1:
line = fp.readline()
- if self.debugging > 2: print('*retr*', repr(line))
+ if self.debugging > 2:
+ print('*retr*', repr(line))
if not line:
break
if line[-2:] == CRLF:
@@ -455,6 +473,9 @@ class FTP:
elif line[-1:] == '\n':
line = line[:-1]
callback(line)
+ # shutdown ssl layer
+ if _SSLSocket is not None and isinstance(conn, _SSLSocket):
+ conn.unwrap()
return self.voidresp()
def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None):
@@ -476,9 +497,14 @@ class FTP:
with self.transfercmd(cmd, rest) as conn:
while 1:
buf = fp.read(blocksize)
- if not buf: break
+ if not buf:
+ break
conn.sendall(buf)
- if callback: callback(buf)
+ if callback:
+ callback(buf)
+ # shutdown ssl layer
+ if _SSLSocket is not None and isinstance(conn, _SSLSocket):
+ conn.unwrap()
return self.voidresp()
def storlines(self, cmd, fp, callback=None):
@@ -497,12 +523,17 @@ class FTP:
with self.transfercmd(cmd) as conn:
while 1:
buf = fp.readline()
- if not buf: break
+ if not buf:
+ break
if buf[-2:] != B_CRLF:
if buf[-1] in B_CRLF: buf = buf[:-1]
buf = buf + B_CRLF
conn.sendall(buf)
- if callback: callback(buf)
+ if callback:
+ callback(buf)
+ # shutdown ssl layer
+ if _SSLSocket is not None and isinstance(conn, _SSLSocket):
+ conn.unwrap()
return self.voidresp()
def acct(self, password):
@@ -637,8 +668,10 @@ class FTP:
try:
import ssl
except ImportError:
- pass
+ _SSLSocket = None
else:
+ _SSLSocket = ssl.SSLSocket
+
class FTP_TLS(FTP):
'''A FTP subclass which adds TLS support to FTP as described
in RFC-4217.
@@ -753,69 +786,6 @@ else:
ssl_version=self.ssl_version)
return conn, size
- def retrbinary(self, cmd, callback, blocksize=8192, rest=None):
- self.voidcmd('TYPE I')
- with self.transfercmd(cmd, rest) as conn:
- while 1:
- data = conn.recv(blocksize)
- if not data:
- break
- callback(data)
- # shutdown ssl layer
- if isinstance(conn, ssl.SSLSocket):
- conn.unwrap()
- return self.voidresp()
-
- def retrlines(self, cmd, callback = None):
- if callback is None: callback = print_line
- resp = self.sendcmd('TYPE A')
- conn = self.transfercmd(cmd)
- fp = conn.makefile('r', encoding=self.encoding)
- with fp, conn:
- while 1:
- line = fp.readline()
- if self.debugging > 2: print('*retr*', repr(line))
- if not line:
- break
- if line[-2:] == CRLF:
- line = line[:-2]
- elif line[-1:] == '\n':
- line = line[:-1]
- callback(line)
- # shutdown ssl layer
- if isinstance(conn, ssl.SSLSocket):
- conn.unwrap()
- return self.voidresp()
-
- def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None):
- self.voidcmd('TYPE I')
- with self.transfercmd(cmd, rest) as conn:
- while 1:
- buf = fp.read(blocksize)
- if not buf: break
- conn.sendall(buf)
- if callback: callback(buf)
- # shutdown ssl layer
- if isinstance(conn, ssl.SSLSocket):
- conn.unwrap()
- return self.voidresp()
-
- def storlines(self, cmd, fp, callback=None):
- self.voidcmd('TYPE A')
- with self.transfercmd(cmd) as conn:
- while 1:
- buf = fp.readline()
- if not buf: break
- if buf[-2:] != B_CRLF:
- if buf[-1] in B_CRLF: buf = buf[:-1]
- buf = buf + B_CRLF
- conn.sendall(buf)
- if callback: callback(buf)
- # shutdown ssl layer
- if isinstance(conn, ssl.SSLSocket):
- conn.unwrap()
- return self.voidresp()
-
def abort(self):
# overridden as we can't pass MSG_OOB flag to sendall()
line = b'ABOR' + B_CRLF
@@ -826,7 +796,7 @@ else:
return resp
__all__.append('FTP_TLS')
- all_errors = (Error, IOError, EOFError, ssl.SSLError)
+ all_errors = (Error, OSError, EOFError, ssl.SSLError)
_150_re = None
@@ -923,7 +893,8 @@ def print_line(line):
def ftpcp(source, sourcename, target, targetname = '', type = 'I'):
'''Copy file from one FTP-instance to another.'''
- if not targetname: targetname = sourcename
+ if not targetname:
+ targetname = sourcename
type = 'TYPE ' + type
source.voidcmd(type)
target.voidcmd(type)
@@ -933,9 +904,11 @@ def ftpcp(source, sourcename, target, targetname = '', type = 'I'):
# transfer request.
# So: STOR before RETR, because here the target is a "user".
treply = target.sendcmd('STOR ' + targetname)
- if treply[:3] not in {'125', '150'}: raise error_proto # RFC 959
+ if treply[:3] not in {'125', '150'}:
+ raise error_proto # RFC 959
sreply = source.sendcmd('RETR ' + sourcename)
- if sreply[:3] not in {'125', '150'}: raise error_proto # RFC 959
+ if sreply[:3] not in {'125', '150'}:
+ raise error_proto # RFC 959
source.voidresp()
target.voidresp()
@@ -953,19 +926,22 @@ class Netrc:
__defacct = None
def __init__(self, filename=None):
+ warnings.warn("This class is deprecated, use the netrc module instead",
+ DeprecationWarning, 2)
if filename is None:
if "HOME" in os.environ:
filename = os.path.join(os.environ["HOME"],
".netrc")
else:
- raise IOError("specify file to load or set $HOME")
+ raise OSError("specify file to load or set $HOME")
self.__hosts = {}
self.__macros = {}
fp = open(filename, "r")
in_macro = 0
while 1:
line = fp.readline()
- if not line: break
+ if not line:
+ break
if in_macro and line.strip():
macro_lines.append(line)
continue
@@ -1074,7 +1050,7 @@ def test():
userid = passwd = acct = ''
try:
netrc = Netrc(rcfile)
- except IOError:
+ except OSError:
if rcfile is not None:
sys.stderr.write("Could not open account file"
" -- using anonymous login.")
diff --git a/Lib/functools.py b/Lib/functools.py
index 053e44e..19f88c7 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -3,16 +3,24 @@
# Python module wrapper for _functools C module
# to allow utilities written in Python to be added
# to the functools module.
-# Written by Nick Coghlan <ncoghlan at gmail.com>
-# and Raymond Hettinger <python at rcn.com>
-# Copyright (C) 2006-2010 Python Software Foundation.
+# Written by Nick Coghlan <ncoghlan at gmail.com>,
+# Raymond Hettinger <python at rcn.com>,
+# and Åukasz Langa <lukasz at langa.pl>.
+# Copyright (C) 2006-2013 Python Software Foundation.
# See C source code for _functools credits/copyright
__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES',
- 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial']
+ 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial',
+ 'singledispatch']
-from _functools import partial, reduce
+try:
+ from _functools import reduce
+except ImportError:
+ pass
+from abc import get_cache_token
from collections import namedtuple
+from types import MappingProxyType
+from weakref import WeakKeyDictionary
try:
from _thread import RLock
except:
@@ -47,7 +55,6 @@ def update_wrapper(wrapper,
are updated with the corresponding attribute from the wrapped
function (defaults to functools.WRAPPER_UPDATES)
"""
- wrapper.__wrapped__ = wrapped
for attr in assigned:
try:
value = getattr(wrapped, attr)
@@ -57,6 +64,9 @@ def update_wrapper(wrapper,
setattr(wrapper, attr, value)
for attr in updated:
getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+ # Issue #17482: set __wrapped__ last so we don't inadvertently copy it
+ # from the wrapped function when updating __dict__
+ wrapper.__wrapped__ = wrapped
# Return the wrapper so this can be used as a decorator via partial()
return wrapper
@@ -140,6 +150,29 @@ except ImportError:
################################################################################
+### partial() argument application
+################################################################################
+
+def partial(func, *args, **keywords):
+ """new function with partial application of the given arguments
+ and keywords.
+ """
+ def newfunc(*fargs, **fkeywords):
+ newkeywords = keywords.copy()
+ newkeywords.update(fkeywords)
+ return func(*(args + fargs), **newkeywords)
+ newfunc.func = func
+ newfunc.args = args
+ newfunc.keywords = keywords
+ return newfunc
+
+try:
+ from _functools import partial
+except ImportError:
+ pass
+
+
+################################################################################
### LRU Cache function decorator
################################################################################
@@ -220,7 +253,6 @@ def lru_cache(maxsize=128, typed=False):
PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
def decorating_function(user_function):
-
cache = {}
hits = misses = 0
full = False
@@ -329,3 +361,210 @@ def lru_cache(maxsize=128, typed=False):
return update_wrapper(wrapper, user_function)
return decorating_function
+
+
+################################################################################
+### singledispatch() - single-dispatch generic function decorator
+################################################################################
+
+def _c3_merge(sequences):
+ """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
+
+ Adapted from http://www.python.org/download/releases/2.3/mro/.
+
+ """
+ result = []
+ while True:
+ sequences = [s for s in sequences if s] # purge empty sequences
+ if not sequences:
+ return result
+ for s1 in sequences: # find merge candidates among seq heads
+ candidate = s1[0]
+ for s2 in sequences:
+ if candidate in s2[1:]:
+ candidate = None
+ break # reject the current head, it appears later
+ else:
+ break
+ if not candidate:
+ raise RuntimeError("Inconsistent hierarchy")
+ result.append(candidate)
+ # remove the chosen candidate
+ for seq in sequences:
+ if seq[0] == candidate:
+ del seq[0]
+
+def _c3_mro(cls, abcs=None):
+ """Computes the method resolution order using extended C3 linearization.
+
+ If no *abcs* are given, the algorithm works exactly like the built-in C3
+ linearization used for method resolution.
+
+ If given, *abcs* is a list of abstract base classes that should be inserted
+ into the resulting MRO. Unrelated ABCs are ignored and don't end up in the
+ result. The algorithm inserts ABCs where their functionality is introduced,
+ i.e. issubclass(cls, abc) returns True for the class itself but returns
+ False for all its direct base classes. Implicit ABCs for a given class
+ (either registered or inferred from the presence of a special method like
+ __len__) are inserted directly after the last ABC explicitly listed in the
+ MRO of said class. If two implicit ABCs end up next to each other in the
+ resulting MRO, their ordering depends on the order of types in *abcs*.
+
+ """
+ for i, base in enumerate(reversed(cls.__bases__)):
+ if hasattr(base, '__abstractmethods__'):
+ boundary = len(cls.__bases__) - i
+ break # Bases up to the last explicit ABC are considered first.
+ else:
+ boundary = 0
+ abcs = list(abcs) if abcs else []
+ explicit_bases = list(cls.__bases__[:boundary])
+ abstract_bases = []
+ other_bases = list(cls.__bases__[boundary:])
+ for base in abcs:
+ if issubclass(cls, base) and not any(
+ issubclass(b, base) for b in cls.__bases__
+ ):
+ # If *cls* is the class that introduces behaviour described by
+ # an ABC *base*, insert said ABC to its MRO.
+ abstract_bases.append(base)
+ for base in abstract_bases:
+ abcs.remove(base)
+ explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
+ abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
+ other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
+ return _c3_merge(
+ [[cls]] +
+ explicit_c3_mros + abstract_c3_mros + other_c3_mros +
+ [explicit_bases] + [abstract_bases] + [other_bases]
+ )
+
+def _compose_mro(cls, types):
+ """Calculates the method resolution order for a given class *cls*.
+
+ Includes relevant abstract base classes (with their respective bases) from
+ the *types* iterable. Uses a modified C3 linearization algorithm.
+
+ """
+ bases = set(cls.__mro__)
+ # Remove entries which are already present in the __mro__ or unrelated.
+ def is_related(typ):
+ return (typ not in bases and hasattr(typ, '__mro__')
+ and issubclass(cls, typ))
+ types = [n for n in types if is_related(n)]
+ # Remove entries which are strict bases of other entries (they will end up
+ # in the MRO anyway.
+ def is_strict_base(typ):
+ for other in types:
+ if typ != other and typ in other.__mro__:
+ return True
+ return False
+ types = [n for n in types if not is_strict_base(n)]
+ # Subclasses of the ABCs in *types* which are also implemented by
+ # *cls* can be used to stabilize ABC ordering.
+ type_set = set(types)
+ mro = []
+ for typ in types:
+ found = []
+ for sub in typ.__subclasses__():
+ if sub not in bases and issubclass(cls, sub):
+ found.append([s for s in sub.__mro__ if s in type_set])
+ if not found:
+ mro.append(typ)
+ continue
+ # Favor subclasses with the biggest number of useful bases
+ found.sort(key=len, reverse=True)
+ for sub in found:
+ for subcls in sub:
+ if subcls not in mro:
+ mro.append(subcls)
+ return _c3_mro(cls, abcs=mro)
+
+def _find_impl(cls, registry):
+ """Returns the best matching implementation from *registry* for type *cls*.
+
+ Where there is no registered implementation for a specific type, its method
+ resolution order is used to find a more generic implementation.
+
+ Note: if *registry* does not contain an implementation for the base
+ *object* type, this function may return None.
+
+ """
+ mro = _compose_mro(cls, registry.keys())
+ match = None
+ for t in mro:
+ if match is not None:
+ # If *match* is an implicit ABC but there is another unrelated,
+ # equally matching implicit ABC, refuse the temptation to guess.
+ if (t in registry and t not in cls.__mro__
+ and match not in cls.__mro__
+ and not issubclass(match, t)):
+ raise RuntimeError("Ambiguous dispatch: {} or {}".format(
+ match, t))
+ break
+ if t in registry:
+ match = t
+ return registry.get(match)
+
+def singledispatch(func):
+ """Single-dispatch generic function decorator.
+
+ Transforms a function into a generic function, which can have different
+ behaviours depending upon the type of its first argument. The decorated
+ function acts as the default implementation, and additional
+ implementations can be registered using the register() attribute of the
+ generic function.
+
+ """
+ registry = {}
+ dispatch_cache = WeakKeyDictionary()
+ cache_token = None
+
+ def dispatch(cls):
+ """generic_func.dispatch(cls) -> <function implementation>
+
+ Runs the dispatch algorithm to return the best available implementation
+ for the given *cls* registered on *generic_func*.
+
+ """
+ nonlocal cache_token
+ if cache_token is not None:
+ current_token = get_cache_token()
+ if cache_token != current_token:
+ dispatch_cache.clear()
+ cache_token = current_token
+ try:
+ impl = dispatch_cache[cls]
+ except KeyError:
+ try:
+ impl = registry[cls]
+ except KeyError:
+ impl = _find_impl(cls, registry)
+ dispatch_cache[cls] = impl
+ return impl
+
+ def register(cls, func=None):
+ """generic_func.register(cls, func) -> func
+
+ Registers a new implementation for the given *cls* on a *generic_func*.
+
+ """
+ nonlocal cache_token
+ if func is None:
+ return lambda f: register(cls, f)
+ registry[cls] = func
+ if cache_token is None and hasattr(cls, '__abstractmethods__'):
+ cache_token = get_cache_token()
+ dispatch_cache.clear()
+ return func
+
+ def wrapper(*args, **kw):
+ return dispatch(args[0].__class__)(*args, **kw)
+
+ registry[object] = func
+ wrapper.register = register
+ wrapper.dispatch = dispatch
+ wrapper.registry = MappingProxyType(registry)
+ wrapper._clear_cache = dispatch_cache.clear
+ update_wrapper(wrapper, func)
+ return wrapper
diff --git a/Lib/genericpath.py b/Lib/genericpath.py
index 340c004..ca4a510 100644
--- a/Lib/genericpath.py
+++ b/Lib/genericpath.py
@@ -7,7 +7,8 @@ import os
import stat
__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
- 'getsize', 'isdir', 'isfile']
+ 'getsize', 'isdir', 'isfile', 'samefile', 'sameopenfile',
+ 'samestat']
# Does a path exist?
@@ -16,7 +17,7 @@ def exists(path):
"""Test whether a path exists. Returns False for broken symbolic links"""
try:
os.stat(path)
- except os.error:
+ except OSError:
return False
return True
@@ -27,7 +28,7 @@ def isfile(path):
"""Test whether a path is a regular file"""
try:
st = os.stat(path)
- except os.error:
+ except OSError:
return False
return stat.S_ISREG(st.st_mode)
@@ -39,7 +40,7 @@ def isdir(s):
"""Return true if the pathname refers to an existing directory."""
try:
st = os.stat(s)
- except os.error:
+ except OSError:
return False
return stat.S_ISDIR(st.st_mode)
@@ -75,6 +76,31 @@ def commonprefix(m):
return s1[:i]
return s1
+# Are two stat buffers (obtained from stat, fstat or lstat)
+# describing the same file?
+def samestat(s1, s2):
+ """Test whether two stat buffers reference the same file"""
+ return (s1.st_ino == s2.st_ino and
+ s1.st_dev == s2.st_dev)
+
+
+# Are two filenames really pointing to the same file?
+def samefile(f1, f2):
+ """Test whether two pathnames reference the same actual file"""
+ s1 = os.stat(f1)
+ s2 = os.stat(f2)
+ return samestat(s1, s2)
+
+
+# Are two open files really referencing the same file?
+# (Not necessarily the same file descriptor!)
+def sameopenfile(fp1, fp2):
+ """Test whether two open file objects reference the same file"""
+ s1 = os.fstat(fp1)
+ s2 = os.fstat(fp2)
+ return samestat(s1, s2)
+
+
# Split a path in root and extension.
# The extension is everything starting at the last dot in the last
# pathname component; the root is everything before that.
diff --git a/Lib/getpass.py b/Lib/getpass.py
index 0044742..53c38b8 100644
--- a/Lib/getpass.py
+++ b/Lib/getpass.py
@@ -15,7 +15,11 @@ On the Mac EasyDialogs.AskPassword is used, if available.
# Guido van Rossum (Windows support and cleanup)
# Gregory P. Smith (tty support & GetPassWarning)
-import os, sys, warnings
+import contextlib
+import io
+import os
+import sys
+import warnings
__all__ = ["getpass","getuser","GetPassWarning"]
@@ -38,52 +42,57 @@ def unix_getpass(prompt='Password: ', stream=None):
Always restores terminal settings before returning.
"""
- fd = None
- tty = None
- try:
- # Always try reading and writing directly on the tty first.
- fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY)
- tty = os.fdopen(fd, 'w+', 1)
- input = tty
- if not stream:
- stream = tty
- except EnvironmentError as e:
- # If that fails, see if stdin can be controlled.
+ passwd = None
+ with contextlib.ExitStack() as stack:
try:
- fd = sys.stdin.fileno()
- except (AttributeError, ValueError):
- passwd = fallback_getpass(prompt, stream)
- input = sys.stdin
- if not stream:
- stream = sys.stderr
-
- if fd is not None:
- passwd = None
- try:
- old = termios.tcgetattr(fd) # a copy to save
- new = old[:]
- new[3] &= ~termios.ECHO # 3 == 'lflags'
- tcsetattr_flags = termios.TCSAFLUSH
- if hasattr(termios, 'TCSASOFT'):
- tcsetattr_flags |= termios.TCSASOFT
+ # Always try reading and writing directly on the tty first.
+ fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY)
+ tty = io.FileIO(fd, 'w+')
+ stack.enter_context(tty)
+ input = io.TextIOWrapper(tty)
+ stack.enter_context(input)
+ if not stream:
+ stream = input
+ except OSError as e:
+ # If that fails, see if stdin can be controlled.
+ stack.close()
+ try:
+ fd = sys.stdin.fileno()
+ except (AttributeError, ValueError):
+ fd = None
+ passwd = fallback_getpass(prompt, stream)
+ input = sys.stdin
+ if not stream:
+ stream = sys.stderr
+
+ if fd is not None:
try:
- termios.tcsetattr(fd, tcsetattr_flags, new)
- passwd = _raw_input(prompt, stream, input=input)
- finally:
- termios.tcsetattr(fd, tcsetattr_flags, old)
- stream.flush() # issue7208
- except termios.error:
- if passwd is not None:
- # _raw_input succeeded. The final tcsetattr failed. Reraise
- # instead of leaving the terminal in an unknown state.
- raise
- # We can't control the tty or stdin. Give up and use normal IO.
- # fallback_getpass() raises an appropriate warning.
- del input, tty # clean up unused file objects before blocking
- passwd = fallback_getpass(prompt, stream)
-
- stream.write('\n')
- return passwd
+ old = termios.tcgetattr(fd) # a copy to save
+ new = old[:]
+ new[3] &= ~termios.ECHO # 3 == 'lflags'
+ tcsetattr_flags = termios.TCSAFLUSH
+ if hasattr(termios, 'TCSASOFT'):
+ tcsetattr_flags |= termios.TCSASOFT
+ try:
+ termios.tcsetattr(fd, tcsetattr_flags, new)
+ passwd = _raw_input(prompt, stream, input=input)
+ finally:
+ termios.tcsetattr(fd, tcsetattr_flags, old)
+ stream.flush() # issue7208
+ except termios.error:
+ if passwd is not None:
+ # _raw_input succeeded. The final tcsetattr failed. Reraise
+ # instead of leaving the terminal in an unknown state.
+ raise
+ # We can't control the tty or stdin. Give up and use normal IO.
+ # fallback_getpass() raises an appropriate warning.
+ if stream is not input:
+ # clean up unused file objects before blocking
+ stack.close()
+ passwd = fallback_getpass(prompt, stream)
+
+ stream.write('\n')
+ return passwd
def win_getpass(prompt='Password: ', stream=None):
diff --git a/Lib/gettext.py b/Lib/gettext.py
index e43f044..05d9c1e 100644
--- a/Lib/gettext.py
+++ b/Lib/gettext.py
@@ -244,7 +244,7 @@ class GNUTranslations(NullTranslations):
version, msgcount, masteridx, transidx = unpack('>4I', buf[4:20])
ii = '>II'
else:
- raise IOError(0, 'Bad magic number', filename)
+ raise OSError(0, 'Bad magic number', filename)
# Now put all messages from the .mo file buffer into the catalog
# dictionary.
for i in range(0, msgcount):
@@ -256,7 +256,7 @@ class GNUTranslations(NullTranslations):
msg = buf[moff:mend]
tmsg = buf[toff:tend]
else:
- raise IOError(0, 'File is corrupt', filename)
+ raise OSError(0, 'File is corrupt', filename)
# See if we're looking at GNU .mo conventions for metadata
if mlen == 0:
# Catalog description
@@ -398,7 +398,7 @@ def translation(domain, localedir=None, languages=None,
if not mofiles:
if fallback:
return NullTranslations()
- raise IOError(ENOENT, 'No translation file found for domain', domain)
+ raise OSError(ENOENT, 'No translation file found for domain', domain)
# Avoid opening, reading, and parsing the .mo file after it's been done
# once.
result = None
@@ -460,7 +460,7 @@ def dgettext(domain, message):
try:
t = translation(domain, _localedirs.get(domain, None),
codeset=_localecodesets.get(domain))
- except IOError:
+ except OSError:
return message
return t.gettext(message)
@@ -468,7 +468,7 @@ def ldgettext(domain, message):
try:
t = translation(domain, _localedirs.get(domain, None),
codeset=_localecodesets.get(domain))
- except IOError:
+ except OSError:
return message
return t.lgettext(message)
@@ -476,7 +476,7 @@ def dngettext(domain, msgid1, msgid2, n):
try:
t = translation(domain, _localedirs.get(domain, None),
codeset=_localecodesets.get(domain))
- except IOError:
+ except OSError:
if n == 1:
return msgid1
else:
@@ -487,7 +487,7 @@ def ldngettext(domain, msgid1, msgid2, n):
try:
t = translation(domain, _localedirs.get(domain, None),
codeset=_localecodesets.get(domain))
- except IOError:
+ except OSError:
if n == 1:
return msgid1
else:
diff --git a/Lib/glob.py b/Lib/glob.py
index 1f60265..1a268a3 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -32,8 +32,7 @@ def iglob(pathname):
return
dirname, basename = os.path.split(pathname)
if not dirname:
- for name in glob1(None, basename):
- yield name
+ yield from glob1(None, basename)
return
# `os.path.split()` returns the argument itself as a dirname if it is a
# drive or UNC path. Prevent an infinite recursion if a drive or UNC path
@@ -62,7 +61,7 @@ def glob1(dirname, pattern):
dirname = os.curdir
try:
names = os.listdir(dirname)
- except os.error:
+ except OSError:
return []
if not _ishidden(pattern):
names = [x for x in names if not _ishidden(x)]
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 67fe1d4..d2d6dd6 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -65,9 +65,6 @@ def write32u(output, value):
# or unsigned.
output.write(struct.pack("<L", value))
-def read32(input):
- return struct.unpack("<I", input.read(4))[0]
-
class _PaddedFile:
"""Minimal read-only file object that prepends a string to the contents
of an actual file. Shouldn't be used outside of gzip.py, as it lacks
@@ -281,28 +278,32 @@ class GzipFile(io.BufferedIOBase):
self.crc = zlib.crc32(b"") & 0xffffffff
self.size = 0
+ def _read_exact(self, n):
+ data = self.fileobj.read(n)
+ while len(data) < n:
+ b = self.fileobj.read(n - len(data))
+ if not b:
+ raise EOFError("Compressed file ended before the "
+ "end-of-stream marker was reached")
+ data += b
+ return data
+
def _read_gzip_header(self):
magic = self.fileobj.read(2)
if magic == b'':
- raise EOFError("Reached EOF")
+ return False
if magic != b'\037\213':
- raise IOError('Not a gzipped file')
+ raise OSError('Not a gzipped file')
- method = ord( self.fileobj.read(1) )
+ method, flag, self.mtime = struct.unpack("<BBIxx", self._read_exact(8))
if method != 8:
- raise IOError('Unknown compression method')
- flag = ord( self.fileobj.read(1) )
- self.mtime = read32(self.fileobj)
- # extraflag = self.fileobj.read(1)
- # os = self.fileobj.read(1)
- self.fileobj.read(2)
+ raise OSError('Unknown compression method')
if flag & FEXTRA:
# Read & discard the extra field, if present
- xlen = ord(self.fileobj.read(1))
- xlen = xlen + 256*ord(self.fileobj.read(1))
- self.fileobj.read(xlen)
+ extra_len, = struct.unpack("<H", self._read_exact(2))
+ self._read_exact(extra_len)
if flag & FNAME:
# Read and discard a null-terminated string containing the filename
while True:
@@ -316,18 +317,19 @@ class GzipFile(io.BufferedIOBase):
if not s or s==b'\000':
break
if flag & FHCRC:
- self.fileobj.read(2) # Read & discard the 16-bit header CRC
+ self._read_exact(2) # Read & discard the 16-bit header CRC
unused = self.fileobj.unused()
if unused:
uncompress = self.decompress.decompress(unused)
self._add_read_data(uncompress)
+ return True
def write(self,data):
self._check_closed()
if self.mode != WRITE:
import errno
- raise IOError(errno.EBADF, "write() on read-only GzipFile object")
+ raise OSError(errno.EBADF, "write() on read-only GzipFile object")
if self.fileobj is None:
raise ValueError("write() on closed GzipFile object")
@@ -348,27 +350,23 @@ class GzipFile(io.BufferedIOBase):
self._check_closed()
if self.mode != READ:
import errno
- raise IOError(errno.EBADF, "read() on write-only GzipFile object")
+ raise OSError(errno.EBADF, "read() on write-only GzipFile object")
if self.extrasize <= 0 and self.fileobj is None:
return b''
readsize = 1024
if size < 0: # get the whole thing
- try:
- while True:
- self._read(readsize)
- readsize = min(self.max_read_chunk, readsize * 2)
- except EOFError:
- size = self.extrasize
+ while self._read(readsize):
+ readsize = min(self.max_read_chunk, readsize * 2)
+ size = self.extrasize
else: # just get some more of it
- try:
- while size > self.extrasize:
- self._read(readsize)
- readsize = min(self.max_read_chunk, readsize * 2)
- except EOFError:
- if size > self.extrasize:
- size = self.extrasize
+ while size > self.extrasize:
+ if not self._read(readsize):
+ if size > self.extrasize:
+ size = self.extrasize
+ break
+ readsize = min(self.max_read_chunk, readsize * 2)
offset = self.offset - self.extrastart
chunk = self.extrabuf[offset: offset + size]
@@ -381,17 +379,14 @@ class GzipFile(io.BufferedIOBase):
self._check_closed()
if self.mode != READ:
import errno
- raise IOError(errno.EBADF, "read1() on write-only GzipFile object")
+ raise OSError(errno.EBADF, "read1() on write-only GzipFile object")
if self.extrasize <= 0 and self.fileobj is None:
return b''
- try:
- # For certain input data, a single call to _read() may not return
- # any data. In this case, retry until we get some data or reach EOF.
- while self.extrasize <= 0:
- self._read()
- except EOFError:
+ # For certain input data, a single call to _read() may not return
+ # any data. In this case, retry until we get some data or reach EOF.
+ while self.extrasize <= 0 and self._read():
pass
if size < 0 or size > self.extrasize:
size = self.extrasize
@@ -405,7 +400,7 @@ class GzipFile(io.BufferedIOBase):
def peek(self, n):
if self.mode != READ:
import errno
- raise IOError(errno.EBADF, "peek() on write-only GzipFile object")
+ raise OSError(errno.EBADF, "peek() on write-only GzipFile object")
# Do not return ridiculously small buffers, for one common idiom
# is to call peek(1) and expect more bytes in return.
@@ -414,12 +409,9 @@ class GzipFile(io.BufferedIOBase):
if self.extrasize == 0:
if self.fileobj is None:
return b''
- try:
- # Ensure that we don't return b"" if we haven't reached EOF.
- while self.extrasize == 0:
- # 1024 is the same buffering heuristic used in read()
- self._read(max(n, 1024))
- except EOFError:
+ # Ensure that we don't return b"" if we haven't reached EOF.
+ # 1024 is the same buffering heuristic used in read()
+ while self.extrasize == 0 and self._read(max(n, 1024)):
pass
offset = self.offset - self.extrastart
remaining = self.extrasize
@@ -432,13 +424,14 @@ class GzipFile(io.BufferedIOBase):
def _read(self, size=1024):
if self.fileobj is None:
- raise EOFError("Reached EOF")
+ return False
if self._new_member:
# If the _new_member flag is set, we have to
# jump to the next member, if there is one.
self._init_read()
- self._read_gzip_header()
+ if not self._read_gzip_header():
+ return False
self.decompress = zlib.decompressobj(-zlib.MAX_WBITS)
self._new_member = False
@@ -455,7 +448,7 @@ class GzipFile(io.BufferedIOBase):
self.fileobj.prepend(self.decompress.unused_data, True)
self._read_eof()
self._add_read_data( uncompress )
- raise EOFError('Reached EOF')
+ return False
uncompress = self.decompress.decompress(buf)
self._add_read_data( uncompress )
@@ -471,6 +464,7 @@ class GzipFile(io.BufferedIOBase):
# a new member on the next call
self._read_eof()
self._new_member = True
+ return True
def _add_read_data(self, data):
self.crc = zlib.crc32(data, self.crc) & 0xffffffff
@@ -485,13 +479,12 @@ class GzipFile(io.BufferedIOBase):
# We check the that the computed CRC and size of the
# uncompressed data matches the stored values. Note that the size
# stored is the true file size mod 2**32.
- crc32 = read32(self.fileobj)
- isize = read32(self.fileobj) # may exceed 2GB
+ crc32, isize = struct.unpack("<II", self._read_exact(8))
if crc32 != self.crc:
- raise IOError("CRC check failed %s != %s" % (hex(crc32),
+ raise OSError("CRC check failed %s != %s" % (hex(crc32),
hex(self.crc)))
elif isize != (self.size & 0xffffffff):
- raise IOError("Incorrect length of data produced")
+ raise OSError("Incorrect length of data produced")
# Gzip files can be padded with zeroes and still have archives.
# Consume all zero bytes and set the file position to the first
@@ -540,7 +533,7 @@ class GzipFile(io.BufferedIOBase):
'''Return the uncompressed stream file position indicator to the
beginning of the file'''
if self.mode != READ:
- raise IOError("Can't rewind in write mode")
+ raise OSError("Can't rewind in write mode")
self.fileobj.seek(0)
self._new_member = True
self.extrabuf = b""
@@ -565,7 +558,7 @@ class GzipFile(io.BufferedIOBase):
raise ValueError('Seek from end not supported')
if self.mode == WRITE:
if offset < self.offset:
- raise IOError('Negative seek in write mode')
+ raise OSError('Negative seek in write mode')
count = offset - self.offset
chunk = bytes(1024)
for i in range(count // 1024):
diff --git a/Lib/hashlib.py b/Lib/hashlib.py
index 21454c7..a1bd8b2 100644
--- a/Lib/hashlib.py
+++ b/Lib/hashlib.py
@@ -54,7 +54,8 @@ More condensed:
# This tuple and __get_builtin_constructor() must be modified if a new
# always available algorithm is added.
-__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
+__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
+ 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512')
algorithms_guaranteed = set(__always_supported)
algorithms_available = set(__always_supported)
@@ -85,6 +86,18 @@ def __get_builtin_constructor(name):
return _sha512.sha512
elif bs == '384':
return _sha512.sha384
+ elif name in {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
+ 'SHA3_224', 'SHA3_256', 'SHA3_384', 'SHA3_512'}:
+ import _sha3
+ bs = name[5:]
+ if bs == '224':
+ return _sha3.sha3_224
+ elif bs == '256':
+ return _sha3.sha3_256
+ elif bs == '384':
+ return _sha3.sha3_384
+ elif bs == '512':
+ return _sha3.sha3_512
except ImportError:
pass # no extension module, this hash is unsupported.
diff --git a/Lib/hmac.py b/Lib/hmac.py
index 4297a71..d13b205 100644
--- a/Lib/hmac.py
+++ b/Lib/hmac.py
@@ -4,7 +4,7 @@ Implements the HMAC algorithm as described by RFC 2104.
"""
import warnings as _warnings
-from operator import _compare_digest as compare_digest
+from _operator import _compare_digest as compare_digest
trans_5C = bytes((x ^ 0x5C) for x in range(256))
trans_36 = bytes((x ^ 0x36) for x in range(256))
@@ -31,11 +31,11 @@ class HMAC:
A hashlib constructor returning a new hash object.
Defaults to hashlib.md5.
- Note: key and msg must be bytes objects.
+ Note: key and msg must be a bytes or bytearray objects.
"""
- if not isinstance(key, bytes):
- raise TypeError("key: expected bytes, but got %r" % type(key).__name__)
+ if not isinstance(key, (bytes, bytearray)):
+ raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
if digestmod is None:
import hashlib
@@ -75,8 +75,6 @@ class HMAC:
def update(self, msg):
"""Update this hashing object with the string msg.
"""
- if not isinstance(msg, bytes):
- raise TypeError("expected bytes, but got %r" % type(msg).__name__)
self.inner.update(msg)
def copy(self):
diff --git a/Lib/html/__init__.py b/Lib/html/__init__.py
index 02652ef..2ad167f 100644
--- a/Lib/html/__init__.py
+++ b/Lib/html/__init__.py
@@ -2,11 +2,6 @@
General functions for HTML manipulation.
"""
-
-_escape_map = {ord('&'): '&amp;', ord('<'): '&lt;', ord('>'): '&gt;'}
-_escape_map_full = {ord('&'): '&amp;', ord('<'): '&lt;', ord('>'): '&gt;',
- ord('"'): '&quot;', ord('\''): '&#x27;'}
-
# NB: this is a candidate for a bytes/string polymorphic interface
def escape(s, quote=True):
@@ -16,6 +11,10 @@ def escape(s, quote=True):
characters, both double quote (") and single quote (') characters are also
translated.
"""
+ s = s.replace("&", "&amp;") # Must be done first!
+ s = s.replace("<", "&lt;")
+ s = s.replace(">", "&gt;")
if quote:
- return s.translate(_escape_map_full)
- return s.translate(_escape_map)
+ s = s.replace('"', "&quot;")
+ s = s.replace('\'', "&#x27;")
+ return s
diff --git a/Lib/html/parser.py b/Lib/html/parser.py
index 60a322a..18f3115 100644
--- a/Lib/html/parser.py
+++ b/Lib/html/parser.py
@@ -12,6 +12,8 @@ import _markupbase
import re
import warnings
+__all__ = ['HTMLParser']
+
# Regular expressions used for parsing
interesting_normal = re.compile('[&<]')
diff --git a/Lib/http/client.py b/Lib/http/client.py
index b72cf08..939615b 100644
--- a/Lib/http/client.py
+++ b/Lib/http/client.py
@@ -267,8 +267,6 @@ def parse_headers(fp, _class=HTTPMessage):
return email.parser.Parser(_class=_class).parsestr(hstring)
-_strict_sentinel = object()
-
class HTTPResponse(io.RawIOBase):
# See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details.
@@ -278,7 +276,7 @@ class HTTPResponse(io.RawIOBase):
# text following RFC 2047. The basic status line parsing only
# accepts iso-8859-1.
- def __init__(self, sock, debuglevel=0, strict=_strict_sentinel, method=None, url=None):
+ def __init__(self, sock, debuglevel=0, method=None, url=None):
# If the response includes a content-length header, we need to
# make sure that the client doesn't read more than the
# specified number of bytes. If it does, it will block until
@@ -288,10 +286,6 @@ class HTTPResponse(io.RawIOBase):
# clients unless they know what they are doing.
self.fp = sock.makefile("rb")
self.debuglevel = debuglevel
- if strict is not _strict_sentinel:
- warnings.warn("the 'strict' argument isn't supported anymore; "
- "http.client now always assumes HTTP/1.x compliant servers.",
- DeprecationWarning, 2)
self._method = method
# The HTTPResponse object is returned via urllib. The clients
@@ -728,13 +722,17 @@ class HTTPConnection:
default_port = HTTP_PORT
auto_open = 1
debuglevel = 0
-
- def __init__(self, host, port=None, strict=_strict_sentinel,
- timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None):
- if strict is not _strict_sentinel:
- warnings.warn("the 'strict' argument isn't supported anymore; "
- "http.client now always assumes HTTP/1.x compliant servers.",
- DeprecationWarning, 2)
+ # TCP Maximum Segment Size (MSS) is determined by the TCP stack on
+ # a per-connection basis. There is no simple and efficient
+ # platform independent mechanism for determining the MSS, so
+ # instead a reasonable estimate is chosen. The getsockopt()
+ # interface using the TCP_MAXSEG parameter may be a suitable
+ # approach on some operating systems. A value of 16KiB is chosen
+ # as a reasonable estimate of the maximum MSS.
+ mss = 16384
+
+ def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+ source_address=None):
self.timeout = timeout
self.source_address = source_address
self.sock = None
@@ -800,8 +798,8 @@ class HTTPConnection:
if code != 200:
self.close()
- raise socket.error("Tunnel connection failed: %d %s" % (code,
- message.strip()))
+ raise OSError("Tunnel connection failed: %d %s" % (code,
+ message.strip()))
while True:
line = response.fp.readline(_MAXLINE + 1)
if len(line) > _MAXLINE:
@@ -895,8 +893,11 @@ class HTTPConnection:
del self._buffer[:]
# If msg and message_body are sent in a single send() call,
# it will avoid performance problems caused by the interaction
- # between delayed ack and the Nagle algorithm.
- if isinstance(message_body, bytes):
+ # between delayed ack and the Nagle algorithm. However,
+ # there is no performance gain if the message is larger
+ # than MSS (and there is a memory penalty for the message
+ # copy).
+ if isinstance(message_body, bytes) and len(message_body) < self.mss:
msg += message_body
message_body = None
self.send(msg)
@@ -1166,9 +1167,10 @@ else:
# XXX Should key_file and cert_file be deprecated in favour of context?
def __init__(self, host, port=None, key_file=None, cert_file=None,
- strict=_strict_sentinel, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
- source_address=None, *, context=None, check_hostname=None):
- super(HTTPSConnection, self).__init__(host, port, strict, timeout,
+ timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+ source_address=None, *, context=None,
+ check_hostname=None):
+ super(HTTPSConnection, self).__init__(host, port, timeout,
source_address)
self.key_file = key_file
self.cert_file = cert_file
diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py
index ddb79c5..be828eb 100644
--- a/Lib/http/cookiejar.py
+++ b/Lib/http/cookiejar.py
@@ -1193,8 +1193,7 @@ def deepvalues(mapping):
pass
else:
mapping = True
- for subobj in deepvalues(obj):
- yield subobj
+ yield from deepvalues(obj)
if not mapping:
yield obj
@@ -1731,8 +1730,8 @@ class CookieJar:
return "<%s[%s]>" % (self.__class__, ", ".join(r))
-# derives from IOError for backwards-compatibility with Python 2.4.0
-class LoadError(IOError): pass
+# derives from OSError for backwards-compatibility with Python 2.4.0
+class LoadError(OSError): pass
class FileCookieJar(CookieJar):
"""CookieJar that can be loaded from and saved to a file."""
@@ -1762,17 +1761,14 @@ class FileCookieJar(CookieJar):
if self.filename is not None: filename = self.filename
else: raise ValueError(MISSING_FILENAME_TEXT)
- f = open(filename)
- try:
+ with open(filename) as f:
self._really_load(f, filename, ignore_discard, ignore_expires)
- finally:
- f.close()
def revert(self, filename=None,
ignore_discard=False, ignore_expires=False):
"""Clear all cookies and reload cookies from a saved file.
- Raises LoadError (or IOError) if reversion is not successful; the
+ Raises LoadError (or OSError) if reversion is not successful; the
object's state will not be altered if this happens.
"""
@@ -1787,7 +1783,7 @@ class FileCookieJar(CookieJar):
self._cookies = {}
try:
self.load(filename, ignore_discard, ignore_expires)
- except (LoadError, IOError):
+ except OSError:
self._cookies = old_state
raise
@@ -1857,15 +1853,12 @@ class LWPCookieJar(FileCookieJar):
if self.filename is not None: filename = self.filename
else: raise ValueError(MISSING_FILENAME_TEXT)
- f = open(filename, "w")
- try:
+ with open(filename, "w") as f:
# There really isn't an LWP Cookies 2.0 format, but this indicates
# that there is extra information in here (domain_dot and
# port_spec) while still being compatible with libwww-perl, I hope.
f.write("#LWP-Cookies-2.0\n")
f.write(self.as_lwp_str(ignore_discard, ignore_expires))
- finally:
- f.close()
def _really_load(self, f, filename, ignore_discard, ignore_expires):
magic = f.readline()
@@ -1938,8 +1931,7 @@ class LWPCookieJar(FileCookieJar):
if not ignore_expires and c.is_expired(now):
continue
self.set_cookie(c)
-
- except IOError:
+ except OSError:
raise
except Exception:
_warn_unhandled_exception()
@@ -2045,7 +2037,7 @@ class MozillaCookieJar(FileCookieJar):
continue
self.set_cookie(c)
- except IOError:
+ except OSError:
raise
except Exception:
_warn_unhandled_exception()
@@ -2057,8 +2049,7 @@ class MozillaCookieJar(FileCookieJar):
if self.filename is not None: filename = self.filename
else: raise ValueError(MISSING_FILENAME_TEXT)
- f = open(filename, "w")
- try:
+ with open(filename, "w") as f:
f.write(self.header)
now = time.time()
for cookie in self:
@@ -2087,5 +2078,3 @@ class MozillaCookieJar(FileCookieJar):
"\t".join([cookie.domain, initial_dot, cookie.path,
secure, expires, name, value])+
"\n")
- finally:
- f.close()
diff --git a/Lib/http/server.py b/Lib/http/server.py
index c4ac703..e47e034 100644
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -401,12 +401,17 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
while not self.close_connection:
self.handle_one_request()
- def send_error(self, code, message=None):
+ def send_error(self, code, message=None, explain=None):
"""Send and log an error reply.
- Arguments are the error code, and a detailed message.
- The detailed message defaults to the short entry matching the
- response code.
+ Arguments are
+ * code: an HTTP error code
+ 3 digits
+ * message: a simple optional 1 line reason phrase.
+ *( HTAB / SP / VCHAR / %x80-FF )
+ defaults to short entry matching the response code
+ * explain: a detailed message defaults to the long entry
+ matching the response code.
This sends an error response (so it must be called before any
output has been generated), logs the error, and finally sends
@@ -420,17 +425,20 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
shortmsg, longmsg = '???', '???'
if message is None:
message = shortmsg
- explain = longmsg
+ if explain is None:
+ explain = longmsg
self.log_error("code %d, message %s", code, message)
# using _quote_html to prevent Cross Site Scripting attacks (see bug #1100201)
content = (self.error_message_format %
- {'code': code, 'message': _quote_html(message), 'explain': explain})
+ {'code': code, 'message': _quote_html(message), 'explain': _quote_html(explain)})
+ body = content.encode('UTF-8', 'replace')
self.send_response(code, message)
self.send_header("Content-Type", self.error_content_type)
self.send_header('Connection', 'close')
+ self.send_header('Content-Length', int(len(body)))
self.end_headers()
if self.command != 'HEAD' and code >= 200 and code not in (204, 304):
- self.wfile.write(content.encode('UTF-8', 'replace'))
+ self.wfile.write(body)
def send_response(self, code, message=None):
"""Add the response header to the headers buffer and log the
@@ -709,7 +717,7 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
ctype = self.guess_type(path)
try:
f = open(path, 'rb')
- except IOError:
+ except OSError:
self.send_error(404, "File not found")
return None
self.send_response(200)
@@ -730,7 +738,7 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
"""
try:
list = os.listdir(path)
- except os.error:
+ except OSError:
self.send_error(404, "No permission to list directory")
return None
list.sort(key=lambda a: a.lower())
@@ -1121,7 +1129,7 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
try:
try:
os.setuid(nobody)
- except os.error:
+ except OSError:
pass
os.dup2(self.rfile.fileno(), 0)
os.dup2(self.wfile.fileno(), 1)
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index c9ad364..eaf68cb 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -548,7 +548,7 @@ class EditorWindow(object):
if sys.platform[:3] == 'win':
try:
os.startfile(self.help_url)
- except WindowsError as why:
+ except OSError as why:
tkMessageBox.showerror(title='Document Start Failure',
message=str(why), parent=self.text)
else:
@@ -871,7 +871,7 @@ class EditorWindow(object):
if sys.platform[:3] == 'win':
try:
os.startfile(helpfile)
- except WindowsError as why:
+ except OSError as why:
tkMessageBox.showerror(title='Document Start Failure',
message=str(why), parent=self.text)
else:
diff --git a/Lib/idlelib/FileList.py b/Lib/idlelib/FileList.py
index 37a337e..a9989a8 100644
--- a/Lib/idlelib/FileList.py
+++ b/Lib/idlelib/FileList.py
@@ -103,7 +103,7 @@ class FileList:
if not os.path.isabs(filename):
try:
pwd = os.getcwd()
- except os.error:
+ except OSError:
pass
else:
filename = os.path.join(pwd, filename)
diff --git a/Lib/idlelib/GrepDialog.py b/Lib/idlelib/GrepDialog.py
index 2e07312..c0074e2 100644
--- a/Lib/idlelib/GrepDialog.py
+++ b/Lib/idlelib/GrepDialog.py
@@ -125,4 +125,3 @@ if __name__ == "__main__":
# Hence Idle must be restarted after editing this file for a live test.
import unittest
unittest.main('idlelib.idle_test.test_grep', verbosity=2, exit=False)
-
diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
index 4558ae6..203b009 100644
--- a/Lib/idlelib/IOBinding.py
+++ b/Lib/idlelib/IOBinding.py
@@ -501,7 +501,7 @@ class IOBinding:
else:
try:
pwd = os.getcwd()
- except os.error:
+ except OSError:
pwd = ""
return pwd, ""
diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index 5450701..478c183 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -1,12 +1,10 @@
-What's New in IDLE 3.3.2?
+What's New in IDLE 3.4.0?
=========================
- Issue #17390: Display Python version on Idle title bar.
Initial patch by Edmond Burnett.
-
-What's New in IDLE 3.3.1?
-=========================
+- Issue #5066: Update IDLE docs. Patch by Todd Rovito.
- Issue #17625: Close the replace dialog after it is used.
diff --git a/Lib/idlelib/PathBrowser.py b/Lib/idlelib/PathBrowser.py
index ba40719..5e5c6be 100644
--- a/Lib/idlelib/PathBrowser.py
+++ b/Lib/idlelib/PathBrowser.py
@@ -44,7 +44,7 @@ class DirBrowserTreeItem(TreeItem):
def GetSubList(self):
try:
names = os.listdir(self.dir or os.curdir)
- except os.error:
+ except OSError:
return []
packages = []
for name in names:
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index b2a1f58..36aff92 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -419,7 +419,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
try:
self.rpcclt = MyRPCClient(addr)
break
- except socket.error as err:
+ except OSError as err:
pass
else:
self.display_port_binding_error()
@@ -1034,7 +1034,10 @@ class PyShell(OutputWindow):
self.close()
return False
else:
- nosub = "==== No Subprocess ===="
+ nosub = ("==== No Subprocess ====\n\n" +
+ "WARNING: Running IDLE without a Subprocess is deprecated\n" +
+ "and will be removed in a later version. See Help/IDLE Help\n" +
+ "for details.\n\n")
sys.displayhook = rpc.displayhook
self.write("Python %s on %s\n%s\n%s" %
@@ -1392,7 +1395,8 @@ USAGE: idle [-deins] [-t title] [file]*
idle [-dns] [-t title] - [arg]*
-h print this help message and exit
- -n run IDLE without a subprocess (see Help/IDLE Help for details)
+ -n run IDLE without a subprocess (DEPRECATED,
+ see Help/IDLE Help for details)
The following options will override the IDLE 'settings' configuration:
@@ -1470,6 +1474,8 @@ def main():
if o == '-i':
enable_shell = True
if o == '-n':
+ print(" Warning: running IDLE without a subprocess is deprecated.",
+ file=sys.stderr)
use_subprocess = False
if o == '-r':
script = a
diff --git a/Lib/idlelib/TreeWidget.py b/Lib/idlelib/TreeWidget.py
index 25bae48..1f4854d 100644
--- a/Lib/idlelib/TreeWidget.py
+++ b/Lib/idlelib/TreeWidget.py
@@ -381,7 +381,7 @@ class FileTreeItem(TreeItem):
try:
os.rename(self.path, newpath)
self.path = newpath
- except os.error:
+ except OSError:
pass
def GetIconName(self):
@@ -394,7 +394,7 @@ class FileTreeItem(TreeItem):
def GetSubList(self):
try:
names = os.listdir(self.path)
- except os.error:
+ except OSError:
return []
names.sort(key = os.path.normcase)
sublist = []
diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py
index a974d54..ea2010e 100644
--- a/Lib/idlelib/configHandler.py
+++ b/Lib/idlelib/configHandler.py
@@ -271,8 +271,10 @@ class IdleConf:
except OSError:
pass
return default
+
def SetOption(self, configType, section, option, value):
"""In user's config file, set section's option to value.
+
"""
self.userCfg[configType].SetOption(section, option, value)
@@ -638,8 +640,10 @@ class IdleConf:
except OSError:
pass
return keyBindings
+
def GetExtraHelpSourceList(self,configSet):
"""Fetch list of extra help sources from a given configSet.
+
Valid configSets are 'user' or 'default'. Return a list of tuples of
the form (menu_item , path_to_help_file , option), or return the empty
list. 'option' is the sequence number of the help resource. 'option'
diff --git a/Lib/idlelib/help.txt b/Lib/idlelib/help.txt
index ff786c5..6378a2e 100644
--- a/Lib/idlelib/help.txt
+++ b/Lib/idlelib/help.txt
@@ -1,142 +1,185 @@
[See the end of this file for ** TIPS ** on using IDLE !!]
-Click on the dotted line at the top of a menu to "tear it off": a
-separate window containing the menu is created.
-
-File Menu:
-
- New File -- Create a new file editing window
- Open... -- Open an existing file
- Recent Files... -- Open a list of recent files
- Open Module... -- Open an existing module (searches sys.path)
- Class Browser -- Show classes and methods in current file
- Path Browser -- Show sys.path directories, modules, classes
+IDLE is the Python IDE built with the tkinter GUI toolkit.
+
+IDLE has the following features:
+-coded in 100% pure Python, using the tkinter GUI toolkit
+-cross-platform: works on Windows, Unix, and OS X
+-multi-window text editor with multiple undo, Python colorizing, smart indent,
+call tips, and many other features
+-Python shell window (a.k.a interactive interpreter)
+-debugger (not complete, but you can set breakpoints, view and step)
+
+Menus:
+
+IDLE has two window types the Shell window and the Editor window. It is
+possible to have multiple editor windows simultaneously. IDLE's
+menus dynamically change based on which window is currently selected. Each menu
+documented below indicates which window type it is associated with. Click on
+the dotted line at the top of a menu to "tear it off": a separate window
+containing the menu is created (for Unix and Windows only).
+
+File Menu (Shell and Editor):
+
+ New File -- Create a new file editing window
+ Open... -- Open an existing file
+ Open Module... -- Open an existing module (searches sys.path)
+ Recent Files... -- Open a list of recent files
+ Class Browser -- Show classes and methods in current file
+ Path Browser -- Show sys.path directories, modules, classes,
and methods
- ---
- Save -- Save current window to the associated file (unsaved
- windows have a * before and after the window title)
-
- Save As... -- Save current window to new file, which becomes
- the associated file
- Save Copy As... -- Save current window to different file
- without changing the associated file
- ---
- Print Window -- Print the current window
- ---
- Close -- Close current window (asks to save if unsaved)
- Exit -- Close all windows, quit (asks to save if unsaved)
-
-Edit Menu:
-
- Undo -- Undo last change to current window
- (A maximum of 1000 changes may be undone)
- Redo -- Redo last undone change to current window
- ---
- Cut -- Copy a selection into system-wide clipboard,
+ ---
+ Save -- Save current window to the associated file (unsaved
+ windows have a * before and after the window title)
+
+ Save As... -- Save current window to new file, which becomes
+ the associated file
+ Save Copy As... -- Save current window to different file
+ without changing the associated file
+ ---
+ Print Window -- Print the current window
+ ---
+ Close -- Close current window (asks to save if unsaved)
+ Exit -- Close all windows, quit (asks to save if unsaved)
+
+Edit Menu (Shell and Editor):
+
+ Undo -- Undo last change to current window
+ (a maximum of 1000 changes may be undone)
+ Redo -- Redo last undone change to current window
+ ---
+ Cut -- Copy a selection into system-wide clipboard,
then delete the selection
- Copy -- Copy selection into system-wide clipboard
- Paste -- Insert system-wide clipboard into window
- Select All -- Select the entire contents of the edit buffer
- ---
- Find... -- Open a search dialog box with many options
- Find Again -- Repeat last search
- Find Selection -- Search for the string in the selection
- Find in Files... -- Open a search dialog box for searching files
- Replace... -- Open a search-and-replace dialog box
- Go to Line -- Ask for a line number and show that line
- Show Calltip -- Open a small window with function param hints
- Show Completions -- Open a scroll window allowing selection keywords
- and attributes. (see '*TIPS*', below)
- Show Parens -- Highlight the surrounding parenthesis
- Expand Word -- Expand the word you have typed to match another
- word in the same buffer; repeat to get a
+ Copy -- Copy selection into system-wide clipboard
+ Paste -- Insert system-wide clipboard into window
+ Select All -- Select the entire contents of the edit buffer
+ ---
+ Find... -- Open a search dialog box with many options
+ Find Again -- Repeat last search
+ Find Selection -- Search for the string in the selection
+ Find in Files... -- Open a search dialog box for searching files
+ Replace... -- Open a search-and-replace dialog box
+ Go to Line -- Ask for a line number and show that line
+ Expand Word -- Expand the word you have typed to match another
+ word in the same buffer; repeat to get a
different expansion
-
-Format Menu (only in Edit window):
-
- Indent Region -- Shift selected lines right 4 spaces
- Dedent Region -- Shift selected lines left 4 spaces
- Comment Out Region -- Insert ## in front of selected lines
- Uncomment Region -- Remove leading # or ## from selected lines
- Tabify Region -- Turns *leading* stretches of spaces into tabs
- (Note: We recommend using 4 space blocks to indent Python code.)
- Untabify Region -- Turn *all* tabs into the right number of spaces
- New Indent Width... -- Open dialog to change indent width
- Format Paragraph -- Reformat the current blank-line-separated
- paragraph
-
-Run Menu (only in Edit window):
-
- Python Shell -- Open or wake up the Python shell window
- ---
- Check Module -- Run a syntax check on the module
- Run Module -- Execute the current file in the __main__ namespace
-
-Shell Menu (only in Shell window):
-
- View Last Restart -- Scroll the shell window to the last restart
- Restart Shell -- Restart the interpreter with a fresh environment
-
-Debug Menu (only in Shell window):
-
- Go to File/Line -- look around the insert point for a filename
- and line number, open the file, and show the line
- Debugger (toggle) -- Run commands in the shell under the debugger
- Stack Viewer -- Show the stack traceback of the last exception
- Auto-open Stack Viewer (toggle) -- Open stack viewer on traceback
-
-Options Menu:
-
- Configure IDLE -- Open a configuration dialog. Fonts, indentation,
+ Show Calltip -- After an unclosed parenthesis for a function, open
+ a small window with function parameter hints
+ Show Parens -- Highlight the surrounding parenthesis
+ Show Completions -- Open a scroll window allowing selection keywords
+ and attributes. (see '*TIPS*', below)
+
+Format Menu (Editor window only):
+
+ Indent Region -- Shift selected lines right by the indent width
+ (default 4 spaces)
+ Dedent Region -- Shift selected lines left by the indent width
+ (default 4 spaces)
+ Comment Out Region -- Insert ## in front of selected lines
+ Uncomment Region -- Remove leading # or ## from selected lines
+ Tabify Region -- Turns *leading* stretches of spaces into tabs.
+ (Note: We recommend using 4 space blocks to indent Python code.)
+ Untabify Region -- Turn *all* tabs into the corrent number of spaces
+ Toggle tabs -- Open a dialog to switch between indenting with
+ spaces and tabs.
+ New Indent Width... -- Open a dialog to change indent width. The
+ accepted default by the Python community is 4
+ spaces.
+ Format Paragraph -- Reformat the current blank-line-separated
+ paragraph. All lines in the paragraph will be
+ formatted to less than 80 columns.
+ ---
+ Strip trailing whitespace -- Removed any space characters after the end
+ of the last non-space character
+
+Run Menu (Editor window only):
+
+ Python Shell -- Open or wake up the Python shell window
+ ---
+ Check Module -- Check the syntax of the module currently open in the
+ Editor window. If the module has not been saved IDLE
+ will prompt the user to save the code.
+ Run Module -- Restart the shell to clean the environment, then
+ execute the currently open module. If the module has
+ not been saved IDLE will prompt the user to save the
+ code.
+
+Shell Menu (Shell window only):
+
+ View Last Restart -- Scroll the shell window to the last Shell restart
+ Restart Shell -- Restart the shell to clean the environment
+
+Debug Menu (Shell window only):
+
+ Go to File/Line -- Look around the insert point for a filename
+ and line number, open the file, and show the line.
+ Useful to view the source lines referenced in an
+ exception traceback. Available in the context
+ menu of the Shell window.
+ Debugger (toggle) -- This feature is not complete and considered
+ experimental. Run commands in the shell under the
+ debugger.
+ Stack Viewer -- Show the stack traceback of the last exception
+ Auto-open Stack Viewer (toggle) -- Toggle automatically opening the
+ stack viewer on unhandled
+ exception
+
+Options Menu (Shell and Editor):
+
+ Configure IDLE -- Open a configuration dialog. Fonts, indentation,
keybindings, and color themes may be altered.
- Startup Preferences may be set, and Additional Help
- Sources can be specified.
-
- On OS X this menu is not present, use
- menu 'IDLE -> Preferences...' instead.
- ---
- Code Context -- Open a pane at the top of the edit window which
- shows the block context of the section of code
- which is scrolling off the top or the window.
- (Not present in Shell window.)
-
-Windows Menu:
-
- Zoom Height -- toggles the window between configured size
- and maximum height.
- ---
- The rest of this menu lists the names of all open windows;
- select one to bring it to the foreground (deiconifying it if
- necessary).
+ Startup Preferences may be set, and additional Help
+ sources can be specified.
+
+ ---
+ Code Context (toggle) -- Open a pane at the top of the edit window
+ which shows the block context of the section
+ of code which is scrolling off the top or the
+ window. This is not present in the Shell
+ window only the Editor window.
+
+Windows Menu (Shell and Editor):
+
+ Zoom Height -- Toggles the window between normal size (40x80 initial
+ setting) and maximum height. The initial size is in the Configure
+ IDLE dialog under the general tab.
+ ---
+ The rest of this menu lists the names of all open windows;
+ select one to bring it to the foreground (deiconifying it if
+ necessary).
Help Menu:
- About IDLE -- Version, copyright, license, credits
- IDLE Readme -- Background discussion and change details
- ---
- IDLE Help -- Display this file
- Python Docs -- Access local Python documentation, if
- installed. Otherwise, access www.python.org.
- ---
- (Additional Help Sources may be added here)
-
-Edit context menu (Right-click / Control-click on OS X in Edit window):
-
- Cut -- Copy a selection into system-wide clipboard,
+ About IDLE -- Version, copyright, license, credits
+ ---
+ IDLE Help -- Display this file which is a help file for IDLE
+ detailing the menu options, basic editing and navigation,
+ and other tips.
+ Python Docs -- Access local Python documentation, if
+ installed. Or will start a web browser and open
+ docs.python.org showing the latest Python documentation.
+ ---
+ Additional help sources may be added here with the Configure IDLE
+ dialog under the General tab.
+
+Editor context menu (Right-click / Control-click on OS X in Edit window):
+
+ Cut -- Copy a selection into system-wide clipboard,
then delete the selection
- Copy -- Copy selection into system-wide clipboard
- Paste -- Insert system-wide clipboard into window
- Set Breakpoint -- Sets a breakpoint (when debugger open)
- Clear Breakpoint -- Clears the breakpoint on that line
+ Copy -- Copy selection into system-wide clipboard
+ Paste -- Insert system-wide clipboard into window
+ Set Breakpoint -- Sets a breakpoint. Breakpoints are only enabled
+ when the debugger is open.
+ Clear Breakpoint -- Clears the breakpoint on that line
Shell context menu (Right-click / Control-click on OS X in Shell window):
- Cut -- Copy a selection into system-wide clipboard,
+ Cut -- Copy a selection into system-wide clipboard,
then delete the selection
- Copy -- Copy selection into system-wide clipboard
- Paste -- Insert system-wide clipboard into window
- ---
- Go to file/line -- Same as in Debug menu
+ Copy -- Copy selection into system-wide clipboard
+ Paste -- Insert system-wide clipboard into window
+ ---
+ Go to file/line -- Same as in Debug menu
** TIPS **
@@ -144,159 +187,182 @@ Shell context menu (Right-click / Control-click on OS X in Shell window):
Additional Help Sources:
- Windows users can Google on zopeshelf.chm to access Zope help files in
- the Windows help format. The Additional Help Sources feature of the
- configuration GUI supports .chm, along with any other filetypes
- supported by your browser. Supply a Menu Item title, and enter the
- location in the Help File Path slot of the New Help Source dialog. Use
- http:// and/or www. to identify external URLs, or download the file and
- browse for its path on your machine using the Browse button.
+ Windows users can Google on zopeshelf.chm to access Zope help files in
+ the Windows help format. The Additional Help Sources feature of the
+ configuration GUI supports .chm, along with any other filetypes
+ supported by your browser. Supply a Menu Item title, and enter the
+ location in the Help File Path slot of the New Help Source dialog. Use
+ http:// and/or www. to identify external URLs, or download the file and
+ browse for its path on your machine using the Browse button.
- All users can access the extensive sources of help, including
- tutorials, available at www.python.org/doc. Selected URLs can be added
- or removed from the Help menu at any time using Configure IDLE.
+ All users can access the extensive sources of help, including
+ tutorials, available at docs.python.org. Selected URLs can be added
+ or removed from the Help menu at any time using Configure IDLE.
Basic editing and navigation:
- Backspace deletes char to the left; DEL deletes char to the right.
- Control-backspace deletes word left, Control-DEL deletes word right.
- Arrow keys and Page Up/Down move around.
- Control-left/right Arrow moves by words in a strange but useful way.
- Home/End go to begin/end of line.
- Control-Home/End go to begin/end of file.
- Some useful Emacs bindings are inherited from Tcl/Tk:
- Control-a beginning of line
- Control-e end of line
- Control-k kill line (but doesn't put it in clipboard)
- Control-l center window around the insertion point
- Standard Windows bindings may work on that platform.
- Keybindings are selected in the Settings Dialog, look there.
+ Backspace deletes char to the left; DEL deletes char to the right.
+ Control-backspace deletes word left, Control-DEL deletes word right.
+ Arrow keys and Page Up/Down move around.
+ Control-left/right Arrow moves by words in a strange but useful way.
+ Home/End go to begin/end of line.
+ Control-Home/End go to begin/end of file.
+ Some useful Emacs bindings are inherited from Tcl/Tk:
+ Control-a beginning of line
+ Control-e end of line
+ Control-k kill line (but doesn't put it in clipboard)
+ Control-l center window around the insertion point
+ Standard keybindings (like Control-c to copy and Control-v to
+ paste) may work. Keybindings are selected in the Configure IDLE
+ dialog.
Automatic indentation:
- After a block-opening statement, the next line is indented by 4 spaces
- (in the Python Shell window by one tab). After certain keywords
- (break, return etc.) the next line is dedented. In leading
- indentation, Backspace deletes up to 4 spaces if they are there. Tab
- inserts spaces (in the Python Shell window one tab), number depends on
- Indent Width. (N.B. Currently tabs are restricted to four spaces due
- to Tcl/Tk issues.)
+ After a block-opening statement, the next line is indented by 4 spaces
+ (in the Python Shell window by one tab). After certain keywords
+ (break, return etc.) the next line is dedented. In leading
+ indentation, Backspace deletes up to 4 spaces if they are there. Tab
+ inserts spaces (in the Python Shell window one tab), number depends on
+ Indent Width. Currently tabs are restricted to four spaces due
+ to Tcl/Tk limitations.
See also the indent/dedent region commands in the edit menu.
Completions:
- Completions are supplied for functions, classes, and attributes of
- classes, both built-in and user-defined. Completions are also provided
- for filenames.
-
- The AutoCompleteWindow (ACW) will open after a predefined delay
- (default is two seconds) after a '.' or (in a string) an os.sep is
- typed. If after one of those characters (plus zero or more other
- characters) you type a Tab the ACW will open immediately if a possible
- continuation is found.
-
- If there is only one possible completion for the characters entered, a
- Tab will supply that completion without opening the ACW.
-
- 'Show Completions' will force open a completions window. In an empty
- string, this will contain the files in the current directory. On a
- blank line, it will contain the built-in and user-defined functions and
- classes in the current name spaces, plus any modules imported. If some
- characters have been entered, the ACW will attempt to be more specific.
-
- If string of characters is typed, the ACW selection will jump to the
- entry most closely matching those characters. Entering a Tab will cause
- the longest non-ambiguous match to be entered in the Edit window or
- Shell. Two Tabs in a row will supply the current ACW selection, as
- will Return or a double click. Cursor keys, Page Up/Down, mouse
- selection, and the scrollwheel all operate on the ACW.
-
- 'Hidden' attributes can be accessed by typing the beginning of hidden
- name after a '.'. e.g. '_'. This allows access to modules with
- '__all__' set, or to class-private attributes.
-
- Completions and the 'Expand Word' facility can save a lot of typing!
-
- Completions are currently limited to those in the namespaces. Names in
- an Edit window which are not via __main__ or sys.modules will not be
- found. Run the module once with your imports to correct this
- situation. Note that IDLE itself places quite a few modules in
- sys.modules, so much can be found by default, e.g. the re module.
-
- If you don't like the ACW popping up unbidden, simply make the delay
- longer or disable the extension. OTOH, you could make the delay zero.
-
- You could also switch off the CallTips extension. (We will be adding
- a delay to the call tip window.)
+ Completions are supplied for functions, classes, and attributes of
+ classes, both built-in and user-defined. Completions are also provided
+ for filenames.
+
+ The AutoCompleteWindow (ACW) will open after a predefined delay
+ (default is two seconds) after a '.' or (in a string) an os.sep is
+ typed. If after one of those characters (plus zero or more other
+ characters) a tab is typed the ACW will open immediately if a possible
+ continuation is found.
+
+ If there is only one possible completion for the characters entered, a
+ tab will supply that completion without opening the ACW.
+
+ 'Show Completions' will force open a completions window, by default the
+ Control-space keys will open a completions window. In an empty
+ string, this will contain the files in the current directory. On a
+ blank line, it will contain the built-in and user-defined functions and
+ classes in the current name spaces, plus any modules imported. If some
+ characters have been entered, the ACW will attempt to be more specific.
+
+ If string of characters is typed, the ACW selection will jump to the
+ entry most closely matching those characters. Entering a tab will cause
+ the longest non-ambiguous match to be entered in the Edit window or
+ Shell. Two tabs in a row will supply the current ACW selection, as
+ will return or a double click. Cursor keys, Page Up/Down, mouse
+ selection, and the scroll wheel all operate on the ACW.
+
+ "Hidden" attributes can be accessed by typing the beginning of hidden
+ name after a '.', e.g. '_'. This allows access to modules with
+ '__all__' set, or to class-private attributes.
+
+ Completions and the 'Expand Word' facility can save a lot of typing!
+
+ Completions are currently limited to those in the namespaces. Names in
+ an Editor window which are not via __main__ or sys.modules will not be
+ found. Run the module once with your imports to correct this
+ situation. Note that IDLE itself places quite a few modules in
+ sys.modules, so much can be found by default, e.g. the re module.
+
+ If you don't like the ACW popping up unbidden, simply make the delay
+ longer or disable the extension. Or another option is the delay could
+ be set to zero. Another alternative to preventing ACW popups is to
+ disable the call tips extension.
Python Shell window:
- Control-c interrupts executing command.
- Control-d sends end-of-file; closes window if typed at >>> prompt.
+ Control-c interrupts executing command.
+ Control-d sends end-of-file; closes window if typed at >>> prompt.
+ Alt-/ expand word is also useful to reduce typing.
Command history:
- Alt-p retrieves previous command matching what you have typed.
- Alt-n retrieves next.
- (These are Control-p, Control-n on OS X)
- Return while cursor is on a previous command retrieves that command.
- Expand word is also useful to reduce typing.
+ Alt-p retrieves previous command matching what you have typed. On OS X
+ use Control-p.
+ Alt-n retrieves next. On OS X use Control-n.
+ Return while cursor is on a previous command retrieves that command.
Syntax colors:
- The coloring is applied in a background "thread", so you may
- occasionally see uncolorized text. To change the color
- scheme, use the Configure IDLE / Highlighting dialog.
+ The coloring is applied in a background "thread", so you may
+ occasionally see uncolorized text. To change the color
+ scheme, use the Configure IDLE / Highlighting dialog.
Python default syntax colors:
- Keywords orange
- Builtins royal purple
- Strings green
- Comments red
- Definitions blue
+ Keywords orange
+ Builtins royal purple
+ Strings green
+ Comments red
+ Definitions blue
Shell default colors:
- Console output brown
- stdout blue
- stderr red
- stdin black
+ Console output brown
+ stdout blue
+ stderr red
+ stdin black
Other preferences:
- The font preferences, keybinding, and startup preferences can
- be changed using the Settings dialog.
+ The font preferences, highlighting, keys, and general preferences can
+ be changed via the Configure IDLE menu option. Be sure to note that
+ keys can be user defined, IDLE ships with four built in key sets. In
+ addition a user can create a custom key set in the Configure IDLE
+ dialog under the keys tab.
Command line usage:
- Enter idle -h at the command prompt to get a usage message.
-
-Running without a subprocess:
-
- If IDLE is started with the -n command line switch it will run in a
- single process and will not create the subprocess which runs the RPC
- Python execution server. This can be useful if Python cannot create
- the subprocess or the RPC socket interface on your platform. However,
- in this mode user code is not isolated from IDLE itself. Also, the
- environment is not restarted when Run/Run Module (F5) is selected. If
- your code has been modified, you must reload() the affected modules and
- re-import any specific items (e.g. from foo import baz) if the changes
- are to take effect. For these reasons, it is preferable to run IDLE
- with the default subprocess if at all possible.
+ Enter idle -h at the command prompt to get a usage message.
+
+ idle.py [-c command] [-d] [-e] [-s] [-t title] [arg] ...
+
+ -c command run this command
+ -d enable debugger
+ -e edit mode; arguments are files to be edited
+ -s run $IDLESTARTUP or $PYTHONSTARTUP first
+ -t title set title of shell window
+
+ If there are arguments:
+ 1. If -e is used, arguments are files opened for editing and sys.argv
+ reflects the arguments passed to IDLE itself.
+ 2. Otherwise, if -c is used, all arguments are placed in
+ sys.argv[1:...], with sys.argv[0] set to -c.
+ 3. Otherwise, if neither -e nor -c is used, the first argument is a
+ script which is executed with the remaining arguments in
+ sys.argv[1:...] and sys.argv[0] set to the script name. If the
+ script name is -, no script is executed but an interactive Python
+ session is started; the arguments are still available in sys.argv.
+
+Running without a subprocess: (DEPRECATED in Python 3.4 see Issue 16123)
+
+ If IDLE is started with the -n command line switch it will run in a
+ single process and will not create the subprocess which runs the RPC
+ Python execution server. This can be useful if Python cannot create
+ the subprocess or the RPC socket interface on your platform. However,
+ in this mode user code is not isolated from IDLE itself. Also, the
+ environment is not restarted when Run/Run Module (F5) is selected. If
+ your code has been modified, you must reload() the affected modules and
+ re-import any specific items (e.g. from foo import baz) if the changes
+ are to take effect. For these reasons, it is preferable to run IDLE
+ with the default subprocess if at all possible.
Extensions:
- IDLE contains an extension facility. See the beginning of
- config-extensions.def in the idlelib directory for further information.
- The default extensions are currently:
-
- FormatParagraph
- AutoExpand
- ZoomHeight
- ScriptBinding
- CallTips
- ParenMatch
- AutoComplete
- CodeContext
+ IDLE contains an extension facility. See the beginning of
+ config-extensions.def in the idlelib directory for further information.
+ The default extensions are currently:
+
+ FormatParagraph
+ AutoExpand
+ ZoomHeight
+ ScriptBinding
+ CallTips
+ ParenMatch
+ AutoComplete
+ CodeContext
diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py
index b7ff0f8..8cd1c0f 100644
--- a/Lib/idlelib/idlever.py
+++ b/Lib/idlelib/idlever.py
@@ -1 +1 @@
-IDLE_VERSION = "3.3.2"
+IDLE_VERSION = "3.4.0a1"
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py
index ddce6e9..9c51b8f 100644
--- a/Lib/idlelib/rpc.py
+++ b/Lib/idlelib/rpc.py
@@ -199,7 +199,7 @@ class SocketIO(object):
raise
except KeyboardInterrupt:
raise
- except socket.error:
+ except OSError:
raise
except Exception as ex:
return ("CALLEXC", ex)
@@ -340,7 +340,7 @@ class SocketIO(object):
n = self.sock.send(s[:BUFSIZE])
except (AttributeError, TypeError):
raise OSError("socket no longer exists")
- except socket.error:
+ except OSError:
raise
else:
s = s[n:]
@@ -357,7 +357,7 @@ class SocketIO(object):
return None
try:
s = self.sock.recv(BUFSIZE)
- except socket.error:
+ except OSError:
raise EOFError
if len(s) == 0:
raise EOFError
@@ -537,7 +537,7 @@ class RPCClient(SocketIO):
SocketIO.__init__(self, working_sock)
else:
print("** Invalid host: ", address, file=sys.__stderr__)
- raise socket.error
+ raise OSError
def get_remote_proxy(self, oid):
return RPCProxy(self, oid)
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index c1859b6..13cec62 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -150,8 +150,8 @@ def manage_socket(address):
try:
server = MyRPCServer(address, MyHandler)
break
- except socket.error as err:
- print("IDLE Subprocess: socket error: " + err.args[1] +
+ except OSError as err:
+ print("IDLE Subprocess: OSError: " + err.args[1] +
", retrying....", file=sys.__stderr__)
socket_error = err
else:
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index 724f9d1..42353bb 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -176,7 +176,7 @@ class IMAP4:
except Exception:
try:
self.shutdown()
- except socket.error:
+ except OSError:
pass
raise
@@ -269,7 +269,7 @@ class IMAP4:
self.file.close()
try:
self.sock.shutdown(socket.SHUT_RDWR)
- except socket.error as e:
+ except OSError as e:
# The server might already have closed the connection
if e.errno != errno.ENOTCONN:
raise
@@ -903,7 +903,7 @@ class IMAP4:
try:
self.send(data + CRLF)
- except (socket.error, OSError) as val:
+ except OSError as val:
raise self.abort('socket error: %s' % val)
if literal is None:
@@ -928,7 +928,7 @@ class IMAP4:
try:
self.send(literal)
self.send(CRLF)
- except (socket.error, OSError) as val:
+ except OSError as val:
raise self.abort('socket error: %s' % val)
if not literator:
@@ -1073,7 +1073,7 @@ class IMAP4:
# Protocol mandates all lines terminated by CRLF
if not line.endswith(b'\r\n'):
- raise self.abort('socket error: unterminated line')
+ raise self.abort('socket error: unterminated line: %r' % line)
line = line[:-2]
if __debug__:
diff --git a/Lib/imghdr.py b/Lib/imghdr.py
index 6ee45da..0cba063 100644
--- a/Lib/imghdr.py
+++ b/Lib/imghdr.py
@@ -149,7 +149,7 @@ def testall(list, recursive, toplevel):
sys.stdout.flush()
try:
print(what(filename))
- except IOError:
+ except OSError:
print('*** not found ***')
if __name__ == '__main__':
diff --git a/Lib/imp.py b/Lib/imp.py
index 30c343f..32e8998 100644
--- a/Lib/imp.py
+++ b/Lib/imp.py
@@ -16,18 +16,20 @@ except ImportError:
# Platform doesn't support dynamic loading.
load_dynamic = None
-# Directly exposed by this module
-from importlib._bootstrap import new_module
-from importlib._bootstrap import cache_from_source, source_from_cache
+from importlib._bootstrap import SourcelessFileLoader, _ERR_MSG
-
-from importlib import _bootstrap
from importlib import machinery
+from importlib import util
+import importlib
import os
import sys
import tokenize
+import types
import warnings
+warnings.warn("the imp module is deprecated in favour of importlib; "
+ "see the module's documentation for alternative uses",
+ PendingDeprecationWarning)
# DEPRECATED
SEARCH_ERROR = 0
@@ -42,9 +44,23 @@ PY_CODERESOURCE = 8
IMP_HOOK = 9
+def new_module(name):
+ """**DEPRECATED**
+
+ Create a new module.
+
+ The module is not entered into sys.modules.
+
+ """
+ return types.ModuleType(name)
+
+
def get_magic():
- """Return the magic number for .pyc or .pyo files."""
- return _bootstrap._MAGIC_BYTES
+ """**DEPRECATED**
+
+ Return the magic number for .pyc or .pyo files.
+ """
+ return util.MAGIC_NUMBER
def get_tag():
@@ -52,10 +68,40 @@ def get_tag():
return sys.implementation.cache_tag
+def cache_from_source(path, debug_override=None):
+ """**DEPRECATED**
+
+ Given the path to a .py file, return the path to its .pyc/.pyo file.
+
+ The .py file does not need to exist; this simply returns the path to the
+ .pyc/.pyo file calculated as if the .py file were imported. The extension
+ will be .pyc unless sys.flags.optimize is non-zero, then it will be .pyo.
+
+ If debug_override is not None, then it must be a boolean and is used in
+ place of sys.flags.optimize.
+
+ If sys.implementation.cache_tag is None then NotImplementedError is raised.
+
+ """
+ return util.cache_from_source(path, debug_override)
+
+
+def source_from_cache(path):
+ """**DEPRECATED**
+
+ Given the path to a .pyc./.pyo file, return the path to its .py file.
+
+ The .pyc/.pyo file does not need to exist; this simply returns the path to
+ the .py file calculated to correspond to the .pyc/.pyo file. If path does
+ not conform to PEP 3147 format, ValueError will be raised. If
+ sys.implementation.cache_tag is None then NotImplementedError is raised.
+
+ """
+ return util.source_from_cache(path)
+
+
def get_suffixes():
- warnings.warn('imp.get_suffixes() is deprecated; use the constants '
- 'defined on importlib.machinery instead',
- DeprecationWarning, 2)
+ """**DEPRECATED**"""
extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES]
source = [(s, 'U', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES]
bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES]
@@ -65,7 +111,11 @@ def get_suffixes():
class NullImporter:
- """Null import object."""
+ """**DEPRECATED**
+
+ Null import object.
+
+ """
def __init__(self, path):
if path == '':
@@ -101,48 +151,37 @@ class _HackedGetData:
return super().get_data(path)
-class _LoadSourceCompatibility(_HackedGetData, _bootstrap.SourceFileLoader):
+class _LoadSourceCompatibility(_HackedGetData, machinery.SourceFileLoader):
"""Compatibility support for implementing load_source()."""
def load_source(name, pathname, file=None):
- msg = ('imp.load_source() is deprecated; use '
- 'importlib.machinery.SourceFileLoader(name, pathname).load_module()'
- ' instead')
- warnings.warn(msg, DeprecationWarning, 2)
_LoadSourceCompatibility(name, pathname, file).load_module(name)
module = sys.modules[name]
# To allow reloading to potentially work, use a non-hacked loader which
# won't rely on a now-closed file object.
- module.__loader__ = _bootstrap.SourceFileLoader(name, pathname)
+ module.__loader__ = machinery.SourceFileLoader(name, pathname)
return module
-class _LoadCompiledCompatibility(_HackedGetData,
- _bootstrap.SourcelessFileLoader):
+class _LoadCompiledCompatibility(_HackedGetData, SourcelessFileLoader):
"""Compatibility support for implementing load_compiled()."""
def load_compiled(name, pathname, file=None):
- msg = ('imp.load_compiled() is deprecated; use '
- 'importlib.machinery.SourcelessFileLoader(name, pathname).'
- 'load_module() instead ')
- warnings.warn(msg, DeprecationWarning, 2)
+ """**DEPRECATED**"""
_LoadCompiledCompatibility(name, pathname, file).load_module(name)
module = sys.modules[name]
# To allow reloading to potentially work, use a non-hacked loader which
# won't rely on a now-closed file object.
- module.__loader__ = _bootstrap.SourcelessFileLoader(name, pathname)
+ module.__loader__ = SourcelessFileLoader(name, pathname)
return module
def load_package(name, path):
- msg = ('imp.load_package() is deprecated; use either '
- 'importlib.machinery.SourceFileLoader() or '
- 'importlib.machinery.SourcelessFileLoader() instead')
- warnings.warn(msg, DeprecationWarning, 2)
+ """**DEPRECATED**"""
if os.path.isdir(path):
extensions = (machinery.SOURCE_SUFFIXES[:] +
machinery.BYTECODE_SUFFIXES[:])
@@ -152,7 +191,7 @@ def load_package(name, path):
break
else:
raise ValueError('{!r} is not a package'.format(path))
- return _bootstrap.SourceFileLoader(name, path).load_module(name)
+ return machinery.SourceFileLoader(name, path).load_module(name)
def load_module(name, file, filename, details):
@@ -164,32 +203,30 @@ def load_module(name, file, filename, details):
"""
suffix, mode, type_ = details
- with warnings.catch_warnings():
- warnings.simplefilter('ignore')
- if mode and (not mode.startswith(('r', 'U')) or '+' in mode):
- raise ValueError('invalid file open mode {!r}'.format(mode))
- elif file is None and type_ in {PY_SOURCE, PY_COMPILED}:
- msg = 'file object required for import (type code {})'.format(type_)
- raise ValueError(msg)
- elif type_ == PY_SOURCE:
- return load_source(name, filename, file)
- elif type_ == PY_COMPILED:
- return load_compiled(name, filename, file)
- elif type_ == C_EXTENSION and load_dynamic is not None:
- if file is None:
- with open(filename, 'rb') as opened_file:
- return load_dynamic(name, filename, opened_file)
- else:
- return load_dynamic(name, filename, file)
- elif type_ == PKG_DIRECTORY:
- return load_package(name, filename)
- elif type_ == C_BUILTIN:
- return init_builtin(name)
- elif type_ == PY_FROZEN:
- return init_frozen(name)
+ if mode and (not mode.startswith(('r', 'U')) or '+' in mode):
+ raise ValueError('invalid file open mode {!r}'.format(mode))
+ elif file is None and type_ in {PY_SOURCE, PY_COMPILED}:
+ msg = 'file object required for import (type code {})'.format(type_)
+ raise ValueError(msg)
+ elif type_ == PY_SOURCE:
+ return load_source(name, filename, file)
+ elif type_ == PY_COMPILED:
+ return load_compiled(name, filename, file)
+ elif type_ == C_EXTENSION and load_dynamic is not None:
+ if file is None:
+ with open(filename, 'rb') as opened_file:
+ return load_dynamic(name, filename, opened_file)
else:
- msg = "Don't know how to import {} (type code {})".format(name, type_)
- raise ImportError(msg, name=name)
+ return load_dynamic(name, filename, file)
+ elif type_ == PKG_DIRECTORY:
+ return load_package(name, filename)
+ elif type_ == C_BUILTIN:
+ return init_builtin(name)
+ elif type_ == PY_FROZEN:
+ return init_frozen(name)
+ else:
+ msg = "Don't know how to import {} (type code {})".format(name, type_)
+ raise ImportError(msg, name=name)
def find_module(name, path=None):
@@ -225,18 +262,16 @@ def find_module(name, path=None):
file_path = os.path.join(package_directory, package_file_name)
if os.path.isfile(file_path):
return None, package_directory, ('', '', PKG_DIRECTORY)
- with warnings.catch_warnings():
- warnings.simplefilter('ignore')
- for suffix, mode, type_ in get_suffixes():
- file_name = name + suffix
- file_path = os.path.join(entry, file_name)
- if os.path.isfile(file_path):
- break
- else:
- continue
- break # Break out of outer loop when breaking out of inner loop.
+ for suffix, mode, type_ in get_suffixes():
+ file_name = name + suffix
+ file_path = os.path.join(entry, file_name)
+ if os.path.isfile(file_path):
+ break
+ else:
+ continue
+ break # Break out of outer loop when breaking out of inner loop.
else:
- raise ImportError(_bootstrap._ERR_MSG.format(name), name=name)
+ raise ImportError(_ERR_MSG.format(name), name=name)
encoding = None
if mode == 'U':
@@ -246,33 +281,12 @@ def find_module(name, path=None):
return file, file_path, (suffix, mode, type_)
-_RELOADING = {}
-
def reload(module):
- """Reload the module and return it.
+ """**DEPRECATED**
+
+ Reload the module and return it.
The module must have been successfully imported before.
"""
- if not module or type(module) != type(sys):
- raise TypeError("reload() argument must be module")
- name = module.__name__
- if name not in sys.modules:
- msg = "module {} not in sys.modules"
- raise ImportError(msg.format(name), name=name)
- if name in _RELOADING:
- return _RELOADING[name]
- _RELOADING[name] = module
- try:
- parent_name = name.rpartition('.')[0]
- if parent_name and parent_name not in sys.modules:
- msg = "parent {!r} not in sys.modules"
- raise ImportError(msg.format(parent_name), name=parent_name)
- module.__loader__.load_module(name)
- # The module may have replaced itself in sys.modules!
- return sys.modules[module.__name__]
- finally:
- try:
- del _RELOADING[name]
- except KeyError:
- pass
+ return importlib.reload(module)
diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py
index 22c90f2..69ca9ce 100644
--- a/Lib/importlib/__init__.py
+++ b/Lib/importlib/__init__.py
@@ -1,5 +1,5 @@
"""A pure Python implementation of import."""
-__all__ = ['__import__', 'import_module', 'invalidate_caches']
+__all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload']
# Bootstrap help #####################################################
@@ -11,6 +11,7 @@ __all__ = ['__import__', 'import_module', 'invalidate_caches']
# initialised below if the frozen one is not available).
import _imp # Just the builtin component, NOT the full Python module
import sys
+import types
try:
import _frozen_importlib as _bootstrap
@@ -68,6 +69,8 @@ def find_loader(name, path=None):
return loader
except KeyError:
pass
+ except AttributeError:
+ raise ValueError('{}.__loader__ is not set'.format(name))
return _bootstrap._find_module(name, path)
@@ -82,9 +85,44 @@ def import_module(name, package=None):
level = 0
if name.startswith('.'):
if not package:
- raise TypeError("relative imports require the 'package' argument")
+ msg = ("the 'package' argument is required to perform a relative "
+ "import for {!r}")
+ raise TypeError(msg.format(name))
for character in name:
if character != '.':
break
level += 1
return _bootstrap._gcd_import(name[level:], package, level)
+
+
+_RELOADING = {}
+
+
+def reload(module):
+ """Reload the module and return it.
+
+ The module must have been successfully imported before.
+
+ """
+ if not module or not isinstance(module, types.ModuleType):
+ raise TypeError("reload() argument must be module")
+ name = module.__name__
+ if name not in sys.modules:
+ msg = "module {} not in sys.modules"
+ raise ImportError(msg.format(name), name=name)
+ if name in _RELOADING:
+ return _RELOADING[name]
+ _RELOADING[name] = module
+ try:
+ parent_name = name.rpartition('.')[0]
+ if parent_name and parent_name not in sys.modules:
+ msg = "parent {!r} not in sys.modules"
+ raise ImportError(msg.format(parent_name), name=parent_name)
+ module.__loader__.load_module(name)
+ # The module may have replaced itself in sys.modules!
+ return sys.modules[module.__name__]
+ finally:
+ try:
+ del _RELOADING[name]
+ except KeyError:
+ pass
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index ff10308..9174057 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -9,7 +9,7 @@ work. One should use importlib as the public-facing version of this module.
#
# IMPORTANT: Whenever making changes to this module, be sure to run
# a top-level make in order to get the frozen version of the module
-# update. Not doing so, will result in the Makefile to fail for
+# update. Not doing so will result in the Makefile to fail for
# all others who don't have a ./python around to freeze the module
# in the early stages of compilation.
#
@@ -20,10 +20,6 @@ work. One should use importlib as the public-facing version of this module.
# reference any injected objects! This includes not only global code but also
# anything specified at the class level.
-# XXX Make sure all public names have no single leading underscore and all
-# others do.
-
-
# Bootstrap-related code ######################################################
_CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin'
@@ -41,58 +37,32 @@ def _make_relax_case():
return _relax_case
-# TODO: Expose from marshal
def _w_long(x):
- """Convert a 32-bit integer to little-endian.
-
- XXX Temporary until marshal's long functions are exposed.
-
- """
- x = int(x)
- int_bytes = []
- int_bytes.append(x & 0xFF)
- int_bytes.append((x >> 8) & 0xFF)
- int_bytes.append((x >> 16) & 0xFF)
- int_bytes.append((x >> 24) & 0xFF)
- return bytearray(int_bytes)
+ """Convert a 32-bit integer to little-endian."""
+ return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little')
-# TODO: Expose from marshal
def _r_long(int_bytes):
- """Convert 4 bytes in little-endian to an integer.
-
- XXX Temporary until marshal's long function are exposed.
-
- """
- x = int_bytes[0]
- x |= int_bytes[1] << 8
- x |= int_bytes[2] << 16
- x |= int_bytes[3] << 24
- return x
+ """Convert 4 bytes in little-endian to an integer."""
+ return int.from_bytes(int_bytes, 'little')
def _path_join(*path_parts):
"""Replacement for os.path.join()."""
- new_parts = []
- for part in path_parts:
- if not part:
- continue
- new_parts.append(part)
- if part[-1] not in path_separators:
- new_parts.append(path_sep)
- return ''.join(new_parts[:-1]) # Drop superfluous path separator.
+ return path_sep.join([part.rstrip(path_separators)
+ for part in path_parts if part])
def _path_split(path):
"""Replacement for os.path.split()."""
+ if len(path_separators) == 1:
+ front, _, tail = path.rpartition(path_sep)
+ return front, tail
for x in reversed(path):
if x in path_separators:
- sep = x
- break
- else:
- sep = path_sep
- front, _, tail = path.rpartition(sep)
- return front, tail
+ front, tail = path.rsplit(x, maxsplit=1)
+ return front, tail
+ return '', path
def _path_is_mode_type(path, mode):
@@ -151,15 +121,6 @@ def _wrap(new, old):
_code_type = type(_wrap.__code__)
-def new_module(name):
- """Create a new module.
-
- The module is not entered into sys.modules.
-
- """
- return type(_io)(name)
-
-
# Module-level locking ########################################################
# A dict mapping module names to weakrefs of _ModuleLock instances
@@ -214,7 +175,7 @@ class _ModuleLock:
self.count += 1
return True
if self.has_deadlock():
- raise _DeadlockError("deadlock detected by %r" % self)
+ raise _DeadlockError('deadlock detected by %r' % self)
if self.wakeup.acquire(False):
self.waiters += 1
# Wait for a release() call
@@ -227,7 +188,7 @@ class _ModuleLock:
tid = _thread.get_ident()
with self.lock:
if self.owner != tid:
- raise RuntimeError("cannot release un-acquired lock")
+ raise RuntimeError('cannot release un-acquired lock')
assert self.count > 0
self.count -= 1
if self.count == 0:
@@ -237,7 +198,7 @@ class _ModuleLock:
self.wakeup.release()
def __repr__(self):
- return "_ModuleLock(%r) at %d" % (self.name, id(self))
+ return '_ModuleLock({!r}) at {}'.format(self.name, id(self))
class _DummyModuleLock:
@@ -254,11 +215,11 @@ class _DummyModuleLock:
def release(self):
if self.count == 0:
- raise RuntimeError("cannot release un-acquired lock")
+ raise RuntimeError('cannot release un-acquired lock')
self.count -= 1
def __repr__(self):
- return "_DummyModuleLock(%r) at %d" % (self.name, id(self))
+ return '_DummyModuleLock({!r}) at {}'.format(self.name, id(self))
# The following two functions are for consumption by Python/import.c.
@@ -315,95 +276,106 @@ def _call_with_frames_removed(f, *args, **kwds):
# Finder/loader utility code ###############################################
-"""Magic word to reject .pyc files generated by other Python versions.
-It should change for each incompatible change to the bytecode.
-
-The value of CR and LF is incorporated so if you ever read or write
-a .pyc file in text mode the magic number will be wrong; also, the
-Apple MPW compiler swaps their values, botching string constants.
-
-The magic numbers must be spaced apart at least 2 values, as the
--U interpeter flag will cause MAGIC+1 being used. They have been
-odd numbers for some time now.
-
-There were a variety of old schemes for setting the magic number.
-The current working scheme is to increment the previous value by
-10.
-
-Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
-number also includes a new "magic tag", i.e. a human readable string used
-to represent the magic number in __pycache__ directories. When you change
-the magic number, you must also set a new unique magic tag. Generally this
-can be named after the Python major version of the magic number bump, but
-it can really be anything, as long as it's different than anything else
-that's come before. The tags are included in the following table, starting
-with Python 3.2a0.
-
-Known values:
- Python 1.5: 20121
- Python 1.5.1: 20121
- Python 1.5.2: 20121
- Python 1.6: 50428
- Python 2.0: 50823
- Python 2.0.1: 50823
- Python 2.1: 60202
- Python 2.1.1: 60202
- Python 2.1.2: 60202
- Python 2.2: 60717
- Python 2.3a0: 62011
- Python 2.3a0: 62021
- Python 2.3a0: 62011 (!)
- Python 2.4a0: 62041
- Python 2.4a3: 62051
- Python 2.4b1: 62061
- Python 2.5a0: 62071
- Python 2.5a0: 62081 (ast-branch)
- Python 2.5a0: 62091 (with)
- Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
- Python 2.5b3: 62101 (fix wrong code: for x, in ...)
- Python 2.5b3: 62111 (fix wrong code: x += yield)
- Python 2.5c1: 62121 (fix wrong lnotab with for loops and
- storing constants that should have been removed)
- Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
- Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
- Python 2.6a1: 62161 (WITH_CLEANUP optimization)
- Python 3000: 3000
- 3010 (removed UNARY_CONVERT)
- 3020 (added BUILD_SET)
- 3030 (added keyword-only parameters)
- 3040 (added signature annotations)
- 3050 (print becomes a function)
- 3060 (PEP 3115 metaclass syntax)
- 3061 (string literals become unicode)
- 3071 (PEP 3109 raise changes)
- 3081 (PEP 3137 make __file__ and __name__ unicode)
- 3091 (kill str8 interning)
- 3101 (merge from 2.6a0, see 62151)
- 3103 (__file__ points to source file)
- Python 3.0a4: 3111 (WITH_CLEANUP optimization).
- Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
- Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
- change LIST_APPEND and SET_ADD, add MAP_ADD)
- Python 3.1a0: 3151 (optimize conditional branches:
- introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
- Python 3.2a0: 3160 (add SETUP_WITH)
- tag: cpython-32
- Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
- tag: cpython-32
- Python 3.2a2 3180 (add DELETE_DEREF)
- Python 3.3a0 3190 __class__ super closure changed
- Python 3.3a0 3200 (__qualname__ added)
- 3210 (added size modulo 2**32 to the pyc header)
- Python 3.3a1 3220 (changed PEP 380 implementation)
- Python 3.3a4 3230 (revert changes to implicit __class__ closure)
-
-MAGIC must change whenever the bytecode emitted by the compiler may no
-longer be understood by older implementations of the eval loop (usually
-due to the addition of new opcodes).
+# Magic word to reject .pyc files generated by other Python versions.
+# It should change for each incompatible change to the bytecode.
+#
+# The value of CR and LF is incorporated so if you ever read or write
+# a .pyc file in text mode the magic number will be wrong; also, the
+# Apple MPW compiler swaps their values, botching string constants.
+#
+# The magic numbers must be spaced apart at least 2 values, as the
+# -U interpeter flag will cause MAGIC+1 being used. They have been
+# odd numbers for some time now.
+#
+# There were a variety of old schemes for setting the magic number.
+# The current working scheme is to increment the previous value by
+# 10.
+#
+# Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
+# number also includes a new "magic tag", i.e. a human readable string used
+# to represent the magic number in __pycache__ directories. When you change
+# the magic number, you must also set a new unique magic tag. Generally this
+# can be named after the Python major version of the magic number bump, but
+# it can really be anything, as long as it's different than anything else
+# that's come before. The tags are included in the following table, starting
+# with Python 3.2a0.
+#
+# Known values:
+# Python 1.5: 20121
+# Python 1.5.1: 20121
+# Python 1.5.2: 20121
+# Python 1.6: 50428
+# Python 2.0: 50823
+# Python 2.0.1: 50823
+# Python 2.1: 60202
+# Python 2.1.1: 60202
+# Python 2.1.2: 60202
+# Python 2.2: 60717
+# Python 2.3a0: 62011
+# Python 2.3a0: 62021
+# Python 2.3a0: 62011 (!)
+# Python 2.4a0: 62041
+# Python 2.4a3: 62051
+# Python 2.4b1: 62061
+# Python 2.5a0: 62071
+# Python 2.5a0: 62081 (ast-branch)
+# Python 2.5a0: 62091 (with)
+# Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
+# Python 2.5b3: 62101 (fix wrong code: for x, in ...)
+# Python 2.5b3: 62111 (fix wrong code: x += yield)
+# Python 2.5c1: 62121 (fix wrong lnotab with for loops and
+# storing constants that should have been removed)
+# Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
+# Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
+# Python 2.6a1: 62161 (WITH_CLEANUP optimization)
+# Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND)
+# Python 2.7a0: 62181 (optimize conditional branches:
+# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
+# Python 2.7a0 62191 (introduce SETUP_WITH)
+# Python 2.7a0 62201 (introduce BUILD_SET)
+# Python 2.7a0 62211 (introduce MAP_ADD and SET_ADD)
+# Python 3000: 3000
+# 3010 (removed UNARY_CONVERT)
+# 3020 (added BUILD_SET)
+# 3030 (added keyword-only parameters)
+# 3040 (added signature annotations)
+# 3050 (print becomes a function)
+# 3060 (PEP 3115 metaclass syntax)
+# 3061 (string literals become unicode)
+# 3071 (PEP 3109 raise changes)
+# 3081 (PEP 3137 make __file__ and __name__ unicode)
+# 3091 (kill str8 interning)
+# 3101 (merge from 2.6a0, see 62151)
+# 3103 (__file__ points to source file)
+# Python 3.0a4: 3111 (WITH_CLEANUP optimization).
+# Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
+# Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
+# change LIST_APPEND and SET_ADD, add MAP_ADD)
+# Python 3.1a0: 3151 (optimize conditional branches:
+# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
+# Python 3.2a0: 3160 (add SETUP_WITH)
+# tag: cpython-32
+# Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
+# tag: cpython-32
+# Python 3.2a2 3180 (add DELETE_DEREF)
+# Python 3.3a0 3190 __class__ super closure changed
+# Python 3.3a0 3200 (__qualname__ added)
+# 3210 (added size modulo 2**32 to the pyc header)
+# Python 3.3a1 3220 (changed PEP 380 implementation)
+# Python 3.3a4 3230 (revert changes to implicit __class__ closure)
+# Python 3.4a1 3250 (evaluate positional default arguments before
+# keyword-only defaults)
+# Python 3.4a1 3260 (add LOAD_CLASSDEREF; allow locals of class to override
+# free vars)
+# Python 3.4a1 3270 (various tweaks to the __class__ closure)
+# Python 3.4a1 3280 (remove implicit class argument)
+#
+# MAGIC must change whenever the bytecode emitted by the compiler may no
+# longer be understood by older implementations of the eval loop (usually
+# due to the addition of new opcodes).
-"""
-_RAW_MAGIC_NUMBER = 3230 | ord('\r') << 16 | ord('\n') << 24
-_MAGIC_BYTES = bytes(_RAW_MAGIC_NUMBER >> n & 0xff for n in range(0, 25, 8))
+MAGIC_NUMBER = (3280).to_bytes(2, 'little') + b'\r\n'
+_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c
_PYCACHE = '__pycache__'
@@ -481,6 +453,18 @@ def _get_sourcefile(bytecode_path):
return source_path if _path_isfile(source_path) else bytecode_path
+def _calc_mode(path):
+ """Calculate the mode permissions for a bytecode file."""
+ try:
+ mode = _os.stat(path).st_mode
+ except OSError:
+ mode = 0o666
+ # We always ensure write access so we can update cached files
+ # later even when the source files are read-only on Windows (#6074)
+ mode |= 0o200
+ return mode
+
+
def _verbose_message(message, *args, verbosity=1):
"""Print the message to stderr if -v/PYTHONVERBOSE is turned on."""
if sys.flags.verbose >= verbosity:
@@ -489,6 +473,100 @@ def _verbose_message(message, *args, verbosity=1):
print(message.format(*args), file=sys.stderr)
+class _ManageReload:
+
+ def __init__(self, name):
+ self._name = name
+
+ def __enter__(self):
+ self._is_reload = self._name in sys.modules
+
+ def __exit__(self, *args):
+ if any(arg is not None for arg in args) and not self._is_reload:
+ try:
+ del sys.modules[self._name]
+ except KeyError:
+ pass
+
+
+# Written as a class only because contextlib is not available.
+class _ModuleManager(_ManageReload):
+
+ """Context manager which returns the module to be loaded.
+
+ Does the proper unloading from sys.modules upon failure.
+
+ """
+
+ def __init__(self, name, *, reset_name=True):
+ """Prepare the context manager.
+
+ The reset_name argument specifies whether to unconditionally reset
+ the __name__ attribute if the module is found to be a reload.
+ """
+ super().__init__(name)
+ self._reset_name = reset_name
+
+ def __enter__(self):
+ super().__enter__()
+ self._module = sys.modules.get(self._name)
+ if not self._is_reload:
+ # This must be done before open() is called as the 'io' module
+ # implicitly imports 'locale' and would otherwise trigger an
+ # infinite loop.
+ self._module = type(_io)(self._name)
+ # This must be done before putting the module in sys.modules
+ # (otherwise an optimization shortcut in import.c becomes wrong)
+ self._module.__initializing__ = True
+ sys.modules[self._name] = self._module
+ elif self._reset_name:
+ try:
+ self._module.__name__ = self._name
+ except AttributeError:
+ pass
+ return self._module
+
+ def __exit__(self, *args):
+ self._module.__initializing__ = False
+ del self._module
+ super().__exit__(*args)
+
+
+def module_to_load(name, *, reset_name=True):
+ """Return a context manager which provides the module object to load.
+
+ If reset_name is true, reset the module's __name__ to 'name'.
+ """
+ # Hiding _ModuleManager behind a function for better naming.
+ return _ModuleManager(name, reset_name=reset_name)
+
+
+def _init_package_attrs(loader, module):
+ """Set __package__ and __path__ based on what loader.is_package() says."""
+ name = module.__name__
+ try:
+ is_package = loader.is_package(name)
+ except ImportError:
+ pass
+ else:
+ if is_package:
+ module.__package__ = name
+ module.__path__ = []
+ else:
+ module.__package__ = name.rpartition('.')[0]
+
+
+def _init_file_attrs(loader, module):
+ """Set __file__ and __path__ based on loader.get_filename()."""
+ try:
+ module.__file__ = loader.get_filename(module.__name__)
+ except ImportError:
+ pass
+ else:
+ if module.__name__ == module.__package__:
+ module.__path__.append(_path_split(module.__file__)[0])
+
+
def set_package(fxn):
"""Set __package__ on the returned module."""
def set_package_wrapper(*args, **kwargs):
@@ -506,68 +584,13 @@ def set_loader(fxn):
"""Set __loader__ on the returned module."""
def set_loader_wrapper(self, *args, **kwargs):
module = fxn(self, *args, **kwargs)
- if not hasattr(module, '__loader__'):
+ if getattr(module, '__loader__', None) is None:
module.__loader__ = self
return module
_wrap(set_loader_wrapper, fxn)
return set_loader_wrapper
-def module_for_loader(fxn):
- """Decorator to handle selecting the proper module for loaders.
-
- The decorated function is passed the module to use instead of the module
- name. The module passed in to the function is either from sys.modules if
- it already exists or is a new module. If the module is new, then __name__
- is set the first argument to the method, __loader__ is set to self, and
- __package__ is set accordingly (if self.is_package() is defined) will be set
- before it is passed to the decorated function (if self.is_package() does
- not work for the module it will be set post-load).
-
- If an exception is raised and the decorator created the module it is
- subsequently removed from sys.modules.
-
- The decorator assumes that the decorated function takes the module name as
- the second argument.
-
- """
- def module_for_loader_wrapper(self, fullname, *args, **kwargs):
- module = sys.modules.get(fullname)
- is_reload = module is not None
- if not is_reload:
- # This must be done before open() is called as the 'io' module
- # implicitly imports 'locale' and would otherwise trigger an
- # infinite loop.
- module = new_module(fullname)
- # This must be done before putting the module in sys.modules
- # (otherwise an optimization shortcut in import.c becomes wrong)
- module.__initializing__ = True
- sys.modules[fullname] = module
- module.__loader__ = self
- try:
- is_package = self.is_package(fullname)
- except (ImportError, AttributeError):
- pass
- else:
- if is_package:
- module.__package__ = fullname
- else:
- module.__package__ = fullname.rpartition('.')[0]
- else:
- module.__initializing__ = True
- try:
- # If __package__ was not set above, __import__() will do it later.
- return fxn(self, module, *args, **kwargs)
- except:
- if not is_reload:
- del sys.modules[fullname]
- raise
- finally:
- module.__initializing__ = False
- _wrap(module_for_loader_wrapper, fxn)
- return module_for_loader_wrapper
-
-
def _check_name(method):
"""Decorator to verify that the module being requested matches the one the
loader can handle.
@@ -580,7 +603,7 @@ def _check_name(method):
if name is None:
name = self.name
elif self.name != name:
- raise ImportError("loader cannot handle %s" % name, name=name)
+ raise ImportError('loader cannot handle %s' % name, name=name)
return method(self, name, *args, **kwargs)
_wrap(_check_name_wrapper, method)
return _check_name_wrapper
@@ -590,7 +613,7 @@ def _requires_builtin(fxn):
"""Decorator to verify the named module is built-in."""
def _requires_builtin_wrapper(self, fullname):
if fullname not in sys.builtin_module_names:
- raise ImportError("{} is not a built-in module".format(fullname),
+ raise ImportError('{} is not a built-in module'.format(fullname),
name=fullname)
return fxn(self, fullname)
_wrap(_requires_builtin_wrapper, fxn)
@@ -601,7 +624,7 @@ def _requires_frozen(fxn):
"""Decorator to verify the named module is frozen."""
def _requires_frozen_wrapper(self, fullname):
if not _imp.is_frozen(fullname):
- raise ImportError("{} is not a frozen module".format(fullname),
+ raise ImportError('{} is not a frozen module'.format(fullname),
name=fullname)
return fxn(self, fullname)
_wrap(_requires_frozen_wrapper, fxn)
@@ -616,11 +639,98 @@ def _find_module_shim(self, fullname):
# return None.
loader, portions = self.find_loader(fullname)
if loader is None and len(portions):
- msg = "Not importing directory {}: missing __init__"
+ msg = 'Not importing directory {}: missing __init__'
_warnings.warn(msg.format(portions[0]), ImportWarning)
return loader
+def _validate_bytecode_header(data, source_stats=None, name=None, path=None):
+ """Validate the header of the passed-in bytecode against source_stats (if
+ given) and returning the bytecode that can be compiled by compile().
+
+ All other arguments are used to enhance error reporting.
+
+ ImportError is raised when the magic number is incorrect or the bytecode is
+ found to be stale. EOFError is raised when the data is found to be
+ truncated.
+
+ """
+ exc_details = {}
+ if name is not None:
+ exc_details['name'] = name
+ else:
+ # To prevent having to make all messages have a conditional name.
+ name = '<bytecode>'
+ if path is not None:
+ exc_details['path'] = path
+ magic = data[:4]
+ raw_timestamp = data[4:8]
+ raw_size = data[8:12]
+ if magic != MAGIC_NUMBER:
+ message = 'bad magic number in {!r}: {!r}'.format(name, magic)
+ _verbose_message(message)
+ raise ImportError(message, **exc_details)
+ elif len(raw_timestamp) != 4:
+ message = 'reached EOF while reading timestamp in {!r}'.format(name)
+ _verbose_message(message)
+ raise EOFError(message)
+ elif len(raw_size) != 4:
+ message = 'reached EOF while reading size of source in {!r}'.format(name)
+ _verbose_message(message)
+ raise EOFError(message)
+ if source_stats is not None:
+ try:
+ source_mtime = int(source_stats['mtime'])
+ except KeyError:
+ pass
+ else:
+ if _r_long(raw_timestamp) != source_mtime:
+ message = 'bytecode is stale for {!r}'.format(name)
+ _verbose_message(message)
+ raise ImportError(message, **exc_details)
+ try:
+ source_size = source_stats['size'] & 0xFFFFFFFF
+ except KeyError:
+ pass
+ else:
+ if _r_long(raw_size) != source_size:
+ raise ImportError('bytecode is stale for {!r}'.format(name),
+ **exc_details)
+ return data[12:]
+
+
+def _compile_bytecode(data, name=None, bytecode_path=None, source_path=None):
+ """Compile bytecode as returned by _validate_bytecode_header()."""
+ code = marshal.loads(data)
+ if isinstance(code, _code_type):
+ _verbose_message('code object from {!r}', bytecode_path)
+ if source_path is not None:
+ _imp._fix_co_filename(code, source_path)
+ return code
+ else:
+ raise ImportError('Non-code object in {!r}'.format(bytecode_path),
+ name=name, path=bytecode_path)
+
+def _code_to_bytecode(code, mtime=0, source_size=0):
+ """Compile a code object into bytecode for writing out to a byte-compiled
+ file."""
+ data = bytearray(MAGIC_NUMBER)
+ data.extend(_w_long(mtime))
+ data.extend(_w_long(source_size))
+ data.extend(marshal.dumps(code))
+ return data
+
+
+def decode_source(source_bytes):
+ """Decode bytes representing source code and return the string.
+
+ Universal newline support is used in the decoding.
+ """
+ import tokenize # To avoid bootstrap issues.
+ source_bytes_readline = _io.BytesIO(source_bytes).readline
+ encoding = tokenize.detect_encoding(source_bytes_readline)
+ newline_decoder = _io.IncrementalNewlineDecoder(None, True)
+ return newline_decoder.decode(source_bytes.decode(encoding[0]))
# Loaders #####################################################################
@@ -636,7 +746,7 @@ class BuiltinImporter:
@classmethod
def module_repr(cls, module):
- return "<module '{}' (built-in)>".format(module.__name__)
+ return '<module {!r} (built-in)>'.format(module.__name__)
@classmethod
def find_module(cls, fullname, path=None):
@@ -655,13 +765,8 @@ class BuiltinImporter:
@_requires_builtin
def load_module(cls, fullname):
"""Load a built-in module."""
- is_reload = fullname in sys.modules
- try:
+ with _ManageReload(fullname):
return _call_with_frames_removed(_imp.init_builtin, fullname)
- except:
- if not is_reload and fullname in sys.modules:
- del sys.modules[fullname]
- raise
@classmethod
@_requires_builtin
@@ -693,7 +798,7 @@ class FrozenImporter:
@classmethod
def module_repr(cls, m):
- return "<module '{}' (frozen)>".format(m.__name__)
+ return '<module {!r} (frozen)>'.format(m.__name__)
@classmethod
def find_module(cls, fullname, path=None):
@@ -706,16 +811,11 @@ class FrozenImporter:
@_requires_frozen
def load_module(cls, fullname):
"""Load a frozen module."""
- is_reload = fullname in sys.modules
- try:
+ with _ManageReload(fullname):
m = _call_with_frames_removed(_imp.init_frozen, fullname)
# Let our own module_repr() method produce a suitable repr.
del m.__file__
return m
- except:
- if not is_reload and fullname in sys.modules:
- del sys.modules[fullname]
- raise
@classmethod
@_requires_frozen
@@ -742,18 +842,18 @@ class WindowsRegistryFinder:
"""
REGISTRY_KEY = (
- "Software\\Python\\PythonCore\\{sys_version}"
- "\\Modules\\{fullname}")
+ 'Software\\Python\\PythonCore\\{sys_version}'
+ '\\Modules\\{fullname}')
REGISTRY_KEY_DEBUG = (
- "Software\\Python\\PythonCore\\{sys_version}"
- "\\Modules\\{fullname}\\Debug")
+ 'Software\\Python\\PythonCore\\{sys_version}'
+ '\\Modules\\{fullname}\\Debug')
DEBUG_BUILD = False # Changed in _setup()
@classmethod
def _open_registry(cls, key):
try:
return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key)
- except WindowsError:
+ except OSError:
return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key)
@classmethod
@@ -766,8 +866,8 @@ class WindowsRegistryFinder:
sys_version=sys.version[:3])
try:
with cls._open_registry(key) as hkey:
- filepath = _winreg.QueryValue(hkey, "")
- except WindowsError:
+ filepath = _winreg.QueryValue(hkey, '')
+ except OSError:
return None
return filepath
@@ -799,74 +899,32 @@ class _LoaderBasics:
tail_name = fullname.rpartition('.')[2]
return filename_base == '__init__' and tail_name != '__init__'
- def _bytes_from_bytecode(self, fullname, data, bytecode_path, source_stats):
- """Return the marshalled bytes from bytecode, verifying the magic
- number, timestamp and source size along the way.
-
- If source_stats is None then skip the timestamp check.
+ def init_module_attrs(self, module):
+ """Set various attributes on the module.
+ ExecutionLoader.init_module_attrs() is used to set __loader__,
+ __package__, __file__, and optionally __path__. The __cached__ attribute
+ is set using imp.cache_from_source() and __file__.
"""
- magic = data[:4]
- raw_timestamp = data[4:8]
- raw_size = data[8:12]
- if magic != _MAGIC_BYTES:
- msg = 'bad magic number in {!r}: {!r}'.format(fullname, magic)
- _verbose_message(msg)
- raise ImportError(msg, name=fullname, path=bytecode_path)
- elif len(raw_timestamp) != 4:
- message = 'bad timestamp in {}'.format(fullname)
- _verbose_message(message)
- raise EOFError(message)
- elif len(raw_size) != 4:
- message = 'bad size in {}'.format(fullname)
- _verbose_message(message)
- raise EOFError(message)
- if source_stats is not None:
- try:
- source_mtime = int(source_stats['mtime'])
- except KeyError:
- pass
- else:
- if _r_long(raw_timestamp) != source_mtime:
- message = 'bytecode is stale for {}'.format(fullname)
- _verbose_message(message)
- raise ImportError(message, name=fullname,
- path=bytecode_path)
- try:
- source_size = source_stats['size'] & 0xFFFFFFFF
- except KeyError:
- pass
- else:
- if _r_long(raw_size) != source_size:
- raise ImportError(
- "bytecode is stale for {}".format(fullname),
- name=fullname, path=bytecode_path)
- # Can't return the code object as errors from marshal loading need to
- # propagate even when source is available.
- return data[12:]
-
- @module_for_loader
- def _load_module(self, module, *, sourceless=False):
- """Helper for load_module able to handle either source or sourceless
- loading."""
- name = module.__name__
- code_object = self.get_code(name)
- module.__file__ = self.get_filename(name)
- if not sourceless:
+ module.__loader__ = self # Loader
+ _init_package_attrs(self, module) # InspectLoader
+ _init_file_attrs(self, module) # ExecutionLoader
+ if hasattr(module, '__file__'): # SourceLoader
try:
module.__cached__ = cache_from_source(module.__file__)
except NotImplementedError:
- module.__cached__ = module.__file__
- else:
- module.__cached__ = module.__file__
- module.__package__ = name
- if self.is_package(name):
- module.__path__ = [_path_split(module.__file__)[0]]
- else:
- module.__package__ = module.__package__.rpartition('.')[0]
- module.__loader__ = self
- _call_with_frames_removed(exec, code_object, module.__dict__)
- return module
+ pass
+
+ def load_module(self, fullname):
+ """Load the specified module into sys.modules and return it."""
+ with module_to_load(fullname) as module:
+ self.init_module_attrs(module)
+ code = self.get_code(fullname)
+ if code is None:
+ raise ImportError('cannot load module {!r} when get_code() '
+ 'returns None'.format(fullname))
+ _call_with_frames_removed(exec, code, module.__dict__)
+ return module
class SourceLoader(_LoaderBasics):
@@ -874,8 +932,10 @@ class SourceLoader(_LoaderBasics):
def path_mtime(self, path):
"""Optional method that returns the modification time (an int) for the
specified path, where path is a str.
+
+ Raises IOError when the path cannot be handled.
"""
- raise NotImplementedError
+ raise IOError
def path_stats(self, path):
"""Optional method returning a metadata dict for the specified path
@@ -886,6 +946,7 @@ class SourceLoader(_LoaderBasics):
- 'size' (optional) is the size in bytes of the source code.
Implementing this method allows the loader to read bytecode files.
+ Raises IOError when the path cannot be handled.
"""
return {'mtime': self.path_mtime(path)}
@@ -903,32 +964,26 @@ class SourceLoader(_LoaderBasics):
"""Optional method which writes data (bytes) to a file path (a str).
Implementing this method allows for the writing of bytecode files.
-
"""
- raise NotImplementedError
def get_source(self, fullname):
"""Concrete implementation of InspectLoader.get_source."""
- import tokenize
path = self.get_filename(fullname)
try:
source_bytes = self.get_data(path)
- except IOError as exc:
- raise ImportError("source not available through get_data()",
- name=fullname) from exc
- readsource = _io.BytesIO(source_bytes).readline
- try:
- encoding = tokenize.detect_encoding(readsource)
- except SyntaxError as exc:
- raise ImportError("Failed to detect encoding",
- name=fullname) from exc
- newline_decoder = _io.IncrementalNewlineDecoder(None, True)
- try:
- return newline_decoder.decode(source_bytes.decode(encoding[0]))
- except UnicodeDecodeError as exc:
- raise ImportError("Failed to decode source file",
+ except OSError as exc:
+ raise ImportError('source not available through get_data()',
name=fullname) from exc
+ return decode_source(source_bytes)
+
+ def source_to_code(self, data, path, *, _optimize=-1):
+ """Return the code object compiled from source.
+
+ The 'data' argument can be any object type that compile() supports.
+ """
+ return _call_with_frames_removed(compile, data, path, 'exec',
+ dont_inherit=True, optimize=_optimize)
def get_code(self, fullname):
"""Concrete implementation of InspectLoader.get_code.
@@ -946,45 +1001,34 @@ class SourceLoader(_LoaderBasics):
else:
try:
st = self.path_stats(source_path)
- except NotImplementedError:
+ except IOError:
pass
else:
source_mtime = int(st['mtime'])
try:
data = self.get_data(bytecode_path)
- except IOError:
+ except OSError:
pass
else:
try:
- bytes_data = self._bytes_from_bytecode(fullname, data,
- bytecode_path,
- st)
+ bytes_data = _validate_bytecode_header(data,
+ source_stats=st, name=fullname,
+ path=bytecode_path)
except (ImportError, EOFError):
pass
else:
_verbose_message('{} matches {}', bytecode_path,
source_path)
- found = marshal.loads(bytes_data)
- if isinstance(found, _code_type):
- _imp._fix_co_filename(found, source_path)
- _verbose_message('code object from {}',
- bytecode_path)
- return found
- else:
- msg = "Non-code object in {}"
- raise ImportError(msg.format(bytecode_path),
- name=fullname, path=bytecode_path)
+ return _compile_bytecode(bytes_data, name=fullname,
+ bytecode_path=bytecode_path,
+ source_path=source_path)
source_bytes = self.get_data(source_path)
- code_object = _call_with_frames_removed(compile,
- source_bytes, source_path, 'exec',
- dont_inherit=True)
+ code_object = self.source_to_code(source_bytes, source_path)
_verbose_message('code object from {}', source_path)
if (not sys.dont_write_bytecode and bytecode_path is not None and
- source_mtime is not None):
- data = bytearray(_MAGIC_BYTES)
- data.extend(_w_long(source_mtime))
- data.extend(_w_long(len(source_bytes)))
- data.extend(marshal.dumps(code_object))
+ source_mtime is not None):
+ data = _code_to_bytecode(code_object, source_mtime,
+ len(source_bytes))
try:
self._cache_bytecode(source_path, bytecode_path, data)
_verbose_message('wrote {!r}', bytecode_path)
@@ -992,16 +1036,6 @@ class SourceLoader(_LoaderBasics):
pass
return code_object
- def load_module(self, fullname):
- """Concrete implementation of Loader.load_module.
-
- Requires ExecutionLoader.get_filename and ResourceLoader.get_data to be
- implemented to load source code. Use of bytecode is dictated by whether
- get_code uses/writes bytecode.
-
- """
- return self._load_module(fullname)
-
class FileLoader:
@@ -1043,13 +1077,7 @@ class SourceFileLoader(FileLoader, SourceLoader):
def _cache_bytecode(self, source_path, bytecode_path, data):
# Adapt between the two APIs
- try:
- mode = _os.stat(source_path).st_mode
- except OSError:
- mode = 0o666
- # We always ensure write access so we can update cached files
- # later even when the source files are read-only on Windows (#6074)
- mode |= 0o200
+ mode = _calc_mode(source_path)
return self.set_data(bytecode_path, data, _mode=mode)
def set_data(self, path, data, *, _mode=0o666):
@@ -1085,20 +1113,15 @@ class SourcelessFileLoader(FileLoader, _LoaderBasics):
"""Loader which handles sourceless file imports."""
- def load_module(self, fullname):
- return self._load_module(fullname, sourceless=True)
+ def init_module_attrs(self, module):
+ super().init_module_attrs(module)
+ module.__cached__ = module.__file__
def get_code(self, fullname):
path = self.get_filename(fullname)
data = self.get_data(path)
- bytes_data = self._bytes_from_bytecode(fullname, data, path, None)
- found = marshal.loads(bytes_data)
- if isinstance(found, _code_type):
- _verbose_message('code object from {!r}', path)
- return found
- else:
- raise ImportError("Non-code object in {}".format(path),
- name=fullname, path=path)
+ bytes_data = _validate_bytecode_header(data, name=fullname, path=path)
+ return _compile_bytecode(bytes_data, name=fullname, bytecode_path=path)
def get_source(self, fullname):
"""Return None as there is no source code."""
@@ -1126,18 +1149,13 @@ class ExtensionFileLoader:
@set_loader
def load_module(self, fullname):
"""Load an extension module."""
- is_reload = fullname in sys.modules
- try:
+ with _ManageReload(fullname):
module = _call_with_frames_removed(_imp.load_dynamic,
fullname, self.path)
_verbose_message('extension module loaded from {!r}', self.path)
if self.is_package(fullname) and not hasattr(module, '__path__'):
module.__path__ = [_path_split(self.path)[0]]
return module
- except:
- if not is_reload and fullname in sys.modules:
- del sys.modules[fullname]
- raise
def is_package(self, fullname):
"""Return True if the extension module is a package."""
@@ -1200,7 +1218,7 @@ class _NamespacePath:
return len(self._recalculate())
def __repr__(self):
- return "_NamespacePath({!r})".format(self._path)
+ return '_NamespacePath({!r})'.format(self._path)
def __contains__(self, item):
return item in self._recalculate()
@@ -1215,14 +1233,28 @@ class NamespaceLoader:
@classmethod
def module_repr(cls, module):
- return "<module '{}' (namespace)>".format(module.__name__)
+ return '<module {!r} (namespace)>'.format(module.__name__)
+
+ def is_package(self, fullname):
+ return True
+
+ def get_source(self, fullname):
+ return ''
+
+ def get_code(self, fullname):
+ return compile('', '<string>', 'exec', dont_inherit=True)
- @module_for_loader
- def load_module(self, module):
+ def init_module_attrs(self, module):
+ module.__loader__ = self
+ module.__package__ = module.__name__
+
+ def load_module(self, fullname):
"""Load a namespace module."""
_verbose_message('namespace module loaded with path {!r}', self._path)
- module.__path__ = self._path
- return module
+ with module_to_load(fullname) as module:
+ self.init_module_attrs(module)
+ module.__path__ = self._path
+ return module
# Finders #####################################################################
@@ -1420,7 +1452,7 @@ class FileFinder:
lower_suffix_contents.add(new_name)
self._path_cache = lower_suffix_contents
if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS):
- self._relaxed_path_cache = set(fn.lower() for fn in contents)
+ self._relaxed_path_cache = {fn.lower() for fn in contents}
@classmethod
def path_hook(cls, *loader_details):
@@ -1435,13 +1467,13 @@ class FileFinder:
def path_hook_for_FileFinder(path):
"""Path hook for importlib.machinery.FileFinder."""
if not _path_isdir(path):
- raise ImportError("only directories are supported", path=path)
+ raise ImportError('only directories are supported', path=path)
return cls(path, *loader_details)
return path_hook_for_FileFinder
def __repr__(self):
- return "FileFinder(%r)" % (self.path,)
+ return 'FileFinder({!r})'.format(self.path)
# Import itself ###############################################################
@@ -1488,21 +1520,22 @@ def _find_module(name, path):
def _sanity_check(name, package, level):
"""Verify arguments are "sane"."""
if not isinstance(name, str):
- raise TypeError("module name must be str, not {}".format(type(name)))
+ raise TypeError('module name must be str, not {}'.format(type(name)))
if level < 0:
raise ValueError('level must be >= 0')
if package:
if not isinstance(package, str):
- raise TypeError("__package__ not set to a string")
+ raise TypeError('__package__ not set to a string')
elif package not in sys.modules:
- msg = ("Parent module {!r} not loaded, cannot perform relative "
- "import")
+ msg = ('Parent module {!r} not loaded, cannot perform relative '
+ 'import')
raise SystemError(msg.format(package))
if not name and level == 0:
- raise ValueError("Empty module name")
+ raise ValueError('Empty module name')
-_ERR_MSG = 'No module named {!r}'
+_ERR_MSG_PREFIX = 'No module named '
+_ERR_MSG = _ERR_MSG_PREFIX + '{!r}'
def _find_and_load_unlocked(name, import_):
path = None
@@ -1522,11 +1555,7 @@ def _find_and_load_unlocked(name, import_):
raise ImportError(msg, name=name)
loader = _find_module(name, path)
if loader is None:
- exc = ImportError(_ERR_MSG.format(name), name=name)
- # TODO(brett): switch to a proper ModuleNotFound exception in Python
- # 3.4.
- exc._not_found = True
- raise exc
+ raise ImportError(_ERR_MSG.format(name), name=name)
elif name not in sys.modules:
# The parent import may have already imported this module.
loader.load_module(name)
@@ -1546,7 +1575,7 @@ def _find_and_load_unlocked(name, import_):
except AttributeError:
pass
# Set loader if need be.
- if not hasattr(module, '__loader__'):
+ if getattr(module, '__loader__', None) is None:
try:
module.__loader__ = loader
except AttributeError:
@@ -1585,8 +1614,8 @@ def _gcd_import(name, package=None, level=0):
module = sys.modules[name]
if module is None:
_imp.release_lock()
- message = ("import of {} halted; "
- "None in sys.modules".format(name))
+ message = ('import of {} halted; '
+ 'None in sys.modules'.format(name))
raise ImportError(message, name=name)
_lock_unlock_module(name)
return module
@@ -1616,9 +1645,7 @@ def _handle_fromlist(module, fromlist, import_):
# Backwards-compatibility dictates we ignore failed
# imports triggered by fromlist for modules that don't
# exist.
- # TODO(brett): In Python 3.4, have import raise
- # ModuleNotFound and catch that.
- if getattr(exc, '_not_found', False):
+ if str(exc).startswith(_ERR_MSG_PREFIX):
if exc.name == from_name:
continue
raise
@@ -1707,7 +1734,7 @@ def _setup(sys_module, _imp_module):
module_type = type(sys)
for name, module in sys.modules.items():
if isinstance(module, module_type):
- if not hasattr(module, '__loader__'):
+ if getattr(module, '__loader__', None) is None:
if name in sys.builtin_module_names:
module.__loader__ = BuiltinImporter
elif _imp.is_frozen(name):
@@ -1721,7 +1748,7 @@ def _setup(sys_module, _imp_module):
builtin_module = sys.modules[builtin_name]
setattr(self_module, builtin_name, builtin_module)
- os_details = ('posix', ['/']), ('nt', ['\\', '/']), ('os2', ['\\', '/'])
+ os_details = ('posix', ['/']), ('nt', ['\\', '/'])
for builtin_os, path_separators in os_details:
# Assumption made in _path_join()
assert all(len(sep) == 1 for sep in path_separators)
@@ -1732,9 +1759,6 @@ def _setup(sys_module, _imp_module):
else:
try:
os_module = BuiltinImporter.load_module(builtin_os)
- # TODO: rip out os2 code after 3.3 is released as per PEP 11
- if builtin_os == 'os2' and 'EMX GCC' in sys.version:
- path_sep = path_separators[1]
break
except ImportError:
continue
@@ -1756,7 +1780,7 @@ def _setup(sys_module, _imp_module):
setattr(self_module, '_thread', thread_module)
setattr(self_module, '_weakref', weakref_module)
setattr(self_module, 'path_sep', path_sep)
- setattr(self_module, 'path_separators', set(path_separators))
+ setattr(self_module, 'path_separators', ''.join(path_separators))
# Constants
setattr(self_module, '_relax_case', _make_relax_case())
EXTENSION_SUFFIXES.extend(_imp.extension_suffixes())
diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
index 387567a..082796c 100644
--- a/Lib/importlib/abc.py
+++ b/Lib/importlib/abc.py
@@ -8,11 +8,6 @@ except ImportError as exc:
raise
_frozen_importlib = None
import abc
-import imp
-import marshal
-import sys
-import tokenize
-import warnings
def _register(abstract_cls, *classes):
@@ -37,9 +32,8 @@ class Finder(metaclass=abc.ABCMeta):
def find_module(self, fullname, path=None):
"""An abstract method that should find a module.
The fullname is a str and the optional path is a str or None.
- Returns a Loader object.
+ Returns a Loader object or None.
"""
- raise NotImplementedError
class MetaPathFinder(Finder):
@@ -49,16 +43,14 @@ class MetaPathFinder(Finder):
@abc.abstractmethod
def find_module(self, fullname, path):
"""Abstract method which, when implemented, should find a module.
- The fullname is a str and the path is a str or None.
- Returns a Loader object.
+ The fullname is a str and the path is a list of strings or None.
+ Returns a Loader object or None.
"""
- raise NotImplementedError
def invalidate_caches(self):
"""An optional method for clearing the finder's cache, if any.
This method is used by importlib.invalidate_caches().
"""
- return NotImplemented
_register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter,
machinery.PathFinder, machinery.WindowsRegistryFinder)
@@ -70,13 +62,14 @@ class PathEntryFinder(Finder):
@abc.abstractmethod
def find_loader(self, fullname):
- """Abstract method which, when implemented, returns a module loader.
+ """Abstract method which, when implemented, returns a module loader or
+ a possible part of a namespace.
The fullname is a str. Returns a 2-tuple of (Loader, portion) where
portion is a sequence of file system locations contributing to part of
- a namespace package. The sequence may be empty and the loader may be
+ a namespace package. The sequence may be empty and the loader may be
None.
"""
- raise NotImplementedError
+ return None, []
find_module = _bootstrap._find_module_shim
@@ -84,27 +77,41 @@ class PathEntryFinder(Finder):
"""An optional method for clearing the finder's cache, if any.
This method is used by PathFinder.invalidate_caches().
"""
- return NotImplemented
_register(PathEntryFinder, machinery.FileFinder)
class Loader(metaclass=abc.ABCMeta):
- """Abstract base class for import loaders."""
+ """Abstract base class for import loaders.
+
+ The optional method module_repr(module) may be defined to provide a
+ repr for a module when appropriate (see PEP 420). The __repr__() method on
+ the module type will use the method as appropriate.
+
+ """
@abc.abstractmethod
def load_module(self, fullname):
"""Abstract method which when implemented should load a module.
- The fullname is a str."""
- raise NotImplementedError
+ The fullname is a str.
+
+ ImportError is raised on failure.
+ """
+ raise ImportError
- @abc.abstractmethod
def module_repr(self, module):
- """Abstract method which when implemented calculates and returns the
- given module's repr."""
+ """Return a module's repr.
+
+ Used by the module type when the method does not raise
+ NotImplementedError.
+ """
raise NotImplementedError
+ def init_module_attrs(self, module):
+ """Set the module's __loader__ attribute."""
+ module.__loader__ = self
+
class ResourceLoader(Loader):
@@ -119,7 +126,7 @@ class ResourceLoader(Loader):
def get_data(self, path):
"""Abstract method which when implemented should return the bytes for
the specified path. The path must be a str."""
- raise NotImplementedError
+ raise IOError
class InspectLoader(Loader):
@@ -134,23 +141,54 @@ class InspectLoader(Loader):
@abc.abstractmethod
def is_package(self, fullname):
"""Abstract method which when implemented should return whether the
- module is a package. The fullname is a str. Returns a bool."""
- raise NotImplementedError
+ module is a package. The fullname is a str. Returns a bool.
+
+ Raises ImportError is the module cannot be found.
+ """
+ raise ImportError
- @abc.abstractmethod
def get_code(self, fullname):
- """Abstract method which when implemented should return the code object
- for the module. The fullname is a str. Returns a types.CodeType."""
- raise NotImplementedError
+ """Method which returns the code object for the module.
+
+ The fullname is a str. Returns a types.CodeType if possible, else
+ returns None if a code object does not make sense
+ (e.g. built-in module). Raises ImportError if the module cannot be
+ found.
+ """
+ source = self.get_source(fullname)
+ if source is None:
+ return None
+ return self.source_to_code(source)
@abc.abstractmethod
def get_source(self, fullname):
"""Abstract method which should return the source code for the
- module. The fullname is a str. Returns a str."""
- raise NotImplementedError
+ module. The fullname is a str. Returns a str.
+
+ Raises ImportError if the module cannot be found.
+ """
+ raise ImportError
+
+ def source_to_code(self, data, path='<string>'):
+ """Compile 'data' into a code object.
+
+ The 'data' argument can be anything that compile() can handle. The'path'
+ argument should be where the data was retrieved (when applicable)."""
+ return compile(data, path, 'exec', dont_inherit=True)
+
+ def init_module_attrs(self, module):
+ """Initialize the __loader__ and __package__ attributes of the module.
+
+ The name of the module is gleaned from module.__name__. The __package__
+ attribute is set based on self.is_package().
+ """
+ super().init_module_attrs(module)
+ _bootstrap._init_package_attrs(self, module)
+
+ load_module = _bootstrap._LoaderBasics.load_module
_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
- machinery.ExtensionFileLoader)
+ machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader)
class ExecutionLoader(InspectLoader):
@@ -165,8 +203,39 @@ class ExecutionLoader(InspectLoader):
@abc.abstractmethod
def get_filename(self, fullname):
"""Abstract method which should return the value that __file__ is to be
- set to."""
- raise NotImplementedError
+ set to.
+
+ Raises ImportError if the module cannot be found.
+ """
+ raise ImportError
+
+ def get_code(self, fullname):
+ """Method to return the code object for fullname.
+
+ Should return None if not applicable (e.g. built-in module).
+ Raise ImportError if the module cannot be found.
+ """
+ source = self.get_source(fullname)
+ if source is None:
+ return None
+ try:
+ path = self.get_filename(fullname)
+ except ImportError:
+ return self.source_to_code(source)
+ else:
+ return self.source_to_code(source, path)
+
+ def init_module_attrs(self, module):
+ """Initialize the module's attributes.
+
+ It is assumed that the module's name has been set on module.__name__.
+ It is also assumed that any path returned by self.get_filename() uses
+ (one of) the operating system's path separator(s) to separate filenames
+ from directories in order to set __path__ intelligently.
+ InspectLoader.init_module_attrs() sets __loader__ and __package__.
+ """
+ super().init_module_attrs(module)
+ _bootstrap._init_file_attrs(self, module)
class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader):
@@ -198,7 +267,7 @@ class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader):
def path_mtime(self, path):
"""Return the (int) modification time for the path (str)."""
if self.path_stats.__func__ is SourceLoader.path_stats:
- raise NotImplementedError
+ raise IOError
return int(self.path_stats(path)['mtime'])
def path_stats(self, path):
@@ -209,7 +278,7 @@ class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader):
- 'size' (optional) is the size in bytes of the source code.
"""
if self.path_mtime.__func__ is SourceLoader.path_mtime:
- raise NotImplementedError
+ raise IOError
return {'mtime': self.path_mtime(path)}
def set_data(self, path, data):
@@ -220,185 +289,6 @@ class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader):
Any needed intermediary directories are to be created. If for some
reason the file cannot be written because of permissions, fail
silently.
-
"""
- raise NotImplementedError
_register(SourceLoader, machinery.SourceFileLoader)
-
-class PyLoader(SourceLoader):
-
- """Implement the deprecated PyLoader ABC in terms of SourceLoader.
-
- This class has been deprecated! It is slated for removal in Python 3.4.
- If compatibility with Python 3.1 is not needed then implement the
- SourceLoader ABC instead of this class. If Python 3.1 compatibility is
- needed, then use the following idiom to have a single class that is
- compatible with Python 3.1 onwards::
-
- try:
- from importlib.abc import SourceLoader
- except ImportError:
- from importlib.abc import PyLoader as SourceLoader
-
-
- class CustomLoader(SourceLoader):
- def get_filename(self, fullname):
- # Implement ...
-
- def source_path(self, fullname):
- '''Implement source_path in terms of get_filename.'''
- try:
- return self.get_filename(fullname)
- except ImportError:
- return None
-
- def is_package(self, fullname):
- filename = os.path.basename(self.get_filename(fullname))
- return os.path.splitext(filename)[0] == '__init__'
-
- """
-
- @abc.abstractmethod
- def is_package(self, fullname):
- raise NotImplementedError
-
- @abc.abstractmethod
- def source_path(self, fullname):
- """Abstract method. Accepts a str module name and returns the path to
- the source code for the module."""
- raise NotImplementedError
-
- def get_filename(self, fullname):
- """Implement get_filename in terms of source_path.
-
- As get_filename should only return a source file path there is no
- chance of the path not existing but loading still being possible, so
- ImportError should propagate instead of being turned into returning
- None.
-
- """
- warnings.warn("importlib.abc.PyLoader is deprecated and is "
- "slated for removal in Python 3.4; "
- "use SourceLoader instead. "
- "See the importlib documentation on how to be "
- "compatible with Python 3.1 onwards.",
- DeprecationWarning)
- path = self.source_path(fullname)
- if path is None:
- raise ImportError(name=fullname)
- else:
- return path
-
-
-class PyPycLoader(PyLoader):
-
- """Abstract base class to assist in loading source and bytecode by
- requiring only back-end storage methods to be implemented.
-
- This class has been deprecated! Removal is slated for Python 3.4. Implement
- the SourceLoader ABC instead. If Python 3.1 compatibility is needed, see
- PyLoader.
-
- The methods get_code, get_source, and load_module are implemented for the
- user.
-
- """
-
- def get_filename(self, fullname):
- """Return the source or bytecode file path."""
- path = self.source_path(fullname)
- if path is not None:
- return path
- path = self.bytecode_path(fullname)
- if path is not None:
- return path
- raise ImportError("no source or bytecode path available for "
- "{0!r}".format(fullname), name=fullname)
-
- def get_code(self, fullname):
- """Get a code object from source or bytecode."""
- warnings.warn("importlib.abc.PyPycLoader is deprecated and slated for "
- "removal in Python 3.4; use SourceLoader instead. "
- "If Python 3.1 compatibility is required, see the "
- "latest documentation for PyLoader.",
- DeprecationWarning)
- source_timestamp = self.source_mtime(fullname)
- # Try to use bytecode if it is available.
- bytecode_path = self.bytecode_path(fullname)
- if bytecode_path:
- data = self.get_data(bytecode_path)
- try:
- magic = data[:4]
- if len(magic) < 4:
- raise ImportError(
- "bad magic number in {}".format(fullname),
- name=fullname, path=bytecode_path)
- raw_timestamp = data[4:8]
- if len(raw_timestamp) < 4:
- raise EOFError("bad timestamp in {}".format(fullname))
- pyc_timestamp = _bootstrap._r_long(raw_timestamp)
- raw_source_size = data[8:12]
- if len(raw_source_size) != 4:
- raise EOFError("bad file size in {}".format(fullname))
- # Source size is unused as the ABC does not provide a way to
- # get the size of the source ahead of reading it.
- bytecode = data[12:]
- # Verify that the magic number is valid.
- if imp.get_magic() != magic:
- raise ImportError(
- "bad magic number in {}".format(fullname),
- name=fullname, path=bytecode_path)
- # Verify that the bytecode is not stale (only matters when
- # there is source to fall back on.
- if source_timestamp:
- if pyc_timestamp < source_timestamp:
- raise ImportError("bytecode is stale", name=fullname,
- path=bytecode_path)
- except (ImportError, EOFError):
- # If source is available give it a shot.
- if source_timestamp is not None:
- pass
- else:
- raise
- else:
- # Bytecode seems fine, so try to use it.
- return marshal.loads(bytecode)
- elif source_timestamp is None:
- raise ImportError("no source or bytecode available to create code "
- "object for {0!r}".format(fullname),
- name=fullname)
- # Use the source.
- source_path = self.source_path(fullname)
- if source_path is None:
- message = "a source path must exist to load {0}".format(fullname)
- raise ImportError(message, name=fullname)
- source = self.get_data(source_path)
- code_object = compile(source, source_path, 'exec', dont_inherit=True)
- # Generate bytecode and write it out.
- if not sys.dont_write_bytecode:
- data = bytearray(imp.get_magic())
- data.extend(_bootstrap._w_long(source_timestamp))
- data.extend(_bootstrap._w_long(len(source) & 0xFFFFFFFF))
- data.extend(marshal.dumps(code_object))
- self.write_bytecode(fullname, data)
- return code_object
-
- @abc.abstractmethod
- def source_mtime(self, fullname):
- """Abstract method. Accepts a str filename and returns an int
- modification time for the source of the module."""
- raise NotImplementedError
-
- @abc.abstractmethod
- def bytecode_path(self, fullname):
- """Abstract method. Accepts a str filename and returns the str pathname
- to the bytecode for the module."""
- raise NotImplementedError
-
- @abc.abstractmethod
- def write_bytecode(self, fullname, bytecode):
- """Abstract method. Accepts a str filename and bytes object
- representing the bytecode for the module. Returns a boolean
- representing whether the bytecode was written or not."""
- raise NotImplementedError
diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py
index 1316437..7727f9d 100644
--- a/Lib/importlib/util.py
+++ b/Lib/importlib/util.py
@@ -1,10 +1,17 @@
"""Utility code for constructing importers, etc."""
-from ._bootstrap import module_for_loader
+from ._bootstrap import MAGIC_NUMBER
+from ._bootstrap import cache_from_source
+from ._bootstrap import decode_source
+from ._bootstrap import module_to_load
from ._bootstrap import set_loader
from ._bootstrap import set_package
+from ._bootstrap import source_from_cache
from ._bootstrap import _resolve_name
+import functools
+import warnings
+
def resolve_name(name, package):
"""Resolve a relative module name to an absolute one."""
@@ -19,3 +26,44 @@ def resolve_name(name, package):
break
level += 1
return _resolve_name(name[level:], package, level)
+
+
+def module_for_loader(fxn):
+ """Decorator to handle selecting the proper module for loaders.
+
+ The decorated function is passed the module to use instead of the module
+ name. The module passed in to the function is either from sys.modules if
+ it already exists or is a new module. If the module is new, then __name__
+ is set the first argument to the method, __loader__ is set to self, and
+ __package__ is set accordingly (if self.is_package() is defined) will be set
+ before it is passed to the decorated function (if self.is_package() does
+ not work for the module it will be set post-load).
+
+ If an exception is raised and the decorator created the module it is
+ subsequently removed from sys.modules.
+
+ The decorator assumes that the decorated function takes the module name as
+ the second argument.
+
+ """
+ warnings.warn('To make it easier for subclasses, please use '
+ 'importlib.util.module_to_load() and '
+ 'importlib.abc.Loader.init_module_attrs()',
+ PendingDeprecationWarning, stacklevel=2)
+ @functools.wraps(fxn)
+ def module_for_loader_wrapper(self, fullname, *args, **kwargs):
+ with module_to_load(fullname) as module:
+ module.__loader__ = self
+ try:
+ is_package = self.is_package(fullname)
+ except (ImportError, AttributeError):
+ pass
+ else:
+ if is_package:
+ module.__package__ = fullname
+ else:
+ module.__package__ = fullname.rpartition('.')[0]
+ # If __package__ was not set above, __import__() will do it later.
+ return fxn(self, module, *args, **kwargs)
+
+ return module_for_loader_wrapper
diff --git a/Lib/inspect.py b/Lib/inspect.py
index c7e7ef5..bebeba2 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -31,7 +31,6 @@ Here are some of the useful functions provided by this module:
__author__ = ('Ka-Ping Yee <ping@lfw.org>',
'Yury Selivanov <yselivanov@sprymix.com>')
-import imp
import importlib.machinery
import itertools
import linecache
@@ -361,6 +360,40 @@ def getmro(cls):
"Return tuple of base classes (including cls) in method resolution order."
return cls.__mro__
+# -------------------------------------------------------- function helpers
+
+def unwrap(func, *, stop=None):
+ """Get the object wrapped by *func*.
+
+ Follows the chain of :attr:`__wrapped__` attributes returning the last
+ object in the chain.
+
+ *stop* is an optional callback accepting an object in the wrapper chain
+ as its sole argument that allows the unwrapping to be terminated early if
+ the callback returns a true value. If the callback never returns a true
+ value, the last object in the chain is returned as usual. For example,
+ :func:`signature` uses this to stop unwrapping if any object in the
+ chain has a ``__signature__`` attribute defined.
+
+ :exc:`ValueError` is raised if a cycle is encountered.
+
+ """
+ if stop is None:
+ def _is_wrapper(f):
+ return hasattr(f, '__wrapped__')
+ else:
+ def _is_wrapper(f):
+ return hasattr(f, '__wrapped__') and not stop(f)
+ f = func # remember the original func for error reporting
+ memo = {id(f)} # Memoise by id to tolerate non-hashable objects
+ while _is_wrapper(func):
+ func = func.__wrapped__
+ id_func = id(func)
+ if id_func in memo:
+ raise ValueError('wrapper loop when unwrapping {!r}'.format(f))
+ memo.add(id_func)
+ return func
+
# -------------------------------------------------- source code extraction
def indentsize(line):
"""Return the indent size, in spaces, at the start of a line of text."""
@@ -440,6 +473,9 @@ def getmoduleinfo(path):
"""Get the module name, suffix, mode, and module type for a given file."""
warnings.warn('inspect.getmoduleinfo() is deprecated', DeprecationWarning,
2)
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore', PendingDeprecationWarning)
+ import imp
filename = os.path.basename(path)
suffixes = [(-len(suffix), suffix, mode, mtype)
for suffix, mode, mtype in imp.get_suffixes()]
@@ -476,7 +512,7 @@ def getsourcefile(object):
if os.path.exists(filename):
return filename
# only return a non-existent filename if the module has a PEP 302 loader
- if hasattr(getmodule(object, filename), '__loader__'):
+ if getattr(getmodule(object, filename), '__loader__', None) is not None:
return filename
# or it is in the linecache
if filename in linecache.cache:
@@ -545,13 +581,13 @@ def findsource(object):
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a list of all the lines
- in the file and the line number indexes a line in that list. An IOError
+ in the file and the line number indexes a line in that list. An OSError
is raised if the source code cannot be retrieved."""
file = getfile(object)
sourcefile = getsourcefile(object)
if not sourcefile and file[:1] + file[-1:] != '<>':
- raise IOError('source code not available')
+ raise OSError('source code not available')
file = sourcefile if sourcefile else file
module = getmodule(object, file)
@@ -560,7 +596,7 @@ def findsource(object):
else:
lines = linecache.getlines(file)
if not lines:
- raise IOError('could not get source code')
+ raise OSError('could not get source code')
if ismodule(object):
return lines, 0
@@ -586,7 +622,7 @@ def findsource(object):
candidates.sort()
return lines, candidates[0][1]
else:
- raise IOError('could not find class definition')
+ raise OSError('could not find class definition')
if ismethod(object):
object = object.__func__
@@ -598,14 +634,14 @@ def findsource(object):
object = object.f_code
if iscode(object):
if not hasattr(object, 'co_firstlineno'):
- raise IOError('could not find function definition')
+ raise OSError('could not find function definition')
lnum = object.co_firstlineno - 1
pat = re.compile(r'^(\s*def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)')
while lnum > 0:
if pat.match(lines[lnum]): break
lnum = lnum - 1
return lines, lnum
- raise IOError('could not find code object')
+ raise OSError('could not find code object')
def getcomments(object):
"""Get lines of comments immediately preceding an object's source code.
@@ -614,7 +650,7 @@ def getcomments(object):
"""
try:
lines, lnum = findsource(object)
- except (IOError, TypeError):
+ except (OSError, TypeError):
return None
if ismodule(object):
@@ -710,7 +746,7 @@ def getsourcelines(object):
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a list of the lines
corresponding to the object and the line number indicates where in the
- original source file the first line of code was found. An IOError is
+ original source file the first line of code was found. An OSError is
raised if the source code cannot be retrieved."""
lines, lnum = findsource(object)
@@ -722,7 +758,7 @@ def getsource(object):
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a single string. An
- IOError is raised if the source code cannot be retrieved."""
+ OSError is raised if the source code cannot be retrieved."""
lines, lnum = getsourcelines(object)
return ''.join(lines)
@@ -1122,7 +1158,7 @@ def getframeinfo(frame, context=1):
start = lineno - 1 - context//2
try:
lines, lnum = findsource(frame)
- except IOError:
+ except OSError:
lines = index = None
else:
start = max(start, 1)
@@ -1344,6 +1380,9 @@ def signature(obj):
sig = signature(obj.__func__)
return sig.replace(parameters=tuple(sig.parameters.values())[1:])
+ # Was this function wrapped by a decorator?
+ obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")))
+
try:
sig = obj.__signature__
except AttributeError:
@@ -1352,13 +1391,6 @@ def signature(obj):
if sig is not None:
return sig
- try:
- # Was this function wrapped by a decorator?
- wrapped = obj.__wrapped__
- except AttributeError:
- pass
- else:
- return signature(wrapped)
if isinstance(obj, types.FunctionType):
return Signature.from_function(obj)
diff --git a/Lib/io.py b/Lib/io.py
index bda4def..39878b8 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -4,7 +4,7 @@ builtin open function is defined in this module.
At the top of the I/O hierarchy is the abstract base class IOBase. It
defines the basic interface to a stream. Note, however, that there is no
separation between reading and writing to streams; implementations are
-allowed to raise an IOError if they do not support a given operation.
+allowed to raise an OSError if they do not support a given operation.
Extending IOBase is RawIOBase which deals simply with the reading and
writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide
diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py
index 48a4f8f..3f95cc3 100644
--- a/Lib/json/__init__.py
+++ b/Lib/json/__init__.py
@@ -39,8 +39,7 @@ Compact encoding::
Pretty printing::
>>> import json
- >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True,
- ... indent=4, separators=(',', ': ')))
+ >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
@@ -146,13 +145,12 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
If ``indent`` is a non-negative integer, then JSON array elements and
object members will be pretty-printed with that indent level. An indent
level of 0 will only insert newlines. ``None`` is the most compact
- representation. Since the default item separator is ``', '``, the
- output might include trailing whitespace when ``indent`` is specified.
- You can use ``separators=(',', ': ')`` to avoid this.
+ representation.
- If ``separators`` is an ``(item_separator, dict_separator)`` tuple
- then it will be used instead of the default ``(', ', ': ')`` separators.
- ``(',', ':')`` is the most compact JSON representation.
+ If specified, ``separators`` should be an ``(item_separator, key_separator)``
+ tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and
+ ``(',', ': ')`` otherwise. To get the most compact JSON representation,
+ you should specify ``(',', ':')`` to eliminate whitespace.
``default(obj)`` is a function that should return a serializable version
of obj or raise TypeError. The default simply raises TypeError.
@@ -209,13 +207,12 @@ def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
If ``indent`` is a non-negative integer, then JSON array elements and
object members will be pretty-printed with that indent level. An indent
level of 0 will only insert newlines. ``None`` is the most compact
- representation. Since the default item separator is ``', '``, the
- output might include trailing whitespace when ``indent`` is specified.
- You can use ``separators=(',', ': ')`` to avoid this.
+ representation.
- If ``separators`` is an ``(item_separator, dict_separator)`` tuple
- then it will be used instead of the default ``(', ', ': ')`` separators.
- ``(',', ':')`` is the most compact JSON representation.
+ If specified, ``separators`` should be an ``(item_separator, key_separator)``
+ tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and
+ ``(',', ': ')`` otherwise. To get the most compact JSON representation,
+ you should specify ``(',', ':')`` to eliminate whitespace.
``default(obj)`` is a function that should return a serializable version
of obj or raise TypeError. The default simply raises TypeError.
diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py
index 51c3aa7..da7ef9c 100644
--- a/Lib/json/decoder.py
+++ b/Lib/json/decoder.py
@@ -1,9 +1,6 @@
"""Implementation of JSONDecoder
"""
-import binascii
import re
-import sys
-import struct
from json import scanner
try:
@@ -15,14 +12,9 @@ __all__ = ['JSONDecoder']
FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
-def _floatconstants():
- _BYTES = binascii.unhexlify(b'7FF80000000000007FF0000000000000')
- if sys.byteorder != 'big':
- _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
- nan, inf = struct.unpack('dd', _BYTES)
- return nan, inf, -inf
-
-NaN, PosInf, NegInf = _floatconstants()
+NaN = float('nan')
+PosInf = float('inf')
+NegInf = float('-inf')
def linecol(doc, pos):
@@ -196,8 +188,8 @@ def JSONObject(s_and_end, strict, scan_once, object_hook, object_pairs_hook,
try:
value, end = scan_once(s, end)
- except StopIteration:
- raise ValueError(errmsg("Expecting object", s, end))
+ except StopIteration as err:
+ raise ValueError(errmsg("Expecting value", s, err.value)) from None
pairs_append((key, value))
try:
nextchar = s[end]
@@ -240,8 +232,8 @@ def JSONArray(s_and_end, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
while True:
try:
value, end = scan_once(s, end)
- except StopIteration:
- raise ValueError(errmsg("Expecting object", s, end))
+ except StopIteration as err:
+ raise ValueError(errmsg("Expecting value", s, err.value)) from None
_append(value)
nextchar = s[end:end + 1]
if nextchar in _ws:
@@ -251,7 +243,7 @@ def JSONArray(s_and_end, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
if nextchar == ']':
break
elif nextchar != ',':
- raise ValueError(errmsg("Expecting ',' delimiter", s, end))
+ raise ValueError(errmsg("Expecting ',' delimiter", s, end - 1))
try:
if s[end] in _ws:
end += 1
@@ -366,6 +358,6 @@ class JSONDecoder(object):
"""
try:
obj, end = self.scan_once(s, idx)
- except StopIteration:
- raise ValueError("No JSON object could be decoded")
+ except StopIteration as err:
+ raise ValueError(errmsg("Expecting value", s, err.value)) from None
return obj, end
diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py
index 1d8b20c..0513838 100644
--- a/Lib/json/encoder.py
+++ b/Lib/json/encoder.py
@@ -125,14 +125,12 @@ class JSONEncoder(object):
If indent is a non-negative integer, then JSON array
elements and object members will be pretty-printed with that
indent level. An indent level of 0 will only insert newlines.
- None is the most compact representation. Since the default
- item separator is ', ', the output might include trailing
- whitespace when indent is specified. You can use
- separators=(',', ': ') to avoid this.
+ None is the most compact representation.
- If specified, separators should be a (item_separator, key_separator)
- tuple. The default is (', ', ': '). To get the most compact JSON
- representation you should specify (',', ':') to eliminate whitespace.
+ If specified, separators should be an (item_separator, key_separator)
+ tuple. The default is (', ', ': ') if *indent* is ``None`` and
+ (',', ': ') otherwise. To get the most compact JSON representation,
+ you should specify (',', ':') to eliminate whitespace.
If specified, default is a function that gets called for objects
that can't otherwise be serialized. It should return a JSON encodable
@@ -148,6 +146,8 @@ class JSONEncoder(object):
self.indent = indent
if separators is not None:
self.item_separator, self.key_separator = separators
+ elif indent is not None:
+ self.item_separator = ','
if default is not None:
self.default = default
@@ -175,6 +175,7 @@ class JSONEncoder(object):
def encode(self, o):
"""Return a JSON string representation of a Python data structure.
+ >>> from json.encoder import JSONEncoder
>>> JSONEncoder().encode({"foo": ["bar", "baz"]})
'{"foo": ["bar", "baz"]}'
@@ -298,9 +299,13 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif value is False:
yield buf + 'false'
elif isinstance(value, int):
- yield buf + str(value)
+ # Subclasses of int/float may override __str__, but we still
+ # want to encode them as integers/floats in JSON. One example
+ # within the standard library is IntEnum.
+ yield buf + str(int(value))
elif isinstance(value, float):
- yield buf + _floatstr(value)
+ # see comment above for int
+ yield buf + _floatstr(float(value))
else:
yield buf
if isinstance(value, (list, tuple)):
@@ -309,8 +314,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
chunks = _iterencode_dict(value, _current_indent_level)
else:
chunks = _iterencode(value, _current_indent_level)
- for chunk in chunks:
- yield chunk
+ yield from chunks
if newline_indent is not None:
_current_indent_level -= 1
yield '\n' + _indent * _current_indent_level
@@ -347,7 +351,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
# JavaScript is weakly typed for these, so it makes sense to
# also allow them. Many encoders seem to do something like this.
elif isinstance(key, float):
- key = _floatstr(key)
+ # see comment for int/float in _make_iterencode
+ key = _floatstr(float(key))
elif key is True:
key = 'true'
elif key is False:
@@ -355,7 +360,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif key is None:
key = 'null'
elif isinstance(key, int):
- key = str(key)
+ # see comment for int/float in _make_iterencode
+ key = str(int(key))
elif _skipkeys:
continue
else:
@@ -375,9 +381,11 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif value is False:
yield 'false'
elif isinstance(value, int):
- yield str(value)
+ # see comment for int/float in _make_iterencode
+ yield str(int(value))
elif isinstance(value, float):
- yield _floatstr(value)
+ # see comment for int/float in _make_iterencode
+ yield _floatstr(float(value))
else:
if isinstance(value, (list, tuple)):
chunks = _iterencode_list(value, _current_indent_level)
@@ -385,8 +393,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
chunks = _iterencode_dict(value, _current_indent_level)
else:
chunks = _iterencode(value, _current_indent_level)
- for chunk in chunks:
- yield chunk
+ yield from chunks
if newline_indent is not None:
_current_indent_level -= 1
yield '\n' + _indent * _current_indent_level
@@ -404,15 +411,15 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif o is False:
yield 'false'
elif isinstance(o, int):
- yield str(o)
+ # see comment for int/float in _make_iterencode
+ yield str(int(o))
elif isinstance(o, float):
- yield _floatstr(o)
+ # see comment for int/float in _make_iterencode
+ yield _floatstr(float(o))
elif isinstance(o, (list, tuple)):
- for chunk in _iterencode_list(o, _current_indent_level):
- yield chunk
+ yield from _iterencode_list(o, _current_indent_level)
elif isinstance(o, dict):
- for chunk in _iterencode_dict(o, _current_indent_level):
- yield chunk
+ yield from _iterencode_dict(o, _current_indent_level)
else:
if markers is not None:
markerid = id(o)
@@ -420,8 +427,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
raise ValueError("Circular reference detected")
markers[markerid] = o
o = _default(o)
- for chunk in _iterencode(o, _current_indent_level):
- yield chunk
+ yield from _iterencode(o, _current_indent_level)
if markers is not None:
del markers[markerid]
return _iterencode
diff --git a/Lib/json/scanner.py b/Lib/json/scanner.py
index 23eef61..86426cd 100644
--- a/Lib/json/scanner.py
+++ b/Lib/json/scanner.py
@@ -29,7 +29,7 @@ def py_make_scanner(context):
try:
nextchar = string[idx]
except IndexError:
- raise StopIteration
+ raise StopIteration(idx)
if nextchar == '"':
return parse_string(string, idx + 1, strict)
@@ -60,7 +60,7 @@ def py_make_scanner(context):
elif nextchar == '-' and string[idx:idx + 9] == '-Infinity':
return parse_constant('-Infinity'), idx + 9
else:
- raise StopIteration
+ raise StopIteration(idx)
def scan_once(string, idx):
try:
diff --git a/Lib/json/tool.py b/Lib/json/tool.py
index ecf9c47..7db4528 100644
--- a/Lib/json/tool.py
+++ b/Lib/json/tool.py
@@ -31,8 +31,7 @@ def main():
except ValueError as e:
raise SystemExit(e)
with outfile:
- json.dump(obj, outfile, sort_keys=True,
- indent=4, separators=(',', ': '))
+ json.dump(obj, outfile, sort_keys=True, indent=4)
outfile.write('\n')
diff --git a/Lib/keyword.py b/Lib/keyword.py
index dad39cc..6e1e882 100755
--- a/Lib/keyword.py
+++ b/Lib/keyword.py
@@ -60,6 +60,12 @@ def main():
if len(args) > 1: optfile = args[1]
else: optfile = "Lib/keyword.py"
+ # load the output skeleton from the target, taking care to preserve its
+ # newline convention.
+ with open(optfile, newline='') as fp:
+ format = fp.readlines()
+ nl = format[0][len(format[0].strip()):] if format else '\n'
+
# scan the source file for keywords
with open(iptfile) as fp:
strprog = re.compile('"([^"]+)"')
@@ -68,26 +74,21 @@ def main():
if '{1, "' in line:
match = strprog.search(line)
if match:
- lines.append(" '" + match.group(1) + "',\n")
+ lines.append(" '" + match.group(1) + "'," + nl)
lines.sort()
- # load the output skeleton from the target
- with open(optfile) as fp:
- format = fp.readlines()
-
- # insert the lines of keywords
+ # insert the lines of keywords into the skeleton
try:
- start = format.index("#--start keywords--\n") + 1
- end = format.index("#--end keywords--\n")
+ start = format.index("#--start keywords--" + nl) + 1
+ end = format.index("#--end keywords--" + nl)
format[start:end] = lines
except ValueError:
sys.stderr.write("target does not contain format markers\n")
sys.exit(1)
# write the output file
- fp = open(optfile, 'w')
- fp.write(''.join(format))
- fp.close()
+ with open(optfile, 'w', newline='') as fp:
+ fp.writelines(format)
if __name__ == "__main__":
main()
diff --git a/Lib/lib2to3/btm_utils.py b/Lib/lib2to3/btm_utils.py
index 2276dc9..339750e 100644
--- a/Lib/lib2to3/btm_utils.py
+++ b/Lib/lib2to3/btm_utils.py
@@ -96,8 +96,7 @@ class MinNode(object):
def leaves(self):
"Generator that returns the leaves of the tree"
for child in self.children:
- for x in child.leaves():
- yield x
+ yield from child.leaves()
if not self.children:
yield self
@@ -277,7 +276,6 @@ def rec_test(sequence, test_func):
sub-iterables"""
for x in sequence:
if isinstance(x, (list, tuple)):
- for y in rec_test(x, test_func):
- yield y
+ yield from rec_test(x, test_func)
else:
yield test_func(x)
diff --git a/Lib/lib2to3/fixer_util.py b/Lib/lib2to3/fixer_util.py
index 60d219f..6e259c5 100644
--- a/Lib/lib2to3/fixer_util.py
+++ b/Lib/lib2to3/fixer_util.py
@@ -129,6 +129,29 @@ def FromImport(package_name, name_leafs):
imp = Node(syms.import_from, children)
return imp
+def ImportAndCall(node, results, names):
+ """Returns an import statement and calls a method
+ of the module:
+
+ import module
+ module.name()"""
+ obj = results["obj"].clone()
+ if obj.type == syms.arglist:
+ newarglist = obj.clone()
+ else:
+ newarglist = Node(syms.arglist, [obj.clone()])
+ after = results["after"]
+ if after:
+ after = [n.clone() for n in after]
+ new = Node(syms.power,
+ Attr(Name(names[0]), Name(names[1])) +
+ [Node(syms.trailer,
+ [results["lpar"].clone(),
+ newarglist,
+ results["rpar"].clone()])] + after)
+ new.prefix = node.prefix
+ return new
+
###########################################################
### Determine whether a node represents a given literal
diff --git a/Lib/lib2to3/fixes/fix_intern.py b/Lib/lib2to3/fixes/fix_intern.py
index 6be11cd..fb2973c 100644
--- a/Lib/lib2to3/fixes/fix_intern.py
+++ b/Lib/lib2to3/fixes/fix_intern.py
@@ -6,9 +6,8 @@
intern(s) -> sys.intern(s)"""
# Local imports
-from .. import pytree
from .. import fixer_base
-from ..fixer_util import Name, Attr, touch_import
+from ..fixer_util import ImportAndCall, touch_import
class FixIntern(fixer_base.BaseFix):
@@ -26,21 +25,7 @@ class FixIntern(fixer_base.BaseFix):
"""
def transform(self, node, results):
- syms = self.syms
- obj = results["obj"].clone()
- if obj.type == syms.arglist:
- newarglist = obj.clone()
- else:
- newarglist = pytree.Node(syms.arglist, [obj.clone()])
- after = results["after"]
- if after:
- after = [n.clone() for n in after]
- new = pytree.Node(syms.power,
- Attr(Name("sys"), Name("intern")) +
- [pytree.Node(syms.trailer,
- [results["lpar"].clone(),
- newarglist,
- results["rpar"].clone()])] + after)
- new.prefix = node.prefix
+ names = ('sys', 'intern')
+ new = ImportAndCall(node, results, names)
touch_import(None, 'sys', node)
return new
diff --git a/Lib/lib2to3/fixes/fix_reload.py b/Lib/lib2to3/fixes/fix_reload.py
new file mode 100644
index 0000000..1855357
--- /dev/null
+++ b/Lib/lib2to3/fixes/fix_reload.py
@@ -0,0 +1,28 @@
+"""Fixer for reload().
+
+reload(s) -> imp.reload(s)"""
+
+# Local imports
+from .. import fixer_base
+from ..fixer_util import ImportAndCall, touch_import
+
+
+class FixReload(fixer_base.BaseFix):
+ BM_compatible = True
+ order = "pre"
+
+ PATTERN = """
+ power< 'reload'
+ trailer< lpar='('
+ ( not(arglist | argument<any '=' any>) obj=any
+ | obj=arglist<(not argument<any '=' any>) any ','> )
+ rpar=')' >
+ after=any*
+ >
+ """
+
+ def transform(self, node, results):
+ names = ('imp', 'reload')
+ new = ImportAndCall(node, results, names)
+ touch_import(None, 'imp', node)
+ return new
diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py
index f9cc18b..93bae90 100644
--- a/Lib/lib2to3/main.py
+++ b/Lib/lib2to3/main.py
@@ -90,11 +90,11 @@ class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool):
if os.path.lexists(backup):
try:
os.remove(backup)
- except os.error as err:
+ except OSError as err:
self.log_message("Can't remove backup %s", backup)
try:
os.rename(filename, backup)
- except os.error as err:
+ except OSError as err:
self.log_message("Can't rename %s to %s", filename, backup)
# Actually write the new file
write = super(StdoutRefactoringTool, self).write_file
diff --git a/Lib/lib2to3/pgen2/conv.py b/Lib/lib2to3/pgen2/conv.py
index bf49762..ed0cac5 100644
--- a/Lib/lib2to3/pgen2/conv.py
+++ b/Lib/lib2to3/pgen2/conv.py
@@ -60,7 +60,7 @@ class Converter(grammar.Grammar):
"""
try:
f = open(filename)
- except IOError as err:
+ except OSError as err:
print("Can't open %s: %s" % (filename, err))
return False
self.symbol2number = {}
@@ -111,7 +111,7 @@ class Converter(grammar.Grammar):
"""
try:
f = open(filename)
- except IOError as err:
+ except OSError as err:
print("Can't open %s: %s" % (filename, err))
return False
# The code below essentially uses f's iterator-ness!
diff --git a/Lib/lib2to3/pgen2/driver.py b/Lib/lib2to3/pgen2/driver.py
index 4c611c6..3ccc69d 100644
--- a/Lib/lib2to3/pgen2/driver.py
+++ b/Lib/lib2to3/pgen2/driver.py
@@ -123,7 +123,7 @@ def load_grammar(gt="Grammar.txt", gp=None,
logger.info("Writing grammar tables to %s", gp)
try:
g.dump(gp)
- except IOError as e:
+ except OSError as e:
logger.info("Writing failed:"+str(e))
else:
g = grammar.Grammar()
diff --git a/Lib/lib2to3/pgen2/grammar.py b/Lib/lib2to3/pgen2/grammar.py
index 14c5f70..7f1c564 100644
--- a/Lib/lib2to3/pgen2/grammar.py
+++ b/Lib/lib2to3/pgen2/grammar.py
@@ -86,15 +86,13 @@ class Grammar(object):
def dump(self, filename):
"""Dump the grammar tables to a pickle file."""
- f = open(filename, "wb")
- pickle.dump(self.__dict__, f, 2)
- f.close()
+ with open(filename, "wb") as f:
+ pickle.dump(self.__dict__, f, 2)
def load(self, filename):
"""Load the grammar tables from a pickle file."""
- f = open(filename, "rb")
- d = pickle.load(f)
- f.close()
+ with open(filename, "rb") as f:
+ d = pickle.load(f)
self.__dict__.update(d)
def copy(self):
diff --git a/Lib/lib2to3/pytree.py b/Lib/lib2to3/pytree.py
index 17cbf0a..c4a1be3 100644
--- a/Lib/lib2to3/pytree.py
+++ b/Lib/lib2to3/pytree.py
@@ -194,8 +194,7 @@ class Base(object):
def leaves(self):
for child in self.children:
- for x in child.leaves():
- yield x
+ yield from child.leaves()
def depth(self):
if self.parent is None:
@@ -274,16 +273,14 @@ class Node(Base):
def post_order(self):
"""Return a post-order iterator for the tree."""
for child in self.children:
- for node in child.post_order():
- yield node
+ yield from child.post_order()
yield self
def pre_order(self):
"""Return a pre-order iterator for the tree."""
yield self
for child in self.children:
- for node in child.pre_order():
- yield node
+ yield from child.pre_order()
def _prefix_getter(self):
"""
diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py
index 201e193..8100317 100644
--- a/Lib/lib2to3/refactor.py
+++ b/Lib/lib2to3/refactor.py
@@ -326,7 +326,7 @@ class RefactoringTool(object):
"""
try:
f = open(filename, "rb")
- except IOError as err:
+ except OSError as err:
self.log_error("Can't open %s: %s", filename, err)
return None, None
try:
@@ -534,12 +534,12 @@ class RefactoringTool(object):
"""
try:
f = _open_with_encoding(filename, "w", encoding=encoding)
- except os.error as err:
+ except OSError as err:
self.log_error("Can't create %s: %s", filename, err)
return
try:
f.write(_to_system_newlines(new_text))
- except os.error as err:
+ except OSError as err:
self.log_error("Can't write %s: %s", filename, err)
finally:
f.close()
diff --git a/Lib/lib2to3/tests/pytree_idempotency.py b/Lib/lib2to3/tests/pytree_idempotency.py
index a02bbfe..731c403 100755
--- a/Lib/lib2to3/tests/pytree_idempotency.py
+++ b/Lib/lib2to3/tests/pytree_idempotency.py
@@ -53,7 +53,7 @@ def main():
for dir in sys.path:
try:
names = os.listdir(dir)
- except os.error:
+ except OSError:
continue
print("Scanning", dir, "...", file=sys.stderr)
for name in names:
diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py
index 914b3bf..d7659fa 100644
--- a/Lib/lib2to3/tests/test_fixers.py
+++ b/Lib/lib2to3/tests/test_fixers.py
@@ -282,6 +282,65 @@ class Test_apply(FixerTestCase):
b = """f(*args, **kwds)"""
self.check(a, b)
+class Test_reload(FixerTestCase):
+ fixer = "reload"
+
+ def test(self):
+ b = """reload(a)"""
+ a = """import imp\nimp.reload(a)"""
+ self.check(b, a)
+
+ def test_comment(self):
+ b = """reload( a ) # comment"""
+ a = """import imp\nimp.reload( a ) # comment"""
+ self.check(b, a)
+
+ # PEP 8 comments
+ b = """reload( a ) # comment"""
+ a = """import imp\nimp.reload( a ) # comment"""
+ self.check(b, a)
+
+ def test_space(self):
+ b = """reload( a )"""
+ a = """import imp\nimp.reload( a )"""
+ self.check(b, a)
+
+ b = """reload( a)"""
+ a = """import imp\nimp.reload( a)"""
+ self.check(b, a)
+
+ b = """reload(a )"""
+ a = """import imp\nimp.reload(a )"""
+ self.check(b, a)
+
+ def test_unchanged(self):
+ s = """reload(a=1)"""
+ self.unchanged(s)
+
+ s = """reload(f, g)"""
+ self.unchanged(s)
+
+ s = """reload(f, *h)"""
+ self.unchanged(s)
+
+ s = """reload(f, *h, **i)"""
+ self.unchanged(s)
+
+ s = """reload(f, **i)"""
+ self.unchanged(s)
+
+ s = """reload(*h, **i)"""
+ self.unchanged(s)
+
+ s = """reload(*h)"""
+ self.unchanged(s)
+
+ s = """reload(**i)"""
+ self.unchanged(s)
+
+ s = """reload()"""
+ self.unchanged(s)
+
class Test_intern(FixerTestCase):
fixer = "intern"
diff --git a/Lib/linecache.py b/Lib/linecache.py
index c3f2c3f..02a9eb5 100644
--- a/Lib/linecache.py
+++ b/Lib/linecache.py
@@ -59,7 +59,7 @@ def checkcache(filename=None):
continue # no-op for files loaded via a __loader__
try:
stat = os.stat(fullname)
- except os.error:
+ except OSError:
del cache[filename]
continue
if size != stat.st_size or mtime != stat.st_mtime:
@@ -91,7 +91,7 @@ def updatecache(filename, module_globals=None):
if name and get_source:
try:
data = get_source(name)
- except (ImportError, IOError):
+ except (ImportError, OSError):
pass
else:
if data is None:
@@ -118,14 +118,14 @@ def updatecache(filename, module_globals=None):
try:
stat = os.stat(fullname)
break
- except os.error:
+ except OSError:
pass
else:
return []
try:
with tokenize.open(fullname) as fp:
lines = fp.readlines()
- except IOError:
+ except OSError:
return []
if lines and not lines[-1].endswith('\n'):
lines[-1] += '\n'
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index fa03f78..3ecce73 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -67,7 +67,7 @@ else: #pragma: no cover
"""Return the frame object for the caller's stack frame."""
try:
raise Exception
- except:
+ except Exception:
return sys.exc_info()[2].tb_frame.f_back
# _srcfile is only used in conjunction with sys._getframe().
@@ -123,20 +123,22 @@ INFO = 20
DEBUG = 10
NOTSET = 0
-_levelNames = {
- CRITICAL : 'CRITICAL',
- ERROR : 'ERROR',
- WARNING : 'WARNING',
- INFO : 'INFO',
- DEBUG : 'DEBUG',
- NOTSET : 'NOTSET',
- 'CRITICAL' : CRITICAL,
- 'ERROR' : ERROR,
- 'WARN' : WARNING,
- 'WARNING' : WARNING,
- 'INFO' : INFO,
- 'DEBUG' : DEBUG,
- 'NOTSET' : NOTSET,
+_levelToName = {
+ CRITICAL: 'CRITICAL',
+ ERROR: 'ERROR',
+ WARNING: 'WARNING',
+ INFO: 'INFO',
+ DEBUG: 'DEBUG',
+ NOTSET: 'NOTSET',
+}
+_nameToLevel = {
+ 'CRITICAL': CRITICAL,
+ 'ERROR': ERROR,
+ 'WARN': WARNING,
+ 'WARNING': WARNING,
+ 'INFO': INFO,
+ 'DEBUG': DEBUG,
+ 'NOTSET': NOTSET,
}
def getLevelName(level):
@@ -153,7 +155,7 @@ def getLevelName(level):
Otherwise, the string "Level %s" % level is returned.
"""
- return _levelNames.get(level, ("Level %s" % level))
+ return _levelToName.get(level, ("Level %s" % level))
def addLevelName(level, levelName):
"""
@@ -163,8 +165,8 @@ def addLevelName(level, levelName):
"""
_acquireLock()
try: #unlikely to cause an exception, but you never know...
- _levelNames[level] = levelName
- _levelNames[levelName] = level
+ _levelToName[level] = levelName
+ _nameToLevel[levelName] = level
finally:
_releaseLock()
@@ -172,9 +174,9 @@ def _checkLevel(level):
if isinstance(level, int):
rv = level
elif str(level) == level:
- if level not in _levelNames:
+ if level not in _nameToLevel:
raise ValueError("Unknown level: %r" % level)
- rv = _levelNames[level]
+ rv = _nameToLevel[level]
else:
raise TypeError("Level not an integer or a valid string: %r" % level)
return rv
@@ -880,16 +882,30 @@ class Handler(Filterer):
The record which was being processed is passed in to this method.
"""
if raiseExceptions and sys.stderr: # see issue 13807
- ei = sys.exc_info()
+ t, v, tb = sys.exc_info()
try:
- traceback.print_exception(ei[0], ei[1], ei[2],
- None, sys.stderr)
- sys.stderr.write('Logged from file %s, line %s\n' % (
- record.filename, record.lineno))
- except IOError: #pragma: no cover
+ sys.stderr.write('--- Logging error ---\n')
+ traceback.print_exception(t, v, tb, None, sys.stderr)
+ sys.stderr.write('Call stack:\n')
+ # Walk the stack frame up until we're out of logging,
+ # so as to print the calling context.
+ frame = tb.tb_frame
+ while (frame and os.path.dirname(frame.f_code.co_filename) ==
+ __path__[0]):
+ frame = frame.f_back
+ if frame:
+ traceback.print_stack(frame, file=sys.stderr)
+ else:
+ # couldn't find the right stack frame, for some reason
+ sys.stderr.write('Logged from file %s, line %s\n' % (
+ record.filename, record.lineno))
+ # Issue 18671: output logging message and arguments
+ sys.stderr.write('Message: %r\n'
+ 'Arguments: %s\n' % (record.msg, record.args))
+ except OSError: #pragma: no cover
pass # see issue 5971
finally:
- del ei
+ del t, v, tb
class StreamHandler(Handler):
"""
@@ -939,9 +955,7 @@ class StreamHandler(Handler):
stream.write(msg)
stream.write(self.terminator)
self.flush()
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
class FileHandler(StreamHandler):
@@ -1830,7 +1844,7 @@ def shutdown(handlerList=_handlerList):
h.acquire()
h.flush()
h.close()
- except (IOError, ValueError):
+ except (OSError, ValueError):
# Ignore errors which might be caused
# because handlers have been closed but
# references to them are still around at
@@ -1838,7 +1852,7 @@ def shutdown(handlerList=_handlerList):
pass
finally:
h.release()
- except:
+ except: # ignore everything, as we're shutting down
if raiseExceptions:
raise
#else, swallow
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index 1880614..b882a62 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -61,11 +61,14 @@ def fileConfig(fname, defaults=None, disable_existing_loggers=True):
"""
import configparser
- cp = configparser.ConfigParser(defaults)
- if hasattr(fname, 'readline'):
- cp.read_file(fname)
+ if isinstance(fname, configparser.RawConfigParser):
+ cp = fname
else:
- cp.read(fname)
+ cp = configparser.ConfigParser(defaults)
+ if hasattr(fname, 'readline'):
+ cp.read_file(fname)
+ else:
+ cp.read(fname)
formatters = _create_formatters(cp)
@@ -141,7 +144,7 @@ def _install_handlers(cp, formatters):
h = klass(*args)
if "level" in section:
level = section["level"]
- h.setLevel(logging._levelNames[level])
+ h.setLevel(level)
if len(fmt):
h.setFormatter(formatters[fmt])
if issubclass(klass, logging.handlers.MemoryHandler):
@@ -188,7 +191,7 @@ def _install_loggers(cp, handlers, disable_existing):
log = root
if "level" in section:
level = section["level"]
- log.setLevel(logging._levelNames[level])
+ log.setLevel(level)
for h in root.handlers[:]:
root.removeHandler(h)
hlist = section["handlers"]
@@ -234,7 +237,7 @@ def _install_loggers(cp, handlers, disable_existing):
existing.remove(qn)
if "level" in section:
level = section["level"]
- logger.setLevel(logging._levelNames[level])
+ logger.setLevel(level)
for h in logger.handlers[:]:
logger.removeHandler(h)
logger.propagate = propagate
@@ -729,6 +732,7 @@ class DictConfigurator(BaseConfigurator):
'address' in config:
config['address'] = self.as_tuple(config['address'])
factory = klass
+ props = config.pop('.', None)
kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
try:
result = factory(**kwargs)
@@ -747,6 +751,9 @@ class DictConfigurator(BaseConfigurator):
result.setLevel(logging._checkLevel(level))
if filters:
self.add_filters(result, filters)
+ if props:
+ for name, value in props.items():
+ setattr(result, name, value)
return result
def add_handlers(self, logger, handlers):
@@ -795,7 +802,7 @@ def dictConfig(config):
dictConfigClass(config).configure()
-def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
+def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None):
"""
Start up a socket server on the specified port, and listen for new
configurations.
@@ -804,6 +811,15 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
Returns a Thread object on which you can call start() to start the server,
and which you can join() when appropriate. To stop the server, call
stopListening().
+
+ Use the ``verify`` argument to verify any bytes received across the wire
+ from a client. If specified, it should be a callable which receives a
+ single argument - the bytes of configuration data received across the
+ network - and it should return either ``None``, to indicate that the
+ passed in bytes could not be verified and should be discarded, or a
+ byte string which is then passed to the configuration machinery as
+ normal. Note that you can return transformed bytes, e.g. by decrypting
+ the bytes passed in.
"""
if not thread: #pragma: no cover
raise NotImplementedError("listen() needs threading to work")
@@ -831,25 +847,26 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + conn.recv(slen - len(chunk))
- chunk = chunk.decode("utf-8")
- try:
- import json
- d =json.loads(chunk)
- assert isinstance(d, dict)
- dictConfig(d)
- except:
- #Apply new configuration.
-
- file = io.StringIO(chunk)
+ if self.server.verify is not None:
+ chunk = self.server.verify(chunk)
+ if chunk is not None: # verified, can process
+ chunk = chunk.decode("utf-8")
try:
- fileConfig(file)
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
- traceback.print_exc()
+ import json
+ d =json.loads(chunk)
+ assert isinstance(d, dict)
+ dictConfig(d)
+ except Exception:
+ #Apply new configuration.
+
+ file = io.StringIO(chunk)
+ try:
+ fileConfig(file)
+ except Exception:
+ traceback.print_exc()
if self.server.ready:
self.server.ready.set()
- except socket.error as e:
+ except OSError as e:
if not isinstance(e.args, tuple):
raise
else:
@@ -865,13 +882,14 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
allow_reuse_address = 1
def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
- handler=None, ready=None):
+ handler=None, ready=None, verify=None):
ThreadingTCPServer.__init__(self, (host, port), handler)
logging._acquireLock()
self.abort = 0
logging._releaseLock()
self.timeout = 1
self.ready = ready
+ self.verify = verify
def serve_until_stopped(self):
import select
@@ -889,16 +907,18 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
class Server(threading.Thread):
- def __init__(self, rcvr, hdlr, port):
+ def __init__(self, rcvr, hdlr, port, verify):
super(Server, self).__init__()
self.rcvr = rcvr
self.hdlr = hdlr
self.port = port
+ self.verify = verify
self.ready = threading.Event()
def run(self):
server = self.rcvr(port=self.port, handler=self.hdlr,
- ready=self.ready)
+ ready=self.ready,
+ verify=self.verify)
if self.port == 0:
self.port = server.server_address[1]
self.ready.set()
@@ -908,7 +928,7 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
logging._releaseLock()
server.serve_until_stopped()
- return Server(ConfigSocketReceiver, ConfigStreamHandler, port)
+ return Server(ConfigSocketReceiver, ConfigStreamHandler, port, verify)
def stopListening():
"""
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index 93aa50e..f1ddbb5 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -72,9 +72,7 @@ class BaseRotatingHandler(logging.FileHandler):
if self.shouldRollover(record):
self.doRollover()
logging.FileHandler.emit(self, record)
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
def rotation_filename(self, default_name):
@@ -198,11 +196,12 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
If backupCount is > 0, when rollover is done, no more than backupCount
files are kept - the oldest ones are deleted.
"""
- def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):
+ def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
self.when = when.upper()
self.backupCount = backupCount
self.utc = utc
+ self.atTime = atTime
# Calculate the real rollover interval, which is just the number of
# seconds between rollovers. Also set the filename suffix used when
# a rollover occurs. Current 'when' events supported:
@@ -272,9 +271,22 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
currentHour = t[3]
currentMinute = t[4]
currentSecond = t[5]
- # r is the number of seconds left between now and midnight
- r = _MIDNIGHT - ((currentHour * 60 + currentMinute) * 60 +
- currentSecond)
+ currentDay = t[6]
+ # r is the number of seconds left between now and the next rotation
+ if self.atTime is None:
+ rotate_ts = _MIDNIGHT
+ else:
+ rotate_ts = ((self.atTime.hour * 60 + self.atTime.minute)*60 +
+ self.atTime.second)
+
+ r = rotate_ts - ((currentHour * 60 + currentMinute) * 60 +
+ currentSecond)
+ if r < 0:
+ # Rotate time is before the current time (for example when
+ # self.rotateAt is 13:45 and it now 14:15), rotation is
+ # tomorrow.
+ r += _MIDNIGHT
+ currentDay = (currentDay + 1) % 7
result = currentTime + r
# If we are rolling over on a certain day, add in the number of days until
# the next rollover, but offset by 1 since we just calculated the time
@@ -292,7 +304,7 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
# This is because the above time calculation takes us to midnight on this
# day, i.e. the start of the next day.
if self.when.startswith('W'):
- day = t[6] # 0 is Monday
+ day = currentDay # 0 is Monday
if day != self.dayOfWeek:
if day < self.dayOfWeek:
daysToWait = self.dayOfWeek - day
@@ -440,11 +452,8 @@ class WatchedFileHandler(logging.FileHandler):
try:
# stat the file by path, checking for existence
sres = os.stat(self.baseFilename)
- except OSError as err:
- if err.errno == errno.ENOENT:
- sres = None
- else:
- raise
+ except FileNotFoundError:
+ sres = None
# compare file system stat with that of our stream file handle
if not sres or sres[ST_DEV] != self.dev or sres[ST_INO] != self.ino:
if self.stream is not None:
@@ -496,15 +505,7 @@ class SocketHandler(logging.Handler):
A factory method which allows subclasses to define the precise
type of socket they want.
"""
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- if hasattr(s, 'settimeout'):
- s.settimeout(timeout)
- try:
- s.connect((self.host, self.port))
- return s
- except socket.error:
- s.close()
- raise
+ return socket.create_connection((self.host, self.port), timeout=timeout)
def createSocket(self):
"""
@@ -524,7 +525,7 @@ class SocketHandler(logging.Handler):
try:
self.sock = self.makeSocket()
self.retryTime = None # next time, no delay before trying
- except socket.error:
+ except OSError:
#Creation failed, so set the retry time and return.
if self.retryTime is None:
self.retryPeriod = self.retryStart
@@ -548,16 +549,8 @@ class SocketHandler(logging.Handler):
#but are still unable to connect.
if self.sock:
try:
- if hasattr(self.sock, "sendall"):
- self.sock.sendall(s)
- else: #pragma: no cover
- sentsofar = 0
- left = len(s)
- while left > 0:
- sent = self.sock.send(s[sentsofar:])
- sentsofar = sentsofar + sent
- left = left - sent
- except socket.error: #pragma: no cover
+ self.sock.sendall(s)
+ except OSError: #pragma: no cover
self.sock.close()
self.sock = None # so we can call createSocket next time
@@ -607,9 +600,7 @@ class SocketHandler(logging.Handler):
try:
s = self.makePickle(record)
self.send(s)
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
def close(self):
@@ -773,7 +764,11 @@ class SysLogHandler(logging.Handler):
If address is specified as a string, a UNIX socket is used. To log to a
local syslogd, "SysLogHandler(address="/dev/log")" can be used.
- If facility is not specified, LOG_USER is used.
+ If facility is not specified, LOG_USER is used. If socktype is
+ specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
+ socket type will be used. For Unix sockets, you can also specify a
+ socktype of None, in which case socket.SOCK_DGRAM will be used, falling
+ back to socket.SOCK_STREAM.
"""
logging.Handler.__init__(self)
@@ -803,7 +798,7 @@ class SysLogHandler(logging.Handler):
self.socket.connect(address)
# it worked, so set self.socktype to the used type
self.socktype = use_socktype
- except socket.error:
+ except OSError:
self.socket.close()
if self.socktype is not None:
# user didn't specify falling back, so fail
@@ -814,7 +809,7 @@ class SysLogHandler(logging.Handler):
self.socket.connect(address)
# it worked, so set self.socktype to the used type
self.socktype = use_socktype
- except socket.error:
+ except OSError:
self.socket.close()
raise
@@ -867,10 +862,9 @@ class SysLogHandler(logging.Handler):
msg = self.ident + msg
if self.append_nul:
msg += '\000'
- """
- We need to convert record level to lowercase, maybe this will
- change in the future.
- """
+
+ # We need to convert record level to lowercase, maybe this will
+ # change in the future.
prio = '<%d>' % self.encodePriority(self.facility,
self.mapPriority(record.levelname))
prio = prio.encode('utf-8')
@@ -881,7 +875,7 @@ class SysLogHandler(logging.Handler):
if self.unixsocket:
try:
self.socket.send(msg)
- except socket.error:
+ except OSError:
self.socket.close()
self._connect_unixsocket(self.address)
self.socket.send(msg)
@@ -889,9 +883,7 @@ class SysLogHandler(logging.Handler):
self.socket.sendto(msg, self.address)
else:
self.socket.sendall(msg)
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
class SMTPHandler(logging.Handler):
@@ -969,9 +961,7 @@ class SMTPHandler(logging.Handler):
smtp.login(self.username, self.password)
smtp.sendmail(self.fromaddr, self.toaddrs, msg)
smtp.quit()
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
class NTEventLogHandler(logging.Handler):
@@ -1056,9 +1046,7 @@ class NTEventLogHandler(logging.Handler):
type = self.getEventType(record)
msg = self.format(record)
self._welu.ReportEvent(self.appname, id, cat, type, [msg])
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
def close(self):
@@ -1143,9 +1131,7 @@ class HTTPHandler(logging.Handler):
if self.method == "POST":
h.send(data.encode('utf-8'))
h.getresponse() #can't do anything with the result
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
class BufferingHandler(logging.Handler):
@@ -1325,9 +1311,7 @@ class QueueHandler(logging.Handler):
"""
try:
self.enqueue(self.prepare(record))
- except (KeyboardInterrupt, SystemExit): #pragma: no cover
- raise
- except:
+ except Exception:
self.handleError(record)
if threading:
diff --git a/Lib/lzma.py b/Lib/lzma.py
index 1a1b065..b2e2f7e 100644
--- a/Lib/lzma.py
+++ b/Lib/lzma.py
@@ -55,7 +55,7 @@ class LZMAFile(io.BufferedIOBase):
be an existing file object to read from or write to.
mode can be "r" for reading (default), "w" for (over)writing, or
- "a" for appending. These can equivalently be given as "rb", "wb",
+ "a" for appending. These can equivalently be given as "rb", "wb"
and "ab" respectively.
format specifies the container format to use for the file.
@@ -110,7 +110,8 @@ class LZMAFile(io.BufferedIOBase):
# stream will need a separate decompressor object.
self._init_args = {"format":format, "filters":filters}
self._decompressor = LZMADecompressor(**self._init_args)
- self._buffer = None
+ self._buffer = b""
+ self._buffer_offset = 0
elif mode in ("w", "wb", "a", "ab"):
if format is None:
format = FORMAT_XZ
@@ -143,7 +144,7 @@ class LZMAFile(io.BufferedIOBase):
try:
if self._mode in (_MODE_READ, _MODE_READ_EOF):
self._decompressor = None
- self._buffer = None
+ self._buffer = b""
elif self._mode == _MODE_WRITE:
self._fp.write(self._compressor.flush())
self._compressor = None
@@ -187,15 +188,18 @@ class LZMAFile(io.BufferedIOBase):
raise ValueError("I/O operation on closed file")
def _check_can_read(self):
- if not self.readable():
+ if self._mode not in (_MODE_READ, _MODE_READ_EOF):
+ self._check_not_closed()
raise io.UnsupportedOperation("File not open for reading")
def _check_can_write(self):
- if not self.writable():
+ if self._mode != _MODE_WRITE:
+ self._check_not_closed()
raise io.UnsupportedOperation("File not open for writing")
def _check_can_seek(self):
- if not self.readable():
+ if self._mode not in (_MODE_READ, _MODE_READ_EOF):
+ self._check_not_closed()
raise io.UnsupportedOperation("Seeking is only supported "
"on files open for reading")
if not self._fp.seekable():
@@ -204,16 +208,13 @@ class LZMAFile(io.BufferedIOBase):
# Fill the readahead buffer if it is empty. Returns False on EOF.
def _fill_buffer(self):
+ if self._mode == _MODE_READ_EOF:
+ return False
# Depending on the input data, our call to the decompressor may not
# return any data. In this case, try again after reading another block.
- while True:
- if self._buffer:
- return True
-
- if self._decompressor.unused_data:
- rawblock = self._decompressor.unused_data
- else:
- rawblock = self._fp.read(_BUFFER_SIZE)
+ while self._buffer_offset == len(self._buffer):
+ rawblock = (self._decompressor.unused_data or
+ self._fp.read(_BUFFER_SIZE))
if not rawblock:
if self._decompressor.eof:
@@ -229,30 +230,48 @@ class LZMAFile(io.BufferedIOBase):
self._decompressor = LZMADecompressor(**self._init_args)
self._buffer = self._decompressor.decompress(rawblock)
+ self._buffer_offset = 0
+ return True
# Read data until EOF.
# If return_data is false, consume the data without returning it.
def _read_all(self, return_data=True):
+ # The loop assumes that _buffer_offset is 0. Ensure that this is true.
+ self._buffer = self._buffer[self._buffer_offset:]
+ self._buffer_offset = 0
+
blocks = []
while self._fill_buffer():
if return_data:
blocks.append(self._buffer)
self._pos += len(self._buffer)
- self._buffer = None
+ self._buffer = b""
if return_data:
return b"".join(blocks)
# Read a block of up to n bytes.
# If return_data is false, consume the data without returning it.
def _read_block(self, n, return_data=True):
+ # If we have enough data buffered, return immediately.
+ end = self._buffer_offset + n
+ if end <= len(self._buffer):
+ data = self._buffer[self._buffer_offset : end]
+ self._buffer_offset = end
+ self._pos += len(data)
+ return data if return_data else None
+
+ # The loop assumes that _buffer_offset is 0. Ensure that this is true.
+ self._buffer = self._buffer[self._buffer_offset:]
+ self._buffer_offset = 0
+
blocks = []
while n > 0 and self._fill_buffer():
if n < len(self._buffer):
data = self._buffer[:n]
- self._buffer = self._buffer[n:]
+ self._buffer_offset = n
else:
data = self._buffer
- self._buffer = None
+ self._buffer = b""
if return_data:
blocks.append(data)
self._pos += len(data)
@@ -267,9 +286,9 @@ class LZMAFile(io.BufferedIOBase):
The exact number of bytes returned is unspecified.
"""
self._check_can_read()
- if self._mode == _MODE_READ_EOF or not self._fill_buffer():
+ if not self._fill_buffer():
return b""
- return self._buffer
+ return self._buffer[self._buffer_offset:]
def read(self, size=-1):
"""Read up to size uncompressed bytes from the file.
@@ -278,7 +297,7 @@ class LZMAFile(io.BufferedIOBase):
Returns b"" if the file is already at EOF.
"""
self._check_can_read()
- if self._mode == _MODE_READ_EOF or size == 0:
+ if size == 0:
return b""
elif size < 0:
return self._read_all()
@@ -295,18 +314,40 @@ class LZMAFile(io.BufferedIOBase):
# this does not give enough data for the decompressor to make progress.
# In this case we make multiple reads, to avoid returning b"".
self._check_can_read()
- if (size == 0 or self._mode == _MODE_READ_EOF or
- not self._fill_buffer()):
+ if (size == 0 or
+ # Only call _fill_buffer() if the buffer is actually empty.
+ # This gives a significant speedup if *size* is small.
+ (self._buffer_offset == len(self._buffer) and not self._fill_buffer())):
return b""
- if 0 < size < len(self._buffer):
- data = self._buffer[:size]
- self._buffer = self._buffer[size:]
+ if size > 0:
+ data = self._buffer[self._buffer_offset :
+ self._buffer_offset + size]
+ self._buffer_offset += len(data)
else:
- data = self._buffer
- self._buffer = None
+ data = self._buffer[self._buffer_offset:]
+ self._buffer = b""
+ self._buffer_offset = 0
self._pos += len(data)
return data
+ def readline(self, size=-1):
+ """Read a line of uncompressed bytes from the file.
+
+ The terminating newline (if present) is retained. If size is
+ non-negative, no more than size bytes will be read (in which
+ case the line may be incomplete). Returns b'' if already at EOF.
+ """
+ self._check_can_read()
+ # Shortcut for the common case - the whole line is in the buffer.
+ if size < 0:
+ end = self._buffer.find(b"\n", self._buffer_offset) + 1
+ if end > 0:
+ line = self._buffer[self._buffer_offset : end]
+ self._buffer_offset = end
+ self._pos += len(line)
+ return line
+ return io.BufferedIOBase.readline(self, size)
+
def write(self, data):
"""Write a bytes object to the file.
@@ -326,7 +367,8 @@ class LZMAFile(io.BufferedIOBase):
self._mode = _MODE_READ
self._pos = 0
self._decompressor = LZMADecompressor(**self._init_args)
- self._buffer = None
+ self._buffer = b""
+ self._buffer_offset = 0
def seek(self, offset, whence=0):
"""Change the file position.
@@ -365,8 +407,7 @@ class LZMAFile(io.BufferedIOBase):
offset -= self._pos
# Read and discard data until we reach the desired position.
- if self._mode != _MODE_READ_EOF:
- self._read_block(offset, return_data=False)
+ self._read_block(offset, return_data=False)
return self._pos
@@ -381,23 +422,24 @@ def open(filename, mode="rb", *,
encoding=None, errors=None, newline=None):
"""Open an LZMA-compressed file in binary or text mode.
- filename can be either an actual file name (given as a str or bytes object),
- in which case the named file is opened, or it can be an existing file object
- to read from or write to.
+ filename can be either an actual file name (given as a str or bytes
+ object), in which case the named file is opened, or it can be an
+ existing file object to read from or write to.
- The mode argument can be "r", "rb" (default), "w", "wb", "a", or "ab" for
- binary mode, or "rt", "wt" or "at" for text mode.
+ The mode argument can be "r", "rb" (default), "w", "wb", "a" or "ab"
+ for binary mode, or "rt", "wt" or "at" for text mode.
- The format, check, preset and filters arguments specify the compression
- settings, as for LZMACompressor, LZMADecompressor and LZMAFile.
+ The format, check, preset and filters arguments specify the
+ compression settings, as for LZMACompressor, LZMADecompressor and
+ LZMAFile.
- For binary mode, this function is equivalent to the LZMAFile constructor:
- LZMAFile(filename, mode, ...). In this case, the encoding, errors and
- newline arguments must not be provided.
+ For binary mode, this function is equivalent to the LZMAFile
+ constructor: LZMAFile(filename, mode, ...). In this case, the
+ encoding, errors and newline arguments must not be provided.
For text mode, a LZMAFile object is created, and wrapped in an
- io.TextIOWrapper instance with the specified encoding, error handling
- behavior, and line ending(s).
+ io.TextIOWrapper instance with the specified encoding, error
+ handling behavior, and line ending(s).
"""
if "t" in mode:
@@ -427,7 +469,7 @@ def compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None):
Refer to LZMACompressor's docstring for a description of the
optional arguments *format*, *check*, *preset* and *filters*.
- For incremental compression, use an LZMACompressor object instead.
+ For incremental compression, use an LZMACompressor instead.
"""
comp = LZMACompressor(format, check, preset, filters)
return comp.compress(data) + comp.flush()
@@ -439,7 +481,7 @@ def decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None):
Refer to LZMADecompressor's docstring for a description of the
optional arguments *format*, *check* and *filters*.
- For incremental decompression, use a LZMADecompressor object instead.
+ For incremental decompression, use an LZMADecompressor instead.
"""
results = []
while True:
diff --git a/Lib/macpath.py b/Lib/macpath.py
index 1615d91..d34f9e94 100644
--- a/Lib/macpath.py
+++ b/Lib/macpath.py
@@ -127,7 +127,7 @@ def lexists(path):
try:
st = os.lstat(path)
- except os.error:
+ except OSError:
return False
return True
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index d3bf3fd..2049516 100644
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -22,9 +22,6 @@ import email.generator
import io
import contextlib
try:
- if sys.platform == 'os2emx':
- # OS/2 EMX fcntl() not adequate
- raise ImportError
import fcntl
except ImportError:
fcntl = None
@@ -337,11 +334,8 @@ class Maildir(Mailbox):
# This overrides an inapplicable implementation in the superclass.
try:
self.remove(key)
- except KeyError:
+ except (KeyError, FileNotFoundError):
pass
- except OSError as e:
- if e.errno != errno.ENOENT:
- raise
def __setitem__(self, key, message):
"""Replace the keyed message; raise KeyError if it doesn't exist."""
@@ -369,14 +363,11 @@ class Maildir(Mailbox):
def get_message(self, key):
"""Return a Message representation or raise a KeyError."""
subpath = self._lookup(key)
- f = open(os.path.join(self._path, subpath), 'rb')
- try:
+ with open(os.path.join(self._path, subpath), 'rb') as f:
if self._factory:
msg = self._factory(f)
else:
msg = MaildirMessage(f)
- finally:
- f.close()
subdir, name = os.path.split(subpath)
msg.set_subdir(subdir)
if self.colon in name:
@@ -386,11 +377,8 @@ class Maildir(Mailbox):
def get_bytes(self, key):
"""Return a bytes representation or raise a KeyError."""
- f = open(os.path.join(self._path, self._lookup(key)), 'rb')
- try:
+ with open(os.path.join(self._path, self._lookup(key)), 'rb') as f:
return f.read().replace(linesep, b'\n')
- finally:
- f.close()
def get_file(self, key):
"""Return a file-like representation or raise a KeyError."""
@@ -502,16 +490,12 @@ class Maildir(Mailbox):
path = os.path.join(self._path, 'tmp', uniq)
try:
os.stat(path)
- except OSError as e:
- if e.errno == errno.ENOENT:
- Maildir._count += 1
- try:
- return _create_carefully(path)
- except OSError as e:
- if e.errno != errno.EEXIST:
- raise
- else:
- raise
+ except FileNotFoundError:
+ Maildir._count += 1
+ try:
+ return _create_carefully(path)
+ except FileExistsError:
+ pass
# Fall through to here if stat succeeded or open raised EEXIST.
raise ExternalClashError('Name clash prevented file creation: %s' %
@@ -588,7 +572,7 @@ class _singlefileMailbox(Mailbox):
Mailbox.__init__(self, path, factory, create)
try:
f = open(self._path, 'rb+')
- except IOError as e:
+ except OSError as e:
if e.errno == errno.ENOENT:
if create:
f = open(self._path, 'wb+')
@@ -631,8 +615,7 @@ class _singlefileMailbox(Mailbox):
def iterkeys(self):
"""Return an iterator over keys."""
self._lookup()
- for key in self._toc.keys():
- yield key
+ yield from self._toc.keys()
def __contains__(self, key):
"""Return True if the keyed message exists, False otherwise."""
@@ -710,13 +693,9 @@ class _singlefileMailbox(Mailbox):
os.chmod(new_file.name, mode)
try:
os.rename(new_file.name, self._path)
- except OSError as e:
- if e.errno == errno.EEXIST or \
- (os.name == 'os2' and e.errno == errno.EACCES):
- os.remove(self._path)
- os.rename(new_file.name, self._path)
- else:
- raise
+ except FileExistsError:
+ os.remove(self._path)
+ os.rename(new_file.name, self._path)
self._file = open(self._path, 'rb+')
self._toc = new_toc
self._pending = False
@@ -993,7 +972,7 @@ class MH(Mailbox):
path = os.path.join(self._path, str(key))
try:
f = open(path, 'rb+')
- except IOError as e:
+ except OSError as e:
if e.errno == errno.ENOENT:
raise KeyError('No message with key: %s' % key)
else:
@@ -1007,7 +986,7 @@ class MH(Mailbox):
path = os.path.join(self._path, str(key))
try:
f = open(path, 'rb+')
- except IOError as e:
+ except OSError as e:
if e.errno == errno.ENOENT:
raise KeyError('No message with key: %s' % key)
else:
@@ -1033,12 +1012,12 @@ class MH(Mailbox):
f = open(os.path.join(self._path, str(key)), 'rb+')
else:
f = open(os.path.join(self._path, str(key)), 'rb')
- except IOError as e:
+ except OSError as e:
if e.errno == errno.ENOENT:
raise KeyError('No message with key: %s' % key)
else:
raise
- try:
+ with f:
if self._locked:
_lock_file(f)
try:
@@ -1046,8 +1025,6 @@ class MH(Mailbox):
finally:
if self._locked:
_unlock_file(f)
- finally:
- f.close()
for name, key_list in self.get_sequences().items():
if key in key_list:
msg.add_sequence(name)
@@ -1060,12 +1037,12 @@ class MH(Mailbox):
f = open(os.path.join(self._path, str(key)), 'rb+')
else:
f = open(os.path.join(self._path, str(key)), 'rb')
- except IOError as e:
+ except OSError as e:
if e.errno == errno.ENOENT:
raise KeyError('No message with key: %s' % key)
else:
raise
- try:
+ with f:
if self._locked:
_lock_file(f)
try:
@@ -1073,14 +1050,12 @@ class MH(Mailbox):
finally:
if self._locked:
_unlock_file(f)
- finally:
- f.close()
def get_file(self, key):
"""Return a file-like representation or raise a KeyError."""
try:
f = open(os.path.join(self._path, str(key)), 'rb')
- except IOError as e:
+ except OSError as e:
if e.errno == errno.ENOENT:
raise KeyError('No message with key: %s' % key)
else:
@@ -2073,7 +2048,7 @@ def _lock_file(f, dotlock=True):
if fcntl:
try:
fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
- except IOError as e:
+ except OSError as e:
if e.errno in (errno.EAGAIN, errno.EACCES, errno.EROFS):
raise ExternalClashError('lockf: lock unavailable: %s' %
f.name)
@@ -2083,7 +2058,7 @@ def _lock_file(f, dotlock=True):
try:
pre_lock = _create_temporary(f.name + '.lock')
pre_lock.close()
- except IOError as e:
+ except OSError as e:
if e.errno in (errno.EACCES, errno.EROFS):
return # Without write access, just skip dotlocking.
else:
@@ -2096,14 +2071,10 @@ def _lock_file(f, dotlock=True):
else:
os.rename(pre_lock.name, f.name + '.lock')
dotlock_done = True
- except OSError as e:
- if e.errno == errno.EEXIST or \
- (os.name == 'os2' and e.errno == errno.EACCES):
- os.remove(pre_lock.name)
- raise ExternalClashError('dot lock unavailable: %s' %
- f.name)
- else:
- raise
+ except FileExistsError:
+ os.remove(pre_lock.name)
+ raise ExternalClashError('dot lock unavailable: %s' %
+ f.name)
except:
if fcntl:
fcntl.lockf(f, fcntl.LOCK_UN)
diff --git a/Lib/mailcap.py b/Lib/mailcap.py
index 99f4958..bd61b0b 100644
--- a/Lib/mailcap.py
+++ b/Lib/mailcap.py
@@ -20,7 +20,7 @@ def getcaps():
for mailcap in listmailcapfiles():
try:
fp = open(mailcap, 'r')
- except IOError:
+ except OSError:
continue
morecaps = readmailcapfile(fp)
fp.close()
diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
index 2872ee4..5aaa908 100644
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -243,7 +243,7 @@ class MimeTypes:
while True:
try:
ctype = _winreg.EnumKey(mimedb, i)
- except EnvironmentError:
+ except OSError:
break
else:
yield ctype
@@ -256,7 +256,7 @@ class MimeTypes:
with _winreg.OpenKey(mimedb, ctype) as key:
suffix, datatype = _winreg.QueryValueEx(key,
'Extension')
- except EnvironmentError:
+ except OSError:
continue
if datatype != _winreg.REG_SZ:
continue
@@ -359,7 +359,7 @@ def init(files=None):
def read_mime_types(file):
try:
f = open(file)
- except IOError:
+ except OSError:
return None
db = MimeTypes()
db.readfp(f, True)
diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
index a197a0d..ebd068a 100644
--- a/Lib/modulefinder.py
+++ b/Lib/modulefinder.py
@@ -1,13 +1,16 @@
"""Find modules used by a script, using introspection."""
import dis
-import imp
import importlib.machinery
import marshal
import os
import sys
import types
import struct
+import warnings
+with warnings.catch_warnings():
+ warnings.simplefilter('ignore', PendingDeprecationWarning)
+ import imp
# XXX Clean up once str8's cstor matches bytes.
LOAD_CONST = bytes([dis.opname.index('LOAD_CONST')])
@@ -229,7 +232,7 @@ class ModuleFinder:
for dir in m.__path__:
try:
names = os.listdir(dir)
- except os.error:
+ except OSError:
self.msg(2, "can't list directory", dir)
continue
for name in names:
diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py
index 1f3e67c..fd75839 100644
--- a/Lib/multiprocessing/__init__.py
+++ b/Lib/multiprocessing/__init__.py
@@ -8,10 +8,6 @@
# subpackage 'multiprocessing.dummy' has the same API but is a simple
# wrapper for 'threading'.
#
-# Try calling `multiprocessing.doc.main()` to read the html
-# documentation in a webbrowser.
-#
-#
# Copyright (c) 2006-2008, R Oudkerk
# Licensed to PSF under a Contributor Agreement.
#
@@ -25,10 +21,10 @@ __all__ = [
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition',
'Event', 'Barrier', 'Queue', 'SimpleQueue', 'JoinableQueue', 'Pool',
'Value', 'Array', 'RawValue', 'RawArray', 'SUBDEBUG', 'SUBWARNING',
+ 'set_executable', 'set_start_method', 'get_start_method',
+ 'get_all_start_methods', 'set_forkserver_preload'
]
-__author__ = 'R. Oudkerk (r.m.oudkerk@gmail.com)'
-
#
# Imports
#
@@ -36,8 +32,21 @@ __author__ = 'R. Oudkerk (r.m.oudkerk@gmail.com)'
import os
import sys
-from multiprocessing.process import Process, current_process, active_children
-from multiprocessing.util import SUBDEBUG, SUBWARNING
+from .process import Process, current_process, active_children
+
+#
+# XXX These should not really be documented or public.
+#
+
+SUBDEBUG = 5
+SUBWARNING = 25
+
+#
+# Alias for main module -- will be reset by bootstrapping child processes
+#
+
+if '__main__' in sys.modules:
+ sys.modules['__mp_main__'] = sys.modules['__main__']
#
# Exceptions
@@ -55,8 +64,6 @@ class TimeoutError(ProcessError):
class AuthenticationError(ProcessError):
pass
-import _multiprocessing
-
#
# Definitions not depending on native semaphores
#
@@ -68,7 +75,7 @@ def Manager():
The managers methods such as `Lock()`, `Condition()` and `Queue()`
can be used to create shared objects.
'''
- from multiprocessing.managers import SyncManager
+ from .managers import SyncManager
m = SyncManager()
m.start()
return m
@@ -77,37 +84,18 @@ def Pipe(duplex=True):
'''
Returns two connection object connected by a pipe
'''
- from multiprocessing.connection import Pipe
+ from .connection import Pipe
return Pipe(duplex)
def cpu_count():
'''
Returns the number of CPUs in the system
'''
- if sys.platform == 'win32':
- try:
- num = int(os.environ['NUMBER_OF_PROCESSORS'])
- except (ValueError, KeyError):
- num = 0
- elif 'bsd' in sys.platform or sys.platform == 'darwin':
- comm = '/sbin/sysctl -n hw.ncpu'
- if sys.platform == 'darwin':
- comm = '/usr' + comm
- try:
- with os.popen(comm) as p:
- num = int(p.read())
- except ValueError:
- num = 0
+ num = os.cpu_count()
+ if num is None:
+ raise NotImplementedError('cannot determine number of cpus')
else:
- try:
- num = os.sysconf('SC_NPROCESSORS_ONLN')
- except (ValueError, OSError, AttributeError):
- num = 0
-
- if num >= 1:
return num
- else:
- raise NotImplementedError('cannot determine number of cpus')
def freeze_support():
'''
@@ -115,21 +103,21 @@ def freeze_support():
If so then run code specified by commandline and exit.
'''
if sys.platform == 'win32' and getattr(sys, 'frozen', False):
- from multiprocessing.forking import freeze_support
+ from .spawn import freeze_support
freeze_support()
def get_logger():
'''
Return package logger -- if it does not already exist then it is created
'''
- from multiprocessing.util import get_logger
+ from .util import get_logger
return get_logger()
def log_to_stderr(level=None):
'''
Turn on logging and add a handler which prints to stderr
'''
- from multiprocessing.util import log_to_stderr
+ from .util import log_to_stderr
return log_to_stderr(level)
def allow_connection_pickling():
@@ -138,7 +126,7 @@ def allow_connection_pickling():
'''
# This is undocumented. In previous versions of multiprocessing
# its only effect was to make socket objects inheritable on Windows.
- import multiprocessing.connection
+ from . import connection
#
# Definitions depending on native semaphores
@@ -148,120 +136,151 @@ def Lock():
'''
Returns a non-recursive lock object
'''
- from multiprocessing.synchronize import Lock
+ from .synchronize import Lock
return Lock()
def RLock():
'''
Returns a recursive lock object
'''
- from multiprocessing.synchronize import RLock
+ from .synchronize import RLock
return RLock()
def Condition(lock=None):
'''
Returns a condition object
'''
- from multiprocessing.synchronize import Condition
+ from .synchronize import Condition
return Condition(lock)
def Semaphore(value=1):
'''
Returns a semaphore object
'''
- from multiprocessing.synchronize import Semaphore
+ from .synchronize import Semaphore
return Semaphore(value)
def BoundedSemaphore(value=1):
'''
Returns a bounded semaphore object
'''
- from multiprocessing.synchronize import BoundedSemaphore
+ from .synchronize import BoundedSemaphore
return BoundedSemaphore(value)
def Event():
'''
Returns an event object
'''
- from multiprocessing.synchronize import Event
+ from .synchronize import Event
return Event()
def Barrier(parties, action=None, timeout=None):
'''
Returns a barrier object
'''
- from multiprocessing.synchronize import Barrier
+ from .synchronize import Barrier
return Barrier(parties, action, timeout)
def Queue(maxsize=0):
'''
Returns a queue object
'''
- from multiprocessing.queues import Queue
+ from .queues import Queue
return Queue(maxsize)
def JoinableQueue(maxsize=0):
'''
Returns a queue object
'''
- from multiprocessing.queues import JoinableQueue
+ from .queues import JoinableQueue
return JoinableQueue(maxsize)
def SimpleQueue():
'''
Returns a queue object
'''
- from multiprocessing.queues import SimpleQueue
+ from .queues import SimpleQueue
return SimpleQueue()
def Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None):
'''
Returns a process pool object
'''
- from multiprocessing.pool import Pool
+ from .pool import Pool
return Pool(processes, initializer, initargs, maxtasksperchild)
def RawValue(typecode_or_type, *args):
'''
Returns a shared object
'''
- from multiprocessing.sharedctypes import RawValue
+ from .sharedctypes import RawValue
return RawValue(typecode_or_type, *args)
def RawArray(typecode_or_type, size_or_initializer):
'''
Returns a shared array
'''
- from multiprocessing.sharedctypes import RawArray
+ from .sharedctypes import RawArray
return RawArray(typecode_or_type, size_or_initializer)
def Value(typecode_or_type, *args, lock=True):
'''
Returns a synchronized shared object
'''
- from multiprocessing.sharedctypes import Value
+ from .sharedctypes import Value
return Value(typecode_or_type, *args, lock=lock)
def Array(typecode_or_type, size_or_initializer, *, lock=True):
'''
Returns a synchronized shared array
'''
- from multiprocessing.sharedctypes import Array
+ from .sharedctypes import Array
return Array(typecode_or_type, size_or_initializer, lock=lock)
#
#
#
-if sys.platform == 'win32':
+def set_executable(executable):
+ '''
+ Sets the path to a python.exe or pythonw.exe binary used to run
+ child processes instead of sys.executable when using the 'spawn'
+ start method. Useful for people embedding Python.
+ '''
+ from .spawn import set_executable
+ set_executable(executable)
+
+def set_start_method(method):
+ '''
+ Set method for starting processes: 'fork', 'spawn' or 'forkserver'.
+ '''
+ from .popen import set_start_method
+ set_start_method(method)
+
+def get_start_method():
+ '''
+ Get method for starting processes: 'fork', 'spawn' or 'forkserver'.
+ '''
+ from .popen import get_start_method
+ return get_start_method()
- def set_executable(executable):
- '''
- Sets the path to a python.exe or pythonw.exe binary used to run
- child processes on Windows instead of sys.executable.
- Useful for people embedding Python.
- '''
- from multiprocessing.forking import set_executable
- set_executable(executable)
+def get_all_start_methods():
+ '''
+ Get list of availables start methods, default first.
+ '''
+ from .popen import get_all_start_methods
+ return get_all_start_methods()
- __all__ += ['set_executable']
+def set_forkserver_preload(module_names):
+ '''
+ Set list of module names to try to load in the forkserver process
+ when it is started. Properly chosen this can significantly reduce
+ the cost of starting a new process using the forkserver method.
+ The default list is ['__main__'].
+ '''
+ try:
+ from .forkserver import set_forkserver_preload
+ except ImportError:
+ pass
+ else:
+ set_forkserver_preload(module_names)
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py
index 2a0bc2f..443fa7e 100644
--- a/Lib/multiprocessing/connection.py
+++ b/Lib/multiprocessing/connection.py
@@ -12,7 +12,6 @@ __all__ = [ 'Client', 'Listener', 'Pipe', 'wait' ]
import io
import os
import sys
-import pickle
import select
import socket
import struct
@@ -22,9 +21,13 @@ import tempfile
import itertools
import _multiprocessing
-from multiprocessing import current_process, AuthenticationError, BufferTooShort
-from multiprocessing.util import get_temp_dir, Finalize, sub_debug, debug
-from multiprocessing.forking import ForkingPickler
+
+from . import reduction
+from . import util
+
+from . import AuthenticationError, BufferTooShort
+from .reduction import ForkingPickler
+
try:
import _winapi
from _winapi import WAIT_OBJECT_0, WAIT_TIMEOUT, INFINITE
@@ -72,7 +75,7 @@ def arbitrary_address(family):
if family == 'AF_INET':
return ('localhost', 0)
elif family == 'AF_UNIX':
- return tempfile.mktemp(prefix='listener-', dir=get_temp_dir())
+ return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir())
elif family == 'AF_PIPE':
return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' %
(os.getpid(), next(_mmap_counter)))
@@ -132,22 +135,22 @@ class _ConnectionBase:
def _check_closed(self):
if self._handle is None:
- raise IOError("handle is closed")
+ raise OSError("handle is closed")
def _check_readable(self):
if not self._readable:
- raise IOError("connection is write-only")
+ raise OSError("connection is write-only")
def _check_writable(self):
if not self._writable:
- raise IOError("connection is read-only")
+ raise OSError("connection is read-only")
def _bad_message_length(self):
if self._writable:
self._readable = False
else:
self.close()
- raise IOError("bad message length")
+ raise OSError("bad message length")
@property
def closed(self):
@@ -202,9 +205,7 @@ class _ConnectionBase:
"""Send a (picklable) object"""
self._check_closed()
self._check_writable()
- buf = io.BytesIO()
- ForkingPickler(buf, pickle.HIGHEST_PROTOCOL).dump(obj)
- self._send_bytes(buf.getbuffer())
+ self._send_bytes(ForkingPickler.dumps(obj))
def recv_bytes(self, maxlength=None):
"""
@@ -249,7 +250,7 @@ class _ConnectionBase:
self._check_closed()
self._check_readable()
buf = self._recv_bytes()
- return pickle.loads(buf.getbuffer())
+ return ForkingPickler.loads(buf.getbuffer())
def poll(self, timeout=0.0):
"""Whether there is any input available to be read"""
@@ -317,7 +318,7 @@ if _winapi:
return f
elif err == _winapi.ERROR_MORE_DATA:
return self._get_more_data(ov, maxsize)
- except IOError as e:
+ except OSError as e:
if e.winerror == _winapi.ERROR_BROKEN_PIPE:
raise EOFError
else:
@@ -389,7 +390,7 @@ class Connection(_ConnectionBase):
if remaining == size:
raise EOFError
else:
- raise IOError("got end of file during message")
+ raise OSError("got end of file during message")
buf.write(chunk)
remaining -= n
return buf
@@ -449,7 +450,7 @@ class Listener(object):
Returns a `Connection` object.
'''
if self._listener is None:
- raise IOError('listener is closed')
+ raise OSError('listener is closed')
c = self._listener.accept()
if self._authkey:
deliver_challenge(c, self._authkey)
@@ -508,7 +509,7 @@ if sys.platform != 'win32':
c1 = Connection(s1.detach())
c2 = Connection(s2.detach())
else:
- fd1, fd2 = os.pipe()
+ fd1, fd2 = util.pipe()
c1 = Connection(fd1, writable=False)
c2 = Connection(fd2, readable=False)
@@ -580,7 +581,7 @@ class SocketListener(object):
self._last_accepted = None
if family == 'AF_UNIX':
- self._unlink = Finalize(
+ self._unlink = util.Finalize(
self, os.unlink, args=(address,), exitpriority=0
)
else:
@@ -628,8 +629,8 @@ if sys.platform == 'win32':
self._handle_queue = [self._new_handle(first=True)]
self._last_accepted = None
- sub_debug('listener created with address=%r', self._address)
- self.close = Finalize(
+ util.sub_debug('listener created with address=%r', self._address)
+ self.close = util.Finalize(
self, PipeListener._finalize_pipe_listener,
args=(self._handle_queue, self._address), exitpriority=0
)
@@ -671,7 +672,7 @@ if sys.platform == 'win32':
@staticmethod
def _finalize_pipe_listener(queue, address):
- sub_debug('closing listener with address=%r', address)
+ util.sub_debug('closing listener with address=%r', address)
for handle in queue:
_winapi.CloseHandle(handle)
@@ -688,7 +689,7 @@ if sys.platform == 'win32':
0, _winapi.NULL, _winapi.OPEN_EXISTING,
_winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL
)
- except WindowsError as e:
+ except OSError as e:
if e.winerror not in (_winapi.ERROR_SEM_TIMEOUT,
_winapi.ERROR_PIPE_BUSY) or _check_timeout(t):
raise
@@ -922,15 +923,32 @@ else:
#
if sys.platform == 'win32':
- from . import reduction
- ForkingPickler.register(socket.socket, reduction.reduce_socket)
- ForkingPickler.register(Connection, reduction.reduce_connection)
- ForkingPickler.register(PipeConnection, reduction.reduce_pipe_connection)
+ def reduce_connection(conn):
+ handle = conn.fileno()
+ with socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM) as s:
+ from . import resource_sharer
+ ds = resource_sharer.DupSocket(s)
+ return rebuild_connection, (ds, conn.readable, conn.writable)
+ def rebuild_connection(ds, readable, writable):
+ sock = ds.detach()
+ return Connection(sock.detach(), readable, writable)
+ reduction.register(Connection, reduce_connection)
+
+ def reduce_pipe_connection(conn):
+ access = ((_winapi.FILE_GENERIC_READ if conn.readable else 0) |
+ (_winapi.FILE_GENERIC_WRITE if conn.writable else 0))
+ dh = reduction.DupHandle(conn.fileno(), access)
+ return rebuild_pipe_connection, (dh, conn.readable, conn.writable)
+ def rebuild_pipe_connection(dh, readable, writable):
+ handle = dh.detach()
+ return PipeConnection(handle, readable, writable)
+ reduction.register(PipeConnection, reduce_pipe_connection)
+
else:
- try:
- from . import reduction
- except ImportError:
- pass
- else:
- ForkingPickler.register(socket.socket, reduction.reduce_socket)
- ForkingPickler.register(Connection, reduction.reduce_connection)
+ def reduce_connection(conn):
+ df = reduction.DupFd(conn.fileno())
+ return rebuild_connection, (df, conn.readable, conn.writable)
+ def rebuild_connection(df, readable, writable):
+ fd = df.detach()
+ return Connection(fd, readable, writable)
+ reduction.register(Connection, reduce_connection)
diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py
index e31fc61..97f7af7 100644
--- a/Lib/multiprocessing/dummy/__init__.py
+++ b/Lib/multiprocessing/dummy/__init__.py
@@ -4,32 +4,7 @@
# multiprocessing/dummy/__init__.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. 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.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = [
@@ -47,7 +22,7 @@ import sys
import weakref
import array
-from multiprocessing.dummy.connection import Pipe
+from .connection import Pipe
from threading import Lock, RLock, Semaphore, BoundedSemaphore
from threading import Event, Condition, Barrier
from queue import Queue
@@ -138,7 +113,7 @@ def shutdown():
pass
def Pool(processes=None, initializer=None, initargs=()):
- from multiprocessing.pool import ThreadPool
+ from ..pool import ThreadPool
return ThreadPool(processes, initializer, initargs)
JoinableQueue = Queue
diff --git a/Lib/multiprocessing/dummy/connection.py b/Lib/multiprocessing/dummy/connection.py
index 874ec8e..694ef96 100644
--- a/Lib/multiprocessing/dummy/connection.py
+++ b/Lib/multiprocessing/dummy/connection.py
@@ -4,32 +4,7 @@
# multiprocessing/dummy/connection.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. 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.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = [ 'Client', 'Listener', 'Pipe' ]
diff --git a/Lib/multiprocessing/forking.py b/Lib/multiprocessing/forking.py
deleted file mode 100644
index 9793237..0000000
--- a/Lib/multiprocessing/forking.py
+++ /dev/null
@@ -1,474 +0,0 @@
-#
-# Module for starting a process object using os.fork() or CreateProcess()
-#
-# multiprocessing/forking.py
-#
-# Copyright (c) 2006-2008, R Oudkerk
-# Licensed to PSF under a Contributor Agreement.
-#
-
-import os
-import sys
-import signal
-import errno
-
-from multiprocessing import util, process
-
-__all__ = ['Popen', 'assert_spawning', 'duplicate', 'close', 'ForkingPickler']
-
-#
-# Check that the current thread is spawning a child process
-#
-
-def assert_spawning(self):
- if not Popen.thread_is_spawning():
- raise RuntimeError(
- '%s objects should only be shared between processes'
- ' through inheritance' % type(self).__name__
- )
-
-#
-# Try making some callable types picklable
-#
-
-from pickle import Pickler
-from copyreg import dispatch_table
-
-class ForkingPickler(Pickler):
- _extra_reducers = {}
- def __init__(self, *args):
- Pickler.__init__(self, *args)
- self.dispatch_table = dispatch_table.copy()
- self.dispatch_table.update(self._extra_reducers)
- @classmethod
- def register(cls, type, reduce):
- cls._extra_reducers[type] = reduce
-
-def _reduce_method(m):
- if m.__self__ is None:
- return getattr, (m.__class__, m.__func__.__name__)
- else:
- return getattr, (m.__self__, m.__func__.__name__)
-class _C:
- def f(self):
- pass
-ForkingPickler.register(type(_C().f), _reduce_method)
-
-
-def _reduce_method_descriptor(m):
- return getattr, (m.__objclass__, m.__name__)
-ForkingPickler.register(type(list.append), _reduce_method_descriptor)
-ForkingPickler.register(type(int.__add__), _reduce_method_descriptor)
-
-try:
- from functools import partial
-except ImportError:
- pass
-else:
- def _reduce_partial(p):
- return _rebuild_partial, (p.func, p.args, p.keywords or {})
- def _rebuild_partial(func, args, keywords):
- return partial(func, *args, **keywords)
- ForkingPickler.register(partial, _reduce_partial)
-
-#
-# Unix
-#
-
-if sys.platform != 'win32':
- duplicate = os.dup
- close = os.close
-
- #
- # We define a Popen class similar to the one from subprocess, but
- # whose constructor takes a process object as its argument.
- #
-
- class Popen(object):
-
- def __init__(self, process_obj):
- sys.stdout.flush()
- sys.stderr.flush()
- self.returncode = None
-
- r, w = os.pipe()
- self.sentinel = r
-
- self.pid = os.fork()
- if self.pid == 0:
- os.close(r)
- if 'random' in sys.modules:
- import random
- random.seed()
- code = process_obj._bootstrap()
- os._exit(code)
-
- # `w` will be closed when the child exits, at which point `r`
- # will become ready for reading (using e.g. select()).
- os.close(w)
- util.Finalize(self, os.close, (r,))
-
- def poll(self, flag=os.WNOHANG):
- if self.returncode is None:
- while True:
- try:
- pid, sts = os.waitpid(self.pid, flag)
- except os.error as e:
- if e.errno == errno.EINTR:
- continue
- # Child process not yet created. See #1731717
- # e.errno == errno.ECHILD == 10
- return None
- else:
- break
- if pid == self.pid:
- if os.WIFSIGNALED(sts):
- self.returncode = -os.WTERMSIG(sts)
- else:
- assert os.WIFEXITED(sts)
- self.returncode = os.WEXITSTATUS(sts)
- return self.returncode
-
- def wait(self, timeout=None):
- if self.returncode is None:
- if timeout is not None:
- from .connection import wait
- if not wait([self.sentinel], timeout):
- return None
- # This shouldn't block if wait() returned successfully.
- return self.poll(os.WNOHANG if timeout == 0.0 else 0)
- return self.returncode
-
- def terminate(self):
- if self.returncode is None:
- try:
- os.kill(self.pid, signal.SIGTERM)
- except OSError:
- if self.wait(timeout=0.1) is None:
- raise
-
- @staticmethod
- def thread_is_spawning():
- return False
-
-#
-# Windows
-#
-
-else:
- import _thread
- import msvcrt
- import _winapi
-
- from pickle import load, HIGHEST_PROTOCOL
-
- def dump(obj, file, protocol=None):
- ForkingPickler(file, protocol).dump(obj)
-
- #
- #
- #
-
- TERMINATE = 0x10000
- WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False))
- WINSERVICE = sys.executable.lower().endswith("pythonservice.exe")
-
- close = _winapi.CloseHandle
-
- #
- # _python_exe is the assumed path to the python executable.
- # People embedding Python want to modify it.
- #
-
- if WINSERVICE:
- _python_exe = os.path.join(sys.exec_prefix, 'python.exe')
- else:
- _python_exe = sys.executable
-
- def set_executable(exe):
- global _python_exe
- _python_exe = exe
-
- #
- #
- #
-
- def duplicate(handle, target_process=None, inheritable=False):
- if target_process is None:
- target_process = _winapi.GetCurrentProcess()
- return _winapi.DuplicateHandle(
- _winapi.GetCurrentProcess(), handle, target_process,
- 0, inheritable, _winapi.DUPLICATE_SAME_ACCESS
- )
-
- #
- # We define a Popen class similar to the one from subprocess, but
- # whose constructor takes a process object as its argument.
- #
-
- class Popen(object):
- '''
- Start a subprocess to run the code of a process object
- '''
- _tls = _thread._local()
-
- def __init__(self, process_obj):
- cmd = ' '.join('"%s"' % x for x in get_command_line())
- prep_data = get_preparation_data(process_obj._name)
-
- # create pipe for communication with child
- rfd, wfd = os.pipe()
-
- # get handle for read end of the pipe and make it inheritable
- rhandle = duplicate(msvcrt.get_osfhandle(rfd), inheritable=True)
- os.close(rfd)
-
- with open(wfd, 'wb', closefd=True) as to_child:
- # start process
- try:
- hp, ht, pid, tid = _winapi.CreateProcess(
- _python_exe, cmd + (' %s' % rhandle),
- None, None, 1, 0, None, None, None
- )
- _winapi.CloseHandle(ht)
- finally:
- close(rhandle)
-
- # set attributes of self
- self.pid = pid
- self.returncode = None
- self._handle = hp
- self.sentinel = int(hp)
- util.Finalize(self, _winapi.CloseHandle, (self.sentinel,))
-
- # send information to child
- Popen._tls.process_handle = int(hp)
- try:
- dump(prep_data, to_child, HIGHEST_PROTOCOL)
- dump(process_obj, to_child, HIGHEST_PROTOCOL)
- finally:
- del Popen._tls.process_handle
-
- @staticmethod
- def thread_is_spawning():
- return getattr(Popen._tls, 'process_handle', None) is not None
-
- @staticmethod
- def duplicate_for_child(handle):
- return duplicate(handle, Popen._tls.process_handle)
-
- def wait(self, timeout=None):
- if self.returncode is None:
- if timeout is None:
- msecs = _winapi.INFINITE
- else:
- msecs = max(0, int(timeout * 1000 + 0.5))
-
- res = _winapi.WaitForSingleObject(int(self._handle), msecs)
- if res == _winapi.WAIT_OBJECT_0:
- code = _winapi.GetExitCodeProcess(self._handle)
- if code == TERMINATE:
- code = -signal.SIGTERM
- self.returncode = code
-
- return self.returncode
-
- def poll(self):
- return self.wait(timeout=0)
-
- def terminate(self):
- if self.returncode is None:
- try:
- _winapi.TerminateProcess(int(self._handle), TERMINATE)
- except OSError:
- if self.wait(timeout=1.0) is None:
- raise
-
- #
- #
- #
-
- def is_forking(argv):
- '''
- Return whether commandline indicates we are forking
- '''
- if len(argv) >= 2 and argv[1] == '--multiprocessing-fork':
- assert len(argv) == 3
- return True
- else:
- return False
-
-
- def freeze_support():
- '''
- Run code for process object if this in not the main process
- '''
- if is_forking(sys.argv):
- main()
- sys.exit()
-
-
- def get_command_line():
- '''
- Returns prefix of command line used for spawning a child process
- '''
- if getattr(process.current_process(), '_inheriting', False):
- raise RuntimeError('''
- Attempt to start a new process before the current process
- has finished its bootstrapping phase.
-
- This probably means that you are on Windows and you have
- forgotten to use the proper idiom in the main module:
-
- if __name__ == '__main__':
- freeze_support()
- ...
-
- The "freeze_support()" line can be omitted if the program
- is not going to be frozen to produce a Windows executable.''')
-
- if getattr(sys, 'frozen', False):
- return [sys.executable, '--multiprocessing-fork']
- else:
- prog = 'from multiprocessing.forking import main; main()'
- opts = util._args_from_interpreter_flags()
- return [_python_exe] + opts + ['-c', prog, '--multiprocessing-fork']
-
-
- def main():
- '''
- Run code specified by data received over pipe
- '''
- assert is_forking(sys.argv)
-
- handle = int(sys.argv[-1])
- fd = msvcrt.open_osfhandle(handle, os.O_RDONLY)
- from_parent = os.fdopen(fd, 'rb')
-
- process.current_process()._inheriting = True
- preparation_data = load(from_parent)
- prepare(preparation_data)
- self = load(from_parent)
- process.current_process()._inheriting = False
-
- from_parent.close()
-
- exitcode = self._bootstrap()
- sys.exit(exitcode)
-
-
- def get_preparation_data(name):
- '''
- Return info about parent needed by child to unpickle process object
- '''
- from .util import _logger, _log_to_stderr
-
- d = dict(
- name=name,
- sys_path=sys.path,
- sys_argv=sys.argv,
- log_to_stderr=_log_to_stderr,
- orig_dir=process.ORIGINAL_DIR,
- authkey=process.current_process().authkey,
- )
-
- if _logger is not None:
- d['log_level'] = _logger.getEffectiveLevel()
-
- if not WINEXE and not WINSERVICE:
- main_path = getattr(sys.modules['__main__'], '__file__', None)
- if not main_path and sys.argv[0] not in ('', '-c'):
- main_path = sys.argv[0]
- if main_path is not None:
- if not os.path.isabs(main_path) and \
- process.ORIGINAL_DIR is not None:
- main_path = os.path.join(process.ORIGINAL_DIR, main_path)
- d['main_path'] = os.path.normpath(main_path)
-
- return d
-
-#
-# Prepare current process
-#
-
-old_main_modules = []
-
-def prepare(data):
- '''
- Try to get current process ready to unpickle process object
- '''
- old_main_modules.append(sys.modules['__main__'])
-
- if 'name' in data:
- process.current_process().name = data['name']
-
- if 'authkey' in data:
- process.current_process()._authkey = data['authkey']
-
- if 'log_to_stderr' in data and data['log_to_stderr']:
- util.log_to_stderr()
-
- if 'log_level' in data:
- util.get_logger().setLevel(data['log_level'])
-
- if 'sys_path' in data:
- sys.path = data['sys_path']
-
- if 'sys_argv' in data:
- sys.argv = data['sys_argv']
-
- if 'dir' in data:
- os.chdir(data['dir'])
-
- if 'orig_dir' in data:
- process.ORIGINAL_DIR = data['orig_dir']
-
- if 'main_path' in data:
- # XXX (ncoghlan): The following code makes several bogus
- # assumptions regarding the relationship between __file__
- # and a module's real name. See PEP 302 and issue #10845
- main_path = data['main_path']
- main_name = os.path.splitext(os.path.basename(main_path))[0]
- if main_name == '__init__':
- main_name = os.path.basename(os.path.dirname(main_path))
-
- if main_name == '__main__':
- main_module = sys.modules['__main__']
- main_module.__file__ = main_path
- elif main_name != 'ipython':
- # Main modules not actually called __main__.py may
- # contain additional code that should still be executed
- import imp
-
- if main_path is None:
- dirs = None
- elif os.path.basename(main_path).startswith('__init__.py'):
- dirs = [os.path.dirname(os.path.dirname(main_path))]
- else:
- dirs = [os.path.dirname(main_path)]
-
- assert main_name not in sys.modules, main_name
- file, path_name, etc = imp.find_module(main_name, dirs)
- try:
- # We would like to do "imp.load_module('__main__', ...)"
- # here. However, that would cause 'if __name__ ==
- # "__main__"' clauses to be executed.
- main_module = imp.load_module(
- '__parents_main__', file, path_name, etc
- )
- finally:
- if file:
- file.close()
-
- sys.modules['__main__'] = main_module
- main_module.__name__ = '__main__'
-
- # Try to make the potentially picklable objects in
- # sys.modules['__main__'] realize they are in the main
- # module -- somewhat ugly.
- for obj in list(main_module.__dict__.values()):
- try:
- if obj.__module__ == '__parents_main__':
- obj.__module__ = '__main__'
- except Exception:
- pass
diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py
new file mode 100644
index 0000000..628808e
--- /dev/null
+++ b/Lib/multiprocessing/forkserver.py
@@ -0,0 +1,238 @@
+import errno
+import os
+import select
+import signal
+import socket
+import struct
+import sys
+import threading
+
+from . import connection
+from . import process
+from . import reduction
+from . import spawn
+from . import util
+
+__all__ = ['ensure_running', 'get_inherited_fds', 'connect_to_new_process',
+ 'set_forkserver_preload']
+
+#
+#
+#
+
+MAXFDS_TO_SEND = 256
+UNSIGNED_STRUCT = struct.Struct('Q') # large enough for pid_t
+
+_inherited_fds = None
+_lock = threading.Lock()
+_preload_modules = ['__main__']
+
+
+#
+# Public function
+#
+
+def set_forkserver_preload(modules_names):
+ '''Set list of module names to try to load in forkserver process.'''
+ global _preload_modules
+ _preload_modules = modules_names
+
+
+def get_inherited_fds():
+ '''Return list of fds inherited from parent process.
+
+ This returns None if the current process was not started by fork server.
+ '''
+ return _inherited_fds
+
+
+def connect_to_new_process(fds):
+ '''Request forkserver to create a child process.
+
+ Returns a pair of fds (status_r, data_w). The calling process can read
+ the child process's pid and (eventually) its returncode from status_r.
+ The calling process should write to data_w the pickled preparation and
+ process data.
+ '''
+ if len(fds) + 3 >= MAXFDS_TO_SEND:
+ raise ValueError('too many fds')
+ address, alive_w = process.current_process()._config['forkserver_info']
+ with socket.socket(socket.AF_UNIX) as client:
+ client.connect(address)
+ parent_r, child_w = util.pipe()
+ child_r, parent_w = util.pipe()
+ allfds = [child_r, child_w, alive_w]
+ allfds += fds
+ try:
+ reduction.sendfds(client, allfds)
+ return parent_r, parent_w
+ except:
+ os.close(parent_r)
+ os.close(parent_w)
+ raise
+ finally:
+ os.close(child_r)
+ os.close(child_w)
+
+
+def ensure_running():
+ '''Make sure that a fork server is running.
+
+ This can be called from any process. Note that usually a child
+ process will just reuse the forkserver started by its parent, so
+ ensure_running() will do nothing.
+ '''
+ with _lock:
+ config = process.current_process()._config
+ if config.get('forkserver_info') is not None:
+ return
+
+ assert all(type(mod) is str for mod in _preload_modules)
+ semaphore_tracker_fd = config['semaphore_tracker_fd']
+ cmd = ('from multiprocessing.forkserver import main; ' +
+ 'main(%d, %d, %r, **%r)')
+
+ if _preload_modules:
+ desired_keys = {'main_path', 'sys_path'}
+ data = spawn.get_preparation_data('ignore')
+ data = dict((x,y) for (x,y) in data.items() if x in desired_keys)
+ else:
+ data = {}
+
+ with socket.socket(socket.AF_UNIX) as listener:
+ address = connection.arbitrary_address('AF_UNIX')
+ listener.bind(address)
+ os.chmod(address, 0o600)
+ listener.listen(100)
+
+ # all client processes own the write end of the "alive" pipe;
+ # when they all terminate the read end becomes ready.
+ alive_r, alive_w = os.pipe()
+ config['forkserver_info'] = (address, alive_w)
+ fds_to_pass = [listener.fileno(), alive_r, semaphore_tracker_fd]
+ cmd %= (listener.fileno(), alive_r, _preload_modules, data)
+ exe = spawn.get_executable()
+ args = [exe] + util._args_from_interpreter_flags() + ['-c', cmd]
+ pid = util.spawnv_passfds(exe, args, fds_to_pass)
+
+
+def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
+ '''Run forkserver.'''
+ if preload:
+ if '__main__' in preload and main_path is not None:
+ process.current_process()._inheriting = True
+ try:
+ spawn.import_main_path(main_path)
+ finally:
+ del process.current_process()._inheriting
+ for modname in preload:
+ try:
+ __import__(modname)
+ except ImportError:
+ pass
+
+ # close sys.stdin
+ if sys.stdin is not None:
+ try:
+ sys.stdin.close()
+ sys.stdin = open(os.devnull)
+ except (OSError, ValueError):
+ pass
+
+ # ignoring SIGCHLD means no need to reap zombie processes
+ handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN)
+ with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener:
+ readers = [listener, alive_r]
+
+ while True:
+ try:
+ rfds, wfds, xfds = select.select(readers, [], [])
+
+ if alive_r in rfds:
+ # EOF because no more client processes left
+ assert os.read(alive_r, 1) == b''
+ raise SystemExit
+
+ assert listener in rfds
+ with listener.accept()[0] as s:
+ code = 1
+ if os.fork() == 0:
+ try:
+ _serve_one(s, listener, alive_r, handler)
+ except Exception:
+ sys.excepthook(*sys.exc_info())
+ sys.stderr.flush()
+ finally:
+ os._exit(code)
+
+ except InterruptedError:
+ pass
+ except OSError as e:
+ if e.errno != errno.ECONNABORTED:
+ raise
+
+#
+# Code to bootstrap new process
+#
+
+def _serve_one(s, listener, alive_r, handler):
+ global _inherited_fds
+
+ # close unnecessary stuff and reset SIGCHLD handler
+ listener.close()
+ os.close(alive_r)
+ signal.signal(signal.SIGCHLD, handler)
+
+ # receive fds from parent process
+ fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1)
+ s.close()
+ assert len(fds) <= MAXFDS_TO_SEND
+ child_r, child_w, alive_w, *_inherited_fds = fds
+
+ # send pid to client processes
+ write_unsigned(child_w, os.getpid())
+
+ # reseed random number generator
+ if 'random' in sys.modules:
+ import random
+ random.seed()
+
+ # run process object received over pipe
+ code = spawn._main(child_r)
+
+ # write the exit code to the pipe
+ write_unsigned(child_w, code)
+
+#
+# Read and write unsigned numbers
+#
+
+def read_unsigned(fd):
+ data = b''
+ length = UNSIGNED_STRUCT.size
+ while len(data) < length:
+ while True:
+ try:
+ s = os.read(fd, length - len(data))
+ except InterruptedError:
+ pass
+ else:
+ break
+ if not s:
+ raise EOFError('unexpected EOF')
+ data += s
+ return UNSIGNED_STRUCT.unpack(data)[0]
+
+def write_unsigned(fd, n):
+ msg = UNSIGNED_STRUCT.pack(n)
+ while msg:
+ while True:
+ try:
+ nbytes = os.write(fd, msg)
+ except InterruptedError:
+ pass
+ else:
+ break
+ if nbytes == 0:
+ raise RuntimeError('should not get here')
+ msg = msg[nbytes:]
diff --git a/Lib/multiprocessing/heap.py b/Lib/multiprocessing/heap.py
index e63fdb8..b95f90f 100644
--- a/Lib/multiprocessing/heap.py
+++ b/Lib/multiprocessing/heap.py
@@ -8,15 +8,17 @@
#
import bisect
+import itertools
import mmap
import os
import sys
+import tempfile
import threading
-import itertools
-
import _multiprocessing
-from multiprocessing.util import Finalize, info
-from multiprocessing.forking import assert_spawning
+
+from . import popen
+from . import reduction
+from . import util
__all__ = ['BufferWrapper']
@@ -30,17 +32,25 @@ if sys.platform == 'win32':
class Arena(object):
- _counter = itertools.count()
+ _rand = tempfile._RandomNameSequence()
def __init__(self, size):
self.size = size
- self.name = 'pym-%d-%d' % (os.getpid(), next(Arena._counter))
- self.buffer = mmap.mmap(-1, self.size, tagname=self.name)
- assert _winapi.GetLastError() == 0, 'tagname already in use'
+ for i in range(100):
+ name = 'pym-%d-%s' % (os.getpid(), next(self._rand))
+ buf = mmap.mmap(-1, size, tagname=name)
+ if _winapi.GetLastError() == 0:
+ break
+ # We have reopened a preexisting mmap.
+ buf.close()
+ else:
+ raise FileExistsError('Cannot find name for new mmap')
+ self.name = name
+ self.buffer = buf
self._state = (self.size, self.name)
def __getstate__(self):
- assert_spawning(self)
+ popen.assert_spawning(self)
return self._state
def __setstate__(self, state):
@@ -52,10 +62,28 @@ else:
class Arena(object):
- def __init__(self, size):
- self.buffer = mmap.mmap(-1, size)
+ def __init__(self, size, fd=-1):
self.size = size
- self.name = None
+ self.fd = fd
+ if fd == -1:
+ self.fd, name = tempfile.mkstemp(
+ prefix='pym-%d-'%os.getpid(), dir=util.get_temp_dir())
+ os.unlink(name)
+ util.Finalize(self, os.close, (self.fd,))
+ with open(self.fd, 'wb', closefd=False) as f:
+ f.write(b'\0'*size)
+ self.buffer = mmap.mmap(self.fd, self.size)
+
+ def reduce_arena(a):
+ if a.fd == -1:
+ raise ValueError('Arena is unpicklable because '
+ 'forking was enabled when it was created')
+ return rebuild_arena, (a.size, reduction.DupFd(a.fd))
+
+ def rebuild_arena(size, dupfd):
+ return Arena(size, dupfd.detach())
+
+ reduction.register(Arena, reduce_arena)
#
# Class allowing allocation of chunks of memory from arenas
@@ -90,7 +118,7 @@ class Heap(object):
if i == len(self._lengths):
length = self._roundup(max(self._size, size), mmap.PAGESIZE)
self._size *= 2
- info('allocating a new mmap of length %d', length)
+ util.info('allocating a new mmap of length %d', length)
arena = Arena(length)
self._arenas.append(arena)
return (arena, 0, length)
@@ -216,7 +244,7 @@ class BufferWrapper(object):
assert 0 <= size < sys.maxsize
block = BufferWrapper._heap.malloc(size)
self._state = (block, size)
- Finalize(self, BufferWrapper._heap.free, args=(block,))
+ util.Finalize(self, BufferWrapper._heap.free, args=(block,))
def create_memoryview(self):
(arena, start, stop), size = self._state
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py
index 96056b0..f580e9e 100644
--- a/Lib/multiprocessing/managers.py
+++ b/Lib/multiprocessing/managers.py
@@ -19,11 +19,15 @@ import threading
import array
import queue
-from traceback import format_exc
-from multiprocessing import Process, current_process, active_children, Pool, util, connection
-from multiprocessing.process import AuthenticationString
-from multiprocessing.forking import Popen, ForkingPickler
from time import time as _time
+from traceback import format_exc
+
+from . import connection
+from . import pool
+from . import process
+from . import popen
+from . import reduction
+from . import util
#
# Register some things for pickling
@@ -31,16 +35,14 @@ from time import time as _time
def reduce_array(a):
return array.array, (a.typecode, a.tobytes())
-ForkingPickler.register(array.array, reduce_array)
+reduction.register(array.array, reduce_array)
view_types = [type(getattr({}, name)()) for name in ('items','keys','values')]
if view_types[0] is not list: # only needed in Py3.0
def rebuild_as_list(obj):
return list, (list(obj),)
for view_type in view_types:
- ForkingPickler.register(view_type, rebuild_as_list)
- import copyreg
- copyreg.pickle(view_type, rebuild_as_list)
+ reduction.register(view_type, rebuild_as_list)
#
# Type for identifying shared objects
@@ -130,7 +132,7 @@ class Server(object):
def __init__(self, registry, address, authkey, serializer):
assert isinstance(authkey, bytes)
self.registry = registry
- self.authkey = AuthenticationString(authkey)
+ self.authkey = process.AuthenticationString(authkey)
Listener, Client = listener_client[serializer]
# do authentication later
@@ -146,7 +148,7 @@ class Server(object):
Run the server forever
'''
self.stop_event = threading.Event()
- current_process()._manager_server = self
+ process.current_process()._manager_server = self
try:
accepter = threading.Thread(target=self.accepter)
accepter.daemon = True
@@ -167,7 +169,7 @@ class Server(object):
while True:
try:
c = self.listener.accept()
- except (OSError, IOError):
+ except OSError:
continue
t = threading.Thread(target=self.handle_request, args=(c,))
t.daemon = True
@@ -438,9 +440,9 @@ class BaseManager(object):
def __init__(self, address=None, authkey=None, serializer='pickle'):
if authkey is None:
- authkey = current_process().authkey
+ authkey = process.current_process().authkey
self._address = address # XXX not final address if eg ('', 0)
- self._authkey = AuthenticationString(authkey)
+ self._authkey = process.AuthenticationString(authkey)
self._state = State()
self._state.value = State.INITIAL
self._serializer = serializer
@@ -476,7 +478,7 @@ class BaseManager(object):
reader, writer = connection.Pipe(duplex=False)
# spawn process which runs a server
- self._process = Process(
+ self._process = process.Process(
target=type(self)._run_server,
args=(self._registry, self._address, self._authkey,
self._serializer, writer, initializer, initargs),
@@ -691,11 +693,11 @@ class BaseProxy(object):
self._Client = listener_client[serializer][1]
if authkey is not None:
- self._authkey = AuthenticationString(authkey)
+ self._authkey = process.AuthenticationString(authkey)
elif self._manager is not None:
self._authkey = self._manager._authkey
else:
- self._authkey = current_process().authkey
+ self._authkey = process.current_process().authkey
if incref:
self._incref()
@@ -704,7 +706,7 @@ class BaseProxy(object):
def _connect(self):
util.debug('making connection to manager')
- name = current_process().name
+ name = process.current_process().name
if threading.current_thread().name != 'MainThread':
name += '|' + threading.current_thread().name
conn = self._Client(self._token.address, authkey=self._authkey)
@@ -798,7 +800,7 @@ class BaseProxy(object):
def __reduce__(self):
kwds = {}
- if Popen.thread_is_spawning():
+ if popen.get_spawning_popen() is not None:
kwds['authkey'] = self._authkey
if getattr(self, '_isauto', False):
@@ -835,14 +837,14 @@ def RebuildProxy(func, token, serializer, kwds):
If possible the shared object is returned, or otherwise a proxy for it.
'''
- server = getattr(current_process(), '_manager_server', None)
+ server = getattr(process.current_process(), '_manager_server', None)
if server and server.address == token.address:
return server.id_to_obj[token.id][0]
else:
incref = (
kwds.pop('incref', True) and
- not getattr(current_process(), '_inheriting', False)
+ not getattr(process.current_process(), '_inheriting', False)
)
return func(token, serializer, incref=incref, **kwds)
@@ -889,7 +891,7 @@ def AutoProxy(token, serializer, manager=None, authkey=None,
if authkey is None and manager is not None:
authkey = manager._authkey
if authkey is None:
- authkey = current_process().authkey
+ authkey = process.current_process().authkey
ProxyType = MakeProxyType('AutoProxy[%s]' % token.typeid, exposed)
proxy = ProxyType(token, serializer, manager=manager, authkey=authkey,
@@ -1109,7 +1111,7 @@ SyncManager.register('BoundedSemaphore', threading.BoundedSemaphore,
AcquirerProxy)
SyncManager.register('Condition', threading.Condition, ConditionProxy)
SyncManager.register('Barrier', threading.Barrier, BarrierProxy)
-SyncManager.register('Pool', Pool, PoolProxy)
+SyncManager.register('Pool', pool.Pool, PoolProxy)
SyncManager.register('list', list, ListProxy)
SyncManager.register('dict', dict, DictProxy)
SyncManager.register('Value', Value, ValueProxy)
diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
index fc9d904..1cecd09 100644
--- a/Lib/multiprocessing/pool.py
+++ b/Lib/multiprocessing/pool.py
@@ -7,7 +7,7 @@
# Licensed to PSF under a Contributor Agreement.
#
-__all__ = ['Pool']
+__all__ = ['Pool', 'ThreadPool']
#
# Imports
@@ -17,10 +17,14 @@ import threading
import queue
import itertools
import collections
+import os
import time
+import traceback
-from multiprocessing import Process, cpu_count, TimeoutError
-from multiprocessing.util import Finalize, debug
+# If threading is available then ThreadPool should be provided. Therefore
+# we avoid top-level imports which are liable to fail on some systems.
+from . import util
+from . import Process, cpu_count, TimeoutError, SimpleQueue
#
# Constants representing the state of a pool
@@ -43,6 +47,29 @@ def starmapstar(args):
return list(itertools.starmap(args[0], args[1]))
#
+# Hack to embed stringification of remote traceback in local traceback
+#
+
+class RemoteTraceback(Exception):
+ def __init__(self, tb):
+ self.tb = tb
+ def __str__(self):
+ return self.tb
+
+class ExceptionWithTraceback:
+ def __init__(self, exc, tb):
+ tb = traceback.format_exception(type(exc), exc, tb)
+ tb = ''.join(tb)
+ self.exc = exc
+ self.tb = '\n"""\n%s"""' % tb
+ def __reduce__(self):
+ return rebuild_exc, (self.exc, self.tb)
+
+def rebuild_exc(exc, tb):
+ exc.__cause__ = RemoteTraceback(tb)
+ return exc
+
+#
# Code run by worker processes
#
@@ -78,28 +105,29 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None):
while maxtasks is None or (maxtasks and completed < maxtasks):
try:
task = get()
- except (EOFError, IOError):
- debug('worker got EOFError or IOError -- exiting')
+ except (EOFError, OSError):
+ util.debug('worker got EOFError or OSError -- exiting')
break
if task is None:
- debug('worker got sentinel -- exiting')
+ util.debug('worker got sentinel -- exiting')
break
job, i, func, args, kwds = task
try:
result = (True, func(*args, **kwds))
except Exception as e:
+ e = ExceptionWithTraceback(e, e.__traceback__)
result = (False, e)
try:
put((job, i, result))
except Exception as e:
wrapped = MaybeEncodingError(e, result[1])
- debug("Possible encoding error while sending result: %s" % (
+ util.debug("Possible encoding error while sending result: %s" % (
wrapped))
put((job, i, (False, wrapped)))
completed += 1
- debug('worker exiting after %d tasks' % completed)
+ util.debug('worker exiting after %d tasks' % completed)
#
# Class representing a process pool
@@ -122,10 +150,7 @@ class Pool(object):
self._initargs = initargs
if processes is None:
- try:
- processes = cpu_count()
- except NotImplementedError:
- processes = 1
+ processes = os.cpu_count() or 1
if processes < 1:
raise ValueError("Number of processes must be at least 1")
@@ -161,7 +186,7 @@ class Pool(object):
self._result_handler._state = RUN
self._result_handler.start()
- self._terminate = Finalize(
+ self._terminate = util.Finalize(
self, self._terminate_pool,
args=(self._taskqueue, self._inqueue, self._outqueue, self._pool,
self._worker_handler, self._task_handler,
@@ -178,7 +203,7 @@ class Pool(object):
worker = self._pool[i]
if worker.exitcode is not None:
# worker exited
- debug('cleaning up worker %d' % i)
+ util.debug('cleaning up worker %d' % i)
worker.join()
cleaned = True
del self._pool[i]
@@ -198,7 +223,7 @@ class Pool(object):
w.name = w.name.replace('Process', 'PoolWorker')
w.daemon = True
w.start()
- debug('added worker')
+ util.debug('added worker')
def _maintain_pool(self):
"""Clean up any exited workers and start replacements for them.
@@ -207,7 +232,6 @@ class Pool(object):
self._repopulate_pool()
def _setup_queues(self):
- from .queues import SimpleQueue
self._inqueue = SimpleQueue()
self._outqueue = SimpleQueue()
self._quick_put = self._inqueue._writer.send
@@ -335,7 +359,7 @@ class Pool(object):
time.sleep(0.1)
# send sentinel to stop workers
pool._taskqueue.put(None)
- debug('worker handler exiting')
+ util.debug('worker handler exiting')
@staticmethod
def _handle_tasks(taskqueue, put, outqueue, pool):
@@ -345,36 +369,36 @@ class Pool(object):
i = -1
for i, task in enumerate(taskseq):
if thread._state:
- debug('task handler found thread._state != RUN')
+ util.debug('task handler found thread._state != RUN')
break
try:
put(task)
- except IOError:
- debug('could not put task on queue')
+ except OSError:
+ util.debug('could not put task on queue')
break
else:
if set_length:
- debug('doing set_length()')
+ util.debug('doing set_length()')
set_length(i+1)
continue
break
else:
- debug('task handler got sentinel')
+ util.debug('task handler got sentinel')
try:
# tell result handler to finish when cache is empty
- debug('task handler sending sentinel to result handler')
+ util.debug('task handler sending sentinel to result handler')
outqueue.put(None)
# tell workers there is no more work
- debug('task handler sending sentinel to workers')
+ util.debug('task handler sending sentinel to workers')
for p in pool:
put(None)
- except IOError:
- debug('task handler got IOError when sending sentinels')
+ except OSError:
+ util.debug('task handler got OSError when sending sentinels')
- debug('task handler exiting')
+ util.debug('task handler exiting')
@staticmethod
def _handle_results(outqueue, get, cache):
@@ -383,17 +407,17 @@ class Pool(object):
while 1:
try:
task = get()
- except (IOError, EOFError):
- debug('result handler got EOFError/IOError -- exiting')
+ except (OSError, EOFError):
+ util.debug('result handler got EOFError/OSError -- exiting')
return
if thread._state:
assert thread._state == TERMINATE
- debug('result handler found thread._state=TERMINATE')
+ util.debug('result handler found thread._state=TERMINATE')
break
if task is None:
- debug('result handler got sentinel')
+ util.debug('result handler got sentinel')
break
job, i, obj = task
@@ -405,12 +429,12 @@ class Pool(object):
while cache and thread._state != TERMINATE:
try:
task = get()
- except (IOError, EOFError):
- debug('result handler got EOFError/IOError -- exiting')
+ except (OSError, EOFError):
+ util.debug('result handler got EOFError/OSError -- exiting')
return
if task is None:
- debug('result handler ignoring extra sentinel')
+ util.debug('result handler ignoring extra sentinel')
continue
job, i, obj = task
try:
@@ -419,7 +443,7 @@ class Pool(object):
pass
if hasattr(outqueue, '_reader'):
- debug('ensuring that outqueue is not full')
+ util.debug('ensuring that outqueue is not full')
# If we don't make room available in outqueue then
# attempts to add the sentinel (None) to outqueue may
# block. There is guaranteed to be no more than 2 sentinels.
@@ -428,10 +452,10 @@ class Pool(object):
if not outqueue._reader.poll():
break
get()
- except (IOError, EOFError):
+ except (OSError, EOFError):
pass
- debug('result handler exiting: len(cache)=%s, thread._state=%s',
+ util.debug('result handler exiting: len(cache)=%s, thread._state=%s',
len(cache), thread._state)
@staticmethod
@@ -449,19 +473,19 @@ class Pool(object):
)
def close(self):
- debug('closing pool')
+ util.debug('closing pool')
if self._state == RUN:
self._state = CLOSE
self._worker_handler._state = CLOSE
def terminate(self):
- debug('terminating pool')
+ util.debug('terminating pool')
self._state = TERMINATE
self._worker_handler._state = TERMINATE
self._terminate()
def join(self):
- debug('joining pool')
+ util.debug('joining pool')
assert self._state in (CLOSE, TERMINATE)
self._worker_handler.join()
self._task_handler.join()
@@ -472,7 +496,7 @@ class Pool(object):
@staticmethod
def _help_stuff_finish(inqueue, task_handler, size):
# task_handler may be blocked trying to put items on inqueue
- debug('removing tasks from inqueue until task handler finished')
+ util.debug('removing tasks from inqueue until task handler finished')
inqueue._rlock.acquire()
while task_handler.is_alive() and inqueue._reader.poll():
inqueue._reader.recv()
@@ -482,12 +506,12 @@ class Pool(object):
def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool,
worker_handler, task_handler, result_handler, cache):
# this is guaranteed to only be called once
- debug('finalizing pool')
+ util.debug('finalizing pool')
worker_handler._state = TERMINATE
task_handler._state = TERMINATE
- debug('helping task handler/workers to finish')
+ util.debug('helping task handler/workers to finish')
cls._help_stuff_finish(inqueue, task_handler, len(pool))
assert result_handler.is_alive() or len(cache) == 0
@@ -497,31 +521,31 @@ class Pool(object):
# We must wait for the worker handler to exit before terminating
# workers because we don't want workers to be restarted behind our back.
- debug('joining worker handler')
+ util.debug('joining worker handler')
if threading.current_thread() is not worker_handler:
worker_handler.join()
# Terminate workers which haven't already finished.
if pool and hasattr(pool[0], 'terminate'):
- debug('terminating workers')
+ util.debug('terminating workers')
for p in pool:
if p.exitcode is None:
p.terminate()
- debug('joining task handler')
+ util.debug('joining task handler')
if threading.current_thread() is not task_handler:
task_handler.join()
- debug('joining result handler')
+ util.debug('joining result handler')
if threading.current_thread() is not result_handler:
result_handler.join()
if pool and hasattr(pool[0], 'terminate'):
- debug('joining pool workers')
+ util.debug('joining pool workers')
for p in pool:
if p.is_alive():
# worker has not yet exited
- debug('cleaning up worker %d' % p.pid)
+ util.debug('cleaning up worker %d' % p.pid)
p.join()
def __enter__(self):
@@ -707,7 +731,10 @@ class IMapUnorderedIterator(IMapIterator):
class ThreadPool(Pool):
- from .dummy import Process
+ @staticmethod
+ def Process(*args, **kwds):
+ from .dummy import Process
+ return Process(*args, **kwds)
def __init__(self, processes=None, initializer=None, initargs=()):
Pool.__init__(self, processes, initializer, initargs)
diff --git a/Lib/multiprocessing/popen.py b/Lib/multiprocessing/popen.py
new file mode 100644
index 0000000..b0c80d5
--- /dev/null
+++ b/Lib/multiprocessing/popen.py
@@ -0,0 +1,78 @@
+import sys
+import threading
+
+__all__ = ['Popen', 'get_spawning_popen', 'set_spawning_popen',
+ 'assert_spawning']
+
+#
+# Check that the current thread is spawning a child process
+#
+
+_tls = threading.local()
+
+def get_spawning_popen():
+ return getattr(_tls, 'spawning_popen', None)
+
+def set_spawning_popen(popen):
+ _tls.spawning_popen = popen
+
+def assert_spawning(obj):
+ if get_spawning_popen() is None:
+ raise RuntimeError(
+ '%s objects should only be shared between processes'
+ ' through inheritance' % type(obj).__name__
+ )
+
+#
+#
+#
+
+_Popen = None
+
+def Popen(process_obj):
+ if _Popen is None:
+ set_start_method()
+ return _Popen(process_obj)
+
+def get_start_method():
+ if _Popen is None:
+ set_start_method()
+ return _Popen.method
+
+def set_start_method(meth=None, *, start_helpers=True):
+ global _Popen
+ try:
+ modname = _method_to_module[meth]
+ __import__(modname)
+ except (KeyError, ImportError):
+ raise ValueError('could not use start method %r' % meth)
+ module = sys.modules[modname]
+ if start_helpers:
+ module.Popen.ensure_helpers_running()
+ _Popen = module.Popen
+
+
+if sys.platform == 'win32':
+
+ _method_to_module = {
+ None: 'multiprocessing.popen_spawn_win32',
+ 'spawn': 'multiprocessing.popen_spawn_win32',
+ }
+
+ def get_all_start_methods():
+ return ['spawn']
+
+else:
+ _method_to_module = {
+ None: 'multiprocessing.popen_fork',
+ 'fork': 'multiprocessing.popen_fork',
+ 'spawn': 'multiprocessing.popen_spawn_posix',
+ 'forkserver': 'multiprocessing.popen_forkserver',
+ }
+
+ def get_all_start_methods():
+ from . import reduction
+ if reduction.HAVE_SEND_HANDLE:
+ return ['fork', 'spawn', 'forkserver']
+ else:
+ return ['fork', 'spawn']
diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py
new file mode 100644
index 0000000..fd25ddc
--- /dev/null
+++ b/Lib/multiprocessing/popen_fork.py
@@ -0,0 +1,87 @@
+import os
+import sys
+import signal
+import errno
+
+from . import util
+
+__all__ = ['Popen']
+
+#
+# Start child process using fork
+#
+
+class Popen(object):
+ method = 'fork'
+
+ def __init__(self, process_obj):
+ sys.stdout.flush()
+ sys.stderr.flush()
+ self.returncode = None
+ self._launch(process_obj)
+
+ def duplicate_for_child(self, fd):
+ return fd
+
+ def poll(self, flag=os.WNOHANG):
+ if self.returncode is None:
+ while True:
+ try:
+ pid, sts = os.waitpid(self.pid, flag)
+ except OSError as e:
+ if e.errno == errno.EINTR:
+ continue
+ # Child process not yet created. See #1731717
+ # e.errno == errno.ECHILD == 10
+ return None
+ else:
+ break
+ if pid == self.pid:
+ if os.WIFSIGNALED(sts):
+ self.returncode = -os.WTERMSIG(sts)
+ else:
+ assert os.WIFEXITED(sts)
+ self.returncode = os.WEXITSTATUS(sts)
+ return self.returncode
+
+ def wait(self, timeout=None):
+ if self.returncode is None:
+ if timeout is not None:
+ from .connection import wait
+ if not wait([self.sentinel], timeout):
+ return None
+ # This shouldn't block if wait() returned successfully.
+ return self.poll(os.WNOHANG if timeout == 0.0 else 0)
+ return self.returncode
+
+ def terminate(self):
+ if self.returncode is None:
+ try:
+ os.kill(self.pid, signal.SIGTERM)
+ except ProcessLookupError:
+ pass
+ except OSError:
+ if self.wait(timeout=0.1) is None:
+ raise
+
+ def _launch(self, process_obj):
+ code = 1
+ parent_r, child_w = util.pipe()
+ self.pid = os.fork()
+ if self.pid == 0:
+ try:
+ os.close(parent_r)
+ if 'random' in sys.modules:
+ import random
+ random.seed()
+ code = process_obj._bootstrap()
+ finally:
+ os._exit(code)
+ else:
+ os.close(child_w)
+ util.Finalize(self, os.close, (parent_r,))
+ self.sentinel = parent_r
+
+ @staticmethod
+ def ensure_helpers_running():
+ pass
diff --git a/Lib/multiprocessing/popen_forkserver.py b/Lib/multiprocessing/popen_forkserver.py
new file mode 100644
index 0000000..f1c4b57
--- /dev/null
+++ b/Lib/multiprocessing/popen_forkserver.py
@@ -0,0 +1,75 @@
+import io
+import os
+
+from . import reduction
+if not reduction.HAVE_SEND_HANDLE:
+ raise ImportError('No support for sending fds between processes')
+from . import forkserver
+from . import popen
+from . import popen_fork
+from . import spawn
+from . import util
+
+
+__all__ = ['Popen']
+
+#
+# Wrapper for an fd used while launching a process
+#
+
+class _DupFd(object):
+ def __init__(self, ind):
+ self.ind = ind
+ def detach(self):
+ return forkserver.get_inherited_fds()[self.ind]
+
+#
+# Start child process using a server process
+#
+
+class Popen(popen_fork.Popen):
+ method = 'forkserver'
+ DupFd = _DupFd
+
+ def __init__(self, process_obj):
+ self._fds = []
+ super().__init__(process_obj)
+
+ def duplicate_for_child(self, fd):
+ self._fds.append(fd)
+ return len(self._fds) - 1
+
+ def _launch(self, process_obj):
+ prep_data = spawn.get_preparation_data(process_obj._name)
+ buf = io.BytesIO()
+ popen.set_spawning_popen(self)
+ try:
+ reduction.dump(prep_data, buf)
+ reduction.dump(process_obj, buf)
+ finally:
+ popen.set_spawning_popen(None)
+
+ self.sentinel, w = forkserver.connect_to_new_process(self._fds)
+ util.Finalize(self, os.close, (self.sentinel,))
+ with open(w, 'wb', closefd=True) as f:
+ f.write(buf.getbuffer())
+ self.pid = forkserver.read_unsigned(self.sentinel)
+
+ def poll(self, flag=os.WNOHANG):
+ if self.returncode is None:
+ from .connection import wait
+ timeout = 0 if flag == os.WNOHANG else None
+ if not wait([self.sentinel], timeout):
+ return None
+ try:
+ self.returncode = forkserver.read_unsigned(self.sentinel)
+ except (OSError, EOFError):
+ # The process ended abnormally perhaps because of a signal
+ self.returncode = 255
+ return self.returncode
+
+ @staticmethod
+ def ensure_helpers_running():
+ from . import semaphore_tracker
+ semaphore_tracker.ensure_running()
+ forkserver.ensure_running()
diff --git a/Lib/multiprocessing/popen_spawn_posix.py b/Lib/multiprocessing/popen_spawn_posix.py
new file mode 100644
index 0000000..de262aa
--- /dev/null
+++ b/Lib/multiprocessing/popen_spawn_posix.py
@@ -0,0 +1,75 @@
+import fcntl
+import io
+import os
+
+from . import popen
+from . import popen_fork
+from . import reduction
+from . import spawn
+from . import util
+
+from . import current_process
+
+__all__ = ['Popen']
+
+
+#
+# Wrapper for an fd used while launching a process
+#
+
+class _DupFd(object):
+ def __init__(self, fd):
+ self.fd = fd
+ def detach(self):
+ return self.fd
+
+#
+# Start child process using a fresh interpreter
+#
+
+class Popen(popen_fork.Popen):
+ method = 'spawn'
+ DupFd = _DupFd
+
+ def __init__(self, process_obj):
+ self._fds = []
+ super().__init__(process_obj)
+
+ def duplicate_for_child(self, fd):
+ self._fds.append(fd)
+ return fd
+
+ def _launch(self, process_obj):
+ tracker_fd = current_process()._config['semaphore_tracker_fd']
+ self._fds.append(tracker_fd)
+ prep_data = spawn.get_preparation_data(process_obj._name)
+ fp = io.BytesIO()
+ popen.set_spawning_popen(self)
+ try:
+ reduction.dump(prep_data, fp)
+ reduction.dump(process_obj, fp)
+ finally:
+ popen.set_spawning_popen(None)
+
+ parent_r = child_w = child_r = parent_w = None
+ try:
+ parent_r, child_w = util.pipe()
+ child_r, parent_w = util.pipe()
+ cmd = spawn.get_command_line() + [str(child_r)]
+ self._fds.extend([child_r, child_w])
+ self.pid = util.spawnv_passfds(spawn.get_executable(),
+ cmd, self._fds)
+ self.sentinel = parent_r
+ with open(parent_w, 'wb', closefd=False) as f:
+ f.write(fp.getbuffer())
+ finally:
+ if parent_r is not None:
+ util.Finalize(self, os.close, (parent_r,))
+ for fd in (child_r, child_w, parent_w):
+ if fd is not None:
+ os.close(fd)
+
+ @staticmethod
+ def ensure_helpers_running():
+ from . import semaphore_tracker
+ semaphore_tracker.ensure_running()
diff --git a/Lib/multiprocessing/popen_spawn_win32.py b/Lib/multiprocessing/popen_spawn_win32.py
new file mode 100644
index 0000000..7e0c4b3
--- /dev/null
+++ b/Lib/multiprocessing/popen_spawn_win32.py
@@ -0,0 +1,102 @@
+import os
+import msvcrt
+import signal
+import sys
+import _winapi
+
+from . import spawn
+from . import popen
+from . import reduction
+from . import util
+
+__all__ = ['Popen']
+
+#
+#
+#
+
+TERMINATE = 0x10000
+WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False))
+WINSERVICE = sys.executable.lower().endswith("pythonservice.exe")
+
+#
+# We define a Popen class similar to the one from subprocess, but
+# whose constructor takes a process object as its argument.
+#
+
+class Popen(object):
+ '''
+ Start a subprocess to run the code of a process object
+ '''
+ method = 'spawn'
+
+ def __init__(self, process_obj):
+ prep_data = spawn.get_preparation_data(process_obj._name)
+ cmd = ' '.join('"%s"' % x for x in spawn.get_command_line())
+
+ # read end of pipe will be "stolen" by the child process
+ # -- see spawn_main() in spawn.py.
+ rhandle, whandle = _winapi.CreatePipe(None, 0)
+ wfd = msvcrt.open_osfhandle(whandle, 0)
+ cmd += ' {} {}'.format(os.getpid(), rhandle)
+
+ with open(wfd, 'wb', closefd=True) as to_child:
+ # start process
+ try:
+ hp, ht, pid, tid = _winapi.CreateProcess(
+ spawn.get_executable(), cmd,
+ None, None, False, 0, None, None, None)
+ _winapi.CloseHandle(ht)
+ except:
+ _winapi.CloseHandle(rhandle)
+ raise
+
+ # set attributes of self
+ self.pid = pid
+ self.returncode = None
+ self._handle = hp
+ self.sentinel = int(hp)
+ util.Finalize(self, _winapi.CloseHandle, (self.sentinel,))
+
+ # send information to child
+ popen.set_spawning_popen(self)
+ try:
+ reduction.dump(prep_data, to_child)
+ reduction.dump(process_obj, to_child)
+ finally:
+ popen.set_spawning_popen(None)
+
+ def duplicate_for_child(self, handle):
+ assert self is popen.get_spawning_popen()
+ return reduction.duplicate(handle, self.sentinel)
+
+ def wait(self, timeout=None):
+ if self.returncode is None:
+ if timeout is None:
+ msecs = _winapi.INFINITE
+ else:
+ msecs = max(0, int(timeout * 1000 + 0.5))
+
+ res = _winapi.WaitForSingleObject(int(self._handle), msecs)
+ if res == _winapi.WAIT_OBJECT_0:
+ code = _winapi.GetExitCodeProcess(self._handle)
+ if code == TERMINATE:
+ code = -signal.SIGTERM
+ self.returncode = code
+
+ return self.returncode
+
+ def poll(self):
+ return self.wait(timeout=0)
+
+ def terminate(self):
+ if self.returncode is None:
+ try:
+ _winapi.TerminateProcess(int(self._handle), TERMINATE)
+ except OSError:
+ if self.wait(timeout=1.0) is None:
+ raise
+
+ @staticmethod
+ def ensure_helpers_running():
+ pass
diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py
index 893507b..c1cb36f 100644
--- a/Lib/multiprocessing/process.py
+++ b/Lib/multiprocessing/process.py
@@ -43,7 +43,7 @@ def active_children():
Return list of process objects corresponding to live child processes
'''
_cleanup()
- return list(_current_process._children)
+ return list(_children)
#
#
@@ -51,9 +51,9 @@ def active_children():
def _cleanup():
# check for processes which have finished
- for p in list(_current_process._children):
+ for p in list(_children):
if p._popen.poll() is not None:
- _current_process._children.discard(p)
+ _children.discard(p)
#
# The `Process` class
@@ -63,21 +63,16 @@ class Process(object):
'''
Process objects represent activity that is run in a separate process
- The class is analagous to `threading.Thread`
+ The class is analogous to `threading.Thread`
'''
_Popen = None
def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
*, daemon=None):
assert group is None, 'group argument must be None for now'
- count = next(_current_process._counter)
+ count = next(_process_counter)
self._identity = _current_process._identity + (count,)
- self._authkey = _current_process._authkey
- if daemon is not None:
- self._daemonic = daemon
- else:
- self._daemonic = _current_process._daemonic
- self._tempdir = _current_process._tempdir
+ self._config = _current_process._config.copy()
self._parent_pid = os.getpid()
self._popen = None
self._target = target
@@ -85,6 +80,8 @@ class Process(object):
self._kwargs = dict(kwargs)
self._name = name or type(self).__name__ + '-' + \
':'.join(str(i) for i in self._identity)
+ if daemon is not None:
+ self.daemon = daemon
_dangling.add(self)
def run(self):
@@ -101,16 +98,16 @@ class Process(object):
assert self._popen is None, 'cannot start a process twice'
assert self._parent_pid == os.getpid(), \
'can only start a process object created by current process'
- assert not _current_process._daemonic, \
+ assert not _current_process._config.get('daemon'), \
'daemonic processes are not allowed to have children'
_cleanup()
if self._Popen is not None:
Popen = self._Popen
else:
- from .forking import Popen
+ from .popen import Popen
self._popen = Popen(self)
self._sentinel = self._popen.sentinel
- _current_process._children.add(self)
+ _children.add(self)
def terminate(self):
'''
@@ -126,7 +123,7 @@ class Process(object):
assert self._popen is not None, 'can only join a started process'
res = self._popen.wait(timeout)
if res is not None:
- _current_process._children.discard(self)
+ _children.discard(self)
def is_alive(self):
'''
@@ -154,7 +151,7 @@ class Process(object):
'''
Return whether process is a daemon
'''
- return self._daemonic
+ return self._config.get('daemon', False)
@daemon.setter
def daemon(self, daemonic):
@@ -162,18 +159,18 @@ class Process(object):
Set whether process is a daemon
'''
assert self._popen is None, 'process has already started'
- self._daemonic = daemonic
+ self._config['daemon'] = daemonic
@property
def authkey(self):
- return self._authkey
+ return self._config['authkey']
@authkey.setter
def authkey(self, authkey):
'''
Set authorization key of process
'''
- self._authkey = AuthenticationString(authkey)
+ self._config['authkey'] = AuthenticationString(authkey)
@property
def exitcode(self):
@@ -227,17 +224,17 @@ class Process(object):
status = 'stopped[%s]' % _exitcode_to_name.get(status, status)
return '<%s(%s, %s%s)>' % (type(self).__name__, self._name,
- status, self._daemonic and ' daemon' or '')
+ status, self.daemon and ' daemon' or '')
##
def _bootstrap(self):
from . import util
- global _current_process
+ global _current_process, _process_counter, _children
try:
- self._children = set()
- self._counter = itertools.count(1)
+ _process_counter = itertools.count(1)
+ _children = set()
if sys.stdin is not None:
try:
sys.stdin.close()
@@ -285,8 +282,8 @@ class Process(object):
class AuthenticationString(bytes):
def __reduce__(self):
- from .forking import Popen
- if not Popen.thread_is_spawning():
+ from .popen import get_spawning_popen
+ if get_spawning_popen() is None:
raise TypeError(
'Pickling an AuthenticationString object is '
'disallowed for security reasons'
@@ -301,16 +298,19 @@ class _MainProcess(Process):
def __init__(self):
self._identity = ()
- self._daemonic = False
self._name = 'MainProcess'
self._parent_pid = None
self._popen = None
- self._counter = itertools.count(1)
- self._children = set()
- self._authkey = AuthenticationString(os.urandom(32))
- self._tempdir = None
+ self._config = {'authkey': AuthenticationString(os.urandom(32)),
+ 'semprefix': 'mp'}
+ # Note that some versions of FreeBSD only allow named
+ # semaphores to have names of up to 14 characters. Therfore
+ # we choose a short prefix.
+
_current_process = _MainProcess()
+_process_counter = itertools.count(1)
+_children = set()
del _MainProcess
#
diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py
index 37271fb..10e40a5 100644
--- a/Lib/multiprocessing/queues.py
+++ b/Lib/multiprocessing/queues.py
@@ -18,11 +18,15 @@ import weakref
import errno
from queue import Empty, Full
+
import _multiprocessing
-from multiprocessing.connection import Pipe
-from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition
-from multiprocessing.util import debug, info, Finalize, register_after_fork
-from multiprocessing.forking import assert_spawning
+
+from . import connection
+from . import popen
+from . import synchronize
+
+from .util import debug, info, Finalize, register_after_fork, is_exiting
+from .reduction import ForkingPickler
#
# Queue type using a pipe, buffer and thread
@@ -34,14 +38,14 @@ class Queue(object):
if maxsize <= 0:
maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX
self._maxsize = maxsize
- self._reader, self._writer = Pipe(duplex=False)
- self._rlock = Lock()
+ self._reader, self._writer = connection.Pipe(duplex=False)
+ self._rlock = synchronize.Lock()
self._opid = os.getpid()
if sys.platform == 'win32':
self._wlock = None
else:
- self._wlock = Lock()
- self._sem = BoundedSemaphore(maxsize)
+ self._wlock = synchronize.Lock()
+ self._sem = synchronize.BoundedSemaphore(maxsize)
# For use by concurrent.futures
self._ignore_epipe = False
@@ -51,7 +55,7 @@ class Queue(object):
register_after_fork(self, Queue._after_fork)
def __getstate__(self):
- assert_spawning(self)
+ popen.assert_spawning(self)
return (self._ignore_epipe, self._maxsize, self._reader, self._writer,
self._rlock, self._wlock, self._sem, self._opid)
@@ -69,8 +73,8 @@ class Queue(object):
self._joincancelled = False
self._closed = False
self._close = None
- self._send = self._writer.send
- self._recv = self._reader.recv
+ self._send_bytes = self._writer.send_bytes
+ self._recv_bytes = self._reader.recv_bytes
self._poll = self._reader.poll
def put(self, obj, block=True, timeout=None):
@@ -89,14 +93,9 @@ class Queue(object):
def get(self, block=True, timeout=None):
if block and timeout is None:
- self._rlock.acquire()
- try:
- res = self._recv()
- self._sem.release()
- return res
- finally:
- self._rlock.release()
-
+ with self._rlock:
+ res = self._recv_bytes()
+ self._sem.release()
else:
if block:
deadline = time.time() + timeout
@@ -109,11 +108,12 @@ class Queue(object):
raise Empty
elif not self._poll():
raise Empty
- res = self._recv()
+ res = self._recv_bytes()
self._sem.release()
- return res
finally:
self._rlock.release()
+ # unserialize the data after having released the lock
+ return ForkingPickler.loads(res)
def qsize(self):
# Raises NotImplementedError on Mac OSX because of broken sem_getvalue()
@@ -158,7 +158,7 @@ class Queue(object):
self._buffer.clear()
self._thread = threading.Thread(
target=Queue._feed,
- args=(self._buffer, self._notempty, self._send,
+ args=(self._buffer, self._notempty, self._send_bytes,
self._wlock, self._writer.close, self._ignore_epipe),
name='QueueFeederThread'
)
@@ -210,10 +210,8 @@ class Queue(object):
notempty.release()
@staticmethod
- def _feed(buffer, notempty, send, writelock, close, ignore_epipe):
+ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe):
debug('starting thread to feed data to pipe')
- from .util import is_exiting
-
nacquire = notempty.acquire
nrelease = notempty.release
nwait = notempty.wait
@@ -241,12 +239,14 @@ class Queue(object):
close()
return
+ # serialize the data before acquiring the lock
+ obj = ForkingPickler.dumps(obj)
if wacquire is None:
- send(obj)
+ send_bytes(obj)
else:
wacquire()
try:
- send(obj)
+ send_bytes(obj)
finally:
wrelease()
except IndexError:
@@ -281,8 +281,8 @@ class JoinableQueue(Queue):
def __init__(self, maxsize=0):
Queue.__init__(self, maxsize)
- self._unfinished_tasks = Semaphore(0)
- self._cond = Condition()
+ self._unfinished_tasks = synchronize.Semaphore(0)
+ self._cond = synchronize.Condition()
def __getstate__(self):
return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks)
@@ -333,47 +333,36 @@ class JoinableQueue(Queue):
class SimpleQueue(object):
def __init__(self):
- self._reader, self._writer = Pipe(duplex=False)
- self._rlock = Lock()
+ self._reader, self._writer = connection.Pipe(duplex=False)
+ self._rlock = synchronize.Lock()
self._poll = self._reader.poll
if sys.platform == 'win32':
self._wlock = None
else:
- self._wlock = Lock()
- self._make_methods()
+ self._wlock = synchronize.Lock()
def empty(self):
return not self._poll()
def __getstate__(self):
- assert_spawning(self)
+ popen.assert_spawning(self)
return (self._reader, self._writer, self._rlock, self._wlock)
def __setstate__(self, state):
(self._reader, self._writer, self._rlock, self._wlock) = state
- self._make_methods()
- def _make_methods(self):
- recv = self._reader.recv
- racquire, rrelease = self._rlock.acquire, self._rlock.release
- def get():
- racquire()
- try:
- return recv()
- finally:
- rrelease()
- self.get = get
+ def get(self):
+ with self._rlock:
+ res = self._reader.recv_bytes()
+ # unserialize the data after having released the lock
+ return ForkingPickler.loads(res)
+ def put(self, obj):
+ # serialize the data before acquiring the lock
+ obj = ForkingPickler.dumps(obj)
if self._wlock is None:
# writes to a message oriented win32 pipe are atomic
- self.put = self._writer.send
+ self._writer.send_bytes(obj)
else:
- send = self._writer.send
- wacquire, wrelease = self._wlock.acquire, self._wlock.release
- def put(obj):
- wacquire()
- try:
- return send(obj)
- finally:
- wrelease()
- self.put = put
+ with self._wlock:
+ self._writer.send_bytes(obj)
diff --git a/Lib/multiprocessing/reduction.py b/Lib/multiprocessing/reduction.py
index 656fa8f..5bbbcf4 100644
--- a/Lib/multiprocessing/reduction.py
+++ b/Lib/multiprocessing/reduction.py
@@ -1,6 +1,5 @@
#
-# Module to allow connection and socket objects to be transferred
-# between processes
+# Module which deals with pickling of objects.
#
# multiprocessing/reduction.py
#
@@ -8,27 +7,57 @@
# Licensed to PSF under a Contributor Agreement.
#
-__all__ = ['reduce_socket', 'reduce_connection', 'send_handle', 'recv_handle']
-
+import copyreg
+import functools
+import io
import os
-import sys
+import pickle
import socket
-import threading
-import struct
-import signal
+import sys
-from multiprocessing import current_process
-from multiprocessing.util import register_after_fork, debug, sub_debug
-from multiprocessing.util import is_exiting, sub_warning
+from . import popen
+from . import util
+__all__ = ['send_handle', 'recv_handle', 'ForkingPickler', 'register', 'dump']
+
+
+HAVE_SEND_HANDLE = (sys.platform == 'win32' or
+ (hasattr(socket, 'CMSG_LEN') and
+ hasattr(socket, 'SCM_RIGHTS') and
+ hasattr(socket.socket, 'sendmsg')))
#
+# Pickler subclass
#
-#
-if not(sys.platform == 'win32' or (hasattr(socket, 'CMSG_LEN') and
- hasattr(socket, 'SCM_RIGHTS'))):
- raise ImportError('pickling of connections not supported')
+class ForkingPickler(pickle.Pickler):
+ '''Pickler subclass used by multiprocessing.'''
+ _extra_reducers = {}
+ _copyreg_dispatch_table = copyreg.dispatch_table
+
+ def __init__(self, *args):
+ super().__init__(*args)
+ self.dispatch_table = self._copyreg_dispatch_table.copy()
+ self.dispatch_table.update(self._extra_reducers)
+
+ @classmethod
+ def register(cls, type, reduce):
+ '''Register a reduce function for a type.'''
+ cls._extra_reducers[type] = reduce
+
+ @classmethod
+ def dumps(cls, obj, protocol=None):
+ buf = io.BytesIO()
+ cls(buf, protocol).dump(obj)
+ return buf.getbuffer()
+
+ loads = pickle.loads
+
+register = ForkingPickler.register
+
+def dump(obj, file, protocol=None):
+ '''Replacement for pickle.dump() using ForkingPickler.'''
+ ForkingPickler(file, protocol).dump(obj)
#
# Platform specific definitions
@@ -36,20 +65,44 @@ if not(sys.platform == 'win32' or (hasattr(socket, 'CMSG_LEN') and
if sys.platform == 'win32':
# Windows
- __all__ += ['reduce_pipe_connection']
+ __all__ += ['DupHandle', 'duplicate', 'steal_handle']
import _winapi
+ def duplicate(handle, target_process=None, inheritable=False):
+ '''Duplicate a handle. (target_process is a handle not a pid!)'''
+ if target_process is None:
+ target_process = _winapi.GetCurrentProcess()
+ return _winapi.DuplicateHandle(
+ _winapi.GetCurrentProcess(), handle, target_process,
+ 0, inheritable, _winapi.DUPLICATE_SAME_ACCESS)
+
+ def steal_handle(source_pid, handle):
+ '''Steal a handle from process identified by source_pid.'''
+ source_process_handle = _winapi.OpenProcess(
+ _winapi.PROCESS_DUP_HANDLE, False, source_pid)
+ try:
+ return _winapi.DuplicateHandle(
+ source_process_handle, handle,
+ _winapi.GetCurrentProcess(), 0, False,
+ _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE)
+ finally:
+ _winapi.CloseHandle(source_process_handle)
+
def send_handle(conn, handle, destination_pid):
+ '''Send a handle over a local connection.'''
dh = DupHandle(handle, _winapi.DUPLICATE_SAME_ACCESS, destination_pid)
conn.send(dh)
def recv_handle(conn):
+ '''Receive a handle over a local connection.'''
return conn.recv().detach()
class DupHandle(object):
+ '''Picklable wrapper for a handle.'''
def __init__(self, handle, access, pid=None):
- # duplicate handle for process with given pid
if pid is None:
+ # We just duplicate the handle in the current process and
+ # let the receiving process steal the handle.
pid = os.getpid()
proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, pid)
try:
@@ -62,9 +115,12 @@ if sys.platform == 'win32':
self._pid = pid
def detach(self):
+ '''Get the handle. This should only be called once.'''
# retrieve handle from process which currently owns it
if self._pid == os.getpid():
+ # The handle has already been duplicated for this process.
return self._handle
+ # We must steal the handle from the process whose pid is self._pid.
proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False,
self._pid)
try:
@@ -74,207 +130,112 @@ if sys.platform == 'win32':
finally:
_winapi.CloseHandle(proc)
- class DupSocket(object):
- def __init__(self, sock):
- new_sock = sock.dup()
- def send(conn, pid):
- share = new_sock.share(pid)
- conn.send_bytes(share)
- self._id = resource_sharer.register(send, new_sock.close)
-
- def detach(self):
- conn = resource_sharer.get_connection(self._id)
- try:
- share = conn.recv_bytes()
- return socket.fromshare(share)
- finally:
- conn.close()
-
- def reduce_socket(s):
- return rebuild_socket, (DupSocket(s),)
-
- def rebuild_socket(ds):
- return ds.detach()
-
- def reduce_connection(conn):
- handle = conn.fileno()
- with socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM) as s:
- ds = DupSocket(s)
- return rebuild_connection, (ds, conn.readable, conn.writable)
-
- def rebuild_connection(ds, readable, writable):
- from .connection import Connection
- sock = ds.detach()
- return Connection(sock.detach(), readable, writable)
-
- def reduce_pipe_connection(conn):
- access = ((_winapi.FILE_GENERIC_READ if conn.readable else 0) |
- (_winapi.FILE_GENERIC_WRITE if conn.writable else 0))
- dh = DupHandle(conn.fileno(), access)
- return rebuild_pipe_connection, (dh, conn.readable, conn.writable)
-
- def rebuild_pipe_connection(dh, readable, writable):
- from .connection import PipeConnection
- handle = dh.detach()
- return PipeConnection(handle, readable, writable)
-
else:
# Unix
+ __all__ += ['DupFd', 'sendfds', 'recvfds']
+ import array
# On MacOSX we should acknowledge receipt of fds -- see Issue14669
ACKNOWLEDGE = sys.platform == 'darwin'
+ def sendfds(sock, fds):
+ '''Send an array of fds over an AF_UNIX socket.'''
+ fds = array.array('i', fds)
+ msg = bytes([len(fds) % 256])
+ sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)])
+ if ACKNOWLEDGE and sock.recv(1) != b'A':
+ raise RuntimeError('did not receive acknowledgement of fd')
+
+ def recvfds(sock, size):
+ '''Receive an array of fds over an AF_UNIX socket.'''
+ a = array.array('i')
+ bytes_size = a.itemsize * size
+ msg, ancdata, flags, addr = sock.recvmsg(1, socket.CMSG_LEN(bytes_size))
+ if not msg and not ancdata:
+ raise EOFError
+ try:
+ if ACKNOWLEDGE:
+ sock.send(b'A')
+ if len(ancdata) != 1:
+ raise RuntimeError('received %d items of ancdata' %
+ len(ancdata))
+ cmsg_level, cmsg_type, cmsg_data = ancdata[0]
+ if (cmsg_level == socket.SOL_SOCKET and
+ cmsg_type == socket.SCM_RIGHTS):
+ if len(cmsg_data) % a.itemsize != 0:
+ raise ValueError
+ a.frombytes(cmsg_data)
+ assert len(a) % 256 == msg[0]
+ return list(a)
+ except (ValueError, IndexError):
+ pass
+ raise RuntimeError('Invalid data received')
+
def send_handle(conn, handle, destination_pid):
+ '''Send a handle over a local connection.'''
with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
- s.sendmsg([b'x'], [(socket.SOL_SOCKET, socket.SCM_RIGHTS,
- struct.pack("@i", handle))])
- if ACKNOWLEDGE and conn.recv_bytes() != b'ACK':
- raise RuntimeError('did not receive acknowledgement of fd')
+ sendfds(s, [handle])
def recv_handle(conn):
- size = struct.calcsize("@i")
+ '''Receive a handle over a local connection.'''
with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
- msg, ancdata, flags, addr = s.recvmsg(1, socket.CMSG_LEN(size))
- try:
- if ACKNOWLEDGE:
- conn.send_bytes(b'ACK')
- cmsg_level, cmsg_type, cmsg_data = ancdata[0]
- if (cmsg_level == socket.SOL_SOCKET and
- cmsg_type == socket.SCM_RIGHTS):
- return struct.unpack("@i", cmsg_data[:size])[0]
- except (ValueError, IndexError, struct.error):
- pass
- raise RuntimeError('Invalid data received')
-
- class DupFd(object):
- def __init__(self, fd):
- new_fd = os.dup(fd)
- def send(conn, pid):
- send_handle(conn, new_fd, pid)
- def close():
- os.close(new_fd)
- self._id = resource_sharer.register(send, close)
+ return recvfds(s, 1)[0]
+
+ def DupFd(fd):
+ '''Return a wrapper for an fd.'''
+ popen_obj = popen.get_spawning_popen()
+ if popen_obj is not None:
+ return popen_obj.DupFd(popen_obj.duplicate_for_child(fd))
+ elif HAVE_SEND_HANDLE:
+ from . import resource_sharer
+ return resource_sharer.DupFd(fd)
+ else:
+ raise ValueError('SCM_RIGHTS appears not to be available')
- def detach(self):
- conn = resource_sharer.get_connection(self._id)
- try:
- return recv_handle(conn)
- finally:
- conn.close()
+#
+# Try making some callable types picklable
+#
- def reduce_socket(s):
- df = DupFd(s.fileno())
- return rebuild_socket, (df, s.family, s.type, s.proto)
+def _reduce_method(m):
+ if m.__self__ is None:
+ return getattr, (m.__class__, m.__func__.__name__)
+ else:
+ return getattr, (m.__self__, m.__func__.__name__)
+class _C:
+ def f(self):
+ pass
+register(type(_C().f), _reduce_method)
- def rebuild_socket(df, family, type, proto):
- fd = df.detach()
- s = socket.fromfd(fd, family, type, proto)
- os.close(fd)
- return s
- def reduce_connection(conn):
- df = DupFd(conn.fileno())
- return rebuild_connection, (df, conn.readable, conn.writable)
+def _reduce_method_descriptor(m):
+ return getattr, (m.__objclass__, m.__name__)
+register(type(list.append), _reduce_method_descriptor)
+register(type(int.__add__), _reduce_method_descriptor)
- def rebuild_connection(df, readable, writable):
- from .connection import Connection
- fd = df.detach()
- return Connection(fd, readable, writable)
+
+def _reduce_partial(p):
+ return _rebuild_partial, (p.func, p.args, p.keywords or {})
+def _rebuild_partial(func, args, keywords):
+ return functools.partial(func, *args, **keywords)
+register(functools.partial, _reduce_partial)
#
-# Server which shares registered resources with clients
+# Make sockets picklable
#
-class ResourceSharer(object):
- def __init__(self):
- self._key = 0
- self._cache = {}
- self._old_locks = []
- self._lock = threading.Lock()
- self._listener = None
- self._address = None
- self._thread = None
- register_after_fork(self, ResourceSharer._afterfork)
-
- def register(self, send, close):
- with self._lock:
- if self._address is None:
- self._start()
- self._key += 1
- self._cache[self._key] = (send, close)
- return (self._address, self._key)
-
- @staticmethod
- def get_connection(ident):
- from .connection import Client
- address, key = ident
- c = Client(address, authkey=current_process().authkey)
- c.send((key, os.getpid()))
- return c
-
- def stop(self, timeout=None):
- from .connection import Client
- with self._lock:
- if self._address is not None:
- c = Client(self._address, authkey=current_process().authkey)
- c.send(None)
- c.close()
- self._thread.join(timeout)
- if self._thread.is_alive():
- sub_warn('ResourceSharer thread did not stop when asked')
- self._listener.close()
- self._thread = None
- self._address = None
- self._listener = None
- for key, (send, close) in self._cache.items():
- close()
- self._cache.clear()
-
- def _afterfork(self):
- for key, (send, close) in self._cache.items():
- close()
- self._cache.clear()
- # If self._lock was locked at the time of the fork, it may be broken
- # -- see issue 6721. Replace it without letting it be gc'ed.
- self._old_locks.append(self._lock)
- self._lock = threading.Lock()
- if self._listener is not None:
- self._listener.close()
- self._listener = None
- self._address = None
- self._thread = None
-
- def _start(self):
- from .connection import Listener
- assert self._listener is None
- debug('starting listener and thread for sending handles')
- self._listener = Listener(authkey=current_process().authkey)
- self._address = self._listener.address
- t = threading.Thread(target=self._serve)
- t.daemon = True
- t.start()
- self._thread = t
-
- def _serve(self):
- if hasattr(signal, 'pthread_sigmask'):
- signal.pthread_sigmask(signal.SIG_BLOCK, range(1, signal.NSIG))
- while 1:
- try:
- conn = self._listener.accept()
- msg = conn.recv()
- if msg is None:
- break
- key, destination_pid = msg
- send, close = self._cache.pop(key)
- send(conn, destination_pid)
- close()
- conn.close()
- except:
- if not is_exiting():
- import traceback
- sub_warning(
- 'thread for sharing handles raised exception :\n' +
- '-'*79 + '\n' + traceback.format_exc() + '-'*79
- )
-
-resource_sharer = ResourceSharer()
+if sys.platform == 'win32':
+ def _reduce_socket(s):
+ from .resource_sharer import DupSocket
+ return _rebuild_socket, (DupSocket(s),)
+ def _rebuild_socket(ds):
+ return ds.detach()
+ register(socket.socket, _reduce_socket)
+
+else:
+ def _reduce_socket(s):
+ df = DupFd(s.fileno())
+ return _rebuild_socket, (df, s.family, s.type, s.proto)
+ def _rebuild_socket(df, family, type, proto):
+ fd = df.detach()
+ return socket.socket(family, type, proto, fileno=fd)
+ register(socket.socket, _reduce_socket)
diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py
new file mode 100644
index 0000000..5e46fc6
--- /dev/null
+++ b/Lib/multiprocessing/resource_sharer.py
@@ -0,0 +1,158 @@
+#
+# We use a background thread for sharing fds on Unix, and for sharing sockets on
+# Windows.
+#
+# A client which wants to pickle a resource registers it with the resource
+# sharer and gets an identifier in return. The unpickling process will connect
+# to the resource sharer, sends the identifier and its pid, and then receives
+# the resource.
+#
+
+import os
+import signal
+import socket
+import sys
+import threading
+
+from . import process
+from . import reduction
+from . import util
+
+__all__ = ['stop']
+
+
+if sys.platform == 'win32':
+ __all__ += ['DupSocket']
+
+ class DupSocket(object):
+ '''Picklable wrapper for a socket.'''
+ def __init__(self, sock):
+ new_sock = sock.dup()
+ def send(conn, pid):
+ share = new_sock.share(pid)
+ conn.send_bytes(share)
+ self._id = _resource_sharer.register(send, new_sock.close)
+
+ def detach(self):
+ '''Get the socket. This should only be called once.'''
+ with _resource_sharer.get_connection(self._id) as conn:
+ share = conn.recv_bytes()
+ return socket.fromshare(share)
+
+else:
+ __all__ += ['DupFd']
+
+ class DupFd(object):
+ '''Wrapper for fd which can be used at any time.'''
+ def __init__(self, fd):
+ new_fd = os.dup(fd)
+ def send(conn, pid):
+ reduction.send_handle(conn, new_fd, pid)
+ def close():
+ os.close(new_fd)
+ self._id = _resource_sharer.register(send, close)
+
+ def detach(self):
+ '''Get the fd. This should only be called once.'''
+ with _resource_sharer.get_connection(self._id) as conn:
+ return reduction.recv_handle(conn)
+
+
+class _ResourceSharer(object):
+ '''Manager for resouces using background thread.'''
+ def __init__(self):
+ self._key = 0
+ self._cache = {}
+ self._old_locks = []
+ self._lock = threading.Lock()
+ self._listener = None
+ self._address = None
+ self._thread = None
+ util.register_after_fork(self, _ResourceSharer._afterfork)
+
+ def register(self, send, close):
+ '''Register resource, returning an identifier.'''
+ with self._lock:
+ if self._address is None:
+ self._start()
+ self._key += 1
+ self._cache[self._key] = (send, close)
+ return (self._address, self._key)
+
+ @staticmethod
+ def get_connection(ident):
+ '''Return connection from which to receive identified resource.'''
+ from .connection import Client
+ address, key = ident
+ c = Client(address, authkey=process.current_process().authkey)
+ c.send((key, os.getpid()))
+ return c
+
+ def stop(self, timeout=None):
+ '''Stop the background thread and clear registered resources.'''
+ from .connection import Client
+ with self._lock:
+ if self._address is not None:
+ c = Client(self._address,
+ authkey=process.current_process().authkey)
+ c.send(None)
+ c.close()
+ self._thread.join(timeout)
+ if self._thread.is_alive():
+ util.sub_warning('_ResourceSharer thread did '
+ 'not stop when asked')
+ self._listener.close()
+ self._thread = None
+ self._address = None
+ self._listener = None
+ for key, (send, close) in self._cache.items():
+ close()
+ self._cache.clear()
+
+ def _afterfork(self):
+ for key, (send, close) in self._cache.items():
+ close()
+ self._cache.clear()
+ # If self._lock was locked at the time of the fork, it may be broken
+ # -- see issue 6721. Replace it without letting it be gc'ed.
+ self._old_locks.append(self._lock)
+ self._lock = threading.Lock()
+ if self._listener is not None:
+ self._listener.close()
+ self._listener = None
+ self._address = None
+ self._thread = None
+
+ def _start(self):
+ from .connection import Listener
+ assert self._listener is None
+ util.debug('starting listener and thread for sending handles')
+ self._listener = Listener(authkey=process.current_process().authkey)
+ self._address = self._listener.address
+ t = threading.Thread(target=self._serve)
+ t.daemon = True
+ t.start()
+ self._thread = t
+
+ def _serve(self):
+ if hasattr(signal, 'pthread_sigmask'):
+ signal.pthread_sigmask(signal.SIG_BLOCK, range(1, signal.NSIG))
+ while 1:
+ try:
+ with self._listener.accept() as conn:
+ msg = conn.recv()
+ if msg is None:
+ break
+ key, destination_pid = msg
+ send, close = self._cache.pop(key)
+ try:
+ send(conn, destination_pid)
+ finally:
+ close()
+ except:
+ if not util.is_exiting():
+ sys.excepthook(*sys.exc_info())
+
+
+_resource_sharer = _ResourceSharer()
+stop = _resource_sharer.stop
diff --git a/Lib/multiprocessing/semaphore_tracker.py b/Lib/multiprocessing/semaphore_tracker.py
new file mode 100644
index 0000000..4a2d636
--- /dev/null
+++ b/Lib/multiprocessing/semaphore_tracker.py
@@ -0,0 +1,135 @@
+#
+# On Unix we run a server process which keeps track of unlinked
+# semaphores. The server ignores SIGINT and SIGTERM and reads from a
+# pipe. Every other process of the program has a copy of the writable
+# end of the pipe, so we get EOF when all other processes have exited.
+# Then the server process unlinks any remaining semaphore names.
+#
+# This is important because the system only supports a limited number
+# of named semaphores, and they will not be automatically removed till
+# the next reboot. Without this semaphore tracker process, "killall
+# python" would probably leave unlinked semaphores.
+#
+
+import errno
+import os
+import signal
+import sys
+import threading
+import warnings
+import _multiprocessing
+
+from . import spawn
+from . import util
+from . import current_process
+
+__all__ = ['ensure_running', 'register', 'unregister']
+
+
+_lock = threading.Lock()
+
+
+def ensure_running():
+ '''Make sure that semaphore tracker process is running.
+
+ This can be run from any process. Usually a child process will use
+ the semaphore created by its parent.'''
+ with _lock:
+ config = current_process()._config
+ if config.get('semaphore_tracker_fd') is not None:
+ return
+ fds_to_pass = []
+ try:
+ fds_to_pass.append(sys.stderr.fileno())
+ except Exception:
+ pass
+ cmd = 'from multiprocessing.semaphore_tracker import main; main(%d)'
+ r, semaphore_tracker_fd = util.pipe()
+ try:
+ fds_to_pass.append(r)
+ # process will out live us, so no need to wait on pid
+ exe = spawn.get_executable()
+ args = [exe] + util._args_from_interpreter_flags()
+ args += ['-c', cmd % r]
+ util.spawnv_passfds(exe, args, fds_to_pass)
+ except:
+ os.close(semaphore_tracker_fd)
+ raise
+ else:
+ config['semaphore_tracker_fd'] = semaphore_tracker_fd
+ finally:
+ os.close(r)
+
+
+def register(name):
+ '''Register name of semaphore with semaphore tracker.'''
+ _send('REGISTER', name)
+
+
+def unregister(name):
+ '''Unregister name of semaphore with semaphore tracker.'''
+ _send('UNREGISTER', name)
+
+
+def _send(cmd, name):
+ msg = '{0}:{1}\n'.format(cmd, name).encode('ascii')
+ if len(name) > 512:
+ # posix guarantees that writes to a pipe of less than PIPE_BUF
+ # bytes are atomic, and that PIPE_BUF >= 512
+ raise ValueError('name too long')
+ fd = current_process()._config['semaphore_tracker_fd']
+ nbytes = os.write(fd, msg)
+ assert nbytes == len(msg)
+
+
+def main(fd):
+ '''Run semaphore tracker.'''
+ # protect the process from ^C and "killall python" etc
+ signal.signal(signal.SIGINT, signal.SIG_IGN)
+ signal.signal(signal.SIGTERM, signal.SIG_IGN)
+
+ for f in (sys.stdin, sys.stdout):
+ try:
+ f.close()
+ except Exception:
+ pass
+
+ cache = set()
+ try:
+ # keep track of registered/unregistered semaphores
+ with open(fd, 'rb') as f:
+ for line in f:
+ try:
+ cmd, name = line.strip().split(b':')
+ if cmd == b'REGISTER':
+ cache.add(name)
+ elif cmd == b'UNREGISTER':
+ cache.remove(name)
+ else:
+ raise RuntimeError('unrecognized command %r' % cmd)
+ except Exception:
+ try:
+ sys.excepthook(*sys.exc_info())
+ except:
+ pass
+ finally:
+ # all processes have terminated; cleanup any remaining semaphores
+ if cache:
+ try:
+ warnings.warn('semaphore_tracker: There appear to be %d '
+ 'leaked semaphores to clean up at shutdown' %
+ len(cache))
+ except Exception:
+ pass
+ for name in cache:
+ # For some reason the process which created and registered this
+ # semaphore has failed to unregister it. Presumably it has died.
+ # We therefore unlink it.
+ try:
+ name = name.decode('ascii')
+ try:
+ _multiprocessing.sem_unlink(name)
+ except Exception as e:
+ warnings.warn('semaphore_tracker: %r: %s' % (name, e))
+ finally:
+ pass
diff --git a/Lib/multiprocessing/sharedctypes.py b/Lib/multiprocessing/sharedctypes.py
index a358ed4..a97dadf 100644
--- a/Lib/multiprocessing/sharedctypes.py
+++ b/Lib/multiprocessing/sharedctypes.py
@@ -10,8 +10,11 @@
import ctypes
import weakref
-from multiprocessing import heap, RLock
-from multiprocessing.forking import assert_spawning, ForkingPickler
+from . import heap
+
+from .synchronize import RLock
+from .reduction import ForkingPickler
+from .popen import assert_spawning
__all__ = ['RawValue', 'RawArray', 'Value', 'Array', 'copy', 'synchronized']
diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py
new file mode 100644
index 0000000..83561db
--- /dev/null
+++ b/Lib/multiprocessing/spawn.py
@@ -0,0 +1,258 @@
+#
+# Code used to start processes when using the spawn or forkserver
+# start methods.
+#
+# multiprocessing/spawn.py
+#
+# Copyright (c) 2006-2008, R Oudkerk
+# Licensed to PSF under a Contributor Agreement.
+#
+
+import os
+import pickle
+import sys
+
+from . import process
+from . import util
+from . import popen
+
+__all__ = ['_main', 'freeze_support', 'set_executable', 'get_executable',
+ 'get_preparation_data', 'get_command_line', 'import_main_path']
+
+#
+# _python_exe is the assumed path to the python executable.
+# People embedding Python want to modify it.
+#
+
+if sys.platform != 'win32':
+ WINEXE = False
+ WINSERVICE = False
+else:
+ WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False))
+ WINSERVICE = sys.executable.lower().endswith("pythonservice.exe")
+
+if WINSERVICE:
+ _python_exe = os.path.join(sys.exec_prefix, 'python.exe')
+else:
+ _python_exe = sys.executable
+
+def set_executable(exe):
+ global _python_exe
+ _python_exe = exe
+
+def get_executable():
+ return _python_exe
+
+#
+#
+#
+
+def is_forking(argv):
+ '''
+ Return whether commandline indicates we are forking
+ '''
+ if len(argv) >= 2 and argv[1] == '--multiprocessing-fork':
+ return True
+ else:
+ return False
+
+
+def freeze_support():
+ '''
+ Run code for process object if this in not the main process
+ '''
+ if is_forking(sys.argv):
+ main()
+ sys.exit()
+
+
+def get_command_line():
+ '''
+ Returns prefix of command line used for spawning a child process
+ '''
+ if getattr(sys, 'frozen', False):
+ return [sys.executable, '--multiprocessing-fork']
+ else:
+ prog = 'from multiprocessing.spawn import spawn_main; spawn_main()'
+ opts = util._args_from_interpreter_flags()
+ return [_python_exe] + opts + ['-c', prog, '--multiprocessing-fork']
+
+
+def spawn_main():
+ '''
+ Run code specifed by data received over pipe
+ '''
+ assert is_forking(sys.argv)
+ handle = int(sys.argv[-1])
+ if sys.platform == 'win32':
+ import msvcrt
+ from .reduction import steal_handle
+ pid = int(sys.argv[-2])
+ new_handle = steal_handle(pid, handle)
+ fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY)
+ else:
+ fd = handle
+ exitcode = _main(fd)
+ sys.exit(exitcode)
+
+
+def _main(fd):
+ with os.fdopen(fd, 'rb', closefd=True) as from_parent:
+ process.current_process()._inheriting = True
+ try:
+ preparation_data = pickle.load(from_parent)
+ prepare(preparation_data)
+ self = pickle.load(from_parent)
+ finally:
+ del process.current_process()._inheriting
+ return self._bootstrap()
+
+
+def _check_not_importing_main():
+ if getattr(process.current_process(), '_inheriting', False):
+ raise RuntimeError('''
+ An attempt has been made to start a new process before the
+ current process has finished its bootstrapping phase.
+
+ This probably means that you are not using fork to start your
+ child processes and you have forgotten to use the proper idiom
+ in the main module:
+
+ if __name__ == '__main__':
+ freeze_support()
+ ...
+
+ The "freeze_support()" line can be omitted if the program
+ is not going to be frozen to produce an executable.''')
+
+
+def get_preparation_data(name):
+ '''
+ Return info about parent needed by child to unpickle process object
+ '''
+ _check_not_importing_main()
+ d = dict(
+ log_to_stderr=util._log_to_stderr,
+ authkey=process.current_process().authkey,
+ )
+
+ if util._logger is not None:
+ d['log_level'] = util._logger.getEffectiveLevel()
+
+ sys_path=sys.path.copy()
+ try:
+ i = sys_path.index('')
+ except ValueError:
+ pass
+ else:
+ sys_path[i] = process.ORIGINAL_DIR
+
+ d.update(
+ name=name,
+ sys_path=sys_path,
+ sys_argv=sys.argv,
+ orig_dir=process.ORIGINAL_DIR,
+ dir=os.getcwd(),
+ start_method=popen.get_start_method(),
+ )
+
+ if sys.platform != 'win32' or (not WINEXE and not WINSERVICE):
+ main_path = getattr(sys.modules['__main__'], '__file__', None)
+ if not main_path and sys.argv[0] not in ('', '-c'):
+ main_path = sys.argv[0]
+ if main_path is not None:
+ if (not os.path.isabs(main_path) and
+ process.ORIGINAL_DIR is not None):
+ main_path = os.path.join(process.ORIGINAL_DIR, main_path)
+ d['main_path'] = os.path.normpath(main_path)
+
+ return d
+
+#
+# Prepare current process
+#
+
+old_main_modules = []
+
+def prepare(data):
+ '''
+ Try to get current process ready to unpickle process object
+ '''
+ if 'name' in data:
+ process.current_process().name = data['name']
+
+ if 'authkey' in data:
+ process.current_process().authkey = data['authkey']
+
+ if 'log_to_stderr' in data and data['log_to_stderr']:
+ util.log_to_stderr()
+
+ if 'log_level' in data:
+ util.get_logger().setLevel(data['log_level'])
+
+ if 'sys_path' in data:
+ sys.path = data['sys_path']
+
+ if 'sys_argv' in data:
+ sys.argv = data['sys_argv']
+
+ if 'dir' in data:
+ os.chdir(data['dir'])
+
+ if 'orig_dir' in data:
+ process.ORIGINAL_DIR = data['orig_dir']
+
+ if 'start_method' in data:
+ popen.set_start_method(data['start_method'], start_helpers=False)
+
+ if 'main_path' in data:
+ import_main_path(data['main_path'])
+
+
+def import_main_path(main_path):
+ '''
+ Set sys.modules['__main__'] to module at main_path
+ '''
+ # XXX (ncoghlan): The following code makes several bogus
+ # assumptions regarding the relationship between __file__
+ # and a module's real name. See PEP 302 and issue #10845
+ if getattr(sys.modules['__main__'], '__file__', None) == main_path:
+ return
+
+ main_name = os.path.splitext(os.path.basename(main_path))[0]
+ if main_name == '__init__':
+ main_name = os.path.basename(os.path.dirname(main_path))
+
+ if main_name == '__main__':
+ main_module = sys.modules['__main__']
+ main_module.__file__ = main_path
+ elif main_name != 'ipython':
+ # Main modules not actually called __main__.py may
+ # contain additional code that should still be executed
+ import importlib
+ import types
+
+ if main_path is None:
+ dirs = None
+ elif os.path.basename(main_path).startswith('__init__.py'):
+ dirs = [os.path.dirname(os.path.dirname(main_path))]
+ else:
+ dirs = [os.path.dirname(main_path)]
+
+ assert main_name not in sys.modules, main_name
+ sys.modules.pop('__mp_main__', None)
+ # We should not try to load __main__
+ # since that would execute 'if __name__ == "__main__"'
+ # clauses, potentially causing a psuedo fork bomb.
+ loader = importlib.find_loader(main_name, path=dirs)
+ main_module = types.ModuleType(main_name)
+ try:
+ loader.init_module_attrs(main_module)
+ except AttributeError: # init_module_attrs is optional
+ pass
+ main_module.__name__ = '__mp_main__'
+ code = loader.get_code(main_name)
+ exec(code, main_module.__dict__)
+
+ old_main_modules.append(sys.modules['__main__'])
+ sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module
diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py
index 0faca78..09736ef 100644
--- a/Lib/multiprocessing/synchronize.py
+++ b/Lib/multiprocessing/synchronize.py
@@ -11,20 +11,24 @@ __all__ = [
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', 'Event'
]
+import os
import threading
import sys
-
+import itertools
+import tempfile
import _multiprocessing
-from multiprocessing.process import current_process
-from multiprocessing.util import register_after_fork, debug
-from multiprocessing.forking import assert_spawning, Popen
+
from time import time as _time
+from . import popen
+from . import process
+from . import util
+
# Try to import the mp.synchronize module cleanly, if it fails
# raise ImportError for platforms lacking a working sem_open implementation.
# See issue 3770
try:
- from _multiprocessing import SemLock
+ from _multiprocessing import SemLock, sem_unlink
except (ImportError):
raise ImportError("This platform lacks a functioning sem_open" +
" implementation, therefore, the required" +
@@ -44,15 +48,45 @@ SEM_VALUE_MAX = _multiprocessing.SemLock.SEM_VALUE_MAX
class SemLock(object):
+ _rand = tempfile._RandomNameSequence()
+
def __init__(self, kind, value, maxvalue):
- sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
- debug('created semlock with handle %s' % sl.handle)
+ unlink_immediately = (sys.platform == 'win32' or
+ popen.get_start_method() == 'fork')
+ for i in range(100):
+ try:
+ sl = self._semlock = _multiprocessing.SemLock(
+ kind, value, maxvalue, self._make_name(),
+ unlink_immediately)
+ except FileExistsError:
+ pass
+ else:
+ break
+ else:
+ raise FileExistsError('cannot find name for semaphore')
+
+ util.debug('created semlock with handle %s' % sl.handle)
self._make_methods()
if sys.platform != 'win32':
def _after_fork(obj):
obj._semlock._after_fork()
- register_after_fork(self, _after_fork)
+ util.register_after_fork(self, _after_fork)
+
+ if self._semlock.name is not None:
+ # We only get here if we are on Unix with forking
+ # disabled. When the object is garbage collected or the
+ # process shuts down we unlink the semaphore name
+ from .semaphore_tracker import register
+ register(self._semlock.name)
+ util.Finalize(self, SemLock._cleanup, (self._semlock.name,),
+ exitpriority=0)
+
+ @staticmethod
+ def _cleanup(name):
+ from .semaphore_tracker import unregister
+ sem_unlink(name)
+ unregister(name)
def _make_methods(self):
self.acquire = self._semlock.acquire
@@ -65,15 +99,24 @@ class SemLock(object):
return self._semlock.__exit__(*args)
def __getstate__(self):
- assert_spawning(self)
+ popen.assert_spawning(self)
sl = self._semlock
- return (Popen.duplicate_for_child(sl.handle), sl.kind, sl.maxvalue)
+ if sys.platform == 'win32':
+ h = popen.get_spawning_popen().duplicate_for_child(sl.handle)
+ else:
+ h = sl.handle
+ return (h, sl.kind, sl.maxvalue, sl.name)
def __setstate__(self, state):
self._semlock = _multiprocessing.SemLock._rebuild(*state)
- debug('recreated blocker with handle %r' % state[0])
+ util.debug('recreated blocker with handle %r' % state[0])
self._make_methods()
+ @staticmethod
+ def _make_name():
+ return '/%s-%s' % (process.current_process()._config['semprefix'],
+ next(SemLock._rand))
+
#
# Semaphore
#
@@ -122,7 +165,7 @@ class Lock(SemLock):
def __repr__(self):
try:
if self._semlock._is_mine():
- name = current_process().name
+ name = process.current_process().name
if threading.current_thread().name != 'MainThread':
name += '|' + threading.current_thread().name
elif self._semlock._get_value() == 1:
@@ -147,7 +190,7 @@ class RLock(SemLock):
def __repr__(self):
try:
if self._semlock._is_mine():
- name = current_process().name
+ name = process.current_process().name
if threading.current_thread().name != 'MainThread':
name += '|' + threading.current_thread().name
count = self._semlock._count()
@@ -175,7 +218,7 @@ class Condition(object):
self._make_methods()
def __getstate__(self):
- assert_spawning(self)
+ popen.assert_spawning(self)
return (self._lock, self._sleeping_count,
self._woken_count, self._wait_semaphore)
@@ -342,7 +385,7 @@ class Barrier(threading.Barrier):
def __init__(self, parties, action=None, timeout=None):
import struct
- from multiprocessing.heap import BufferWrapper
+ from .heap import BufferWrapper
wrapper = BufferWrapper(struct.calcsize('i') * 2)
cond = Condition()
self.__setstate__((parties, action, timeout, cond, wrapper))
diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py
index f5862b4..d9e4799 100644
--- a/Lib/multiprocessing/util.py
+++ b/Lib/multiprocessing/util.py
@@ -17,13 +17,13 @@ import threading # we want threading to install it's
# cleanup function before multiprocessing does
from subprocess import _args_from_interpreter_flags
-from multiprocessing.process import current_process, active_children
+from . import process
__all__ = [
'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger',
'log_to_stderr', 'get_temp_dir', 'register_after_fork',
'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal',
- 'SUBDEBUG', 'SUBWARNING',
+ 'close_all_fds_except', 'SUBDEBUG', 'SUBWARNING',
]
#
@@ -71,8 +71,6 @@ def get_logger():
_logger = logging.getLogger(LOGGER_NAME)
_logger.propagate = 0
- logging.addLevelName(SUBDEBUG, 'SUBDEBUG')
- logging.addLevelName(SUBWARNING, 'SUBWARNING')
# XXX multiprocessing should cleanup before logging
if hasattr(atexit, 'unregister'):
@@ -111,13 +109,14 @@ def log_to_stderr(level=None):
def get_temp_dir():
# get name of a temp directory which will be automatically cleaned up
- if current_process()._tempdir is None:
+ tempdir = process.current_process()._config.get('tempdir')
+ if tempdir is None:
import shutil, tempfile
tempdir = tempfile.mkdtemp(prefix='pymp-')
info('created temp directory %s', tempdir)
Finalize(None, shutil.rmtree, args=[tempdir], exitpriority=-100)
- current_process()._tempdir = tempdir
- return current_process()._tempdir
+ process.current_process()._config['tempdir'] = tempdir
+ return tempdir
#
# Support for reinitialization of objects when bootstrapping a child process
@@ -273,8 +272,8 @@ def is_exiting():
_exiting = False
def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers,
- active_children=active_children,
- current_process=current_process):
+ active_children=process.active_children,
+ current_process=process.current_process):
# We hold on to references to functions in the arglist due to the
# situation described below, where this function is called after this
# module's globals are destroyed.
@@ -303,7 +302,7 @@ def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers,
# #9207.
for p in active_children():
- if p._daemonic:
+ if p.daemon:
info('calling terminate() for daemon %s', p.name)
p._popen.terminate()
@@ -335,3 +334,54 @@ class ForkAwareLocal(threading.local):
register_after_fork(self, lambda obj : obj.__dict__.clear())
def __reduce__(self):
return type(self), ()
+
+#
+# Close fds except those specified
+#
+
+try:
+ MAXFD = os.sysconf("SC_OPEN_MAX")
+except Exception:
+ MAXFD = 256
+
+def close_all_fds_except(fds):
+ fds = list(fds) + [-1, MAXFD]
+ fds.sort()
+ assert fds[-1] == MAXFD, 'fd too large'
+ for i in range(len(fds) - 1):
+ os.closerange(fds[i]+1, fds[i+1])
+
+#
+# Start a program with only specified fds kept open
+#
+
+def spawnv_passfds(path, args, passfds):
+ import _posixsubprocess, fcntl
+ passfds = sorted(passfds)
+ tmp = []
+ # temporarily unset CLOEXEC on passed fds
+ for fd in passfds:
+ flag = fcntl.fcntl(fd, fcntl.F_GETFD)
+ if flag & fcntl.FD_CLOEXEC:
+ fcntl.fcntl(fd, fcntl.F_SETFD, flag & ~fcntl.FD_CLOEXEC)
+ tmp.append((fd, flag))
+ errpipe_read, errpipe_write = _posixsubprocess.cloexec_pipe()
+ try:
+ return _posixsubprocess.fork_exec(
+ args, [os.fsencode(path)], True, passfds, None, None,
+ -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write,
+ False, False, None)
+ finally:
+ os.close(errpipe_read)
+ os.close(errpipe_write)
+ # reset CLOEXEC where necessary
+ for fd, flag in tmp:
+ fcntl.fcntl(fd, fcntl.F_SETFD, flag)
+
+#
+# Return pipe with CLOEXEC set on fds
+#
+
+def pipe():
+ import _posixsubprocess
+ return _posixsubprocess.cloexec_pipe()
diff --git a/Lib/netrc.py b/Lib/netrc.py
index c96db6f..7fe69ee 100644
--- a/Lib/netrc.py
+++ b/Lib/netrc.py
@@ -25,7 +25,7 @@ class netrc:
try:
file = os.path.join(os.environ['HOME'], ".netrc")
except KeyError:
- raise IOError("Could not find .netrc: $HOME is not set")
+ raise OSError("Could not find .netrc: $HOME is not set")
self.hosts = {}
self.macros = {}
with open(file) as fp:
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index 2de6ebd..01d4303 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -359,7 +359,7 @@ class _NNTPBase:
if is_connected():
try:
self.quit()
- except (socket.error, EOFError):
+ except (OSError, EOFError):
pass
finally:
if is_connected():
@@ -947,7 +947,7 @@ class _NNTPBase:
if auth:
user = auth[0]
password = auth[2]
- except IOError:
+ except OSError:
pass
# Perform NNTP authentication if needed.
if not user:
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index 826be87..6b65697 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -17,7 +17,7 @@ __all__ = ["normcase","isabs","join","splitdrive","split","splitext",
"ismount", "expanduser","expandvars","normpath","abspath",
"splitunc","curdir","pardir","sep","pathsep","defpath","altsep",
"extsep","devnull","realpath","supports_unicode_filenames","relpath",
- "samefile", "sameopenfile",]
+ "samefile", "sameopenfile", "samestat",]
# strings representing various path-related bits and pieces
# These are primarily for export; internally, they are hardcoded.
@@ -30,9 +30,6 @@ altsep = '/'
defpath = '.;C:\\bin'
if 'ce' in sys.builtin_module_names:
defpath = '\\Windows'
-elif 'os2' in sys.builtin_module_names:
- # OS/2 w/ VACPP
- altsep = '/'
devnull = 'nul'
def _get_empty(path):
@@ -320,12 +317,11 @@ def dirname(p):
def islink(path):
"""Test whether a path is a symbolic link.
- This will always return false for Windows prior to 6.0
- and for OS/2.
+ This will always return false for Windows prior to 6.0.
"""
try:
st = os.lstat(path)
- except (os.error, AttributeError):
+ except (OSError, AttributeError):
return False
return stat.S_ISLNK(st.st_mode)
@@ -335,20 +331,39 @@ def lexists(path):
"""Test whether a path exists. Returns True for broken symbolic links"""
try:
st = os.lstat(path)
- except (os.error, WindowsError):
+ except OSError:
return False
return True
-# Is a path a mount point? Either a root (with or without drive letter)
-# or an UNC path with at most a / or \ after the mount point.
-
+# Is a path a mount point?
+# Any drive letter root (eg c:\)
+# Any share UNC (eg \\server\share)
+# Any volume mounted on a filesystem folder
+#
+# No one method detects all three situations. Historically we've lexically
+# detected drive letter roots and share UNCs. The canonical approach to
+# detecting mounted volumes (querying the reparse tag) fails for the most
+# common case: drive letter roots. The alternative which uses GetVolumePathName
+# fails if the drive letter is the result of a SUBST.
+try:
+ from nt import _getvolumepathname
+except ImportError:
+ _getvolumepathname = None
def ismount(path):
- """Test whether a path is a mount point (defined as root of drive)"""
+ """Test whether a path is a mount point (a drive root, the root of a
+ share, or a mounted volume)"""
seps = _get_bothseps(path)
+ path = abspath(path)
root, rest = splitdrive(path)
if root and root[0] in seps:
return (not rest) or (rest in seps)
- return rest in seps
+ if rest in seps:
+ return True
+
+ if _getvolumepathname:
+ return path.rstrip(seps) == _getvolumepathname(path).rstrip(seps)
+ else:
+ return False
# Expand paths beginning with '~' or '~user'.
@@ -588,7 +603,7 @@ else: # use native Windows method on Windows
if path: # Empty path must return current working directory.
try:
path = _getfullpathname(path)
- except WindowsError:
+ except OSError:
pass # Bad path - return unchanged.
elif isinstance(path, bytes):
path = os.getcwdb()
@@ -656,23 +671,6 @@ except (AttributeError, ImportError):
def _getfinalpathname(f):
return normcase(abspath(f))
-def samefile(f1, f2):
- "Test whether two pathnames reference the same actual file"
- return _getfinalpathname(f1) == _getfinalpathname(f2)
-
-
-try:
- from nt import _getfileinformation
-except ImportError:
- # On other operating systems, just return the fd and see that
- # it compares equal in sameopenfile.
- def _getfileinformation(fd):
- return fd
-
-def sameopenfile(f1, f2):
- """Test whether two file objects reference the same file"""
- return _getfileinformation(f1) == _getfileinformation(f2)
-
try:
# The genericpath.isdir implementation uses os.stat and checks the mode
diff --git a/Lib/nturl2path.py b/Lib/nturl2path.py
index 511dcec..5a6d44a 100644
--- a/Lib/nturl2path.py
+++ b/Lib/nturl2path.py
@@ -23,7 +23,7 @@ def url2pathname(url):
comp = url.split('|')
if len(comp) != 2 or comp[0][-1] not in string.ascii_letters:
error = 'Bad URL: ' + url
- raise IOError(error)
+ raise OSError(error)
drive = comp[0][-1].upper()
components = comp[1].split('/')
path = drive + ':'
@@ -55,7 +55,7 @@ def pathname2url(p):
comp = p.split(':')
if len(comp) != 2 or len(comp[0]) > 1:
error = 'Bad path: ' + p
- raise IOError(error)
+ raise OSError(error)
drive = urllib.parse.quote(comp[0].upper())
components = comp[1].split('\\')
diff --git a/Lib/opcode.py b/Lib/opcode.py
index a639fe3..78d1229 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -84,7 +84,6 @@ def_op('BINARY_XOR', 65)
def_op('BINARY_OR', 66)
def_op('INPLACE_POWER', 67)
def_op('GET_ITER', 68)
-def_op('STORE_LOCALS', 69)
def_op('PRINT_EXPR', 70)
def_op('LOAD_BUILD_CLASS', 71)
@@ -179,6 +178,9 @@ def_op('LIST_APPEND', 145)
def_op('SET_ADD', 146)
def_op('MAP_ADD', 147)
+def_op('LOAD_CLASSDEREF', 148)
+hasfree.append(148)
+
def_op('EXTENDED_ARG', 144)
EXTENDED_ARG = 144
diff --git a/Lib/operator.py b/Lib/operator.py
new file mode 100644
index 0000000..d31a9a4
--- /dev/null
+++ b/Lib/operator.py
@@ -0,0 +1,412 @@
+#!/usr/bin/env python3
+"""
+Operator Interface
+
+This module exports a set of functions corresponding to the intrinsic
+operators of Python. For example, operator.add(x, y) is equivalent
+to the expression x+y. The function names are those used for special
+methods; variants without leading and trailing '__' are also provided
+for convenience.
+
+This is the pure Python implementation of the module.
+"""
+
+__all__ = ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf',
+ 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand',
+ 'iconcat', 'ifloordiv', 'ilshift', 'imod', 'imul', 'index',
+ 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_',
+ 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le',
+ 'length_hint', 'lshift', 'lt', 'methodcaller', 'mod', 'mul', 'ne',
+ 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem', 'sub',
+ 'truediv', 'truth', 'xor']
+
+from builtins import abs as _abs
+
+
+# Comparison Operations *******************************************************#
+
+def lt(a, b):
+ "Same as a < b."
+ return a < b
+
+def le(a, b):
+ "Same as a <= b."
+ return a <= b
+
+def eq(a, b):
+ "Same as a == b."
+ return a == b
+
+def ne(a, b):
+ "Same as a != b."
+ return a != b
+
+def ge(a, b):
+ "Same as a >= b."
+ return a >= b
+
+def gt(a, b):
+ "Same as a > b."
+ return a > b
+
+# Logical Operations **********************************************************#
+
+def not_(a):
+ "Same as not a."
+ return not a
+
+def truth(a):
+ "Return True if a is true, False otherwise."
+ return True if a else False
+
+def is_(a, b):
+ "Same as a is b."
+ return a is b
+
+def is_not(a, b):
+ "Same as a is not b."
+ return a is not b
+
+# Mathematical/Bitwise Operations *********************************************#
+
+def abs(a):
+ "Same as abs(a)."
+ return _abs(a)
+
+def add(a, b):
+ "Same as a + b."
+ return a + b
+
+def and_(a, b):
+ "Same as a & b."
+ return a & b
+
+def floordiv(a, b):
+ "Same as a // b."
+ return a // b
+
+def index(a):
+ "Same as a.__index__()."
+ return a.__index__()
+
+def inv(a):
+ "Same as ~a."
+ return ~a
+invert = inv
+
+def lshift(a, b):
+ "Same as a << b."
+ return a << b
+
+def mod(a, b):
+ "Same as a % b."
+ return a % b
+
+def mul(a, b):
+ "Same as a * b."
+ return a * b
+
+def neg(a):
+ "Same as -a."
+ return -a
+
+def or_(a, b):
+ "Same as a | b."
+ return a | b
+
+def pos(a):
+ "Same as +a."
+ return +a
+
+def pow(a, b):
+ "Same as a ** b."
+ return a ** b
+
+def rshift(a, b):
+ "Same as a >> b."
+ return a >> b
+
+def sub(a, b):
+ "Same as a - b."
+ return a - b
+
+def truediv(a, b):
+ "Same as a / b."
+ return a / b
+
+def xor(a, b):
+ "Same as a ^ b."
+ return a ^ b
+
+# Sequence Operations *********************************************************#
+
+def concat(a, b):
+ "Same as a + b, for a and b sequences."
+ if not hasattr(a, '__getitem__'):
+ msg = "'%s' object can't be concatenated" % type(a).__name__
+ raise TypeError(msg)
+ return a + b
+
+def contains(a, b):
+ "Same as b in a (note reversed operands)."
+ return b in a
+
+def countOf(a, b):
+ "Return the number of times b occurs in a."
+ count = 0
+ for i in a:
+ if i == b:
+ count += 1
+ return count
+
+def delitem(a, b):
+ "Same as del a[b]."
+ del a[b]
+
+def getitem(a, b):
+ "Same as a[b]."
+ return a[b]
+
+def indexOf(a, b):
+ "Return the first index of b in a."
+ for i, j in enumerate(a):
+ if j == b:
+ return i
+ else:
+ raise ValueError('sequence.index(x): x not in sequence')
+
+def setitem(a, b, c):
+ "Same as a[b] = c."
+ a[b] = c
+
+def length_hint(obj, default=0):
+ """
+ Return an estimate of the number of items in obj.
+ This is useful for presizing containers when building from an iterable.
+
+ If the object supports len(), the result will be exact. Otherwise, it may
+ over- or under-estimate by an arbitrary amount. The result will be an
+ integer >= 0.
+ """
+ if not isinstance(default, int):
+ msg = ("'%s' object cannot be interpreted as an integer" %
+ type(default).__name__)
+ raise TypeError(msg)
+
+ try:
+ return len(obj)
+ except TypeError:
+ pass
+
+ try:
+ hint = type(obj).__length_hint__
+ except AttributeError:
+ return default
+
+ try:
+ val = hint(obj)
+ except TypeError:
+ return default
+ if val is NotImplemented:
+ return default
+ if not isinstance(val, int):
+ msg = ('__length_hint__ must be integer, not %s' %
+ type(val).__name__)
+ raise TypeError(msg)
+ if val < 0:
+ msg = '__length_hint__() should return >= 0'
+ raise ValueError(msg)
+ return val
+
+# Generalized Lookup Objects **************************************************#
+
+class attrgetter:
+ """
+ Return a callable object that fetches the given attribute(s) from its operand.
+ After f = attrgetter('name'), the call f(r) returns r.name.
+ After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).
+ After h = attrgetter('name.first', 'name.last'), the call h(r) returns
+ (r.name.first, r.name.last).
+ """
+ def __init__(self, attr, *attrs):
+ if not attrs:
+ if not isinstance(attr, str):
+ raise TypeError('attribute name must be a string')
+ names = attr.split('.')
+ def func(obj):
+ for name in names:
+ obj = getattr(obj, name)
+ return obj
+ self._call = func
+ else:
+ getters = tuple(map(attrgetter, (attr,) + attrs))
+ def func(obj):
+ return tuple(getter(obj) for getter in getters)
+ self._call = func
+
+ def __call__(self, obj):
+ return self._call(obj)
+
+class itemgetter:
+ """
+ Return a callable object that fetches the given item(s) from its operand.
+ After f = itemgetter(2), the call f(r) returns r[2].
+ After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
+ """
+ def __init__(self, item, *items):
+ if not items:
+ def func(obj):
+ return obj[item]
+ self._call = func
+ else:
+ items = (item,) + items
+ def func(obj):
+ return tuple(obj[i] for i in items)
+ self._call = func
+
+ def __call__(self, obj):
+ return self._call(obj)
+
+class methodcaller:
+ """
+ Return a callable object that calls the given method on its operand.
+ After f = methodcaller('name'), the call f(r) returns r.name().
+ After g = methodcaller('name', 'date', foo=1), the call g(r) returns
+ r.name('date', foo=1).
+ """
+
+ def __init__(*args, **kwargs):
+ if len(args) < 2:
+ msg = "methodcaller needs at least one argument, the method name"
+ raise TypeError(msg)
+ self = args[0]
+ self._name = args[1]
+ self._args = args[2:]
+ self._kwargs = kwargs
+
+ def __call__(self, obj):
+ return getattr(obj, self._name)(*self._args, **self._kwargs)
+
+# In-place Operations *********************************************************#
+
+def iadd(a, b):
+ "Same as a += b."
+ a += b
+ return a
+
+def iand(a, b):
+ "Same as a &= b."
+ a &= b
+ return a
+
+def iconcat(a, b):
+ "Same as a += b, for a and b sequences."
+ if not hasattr(a, '__getitem__'):
+ msg = "'%s' object can't be concatenated" % type(a).__name__
+ raise TypeError(msg)
+ a += b
+ return a
+
+def ifloordiv(a, b):
+ "Same as a //= b."
+ a //= b
+ return a
+
+def ilshift(a, b):
+ "Same as a <<= b."
+ a <<= b
+ return a
+
+def imod(a, b):
+ "Same as a %= b."
+ a %= b
+ return a
+
+def imul(a, b):
+ "Same as a *= b."
+ a *= b
+ return a
+
+def ior(a, b):
+ "Same as a |= b."
+ a |= b
+ return a
+
+def ipow(a, b):
+ "Same as a **= b."
+ a **=b
+ return a
+
+def irshift(a, b):
+ "Same as a >>= b."
+ a >>= b
+ return a
+
+def isub(a, b):
+ "Same as a -= b."
+ a -= b
+ return a
+
+def itruediv(a, b):
+ "Same as a /= b."
+ a /= b
+ return a
+
+def ixor(a, b):
+ "Same as a ^= b."
+ a ^= b
+ return a
+
+
+try:
+ from _operator import *
+except ImportError:
+ pass
+else:
+ from _operator import __doc__
+
+# All of these "__func__ = func" assignments have to happen after importing
+# from _operator to make sure they're set to the right function
+__lt__ = lt
+__le__ = le
+__eq__ = eq
+__ne__ = ne
+__ge__ = ge
+__gt__ = gt
+__not__ = not_
+__abs__ = abs
+__add__ = add
+__and__ = and_
+__floordiv__ = floordiv
+__index__ = index
+__inv__ = inv
+__invert__ = invert
+__lshift__ = lshift
+__mod__ = mod
+__mul__ = mul
+__neg__ = neg
+__or__ = or_
+__pos__ = pos
+__pow__ = pow
+__rshift__ = rshift
+__sub__ = sub
+__truediv__ = truediv
+__xor__ = xor
+__concat__ = concat
+__contains__ = contains
+__delitem__ = delitem
+__getitem__ = getitem
+__setitem__ = setitem
+__iadd__ = iadd
+__iand__ = iand
+__iconcat__ = iconcat
+__ifloordiv__ = ifloordiv
+__ilshift__ = ilshift
+__imod__ = imod
+__imul__ = imul
+__ior__ = ior
+__ipow__ = ipow
+__irshift__ = irshift
+__isub__ = isub
+__itruediv__ = itruediv
+__ixor__ = ixor
diff --git a/Lib/os.py b/Lib/os.py
index 06616c6..96720e4 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -1,9 +1,9 @@
r"""OS routines for Mac, NT, or Posix depending on what system we're on.
This exports:
- - all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
+ - all functions from posix, nt or ce, e.g. unlink, stat, etc.
- os.path is either posixpath or ntpath
- - os.name is either 'posix', 'nt', 'os2' or 'ce'.
+ - os.name is either 'posix', 'nt' or 'ce'.
- os.curdir is a string representing the current directory ('.' or ':')
- os.pardir is a string representing the parent directory ('..' or '::')
- os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
@@ -81,30 +81,6 @@ elif 'nt' in _names:
except ImportError:
pass
-elif 'os2' in _names:
- name = 'os2'
- linesep = '\r\n'
- from os2 import *
- try:
- from os2 import _exit
- __all__.append('_exit')
- except ImportError:
- pass
- if sys.version.find('EMX GCC') == -1:
- import ntpath as path
- else:
- import os2emxpath as path
- from _emx_link import link
-
- import os2
- __all__.extend(_get_exports_list(os2))
- del os2
-
- try:
- from os2 import _have_functions
- except ImportError:
- pass
-
elif 'ce' in _names:
name = 'ce'
linesep = '\r\n'
@@ -256,10 +232,9 @@ def makedirs(name, mode=0o777, exist_ok=False):
if head and tail and not path.exists(head):
try:
makedirs(head, mode, exist_ok)
- except OSError as e:
+ except FileExistsError:
# be happy if someone already created the path
- if e.errno != errno.EEXIST:
- raise
+ pass
cdir = curdir
if isinstance(tail, bytes):
cdir = bytes(curdir, 'ASCII')
@@ -302,7 +277,7 @@ def removedirs(name):
while head and tail:
try:
rmdir(head)
- except error:
+ except OSError:
break
head, tail = path.split(head)
@@ -329,7 +304,7 @@ def renames(old, new):
if head and tail:
try:
removedirs(head)
- except error:
+ except OSError:
pass
__all__.extend(["makedirs", "removedirs", "renames"])
@@ -365,7 +340,7 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
By default errors from the os.listdir() call are ignored. If
optional arg 'onerror' is specified, it should be a function; it
- will be called with one argument, an os.error instance. It can
+ will be called with one argument, an OSError instance. It can
report the error to continue with the walk, or raise the exception
to abort the walk. Note that the filename is available as the
filename attribute of the exception object.
@@ -399,10 +374,10 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
# minor reason when (say) a thousand readable directories are still
# left to visit. That logic is copied here.
try:
- # Note that listdir and error are globals in this module due
+ # Note that listdir is global in this module due
# to earlier import-*.
names = listdir(top)
- except error as err:
+ except OSError as err:
if onerror is not None:
onerror(err)
return
@@ -504,7 +479,7 @@ if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
try:
orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
dirfd = open(name, O_RDONLY, dir_fd=topfd)
- except error as err:
+ except OSError as err:
if onerror is not None:
onerror(err)
return
@@ -599,7 +574,7 @@ def _execvpe(file, args, env=None):
fullname = path.join(dir, file)
try:
exec_func(fullname, *argrest)
- except error as e:
+ except OSError as e:
last_exc = e
tb = sys.exc_info()[2]
if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
@@ -716,17 +691,19 @@ try:
except NameError:
_putenv = lambda key, value: None
else:
- __all__.append("putenv")
+ if "putenv" not in __all__:
+ __all__.append("putenv")
try:
_unsetenv = unsetenv
except NameError:
_unsetenv = lambda key: _putenv(key, "")
else:
- __all__.append("unsetenv")
+ if "unsetenv" not in __all__:
+ __all__.append("unsetenv")
def _createenviron():
- if name in ('os2', 'nt'):
+ if name == 'nt':
# Where Env Var Names Must Be UPPERCASE
def check_str(value):
if not isinstance(value, str):
@@ -766,7 +743,7 @@ def getenv(key, default=None):
key, default and the result are str."""
return environ.get(key, default)
-supports_bytes_environ = name not in ('os2', 'nt')
+supports_bytes_environ = (name != 'nt')
__all__.extend(("getenv", "supports_bytes_environ"))
if supports_bytes_environ:
@@ -865,7 +842,7 @@ if _exists("fork") and not _exists("spawnv") and _exists("execv"):
elif WIFEXITED(sts):
return WEXITSTATUS(sts)
else:
- raise error("Not stopped, signaled or exited???")
+ raise OSError("Not stopped, signaled or exited???")
def spawnv(mode, file, args):
"""spawnv(mode, file, args) -> integer
@@ -908,6 +885,10 @@ If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return _spawnvef(mode, file, args, env, execvpe)
+
+ __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"])
+
+
if _exists("spawnv"):
# These aren't supplied by the basic Windows code
# but can be easily implemented in Python
@@ -933,7 +914,7 @@ otherwise return -SIG, where SIG is the signal that killed it. """
return spawnve(mode, file, args[:-1], env)
- __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
+ __all__.extend(["spawnl", "spawnle"])
if _exists("spawnvp"):
@@ -961,7 +942,8 @@ otherwise return -SIG, where SIG is the signal that killed it. """
return spawnvpe(mode, file, args[:-1], env)
- __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
+ __all__.extend(["spawnlp", "spawnlpe"])
+
import copyreg as _copyreg
diff --git a/Lib/os2emxpath.py b/Lib/os2emxpath.py
deleted file mode 100644
index 0ccbf8a..0000000
--- a/Lib/os2emxpath.py
+++ /dev/null
@@ -1,158 +0,0 @@
-# Module 'os2emxpath' -- common operations on OS/2 pathnames
-"""Common pathname manipulations, OS/2 EMX version.
-
-Instead of importing this module directly, import os and refer to this
-module as os.path.
-"""
-
-import os
-import stat
-from genericpath import *
-from ntpath import (expanduser, expandvars, isabs, islink, splitdrive,
- splitext, split)
-
-__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
- "basename","dirname","commonprefix","getsize","getmtime",
- "getatime","getctime", "islink","exists","lexists","isdir","isfile",
- "ismount","expanduser","expandvars","normpath","abspath",
- "splitunc","curdir","pardir","sep","pathsep","defpath","altsep",
- "extsep","devnull","realpath","supports_unicode_filenames"]
-
-# strings representing various path-related bits and pieces
-curdir = '.'
-pardir = '..'
-extsep = '.'
-sep = '/'
-altsep = '\\'
-pathsep = ';'
-defpath = '.;C:\\bin'
-devnull = 'nul'
-
-# Normalize the case of a pathname and map slashes to backslashes.
-# Other normalizations (such as optimizing '../' away) are not done
-# (this is done by normpath).
-
-def normcase(s):
- """Normalize case of pathname.
-
- Makes all characters lowercase and all altseps into seps."""
- if not isinstance(s, (bytes, str)):
- raise TypeError("normcase() argument must be str or bytes, "
- "not '{}'".format(s.__class__.__name__))
- return s.replace('\\', '/').lower()
-
-
-# Join two (or more) paths.
-
-def join(a, *p):
- """Join two or more pathname components, inserting sep as needed"""
- path = a
- for b in p:
- if isabs(b):
- path = b
- elif path == '' or path[-1:] in '/\\:':
- path = path + b
- else:
- path = path + '/' + b
- return path
-
-
-# Parse UNC paths
-def splitunc(p):
- """Split a pathname into UNC mount point and relative path specifiers.
-
- Return a 2-tuple (unc, rest); either part may be empty.
- If unc is not empty, it has the form '//host/mount' (or similar
- using backslashes). unc+rest is always the input path.
- Paths containing drive letters never have an UNC part.
- """
- if p[1:2] == ':':
- return '', p # Drive letter present
- firstTwo = p[0:2]
- if firstTwo == '/' * 2 or firstTwo == '\\' * 2:
- # is a UNC path:
- # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter
- # \\machine\mountpoint\directories...
- # directory ^^^^^^^^^^^^^^^
- normp = normcase(p)
- index = normp.find('/', 2)
- if index == -1:
- ##raise RuntimeError, 'illegal UNC path: "' + p + '"'
- return ("", p)
- index = normp.find('/', index + 1)
- if index == -1:
- index = len(p)
- return p[:index], p[index:]
- return '', p
-
-
-# Return the tail (basename) part of a path.
-
-def basename(p):
- """Returns the final component of a pathname"""
- return split(p)[1]
-
-
-# Return the head (dirname) part of a path.
-
-def dirname(p):
- """Returns the directory component of a pathname"""
- return split(p)[0]
-
-
-# alias exists to lexists
-lexists = exists
-
-
-# Is a path a directory?
-
-# Is a path a mount point? Either a root (with or without drive letter)
-# or an UNC path with at most a / or \ after the mount point.
-
-def ismount(path):
- """Test whether a path is a mount point (defined as root of drive)"""
- unc, rest = splitunc(path)
- if unc:
- return rest in ("", "/", "\\")
- p = splitdrive(path)[1]
- return len(p) == 1 and p[0] in '/\\'
-
-
-# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
-
-def normpath(path):
- """Normalize path, eliminating double slashes, etc."""
- path = path.replace('\\', '/')
- prefix, path = splitdrive(path)
- while path[:1] == '/':
- prefix = prefix + '/'
- path = path[1:]
- comps = path.split('/')
- i = 0
- while i < len(comps):
- if comps[i] == '.':
- del comps[i]
- elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'):
- del comps[i-1:i+1]
- i = i - 1
- elif comps[i] == '' and i > 0 and comps[i-1] != '':
- del comps[i]
- else:
- i = i + 1
- # If the path is now empty, substitute '.'
- if not prefix and not comps:
- comps.append('.')
- return prefix + '/'.join(comps)
-
-
-# Return an absolute path.
-def abspath(path):
- """Return the absolute version of a path"""
- if not isabs(path):
- path = join(os.getcwd(), path)
- return normpath(path)
-
-# realpath is a no-op on systems without islink support
-realpath = abspath
-
-supports_unicode_filenames = False
diff --git a/Lib/pdb.py b/Lib/pdb.py
index b4a19e4..45fe477 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -92,7 +92,7 @@ def find_function(funcname, filename):
cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
try:
fp = open(filename)
- except IOError:
+ except OSError:
return None
# consumer of this info expects the first line to be 1
lineno = 1
@@ -170,12 +170,12 @@ class Pdb(bdb.Bdb, cmd.Cmd):
try:
with open(os.path.join(envHome, ".pdbrc")) as rcFile:
self.rcLines.extend(rcFile)
- except IOError:
+ except OSError:
pass
try:
with open(".pdbrc") as rcFile:
self.rcLines.extend(rcFile)
- except IOError:
+ except OSError:
pass
self.commands = {} # associates a command list to breakpoint numbers
@@ -1241,7 +1241,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
breaklist = self.get_file_breaks(filename)
try:
lines, lineno = getsourcelines(self.curframe)
- except IOError as err:
+ except OSError as err:
self.error(err)
return
self._print_lines(lines, lineno, breaklist, self.curframe)
@@ -1257,7 +1257,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
return
try:
lines, lineno = getsourcelines(obj)
- except (IOError, TypeError) as err:
+ except (OSError, TypeError) as err:
self.error(err)
return
self._print_lines(lines, lineno)
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 1d8185c..b3b775f 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -26,9 +26,10 @@ Misc variables:
from types import FunctionType, BuiltinFunctionType
from copyreg import dispatch_table
from copyreg import _extension_registry, _inverted_registry, _extension_cache
-import marshal
+from itertools import islice
import sys
-import struct
+from sys import maxsize
+from struct import pack, unpack
import re
import io
import codecs
@@ -58,11 +59,6 @@ HIGHEST_PROTOCOL = 3
# there are too many issues with that.
DEFAULT_PROTOCOL = 3
-# Why use struct.pack() for pickling but marshal.loads() for
-# unpickling? struct.pack() is 40% faster than marshal.dumps(), but
-# marshal.loads() is twice as fast as struct.unpack()!
-mloads = marshal.loads
-
class PickleError(Exception):
"""A common base class for the other pickling exceptions."""
pass
@@ -231,7 +227,7 @@ class _Pickler:
raise PicklingError("Pickler.__init__() was not called by "
"%s.__init__()" % (self.__class__.__name__,))
if self.proto >= 2:
- self.write(PROTO + bytes([self.proto]))
+ self.write(PROTO + pack("<B", self.proto))
self.save(obj)
self.write(STOP)
@@ -258,20 +254,20 @@ class _Pickler:
self.memo[id(obj)] = memo_len, obj
# Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
- def put(self, i, pack=struct.pack):
+ def put(self, i):
if self.bin:
if i < 256:
- return BINPUT + bytes([i])
+ return BINPUT + pack("<B", i)
else:
return LONG_BINPUT + pack("<I", i)
return PUT + repr(i).encode("ascii") + b'\n'
# Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
- def get(self, i, pack=struct.pack):
+ def get(self, i):
if self.bin:
if i < 256:
- return BINGET + bytes([i])
+ return BINGET + pack("<B", i)
else:
return LONG_BINGET + pack("<I", i)
@@ -286,20 +282,20 @@ class _Pickler:
# Check the memo
x = self.memo.get(id(obj))
- if x:
+ if x is not None:
self.write(self.get(x[0]))
return
# Check the type dispatch table
t = type(obj)
f = self.dispatch.get(t)
- if f:
+ if f is not None:
f(self, obj) # Call unbound method with explicit self
return
# Check private dispatch table if any, or else copyreg.dispatch_table
reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
- if reduce:
+ if reduce is not None:
rv = reduce(obj)
else:
# Check for a class with a custom metaclass; treat as regular class
@@ -313,11 +309,11 @@ class _Pickler:
# Check for a __reduce_ex__ method, fall back to __reduce__
reduce = getattr(obj, "__reduce_ex__", None)
- if reduce:
+ if reduce is not None:
rv = reduce(self.proto)
else:
reduce = getattr(obj, "__reduce__", None)
- if reduce:
+ if reduce is not None:
rv = reduce()
else:
raise PicklingError("Can't pickle %r object: %r" %
@@ -448,12 +444,12 @@ class _Pickler:
def save_bool(self, obj):
if self.proto >= 2:
- self.write(obj and NEWTRUE or NEWFALSE)
+ self.write(NEWTRUE if obj else NEWFALSE)
else:
- self.write(obj and TRUE or FALSE)
+ self.write(TRUE if obj else FALSE)
dispatch[bool] = save_bool
- def save_long(self, obj, pack=struct.pack):
+ def save_long(self, obj):
if self.bin:
# If the int is small enough to fit in a signed 4-byte 2's-comp
# format, we can store it more efficiently than the general
@@ -461,39 +457,36 @@ class _Pickler:
# First one- and two-byte unsigned ints:
if obj >= 0:
if obj <= 0xff:
- self.write(BININT1 + bytes([obj]))
+ self.write(BININT1 + pack("<B", obj))
return
if obj <= 0xffff:
- self.write(BININT2 + bytes([obj&0xff, obj>>8]))
+ self.write(BININT2 + pack("<H", obj))
return
# Next check for 4-byte signed ints:
- high_bits = obj >> 31 # note that Python shift sign-extends
- if high_bits == 0 or high_bits == -1:
- # All high bits are copies of bit 2**31, so the value
- # fits in a 4-byte signed int.
+ if -0x80000000 <= obj <= 0x7fffffff:
self.write(BININT + pack("<i", obj))
return
if self.proto >= 2:
encoded = encode_long(obj)
n = len(encoded)
if n < 256:
- self.write(LONG1 + bytes([n]) + encoded)
+ self.write(LONG1 + pack("<B", n) + encoded)
else:
self.write(LONG4 + pack("<i", n) + encoded)
return
self.write(LONG + repr(obj).encode("ascii") + b'L\n')
dispatch[int] = save_long
- def save_float(self, obj, pack=struct.pack):
+ def save_float(self, obj):
if self.bin:
self.write(BINFLOAT + pack('>d', obj))
else:
self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
dispatch[float] = save_float
- def save_bytes(self, obj, pack=struct.pack):
+ def save_bytes(self, obj):
if self.proto < 3:
- if len(obj) == 0:
+ if not obj: # bytes object is empty
self.save_reduce(bytes, (), obj=obj)
else:
self.save_reduce(codecs.encode,
@@ -501,13 +494,13 @@ class _Pickler:
return
n = len(obj)
if n < 256:
- self.write(SHORT_BINBYTES + bytes([n]) + bytes(obj))
+ self.write(SHORT_BINBYTES + pack("<B", n) + obj)
else:
- self.write(BINBYTES + pack("<I", n) + bytes(obj))
+ self.write(BINBYTES + pack("<I", n) + obj)
self.memoize(obj)
dispatch[bytes] = save_bytes
- def save_str(self, obj, pack=struct.pack):
+ def save_str(self, obj):
if self.bin:
encoded = obj.encode('utf-8', 'surrogatepass')
n = len(encoded)
@@ -515,39 +508,36 @@ class _Pickler:
else:
obj = obj.replace("\\", "\\u005c")
obj = obj.replace("\n", "\\u000a")
- self.write(UNICODE + bytes(obj.encode('raw-unicode-escape')) +
- b'\n')
+ self.write(UNICODE + obj.encode('raw-unicode-escape') + b'\n')
self.memoize(obj)
dispatch[str] = save_str
def save_tuple(self, obj):
- write = self.write
- proto = self.proto
-
- n = len(obj)
- if n == 0:
- if proto:
- write(EMPTY_TUPLE)
+ if not obj: # tuple is empty
+ if self.bin:
+ self.write(EMPTY_TUPLE)
else:
- write(MARK + TUPLE)
+ self.write(MARK + TUPLE)
return
+ n = len(obj)
save = self.save
memo = self.memo
- if n <= 3 and proto >= 2:
+ if n <= 3 and self.proto >= 2:
for element in obj:
save(element)
# Subtle. Same as in the big comment below.
if id(obj) in memo:
get = self.get(memo[id(obj)][0])
- write(POP * n + get)
+ self.write(POP * n + get)
else:
- write(_tuplesize2code[n])
+ self.write(_tuplesize2code[n])
self.memoize(obj)
return
# proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
# has more than 3 elements.
+ write = self.write
write(MARK)
for element in obj:
save(element)
@@ -561,25 +551,23 @@ class _Pickler:
# could have been done in the "for element" loop instead, but
# recursive tuples are a rare thing.
get = self.get(memo[id(obj)][0])
- if proto:
+ if self.bin:
write(POP_MARK + get)
else: # proto 0 -- POP_MARK not available
write(POP * (n+1) + get)
return
# No recursion.
- self.write(TUPLE)
+ write(TUPLE)
self.memoize(obj)
dispatch[tuple] = save_tuple
def save_list(self, obj):
- write = self.write
-
if self.bin:
- write(EMPTY_LIST)
+ self.write(EMPTY_LIST)
else: # proto 0 -- can't use EMPTY_LIST
- write(MARK + LIST)
+ self.write(MARK + LIST)
self.memoize(obj)
self._batch_appends(obj)
@@ -599,17 +587,9 @@ class _Pickler:
write(APPEND)
return
- items = iter(items)
- r = range(self._BATCHSIZE)
- while items is not None:
- tmp = []
- for i in r:
- try:
- x = next(items)
- tmp.append(x)
- except StopIteration:
- items = None
- break
+ it = iter(items)
+ while True:
+ tmp = list(islice(it, self._BATCHSIZE))
n = len(tmp)
if n > 1:
write(MARK)
@@ -620,14 +600,14 @@ class _Pickler:
save(tmp[0])
write(APPEND)
# else tmp is empty, and we're done
+ if n < self._BATCHSIZE:
+ return
def save_dict(self, obj):
- write = self.write
-
if self.bin:
- write(EMPTY_DICT)
+ self.write(EMPTY_DICT)
else: # proto 0 -- can't use EMPTY_DICT
- write(MARK + DICT)
+ self.write(MARK + DICT)
self.memoize(obj)
self._batch_setitems(obj.items())
@@ -648,16 +628,9 @@ class _Pickler:
write(SETITEM)
return
- items = iter(items)
- r = range(self._BATCHSIZE)
- while items is not None:
- tmp = []
- for i in r:
- try:
- tmp.append(next(items))
- except StopIteration:
- items = None
- break
+ it = iter(items)
+ while True:
+ tmp = list(islice(it, self._BATCHSIZE))
n = len(tmp)
if n > 1:
write(MARK)
@@ -671,8 +644,10 @@ class _Pickler:
save(v)
write(SETITEM)
# else tmp is empty, and we're done
+ if n < self._BATCHSIZE:
+ return
- def save_global(self, obj, name=None, pack=struct.pack):
+ def save_global(self, obj, name=None):
write = self.write
memo = self.memo
@@ -702,9 +677,9 @@ class _Pickler:
if code:
assert code > 0
if code <= 0xff:
- write(EXT1 + bytes([code]))
+ write(EXT1 + pack("<B", code))
elif code <= 0xffff:
- write(EXT2 + bytes([code&0xff, code>>8]))
+ write(EXT2 + pack("<H", code))
else:
write(EXT4 + pack("<i", code))
return
@@ -732,25 +707,6 @@ class _Pickler:
dispatch[BuiltinFunctionType] = save_global
dispatch[type] = save_global
-# Pickling helpers
-
-def _keep_alive(x, memo):
- """Keeps a reference to the object x in the memo.
-
- Because we remember objects by their id, we have
- to assure that possibly temporary objects are kept
- alive by referencing them.
- We store a reference at the id of the memo, which should
- normally not be used unless someone tries to deepcopy
- the memo itself...
- """
- try:
- memo[id(memo)].append(x)
- except KeyError:
- # aha, this is the first one :-)
- memo[id(memo)]=[x]
-
-
# A cache for whichmodule(), mapping a function object to the name of
# the module in which the function was found.
@@ -832,7 +788,7 @@ class _Unpickler:
read = self.read
dispatch = self.dispatch
try:
- while 1:
+ while True:
key = read(1)
if not key:
raise EOFError
@@ -862,7 +818,7 @@ class _Unpickler:
dispatch = {}
def load_proto(self):
- proto = ord(self.read(1))
+ proto = self.read(1)[0]
if not 0 <= proto <= HIGHEST_PROTOCOL:
raise ValueError("unsupported pickle protocol: %d" % proto)
self.proto = proto
@@ -897,43 +853,40 @@ class _Unpickler:
elif data == TRUE[1:]:
val = True
else:
- try:
- val = int(data, 0)
- except ValueError:
- val = int(data, 0)
+ val = int(data, 0)
self.append(val)
dispatch[INT[0]] = load_int
def load_binint(self):
- self.append(mloads(b'i' + self.read(4)))
+ self.append(unpack('<i', self.read(4))[0])
dispatch[BININT[0]] = load_binint
def load_binint1(self):
- self.append(ord(self.read(1)))
+ self.append(self.read(1)[0])
dispatch[BININT1[0]] = load_binint1
def load_binint2(self):
- self.append(mloads(b'i' + self.read(2) + b'\000\000'))
+ self.append(unpack('<H', self.read(2))[0])
dispatch[BININT2[0]] = load_binint2
def load_long(self):
- val = self.readline()[:-1].decode("ascii")
- if val and val[-1] == 'L':
+ val = self.readline()[:-1]
+ if val and val[-1] == b'L'[0]:
val = val[:-1]
self.append(int(val, 0))
dispatch[LONG[0]] = load_long
def load_long1(self):
- n = ord(self.read(1))
+ n = self.read(1)[0]
data = self.read(n)
self.append(decode_long(data))
dispatch[LONG1[0]] = load_long1
def load_long4(self):
- n = mloads(b'i' + self.read(4))
+ n, = unpack('<i', self.read(4))
if n < 0:
# Corrupt or hostile pickle -- we never write one like this
- raise UnpicklingError("LONG pickle has negative byte count");
+ raise UnpicklingError("LONG pickle has negative byte count")
data = self.read(n)
self.append(decode_long(data))
dispatch[LONG4[0]] = load_long4
@@ -942,39 +895,36 @@ class _Unpickler:
self.append(float(self.readline()[:-1]))
dispatch[FLOAT[0]] = load_float
- def load_binfloat(self, unpack=struct.unpack):
+ def load_binfloat(self):
self.append(unpack('>d', self.read(8))[0])
dispatch[BINFLOAT[0]] = load_binfloat
def load_string(self):
- orig = self.readline()
- rep = orig[:-1]
- for q in (b'"', b"'"): # double or single quote
- if rep.startswith(q):
- if len(rep) < 2 or not rep.endswith(q):
- raise ValueError("insecure string pickle")
- rep = rep[len(q):-len(q)]
- break
+ data = self.readline()[:-1]
+ # Strip outermost quotes
+ if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
+ data = data[1:-1]
else:
- raise ValueError("insecure string pickle: %r" % orig)
- self.append(codecs.escape_decode(rep)[0]
+ raise UnpicklingError("the STRING opcode argument must be quoted")
+ self.append(codecs.escape_decode(data)[0]
.decode(self.encoding, self.errors))
dispatch[STRING[0]] = load_string
def load_binstring(self):
# Deprecated BINSTRING uses signed 32-bit length
- len = mloads(b'i' + self.read(4))
+ len, = unpack('<i', self.read(4))
if len < 0:
- raise UnpicklingError("BINSTRING pickle has negative byte count");
+ raise UnpicklingError("BINSTRING pickle has negative byte count")
data = self.read(len)
value = str(data, self.encoding, self.errors)
self.append(value)
dispatch[BINSTRING[0]] = load_binstring
- def load_binbytes(self, unpack=struct.unpack, maxsize=sys.maxsize):
+ def load_binbytes(self):
len, = unpack('<I', self.read(4))
if len > maxsize:
- raise UnpicklingError("BINBYTES exceeds system's maximum size of %d bytes" % maxsize);
+ raise UnpicklingError("BINBYTES exceeds system's maximum size "
+ "of %d bytes" % maxsize)
self.append(self.read(len))
dispatch[BINBYTES[0]] = load_binbytes
@@ -982,23 +932,24 @@ class _Unpickler:
self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
dispatch[UNICODE[0]] = load_unicode
- def load_binunicode(self, unpack=struct.unpack, maxsize=sys.maxsize):
+ def load_binunicode(self):
len, = unpack('<I', self.read(4))
if len > maxsize:
- raise UnpicklingError("BINUNICODE exceeds system's maximum size of %d bytes" % maxsize);
+ raise UnpicklingError("BINUNICODE exceeds system's maximum size "
+ "of %d bytes" % maxsize)
self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
dispatch[BINUNICODE[0]] = load_binunicode
def load_short_binstring(self):
- len = ord(self.read(1))
- data = bytes(self.read(len))
+ len = self.read(1)[0]
+ data = self.read(len)
value = str(data, self.encoding, self.errors)
self.append(value)
dispatch[SHORT_BINSTRING[0]] = load_short_binstring
def load_short_binbytes(self):
- len = ord(self.read(1))
- self.append(bytes(self.read(len)))
+ len = self.read(1)[0]
+ self.append(self.read(len))
dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
def load_tuple(self):
@@ -1037,12 +988,9 @@ class _Unpickler:
def load_dict(self):
k = self.marker()
- d = {}
items = self.stack[k+1:]
- for i in range(0, len(items), 2):
- key = items[i]
- value = items[i+1]
- d[key] = value
+ d = {items[i]: items[i+1]
+ for i in range(0, len(items), 2)}
self.stack[k:] = [d]
dispatch[DICT[0]] = load_dict
@@ -1094,17 +1042,17 @@ class _Unpickler:
dispatch[GLOBAL[0]] = load_global
def load_ext1(self):
- code = ord(self.read(1))
+ code = self.read(1)[0]
self.get_extension(code)
dispatch[EXT1[0]] = load_ext1
def load_ext2(self):
- code = mloads(b'i' + self.read(2) + b'\000\000')
+ code, = unpack('<H', self.read(2))
self.get_extension(code)
dispatch[EXT2[0]] = load_ext2
def load_ext4(self):
- code = mloads(b'i' + self.read(4))
+ code, = unpack('<i', self.read(4))
self.get_extension(code)
dispatch[EXT4[0]] = load_ext4
@@ -1118,7 +1066,7 @@ class _Unpickler:
if not key:
if code <= 0: # note that 0 is forbidden
# Corrupt or hostile pickle.
- raise UnpicklingError("EXT specifies code <= 0");
+ raise UnpicklingError("EXT specifies code <= 0")
raise ValueError("unregistered extension code %d" % code)
obj = self.find_class(*key)
_extension_cache[code] = obj
@@ -1172,7 +1120,7 @@ class _Unpickler:
self.append(self.memo[i])
dispatch[BINGET[0]] = load_binget
- def load_long_binget(self, unpack=struct.unpack):
+ def load_long_binget(self):
i, = unpack('<I', self.read(4))
self.append(self.memo[i])
dispatch[LONG_BINGET[0]] = load_long_binget
@@ -1191,7 +1139,7 @@ class _Unpickler:
self.memo[i] = self.stack[-1]
dispatch[BINPUT[0]] = load_binput
- def load_long_binput(self, unpack=struct.unpack, maxsize=sys.maxsize):
+ def load_long_binput(self):
i, = unpack('<I', self.read(4))
if i > maxsize:
raise ValueError("negative LONG_BINPUT argument")
@@ -1242,7 +1190,7 @@ class _Unpickler:
state = stack.pop()
inst = stack[-1]
setstate = getattr(inst, "__setstate__", None)
- if setstate:
+ if setstate is not None:
setstate(state)
return
slotstate = None
diff --git a/Lib/pickletools.py b/Lib/pickletools.py
index 7351c8d..f54b902 100644
--- a/Lib/pickletools.py
+++ b/Lib/pickletools.py
@@ -34,119 +34,118 @@ bytes_types = pickle.bytes_types
# by a later GET.
-"""
-"A pickle" is a program for a virtual pickle machine (PM, but more accurately
-called an unpickling machine). It's a sequence of opcodes, interpreted by the
-PM, building an arbitrarily complex Python object.
-
-For the most part, the PM is very simple: there are no looping, testing, or
-conditional instructions, no arithmetic and no function calls. Opcodes are
-executed once each, from first to last, until a STOP opcode is reached.
-
-The PM has two data areas, "the stack" and "the memo".
-
-Many opcodes push Python objects onto the stack; e.g., INT pushes a Python
-integer object on the stack, whose value is gotten from a decimal string
-literal immediately following the INT opcode in the pickle bytestream. Other
-opcodes take Python objects off the stack. The result of unpickling is
-whatever object is left on the stack when the final STOP opcode is executed.
-
-The memo is simply an array of objects, or it can be implemented as a dict
-mapping little integers to objects. The memo serves as the PM's "long term
-memory", and the little integers indexing the memo are akin to variable
-names. Some opcodes pop a stack object into the memo at a given index,
-and others push a memo object at a given index onto the stack again.
-
-At heart, that's all the PM has. Subtleties arise for these reasons:
-
-+ Object identity. Objects can be arbitrarily complex, and subobjects
- may be shared (for example, the list [a, a] refers to the same object a
- twice). It can be vital that unpickling recreate an isomorphic object
- graph, faithfully reproducing sharing.
-
-+ Recursive objects. For example, after "L = []; L.append(L)", L is a
- list, and L[0] is the same list. This is related to the object identity
- point, and some sequences of pickle opcodes are subtle in order to
- get the right result in all cases.
-
-+ Things pickle doesn't know everything about. Examples of things pickle
- does know everything about are Python's builtin scalar and container
- types, like ints and tuples. They generally have opcodes dedicated to
- them. For things like module references and instances of user-defined
- classes, pickle's knowledge is limited. Historically, many enhancements
- have been made to the pickle protocol in order to do a better (faster,
- and/or more compact) job on those.
-
-+ Backward compatibility and micro-optimization. As explained below,
- pickle opcodes never go away, not even when better ways to do a thing
- get invented. The repertoire of the PM just keeps growing over time.
- For example, protocol 0 had two opcodes for building Python integers (INT
- and LONG), protocol 1 added three more for more-efficient pickling of short
- integers, and protocol 2 added two more for more-efficient pickling of
- long integers (before protocol 2, the only ways to pickle a Python long
- took time quadratic in the number of digits, for both pickling and
- unpickling). "Opcode bloat" isn't so much a subtlety as a source of
- wearying complication.
-
-
-Pickle protocols:
-
-For compatibility, the meaning of a pickle opcode never changes. Instead new
-pickle opcodes get added, and each version's unpickler can handle all the
-pickle opcodes in all protocol versions to date. So old pickles continue to
-be readable forever. The pickler can generally be told to restrict itself to
-the subset of opcodes available under previous protocol versions too, so that
-users can create pickles under the current version readable by older
-versions. However, a pickle does not contain its version number embedded
-within it. If an older unpickler tries to read a pickle using a later
-protocol, the result is most likely an exception due to seeing an unknown (in
-the older unpickler) opcode.
-
-The original pickle used what's now called "protocol 0", and what was called
-"text mode" before Python 2.3. The entire pickle bytestream is made up of
-printable 7-bit ASCII characters, plus the newline character, in protocol 0.
-That's why it was called text mode. Protocol 0 is small and elegant, but
-sometimes painfully inefficient.
-
-The second major set of additions is now called "protocol 1", and was called
-"binary mode" before Python 2.3. This added many opcodes with arguments
-consisting of arbitrary bytes, including NUL bytes and unprintable "high bit"
-bytes. Binary mode pickles can be substantially smaller than equivalent
-text mode pickles, and sometimes faster too; e.g., BININT represents a 4-byte
-int as 4 bytes following the opcode, which is cheaper to unpickle than the
-(perhaps) 11-character decimal string attached to INT. Protocol 1 also added
-a number of opcodes that operate on many stack elements at once (like APPENDS
-and SETITEMS), and "shortcut" opcodes (like EMPTY_DICT and EMPTY_TUPLE).
-
-The third major set of additions came in Python 2.3, and is called "protocol
-2". This added:
-
-- A better way to pickle instances of new-style classes (NEWOBJ).
-
-- A way for a pickle to identify its protocol (PROTO).
-
-- Time- and space- efficient pickling of long ints (LONG{1,4}).
-
-- Shortcuts for small tuples (TUPLE{1,2,3}}.
-
-- Dedicated opcodes for bools (NEWTRUE, NEWFALSE).
-
-- The "extension registry", a vector of popular objects that can be pushed
- efficiently by index (EXT{1,2,4}). This is akin to the memo and GET, but
- the registry contents are predefined (there's nothing akin to the memo's
- PUT).
-
-Another independent change with Python 2.3 is the abandonment of any
-pretense that it might be safe to load pickles received from untrusted
-parties -- no sufficient security analysis has been done to guarantee
-this and there isn't a use case that warrants the expense of such an
-analysis.
-
-To this end, all tests for __safe_for_unpickling__ or for
-copyreg.safe_constructors are removed from the unpickling code.
-References to these variables in the descriptions below are to be seen
-as describing unpickling in Python 2.2 and before.
-"""
+# "A pickle" is a program for a virtual pickle machine (PM, but more accurately
+# called an unpickling machine). It's a sequence of opcodes, interpreted by the
+# PM, building an arbitrarily complex Python object.
+#
+# For the most part, the PM is very simple: there are no looping, testing, or
+# conditional instructions, no arithmetic and no function calls. Opcodes are
+# executed once each, from first to last, until a STOP opcode is reached.
+#
+# The PM has two data areas, "the stack" and "the memo".
+#
+# Many opcodes push Python objects onto the stack; e.g., INT pushes a Python
+# integer object on the stack, whose value is gotten from a decimal string
+# literal immediately following the INT opcode in the pickle bytestream. Other
+# opcodes take Python objects off the stack. The result of unpickling is
+# whatever object is left on the stack when the final STOP opcode is executed.
+#
+# The memo is simply an array of objects, or it can be implemented as a dict
+# mapping little integers to objects. The memo serves as the PM's "long term
+# memory", and the little integers indexing the memo are akin to variable
+# names. Some opcodes pop a stack object into the memo at a given index,
+# and others push a memo object at a given index onto the stack again.
+#
+# At heart, that's all the PM has. Subtleties arise for these reasons:
+#
+# + Object identity. Objects can be arbitrarily complex, and subobjects
+# may be shared (for example, the list [a, a] refers to the same object a
+# twice). It can be vital that unpickling recreate an isomorphic object
+# graph, faithfully reproducing sharing.
+#
+# + Recursive objects. For example, after "L = []; L.append(L)", L is a
+# list, and L[0] is the same list. This is related to the object identity
+# point, and some sequences of pickle opcodes are subtle in order to
+# get the right result in all cases.
+#
+# + Things pickle doesn't know everything about. Examples of things pickle
+# does know everything about are Python's builtin scalar and container
+# types, like ints and tuples. They generally have opcodes dedicated to
+# them. For things like module references and instances of user-defined
+# classes, pickle's knowledge is limited. Historically, many enhancements
+# have been made to the pickle protocol in order to do a better (faster,
+# and/or more compact) job on those.
+#
+# + Backward compatibility and micro-optimization. As explained below,
+# pickle opcodes never go away, not even when better ways to do a thing
+# get invented. The repertoire of the PM just keeps growing over time.
+# For example, protocol 0 had two opcodes for building Python integers (INT
+# and LONG), protocol 1 added three more for more-efficient pickling of short
+# integers, and protocol 2 added two more for more-efficient pickling of
+# long integers (before protocol 2, the only ways to pickle a Python long
+# took time quadratic in the number of digits, for both pickling and
+# unpickling). "Opcode bloat" isn't so much a subtlety as a source of
+# wearying complication.
+#
+#
+# Pickle protocols:
+#
+# For compatibility, the meaning of a pickle opcode never changes. Instead new
+# pickle opcodes get added, and each version's unpickler can handle all the
+# pickle opcodes in all protocol versions to date. So old pickles continue to
+# be readable forever. The pickler can generally be told to restrict itself to
+# the subset of opcodes available under previous protocol versions too, so that
+# users can create pickles under the current version readable by older
+# versions. However, a pickle does not contain its version number embedded
+# within it. If an older unpickler tries to read a pickle using a later
+# protocol, the result is most likely an exception due to seeing an unknown (in
+# the older unpickler) opcode.
+#
+# The original pickle used what's now called "protocol 0", and what was called
+# "text mode" before Python 2.3. The entire pickle bytestream is made up of
+# printable 7-bit ASCII characters, plus the newline character, in protocol 0.
+# That's why it was called text mode. Protocol 0 is small and elegant, but
+# sometimes painfully inefficient.
+#
+# The second major set of additions is now called "protocol 1", and was called
+# "binary mode" before Python 2.3. This added many opcodes with arguments
+# consisting of arbitrary bytes, including NUL bytes and unprintable "high bit"
+# bytes. Binary mode pickles can be substantially smaller than equivalent
+# text mode pickles, and sometimes faster too; e.g., BININT represents a 4-byte
+# int as 4 bytes following the opcode, which is cheaper to unpickle than the
+# (perhaps) 11-character decimal string attached to INT. Protocol 1 also added
+# a number of opcodes that operate on many stack elements at once (like APPENDS
+# and SETITEMS), and "shortcut" opcodes (like EMPTY_DICT and EMPTY_TUPLE).
+#
+# The third major set of additions came in Python 2.3, and is called "protocol
+# 2". This added:
+#
+# - A better way to pickle instances of new-style classes (NEWOBJ).
+#
+# - A way for a pickle to identify its protocol (PROTO).
+#
+# - Time- and space- efficient pickling of long ints (LONG{1,4}).
+#
+# - Shortcuts for small tuples (TUPLE{1,2,3}}.
+#
+# - Dedicated opcodes for bools (NEWTRUE, NEWFALSE).
+#
+# - The "extension registry", a vector of popular objects that can be pushed
+# efficiently by index (EXT{1,2,4}). This is akin to the memo and GET, but
+# the registry contents are predefined (there's nothing akin to the memo's
+# PUT).
+#
+# Another independent change with Python 2.3 is the abandonment of any
+# pretense that it might be safe to load pickles received from untrusted
+# parties -- no sufficient security analysis has been done to guarantee
+# this and there isn't a use case that warrants the expense of such an
+# analysis.
+#
+# To this end, all tests for __safe_for_unpickling__ or for
+# copyreg.safe_constructors are removed from the unpickling code.
+# References to these variables in the descriptions below are to be seen
+# as describing unpickling in Python 2.2 and before.
+
# Meta-rule: Descriptions are stored in instances of descriptor objects,
# with plain constructors. No meta-language is defined from which
diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py
index 20e6498..4678bb8 100644
--- a/Lib/pkgutil.py
+++ b/Lib/pkgutil.py
@@ -1,12 +1,13 @@
"""Utilities to support packages."""
-import os
-import sys
+from functools import singledispatch as simplegeneric
import importlib
-import imp
+import importlib.util
+import os
import os.path
-from warnings import warn
+import sys
from types import ModuleType
+import warnings
__all__ = [
'get_importer', 'iter_importers', 'get_loader', 'find_loader',
@@ -20,53 +21,13 @@ def read_code(stream):
import marshal
magic = stream.read(4)
- if magic != imp.get_magic():
+ if magic != importlib.util.MAGIC_NUMBER:
return None
stream.read(8) # Skip timestamp and size
return marshal.load(stream)
-def simplegeneric(func):
- """Make a trivial single-dispatch generic function"""
- registry = {}
- def wrapper(*args, **kw):
- ob = args[0]
- try:
- cls = ob.__class__
- except AttributeError:
- cls = type(ob)
- try:
- mro = cls.__mro__
- except AttributeError:
- try:
- class cls(cls, object):
- pass
- mro = cls.__mro__[1:]
- except TypeError:
- mro = object, # must be an ExtensionClass or some such :(
- for t in mro:
- if t in registry:
- return registry[t](*args, **kw)
- else:
- return func(*args, **kw)
- try:
- wrapper.__name__ = func.__name__
- except (TypeError, AttributeError):
- pass # Python 2.3 doesn't allow functions to be renamed
-
- def register(typ, func=None):
- if func is None:
- return lambda f: register(typ, f)
- registry[typ] = func
- return func
-
- wrapper.__dict__ = func.__dict__
- wrapper.__doc__ = func.__doc__
- wrapper.register = register
- return wrapper
-
-
def walk_packages(path=None, prefix='', onerror=None):
"""Yields (module_loader, name, ispkg) for all modules recursively
on path, or, if path is None, all accessible modules.
@@ -121,8 +82,7 @@ def walk_packages(path=None, prefix='', onerror=None):
# don't traverse path items we've seen before
path = [p for p in path if not seen(p)]
- for item in walk_packages(path, name+'.', onerror):
- yield item
+ yield from walk_packages(path, name+'.', onerror)
def iter_modules(path=None, prefix=''):
@@ -149,13 +109,12 @@ def iter_modules(path=None, prefix=''):
yield i, name, ispkg
-#@simplegeneric
+@simplegeneric
def iter_importer_modules(importer, prefix=''):
if not hasattr(importer, 'iter_modules'):
return []
return importer.iter_modules(prefix)
-iter_importer_modules = simplegeneric(iter_importer_modules)
# Implement a file walker for the normal importlib path hook
def _iter_file_finder_modules(importer, prefix=''):
@@ -201,6 +160,13 @@ def _iter_file_finder_modules(importer, prefix=''):
iter_importer_modules.register(
importlib.machinery.FileFinder, _iter_file_finder_modules)
+
+def _import_imp():
+ global imp
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore', PendingDeprecationWarning)
+ imp = importlib.import_module('imp')
+
class ImpImporter:
"""PEP 302 Importer that wraps Python's "classic" import algorithm
@@ -213,8 +179,10 @@ class ImpImporter:
"""
def __init__(self, path=None):
- warn("This emulation is deprecated, use 'importlib' instead",
+ global imp
+ warnings.warn("This emulation is deprecated, use 'importlib' instead",
DeprecationWarning)
+ _import_imp()
self.path = path
def find_module(self, fullname, path=None):
@@ -279,8 +247,9 @@ class ImpLoader:
code = source = None
def __init__(self, fullname, file, filename, etc):
- warn("This emulation is deprecated, use 'importlib' instead",
- DeprecationWarning)
+ warnings.warn("This emulation is deprecated, use 'importlib' instead",
+ DeprecationWarning)
+ _import_imp()
self.file = file
self.filename = filename
self.fullname = fullname
@@ -350,9 +319,8 @@ class ImpLoader:
self.file.close()
elif mod_type==imp.PY_COMPILED:
if os.path.exists(self.filename[:-1]):
- f = open(self.filename[:-1], 'r')
- self.source = f.read()
- f.close()
+ with open(self.filename[:-1], 'r') as f:
+ self.source = f.read()
elif mod_type==imp.PKG_DIRECTORY:
self.source = self._get_delegate().get_source()
return self.source
@@ -456,8 +424,7 @@ def iter_importers(fullname=""):
if path is None:
return
else:
- for importer in sys.meta_path:
- yield importer
+ yield from sys.meta_path
path = sys.path
for item in path:
yield get_importer(item)
@@ -589,16 +556,16 @@ def extend_path(path, name):
if os.path.isfile(pkgfile):
try:
f = open(pkgfile)
- except IOError as msg:
+ except OSError as msg:
sys.stderr.write("Can't open %s: %s\n" %
(pkgfile, msg))
else:
- for line in f:
- line = line.rstrip('\n')
- if not line or line.startswith('#'):
- continue
- path.append(line) # Don't check for existence!
- f.close()
+ with f:
+ for line in f:
+ line = line.rstrip('\n')
+ if not line or line.startswith('#'):
+ continue
+ path.append(line) # Don't check for existence!
return path
diff --git a/Lib/plat-os2emx/IN.py b/Lib/plat-os2emx/IN.py
deleted file mode 100644
index 753ae24..0000000
--- a/Lib/plat-os2emx/IN.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Generated by h2py from f:/emx/include/netinet/in.h
-
-# Included from sys/param.h
-PAGE_SIZE = 0x1000
-HZ = 100
-MAXNAMLEN = 260
-MAXPATHLEN = 260
-def htonl(X): return _swapl(X)
-
-def ntohl(X): return _swapl(X)
-
-def htons(X): return _swaps(X)
-
-def ntohs(X): return _swaps(X)
-
-IPPROTO_IP = 0
-IPPROTO_ICMP = 1
-IPPROTO_IGMP = 2
-IPPROTO_GGP = 3
-IPPROTO_TCP = 6
-IPPROTO_EGP = 8
-IPPROTO_PUP = 12
-IPPROTO_UDP = 17
-IPPROTO_IDP = 22
-IPPROTO_TP = 29
-IPPROTO_EON = 80
-IPPROTO_RAW = 255
-IPPROTO_MAX = 256
-IPPORT_RESERVED = 1024
-IPPORT_USERRESERVED = 5000
-def IN_CLASSA(i): return (((int)(i) & 0x80000000) == 0)
-
-IN_CLASSA_NET = 0xff000000
-IN_CLASSA_NSHIFT = 24
-IN_CLASSA_HOST = 0x00ffffff
-IN_CLASSA_MAX = 128
-def IN_CLASSB(i): return (((int)(i) & 0xc0000000) == 0x80000000)
-
-IN_CLASSB_NET = 0xffff0000
-IN_CLASSB_NSHIFT = 16
-IN_CLASSB_HOST = 0x0000ffff
-IN_CLASSB_MAX = 65536
-def IN_CLASSC(i): return (((int)(i) & 0xe0000000) == 0xc0000000)
-
-IN_CLASSC_NET = 0xffffff00
-IN_CLASSC_NSHIFT = 8
-IN_CLASSC_HOST = 0x000000ff
-def IN_CLASSD(i): return (((int)(i) & 0xf0000000) == 0xe0000000)
-
-IN_CLASSD_NET = 0xf0000000
-IN_CLASSD_NSHIFT = 28
-IN_CLASSD_HOST = 0x0fffffff
-def IN_MULTICAST(i): return IN_CLASSD(i)
-
-def IN_EXPERIMENTAL(i): return (((int)(i) & 0xe0000000) == 0xe0000000)
-
-def IN_BADCLASS(i): return (((int)(i) & 0xf0000000) == 0xf0000000)
-
-INADDR_ANY = 0x00000000
-INADDR_LOOPBACK = 0x7f000001
-INADDR_BROADCAST = 0xffffffff
-INADDR_NONE = 0xffffffff
-INADDR_UNSPEC_GROUP = 0xe0000000
-INADDR_ALLHOSTS_GROUP = 0xe0000001
-INADDR_MAX_LOCAL_GROUP = 0xe00000ff
-IN_LOOPBACKNET = 127
-IP_OPTIONS = 1
-IP_MULTICAST_IF = 2
-IP_MULTICAST_TTL = 3
-IP_MULTICAST_LOOP = 4
-IP_ADD_MEMBERSHIP = 5
-IP_DROP_MEMBERSHIP = 6
-IP_HDRINCL = 2
-IP_TOS = 3
-IP_TTL = 4
-IP_RECVOPTS = 5
-IP_RECVRETOPTS = 6
-IP_RECVDSTADDR = 7
-IP_RETOPTS = 8
-IP_DEFAULT_MULTICAST_TTL = 1
-IP_DEFAULT_MULTICAST_LOOP = 1
-IP_MAX_MEMBERSHIPS = 20
diff --git a/Lib/plat-os2emx/SOCKET.py b/Lib/plat-os2emx/SOCKET.py
deleted file mode 100644
index dac594a..0000000
--- a/Lib/plat-os2emx/SOCKET.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# Generated by h2py from f:/emx/include/sys/socket.h
-
-# Included from sys/types.h
-FD_SETSIZE = 256
-
-# Included from sys/uio.h
-FREAD = 1
-FWRITE = 2
-SOCK_STREAM = 1
-SOCK_DGRAM = 2
-SOCK_RAW = 3
-SOCK_RDM = 4
-SOCK_SEQPACKET = 5
-SO_DEBUG = 0x0001
-SO_ACCEPTCONN = 0x0002
-SO_REUSEADDR = 0x0004
-SO_KEEPALIVE = 0x0008
-SO_DONTROUTE = 0x0010
-SO_BROADCAST = 0x0020
-SO_USELOOPBACK = 0x0040
-SO_LINGER = 0x0080
-SO_OOBINLINE = 0x0100
-SO_L_BROADCAST = 0x0200
-SO_RCV_SHUTDOWN = 0x0400
-SO_SND_SHUTDOWN = 0x0800
-SO_SNDBUF = 0x1001
-SO_RCVBUF = 0x1002
-SO_SNDLOWAT = 0x1003
-SO_RCVLOWAT = 0x1004
-SO_SNDTIMEO = 0x1005
-SO_RCVTIMEO = 0x1006
-SO_ERROR = 0x1007
-SO_TYPE = 0x1008
-SO_OPTIONS = 0x1010
-SOL_SOCKET = 0xffff
-AF_UNSPEC = 0
-AF_UNIX = 1
-AF_INET = 2
-AF_IMPLINK = 3
-AF_PUP = 4
-AF_CHAOS = 5
-AF_NS = 6
-AF_NBS = 7
-AF_ISO = 7
-AF_OSI = AF_ISO
-AF_ECMA = 8
-AF_DATAKIT = 9
-AF_CCITT = 10
-AF_SNA = 11
-AF_DECnet = 12
-AF_DLI = 13
-AF_LAT = 14
-AF_HYLINK = 15
-AF_APPLETALK = 16
-AF_NB = 17
-AF_NETBIOS = AF_NB
-AF_OS2 = AF_UNIX
-AF_MAX = 18
-PF_UNSPEC = AF_UNSPEC
-PF_UNIX = AF_UNIX
-PF_INET = AF_INET
-PF_IMPLINK = AF_IMPLINK
-PF_PUP = AF_PUP
-PF_CHAOS = AF_CHAOS
-PF_NS = AF_NS
-PF_NBS = AF_NBS
-PF_ISO = AF_ISO
-PF_OSI = AF_ISO
-PF_ECMA = AF_ECMA
-PF_DATAKIT = AF_DATAKIT
-PF_CCITT = AF_CCITT
-PF_SNA = AF_SNA
-PF_DECnet = AF_DECnet
-PF_DLI = AF_DLI
-PF_LAT = AF_LAT
-PF_HYLINK = AF_HYLINK
-PF_APPLETALK = AF_APPLETALK
-PF_NB = AF_NB
-PF_NETBIOS = AF_NB
-PF_OS2 = AF_UNIX
-PF_MAX = AF_MAX
-SOMAXCONN = 5
-MSG_OOB = 0x1
-MSG_PEEK = 0x2
-MSG_DONTROUTE = 0x4
-MSG_EOR = 0x8
-MSG_TRUNC = 0x10
-MSG_CTRUNC = 0x20
-MSG_WAITALL = 0x40
-MSG_MAXIOVLEN = 16
-SCM_RIGHTS = 0x01
-MT_FREE = 0
-MT_DATA = 1
-MT_HEADER = 2
-MT_SOCKET = 3
-MT_PCB = 4
-MT_RTABLE = 5
-MT_HTABLE = 6
-MT_ATABLE = 7
-MT_SONAME = 8
-MT_ZOMBIE = 9
-MT_SOOPTS = 10
-MT_FTABLE = 11
-MT_RIGHTS = 12
-MT_IFADDR = 13
-MAXSOCKETS = 2048
diff --git a/Lib/plat-os2emx/_emx_link.py b/Lib/plat-os2emx/_emx_link.py
deleted file mode 100644
index 01e6b54..0000000
--- a/Lib/plat-os2emx/_emx_link.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# _emx_link.py
-
-# Written by Andrew I MacIntyre, December 2002.
-
-"""_emx_link.py is a simplistic emulation of the Unix link(2) library routine
-for creating so-called hard links. It is intended to be imported into
-the os module in place of the unimplemented (on OS/2) Posix link()
-function (os.link()).
-
-We do this on OS/2 by implementing a file copy, with link(2) semantics:-
- - the target cannot already exist;
- - we hope that the actual file open (if successful) is actually
- atomic...
-
-Limitations of this approach/implementation include:-
- - no support for correct link counts (EMX stat(target).st_nlink
- is always 1);
- - thread safety undefined;
- - default file permissions (r+w) used, can't be over-ridden;
- - implemented in Python so comparatively slow, especially for large
- source files;
- - need sufficient free disk space to store the copy.
-
-Behaviour:-
- - any exception should propagate to the caller;
- - want target to be an exact copy of the source, so use binary mode;
- - returns None, same as os.link() which is implemented in posixmodule.c;
- - target removed in the event of a failure where possible;
- - given the motivation to write this emulation came from trying to
- support a Unix resource lock implementation, where minimal overhead
- during creation of the target is desirable and the files are small,
- we read a source block before attempting to create the target so that
- we're ready to immediately write some data into it.
-"""
-
-import os
-import errno
-
-__all__ = ['link']
-
-def link(source, target):
- """link(source, target) -> None
-
- Attempt to hard link the source file to the target file name.
- On OS/2, this creates a complete copy of the source file.
- """
-
- s = os.open(source, os.O_RDONLY | os.O_BINARY)
- if os.isatty(s):
- raise OSError(errno.EXDEV, 'Cross-device link')
- data = os.read(s, 1024)
-
- try:
- t = os.open(target, os.O_WRONLY | os.O_BINARY | os.O_CREAT | os.O_EXCL)
- except OSError:
- os.close(s)
- raise
-
- try:
- while data:
- os.write(t, data)
- data = os.read(s, 1024)
- except OSError:
- os.close(s)
- os.close(t)
- os.unlink(target)
- raise
-
- os.close(s)
- os.close(t)
-
-if __name__ == '__main__':
- import sys
- try:
- link(sys.argv[1], sys.argv[2])
- except IndexError:
- print('Usage: emx_link <source> <target>')
- except OSError:
- print('emx_link: %s' % str(sys.exc_info()[1]))
diff --git a/Lib/plat-os2emx/grp.py b/Lib/plat-os2emx/grp.py
deleted file mode 100644
index ee63ef8..0000000
--- a/Lib/plat-os2emx/grp.py
+++ /dev/null
@@ -1,182 +0,0 @@
-# this module is an OS/2 oriented replacement for the grp standard
-# extension module.
-
-# written by Andrew MacIntyre, April 2001.
-# updated July 2003, adding field accessor support
-
-# note that this implementation checks whether ":" or ";" as used as
-# the field separator character.
-
-"""Replacement for grp standard extension module, intended for use on
-OS/2 and similar systems which don't normally have an /etc/group file.
-
-The standard Unix group database is an ASCII text file with 4 fields per
-record (line), separated by a colon:
- - group name (string)
- - group password (optional encrypted string)
- - group id (integer)
- - group members (comma delimited list of userids, with no spaces)
-
-Note that members are only included in the group file for groups that
-aren't their primary groups.
-(see the section 8.2 of the Python Library Reference)
-
-This implementation differs from the standard Unix implementation by
-allowing use of the platform's native path separator character - ';' on OS/2,
-DOS and MS-Windows - as the field separator in addition to the Unix
-standard ":".
-
-The module looks for the group database at the following locations
-(in order first to last):
- - ${ETC_GROUP} (or %ETC_GROUP%)
- - ${ETC}/group (or %ETC%/group)
- - ${PYTHONHOME}/Etc/group (or %PYTHONHOME%/Etc/group)
-
-Classes
--------
-
-None
-
-Functions
----------
-
-getgrgid(gid) - return the record for group-id gid as a 4-tuple
-
-getgrnam(name) - return the record for group 'name' as a 4-tuple
-
-getgrall() - return a list of 4-tuples, each tuple being one record
- (NOTE: the order is arbitrary)
-
-Attributes
-----------
-
-group_file - the path of the group database file
-
-"""
-
-import os
-
-# try and find the group file
-__group_path = []
-if 'ETC_GROUP' in os.environ:
- __group_path.append(os.environ['ETC_GROUP'])
-if 'ETC' in os.environ:
- __group_path.append('%s/group' % os.environ['ETC'])
-if 'PYTHONHOME' in os.environ:
- __group_path.append('%s/Etc/group' % os.environ['PYTHONHOME'])
-
-group_file = None
-for __i in __group_path:
- try:
- __f = open(__i, 'r')
- __f.close()
- group_file = __i
- break
- except:
- pass
-
-# decide what field separator we can try to use - Unix standard, with
-# the platform's path separator as an option. No special field conversion
-# handlers are required for the group file.
-__field_sep = [':']
-if os.pathsep:
- if os.pathsep != ':':
- __field_sep.append(os.pathsep)
-
-# helper routine to identify which separator character is in use
-def __get_field_sep(record):
- fs = None
- for c in __field_sep:
- # there should be 3 delimiter characters (for 4 fields)
- if record.count(c) == 3:
- fs = c
- break
- if fs:
- return fs
- else:
- raise KeyError('>> group database fields not delimited <<')
-
-# class to match the new record field name accessors.
-# the resulting object is intended to behave like a read-only tuple,
-# with each member also accessible by a field name.
-class Group:
- def __init__(self, name, passwd, gid, mem):
- self.__dict__['gr_name'] = name
- self.__dict__['gr_passwd'] = passwd
- self.__dict__['gr_gid'] = gid
- self.__dict__['gr_mem'] = mem
- self.__dict__['_record'] = (self.gr_name, self.gr_passwd,
- self.gr_gid, self.gr_mem)
-
- def __len__(self):
- return 4
-
- def __getitem__(self, key):
- return self._record[key]
-
- def __setattr__(self, name, value):
- raise AttributeError('attribute read-only: %s' % name)
-
- def __repr__(self):
- return str(self._record)
-
- def __cmp__(self, other):
- this = str(self._record)
- if this == other:
- return 0
- elif this < other:
- return -1
- else:
- return 1
-
-
-# read the whole file, parsing each entry into tuple form
-# with dictionaries to speed recall by GID or group name
-def __read_group_file():
- if group_file:
- group = open(group_file, 'r')
- else:
- raise KeyError('>> no group database <<')
- gidx = {}
- namx = {}
- sep = None
- while 1:
- entry = group.readline().strip()
- if len(entry) > 3:
- if sep is None:
- sep = __get_field_sep(entry)
- fields = entry.split(sep)
- fields[2] = int(fields[2])
- fields[3] = [f.strip() for f in fields[3].split(',')]
- record = Group(*fields)
- if fields[2] not in gidx:
- gidx[fields[2]] = record
- if fields[0] not in namx:
- namx[fields[0]] = record
- elif len(entry) > 0:
- pass # skip empty or malformed records
- else:
- break
- group.close()
- if len(gidx) == 0:
- raise KeyError
- return (gidx, namx)
-
-# return the group database entry by GID
-def getgrgid(gid):
- g, n = __read_group_file()
- return g[gid]
-
-# return the group database entry by group name
-def getgrnam(name):
- g, n = __read_group_file()
- return n[name]
-
-# return all the group database entries
-def getgrall():
- g, n = __read_group_file()
- return g.values()
-
-# test harness
-if __name__ == '__main__':
- getgrall()
diff --git a/Lib/plat-os2emx/pwd.py b/Lib/plat-os2emx/pwd.py
deleted file mode 100644
index 2cb077f..0000000
--- a/Lib/plat-os2emx/pwd.py
+++ /dev/null
@@ -1,208 +0,0 @@
-# this module is an OS/2 oriented replacement for the pwd standard
-# extension module.
-
-# written by Andrew MacIntyre, April 2001.
-# updated July 2003, adding field accessor support
-
-# note that this implementation checks whether ":" or ";" as used as
-# the field separator character. Path conversions are are applied when
-# the database uses ":" as the field separator character.
-
-"""Replacement for pwd standard extension module, intended for use on
-OS/2 and similar systems which don't normally have an /etc/passwd file.
-
-The standard Unix password database is an ASCII text file with 7 fields
-per record (line), separated by a colon:
- - user name (string)
- - password (encrypted string, or "*" or "")
- - user id (integer)
- - group id (integer)
- - description (usually user's name)
- - home directory (path to user's home directory)
- - shell (path to the user's login shell)
-
-(see the section 8.1 of the Python Library Reference)
-
-This implementation differs from the standard Unix implementation by
-allowing use of the platform's native path separator character - ';' on OS/2,
-DOS and MS-Windows - as the field separator in addition to the Unix
-standard ":". Additionally, when ":" is the separator path conversions
-are applied to deal with any munging of the drive letter reference.
-
-The module looks for the password database at the following locations
-(in order first to last):
- - ${ETC_PASSWD} (or %ETC_PASSWD%)
- - ${ETC}/passwd (or %ETC%/passwd)
- - ${PYTHONHOME}/Etc/passwd (or %PYTHONHOME%/Etc/passwd)
-
-Classes
--------
-
-None
-
-Functions
----------
-
-getpwuid(uid) - return the record for user-id uid as a 7-tuple
-
-getpwnam(name) - return the record for user 'name' as a 7-tuple
-
-getpwall() - return a list of 7-tuples, each tuple being one record
- (NOTE: the order is arbitrary)
-
-Attributes
-----------
-
-passwd_file - the path of the password database file
-
-"""
-
-import os
-
-# try and find the passwd file
-__passwd_path = []
-if 'ETC_PASSWD' in os.environ:
- __passwd_path.append(os.environ['ETC_PASSWD'])
-if 'ETC' in os.environ:
- __passwd_path.append('%s/passwd' % os.environ['ETC'])
-if 'PYTHONHOME' in os.environ:
- __passwd_path.append('%s/Etc/passwd' % os.environ['PYTHONHOME'])
-
-passwd_file = None
-for __i in __passwd_path:
- try:
- __f = open(__i, 'r')
- __f.close()
- passwd_file = __i
- break
- except:
- pass
-
-# path conversion handlers
-def __nullpathconv(path):
- return path.replace(os.altsep, os.sep)
-
-def __unixpathconv(path):
- # two known drive letter variations: "x;" and "$x"
- if path[0] == '$':
- conv = path[1] + ':' + path[2:]
- elif path[1] == ';':
- conv = path[0] + ':' + path[2:]
- else:
- conv = path
- return conv.replace(os.altsep, os.sep)
-
-# decide what field separator we can try to use - Unix standard, with
-# the platform's path separator as an option. No special field conversion
-# handler is required when using the platform's path separator as field
-# separator, but are required for the home directory and shell fields when
-# using the standard Unix (":") field separator.
-__field_sep = {':': __unixpathconv}
-if os.pathsep:
- if os.pathsep != ':':
- __field_sep[os.pathsep] = __nullpathconv
-
-# helper routine to identify which separator character is in use
-def __get_field_sep(record):
- fs = None
- for c in __field_sep.keys():
- # there should be 6 delimiter characters (for 7 fields)
- if record.count(c) == 6:
- fs = c
- break
- if fs:
- return fs
- else:
- raise KeyError('>> passwd database fields not delimited <<')
-
-# class to match the new record field name accessors.
-# the resulting object is intended to behave like a read-only tuple,
-# with each member also accessible by a field name.
-class Passwd:
- def __init__(self, name, passwd, uid, gid, gecos, dir, shell):
- self.__dict__['pw_name'] = name
- self.__dict__['pw_passwd'] = passwd
- self.__dict__['pw_uid'] = uid
- self.__dict__['pw_gid'] = gid
- self.__dict__['pw_gecos'] = gecos
- self.__dict__['pw_dir'] = dir
- self.__dict__['pw_shell'] = shell
- self.__dict__['_record'] = (self.pw_name, self.pw_passwd,
- self.pw_uid, self.pw_gid,
- self.pw_gecos, self.pw_dir,
- self.pw_shell)
-
- def __len__(self):
- return 7
-
- def __getitem__(self, key):
- return self._record[key]
-
- def __setattr__(self, name, value):
- raise AttributeError('attribute read-only: %s' % name)
-
- def __repr__(self):
- return str(self._record)
-
- def __cmp__(self, other):
- this = str(self._record)
- if this == other:
- return 0
- elif this < other:
- return -1
- else:
- return 1
-
-
-# read the whole file, parsing each entry into tuple form
-# with dictionaries to speed recall by UID or passwd name
-def __read_passwd_file():
- if passwd_file:
- passwd = open(passwd_file, 'r')
- else:
- raise KeyError('>> no password database <<')
- uidx = {}
- namx = {}
- sep = None
- while True:
- entry = passwd.readline().strip()
- if len(entry) > 6:
- if sep is None:
- sep = __get_field_sep(entry)
- fields = entry.split(sep)
- for i in (2, 3):
- fields[i] = int(fields[i])
- for i in (5, 6):
- fields[i] = __field_sep[sep](fields[i])
- record = Passwd(*fields)
- if fields[2] not in uidx:
- uidx[fields[2]] = record
- if fields[0] not in namx:
- namx[fields[0]] = record
- elif len(entry) > 0:
- pass # skip empty or malformed records
- else:
- break
- passwd.close()
- if len(uidx) == 0:
- raise KeyError
- return (uidx, namx)
-
-# return the passwd database entry by UID
-def getpwuid(uid):
- u, n = __read_passwd_file()
- return u[uid]
-
-# return the passwd database entry by passwd name
-def getpwnam(name):
- u, n = __read_passwd_file()
- return n[name]
-
-# return all the passwd database entries
-def getpwall():
- u, n = __read_passwd_file()
- return n.values()
-
-# test harness
-if __name__ == '__main__':
- getpwall()
diff --git a/Lib/plat-os2emx/regen b/Lib/plat-os2emx/regen
deleted file mode 100755
index 3ecd2a8..0000000
--- a/Lib/plat-os2emx/regen
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /bin/sh
-export INCLUDE=$C_INCLUDE_PATH
-set -v
-python.exe ../../Tools/scripts/h2py.py $C_INCLUDE_PATH/fcntl.h
-python.exe ../../Tools/scripts/h2py.py $C_INCLUDE_PATH/sys/socket.h
-python.exe ../../Tools/scripts/h2py.py -i '(u_long)' $C_INCLUDE_PATH/netinet/in.h
-#python.exe ../../Tools/scripts/h2py.py $C_INCLUDE_PATH/termios.h
diff --git a/Lib/platform.py b/Lib/platform.py
index d5ebf25..cbbe6d8 100755
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -122,7 +122,7 @@ try:
except AttributeError:
# os.devnull was added in Python 2.4, so emulate it for earlier
# Python versions
- if sys.platform in ('dos','win32','win16','os2'):
+ if sys.platform in ('dos','win32','win16'):
# Use the old CP/M NUL as device name
DEV_NULL = 'NUL'
else:
@@ -316,7 +316,7 @@ def linux_distribution(distname='', version='', id='',
"""
try:
etc = os.listdir('/etc')
- except os.error:
+ except OSError:
# Probably not a Unix system
return distname,version,id
etc.sort()
@@ -403,13 +403,13 @@ _ver_output = re.compile(r'(?:([\w ]+) ([\w.]+) '
def _syscmd_ver(system='', release='', version='',
- supported_platforms=('win32','win16','dos','os2')):
+ supported_platforms=('win32','win16','dos')):
""" Tries to figure out the OS version used and returns
a tuple (system,release,version).
It uses the "ver" shell command for this which is known
- to exists on Windows, DOS and OS/2. XXX Others too ?
+ to exists on Windows, DOS. XXX Others too ?
In case this fails, the given parameters are used as
defaults.
@@ -424,13 +424,10 @@ def _syscmd_ver(system='', release='', version='',
pipe = popen(cmd)
info = pipe.read()
if pipe.close():
- raise os.error('command failed')
+ raise OSError('command failed')
# XXX How can I suppress shell errors from being written
# to stderr ?
- except os.error as why:
- #print 'Command %s failed: %s' % (cmd,why)
- continue
- except IOError as why:
+ except OSError as why:
#print 'Command %s failed: %s' % (cmd,why)
continue
else:
@@ -581,7 +578,7 @@ def win32_ver(release='',version='',csd='',ptype=''):
# Discard any type that isn't REG_SZ
if type == REG_SZ and name.find("Server") != -1:
product_type = VER_NT_SERVER
- except WindowsError:
+ except OSError:
# Use default of VER_NT_WORKSTATION
pass
@@ -637,62 +634,6 @@ def win32_ver(release='',version='',csd='',ptype=''):
RegCloseKey(keyCurVer)
return release,version,csd,ptype
-def _mac_ver_lookup(selectors,default=None):
-
- from _gestalt import gestalt
- l = []
- append = l.append
- for selector in selectors:
- try:
- append(gestalt(selector))
- except (RuntimeError, OSError):
- append(default)
- return l
-
-def _bcd2str(bcd):
-
- return hex(bcd)[2:]
-
-def _mac_ver_gestalt():
- """
- Thanks to Mark R. Levinson for mailing documentation links and
- code examples for this function. Documentation for the
- gestalt() API is available online at:
-
- http://www.rgaros.nl/gestalt/
- """
- # Check whether the version info module is available
- try:
- import _gestalt
- except ImportError:
- return None
- # Get the infos
- sysv, sysa = _mac_ver_lookup(('sysv','sysa'))
- # Decode the infos
- if sysv:
- major = (sysv & 0xFF00) >> 8
- minor = (sysv & 0x00F0) >> 4
- patch = (sysv & 0x000F)
-
- if (major, minor) >= (10, 4):
- # the 'sysv' gestald cannot return patchlevels
- # higher than 9. Apple introduced 3 new
- # gestalt codes in 10.4 to deal with this
- # issue (needed because patch levels can
- # run higher than 9, such as 10.4.11)
- major,minor,patch = _mac_ver_lookup(('sys1','sys2','sys3'))
- release = '%i.%i.%i' %(major, minor, patch)
- else:
- release = '%s.%i.%i' % (_bcd2str(major),minor,patch)
-
- if sysa:
- machine = {0x1: '68k',
- 0x2: 'PowerPC',
- 0xa: 'i386'}.get(sysa,'')
-
- versioninfo=('', '', '')
- return release,versioninfo,machine
-
def _mac_ver_xml():
fn = '/System/Library/CoreServices/SystemVersion.plist'
if not os.path.exists(fn):
@@ -708,7 +649,7 @@ def _mac_ver_xml():
versioninfo=('', '', '')
machine = os.uname().machine
if machine in ('ppc', 'Power Macintosh'):
- # for compatibility with the gestalt based code
+ # Canonical name
machine = 'PowerPC'
return release,versioninfo,machine
@@ -730,12 +671,6 @@ def mac_ver(release='',versioninfo=('','',''),machine=''):
if info is not None:
return info
- # If that doesn't work for some reason fall back to reading the
- # information using gestalt calls.
- info = _mac_ver_gestalt()
- if info is not None:
- return info
-
# If that also doesn't work return the default values
return release,versioninfo,machine
@@ -882,7 +817,7 @@ def _node(default=''):
return default
try:
return socket.gethostname()
- except socket.error:
+ except OSError:
# Still not working...
return default
@@ -901,12 +836,12 @@ def _syscmd_uname(option,default=''):
""" Interface to the system's uname command.
"""
- if sys.platform in ('dos','win32','win16','os2'):
+ if sys.platform in ('dos','win32','win16'):
# XXX Others too ?
return default
try:
f = os.popen('uname %s 2> %s' % (option, DEV_NULL))
- except (AttributeError,os.error):
+ except (AttributeError, OSError):
return default
output = f.read().strip()
rc = f.close()
@@ -924,7 +859,7 @@ def _syscmd_file(target,default=''):
default in case the command should fail.
"""
- if sys.platform in ('dos','win32','win16','os2'):
+ if sys.platform in ('dos','win32','win16'):
# XXX Others too ?
return default
target = _follow_symlinks(target)
@@ -932,7 +867,7 @@ def _syscmd_file(target,default=''):
proc = subprocess.Popen(['file', target],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- except (AttributeError,os.error):
+ except (AttributeError, OSError):
return default
output = proc.communicate()[0].decode('latin-1')
rc = proc.wait()
diff --git a/Lib/poplib.py b/Lib/poplib.py
index 84f1889..be98a7d 100644
--- a/Lib/poplib.py
+++ b/Lib/poplib.py
@@ -13,7 +13,15 @@ Based on the J. Myers POP3 draft, Jan. 96
# Imports
-import re, socket
+import errno
+import re
+import socket
+
+try:
+ import ssl
+ HAVE_SSL = True
+except ImportError:
+ HAVE_SSL = False
__all__ = ["POP3","error_proto"]
@@ -55,6 +63,8 @@ class POP3:
APOP name digest apop(name, digest)
TOP msg n top(msg, n)
UIDL [msg] uidl(msg = None)
+ CAPA capa()
+ STLS stls()
Raises one exception: 'error_proto'.
@@ -81,6 +91,7 @@ class POP3:
timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
self.host = host
self.port = port
+ self._tls_established = False
self.sock = self._create_socket(timeout)
self.file = self.sock.makefile('rb')
self._debugging = 0
@@ -259,7 +270,14 @@ class POP3:
if self.file is not None:
self.file.close()
if self.sock is not None:
- self.sock.close()
+ try:
+ self.sock.shutdown(socket.SHUT_RDWR)
+ except OSError as e:
+ # The server might already have closed the connection
+ if e.errno != errno.ENOTCONN:
+ raise
+ finally:
+ self.sock.close()
self.file = self.sock = None
#__del__ = quit
@@ -315,21 +333,71 @@ class POP3:
return self._shortcmd('UIDL %s' % which)
return self._longcmd('UIDL')
-try:
- import ssl
-except ImportError:
- pass
-else:
+
+ def capa(self):
+ """Return server capabilities (RFC 2449) as a dictionary
+ >>> c=poplib.POP3('localhost')
+ >>> c.capa()
+ {'IMPLEMENTATION': ['Cyrus', 'POP3', 'server', 'v2.2.12'],
+ 'TOP': [], 'LOGIN-DELAY': ['0'], 'AUTH-RESP-CODE': [],
+ 'EXPIRE': ['NEVER'], 'USER': [], 'STLS': [], 'PIPELINING': [],
+ 'UIDL': [], 'RESP-CODES': []}
+ >>>
+
+ Really, according to RFC 2449, the cyrus folks should avoid
+ having the implementation split into multiple arguments...
+ """
+ def _parsecap(line):
+ lst = line.decode('ascii').split()
+ return lst[0], lst[1:]
+
+ caps = {}
+ try:
+ resp = self._longcmd('CAPA')
+ rawcaps = resp[1]
+ for capline in rawcaps:
+ capnm, capargs = _parsecap(capline)
+ caps[capnm] = capargs
+ except error_proto as _err:
+ raise error_proto('-ERR CAPA not supported by server')
+ return caps
+
+
+ def stls(self, context=None):
+ """Start a TLS session on the active connection as specified in RFC 2595.
+
+ context - a ssl.SSLContext
+ """
+ if not HAVE_SSL:
+ raise error_proto('-ERR TLS support missing')
+ if self._tls_established:
+ raise error_proto('-ERR TLS session already established')
+ caps = self.capa()
+ if not 'STLS' in caps:
+ raise error_proto('-ERR STLS not supported by server')
+ if context is None:
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ context.options |= ssl.OP_NO_SSLv2
+ resp = self._shortcmd('STLS')
+ self.sock = context.wrap_socket(self.sock)
+ self.file = self.sock.makefile('rb')
+ self._tls_established = True
+ return resp
+
+
+if HAVE_SSL:
class POP3_SSL(POP3):
"""POP3 client class over SSL connection
- Instantiate with: POP3_SSL(hostname, port=995, keyfile=None, certfile=None)
+ Instantiate with: POP3_SSL(hostname, port=995, keyfile=None, certfile=None,
+ context=None)
hostname - the hostname of the pop3 over ssl server
port - port number
keyfile - PEM formatted file that contains your private key
certfile - PEM formatted certificate chain file
+ context - a ssl.SSLContext
See the methods of the parent class POP3 for more documentation.
"""
@@ -355,6 +423,13 @@ else:
sock = ssl.wrap_socket(sock, self.keyfile, self.certfile)
return sock
+ def stls(self, keyfile=None, certfile=None, context=None):
+ """The method unconditionally raises an exception since the
+ STLS command doesn't make any sense on an already established
+ SSL/TLS session.
+ """
+ raise error_proto('-ERR TLS session already established')
+
__all__.append("POP3_SSL")
if __name__ == "__main__":
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index b1e1a92..492c415 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -162,7 +162,7 @@ def islink(path):
"""Test whether a path is a symbolic link"""
try:
st = os.lstat(path)
- except (os.error, AttributeError):
+ except (OSError, AttributeError):
return False
return stat.S_ISLNK(st.st_mode)
@@ -172,56 +172,35 @@ def lexists(path):
"""Test whether a path exists. Returns True for broken symbolic links"""
try:
os.lstat(path)
- except os.error:
+ except OSError:
return False
return True
-# Are two filenames really pointing to the same file?
-
-def samefile(f1, f2):
- """Test whether two pathnames reference the same actual file"""
- s1 = os.stat(f1)
- s2 = os.stat(f2)
- return samestat(s1, s2)
-
-
-# Are two open files really referencing the same file?
-# (Not necessarily the same file descriptor!)
-
-def sameopenfile(fp1, fp2):
- """Test whether two open file objects reference the same file"""
- s1 = os.fstat(fp1)
- s2 = os.fstat(fp2)
- return samestat(s1, s2)
-
-
-# Are two stat buffers (obtained from stat, fstat or lstat)
-# describing the same file?
-
-def samestat(s1, s2):
- """Test whether two stat buffers reference the same file"""
- return s1.st_ino == s2.st_ino and \
- s1.st_dev == s2.st_dev
-
-
# Is a path a mount point?
# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?)
def ismount(path):
"""Test whether a path is a mount point"""
- if islink(path):
- # A symlink can never be a mount point
- return False
try:
s1 = os.lstat(path)
- if isinstance(path, bytes):
- parent = join(path, b'..')
- else:
- parent = join(path, '..')
+ except OSError:
+ # It doesn't exist -- so not a mount point. :-)
+ return False
+ else:
+ # A symlink can never be a mount point
+ if stat.S_ISLNK(s1.st_mode):
+ return False
+
+ if isinstance(path, bytes):
+ parent = join(path, b'..')
+ else:
+ parent = join(path, '..')
+ try:
s2 = os.lstat(parent)
- except os.error:
- return False # It doesn't exist -- so not a mount point :-)
+ except OSError:
+ return False
+
dev1 = s1.st_dev
dev2 = s2.st_dev
if dev1 != dev2:
diff --git a/Lib/pprint.py b/Lib/pprint.py
index ae96dde..1f98f5c 100644
--- a/Lib/pprint.py
+++ b/Lib/pprint.py
@@ -34,6 +34,7 @@ saferepr()
"""
+import re
import sys as _sys
from collections import OrderedDict as _OrderedDict
from io import StringIO as _StringIO
@@ -158,13 +159,10 @@ class PrettyPrinter:
return
rep = self._repr(object, context, level - 1)
typ = _type(object)
- sepLines = _len(rep) > (self._width - 1 - indent - allowance)
+ max_width = self._width - 1 - indent - allowance
+ sepLines = _len(rep) > max_width
write = stream.write
- if self._depth and level > self._depth:
- write(rep)
- return
-
if sepLines:
r = getattr(typ, "__repr__", None)
if issubclass(typ, dict):
@@ -242,6 +240,37 @@ class PrettyPrinter:
write(endchar)
return
+ if issubclass(typ, str) and len(object) > 0 and r is str.__repr__:
+ def _str_parts(s):
+ """
+ Return a list of string literals comprising the repr()
+ of the given string using literal concatenation.
+ """
+ lines = s.splitlines(True)
+ for i, line in enumerate(lines):
+ rep = repr(line)
+ if _len(rep) <= max_width:
+ yield rep
+ else:
+ # A list of alternating (non-space, space) strings
+ parts = re.split(r'(\s+)', line) + ['']
+ current = ''
+ for i in range(0, len(parts), 2):
+ part = parts[i] + parts[i+1]
+ candidate = current + part
+ if len(repr(candidate)) > max_width:
+ if current:
+ yield repr(current)
+ current = part
+ else:
+ current = candidate
+ if current:
+ yield repr(current)
+ for i, rep in enumerate(_str_parts(object)):
+ if i > 0:
+ write('\n' + ' '*indent)
+ write(rep)
+ return
write(rep)
def _repr(self, object, context, level):
diff --git a/Lib/profile.py b/Lib/profile.py
index 743e77d..5d0e968 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -40,6 +40,40 @@ __all__ = ["run", "runctx", "Profile"]
# return i_count
#itimes = integer_timer # replace with C coded timer returning integers
+class _Utils:
+ """Support class for utility functions which are shared by
+ profile.py and cProfile.py modules.
+ Not supposed to be used directly.
+ """
+
+ def __init__(self, profiler):
+ self.profiler = profiler
+
+ def run(self, statement, filename, sort):
+ prof = self.profiler()
+ try:
+ prof.run(statement)
+ except SystemExit:
+ pass
+ finally:
+ self._show(prof, filename, sort)
+
+ def runctx(self, statement, globals, locals, filename, sort):
+ prof = self.profiler()
+ try:
+ prof.runctx(statement, globals, locals)
+ except SystemExit:
+ pass
+ finally:
+ self._show(prof, filename, sort)
+
+ def _show(self, prof, filename, sort):
+ if filename is not None:
+ prof.dump_stats(filename)
+ else:
+ prof.print_stats(sort)
+
+
#**************************************************************************
# The following are the static member functions for the profiler class
# Note that an instance of Profile() is *not* needed to call them.
@@ -56,15 +90,7 @@ def run(statement, filename=None, sort=-1):
standard name string (file/line/function-name) that is presented in
each line.
"""
- prof = Profile()
- try:
- prof = prof.run(statement)
- except SystemExit:
- pass
- if filename is not None:
- prof.dump_stats(filename)
- else:
- return prof.print_stats(sort)
+ return _Utils(Profile).run(statement, filename, sort)
def runctx(statement, globals, locals, filename=None, sort=-1):
"""Run statement under profiler, supplying your own globals and locals,
@@ -72,16 +98,8 @@ def runctx(statement, globals, locals, filename=None, sort=-1):
statement and filename have the same semantics as profile.run
"""
- prof = Profile()
- try:
- prof = prof.runctx(statement, globals, locals)
- except SystemExit:
- pass
-
- if filename is not None:
- prof.dump_stats(filename)
- else:
- return prof.print_stats(sort)
+ return _Utils(Profile).runctx(statement, globals, locals, filename, sort)
+
class Profile:
"""Profiler class.
@@ -373,10 +391,9 @@ class Profile:
print_stats()
def dump_stats(self, file):
- f = open(file, 'wb')
- self.create_stats()
- marshal.dump(self.stats, f)
- f.close()
+ with open(file, 'wb') as f:
+ self.create_stats()
+ marshal.dump(self.stats, f)
def create_stats(self):
self.simulate_cmd_complete()
diff --git a/Lib/pstats.py b/Lib/pstats.py
index 6a77605..e1ec355 100644
--- a/Lib/pstats.py
+++ b/Lib/pstats.py
@@ -93,9 +93,8 @@ class Stats:
self.stats = {}
return
elif isinstance(arg, str):
- f = open(arg, 'rb')
- self.stats = marshal.load(f)
- f.close()
+ with open(arg, 'rb') as f:
+ self.stats = marshal.load(f)
try:
file_stats = os.stat(arg)
arg = time.ctime(file_stats.st_mtime) + " " + arg
@@ -149,11 +148,8 @@ class Stats:
def dump_stats(self, filename):
"""Write the profile data to a file we know how to load back."""
- f = open(filename, 'wb')
- try:
+ with open(filename, 'wb') as f:
marshal.dump(self.stats, f)
- finally:
- f.close()
# list the tuple indices and directions for sorting,
# along with some printable description
@@ -612,7 +608,7 @@ if __name__ == '__main__':
if line:
try:
self.stats = Stats(line)
- except IOError as err:
+ except OSError as err:
print(err.args[1], file=self.stream)
return
except Exception as err:
diff --git a/Lib/pty.py b/Lib/pty.py
index 3ccf619..e841f12 100644
--- a/Lib/pty.py
+++ b/Lib/pty.py
@@ -47,27 +47,16 @@ def master_open():
return _open_terminal()
def _open_terminal():
- """Open pty master and return (master_fd, tty_name).
- SGI and generic BSD version, for when openpty() fails."""
- try:
- import sgi
- except ImportError:
- pass
- else:
- try:
- tty_name, master_fd = sgi._getpty(os.O_RDWR, 0o666, 0)
- except IOError as msg:
- raise os.error(msg)
- return master_fd, tty_name
+ """Open pty master and return (master_fd, tty_name)."""
for x in 'pqrstuvwxyzPQRST':
for y in '0123456789abcdef':
pty_name = '/dev/pty' + x + y
try:
fd = os.open(pty_name, os.O_RDWR)
- except os.error:
+ except OSError:
continue
return (fd, '/dev/tty' + x + y)
- raise os.error('out of pty devices')
+ raise OSError('out of pty devices')
def slave_open(tty_name):
"""slave_open(tty_name) -> slave_fd
@@ -83,7 +72,7 @@ def slave_open(tty_name):
try:
ioctl(result, I_PUSH, "ptem")
ioctl(result, I_PUSH, "ldterm")
- except IOError:
+ except OSError:
pass
return result
@@ -173,8 +162,9 @@ def spawn(argv, master_read=_read, stdin_read=_read):
restore = 0
try:
_copy(master_fd, master_read, stdin_read)
- except (IOError, OSError):
+ except OSError:
if restore:
tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
os.close(master_fd)
+ return os.waitpid(pid, 0)[1]
diff --git a/Lib/py_compile.py b/Lib/py_compile.py
index 62d69ad..1277b93 100644
--- a/Lib/py_compile.py
+++ b/Lib/py_compile.py
@@ -3,17 +3,14 @@
This module has intimate knowledge of the format of .pyc files.
"""
-import builtins
-import errno
-import imp
-import marshal
+import importlib._bootstrap
+import importlib.machinery
+import importlib.util
import os
+import os.path
import sys
-import tokenize
import traceback
-MAGIC = imp.get_magic()
-
__all__ = ["compile", "main", "PyCompileError"]
@@ -65,13 +62,6 @@ class PyCompileError(Exception):
return self.msg
-def wr_long(f, x):
- """Internal; write a 32-bit int to a file in little-endian order."""
- f.write(bytes([x & 0xff,
- (x >> 8) & 0xff,
- (x >> 16) & 0xff,
- (x >> 24) & 0xff]))
-
def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1):
"""Byte-compile one Python source file to Python bytecode.
@@ -107,18 +97,31 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1):
See compileall.py for a script/module that uses this module to
byte-compile all installed files (or all files in selected
directories).
+
+ Do note that FileExistsError is raised if cfile ends up pointing at a
+ non-regular file or symlink. Because the compilation uses a file renaming,
+ the resulting file would be regular and thus not the same type of file as
+ it was previously.
"""
- with tokenize.open(file) as f:
- try:
- st = os.fstat(f.fileno())
- except AttributeError:
- st = os.stat(file)
- timestamp = int(st.st_mtime)
- size = st.st_size & 0xFFFFFFFF
- codestring = f.read()
+ if cfile is None:
+ if optimize >= 0:
+ cfile = importlib.util.cache_from_source(file,
+ debug_override=not optimize)
+ else:
+ cfile = importlib.util.cache_from_source(file)
+ if os.path.islink(cfile):
+ msg = ('{} is a symlink and will be changed into a regular file if '
+ 'import writes a byte-compiled file to it')
+ raise FileExistsError(msg.format(cfile))
+ elif os.path.exists(cfile) and not os.path.isfile(cfile):
+ msg = ('{} is a non-regular file and will be changed into a regular '
+ 'one if import writes a byte-compiled file to it')
+ raise FileExistsError(msg.format(cfile))
+ loader = importlib.machinery.SourceFileLoader('<py_compile>', file)
+ source_bytes = loader.get_data(file)
try:
- codeobject = builtins.compile(codestring, dfile or file, 'exec',
- optimize=optimize)
+ code = loader.source_to_code(source_bytes, dfile or file,
+ _optimize=optimize)
except Exception as err:
py_exc = PyCompileError(err.__class__, err, dfile or file)
if doraise:
@@ -126,28 +129,20 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1):
else:
sys.stderr.write(py_exc.msg + '\n')
return
- if cfile is None:
- if optimize >= 0:
- cfile = imp.cache_from_source(file, debug_override=not optimize)
- else:
- cfile = imp.cache_from_source(file)
try:
dirname = os.path.dirname(cfile)
if dirname:
os.makedirs(dirname)
- except OSError as error:
- if error.errno != errno.EEXIST:
- raise
- with open(cfile, 'wb') as fc:
- fc.write(b'\0\0\0\0')
- wr_long(fc, timestamp)
- wr_long(fc, size)
- marshal.dump(codeobject, fc)
- fc.flush()
- fc.seek(0, 0)
- fc.write(MAGIC)
+ except FileExistsError:
+ pass
+ source_stats = loader.path_stats(file)
+ bytecode = importlib._bootstrap._code_to_bytecode(
+ code, source_stats['mtime'], source_stats['size'])
+ mode = importlib._bootstrap._calc_mode(file)
+ importlib._bootstrap._write_atomic(cfile, bytecode, mode)
return cfile
+
def main(args=None):
"""Compile several source files.
@@ -173,7 +168,7 @@ def main(args=None):
except PyCompileError as error:
rv = 1
sys.stderr.write("%s\n" % error.msg)
- except IOError as error:
+ except OSError as error:
rv = 1
sys.stderr.write("%s\n" % error)
else:
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 9dce079..bc64407 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -44,16 +44,16 @@ Richard Chamberlain, for the first implementation of textdoc.
"""
# Known bugs that can't be fixed here:
-# - imp.load_module() cannot be prevented from clobbering existing
-# loaded modules, so calling synopsis() on a binary module file
-# changes the contents of any existing module with the same name.
+# - synopsis() cannot be prevented from clobbering existing
+# loaded modules.
# - If the __file__ attribute on a module is a relative path and
# the current directory is changed with os.chdir(), an incorrect
# path will be displayed.
import builtins
-import imp
+import importlib._bootstrap
import importlib.machinery
+import importlib.util
import inspect
import io
import os
@@ -226,7 +226,7 @@ def synopsis(filename, cache={}):
if lastupdate is None or lastupdate < mtime:
try:
file = tokenize.open(filename)
- except IOError:
+ except OSError:
# module can't be opened, so skip it
return None
binary_suffixes = importlib.machinery.BYTECODE_SUFFIXES[:]
@@ -267,20 +267,19 @@ class ErrorDuringImport(Exception):
def importfile(path):
"""Import a Python source file or compiled file given its path."""
- magic = imp.get_magic()
+ magic = importlib.util.MAGIC_NUMBER
with open(path, 'rb') as file:
- if file.read(len(magic)) == magic:
- kind = imp.PY_COMPILED
- else:
- kind = imp.PY_SOURCE
- file.seek(0)
- filename = os.path.basename(path)
- name, ext = os.path.splitext(filename)
- try:
- module = imp.load_module(name, file, path, (ext, 'r', kind))
- except:
- raise ErrorDuringImport(path, sys.exc_info())
- return module
+ is_bytecode = magic == file.read(len(magic))
+ filename = os.path.basename(path)
+ name, ext = os.path.splitext(filename)
+ if is_bytecode:
+ loader = importlib._bootstrap.SourcelessFileLoader(name, path)
+ else:
+ loader = importlib._bootstrap.SourceFileLoader(name, path)
+ try:
+ return loader.load_module(name)
+ except:
+ raise ErrorDuringImport(path, sys.exc_info())
def safeimport(path, forceload=0, cache={}):
"""Import a module; handle errors; return None if the module isn't found.
@@ -1396,7 +1395,7 @@ def getpager():
return lambda text: pipepager(text, os.environ['PAGER'])
if os.environ.get('TERM') in ('dumb', 'emacs'):
return plainpager
- if sys.platform == 'win32' or sys.platform.startswith('os2'):
+ if sys.platform == 'win32':
return lambda text: tempfilepager(plain(text), 'more <')
if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0:
return lambda text: pipepager(text, 'less')
@@ -1422,16 +1421,15 @@ def pipepager(text, cmd):
try:
pipe.write(text)
pipe.close()
- except IOError:
+ except OSError:
pass # Ignore broken pipes caused by quitting the pager program.
def tempfilepager(text, cmd):
"""Page through text by invoking a program on a temporary file."""
import tempfile
filename = tempfile.mktemp()
- file = open(filename, 'w')
- file.write(text)
- file.close()
+ with open(filename, 'w') as file:
+ file.write(text)
try:
os.system(cmd + ' "' + filename + '"')
finally:
@@ -1850,10 +1848,10 @@ Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
-To get a list of available modules, keywords, or topics, type "modules",
-"keywords", or "topics". Each module also comes with a one-line summary
-of what it does; to list the modules whose summaries contain a given word
-such as "spam", type "modules spam".
+To get a list of available modules, keywords, symbols, or topics, type
+"modules", "keywords", "symbols", or "topics". Each module also comes
+with a one-line summary of what it does; to list the modules whose name
+or summary contain a given string such as "spam", type "modules spam".
''' % tuple([sys.version[:3]]*2))
def list(self, items, columns=4, width=80):
@@ -1958,9 +1956,10 @@ module "pydoc_data.topics" could not be found.
def listmodules(self, key=''):
if key:
self.output.write('''
-Here is a list of matching modules. Enter any module name to get more help.
+Here is a list of modules whose name or summary contains '{}'.
+If there are any, enter a module name to get more help.
-''')
+'''.format(key))
apropos(key)
else:
self.output.write('''
@@ -1979,35 +1978,11 @@ Please wait a moment while I gather a list of all available modules...
self.list(modules.keys())
self.output.write('''
Enter any module name to get more help. Or, type "modules spam" to search
-for modules whose descriptions contain the word "spam".
+for modules whose name or summary contain the string "spam".
''')
help = Helper()
-class Scanner:
- """A generic tree iterator."""
- def __init__(self, roots, children, descendp):
- self.roots = roots[:]
- self.state = []
- self.children = children
- self.descendp = descendp
-
- def next(self):
- if not self.state:
- if not self.roots:
- return None
- root = self.roots.pop(0)
- self.state = [(root, self.children(root))]
- node, children = self.state[-1]
- if not children:
- self.state.pop()
- return self.next()
- child = children.pop(0)
- if self.descendp(child):
- self.state.append((child, self.children(child)))
- return child
-
-
class ModuleScanner:
"""An interruptible scanner that searches module synopses."""
diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py
index ef0fec2..092a364 100644
--- a/Lib/pydoc_data/topics.py
+++ b/Lib/pydoc_data/topics.py
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
-# Autogenerated by Sphinx on Sat Mar 23 15:42:31 2013
+# Autogenerated by Sphinx on Sat Aug 3 12:46:08 2013
topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n if __debug__:\n if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n if __debug__:\n if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names. In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O). The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime. Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal. The value for the built-in\nvariable is determined when the interpreter starts.\n',
'assignment': '\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n target_list ::= target ("," target)* [","]\n target ::= identifier\n | "(" target_list ")"\n | "[" target_list "]"\n | attributeref\n | subscription\n | slicing\n | "*" target\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable. The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list, optionally enclosed in\nparentheses or square brackets, is recursively defined as follows.\n\n* If the target list is a single target: The object is assigned to\n that target.\n\n* If the target list is a comma-separated list of targets: The object\n must be an iterable with the same number of items as there are\n targets in the target list, and the items are assigned, from left to\n right, to the corresponding targets.\n\n * If the target list contains one target prefixed with an asterisk,\n called a "starred" target: The object must be a sequence with at\n least as many items as there are targets in the target list, minus\n one. The first items of the sequence are assigned, from left to\n right, to the targets before the starred target. The final items\n of the sequence are assigned to the targets after the starred\n target. A list of the remaining items in the sequence is then\n assigned to the starred target (the list can be empty).\n\n * Else: The object must be a sequence with the same number of items\n as there are targets in the target list, and the items are\n assigned, from left to right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n * If the name does not occur in a ``global`` or ``nonlocal``\n statement in the current code block: the name is bound to the\n object in the current local namespace.\n\n * Otherwise: the name is bound to the object in the global namespace\n or the outer namespace determined by ``nonlocal``, respectively.\n\n The name is rebound if it was already bound. This may cause the\n reference count for the object previously bound to the name to reach\n zero, causing the object to be deallocated and its destructor (if it\n has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n brackets: The object must be an iterable with the same number of\n items as there are targets in the target list, and its items are\n assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n the reference is evaluated. It should yield an object with\n assignable attributes; if this is not the case, ``TypeError`` is\n raised. That object is then asked to assign the assigned object to\n the given attribute; if it cannot perform the assignment, it raises\n an exception (usually but not necessarily ``AttributeError``).\n\n Note: If the object is a class instance and the attribute reference\n occurs on both sides of the assignment operator, the RHS expression,\n ``a.x`` can access either an instance attribute or (if no instance\n attribute exists) a class attribute. The LHS target ``a.x`` is\n always set as an instance attribute, creating it if necessary.\n Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n same attribute: if the RHS expression refers to a class attribute,\n the LHS creates a new instance attribute as the target of the\n assignment:\n\n class Cls:\n x = 3 # class variable\n inst = Cls()\n inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3\n\n This description does not necessarily apply to descriptor\n attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n reference is evaluated. It should yield either a mutable sequence\n object (such as a list) or a mapping object (such as a dictionary).\n Next, the subscript expression is evaluated.\n\n If the primary is a mutable sequence object (such as a list), the\n subscript must yield an integer. If it is negative, the sequence\'s\n length is added to it. The resulting value must be a nonnegative\n integer less than the sequence\'s length, and the sequence is asked\n to assign the assigned object to its item with that index. If the\n index is out of range, ``IndexError`` is raised (assignment to a\n subscripted sequence cannot add new items to a list).\n\n If the primary is a mapping object (such as a dictionary), the\n subscript must have a type compatible with the mapping\'s key type,\n and the mapping is then asked to create a key/datum pair which maps\n the subscript to the assigned object. This can either replace an\n existing key/value pair with the same key value, or insert a new\n key/value pair (if no key with the same value existed).\n\n For user-defined objects, the ``__setitem__()`` method is called\n with appropriate arguments.\n\n* If the target is a slicing: The primary expression in the reference\n is evaluated. It should yield a mutable sequence object (such as a\n list). The assigned object should be a sequence object of the same\n type. Next, the lower and upper bound expressions are evaluated,\n insofar they are present; defaults are zero and the sequence\'s\n length. The bounds should evaluate to integers. If either bound is\n negative, the sequence\'s length is added to it. The resulting\n bounds are clipped to lie between zero and the sequence\'s length,\n inclusive. Finally, the sequence object is asked to replace the\n slice with the items of the assigned sequence. The length of the\n slice may be different from the length of the assigned sequence,\n thus changing the length of the target sequence, if the object\n allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe! For instance, the\nfollowing program prints ``[0, 2]``:\n\n x = [0, 1]\n i = 0\n i, x[i] = 1, 2\n print(x)\n\nSee also:\n\n **PEP 3132** - Extended Iterable Unpacking\n The specification for the ``*target`` feature.\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
- 'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name in front of the name, with leading underscores removed, and\na single underscore inserted in front of the class name. For example,\nthe identifier ``__spam`` occurring in a class named ``Ham`` will be\ntransformed to ``_Ham__spam``. This transformation is independent of\nthe syntactical context in which the identifier is used. If the\ntransformed name is extremely long (longer than 255 characters),\nimplementation defined truncation may happen. If the class name\nconsists only of underscores, no transformation is done.\n',
+ 'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name, with leading underscores removed and a single underscore\ninserted, in front of the name. For example, the identifier\n``__spam`` occurring in a class named ``Ham`` will be transformed to\n``_Ham__spam``. This transformation is independent of the syntactical\ncontext in which the identifier is used. If the transformed name is\nextremely long (longer than 255 characters), implementation defined\ntruncation may happen. If the class name consists only of underscores,\nno transformation is done.\n',
'atom-literals': "\nLiterals\n********\n\nPython supports string and bytes literals and various numeric\nliterals:\n\n literal ::= stringliteral | bytesliteral\n | integer | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\nbytes, integer, floating point number, complex number) with the given\nvalue. The value may be approximated in the case of floating point\nand imaginary (complex) literals. See section *Literals* for details.\n\nAll literals correspond to immutable data types, and hence the\nobject's identity is less important than its value. Multiple\nevaluations of literals with the same value (either the same\noccurrence in the program text or a different occurrence) may obtain\nthe same object or a different object with the same value.\n",
'attribute-access': '\nCustomizing attribute access\n****************************\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n========================\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n====================\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n=========\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n--------------------------\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n',
'attribute-references': '\nAttribute references\n********************\n\nAn attribute reference is a primary followed by a period and a name:\n\n attributeref ::= primary "." identifier\n\nThe primary must evaluate to an object of a type that supports\nattribute references, which most objects do. This object is then\nasked to produce the attribute whose name is the identifier (which can\nbe customized by overriding the ``__getattr__()`` method). If this\nattribute is not available, the exception ``AttributeError`` is\nraised. Otherwise, the type and value of the object produced is\ndetermined by the object. Multiple evaluations of the same attribute\nreference may yield different objects.\n',
@@ -19,11 +19,11 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'calls': '\nCalls\n*****\n\nA call calls a callable object (e.g., a *function*) with a possibly\nempty series of *arguments*:\n\n call ::= primary "(" [argument_list [","] | comprehension] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," keyword_arguments] ["," "**" expression]\n | "*" expression ["," keyword_arguments] ["," "**" expression]\n | "**" expression\n positional_arguments ::= expression ("," expression)*\n keyword_arguments ::= keyword_item ("," keyword_item)*\n keyword_item ::= identifier "=" expression\n\nA trailing comma may be present after the positional and keyword\narguments but does not affect the semantics.\n\nThe primary must evaluate to a callable object (user-defined\nfunctions, built-in functions, methods of built-in objects, class\nobjects, methods of class instances, and all objects having a\n``__call__()`` method are callable). All argument expressions are\nevaluated before the call is attempted. Please refer to section\n*Function definitions* for the syntax of formal *parameter* lists.\n\nIf keyword arguments are present, they are first converted to\npositional arguments, as follows. First, a list of unfilled slots is\ncreated for the formal parameters. If there are N positional\narguments, they are placed in the first N slots. Next, for each\nkeyword argument, the identifier is used to determine the\ncorresponding slot (if the identifier is the same as the first formal\nparameter name, the first slot is used, and so on). If the slot is\nalready filled, a ``TypeError`` exception is raised. Otherwise, the\nvalue of the argument is placed in the slot, filling it (even if the\nexpression is ``None``, it fills the slot). When all arguments have\nbeen processed, the slots that are still unfilled are filled with the\ncorresponding default value from the function definition. (Default\nvalues are calculated, once, when the function is defined; thus, a\nmutable object such as a list or dictionary used as default value will\nbe shared by all calls that don\'t specify an argument value for the\ncorresponding slot; this should usually be avoided.) If there are any\nunfilled slots for which no default value is specified, a\n``TypeError`` exception is raised. Otherwise, the list of filled\nslots is used as the argument list for the call.\n\n**CPython implementation detail:** An implementation may provide\nbuilt-in functions whose positional parameters do not have names, even\nif they are \'named\' for the purpose of documentation, and which\ntherefore cannot be supplied by keyword. In CPython, this is the case\nfor functions implemented in C that use ``PyArg_ParseTuple()`` to\nparse their arguments.\n\nIf there are more positional arguments than there are formal parameter\nslots, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``*identifier`` is present; in this case, that formal\nparameter receives a tuple containing the excess positional arguments\n(or an empty tuple if there were no excess positional arguments).\n\nIf any keyword argument does not correspond to a formal parameter\nname, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``**identifier`` is present; in this case, that\nformal parameter receives a dictionary containing the excess keyword\narguments (using the keywords as keys and the argument values as\ncorresponding values), or a (new) empty dictionary if there were no\nexcess keyword arguments.\n\nIf the syntax ``*expression`` appears in the function call,\n``expression`` must evaluate to an iterable. Elements from this\niterable are treated as if they were additional positional arguments;\nif there are positional arguments *x1*, ..., *xN*, and ``expression``\nevaluates to a sequence *y1*, ..., *yM*, this is equivalent to a call\nwith M+N positional arguments *x1*, ..., *xN*, *y1*, ..., *yM*.\n\nA consequence of this is that although the ``*expression`` syntax may\nappear *after* some keyword arguments, it is processed *before* the\nkeyword arguments (and the ``**expression`` argument, if any -- see\nbelow). So:\n\n >>> def f(a, b):\n ... print(a, b)\n ...\n >>> f(b=1, *(2,))\n 2 1\n >>> f(a=1, *(2,))\n Traceback (most recent call last):\n File "<stdin>", line 1, in ?\n TypeError: f() got multiple values for keyword argument \'a\'\n >>> f(1, *(2,))\n 1 2\n\nIt is unusual for both keyword arguments and the ``*expression``\nsyntax to be used in the same call, so in practice this confusion does\nnot arise.\n\nIf the syntax ``**expression`` appears in the function call,\n``expression`` must evaluate to a mapping, the contents of which are\ntreated as additional keyword arguments. In the case of a keyword\nappearing in both ``expression`` and as an explicit keyword argument,\na ``TypeError`` exception is raised.\n\nFormal parameters using the syntax ``*identifier`` or ``**identifier``\ncannot be used as positional argument slots or as keyword argument\nnames.\n\nA call always returns some value, possibly ``None``, unless it raises\nan exception. How this value is computed depends on the type of the\ncallable object.\n\nIf it is---\n\na user-defined function:\n The code block for the function is executed, passing it the\n argument list. The first thing the code block will do is bind the\n formal parameters to the arguments; this is described in section\n *Function definitions*. When the code block executes a ``return``\n statement, this specifies the return value of the function call.\n\na built-in function or method:\n The result is up to the interpreter; see *Built-in Functions* for\n the descriptions of built-in functions and methods.\n\na class object:\n A new instance of that class is returned.\n\na class instance method:\n The corresponding user-defined function is called, with an argument\n list that is one longer than the argument list of the call: the\n instance becomes the first argument.\n\na class instance:\n The class must define a ``__call__()`` method; the effect is then\n the same as if that method was called.\n',
'class': '\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n',
'comparisons': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects. The objects need not have the same type.\nIf both are numbers, they are converted to a common type. Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes. You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n are identical to themselves, ``x is x`` but are not equal to\n themselves, ``x != x``. Additionally, comparing any value to a\n not-a-number value will return ``False``. For example, both ``3 <\n float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n corresponding elements. This means that to compare equal, each\n element must compare equal and the two sequences must be of the same\n type and have the same length.\n\n If not equal, the sequences are ordered the same as their first\n differing elements. For example, ``[1,2,x] <= [1,2,y]`` has the\n same value as ``x <= y``. If the corresponding element does not\n exist, the shorter sequence is ordered first (for example, ``[1,2] <\n [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n superset tests. Those relations do not define total orderings (the\n two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering.\n For example, ``min()``, ``max()``, and ``sorted()`` produce\n undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n the same object; the choice whether one object is considered smaller\n or larger than another one is made arbitrarily but consistently\n within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison. Most\nnumeric types can be compared with one another. When cross-type\ncomparison is not supported, the comparison method returns\n``NotImplemented``.\n\nThe operators ``in`` and ``not in`` test for membership. ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise. ``x\nnot in s`` returns the negation of ``x in s``. All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``. If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object. ``x is\nnot y`` yields the inverse truth value. [4]\n',
- 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs. ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code. Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause. If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call. This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended. A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n',
+ 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs. ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code. Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception it is re-raised at the end of\nthe ``finally`` clause. If the ``finally`` clause raises another\nexception, the saved exception is set as the context of the new\nexception. If the ``finally`` clause executes a ``return`` or\n``break`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n``None`` as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n',
'context-managers': '\nWith Statement Context Managers\n*******************************\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n',
'continue': '\nThe ``continue`` statement\n**************************\n\n continue_stmt ::= "continue"\n\n``continue`` may only occur syntactically nested in a ``for`` or\n``while`` loop, but not nested in a function or class definition or\n``finally`` clause within that loop. It continues with the next cycle\nof the nearest enclosing loop.\n\nWhen ``continue`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nstarting the next loop cycle.\n',
'conversions': '\nArithmetic conversions\n**********************\n\nWhen a description of an arithmetic operator below uses the phrase\n"the numeric arguments are converted to a common type," this means\nthat the operator implementation for built-in types works that way:\n\n* If either argument is a complex number, the other is converted to\n complex;\n\n* otherwise, if either argument is a floating point number, the other\n is converted to floating point;\n\n* otherwise, both must be integers and no conversion is necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions must define their own\nconversion behavior.\n',
- 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected when the option cycle detector is enabled (it\'s on by\n default), but can only be cleaned up if there are no Python-\n level ``__del__()`` methods involved. Refer to the documentation\n for the ``gc`` module for more information about how\n ``__del__()`` methods are handled by the cycle detector,\n particularly the description of the ``garbage`` value.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by ``str(object)`` and the built-in functions ``format()``\n and ``print()`` to compute the "informal" or nicely printable\n string representation of an object. The return value must be a\n *string* object.\n\n This method differs from ``object.__repr__()`` in that there is no\n expectation that ``__str__()`` return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type ``object``\n calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``str.format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n A class that overrides ``__eq__()`` and does not define\n ``__hash__()`` will have its ``__hash__()`` implicitly set to\n ``None``. When the ``__hash__()`` method of a class is ``None``,\n instances of the class will raise an appropriate ``TypeError`` when\n a program attempts to retrieve their hash value, and will also be\n correctly identified as unhashable when checking ``isinstance(obj,\n collections.Hashable``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``.\n\n If a class that does not override ``__eq__()`` wishes to suppress\n hash support, it should include ``__hash__ = None`` in the class\n definition. A class which defines its own ``__hash__()`` that\n explicitly raises a ``TypeError`` would be incorrectly identified\n as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n',
+ 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected and cleaned up when the cyclic garbage collector is\n enabled (it\'s on by default). Refer to the documentation for the\n ``gc`` module for more information about this topic.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by ``str(object)`` and the built-in functions ``format()``\n and ``print()`` to compute the "informal" or nicely printable\n string representation of an object. The return value must be a\n *string* object.\n\n This method differs from ``object.__repr__()`` in that there is no\n expectation that ``__str__()`` return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type ``object``\n calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``str.format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n Note: ``hash()`` truncates the value returned from an object\'s custom\n ``__hash__()`` method to the size of a ``Py_ssize_t``. This is\n typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.\n If an object\'s ``__hash__()`` must interoperate on builds of\n different bit sizes, be sure to check the width on all supported\n builds. An easy way to do this is with ``python -c "import sys;\n print(sys.hash_info.width)"``\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n A class that overrides ``__eq__()`` and does not define\n ``__hash__()`` will have its ``__hash__()`` implicitly set to\n ``None``. When the ``__hash__()`` method of a class is ``None``,\n instances of the class will raise an appropriate ``TypeError`` when\n a program attempts to retrieve their hash value, and will also be\n correctly identified as unhashable when checking ``isinstance(obj,\n collections.Hashable``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``.\n\n If a class that does not override ``__eq__()`` wishes to suppress\n hash support, it should include ``__hash__ = None`` in the class\n definition. A class which defines its own ``__hash__()`` that\n explicitly raises a ``TypeError`` would be incorrectly identified\n as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n',
'debugger': '\n``pdb`` --- The Python Debugger\n*******************************\n\nThe module ``pdb`` defines an interactive source code debugger for\nPython programs. It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame. It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n``Pdb``. This is currently undocumented but easily understood by\nreading the source. The extension interface uses the modules ``bdb``\nand ``cmd``.\n\nThe debugger\'s prompt is ``(Pdb)``. Typical usage to run a program\nunder control of the debugger is:\n\n >>> import pdb\n >>> import mymodule\n >>> pdb.run(\'mymodule.test()\')\n > <string>(0)?()\n (Pdb) continue\n > <string>(1)?()\n (Pdb) continue\n NameError: \'spam\'\n > <string>(1)?()\n (Pdb)\n\nChanged in version 3.3: Tab-completion via the ``readline`` module is\navailable for commands and command arguments, e.g. the current global\nand local names are offered as arguments of the ``print`` command.\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally. After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program. Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: ``pdb.py`` now accepts a ``-c`` option that\nexecutes commands as if given in a ``.pdbrc`` file, see *Debugger\nCommands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger. You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the ``continue`` command.\n\nThe typical usage to inspect a crashed program is:\n\n >>> import pdb\n >>> import mymodule\n >>> mymodule.test()\n Traceback (most recent call last):\n File "<stdin>", line 1, in ?\n File "./mymodule.py", line 4, in test\n test2()\n File "./mymodule.py", line 3, in test2\n print(spam)\n NameError: spam\n >>> pdb.pm()\n > ./mymodule.py(3)test2()\n -> print(spam)\n (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n Execute the *statement* (given as a string or a code object) under\n debugger control. The debugger prompt appears before any code is\n executed; you can set breakpoints and type ``continue``, or you can\n step through the statement using ``step`` or ``next`` (all these\n commands are explained below). The optional *globals* and *locals*\n arguments specify the environment in which the code is executed; by\n default the dictionary of the module ``__main__`` is used. (See\n the explanation of the built-in ``exec()`` or ``eval()``\n functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n Evaluate the *expression* (given as a string or a code object)\n under debugger control. When ``runeval()`` returns, it returns the\n value of the expression. Otherwise this function is similar to\n ``run()``.\n\npdb.runcall(function, *args, **kwds)\n\n Call the *function* (a function or method object, not a string)\n with the given arguments. When ``runcall()`` returns, it returns\n whatever the function call returned. The debugger prompt appears\n as soon as the function is entered.\n\npdb.set_trace()\n\n Enter the debugger at the calling stack frame. This is useful to\n hard-code a breakpoint at a given point in a program, even if the\n code is not otherwise being debugged (e.g. when an assertion\n fails).\n\npdb.post_mortem(traceback=None)\n\n Enter post-mortem debugging of the given *traceback* object. If no\n *traceback* is given, it uses the one of the exception that is\n currently being handled (an exception must be being handled if the\n default is to be used).\n\npdb.pm()\n\n Enter post-mortem debugging of the traceback found in\n ``sys.last_traceback``.\n\nThe ``run*`` functions and ``set_trace()`` are aliases for\ninstantiating the ``Pdb`` class and calling the method of the same\nname. If you want to access further features, you have to do this\nyourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n ``Pdb`` is the debugger class.\n\n The *completekey*, *stdin* and *stdout* arguments are passed to the\n underlying ``cmd.Cmd`` class; see the description there.\n\n The *skip* argument, if given, must be an iterable of glob-style\n module name patterns. The debugger will not step into frames that\n originate in a module that matches one of these patterns. [1]\n\n By default, Pdb sets a handler for the SIGINT signal (which is sent\n when the user presses Ctrl-C on the console) when you give a\n ``continue`` command. This allows you to break into the debugger\n again by pressing Ctrl-C. If you want Pdb not to touch the SIGINT\n handler, set *nosigint* tot true.\n\n Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 3.1: The *skip* argument.\n\n New in version 3.2: The *nosigint* argument. Previously, a SIGINT\n handler was never set by Pdb.\n\n run(statement, globals=None, locals=None)\n runeval(expression, globals=None, locals=None)\n runcall(function, *args, **kwds)\n set_trace()\n\n See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below. Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n``h(elp)`` means that either ``h`` or ``help`` can be used to enter\nthe help command (but not ``he`` or ``hel``, nor ``H`` or ``Help`` or\n``HELP``). Arguments to commands must be separated by whitespace\n(spaces or tabs). Optional arguments are enclosed in square brackets\n(``[]``) in the command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n(``|``).\n\nEntering a blank line repeats the last command entered. Exception: if\nthe last command was a ``list`` command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged. Python statements can also be prefixed with an exclamation\npoint (``!``). This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*. Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by\n``;;``. (A single ``;`` is not used as it is the separator for\nmultiple commands in a line that is passed to the Python parser.) No\nintelligence is applied to separating the commands; the input is split\nat the first ``;;`` pair, even if it is in the middle of a quoted\nstring.\n\nIf a file ``.pdbrc`` exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt. This is particularly useful for aliases. If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ``.pdbrc`` can now contain commands that\ncontinue debugging, such as ``continue`` or ``next``. Previously,\nthese commands had no effect.\n\nh(elp) [command]\n\n Without argument, print the list of available commands. With a\n *command* as argument, print help about that command. ``help pdb``\n displays the full documentation (the docstring of the ``pdb``\n module). Since the *command* argument must be an identifier,\n ``help exec`` must be entered to get help on the ``!`` command.\n\nw(here)\n\n Print a stack trace, with the most recent frame at the bottom. An\n arrow indicates the current frame, which determines the context of\n most commands.\n\nd(own) [count]\n\n Move the current frame *count* (default one) levels down in the\n stack trace (to a newer frame).\n\nu(p) [count]\n\n Move the current frame *count* (default one) levels up in the stack\n trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n With a *lineno* argument, set a break there in the current file.\n With a *function* argument, set a break at the first executable\n statement within that function. The line number may be prefixed\n with a filename and a colon, to specify a breakpoint in another\n file (probably one that hasn\'t been loaded yet). The file is\n searched on ``sys.path``. Note that each breakpoint is assigned a\n number to which all the other breakpoint commands refer.\n\n If a second argument is present, it is an expression which must\n evaluate to true before the breakpoint is honored.\n\n Without argument, list all breaks, including for each breakpoint,\n the number of times that breakpoint has been hit, the current\n ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n Temporary breakpoint, which is removed automatically when it is\n first hit. The arguments are the same as for ``break``.\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n With a *filename:lineno* argument, clear all the breakpoints at\n this line. With a space separated list of breakpoint numbers, clear\n those breakpoints. Without argument, clear all breaks (but first\n ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n Disable the breakpoints given as a space separated list of\n breakpoint numbers. Disabling a breakpoint means it cannot cause\n the program to stop execution, but unlike clearing a breakpoint, it\n remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n Set the ignore count for the given breakpoint number. If count is\n omitted, the ignore count is set to 0. A breakpoint becomes active\n when the ignore count is zero. When non-zero, the count is\n decremented each time the breakpoint is reached and the breakpoint\n is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n Set a new *condition* for the breakpoint, an expression which must\n evaluate to true before the breakpoint is honored. If *condition*\n is absent, any existing condition is removed; i.e., the breakpoint\n is made unconditional.\n\ncommands [bpnumber]\n\n Specify a list of commands for breakpoint number *bpnumber*. The\n commands themselves appear on the following lines. Type a line\n containing just ``end`` to terminate the commands. An example:\n\n (Pdb) commands 1\n (com) print some_variable\n (com) end\n (Pdb)\n\n To remove all commands from a breakpoint, type commands and follow\n it immediately with ``end``; that is, give no commands.\n\n With no *bpnumber* argument, commands refers to the last breakpoint\n set.\n\n You can use breakpoint commands to start your program up again.\n Simply use the continue command, or step, or any other command that\n resumes execution.\n\n Specifying any command resuming execution (currently continue,\n step, next, return, jump, quit and their abbreviations) terminates\n the command list (as if that command was immediately followed by\n end). This is because any time you resume execution (even with a\n simple next or step), you may encounter another breakpoint--which\n could have its own command list, leading to ambiguities about which\n list to execute.\n\n If you use the \'silent\' command in the command list, the usual\n message about stopping at a breakpoint is not printed. This may be\n desirable for breakpoints that are to print a specific message and\n then continue. If none of the other commands print anything, you\n see no sign that the breakpoint was reached.\n\ns(tep)\n\n Execute the current line, stop at the first possible occasion\n (either in a function that is called or on the next line in the\n current function).\n\nn(ext)\n\n Continue execution until the next line in the current function is\n reached or it returns. (The difference between ``next`` and\n ``step`` is that ``step`` stops inside a called function, while\n ``next`` executes called functions at (nearly) full speed, only\n stopping at the next line in the current function.)\n\nunt(il) [lineno]\n\n Without argument, continue execution until the line with a number\n greater than the current one is reached.\n\n With a line number, continue execution until a line with a number\n greater or equal to that is reached. In both cases, also stop when\n the current frame returns.\n\n Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n Continue execution until the current function returns.\n\nc(ont(inue))\n\n Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n Set the next line that will be executed. Only available in the\n bottom-most frame. This lets you jump back and execute code again,\n or jump forward to skip code that you don\'t want to run.\n\n It should be noted that not all jumps are allowed -- for instance\n it is not possible to jump into the middle of a ``for`` loop or out\n of a ``finally`` clause.\n\nl(ist) [first[, last]]\n\n List source code for the current file. Without arguments, list 11\n lines around the current line or continue the previous listing.\n With ``.`` as argument, list 11 lines around the current line.\n With one argument, list 11 lines around at that line. With two\n arguments, list the given range; if the second argument is less\n than the first, it is interpreted as a count.\n\n The current line in the current frame is indicated by ``->``. If\n an exception is being debugged, the line where the exception was\n originally raised or propagated is indicated by ``>>``, if it\n differs from the current line.\n\n New in version 3.2: The ``>>`` marker.\n\nll | longlist\n\n List all source code for the current function or frame.\n Interesting lines are marked as for ``list``.\n\n New in version 3.2.\n\na(rgs)\n\n Print the argument list of the current function.\n\np(rint) expression\n\n Evaluate the *expression* in the current context and print its\n value.\n\npp expression\n\n Like the ``print`` command, except the value of the expression is\n pretty-printed using the ``pprint`` module.\n\nwhatis expression\n\n Print the type of the *expression*.\n\nsource expression\n\n Try to get source code for the given object and display it.\n\n New in version 3.2.\n\ndisplay [expression]\n\n Display the value of the expression if it changed, each time\n execution stops in the current frame.\n\n Without expression, list all display expressions for the current\n frame.\n\n New in version 3.2.\n\nundisplay [expression]\n\n Do not display the expression any more in the current frame.\n Without expression, clear all display expressions for the current\n frame.\n\n New in version 3.2.\n\ninteract\n\n Start an interative interpreter (using the ``code`` module) whose\n global namespace contains all the (global and local) names found in\n the current scope.\n\n New in version 3.2.\n\nalias [name [command]]\n\n Create an alias called *name* that executes *command*. The command\n must *not* be enclosed in quotes. Replaceable parameters can be\n indicated by ``%1``, ``%2``, and so on, while ``%*`` is replaced by\n all the parameters. If no command is given, the current alias for\n *name* is shown. If no arguments are given, all aliases are listed.\n\n Aliases may be nested and can contain anything that can be legally\n typed at the pdb prompt. Note that internal pdb commands *can* be\n overridden by aliases. Such a command is then hidden until the\n alias is removed. Aliasing is recursively applied to the first\n word of the command line; all other words in the line are left\n alone.\n\n As an example, here are two useful aliases (especially when placed\n in the ``.pdbrc`` file):\n\n # Print instance variables (usage "pi classInst")\n alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n # Print instance variables in self\n alias ps pi self\n\nunalias name\n\n Delete the specified alias.\n\n! statement\n\n Execute the (one-line) *statement* in the context of the current\n stack frame. The exclamation point can be omitted unless the first\n word of the statement resembles a debugger command. To set a\n global variable, you can prefix the assignment command with a\n ``global`` statement on the same line, e.g.:\n\n (Pdb) global list_options; list_options = [\'-l\']\n (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n Restart the debugged Python program. If an argument is supplied,\n it is split with ``shlex`` and the result is used as the new\n ``sys.argv``. History, breakpoints, actions and debugger options\n are preserved. ``restart`` is an alias for ``run``.\n\nq(uit)\n\n Quit from the debugger. The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module is\n determined by the ``__name__`` in the frame globals.\n',
'del': '\nThe ``del`` statement\n*********************\n\n del_stmt ::= "del" target_list\n\nDeletion is recursively defined very similar to the way assignment is\ndefined. Rather than spelling it out in full details, here are some\nhints.\n\nDeletion of a target list recursively deletes each target, from left\nto right.\n\nDeletion of a name removes the binding of that name from the local or\nglobal namespace, depending on whether the name occurs in a ``global``\nstatement in the same code block. If the name is unbound, a\n``NameError`` exception will be raised.\n\nDeletion of attribute references, subscriptions and slicings is passed\nto the primary object involved; deletion of a slicing is in general\nequivalent to assignment of an empty slice of the right type (but even\nthis is determined by the sliced object).\n\nChanged in version 3.2: Previously it was illegal to delete a name\nfrom the local namespace if it occurs as a free variable in a nested\nblock.\n',
'dict': '\nDictionary displays\n*******************\n\nA dictionary display is a possibly empty series of key/datum pairs\nenclosed in curly braces:\n\n dict_display ::= "{" [key_datum_list | dict_comprehension] "}"\n key_datum_list ::= key_datum ("," key_datum)* [","]\n key_datum ::= expression ":" expression\n dict_comprehension ::= expression ":" expression comp_for\n\nA dictionary display yields a new dictionary object.\n\nIf a comma-separated sequence of key/datum pairs is given, they are\nevaluated from left to right to define the entries of the dictionary:\neach key object is used as a key into the dictionary to store the\ncorresponding datum. This means that you can specify the same key\nmultiple times in the key/datum list, and the final dictionary\'s value\nfor that key will be the last one given.\n\nA dict comprehension, in contrast to list and set comprehensions,\nneeds two expressions separated with a colon followed by the usual\n"for" and "if" clauses. When the comprehension is run, the resulting\nkey and value elements are inserted in the new dictionary in the order\nthey are produced.\n\nRestrictions on the types of the key values are listed earlier in\nsection *The standard type hierarchy*. (To summarize, the key type\nshould be *hashable*, which excludes all mutable objects.) Clashes\nbetween duplicate keys are not detected; the last datum (textually\nrightmost in the display) stored for a given key value prevails.\n',
@@ -34,14 +34,14 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'exprlists': '\nExpression lists\n****************\n\n expression_list ::= expression ( "," expression )* [","]\n\nAn expression list containing at least one comma yields a tuple. The\nlength of the tuple is the number of expressions in the list. The\nexpressions are evaluated from left to right.\n\nThe trailing comma is required only to create a single tuple (a.k.a. a\n*singleton*); it is optional in all other cases. A single expression\nwithout a trailing comma doesn\'t create a tuple, but rather yields the\nvalue of that expression. (To create an empty tuple, use an empty pair\nof parentheses: ``()``.)\n',
'floating': '\nFloating point literals\n***********************\n\nFloating point literals are described by the following lexical\ndefinitions:\n\n floatnumber ::= pointfloat | exponentfloat\n pointfloat ::= [intpart] fraction | intpart "."\n exponentfloat ::= (intpart | pointfloat) exponent\n intpart ::= digit+\n fraction ::= "." digit+\n exponent ::= ("e" | "E") ["+" | "-"] digit+\n\nNote that the integer and exponent parts are always interpreted using\nradix 10. For example, ``077e010`` is legal, and denotes the same\nnumber as ``77e10``. The allowed range of floating point literals is\nimplementation-dependent. Some examples of floating point literals:\n\n 3.14 10. .001 1e100 3.14e-10 0e0\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator ``-`` and the\nliteral ``1``.\n',
'for': '\nThe ``for`` statement\n*********************\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n',
- 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output. If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n field_name ::= arg_name ("." attribute_name | "[" element_index "]")*\n arg_name ::= [identifier | integer]\n attribute_name ::= identifier\n element_index ::= integer | index_string\n index_string ::= <any source character except "]"> +\n conversion ::= "r" | "s" | "a"\n format_spec ::= <described in the next section>\n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``. These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword. If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument. If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n "First, thou shalt count to {0}" # References first positional argument\n "Bring me a {}" # Implicitly references the first positional argument\n "From {} to {}" # Same as "From {0} to {1}"\n "My quest is {name}" # References keyword argument \'name\'\n "Weight in tons {0.weight}" # \'weight\' attribute of first positional arg\n "Units destroyed: {players[0]}" # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself. However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting. By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n "Harold\'s a clever {0!s}" # Calls str() on the argument first\n "Bring out the holy {name!r}" # Calls repr() on the argument first\n "More {!a}" # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on. Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed. The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*). They can also be passed directly to the\nbuilt-in ``format()`` function. Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n fill ::= <a character other than \'{\' or \'}\'>\n align ::= "<" | ">" | "=" | "^"\n sign ::= "+" | "-" | " "\n width ::= integer\n precision ::= integer\n type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'. The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options. If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'<\'`` | Forces the field to be left-aligned within the available |\n | | space (this is the default for most objects). |\n +-----------+------------------------------------------------------------+\n | ``\'>\'`` | Forces the field to be right-aligned within the available |\n | | space (this is the default for numbers). |\n +-----------+------------------------------------------------------------+\n | ``\'=\'`` | Forces the padding to be placed after the sign (if any) |\n | | but before the digits. This is used for printing fields |\n | | in the form \'+000000120\'. This alignment option is only |\n | | valid for numeric types. |\n +-----------+------------------------------------------------------------+\n | ``\'^\'`` | Forces the field to be centered within the available |\n | | space. |\n +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'+\'`` | indicates that a sign should be used for both positive as |\n | | well as negative numbers. |\n +-----------+------------------------------------------------------------+\n | ``\'-\'`` | indicates that a sign should be used only for negative |\n | | numbers (this is the default behavior). |\n +-----------+------------------------------------------------------------+\n | space | indicates that a leading space should be used on positive |\n | | numbers, and a minus sign on negative numbers. |\n +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion. The alternate form is defined differently for different\ntypes. This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width. If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types. This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'s\'`` | String format. This is the default type for strings and |\n | | may be omitted. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'s\'``. |\n +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'b\'`` | Binary format. Outputs the number in base 2. |\n +-----------+------------------------------------------------------------+\n | ``\'c\'`` | Character. Converts the integer to the corresponding |\n | | unicode character before printing. |\n +-----------+------------------------------------------------------------+\n | ``\'d\'`` | Decimal Integer. Outputs the number in base 10. |\n +-----------+------------------------------------------------------------+\n | ``\'o\'`` | Octal format. Outputs the number in base 8. |\n +-----------+------------------------------------------------------------+\n | ``\'x\'`` | Hex format. Outputs the number in base 16, using lower- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'X\'`` | Hex format. Outputs the number in base 16, using upper- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'d\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'d\'``. |\n +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'e\'`` | Exponent notation. Prints the number in scientific |\n | | notation using the letter \'e\' to indicate the exponent. |\n +-----------+------------------------------------------------------------+\n | ``\'E\'`` | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n | | case \'E\' as the separator character. |\n +-----------+------------------------------------------------------------+\n | ``\'f\'`` | Fixed point. Displays the number as a fixed-point number. |\n +-----------+------------------------------------------------------------+\n | ``\'F\'`` | Fixed point. Same as ``\'f\'``, but converts ``nan`` to |\n | | ``NAN`` and ``inf`` to ``INF``. |\n +-----------+------------------------------------------------------------+\n | ``\'g\'`` | General format. For a given precision ``p >= 1``, this |\n | | rounds the number to ``p`` significant digits and then |\n | | formats the result in either fixed-point format or in |\n | | scientific notation, depending on its magnitude. The |\n | | precise rules are as follows: suppose that the result |\n | | formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1`` would have exponent ``exp``. Then if ``-4 <= exp |\n | | < p``, the number is formatted with presentation type |\n | | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number |\n | | is formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1``. In both cases insignificant trailing zeros are |\n | | removed from the significand, and the decimal point is |\n | | also removed if there are no remaining digits following |\n | | it. Positive and negative infinity, positive and negative |\n | | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n | | ``-0`` and ``nan`` respectively, regardless of the |\n | | precision. A precision of ``0`` is treated as equivalent |\n | | to a precision of ``1``. |\n +-----------+------------------------------------------------------------+\n | ``\'G\'`` | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n | | if the number gets too large. The representations of |\n | | infinity and NaN are uppercased, too. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'g\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | ``\'%\'`` | Percentage. Multiplies the number by 100 and displays in |\n | | fixed (``\'f\'``) format, followed by a percent sign. |\n +-----------+------------------------------------------------------------+\n | None | Similar to ``\'g\'``, except with at least one digit past |\n | | the decimal point and a default precision of 12. This is |\n | | intended to match ``str()``, except you can add the other |\n | | format modifiers. |\n +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n \'a, b, c\'\n >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\') # 3.1+ only\n \'a, b, c\'\n >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n \'c, b, a\'\n >>> \'{2}, {1}, {0}\'.format(*\'abc\') # unpacking argument sequence\n \'c, b, a\'\n >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\') # arguments\' indices can be repeated\n \'abracadabra\'\n\nAccessing arguments by name:\n\n >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n \'Coordinates: 37.24N, -115.81W\'\n >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n >>> c = 3-5j\n >>> (\'The complex number {0} is formed from the real part {0.real} \'\n ... \'and the imaginary part {0.imag}.\').format(c)\n \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n >>> class Point:\n ... def __init__(self, x, y):\n ... self.x, self.y = x, y\n ... def __str__(self):\n ... return \'Point({self.x}, {self.y})\'.format(self=self)\n ...\n >>> str(Point(4, 2))\n \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n >>> coord = (3, 5)\n >>> \'X: {0[0]}; Y: {0[1]}\'.format(coord)\n \'X: 3; Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n >>> \'{:<30}\'.format(\'left aligned\')\n \'left aligned \'\n >>> \'{:>30}\'.format(\'right aligned\')\n \' right aligned\'\n >>> \'{:^30}\'.format(\'centered\')\n \' centered \'\n >>> \'{:*^30}\'.format(\'centered\') # use \'*\' as a fill char\n \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n >>> \'{:+f}; {:+f}\'.format(3.14, -3.14) # show it always\n \'+3.140000; -3.140000\'\n >>> \'{: f}; {: f}\'.format(3.14, -3.14) # show a space for positive numbers\n \' 3.140000; -3.140000\'\n >>> \'{:-f}; {:-f}\'.format(3.14, -3.14) # show only the minus -- same as \'{:f}; {:f}\'\n \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n >>> # format also supports binary numbers\n >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)\n \'int: 42; hex: 2a; oct: 52; bin: 101010\'\n >>> # with 0x, 0o, or 0b as prefix:\n >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)\n \'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n >>> \'{:,}\'.format(1234567890)\n \'1,234,567,890\'\n\nExpressing a percentage:\n\n >>> points = 19\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n >>> import datetime\n >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n ... \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n ...\n \'left<<<<<<<<<<<<\'\n \'^^^^^center^^^^^\'\n \'>>>>>>>>>>>right\'\n >>>\n >>> octets = [192, 168, 0, 1]\n >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n \'C0A80001\'\n >>> int(_, 16)\n 3232235521\n >>>\n >>> width = 5\n >>> for num in range(5,12): #doctest: +NORMALIZE_WHITESPACE\n ... for base in \'dXob\':\n ... print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n ... print()\n ...\n 5 5 5 101\n 6 6 6 110\n 7 7 7 111\n 8 8 10 1000\n 9 9 11 1001\n 10 A 12 1010\n 11 B 13 1011\n',
- 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call. This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended. A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n',
+ 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output. If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n field_name ::= arg_name ("." attribute_name | "[" element_index "]")*\n arg_name ::= [identifier | integer]\n attribute_name ::= identifier\n element_index ::= integer | index_string\n index_string ::= <any source character except "]"> +\n conversion ::= "r" | "s" | "a"\n format_spec ::= <described in the next section>\n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``. These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword. If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument. If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n "First, thou shalt count to {0}" # References first positional argument\n "Bring me a {}" # Implicitly references the first positional argument\n "From {} to {}" # Same as "From {0} to {1}"\n "My quest is {name}" # References keyword argument \'name\'\n "Weight in tons {0.weight}" # \'weight\' attribute of first positional arg\n "Units destroyed: {players[0]}" # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself. However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting. By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n "Harold\'s a clever {0!s}" # Calls str() on the argument first\n "Bring out the holy {name!r}" # Calls repr() on the argument first\n "More {!a}" # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on. Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed. The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*). They can also be passed directly to the\nbuilt-in ``format()`` function. Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n fill ::= <a character other than \'{\' or \'}\'>\n align ::= "<" | ">" | "=" | "^"\n sign ::= "+" | "-" | " "\n width ::= integer\n precision ::= integer\n type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'. The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options. If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'<\'`` | Forces the field to be left-aligned within the available |\n | | space (this is the default for most objects). |\n +-----------+------------------------------------------------------------+\n | ``\'>\'`` | Forces the field to be right-aligned within the available |\n | | space (this is the default for numbers). |\n +-----------+------------------------------------------------------------+\n | ``\'=\'`` | Forces the padding to be placed after the sign (if any) |\n | | but before the digits. This is used for printing fields |\n | | in the form \'+000000120\'. This alignment option is only |\n | | valid for numeric types. |\n +-----------+------------------------------------------------------------+\n | ``\'^\'`` | Forces the field to be centered within the available |\n | | space. |\n +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'+\'`` | indicates that a sign should be used for both positive as |\n | | well as negative numbers. |\n +-----------+------------------------------------------------------------+\n | ``\'-\'`` | indicates that a sign should be used only for negative |\n | | numbers (this is the default behavior). |\n +-----------+------------------------------------------------------------+\n | space | indicates that a leading space should be used on positive |\n | | numbers, and a minus sign on negative numbers. |\n +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion. The alternate form is defined differently for different\ntypes. This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width. If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types. This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'s\'`` | String format. This is the default type for strings and |\n | | may be omitted. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'s\'``. |\n +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'b\'`` | Binary format. Outputs the number in base 2. |\n +-----------+------------------------------------------------------------+\n | ``\'c\'`` | Character. Converts the integer to the corresponding |\n | | unicode character before printing. |\n +-----------+------------------------------------------------------------+\n | ``\'d\'`` | Decimal Integer. Outputs the number in base 10. |\n +-----------+------------------------------------------------------------+\n | ``\'o\'`` | Octal format. Outputs the number in base 8. |\n +-----------+------------------------------------------------------------+\n | ``\'x\'`` | Hex format. Outputs the number in base 16, using lower- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'X\'`` | Hex format. Outputs the number in base 16, using upper- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'d\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'d\'``. |\n +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'e\'`` | Exponent notation. Prints the number in scientific |\n | | notation using the letter \'e\' to indicate the exponent. |\n | | The default precision is ``6``. |\n +-----------+------------------------------------------------------------+\n | ``\'E\'`` | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n | | case \'E\' as the separator character. |\n +-----------+------------------------------------------------------------+\n | ``\'f\'`` | Fixed point. Displays the number as a fixed-point number. |\n | | The default precision is ``6``. |\n +-----------+------------------------------------------------------------+\n | ``\'F\'`` | Fixed point. Same as ``\'f\'``, but converts ``nan`` to |\n | | ``NAN`` and ``inf`` to ``INF``. |\n +-----------+------------------------------------------------------------+\n | ``\'g\'`` | General format. For a given precision ``p >= 1``, this |\n | | rounds the number to ``p`` significant digits and then |\n | | formats the result in either fixed-point format or in |\n | | scientific notation, depending on its magnitude. The |\n | | precise rules are as follows: suppose that the result |\n | | formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1`` would have exponent ``exp``. Then if ``-4 <= exp |\n | | < p``, the number is formatted with presentation type |\n | | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number |\n | | is formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1``. In both cases insignificant trailing zeros are |\n | | removed from the significand, and the decimal point is |\n | | also removed if there are no remaining digits following |\n | | it. Positive and negative infinity, positive and negative |\n | | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n | | ``-0`` and ``nan`` respectively, regardless of the |\n | | precision. A precision of ``0`` is treated as equivalent |\n | | to a precision of ``1``. The default precision is ``6``. |\n +-----------+------------------------------------------------------------+\n | ``\'G\'`` | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n | | if the number gets too large. The representations of |\n | | infinity and NaN are uppercased, too. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'g\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | ``\'%\'`` | Percentage. Multiplies the number by 100 and displays in |\n | | fixed (``\'f\'``) format, followed by a percent sign. |\n +-----------+------------------------------------------------------------+\n | None | Similar to ``\'g\'``, except with at least one digit past |\n | | the decimal point and a default precision of 12. This is |\n | | intended to match ``str()``, except you can add the other |\n | | format modifiers. |\n +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n \'a, b, c\'\n >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\') # 3.1+ only\n \'a, b, c\'\n >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n \'c, b, a\'\n >>> \'{2}, {1}, {0}\'.format(*\'abc\') # unpacking argument sequence\n \'c, b, a\'\n >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\') # arguments\' indices can be repeated\n \'abracadabra\'\n\nAccessing arguments by name:\n\n >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n \'Coordinates: 37.24N, -115.81W\'\n >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n >>> c = 3-5j\n >>> (\'The complex number {0} is formed from the real part {0.real} \'\n ... \'and the imaginary part {0.imag}.\').format(c)\n \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n >>> class Point:\n ... def __init__(self, x, y):\n ... self.x, self.y = x, y\n ... def __str__(self):\n ... return \'Point({self.x}, {self.y})\'.format(self=self)\n ...\n >>> str(Point(4, 2))\n \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n >>> coord = (3, 5)\n >>> \'X: {0[0]}; Y: {0[1]}\'.format(coord)\n \'X: 3; Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n >>> \'{:<30}\'.format(\'left aligned\')\n \'left aligned \'\n >>> \'{:>30}\'.format(\'right aligned\')\n \' right aligned\'\n >>> \'{:^30}\'.format(\'centered\')\n \' centered \'\n >>> \'{:*^30}\'.format(\'centered\') # use \'*\' as a fill char\n \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n >>> \'{:+f}; {:+f}\'.format(3.14, -3.14) # show it always\n \'+3.140000; -3.140000\'\n >>> \'{: f}; {: f}\'.format(3.14, -3.14) # show a space for positive numbers\n \' 3.140000; -3.140000\'\n >>> \'{:-f}; {:-f}\'.format(3.14, -3.14) # show only the minus -- same as \'{:f}; {:f}\'\n \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n >>> # format also supports binary numbers\n >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)\n \'int: 42; hex: 2a; oct: 52; bin: 101010\'\n >>> # with 0x, 0o, or 0b as prefix:\n >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)\n \'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n >>> \'{:,}\'.format(1234567890)\n \'1,234,567,890\'\n\nExpressing a percentage:\n\n >>> points = 19\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n >>> import datetime\n >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n ... \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n ...\n \'left<<<<<<<<<<<<\'\n \'^^^^^center^^^^^\'\n \'>>>>>>>>>>>right\'\n >>>\n >>> octets = [192, 168, 0, 1]\n >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n \'C0A80001\'\n >>> int(_, 16)\n 3232235521\n >>>\n >>> width = 5\n >>> for num in range(5,12): #doctest: +NORMALIZE_WHITESPACE\n ... for base in \'dXob\':\n ... print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n ... print()\n ...\n 5 5 5 101\n 6 6 6 110\n 7 7 7 111\n 8 8 10 1000\n 9 9 11 1001\n 10 A 12 1010\n 11 B 13 1011\n',
+ 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more *parameters* have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n``None`` as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n',
'global': '\nThe ``global`` statement\n************************\n\n global_stmt ::= "global" identifier ("," identifier)*\n\nThe ``global`` statement is a declaration which holds for the entire\ncurrent code block. It means that the listed identifiers are to be\ninterpreted as globals. It would be impossible to assign to a global\nvariable without ``global``, although free variables may refer to\nglobals without being declared global.\n\nNames listed in a ``global`` statement must not be used in the same\ncode block textually preceding that ``global`` statement.\n\nNames listed in a ``global`` statement must not be defined as formal\nparameters or in a ``for`` loop control target, ``class`` definition,\nfunction definition, or ``import`` statement.\n\n**CPython implementation detail:** The current implementation does not\nenforce the latter two restrictions, but programs should not abuse\nthis freedom, as future implementations may enforce them or silently\nchange the meaning of the program.\n\n**Programmer\'s note:** the ``global`` is a directive to the parser.\nIt applies only to code parsed at the same time as the ``global``\nstatement. In particular, a ``global`` statement contained in a string\nor code object supplied to the built-in ``exec()`` function does not\naffect the code block *containing* the function call, and code\ncontained in such a string is unaffected by ``global`` statements in\nthe code containing the function call. The same applies to the\n``eval()`` and ``compile()`` functions.\n',
'id-classes': '\nReserved classes of identifiers\n*******************************\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n Not imported by ``from module import *``. The special identifier\n ``_`` is used in the interactive interpreter to store the result of\n the last evaluation; it is stored in the ``builtins`` module. When\n not in interactive mode, ``_`` has no special meaning and is not\n defined. See section *The import statement*.\n\n Note: The name ``_`` is often used in conjunction with\n internationalization; refer to the documentation for the\n ``gettext`` module for more information on this convention.\n\n``__*__``\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of ``__*__`` names, in any context, that does\n not follow explicitly documented use, is subject to breakage\n without warning.\n\n``__*``\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n',
'identifiers': '\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions.\n\nThe syntax of identifiers in Python is based on the Unicode standard\nannex UAX-31, with elaboration and changes as defined below; see also\n**PEP 3131** for further details.\n\nWithin the ASCII range (U+0001..U+007F), the valid characters for\nidentifiers are the same as in Python 2.x: the uppercase and lowercase\nletters ``A`` through ``Z``, the underscore ``_`` and, except for the\nfirst character, the digits ``0`` through ``9``.\n\nPython 3.0 introduces additional characters from outside the ASCII\nrange (see **PEP 3131**). For these characters, the classification\nuses the version of the Unicode Character Database as included in the\n``unicodedata`` module.\n\nIdentifiers are unlimited in length. Case is significant.\n\n identifier ::= xid_start xid_continue*\n id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>\n id_continue ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>\n xid_start ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">\n xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">\n\nThe Unicode category codes mentioned above stand for:\n\n* *Lu* - uppercase letters\n\n* *Ll* - lowercase letters\n\n* *Lt* - titlecase letters\n\n* *Lm* - modifier letters\n\n* *Lo* - other letters\n\n* *Nl* - letter numbers\n\n* *Mn* - nonspacing marks\n\n* *Mc* - spacing combining marks\n\n* *Nd* - decimal numbers\n\n* *Pc* - connector punctuations\n\n* *Other_ID_Start* - explicit list of characters in PropList.txt to\n support backwards compatibility\n\n* *Other_ID_Continue* - likewise\n\nAll identifiers are converted into the normal form NFKC while parsing;\ncomparison of identifiers is based on NFKC.\n\nA non-normative HTML file listing all valid identifier characters for\nUnicode 4.1 can be found at http://www.dcl.hpi.uni-\npotsdam.de/home/loewis/table-3131.html.\n\n\nKeywords\n========\n\nThe following identifiers are used as reserved words, or *keywords* of\nthe language, and cannot be used as ordinary identifiers. They must\nbe spelled exactly as written here:\n\n False class finally is return\n None continue for lambda try\n True def from nonlocal while\n and del global not with\n as elif if or yield\n assert else import pass\n break except in raise\n\n\nReserved classes of identifiers\n===============================\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n Not imported by ``from module import *``. The special identifier\n ``_`` is used in the interactive interpreter to store the result of\n the last evaluation; it is stored in the ``builtins`` module. When\n not in interactive mode, ``_`` has no special meaning and is not\n defined. See section *The import statement*.\n\n Note: The name ``_`` is often used in conjunction with\n internationalization; refer to the documentation for the\n ``gettext`` module for more information on this convention.\n\n``__*__``\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of ``__*__`` names, in any context, that does\n not follow explicitly documented use, is subject to breakage\n without warning.\n\n``__*``\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n',
'if': '\nThe ``if`` statement\n********************\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n',
'imaginary': '\nImaginary literals\n******************\n\nImaginary literals are described by the following lexical definitions:\n\n imagnumber ::= (floatnumber | intpart) ("j" | "J")\n\nAn imaginary literal yields a complex number with a real part of 0.0.\nComplex numbers are represented as a pair of floating point numbers\nand have the same restrictions on their range. To create a complex\nnumber with a nonzero real part, add a floating point number to it,\ne.g., ``(3+4j)``. Some examples of imaginary literals:\n\n 3.14j 10.j 10j .001j 1e100j 3.14e-10j\n',
- 'import': '\nThe ``import`` statement\n************************\n\n import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*\n | "from" relative_module "import" identifier ["as" name]\n ( "," identifier ["as" name] )*\n | "from" relative_module "import" "(" identifier ["as" name]\n ( "," identifier ["as" name] )* [","] ")"\n | "from" module "import" "*"\n module ::= (identifier ".")* identifier\n relative_module ::= "."* module | "."+\n name ::= identifier\n\nThe basic import statement (no ``from`` clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope where\n the ``import`` statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individiual import statements.\n\nThe details of the first step, finding and loading modules is\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by ``as``, then the name following\n ``as`` is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n top level module, the module\'s name is bound in the local namespace\n as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n name of the top level package that contains the module is bound in\n the local namespace as a reference to the top level package. The\n imported module must be accessed using its full qualified name\n rather than directly\n\nThe ``from`` form uses a slightly more complex process:\n\n1. find the module specified in the ``from`` clause loading and\n initializing it if necessary;\n\n2. for each of the identifiers specified in the ``import`` clauses:\n\n 1. check if the imported module has an attribute by that name\n\n 2. if not, attempt to import a submodule with that name and then\n check the imported module again for that attribute\n\n 3. if the attribute is not found, ``ImportError`` is raised.\n\n 4. otherwise, a reference to that value is bound in the local\n namespace, using the name in the ``as`` clause if it is present,\n otherwise using the attribute name\n\nExamples:\n\n import foo # foo imported and bound locally\n import foo.bar.baz # foo.bar.baz imported, foo bound locally\n import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb\n from foo.bar import baz # foo.bar.baz imported and bound as baz\n from foo import attr # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star (``\'*\'``), all public\nnames defined in the module are bound in the local namespace for the\nscope where the ``import`` statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope.\nAttempting to use it in class or function definitions will raise a\n``SyntaxError``.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope. The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python. The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language. It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n future_statement ::= "from" "__future__" "import" feature ["as" name]\n ("," feature ["as" name])*\n | "from" "__future__" "import" "(" feature ["as" name]\n ("," feature ["as" name])* [","] ")"\n feature ::= identifier\n name ::= identifier\n\nA future statement must appear near the top of the module. The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``. They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code. It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently. Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement. This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session. If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n **PEP 236** - Back to the __future__\n The original proposal for the __future__ mechanism.\n',
+ 'import': '\nThe ``import`` statement\n************************\n\n import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*\n | "from" relative_module "import" identifier ["as" name]\n ( "," identifier ["as" name] )*\n | "from" relative_module "import" "(" identifier ["as" name]\n ( "," identifier ["as" name] )* [","] ")"\n | "from" module "import" "*"\n module ::= (identifier ".")* identifier\n relative_module ::= "."* module | "."+\n name ::= identifier\n\nThe basic import statement (no ``from`` clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope where\n the ``import`` statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individiual import statements.\n\nThe details of the first step, finding and loading modules is\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by ``as``, then the name following\n ``as`` is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n top level module, the module\'s name is bound in the local namespace\n as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n name of the top level package that contains the module is bound in\n the local namespace as a reference to the top level package. The\n imported module must be accessed using its full qualified name\n rather than directly\n\nThe ``from`` form uses a slightly more complex process:\n\n1. find the module specified in the ``from`` clause loading and\n initializing it if necessary;\n\n2. for each of the identifiers specified in the ``import`` clauses:\n\n 1. check if the imported module has an attribute by that name\n\n 2. if not, attempt to import a submodule with that name and then\n check the imported module again for that attribute\n\n 3. if the attribute is not found, ``ImportError`` is raised.\n\n 4. otherwise, a reference to that value is bound in the local\n namespace, using the name in the ``as`` clause if it is present,\n otherwise using the attribute name\n\nExamples:\n\n import foo # foo imported and bound locally\n import foo.bar.baz # foo.bar.baz imported, foo bound locally\n import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb\n from foo.bar import baz # foo.bar.baz imported and bound as baz\n from foo import attr # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star (``\'*\'``), all public\nnames defined in the module are bound in the local namespace for the\nscope where the ``import`` statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope. The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python. The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language. It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n future_statement ::= "from" "__future__" "import" feature ["as" name]\n ("," feature ["as" name])*\n | "from" "__future__" "import" "(" feature ["as" name]\n ("," feature ["as" name])* [","] ")"\n feature ::= identifier\n name ::= identifier\n\nA future statement must appear near the top of the module. The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``. They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code. It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently. Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement. This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session. If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n **PEP 236** - Back to the __future__\n The original proposal for the __future__ mechanism.\n',
'in': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects. The objects need not have the same type.\nIf both are numbers, they are converted to a common type. Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes. You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n are identical to themselves, ``x is x`` but are not equal to\n themselves, ``x != x``. Additionally, comparing any value to a\n not-a-number value will return ``False``. For example, both ``3 <\n float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n corresponding elements. This means that to compare equal, each\n element must compare equal and the two sequences must be of the same\n type and have the same length.\n\n If not equal, the sequences are ordered the same as their first\n differing elements. For example, ``[1,2,x] <= [1,2,y]`` has the\n same value as ``x <= y``. If the corresponding element does not\n exist, the shorter sequence is ordered first (for example, ``[1,2] <\n [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n superset tests. Those relations do not define total orderings (the\n two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering.\n For example, ``min()``, ``max()``, and ``sorted()`` produce\n undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n the same object; the choice whether one object is considered smaller\n or larger than another one is made arbitrarily but consistently\n within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison. Most\nnumeric types can be compared with one another. When cross-type\ncomparison is not supported, the comparison method returns\n``NotImplemented``.\n\nThe operators ``in`` and ``not in`` test for membership. ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise. ``x\nnot in s`` returns the negation of ``x in s``. All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``. If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object. ``x is\nnot y`` yields the inverse truth value. [4]\n',
'integers': '\nInteger literals\n****************\n\nInteger literals are described by the following lexical definitions:\n\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"+\n nonzerodigit ::= "1"..."9"\n digit ::= "0"..."9"\n octinteger ::= "0" ("o" | "O") octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n octdigit ::= "0"..."7"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n bindigit ::= "0" | "1"\n\nThere is no limit for the length of integer literals apart from what\ncan be stored in available memory.\n\nNote that leading zeros in a non-zero decimal number are not allowed.\nThis is for disambiguation with C-style octal literals, which Python\nused before version 3.0.\n\nSome examples of integer literals:\n\n 7 2147483647 0o177 0b100110111\n 3 79228162514264337593543950336 0o377 0x100000000\n 79228162514264337593543950336 0xdeadbeef\n',
'lambda': '\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n lambda_form_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda forms (lambda expressions) have the same syntactic position as\nexpressions. They are a shorthand to create anonymous functions; the\nexpression ``lambda arguments: expression`` yields a function object.\nThe unnamed object behaves like a function object defined with\n\n def <lambda>(arguments):\n return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda forms cannot contain\nstatements or annotations.\n',
@@ -51,17 +51,17 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'numbers': "\nNumeric literals\n****************\n\nThere are three types of numeric literals: integers, floating point\nnumbers, and imaginary numbers. There are no complex literals\n(complex numbers can be formed by adding a real number and an\nimaginary number).\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator '``-``' and\nthe literal ``1``.\n",
'numeric-types': "\nEmulating numeric types\n***********************\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand's type is a subclass of the left operand's\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand's\n non-reflected method. This behavior allows subclasses to\n override their ancestors' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n",
'objects': '\nObjects, values and types\n*************************\n\n*Objects* are Python\'s abstraction for data. All data in a Python\nprogram is represented by objects or by relations between objects. (In\na sense, and in conformance to Von Neumann\'s model of a "stored\nprogram computer," code is also represented by objects.)\n\nEvery object has an identity, a type and a value. An object\'s\n*identity* never changes once it has been created; you may think of it\nas the object\'s address in memory. The \'``is``\' operator compares the\nidentity of two objects; the ``id()`` function returns an integer\nrepresenting its identity.\n\n**CPython implementation detail:** For CPython, ``id(x)`` is the\nmemory address where ``x`` is stored.\n\nAn object\'s type determines the operations that the object supports\n(e.g., "does it have a length?") and also defines the possible values\nfor objects of that type. The ``type()`` function returns an object\'s\ntype (which is an object itself). Like its identity, an object\'s\n*type* is also unchangeable. [1]\n\nThe *value* of some objects can change. Objects whose value can\nchange are said to be *mutable*; objects whose value is unchangeable\nonce they are created are called *immutable*. (The value of an\nimmutable container object that contains a reference to a mutable\nobject can change when the latter\'s value is changed; however the\ncontainer is still considered immutable, because the collection of\nobjects it contains cannot be changed. So, immutability is not\nstrictly the same as having an unchangeable value, it is more subtle.)\nAn object\'s mutability is determined by its type; for instance,\nnumbers, strings and tuples are immutable, while dictionaries and\nlists are mutable.\n\nObjects are never explicitly destroyed; however, when they become\nunreachable they may be garbage-collected. An implementation is\nallowed to postpone garbage collection or omit it altogether --- it is\na matter of implementation quality how garbage collection is\nimplemented, as long as no objects are collected that are still\nreachable.\n\n**CPython implementation detail:** CPython currently uses a reference-\ncounting scheme with (optional) delayed detection of cyclically linked\ngarbage, which collects most objects as soon as they become\nunreachable, but is not guaranteed to collect garbage containing\ncircular references. See the documentation of the ``gc`` module for\ninformation on controlling the collection of cyclic garbage. Other\nimplementations act differently and CPython may change. Do not depend\non immediate finalization of objects when they become unreachable (ex:\nalways close files).\n\nNote that the use of the implementation\'s tracing or debugging\nfacilities may keep objects alive that would normally be collectable.\nAlso note that catching an exception with a \'``try``...``except``\'\nstatement may keep objects alive.\n\nSome objects contain references to "external" resources such as open\nfiles or windows. It is understood that these resources are freed\nwhen the object is garbage-collected, but since garbage collection is\nnot guaranteed to happen, such objects also provide an explicit way to\nrelease the external resource, usually a ``close()`` method. Programs\nare strongly recommended to explicitly close such objects. The\n\'``try``...``finally``\' statement and the \'``with``\' statement provide\nconvenient ways to do this.\n\nSome objects contain references to other objects; these are called\n*containers*. Examples of containers are tuples, lists and\ndictionaries. The references are part of a container\'s value. In\nmost cases, when we talk about the value of a container, we imply the\nvalues, not the identities of the contained objects; however, when we\ntalk about the mutability of a container, only the identities of the\nimmediately contained objects are implied. So, if an immutable\ncontainer (like a tuple) contains a reference to a mutable object, its\nvalue changes if that mutable object is changed.\n\nTypes affect almost all aspects of object behavior. Even the\nimportance of object identity is affected in some sense: for immutable\ntypes, operations that compute new values may actually return a\nreference to any existing object with the same type and value, while\nfor mutable objects this is not allowed. E.g., after ``a = 1; b =\n1``, ``a`` and ``b`` may or may not refer to the same object with the\nvalue one, depending on the implementation, but after ``c = []; d =\n[]``, ``c`` and ``d`` are guaranteed to refer to two different,\nunique, newly created empty lists. (Note that ``c = d = []`` assigns\nthe same object to both ``c`` and ``d``.)\n',
- 'operator-summary': '\nOperator precedence\n*******************\n\nThe following table summarizes the operator precedences in Python,\nfrom lowest precedence (least binding) to highest precedence (most\nbinding). Operators in the same box have the same precedence. Unless\nthe syntax is explicitly given, operators are binary. Operators in\nthe same box group left to right (except for comparisons, including\ntests, which all have the same precedence and chain from left to right\n--- see section *Comparisons* --- and exponentiation, which groups\nfrom right to left).\n\n+-------------------------------------------------+---------------------------------------+\n| Operator | Description |\n+=================================================+=======================================+\n| ``lambda`` | Lambda expression |\n+-------------------------------------------------+---------------------------------------+\n| ``if`` -- ``else`` | Conditional expression |\n+-------------------------------------------------+---------------------------------------+\n| ``or`` | Boolean OR |\n+-------------------------------------------------+---------------------------------------+\n| ``and`` | Boolean AND |\n+-------------------------------------------------+---------------------------------------+\n| ``not`` ``x`` | Boolean NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``in``, ``not in``, ``is``, ``is not``, ``<``, | Comparisons, including membership |\n| ``<=``, ``>``, ``>=``, ``!=``, ``==`` | tests and identity tests, |\n+-------------------------------------------------+---------------------------------------+\n| ``|`` | Bitwise OR |\n+-------------------------------------------------+---------------------------------------+\n| ``^`` | Bitwise XOR |\n+-------------------------------------------------+---------------------------------------+\n| ``&`` | Bitwise AND |\n+-------------------------------------------------+---------------------------------------+\n| ``<<``, ``>>`` | Shifts |\n+-------------------------------------------------+---------------------------------------+\n| ``+``, ``-`` | Addition and subtraction |\n+-------------------------------------------------+---------------------------------------+\n| ``*``, ``/``, ``//``, ``%`` | Multiplication, division, remainder |\n| | [5] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [6] |\n+-------------------------------------------------+---------------------------------------+\n| ``x[index]``, ``x[index:index]``, | Subscription, slicing, call, |\n| ``x(arguments...)``, ``x.attribute`` | attribute reference |\n+-------------------------------------------------+---------------------------------------+\n| ``(expressions...)``, ``[expressions...]``, | Binding or tuple display, list |\n| ``{key: value...}``, ``{expressions...}`` | display, dictionary display, set |\n| | display |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] While ``abs(x%y) < abs(y)`` is true mathematically, for floats it\n may not be true numerically due to roundoff. For example, and\n assuming a platform on which a Python float is an IEEE 754 double-\n precision number, in order that ``-1e-100 % 1e100`` have the same\n sign as ``1e100``, the computed result is ``-1e-100 + 1e100``,\n which is numerically exactly equal to ``1e100``. The function\n ``math.fmod()`` returns a result whose sign matches the sign of\n the first argument instead, and so returns ``-1e-100`` in this\n case. Which approach is more appropriate depends on the\n application.\n\n[2] If x is very close to an exact integer multiple of y, it\'s\n possible for ``x//y`` to be one larger than ``(x-x%y)//y`` due to\n rounding. In such cases, Python returns the latter result, in\n order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[3] While comparisons between strings make sense at the byte level,\n they may be counter-intuitive to users. For example, the strings\n ``"\\u00C7"`` and ``"\\u0327\\u0043"`` compare differently, even\n though they both represent the same unicode character (LATIN\n CAPITAL LETTER C WITH CEDILLA). To compare strings in a human\n recognizable way, compare using ``unicodedata.normalize()``.\n\n[4] Due to automatic garbage-collection, free lists, and the dynamic\n nature of descriptors, you may notice seemingly unusual behaviour\n in certain uses of the ``is`` operator, like those involving\n comparisons between instance methods, or constants. Check their\n documentation for more info.\n\n[5] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[6] The power operator ``**`` binds less tightly than an arithmetic or\n bitwise unary operator on its right, that is, ``2**-1`` is\n ``0.5``.\n',
+ 'operator-summary': '\nOperator precedence\n*******************\n\nThe following table summarizes the operator precedences in Python,\nfrom lowest precedence (least binding) to highest precedence (most\nbinding). Operators in the same box have the same precedence. Unless\nthe syntax is explicitly given, operators are binary. Operators in\nthe same box group left to right (except for comparisons, including\ntests, which all have the same precedence and chain from left to right\n--- see section *Comparisons* --- and exponentiation, which groups\nfrom right to left).\n\n+-------------------------------------------------+---------------------------------------+\n| Operator | Description |\n+=================================================+=======================================+\n| ``lambda`` | Lambda expression |\n+-------------------------------------------------+---------------------------------------+\n| ``if`` -- ``else`` | Conditional expression |\n+-------------------------------------------------+---------------------------------------+\n| ``or`` | Boolean OR |\n+-------------------------------------------------+---------------------------------------+\n| ``and`` | Boolean AND |\n+-------------------------------------------------+---------------------------------------+\n| ``not`` ``x`` | Boolean NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``in``, ``not in``, ``is``, ``is not``, ``<``, | Comparisons, including membership |\n| ``<=``, ``>``, ``>=``, ``!=``, ``==`` | tests and identity tests |\n+-------------------------------------------------+---------------------------------------+\n| ``|`` | Bitwise OR |\n+-------------------------------------------------+---------------------------------------+\n| ``^`` | Bitwise XOR |\n+-------------------------------------------------+---------------------------------------+\n| ``&`` | Bitwise AND |\n+-------------------------------------------------+---------------------------------------+\n| ``<<``, ``>>`` | Shifts |\n+-------------------------------------------------+---------------------------------------+\n| ``+``, ``-`` | Addition and subtraction |\n+-------------------------------------------------+---------------------------------------+\n| ``*``, ``/``, ``//``, ``%`` | Multiplication, division, remainder |\n| | [5] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [6] |\n+-------------------------------------------------+---------------------------------------+\n| ``x[index]``, ``x[index:index]``, | Subscription, slicing, call, |\n| ``x(arguments...)``, ``x.attribute`` | attribute reference |\n+-------------------------------------------------+---------------------------------------+\n| ``(expressions...)``, ``[expressions...]``, | Binding or tuple display, list |\n| ``{key: value...}``, ``{expressions...}`` | display, dictionary display, set |\n| | display |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] While ``abs(x%y) < abs(y)`` is true mathematically, for floats it\n may not be true numerically due to roundoff. For example, and\n assuming a platform on which a Python float is an IEEE 754 double-\n precision number, in order that ``-1e-100 % 1e100`` have the same\n sign as ``1e100``, the computed result is ``-1e-100 + 1e100``,\n which is numerically exactly equal to ``1e100``. The function\n ``math.fmod()`` returns a result whose sign matches the sign of\n the first argument instead, and so returns ``-1e-100`` in this\n case. Which approach is more appropriate depends on the\n application.\n\n[2] If x is very close to an exact integer multiple of y, it\'s\n possible for ``x//y`` to be one larger than ``(x-x%y)//y`` due to\n rounding. In such cases, Python returns the latter result, in\n order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[3] While comparisons between strings make sense at the byte level,\n they may be counter-intuitive to users. For example, the strings\n ``"\\u00C7"`` and ``"\\u0327\\u0043"`` compare differently, even\n though they both represent the same unicode character (LATIN\n CAPITAL LETTER C WITH CEDILLA). To compare strings in a human\n recognizable way, compare using ``unicodedata.normalize()``.\n\n[4] Due to automatic garbage-collection, free lists, and the dynamic\n nature of descriptors, you may notice seemingly unusual behaviour\n in certain uses of the ``is`` operator, like those involving\n comparisons between instance methods, or constants. Check their\n documentation for more info.\n\n[5] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[6] The power operator ``**`` binds less tightly than an arithmetic or\n bitwise unary operator on its right, that is, ``2**-1`` is\n ``0.5``.\n',
'pass': '\nThe ``pass`` statement\n**********************\n\n pass_stmt ::= "pass"\n\n``pass`` is a null operation --- when it is executed, nothing happens.\nIt is useful as a placeholder when a statement is required\nsyntactically, but no code needs to be executed, for example:\n\n def f(arg): pass # a function that does nothing (yet)\n\n class C: pass # a class with no methods (yet)\n',
'power': '\nThe power operator\n******************\n\nThe power operator binds more tightly than unary operators on its\nleft; it binds less tightly than unary operators on its right. The\nsyntax is:\n\n power ::= primary ["**" u_expr]\n\nThus, in an unparenthesized sequence of power and unary operators, the\noperators are evaluated from right to left (this does not constrain\nthe evaluation order for the operands): ``-1**2`` results in ``-1``.\n\nThe power operator has the same semantics as the built-in ``pow()``\nfunction, when called with two arguments: it yields its left argument\nraised to the power of its right argument. The numeric arguments are\nfirst converted to a common type, and the result is of that type.\n\nFor int operands, the result has the same type as the operands unless\nthe second argument is negative; in that case, all arguments are\nconverted to float and a float result is delivered. For example,\n``10**2`` returns ``100``, but ``10**-2`` returns ``0.01``.\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``complex`` number. (In earlier versions it raised a\n``ValueError``.)\n',
'raise': '\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["from" expression]]\n\nIf no expressions are present, ``raise`` re-raises the last exception\nthat was active in the current scope. If no exception is active in\nthe current scope, a ``RuntimeError`` exception is raised indicating\nthat this is an error.\n\nOtherwise, ``raise`` evaluates the first expression as the exception\nobject. It must be either a subclass or an instance of\n``BaseException``. If it is a class, the exception instance will be\nobtained when needed by instantiating the class with no arguments.\n\nThe *type* of the exception is the exception instance\'s class, the\n*value* is the instance itself.\n\nA traceback object is normally created automatically when an exception\nis raised and attached to it as the ``__traceback__`` attribute, which\nis writable. You can create an exception and set your own traceback in\none step using the ``with_traceback()`` exception method (which\nreturns the same exception instance, with its traceback set to its\nargument), like so:\n\n raise Exception("foo occurred").with_traceback(tracebackobj)\n\nThe ``from`` clause is used for exception chaining: if given, the\nsecond *expression* must be another exception class or instance, which\nwill then be attached to the raised exception as the ``__cause__``\nattribute (which is writable). If the raised exception is not\nhandled, both exceptions will be printed:\n\n >>> try:\n ... print(1 / 0)\n ... except Exception as exc:\n ... raise RuntimeError("Something bad happened") from exc\n ...\n Traceback (most recent call last):\n File "<stdin>", line 2, in <module>\n ZeroDivisionError: int division or modulo by zero\n\n The above exception was the direct cause of the following exception:\n\n Traceback (most recent call last):\n File "<stdin>", line 4, in <module>\n RuntimeError: Something bad happened\n\nA similar mechanism works implicitly if an exception is raised inside\nan exception handler: the previous exception is then attached as the\nnew exception\'s ``__context__`` attribute:\n\n >>> try:\n ... print(1 / 0)\n ... except:\n ... raise RuntimeError("Something bad happened")\n ...\n Traceback (most recent call last):\n File "<stdin>", line 2, in <module>\n ZeroDivisionError: int division or modulo by zero\n\n During handling of the above exception, another exception occurred:\n\n Traceback (most recent call last):\n File "<stdin>", line 4, in <module>\n RuntimeError: Something bad happened\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information about handling exceptions is in section\n*The try statement*.\n',
'return': '\nThe ``return`` statement\n************************\n\n return_stmt ::= "return" [expression_list]\n\n``return`` may only occur syntactically nested in a function\ndefinition, not within a nested class definition.\n\nIf an expression list is present, it is evaluated, else ``None`` is\nsubstituted.\n\n``return`` leaves the current function call with the expression list\n(or ``None``) as return value.\n\nWhen ``return`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nleaving the function.\n\nIn a generator function, the ``return`` statement indicates that the\ngenerator is done and will cause ``StopIteration`` to be raised. The\nreturned value (if any) is used as an argument to construct\n``StopIteration`` and becomes the ``StopIteration.value`` attribute.\n',
- 'sequence-types': "\nEmulating container types\n*************************\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python's standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping's keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn't define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don't define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n",
+ 'sequence-types': "\nEmulating container types\n*************************\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python's standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping's keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn't define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nobject.__length_hint__(self)\n\n Called to implement ``operator.length_hint()``. Should return an\n estimated length for the object (which may be greater or less than\n the actual length). The length must be an integer ``>=`` 0. This\n method is purely an optimization and is never required for\n correctness.\n\n New in version 3.4.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don't define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n",
'shifting': '\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments. They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as division by ``pow(2,n)``. A\nleft shift by *n* bits is defined as multiplication with ``pow(2,n)``.\n\nNote: In the current implementation, the right-hand operand is required to\n be at most ``sys.maxsize``. If the right-hand operand is larger\n than ``sys.maxsize`` an ``OverflowError`` exception is raised.\n',
'slicings': '\nSlicings\n********\n\nA slicing selects a range of items in a sequence object (e.g., a\nstring, tuple or list). Slicings may be used as expressions or as\ntargets in assignment or ``del`` statements. The syntax for a\nslicing:\n\n slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice\n proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n\nThere is ambiguity in the formal syntax here: anything that looks like\nan expression list also looks like a slice list, so any subscription\ncan be interpreted as a slicing. Rather than further complicating the\nsyntax, this is disambiguated by defining that in this case the\ninterpretation as a subscription takes priority over the\ninterpretation as a slicing (this is the case if the slice list\ncontains no proper slice).\n\nThe semantics for a slicing are as follows. The primary must evaluate\nto a mapping object, and it is indexed (using the same\n``__getitem__()`` method as normal subscription) with a key that is\nconstructed from the slice list, as follows. If the slice list\ncontains at least one comma, the key is a tuple containing the\nconversion of the slice items; otherwise, the conversion of the lone\nslice item is the key. The conversion of a slice item that is an\nexpression is that expression. The conversion of a proper slice is a\nslice object (see section *The standard type hierarchy*) whose\n``start``, ``stop`` and ``step`` attributes are the values of the\nexpressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n',
'specialattrs': '\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant. Some of these are not reported\nby the ``dir()`` built-in function.\n\nobject.__dict__\n\n A dictionary or other mapping object used to store an object\'s\n (writable) attributes.\n\ninstance.__class__\n\n The class to which a class instance belongs.\n\nclass.__bases__\n\n The tuple of base classes of a class object.\n\nclass.__name__\n\n The name of the class or type.\n\nclass.__qualname__\n\n The *qualified name* of the class or type.\n\n New in version 3.3.\n\nclass.__mro__\n\n This attribute is a tuple of classes that are considered when\n looking for base classes during method resolution.\n\nclass.mro()\n\n This method can be overridden by a metaclass to customize the\n method resolution order for its instances. It is called at class\n instantiation, and its result is stored in ``__mro__``.\n\nclass.__subclasses__()\n\n Each class keeps a list of weak references to its immediate\n subclasses. This method returns a list of all those references\n still alive. Example:\n\n >>> int.__subclasses__()\n [<class \'bool\'>]\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found in\n the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list ``[1, 2]`` is considered equal to\n ``[1.0, 2.0]``, and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n operands.\n\n[4] Cased characters are those with general category property being\n one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase), or "Lt"\n (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n',
- 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators. For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``. Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled. For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense. (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected when the option cycle detector is enabled (it\'s on by\n default), but can only be cleaned up if there are no Python-\n level ``__del__()`` methods involved. Refer to the documentation\n for the ``gc`` module for more information about how\n ``__del__()`` methods are handled by the cycle detector,\n particularly the description of the ``garbage`` value.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by ``str(object)`` and the built-in functions ``format()``\n and ``print()`` to compute the "informal" or nicely printable\n string representation of an object. The return value must be a\n *string* object.\n\n This method differs from ``object.__repr__()`` in that there is no\n expectation that ``__str__()`` return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type ``object``\n calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``str.format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n A class that overrides ``__eq__()`` and does not define\n ``__hash__()`` will have its ``__hash__()`` implicitly set to\n ``None``. When the ``__hash__()`` method of a class is ``None``,\n instances of the class will raise an appropriate ``TypeError`` when\n a program attempts to retrieve their hash value, and will also be\n correctly identified as unhashable when checking ``isinstance(obj,\n collections.Hashable``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``.\n\n If a class that does not override ``__eq__()`` wishes to suppress\n hash support, it should include ``__hash__ = None`` in the class\n definition. A class which defines its own ``__hash__()`` that\n explicitly raises a ``TypeError`` would be incorrectly identified\n as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. The class body\nis executed in a new namespace and the class name is bound locally to\nthe result of ``type(name, bases, namespace)``.\n\nThe class creation process can be customised by passing the\n``metaclass`` keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both ``MyClass`` and ``MySubclass`` are\ninstances of ``Meta``:\n\n class Meta(type):\n pass\n\n class MyClass(metaclass=Meta):\n pass\n\n class MySubclass(MyClass):\n pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then ``type()`` is\n used\n\n* if an explicit metaclass is given and it is *not* an instance of\n ``type()``, then it is used directly as the metaclass\n\n* if an instance of ``type()`` is given as the explicit metaclass, or\n bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with ``TypeError``.\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a ``__prepare__``\nattribute, it is called as ``namespace = metaclass.__prepare__(name,\nbases, **kwds)`` (where the additional keyword arguments, if any, come\nfrom the class definition).\n\nIf the metaclass has no ``__prepare__`` attribute, then the class\nnamespace is initialised as an empty ``dict()`` instance.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3000\n Introduced the ``__prepare__`` namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as ``exec(body, globals(),\nnamespace)``. The key difference from a normal call to ``exec()`` is\nthat lexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling ``metaclass(name, bases,\nnamespace, **kwds)`` (the additional keywords passed here are the same\nas those passed to ``__prepare__``).\n\nThis class object is the one that will be referenced by the zero-\nargument form of ``super()``. ``__class__`` is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either ``__class__`` or ``super``. This allows the zero argument\nform of ``super()`` to correctly identify the class being defined\nbased on lexical scoping, while the class or instance that was used to\nmake the current call is identified based on the first argument passed\nto the method.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nSee also:\n\n **PEP 3135** - New super\n Describes the implicit ``__class__`` closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n class OrderedClass(type):\n\n @classmethod\n def __prepare__(metacls, name, bases, **kwds):\n return collections.OrderedDict()\n\n def __new__(cls, name, bases, namespace, **kwds):\n result = type.__new__(cls, name, bases, dict(namespace))\n result.members = tuple(namespace)\n return result\n\n class A(metaclass=OrderedClass):\n def one(self): pass\n def two(self): pass\n def three(self): pass\n def four(self): pass\n\n >>> A.members\n (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``. That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked. That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n Return true if *instance* should be considered a (direct or\n indirect) instance of *class*. If defined, called to implement\n ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n Return true if *subclass* should be considered a (direct or\n indirect) subclass of *class*. If defined, called to implement\n ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass. They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n **PEP 3119** - Introducing Abstract Base Classes\n Includes the specification for customizing ``isinstance()`` and\n ``issubclass()`` behavior through ``__instancecheck__()`` and\n ``__subclasscheck__()``, with motivation for this functionality\n in the context of adding Abstract Base Classes (see the ``abc``\n module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left operand\'s\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand\'s\n non-reflected method. This behavior allows subclasses to\n override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception:\n\n >>> class C:\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n >>> 1 .__hash__() == hash(1)\n True\n >>> int.__hash__() == hash(int)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n >>> type(1).__hash__(1) == hash(1)\n True\n >>> type(int).__hash__(int) == hash(int)\n True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n >>> class Meta(type):\n ... def __getattribute__(*args):\n ... print("Metaclass getattribute invoked")\n ... return type.__getattribute__(*args)\n ...\n >>> class C(object, metaclass=Meta):\n ... def __len__(self):\n ... return 10\n ... def __getattribute__(*args):\n ... print("Class getattribute invoked")\n ... return object.__getattribute__(*args)\n ...\n >>> c = C()\n >>> c.__len__() # Explicit lookup via instance\n Class getattribute invoked\n 10\n >>> type(c).__len__(c) # Explicit lookup via type\n Metaclass getattribute invoked\n 10\n >>> len(c) # Implicit lookup\n 10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n certain controlled conditions. It generally isn\'t a good idea\n though, since it can lead to some very strange behaviour if it is\n handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n reflected method (such as ``__add__()``) fails the operation is\n not supported, which is why the reflected method is not called.\n',
- 'string-methods': '\nString Methods\n**************\n\nStrings implement all of the *common* sequence operations, along with\nthe additional methods described below.\n\nStrings also support two styles of string formatting, one providing a\nlarge degree of flexibility and customization (see ``str.format()``,\n*Format String Syntax* and *String Formatting*) and the other based on\nC ``printf`` style formatting that handles a narrower range of types\nand is slightly harder to use correctly, but is often faster for the\ncases it can handle (*printf-style String Formatting*).\n\nThe *Text Processing Services* section of the standard library covers\na number of other modules that provide various text related utilities\n(including regular expression support in the ``re`` module).\n\nstr.capitalize()\n\n Return a copy of the string with its first character capitalized\n and the rest lowercased.\n\nstr.casefold()\n\n Return a casefolded copy of the string. Casefolded strings may be\n used for caseless matching.\n\n Casefolding is similar to lowercasing but more aggressive because\n it is intended to remove all case distinctions in a string. For\n example, the German lowercase letter ``\'\xc3\x9f\'`` is equivalent to\n ``"ss"``. Since it is already lowercase, ``lower()`` would do\n nothing to ``\'\xc3\x9f\'``; ``casefold()`` converts it to ``"ss"``.\n\n The casefolding algorithm is described in section 3.13 of the\n Unicode Standard.\n\n New in version 3.3.\n\nstr.center(width[, fillchar])\n\n Return centered in a string of length *width*. Padding is done\n using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n Return the number of non-overlapping occurrences of substring *sub*\n in the range [*start*, *end*]. Optional arguments *start* and\n *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n Return an encoded version of the string as a bytes object. Default\n encoding is ``\'utf-8\'``. *errors* may be given to set a different\n error handling scheme. The default for *errors* is ``\'strict\'``,\n meaning that encoding errors raise a ``UnicodeError``. Other\n possible values are ``\'ignore\'``, ``\'replace\'``,\n ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n registered via ``codecs.register_error()``, see section *Codec Base\n Classes*. For a list of possible encodings, see section *Standard\n Encodings*.\n\n Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n Return ``True`` if the string ends with the specified *suffix*,\n otherwise return ``False``. *suffix* can also be a tuple of\n suffixes to look for. With optional *start*, test beginning at\n that position. With optional *end*, stop comparing at that\n position.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by zero or more spaces, depending on the current column and the\n given tab size. The column number is reset to zero after each\n newline occurring in the string. If *tabsize* is not given, a tab\n size of ``8`` characters is assumed. This doesn\'t understand other\n non-printing characters or escape sequences.\n\nstr.find(sub[, start[, end]])\n\n Return the lowest index in the string where substring *sub* is\n found, such that *sub* is contained in the slice ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` if *sub* is not found.\n\n Note: The ``find()`` method should be used only if you need to know the\n position of *sub*. To check if *sub* is a substring or not, use\n the ``in`` operator:\n\n >>> \'Py\' in \'Python\'\n True\n\nstr.format(*args, **kwargs)\n\n Perform a string formatting operation. The string on which this\n method is called can contain literal text or replacement fields\n delimited by braces ``{}``. Each replacement field contains either\n the numeric index of a positional argument, or the name of a\n keyword argument. Returns a copy of the string where each\n replacement field is replaced with the string value of the\n corresponding argument.\n\n >>> "The sum of 1 + 2 is {0}".format(1+2)\n \'The sum of 1 + 2 is 3\'\n\n See *Format String Syntax* for a description of the various\n formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n Similar to ``str.format(**mapping)``, except that ``mapping`` is\n used directly and not copied to a ``dict`` . This is useful if for\n example ``mapping`` is a dict subclass:\n\n >>> class Default(dict):\n ... def __missing__(self, key):\n ... return key\n ...\n >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n \'Guido was born in country\'\n\n New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n Like ``find()``, but raise ``ValueError`` when the substring is not\n found.\n\nstr.isalnum()\n\n Return true if all characters in the string are alphanumeric and\n there is at least one character, false otherwise. A character\n ``c`` is alphanumeric if one of the following returns ``True``:\n ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n ``c.isnumeric()``.\n\nstr.isalpha()\n\n Return true if all characters in the string are alphabetic and\n there is at least one character, false otherwise. Alphabetic\n characters are those characters defined in the Unicode character\n database as "Letter", i.e., those with general category property\n being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is\n different from the "Alphabetic" property defined in the Unicode\n Standard.\n\nstr.isdecimal()\n\n Return true if all characters in the string are decimal characters\n and there is at least one character, false otherwise. Decimal\n characters are those from general category "Nd". This category\n includes digit characters, and all characters that can be used to\n form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n Return true if all characters in the string are digits and there is\n at least one character, false otherwise. Digits include decimal\n characters and digits that need special handling, such as the\n compatibility superscript digits. Formally, a digit is a character\n that has the property value Numeric_Type=Digit or\n Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n Return true if the string is a valid identifier according to the\n language definition, section *Identifiers and keywords*.\n\nstr.islower()\n\n Return true if all cased characters [4] in the string are lowercase\n and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n Return true if all characters in the string are numeric characters,\n and there is at least one character, false otherwise. Numeric\n characters include digit characters, and all characters that have\n the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n ONE FIFTH. Formally, numeric characters are those with the\n property value Numeric_Type=Digit, Numeric_Type=Decimal or\n Numeric_Type=Numeric.\n\nstr.isprintable()\n\n Return true if all characters in the string are printable or the\n string is empty, false otherwise. Nonprintable characters are\n those characters defined in the Unicode character database as\n "Other" or "Separator", excepting the ASCII space (0x20) which is\n considered printable. (Note that printable characters in this\n context are those which should not be escaped when ``repr()`` is\n invoked on a string. It has no bearing on the handling of strings\n written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n Return true if there are only whitespace characters in the string\n and there is at least one character, false otherwise. Whitespace\n characters are those characters defined in the Unicode character\n database as "Other" or "Separator" and those with bidirectional\n property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n Return true if the string is a titlecased string and there is at\n least one character, for example uppercase characters may only\n follow uncased characters and lowercase characters only cased ones.\n Return false otherwise.\n\nstr.isupper()\n\n Return true if all cased characters [4] in the string are uppercase\n and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. A ``TypeError`` will be raised if there are\n any non-string values in *iterable*, including ``bytes`` objects.\n The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n Return the string left justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n The lowercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.lstrip([chars])\n\n Return a copy of the string with leading characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a prefix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.lstrip()\n \'spacious \'\n >>> \'www.example.com\'.lstrip(\'cmowz.\')\n \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n This static method returns a translation table usable for\n ``str.translate()``.\n\n If there is only one argument, it must be a dictionary mapping\n Unicode ordinals (integers) or characters (strings of length 1) to\n Unicode ordinals, strings (of arbitrary lengths) or None.\n Character keys will then be converted to ordinals.\n\n If there are two arguments, they must be strings of equal length,\n and in the resulting dictionary, each character in x will be mapped\n to the character at the same position in y. If there is a third\n argument, it must be a string, whose characters will be mapped to\n None in the result.\n\nstr.partition(sep)\n\n Split the string at the first occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing the string itself, followed by\n two empty strings.\n\nstr.replace(old, new[, count])\n\n Return a copy of the string with all occurrences of substring *old*\n replaced by *new*. If the optional argument *count* is given, only\n the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n Return the highest index in the string where substring *sub* is\n found, such that *sub* is contained within ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n is not found.\n\nstr.rjust(width[, fillchar])\n\n Return the string right justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n Split the string at the last occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing two empty strings, followed by\n the string itself.\n\nstr.rsplit(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n are done, the *rightmost* ones. If *sep* is not specified or\n ``None``, any whitespace string is a separator. Except for\n splitting from the right, ``rsplit()`` behaves like ``split()``\n which is described in detail below.\n\nstr.rstrip([chars])\n\n Return a copy of the string with trailing characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a suffix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.rstrip()\n \' spacious\'\n >>> \'mississippi\'.rstrip(\'ipz\')\n \'mississ\'\n\nstr.split(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit*\n splits are done (thus, the list will have at most ``maxsplit+1``\n elements). If *maxsplit* is not specified or ``-1``, then there is\n no limit on the number of splits (all possible splits are made).\n\n If *sep* is given, consecutive delimiters are not grouped together\n and are deemed to delimit empty strings (for example,\n ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``). The *sep*\n argument may consist of multiple characters (for example,\n ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n an empty string with a specified separator returns ``[\'\']``.\n\n If *sep* is not specified or is ``None``, a different splitting\n algorithm is applied: runs of consecutive whitespace are regarded\n as a single separator, and the result will contain no empty strings\n at the start or end if the string has leading or trailing\n whitespace. Consequently, splitting an empty string or a string\n consisting of just whitespace with a ``None`` separator returns\n ``[]``.\n\n For example, ``\' 1 2 3 \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n and ``\' 1 2 3 \'.split(None, 1)`` returns ``[\'1\', \'2 3 \']``.\n\nstr.splitlines([keepends])\n\n Return a list of the lines in the string, breaking at line\n boundaries. This method uses the *universal newlines* approach to\n splitting lines. Line breaks are not included in the resulting list\n unless *keepends* is given and true.\n\n For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n \'kl\\r\\n\']``.\n\n Unlike ``split()`` when a delimiter string *sep* is given, this\n method returns an empty list for the empty string, and a terminal\n line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n Return ``True`` if string starts with the *prefix*, otherwise\n return ``False``. *prefix* can also be a tuple of prefixes to look\n for. With optional *start*, test string beginning at that\n position. With optional *end*, stop comparing string at that\n position.\n\nstr.strip([chars])\n\n Return a copy of the string with the leading and trailing\n characters removed. The *chars* argument is a string specifying the\n set of characters to be removed. If omitted or ``None``, the\n *chars* argument defaults to removing whitespace. The *chars*\n argument is not a prefix or suffix; rather, all combinations of its\n values are stripped:\n\n >>> \' spacious \'.strip()\n \'spacious\'\n >>> \'www.example.com\'.strip(\'cmowz.\')\n \'example\'\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa. Note that it is not necessarily true that\n ``s.swapcase().swapcase() == s``.\n\nstr.title()\n\n Return a titlecased version of the string where words start with an\n uppercase character and the remaining characters are lowercase.\n\n The algorithm uses a simple language-independent definition of a\n word as groups of consecutive letters. The definition works in\n many contexts but it means that apostrophes in contractions and\n possessives form word boundaries, which may not be the desired\n result:\n\n >>> "they\'re bill\'s friends from the UK".title()\n "They\'Re Bill\'S Friends From The Uk"\n\n A workaround for apostrophes can be constructed using regular\n expressions:\n\n >>> import re\n >>> def titlecase(s):\n ... return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n ... lambda mo: mo.group(0)[0].upper() +\n ... mo.group(0)[1:].lower(),\n ... s)\n ...\n >>> titlecase("they\'re bill\'s friends.")\n "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n Return a copy of the *s* where all characters have been mapped\n through the *map* which must be a dictionary of Unicode ordinals\n (integers) to Unicode ordinals, strings or ``None``. Unmapped\n characters are left untouched. Characters mapped to ``None`` are\n deleted.\n\n You can use ``str.maketrans()`` to create a translation map from\n character-to-character mappings in different formats.\n\n Note: An even more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see\n ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n Return a copy of the string with all the cased characters [4]\n converted to uppercase. Note that ``str.upper().isupper()`` might\n be ``False`` if ``s`` contains uncased characters or if the Unicode\n category of the resulting character(s) is not "Lu" (Letter,\n uppercase), but e.g. "Lt" (Letter, titlecase).\n\n The uppercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.zfill(width)\n\n Return the numeric string left filled with zeros in a string of\n length *width*. A sign prefix is handled correctly. The original\n string is returned if *width* is less than or equal to ``len(s)``.\n',
+ 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators. For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``. Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled. For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense. (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected and cleaned up when the cyclic garbage collector is\n enabled (it\'s on by default). Refer to the documentation for the\n ``gc`` module for more information about this topic.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by ``str(object)`` and the built-in functions ``format()``\n and ``print()`` to compute the "informal" or nicely printable\n string representation of an object. The return value must be a\n *string* object.\n\n This method differs from ``object.__repr__()`` in that there is no\n expectation that ``__str__()`` return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type ``object``\n calls ``object.__repr__()``.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``str.format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n Note: ``hash()`` truncates the value returned from an object\'s custom\n ``__hash__()`` method to the size of a ``Py_ssize_t``. This is\n typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.\n If an object\'s ``__hash__()`` must interoperate on builds of\n different bit sizes, be sure to check the width on all supported\n builds. An easy way to do this is with ``python -c "import sys;\n print(sys.hash_info.width)"``\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n A class that overrides ``__eq__()`` and does not define\n ``__hash__()`` will have its ``__hash__()`` implicitly set to\n ``None``. When the ``__hash__()`` method of a class is ``None``,\n instances of the class will raise an appropriate ``TypeError`` when\n a program attempts to retrieve their hash value, and will also be\n correctly identified as unhashable when checking ``isinstance(obj,\n collections.Hashable``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``.\n\n If a class that does not override ``__eq__()`` wishes to suppress\n hash support, it should include ``__hash__ = None`` in the class\n definition. A class which defines its own ``__hash__()`` that\n explicitly raises a ``TypeError`` would be incorrectly identified\n as hashable by an ``isinstance(obj, collections.Hashable)`` call.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. The class body\nis executed in a new namespace and the class name is bound locally to\nthe result of ``type(name, bases, namespace)``.\n\nThe class creation process can be customised by passing the\n``metaclass`` keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both ``MyClass`` and ``MySubclass`` are\ninstances of ``Meta``:\n\n class Meta(type):\n pass\n\n class MyClass(metaclass=Meta):\n pass\n\n class MySubclass(MyClass):\n pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then ``type()`` is\n used\n\n* if an explicit metaclass is given and it is *not* an instance of\n ``type()``, then it is used directly as the metaclass\n\n* if an instance of ``type()`` is given as the explicit metaclass, or\n bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with ``TypeError``.\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a ``__prepare__``\nattribute, it is called as ``namespace = metaclass.__prepare__(name,\nbases, **kwds)`` (where the additional keyword arguments, if any, come\nfrom the class definition).\n\nIf the metaclass has no ``__prepare__`` attribute, then the class\nnamespace is initialised as an empty ``dict()`` instance.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3000\n Introduced the ``__prepare__`` namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as ``exec(body, globals(),\nnamespace)``. The key difference from a normal call to ``exec()`` is\nthat lexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling ``metaclass(name, bases,\nnamespace, **kwds)`` (the additional keywords passed here are the same\nas those passed to ``__prepare__``).\n\nThis class object is the one that will be referenced by the zero-\nargument form of ``super()``. ``__class__`` is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either ``__class__`` or ``super``. This allows the zero argument\nform of ``super()`` to correctly identify the class being defined\nbased on lexical scoping, while the class or instance that was used to\nmake the current call is identified based on the first argument passed\nto the method.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nSee also:\n\n **PEP 3135** - New super\n Describes the implicit ``__class__`` closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n class OrderedClass(type):\n\n @classmethod\n def __prepare__(metacls, name, bases, **kwds):\n return collections.OrderedDict()\n\n def __new__(cls, name, bases, namespace, **kwds):\n result = type.__new__(cls, name, bases, dict(namespace))\n result.members = tuple(namespace)\n return result\n\n class A(metaclass=OrderedClass):\n def one(self): pass\n def two(self): pass\n def three(self): pass\n def four(self): pass\n\n >>> A.members\n (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``. That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked. That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n Return true if *instance* should be considered a (direct or\n indirect) instance of *class*. If defined, called to implement\n ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n Return true if *subclass* should be considered a (direct or\n indirect) subclass of *class*. If defined, called to implement\n ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass. They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n **PEP 3119** - Introducing Abstract Base Classes\n Includes the specification for customizing ``isinstance()`` and\n ``issubclass()`` behavior through ``__instancecheck__()`` and\n ``__subclasscheck__()``, with motivation for this functionality\n in the context of adding Abstract Base Classes (see the ``abc``\n module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nobject.__length_hint__(self)\n\n Called to implement ``operator.length_hint()``. Should return an\n estimated length for the object (which may be greater or less than\n the actual length). The length must be an integer ``>=`` 0. This\n method is purely an optimization and is never required for\n correctness.\n\n New in version 3.4.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left operand\'s\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand\'s\n non-reflected method. This behavior allows subclasses to\n override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception:\n\n >>> class C:\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n >>> 1 .__hash__() == hash(1)\n True\n >>> int.__hash__() == hash(int)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n >>> type(1).__hash__(1) == hash(1)\n True\n >>> type(int).__hash__(int) == hash(int)\n True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n >>> class Meta(type):\n ... def __getattribute__(*args):\n ... print("Metaclass getattribute invoked")\n ... return type.__getattribute__(*args)\n ...\n >>> class C(object, metaclass=Meta):\n ... def __len__(self):\n ... return 10\n ... def __getattribute__(*args):\n ... print("Class getattribute invoked")\n ... return object.__getattribute__(*args)\n ...\n >>> c = C()\n >>> c.__len__() # Explicit lookup via instance\n Class getattribute invoked\n 10\n >>> type(c).__len__(c) # Explicit lookup via type\n Metaclass getattribute invoked\n 10\n >>> len(c) # Implicit lookup\n 10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n certain controlled conditions. It generally isn\'t a good idea\n though, since it can lead to some very strange behaviour if it is\n handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n reflected method (such as ``__add__()``) fails the operation is\n not supported, which is why the reflected method is not called.\n',
+ 'string-methods': '\nString Methods\n**************\n\nStrings implement all of the *common* sequence operations, along with\nthe additional methods described below.\n\nStrings also support two styles of string formatting, one providing a\nlarge degree of flexibility and customization (see ``str.format()``,\n*Format String Syntax* and *String Formatting*) and the other based on\nC ``printf`` style formatting that handles a narrower range of types\nand is slightly harder to use correctly, but is often faster for the\ncases it can handle (*printf-style String Formatting*).\n\nThe *Text Processing Services* section of the standard library covers\na number of other modules that provide various text related utilities\n(including regular expression support in the ``re`` module).\n\nstr.capitalize()\n\n Return a copy of the string with its first character capitalized\n and the rest lowercased.\n\nstr.casefold()\n\n Return a casefolded copy of the string. Casefolded strings may be\n used for caseless matching.\n\n Casefolding is similar to lowercasing but more aggressive because\n it is intended to remove all case distinctions in a string. For\n example, the German lowercase letter ``\'\xc3\x9f\'`` is equivalent to\n ``"ss"``. Since it is already lowercase, ``lower()`` would do\n nothing to ``\'\xc3\x9f\'``; ``casefold()`` converts it to ``"ss"``.\n\n The casefolding algorithm is described in section 3.13 of the\n Unicode Standard.\n\n New in version 3.3.\n\nstr.center(width[, fillchar])\n\n Return centered in a string of length *width*. Padding is done\n using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n Return the number of non-overlapping occurrences of substring *sub*\n in the range [*start*, *end*]. Optional arguments *start* and\n *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n Return an encoded version of the string as a bytes object. Default\n encoding is ``\'utf-8\'``. *errors* may be given to set a different\n error handling scheme. The default for *errors* is ``\'strict\'``,\n meaning that encoding errors raise a ``UnicodeError``. Other\n possible values are ``\'ignore\'``, ``\'replace\'``,\n ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n registered via ``codecs.register_error()``, see section *Codec Base\n Classes*. For a list of possible encodings, see section *Standard\n Encodings*.\n\n Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n Return ``True`` if the string ends with the specified *suffix*,\n otherwise return ``False``. *suffix* can also be a tuple of\n suffixes to look for. With optional *start*, test beginning at\n that position. With optional *end*, stop comparing at that\n position.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one or more spaces, depending on the current column and the\n given tab size. Tab positions occur every *tabsize* characters\n (default is 8, giving tab positions at columns 0, 8, 16 and so on).\n To expand the string, the current column is set to zero and the\n string is examined character by character. If the character is a\n tab (``\\t``), one or more space characters are inserted in the\n result until the current column is equal to the next tab position.\n (The tab character itself is not copied.) If the character is a\n newline (``\\n``) or return (``\\r``), it is copied and the current\n column is reset to zero. Any other character is copied unchanged\n and the current column is incremented by one regardless of how the\n character is represented when printed.\n\n >>> \'01\\t012\\t0123\\t01234\'.expandtabs()\n \'01 012 0123 01234\'\n >>> \'01\\t012\\t0123\\t01234\'.expandtabs(4)\n \'01 012 0123 01234\'\n\nstr.find(sub[, start[, end]])\n\n Return the lowest index in the string where substring *sub* is\n found, such that *sub* is contained in the slice ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` if *sub* is not found.\n\n Note: The ``find()`` method should be used only if you need to know the\n position of *sub*. To check if *sub* is a substring or not, use\n the ``in`` operator:\n\n >>> \'Py\' in \'Python\'\n True\n\nstr.format(*args, **kwargs)\n\n Perform a string formatting operation. The string on which this\n method is called can contain literal text or replacement fields\n delimited by braces ``{}``. Each replacement field contains either\n the numeric index of a positional argument, or the name of a\n keyword argument. Returns a copy of the string where each\n replacement field is replaced with the string value of the\n corresponding argument.\n\n >>> "The sum of 1 + 2 is {0}".format(1+2)\n \'The sum of 1 + 2 is 3\'\n\n See *Format String Syntax* for a description of the various\n formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n Similar to ``str.format(**mapping)``, except that ``mapping`` is\n used directly and not copied to a ``dict`` . This is useful if for\n example ``mapping`` is a dict subclass:\n\n >>> class Default(dict):\n ... def __missing__(self, key):\n ... return key\n ...\n >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n \'Guido was born in country\'\n\n New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n Like ``find()``, but raise ``ValueError`` when the substring is not\n found.\n\nstr.isalnum()\n\n Return true if all characters in the string are alphanumeric and\n there is at least one character, false otherwise. A character\n ``c`` is alphanumeric if one of the following returns ``True``:\n ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n ``c.isnumeric()``.\n\nstr.isalpha()\n\n Return true if all characters in the string are alphabetic and\n there is at least one character, false otherwise. Alphabetic\n characters are those characters defined in the Unicode character\n database as "Letter", i.e., those with general category property\n being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is\n different from the "Alphabetic" property defined in the Unicode\n Standard.\n\nstr.isdecimal()\n\n Return true if all characters in the string are decimal characters\n and there is at least one character, false otherwise. Decimal\n characters are those from general category "Nd". This category\n includes digit characters, and all characters that can be used to\n form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n Return true if all characters in the string are digits and there is\n at least one character, false otherwise. Digits include decimal\n characters and digits that need special handling, such as the\n compatibility superscript digits. Formally, a digit is a character\n that has the property value Numeric_Type=Digit or\n Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n Return true if the string is a valid identifier according to the\n language definition, section *Identifiers and keywords*.\n\n Use ``keyword.iskeyword()`` to test for reserved identifiers such\n as ``def`` and ``class``.\n\nstr.islower()\n\n Return true if all cased characters [4] in the string are lowercase\n and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n Return true if all characters in the string are numeric characters,\n and there is at least one character, false otherwise. Numeric\n characters include digit characters, and all characters that have\n the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n ONE FIFTH. Formally, numeric characters are those with the\n property value Numeric_Type=Digit, Numeric_Type=Decimal or\n Numeric_Type=Numeric.\n\nstr.isprintable()\n\n Return true if all characters in the string are printable or the\n string is empty, false otherwise. Nonprintable characters are\n those characters defined in the Unicode character database as\n "Other" or "Separator", excepting the ASCII space (0x20) which is\n considered printable. (Note that printable characters in this\n context are those which should not be escaped when ``repr()`` is\n invoked on a string. It has no bearing on the handling of strings\n written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n Return true if there are only whitespace characters in the string\n and there is at least one character, false otherwise. Whitespace\n characters are those characters defined in the Unicode character\n database as "Other" or "Separator" and those with bidirectional\n property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n Return true if the string is a titlecased string and there is at\n least one character, for example uppercase characters may only\n follow uncased characters and lowercase characters only cased ones.\n Return false otherwise.\n\nstr.isupper()\n\n Return true if all cased characters [4] in the string are uppercase\n and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. A ``TypeError`` will be raised if there are\n any non-string values in *iterable*, including ``bytes`` objects.\n The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n Return the string left justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n The lowercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.lstrip([chars])\n\n Return a copy of the string with leading characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a prefix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.lstrip()\n \'spacious \'\n >>> \'www.example.com\'.lstrip(\'cmowz.\')\n \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n This static method returns a translation table usable for\n ``str.translate()``.\n\n If there is only one argument, it must be a dictionary mapping\n Unicode ordinals (integers) or characters (strings of length 1) to\n Unicode ordinals, strings (of arbitrary lengths) or None.\n Character keys will then be converted to ordinals.\n\n If there are two arguments, they must be strings of equal length,\n and in the resulting dictionary, each character in x will be mapped\n to the character at the same position in y. If there is a third\n argument, it must be a string, whose characters will be mapped to\n None in the result.\n\nstr.partition(sep)\n\n Split the string at the first occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing the string itself, followed by\n two empty strings.\n\nstr.replace(old, new[, count])\n\n Return a copy of the string with all occurrences of substring *old*\n replaced by *new*. If the optional argument *count* is given, only\n the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n Return the highest index in the string where substring *sub* is\n found, such that *sub* is contained within ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n is not found.\n\nstr.rjust(width[, fillchar])\n\n Return the string right justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n Split the string at the last occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing two empty strings, followed by\n the string itself.\n\nstr.rsplit(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n are done, the *rightmost* ones. If *sep* is not specified or\n ``None``, any whitespace string is a separator. Except for\n splitting from the right, ``rsplit()`` behaves like ``split()``\n which is described in detail below.\n\nstr.rstrip([chars])\n\n Return a copy of the string with trailing characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a suffix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.rstrip()\n \' spacious\'\n >>> \'mississippi\'.rstrip(\'ipz\')\n \'mississ\'\n\nstr.split(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit*\n splits are done (thus, the list will have at most ``maxsplit+1``\n elements). If *maxsplit* is not specified or ``-1``, then there is\n no limit on the number of splits (all possible splits are made).\n\n If *sep* is given, consecutive delimiters are not grouped together\n and are deemed to delimit empty strings (for example,\n ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``). The *sep*\n argument may consist of multiple characters (for example,\n ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n an empty string with a specified separator returns ``[\'\']``.\n\n If *sep* is not specified or is ``None``, a different splitting\n algorithm is applied: runs of consecutive whitespace are regarded\n as a single separator, and the result will contain no empty strings\n at the start or end if the string has leading or trailing\n whitespace. Consequently, splitting an empty string or a string\n consisting of just whitespace with a ``None`` separator returns\n ``[]``.\n\n For example, ``\' 1 2 3 \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n and ``\' 1 2 3 \'.split(None, 1)`` returns ``[\'1\', \'2 3 \']``.\n\nstr.splitlines([keepends])\n\n Return a list of the lines in the string, breaking at line\n boundaries. This method uses the *universal newlines* approach to\n splitting lines. Line breaks are not included in the resulting list\n unless *keepends* is given and true.\n\n For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n \'kl\\r\\n\']``.\n\n Unlike ``split()`` when a delimiter string *sep* is given, this\n method returns an empty list for the empty string, and a terminal\n line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n Return ``True`` if string starts with the *prefix*, otherwise\n return ``False``. *prefix* can also be a tuple of prefixes to look\n for. With optional *start*, test string beginning at that\n position. With optional *end*, stop comparing string at that\n position.\n\nstr.strip([chars])\n\n Return a copy of the string with the leading and trailing\n characters removed. The *chars* argument is a string specifying the\n set of characters to be removed. If omitted or ``None``, the\n *chars* argument defaults to removing whitespace. The *chars*\n argument is not a prefix or suffix; rather, all combinations of its\n values are stripped:\n\n >>> \' spacious \'.strip()\n \'spacious\'\n >>> \'www.example.com\'.strip(\'cmowz.\')\n \'example\'\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa. Note that it is not necessarily true that\n ``s.swapcase().swapcase() == s``.\n\nstr.title()\n\n Return a titlecased version of the string where words start with an\n uppercase character and the remaining characters are lowercase.\n\n The algorithm uses a simple language-independent definition of a\n word as groups of consecutive letters. The definition works in\n many contexts but it means that apostrophes in contractions and\n possessives form word boundaries, which may not be the desired\n result:\n\n >>> "they\'re bill\'s friends from the UK".title()\n "They\'Re Bill\'S Friends From The Uk"\n\n A workaround for apostrophes can be constructed using regular\n expressions:\n\n >>> import re\n >>> def titlecase(s):\n ... return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n ... lambda mo: mo.group(0)[0].upper() +\n ... mo.group(0)[1:].lower(),\n ... s)\n ...\n >>> titlecase("they\'re bill\'s friends.")\n "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n Return a copy of the *s* where all characters have been mapped\n through the *map* which must be a dictionary of Unicode ordinals\n (integers) to Unicode ordinals, strings or ``None``. Unmapped\n characters are left untouched. Characters mapped to ``None`` are\n deleted.\n\n You can use ``str.maketrans()`` to create a translation map from\n character-to-character mappings in different formats.\n\n Note: An even more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see\n ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n Return a copy of the string with all the cased characters [4]\n converted to uppercase. Note that ``str.upper().isupper()`` might\n be ``False`` if ``s`` contains uncased characters or if the Unicode\n category of the resulting character(s) is not "Lu" (Letter,\n uppercase), but e.g. "Lt" (Letter, titlecase).\n\n The uppercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.zfill(width)\n\n Return the numeric string left filled with zeros in a string of\n length *width*. A sign prefix is handled correctly. The original\n string is returned if *width* is less than or equal to ``len(s)``.\n',
'strings': '\nString and Bytes literals\n*************************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "R" | "U"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'" | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | stringescapeseq\n longstringitem ::= longstringchar | stringescapeseq\n shortstringchar ::= <any source character except "\\" or newline or the quote>\n longstringchar ::= <any source character except "\\">\n stringescapeseq ::= "\\" <any source character>\n\n bytesliteral ::= bytesprefix(shortbytes | longbytes)\n bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"\n shortbytes ::= "\'" shortbytesitem* "\'" | \'"\' shortbytesitem* \'"\'\n longbytes ::= "\'\'\'" longbytesitem* "\'\'\'" | \'"""\' longbytesitem* \'"""\'\n shortbytesitem ::= shortbyteschar | bytesescapeseq\n longbytesitem ::= longbyteschar | bytesescapeseq\n shortbyteschar ::= <any ASCII character except "\\" or newline or the quote>\n longbyteschar ::= <any ASCII character except "\\">\n bytesescapeseq ::= "\\" <any ASCII character>\n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` or\n``bytesprefix`` and the rest of the literal. The source character set\nis defined by the encoding declaration; it is UTF-8 if no encoding\ndeclaration is given in the source file; see section *Encoding\ndeclarations*.\n\nIn plain English: Both types of literals can be enclosed in matching\nsingle quotes (``\'``) or double quotes (``"``). They can also be\nenclosed in matching groups of three single or double quotes (these\nare generally referred to as *triple-quoted strings*). The backslash\n(``\\``) character is used to escape characters that otherwise have a\nspecial meaning, such as newline, backslash itself, or the quote\ncharacter.\n\nBytes literals are always prefixed with ``\'b\'`` or ``\'B\'``; they\nproduce an instance of the ``bytes`` type instead of the ``str`` type.\nThey may only contain ASCII characters; bytes with a numeric value of\n128 or greater must be expressed with escapes.\n\nAs of Python 3.3 it is possible again to prefix unicode strings with a\n``u`` prefix to simplify maintenance of dual 2.x and 3.x codebases.\n\nBoth string and bytes literals may optionally be prefixed with a\nletter ``\'r\'`` or ``\'R\'``; such strings are called *raw strings* and\ntreat backslashes as literal characters. As a result, in string\nliterals, ``\'\\U\'`` and ``\'\\u\'`` escapes in raw strings are not treated\nspecially. Given that Python 2.x\'s raw unicode literals behave\ndifferently than Python 3.x\'s the ``\'ur\'`` syntax is not supported.\n\n New in version 3.3: The ``\'rb\'`` prefix of raw bytes literals has\n been added as a synonym of ``\'br\'``.\n\n New in version 3.3: Support for the unicode legacy literal\n (``u\'value\'``) was reintroduced to simplify the maintenance of dual\n Python 2.x and 3.x codebases. See **PEP 414** for more information.\n\nIn triple-quoted strings, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the string. (A "quote" is the character used to open the\nstring, i.e. either ``\'`` or ``"``.)\n\nUnless an ``\'r\'`` or ``\'R\'`` prefix is present, escape sequences in\nstrings are interpreted according to rules similar to those used by\nStandard C. The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| ``\\newline`` | Backslash and newline ignored | |\n+-------------------+-----------------------------------+---------+\n| ``\\\\`` | Backslash (``\\``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\\'`` | Single quote (``\'``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\"`` | Double quote (``"``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\a`` | ASCII Bell (BEL) | |\n+-------------------+-----------------------------------+---------+\n| ``\\b`` | ASCII Backspace (BS) | |\n+-------------------+-----------------------------------+---------+\n| ``\\f`` | ASCII Formfeed (FF) | |\n+-------------------+-----------------------------------+---------+\n| ``\\n`` | ASCII Linefeed (LF) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (1,3) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (2,3) |\n+-------------------+-----------------------------------+---------+\n\nEscape sequences only recognized in string literals are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| ``\\N{name}`` | Character named *name* in the | (4) |\n| | Unicode database | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (5) |\n| | *xxxx* | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (6) |\n| | *xxxxxxxx* | |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. As in Standard C, up to three octal digits are accepted.\n\n2. Unlike in Standard C, exactly two hex digits are required.\n\n3. In a bytes literal, hexadecimal and octal escapes denote the byte\n with the given value. In a string literal, these escapes denote a\n Unicode character with the given value.\n\n4. Changed in version 3.3: Support for name aliases [1] has been\n added.\n\n5. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence. Exactly four hex digits are\n required.\n\n6. Any Unicode character can be encoded this way. Exactly eight hex\n digits are required.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the string*. (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.) It is also\nimportant to note that the escape sequences only recognized in string\nliterals fall into the category of unrecognized escapes for bytes\nliterals.\n\nEven in a raw string, string quotes can be escaped with a backslash,\nbut the backslash remains in the string; for example, ``r"\\""`` is a\nvalid string literal consisting of two characters: a backslash and a\ndouble quote; ``r"\\"`` is not a valid string literal (even a raw\nstring cannot end in an odd number of backslashes). Specifically, *a\nraw string cannot end in a single backslash* (since the backslash\nwould escape the following quote character). Note also that a single\nbackslash followed by a newline is interpreted as those two characters\nas part of the string, *not* as a line continuation.\n',
'subscriptions': '\nSubscriptions\n*************\n\nA subscription selects an item of a sequence (string, tuple or list)\nor mapping (dictionary) object:\n\n subscription ::= primary "[" expression_list "]"\n\nThe primary must evaluate to an object that supports subscription,\ne.g. a list or dictionary. User-defined objects can support\nsubscription by defining a ``__getitem__()`` method.\n\nFor built-in objects, there are two types of objects that support\nsubscription:\n\nIf the primary is a mapping, the expression list must evaluate to an\nobject whose value is one of the keys of the mapping, and the\nsubscription selects the value in the mapping that corresponds to that\nkey. (The expression list is a tuple except if it has exactly one\nitem.)\n\nIf the primary is a sequence, the expression (list) must evaluate to\nan integer or a slice (as discussed in the following section).\n\nThe formal syntax makes no special provision for negative indices in\nsequences; however, built-in sequences all provide a ``__getitem__()``\nmethod that interprets negative indices by adding the length of the\nsequence to the index (so that ``x[-1]`` selects the last item of\n``x``). The resulting value must be a nonnegative integer less than\nthe number of items in the sequence, and the subscription selects the\nitem whose index is that value (counting from zero). Since the support\nfor negative indices and slicing occurs in the object\'s\n``__getitem__()`` method, subclasses overriding this method will need\nto explicitly add that support.\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n',
'truth': "\nTruth Value Testing\n*******************\n\nAny object can be tested for truth value, for use in an ``if`` or\n``while`` condition or as operand of the Boolean operations below. The\nfollowing values are considered false:\n\n* ``None``\n\n* ``False``\n\n* zero of any numeric type, for example, ``0``, ``0.0``, ``0j``.\n\n* any empty sequence, for example, ``''``, ``()``, ``[]``.\n\n* any empty mapping, for example, ``{}``.\n\n* instances of user-defined classes, if the class defines a\n ``__bool__()`` or ``__len__()`` method, when that method returns the\n integer zero or ``bool`` value ``False``. [1]\n\nAll other values are considered true --- so objects of many types are\nalways true.\n\nOperations and built-in functions that have a Boolean result always\nreturn ``0`` or ``False`` for false and ``1`` or ``True`` for true,\nunless otherwise stated. (Important exception: the Boolean operations\n``or`` and ``and`` always return one of their operands.)\n",
@@ -71,7 +71,7 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'typesmapping': '\nMapping Types --- ``dict``\n**************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects. There is currently only one standard\nmapping type, the *dictionary*. (For other containers see the built-\nin ``list``, ``set``, and ``tuple`` classes, and the ``collections``\nmodule.)\n\nA dictionary\'s keys are *almost* arbitrary values. Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys. Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as ``1`` and ``1.0``) then they can be used interchangeably to\nindex the same dictionary entry. (Note however, that since computers\nstore floating-point numbers as approximations it is usually unwise to\nuse them as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of\n``key: value`` pairs within braces, for example: ``{\'jack\': 4098,\n\'sjoerd\': 4127}`` or ``{4098: \'jack\', 4127: \'sjoerd\'}``, or by the\n``dict`` constructor.\n\nclass class dict(**kwarg)\nclass class dict(mapping, **kwarg)\nclass class dict(iterable, **kwarg)\n\n Return a new dictionary initialized from an optional positional\n argument and a possibly empty set of keyword arguments.\n\n If no positional argument is given, an empty dictionary is created.\n If a positional argument is given and it is a mapping object, a\n dictionary is created with the same key-value pairs as the mapping\n object. Otherwise, the positional argument must be an *iterator*\n object. Each item in the iterable must itself be an iterator with\n exactly two objects. The first object of each item becomes a key\n in the new dictionary, and the second object the corresponding\n value. If a key occurs more than once, the last value for that key\n becomes the corresponding value in the new dictionary.\n\n If keyword arguments are given, the keyword arguments and their\n values are added to the dictionary created from the positional\n argument. If a key being added is already present, the value from\n the keyword argument replaces the value from the positional\n argument.\n\n To illustrate, the following examples all return a dictionary equal\n to ``{"one": 1, "two": 2, "three": 3}``:\n\n >>> a = dict(one=1, two=2, three=3)\n >>> b = {\'one\': 1, \'two\': 2, \'three\': 3}\n >>> c = dict(zip([\'one\', \'two\', \'three\'], [1, 2, 3]))\n >>> d = dict([(\'two\', 2), (\'one\', 1), (\'three\', 3)])\n >>> e = dict({\'three\': 3, \'one\': 1, \'two\': 2})\n >>> a == b == c == d == e\n True\n\n Providing keyword arguments as in the first example only works for\n keys that are valid Python identifiers. Otherwise, any valid keys\n can be used.\n\n These are the operations that dictionaries support (and therefore,\n custom mapping types should support too):\n\n len(d)\n\n Return the number of items in the dictionary *d*.\n\n d[key]\n\n Return the item of *d* with key *key*. Raises a ``KeyError`` if\n *key* is not in the map.\n\n If a subclass of dict defines a method ``__missing__()``, if the\n key *key* is not present, the ``d[key]`` operation calls that\n method with the key *key* as argument. The ``d[key]`` operation\n then returns or raises whatever is returned or raised by the\n ``__missing__(key)`` call if the key is not present. No other\n operations or methods invoke ``__missing__()``. If\n ``__missing__()`` is not defined, ``KeyError`` is raised.\n ``__missing__()`` must be a method; it cannot be an instance\n variable:\n\n >>> class Counter(dict):\n ... def __missing__(self, key):\n ... return 0\n >>> c = Counter()\n >>> c[\'red\']\n 0\n >>> c[\'red\'] += 1\n >>> c[\'red\']\n 1\n\n See ``collections.Counter`` for a complete implementation\n including other methods helpful for accumulating and managing\n tallies.\n\n d[key] = value\n\n Set ``d[key]`` to *value*.\n\n del d[key]\n\n Remove ``d[key]`` from *d*. Raises a ``KeyError`` if *key* is\n not in the map.\n\n key in d\n\n Return ``True`` if *d* has a key *key*, else ``False``.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iter(d.keys())``.\n\n clear()\n\n Remove all items from the dictionary.\n\n copy()\n\n Return a shallow copy of the dictionary.\n\n classmethod fromkeys(seq[, value])\n\n Create a new dictionary with keys from *seq* and values set to\n *value*.\n\n ``fromkeys()`` is a class method that returns a new dictionary.\n *value* defaults to ``None``.\n\n get(key[, default])\n\n Return the value for *key* if *key* is in the dictionary, else\n *default*. If *default* is not given, it defaults to ``None``,\n so that this method never raises a ``KeyError``.\n\n items()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See the *documentation of view objects*.\n\n keys()\n\n Return a new view of the dictionary\'s keys. See the\n *documentation of view objects*.\n\n pop(key[, default])\n\n If *key* is in the dictionary, remove it and return its value,\n else return *default*. If *default* is not given and *key* is\n not in the dictionary, a ``KeyError`` is raised.\n\n popitem()\n\n Remove and return an arbitrary ``(key, value)`` pair from the\n dictionary.\n\n ``popitem()`` is useful to destructively iterate over a\n dictionary, as often used in set algorithms. If the dictionary\n is empty, calling ``popitem()`` raises a ``KeyError``.\n\n setdefault(key[, default])\n\n If *key* is in the dictionary, return its value. If not, insert\n *key* with a value of *default* and return *default*. *default*\n defaults to ``None``.\n\n update([other])\n\n Update the dictionary with the key/value pairs from *other*,\n overwriting existing keys. Return ``None``.\n\n ``update()`` accepts either another dictionary object or an\n iterable of key/value pairs (as tuples or other iterables of\n length two). If keyword arguments are specified, the dictionary\n is then updated with those key/value pairs: ``d.update(red=1,\n blue=2)``.\n\n values()\n\n Return a new view of the dictionary\'s values. See the\n *documentation of view objects*.\n\nSee also:\n\n ``types.MappingProxyType`` can be used to create a read-only view\n of a ``dict``.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.keys()``, ``dict.values()`` and\n``dict.items()`` are *view objects*. They provide a dynamic view on\nthe dictionary\'s entries, which means that when the dictionary\nchanges, the view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n Return the number of entries in the dictionary.\n\niter(dictview)\n\n Return an iterator over the keys, values or items (represented as\n tuples of ``(key, value)``) in the dictionary.\n\n Keys and values are iterated over in an arbitrary order which is\n non-random, varies across Python implementations, and depends on\n the dictionary\'s history of insertions and deletions. If keys,\n values and items views are iterated over with no intervening\n modifications to the dictionary, the order of items will directly\n correspond. This allows the creation of ``(value, key)`` pairs\n using ``zip()``: ``pairs = zip(d.values(), d.keys())``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.items()]``.\n\n Iterating views while adding or deleting entries in the dictionary\n may raise a ``RuntimeError`` or fail to iterate over all entries.\n\nx in dictview\n\n Return ``True`` if *x* is in the underlying dictionary\'s keys,\n values or items (in the latter case, *x* should be a ``(key,\n value)`` tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that ``(key, value)`` pairs are unique\nand hashable, then the items view is also set-like. (Values views are\nnot treated as set-like since the entries are generally not unique.)\nFor set-like views, all of the operations defined for the abstract\nbase class ``collections.abc.Set`` are available (for example, ``==``,\n``<``, or ``^``).\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.keys()\n >>> values = dishes.values()\n\n >>> # iteration\n >>> n = 0\n >>> for val in values:\n ... n += val\n >>> print(n)\n 504\n\n >>> # keys and values are iterated over in the same order\n >>> list(keys)\n [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n >>> list(values)\n [2, 1, 1, 500]\n\n >>> # view objects are dynamic and reflect dict changes\n >>> del dishes[\'eggs\']\n >>> del dishes[\'sausage\']\n >>> list(keys)\n [\'spam\', \'bacon\']\n\n >>> # set operations\n >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n {\'bacon\'}\n >>> keys ^ {\'sausage\', \'juice\'}\n {\'juice\', \'sausage\', \'bacon\', \'spam\'}\n',
'typesmethods': '\nMethods\n*******\n\nMethods are functions that are called using the attribute notation.\nThere are two flavors: built-in methods (such as ``append()`` on\nlists) and class instance methods. Built-in methods are described\nwith the types that support them.\n\nIf you access a method (a function defined in a class namespace)\nthrough an instance, you get a special object: a *bound method* (also\ncalled *instance method*) object. When called, it will add the\n``self`` argument to the argument list. Bound methods have two\nspecial read-only attributes: ``m.__self__`` is the object on which\nthe method operates, and ``m.__func__`` is the function implementing\nthe method. Calling ``m(arg-1, arg-2, ..., arg-n)`` is completely\nequivalent to calling ``m.__func__(m.__self__, arg-1, arg-2, ...,\narg-n)``.\n\nLike function objects, bound method objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.__func__``), setting method\nattributes on bound methods is disallowed. Attempting to set an\nattribute on a method results in an ``AttributeError`` being raised.\nIn order to set a method attribute, you need to explicitly set it on\nthe underlying function object:\n\n >>> class C:\n ... def method(self):\n ... pass\n ...\n >>> c = C()\n >>> c.method.whoami = \'my name is method\' # can\'t set on the method\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n AttributeError: \'method\' object has no attribute \'whoami\'\n >>> c.method.__func__.whoami = \'my name is method\'\n >>> c.method.whoami\n \'my name is method\'\n\nSee *The standard type hierarchy* for more information.\n',
'typesmodules': "\nModules\n*******\n\nThe only special operation on a module is attribute access:\n``m.name``, where *m* is a module and *name* accesses a name defined\nin *m*'s symbol table. Module attributes can be assigned to. (Note\nthat the ``import`` statement is not, strictly speaking, an operation\non a module object; ``import foo`` does not require a module object\nnamed *foo* to exist, rather it requires an (external) *definition*\nfor a module named *foo* somewhere.)\n\nA special attribute of every module is ``__dict__``. This is the\ndictionary containing the module's symbol table. Modifying this\ndictionary will actually change the module's symbol table, but direct\nassignment to the ``__dict__`` attribute is not possible (you can\nwrite ``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but\nyou can't write ``m.__dict__ = {}``). Modifying ``__dict__`` directly\nis not recommended.\n\nModules built into the interpreter are written like this: ``<module\n'sys' (built-in)>``. If loaded from a file, they are written as\n``<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>``.\n",
- 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority). In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+============================+==================================+============+\n| ``x in s`` | ``True`` if an item of *s* is | (1) |\n| | equal to *x*, else ``False`` | |\n+----------------------------+----------------------------------+------------+\n| ``x not in s`` | ``False`` if an item of *s* is | (1) |\n| | equal to *x*, else ``True`` | |\n+----------------------------+----------------------------------+------------+\n| ``s + t`` | the concatenation of *s* and *t* | (6)(7) |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s`` | *n* shallow copies of *s* | (2)(7) |\n| | concatenated | |\n+----------------------------+----------------------------------+------------+\n| ``s[i]`` | *i*th item of *s*, origin 0 | (3) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+----------------------------+----------------------------------+------------+\n| ``len(s)`` | length of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``min(s)`` | smallest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``max(s)`` | largest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])`` | index of the first occurence of | (8) |\n| | *x* in *s* (at or after index | |\n| | *i* and before index *j*) | |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)`` | total number of occurences of | |\n| | *x* in *s* | |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons. In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length. (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n containment testing in the general case, some specialised sequences\n (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n subsequence testing:\n\n >>> "gg" in "eggs"\n True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n empty sequence of the same type as *s*). Note also that the copies\n are shallow; nested structures are not copied. This often haunts\n new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that ``[[]]`` is a one-element list containing\n an empty list, so all three elements of ``[[]] * 3`` are (pointers\n to) this single empty list. Modifying any of the elements of\n ``lists`` modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n string: ``len(s) + i`` or ``len(s) + j`` is substituted. But note\n that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that ``i <= k < j``. If *i* or *j* is\n greater than ``len(s)``, use ``len(s)``. If *i* is omitted or\n ``None``, use ``0``. If *j* is omitted or ``None``, use\n ``len(s)``. If *i* is greater than or equal to *j*, the slice is\n empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index ``x = i + n*k`` such that ``0 <= n <\n (j-i)/k``. In other words, the indices are ``i``, ``i+k``,\n ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n never including *j*). If *i* or *j* is greater than ``len(s)``,\n use ``len(s)``. If *i* or *j* are omitted or ``None``, they become\n "end" values (which end depends on the sign of *k*). Note, *k*\n cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n This means that building up a sequence by repeated concatenation\n will have a quadratic runtime cost in the total sequence length.\n To get a linear runtime cost, you must switch to one of the\n alternatives below:\n\n * if concatenating ``str`` objects, you can build a list and use\n ``str.join()`` at the end or else write to a ``io.StringIO``\n instance and retrieve its value when complete\n\n * if concatenating ``bytes`` objects, you can similarly use\n ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n concatenation with a ``bytearray`` object. ``bytearray`` objects\n are mutable and have an efficient overallocation mechanism\n\n * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n that follow specific patterns, and hence don\'t support sequence\n concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n supported, the additional arguments to the index method allow\n efficient searching of subsections of the sequence. Passing the\n extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n only without copying any data and with the returned index being\n relative to the start of the sequence rather than the start of the\n slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n Lists may be constructed in several ways:\n\n * Using a pair of square brackets to denote the empty list: ``[]``\n\n * Using square brackets, separating items with commas: ``[a]``,\n ``[a, b, c]``\n\n * Using a list comprehension: ``[x for x in iterable]``\n\n * Using the type constructor: ``list()`` or ``list(iterable)``\n\n The constructor builds a list whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a list, a copy is made and\n returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n 2, 3]``. If no argument is given, the constructor creates a new\n empty list, ``[]``.\n\n Many other operations also produce lists, including the\n ``sorted()`` built-in.\n\n Lists implement all of the *common* and *mutable* sequence\n operations. Lists also provide the following additional method:\n\n sort(*, key=None, reverse=None)\n\n This method sorts the list in place, using only ``<``\n comparisons between items. Exceptions are not suppressed - if\n any comparison operations fail, the entire sort operation will\n fail (and the list will likely be left in a partially modified\n state).\n\n *key* specifies a function of one argument that is used to\n extract a comparison key from each list element (for example,\n ``key=str.lower``). The key corresponding to each item in the\n list is calculated once and then used for the entire sorting\n process. The default value of ``None`` means that list items are\n sorted directly without calculating a separate key value.\n\n The ``functools.cmp_to_key()`` utility is available to convert a\n 2.x style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n This method modifies the sequence in place for economy of space\n when sorting a large sequence. To remind users that it operates\n by side effect, it does not return the sorted sequence (use\n ``sorted()`` to explicitly request a new sorted list instance).\n\n The ``sort()`` method is guaranteed to be stable. A sort is\n stable if it guarantees not to change the relative order of\n elements that compare equal --- this is helpful for sorting in\n multiple passes (for example, sort by department, then by salary\n grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can\n detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n Tuples may be constructed in a number of ways:\n\n * Using a pair of parentheses to denote the empty tuple: ``()``\n\n * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n * Using the ``tuple()`` built-in: ``tuple()`` or\n ``tuple(iterable)``\n\n The constructor builds a tuple whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a tuple, it is returned\n unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n argument is given, the constructor creates a new empty tuple,\n ``()``.\n\n Note that it is actually the comma which makes a tuple, not the\n parentheses. The parentheses are optional, except in the empty\n tuple case, or when they are needed to avoid syntactic ambiguity.\n For example, ``f(a, b, c)`` is a function call with three\n arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n as the sole argument.\n\n Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n The arguments to the range constructor must be integers (either\n built-in ``int`` or any object that implements the ``__index__``\n special method). If the *step* argument is omitted, it defaults to\n ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n *step* is zero, ``ValueError`` is raised.\n\n For a positive *step*, the contents of a range ``r`` are determined\n by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n ``r[i] < stop``.\n\n For a negative *step*, the contents of the range are still\n determined by the formula ``r[i] = start + step*i``, but the\n constraints are ``i >= 0`` and ``r[i] > stop``.\n\n A range object will be empty if ``r[0]`` does not meet the value\n constraint. Ranges do support negative indices, but these are\n interpreted as indexing from the end of the sequence determined by\n the positive indices.\n\n Ranges containing absolute values larger than ``sys.maxsize`` are\n permitted but some features (such as ``len()``) may raise\n ``OverflowError``.\n\n Range examples:\n\n >>> list(range(10))\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n >>> list(range(1, 11))\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n >>> list(range(0, 30, 5))\n [0, 5, 10, 15, 20, 25]\n >>> list(range(0, 10, 3))\n [0, 3, 6, 9]\n >>> list(range(0, -10, -1))\n [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n >>> list(range(0))\n []\n >>> list(range(1, 0))\n []\n\n Ranges implement all of the *common* sequence operations except\n concatenation and repetition (due to the fact that range objects\n can only represent sequences that follow a strict pattern and\n repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.Sequence`` ABC, and provide\nfeatures such as containment tests, element index lookup, slicing and\nsupport for negative indices (see *Sequence Types --- list, tuple,\nrange*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences. That is, two range objects are considered equal if\nthey represent the same sequence of values. (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n',
+ 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority). In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+============================+==================================+============+\n| ``x in s`` | ``True`` if an item of *s* is | (1) |\n| | equal to *x*, else ``False`` | |\n+----------------------------+----------------------------------+------------+\n| ``x not in s`` | ``False`` if an item of *s* is | (1) |\n| | equal to *x*, else ``True`` | |\n+----------------------------+----------------------------------+------------+\n| ``s + t`` | the concatenation of *s* and *t* | (6)(7) |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s`` | *n* shallow copies of *s* | (2)(7) |\n| | concatenated | |\n+----------------------------+----------------------------------+------------+\n| ``s[i]`` | *i*th item of *s*, origin 0 | (3) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+----------------------------+----------------------------------+------------+\n| ``len(s)`` | length of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``min(s)`` | smallest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``max(s)`` | largest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])`` | index of the first occurrence of | (8) |\n| | *x* in *s* (at or after index | |\n| | *i* and before index *j*) | |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)`` | total number of occurrences of | |\n| | *x* in *s* | |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons. In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length. (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n containment testing in the general case, some specialised sequences\n (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n subsequence testing:\n\n >>> "gg" in "eggs"\n True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n empty sequence of the same type as *s*). Note also that the copies\n are shallow; nested structures are not copied. This often haunts\n new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that ``[[]]`` is a one-element list containing\n an empty list, so all three elements of ``[[]] * 3`` are (pointers\n to) this single empty list. Modifying any of the elements of\n ``lists`` modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n string: ``len(s) + i`` or ``len(s) + j`` is substituted. But note\n that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that ``i <= k < j``. If *i* or *j* is\n greater than ``len(s)``, use ``len(s)``. If *i* is omitted or\n ``None``, use ``0``. If *j* is omitted or ``None``, use\n ``len(s)``. If *i* is greater than or equal to *j*, the slice is\n empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index ``x = i + n*k`` such that ``0 <= n <\n (j-i)/k``. In other words, the indices are ``i``, ``i+k``,\n ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n never including *j*). If *i* or *j* is greater than ``len(s)``,\n use ``len(s)``. If *i* or *j* are omitted or ``None``, they become\n "end" values (which end depends on the sign of *k*). Note, *k*\n cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n This means that building up a sequence by repeated concatenation\n will have a quadratic runtime cost in the total sequence length.\n To get a linear runtime cost, you must switch to one of the\n alternatives below:\n\n * if concatenating ``str`` objects, you can build a list and use\n ``str.join()`` at the end or else write to a ``io.StringIO``\n instance and retrieve its value when complete\n\n * if concatenating ``bytes`` objects, you can similarly use\n ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n concatenation with a ``bytearray`` object. ``bytearray`` objects\n are mutable and have an efficient overallocation mechanism\n\n * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n that follow specific patterns, and hence don\'t support sequence\n concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n supported, the additional arguments to the index method allow\n efficient searching of subsections of the sequence. Passing the\n extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n only without copying any data and with the returned index being\n relative to the start of the sequence rather than the start of the\n slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n Lists may be constructed in several ways:\n\n * Using a pair of square brackets to denote the empty list: ``[]``\n\n * Using square brackets, separating items with commas: ``[a]``,\n ``[a, b, c]``\n\n * Using a list comprehension: ``[x for x in iterable]``\n\n * Using the type constructor: ``list()`` or ``list(iterable)``\n\n The constructor builds a list whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a list, a copy is made and\n returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n 2, 3]``. If no argument is given, the constructor creates a new\n empty list, ``[]``.\n\n Many other operations also produce lists, including the\n ``sorted()`` built-in.\n\n Lists implement all of the *common* and *mutable* sequence\n operations. Lists also provide the following additional method:\n\n sort(*, key=None, reverse=None)\n\n This method sorts the list in place, using only ``<``\n comparisons between items. Exceptions are not suppressed - if\n any comparison operations fail, the entire sort operation will\n fail (and the list will likely be left in a partially modified\n state).\n\n *key* specifies a function of one argument that is used to\n extract a comparison key from each list element (for example,\n ``key=str.lower``). The key corresponding to each item in the\n list is calculated once and then used for the entire sorting\n process. The default value of ``None`` means that list items are\n sorted directly without calculating a separate key value.\n\n The ``functools.cmp_to_key()`` utility is available to convert a\n 2.x style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n This method modifies the sequence in place for economy of space\n when sorting a large sequence. To remind users that it operates\n by side effect, it does not return the sorted sequence (use\n ``sorted()`` to explicitly request a new sorted list instance).\n\n The ``sort()`` method is guaranteed to be stable. A sort is\n stable if it guarantees not to change the relative order of\n elements that compare equal --- this is helpful for sorting in\n multiple passes (for example, sort by department, then by salary\n grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can\n detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n Tuples may be constructed in a number of ways:\n\n * Using a pair of parentheses to denote the empty tuple: ``()``\n\n * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n * Using the ``tuple()`` built-in: ``tuple()`` or\n ``tuple(iterable)``\n\n The constructor builds a tuple whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a tuple, it is returned\n unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n argument is given, the constructor creates a new empty tuple,\n ``()``.\n\n Note that it is actually the comma which makes a tuple, not the\n parentheses. The parentheses are optional, except in the empty\n tuple case, or when they are needed to avoid syntactic ambiguity.\n For example, ``f(a, b, c)`` is a function call with three\n arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n as the sole argument.\n\n Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n The arguments to the range constructor must be integers (either\n built-in ``int`` or any object that implements the ``__index__``\n special method). If the *step* argument is omitted, it defaults to\n ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n *step* is zero, ``ValueError`` is raised.\n\n For a positive *step*, the contents of a range ``r`` are determined\n by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n ``r[i] < stop``.\n\n For a negative *step*, the contents of the range are still\n determined by the formula ``r[i] = start + step*i``, but the\n constraints are ``i >= 0`` and ``r[i] > stop``.\n\n A range object will be empty if ``r[0]`` does not meet the value\n constraint. Ranges do support negative indices, but these are\n interpreted as indexing from the end of the sequence determined by\n the positive indices.\n\n Ranges containing absolute values larger than ``sys.maxsize`` are\n permitted but some features (such as ``len()``) may raise\n ``OverflowError``.\n\n Range examples:\n\n >>> list(range(10))\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n >>> list(range(1, 11))\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n >>> list(range(0, 30, 5))\n [0, 5, 10, 15, 20, 25]\n >>> list(range(0, 10, 3))\n [0, 3, 6, 9]\n >>> list(range(0, -10, -1))\n [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n >>> list(range(0))\n []\n >>> list(range(1, 0))\n []\n\n Ranges implement all of the *common* sequence operations except\n concatenation and repetition (due to the fact that range objects\n can only represent sequences that follow a strict pattern and\n repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.Sequence`` ABC, and provide\nfeatures such as containment tests, element index lookup, slicing and\nsupport for negative indices (see *Sequence Types --- list, tuple,\nrange*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences. That is, two range objects are considered equal if\nthey represent the same sequence of values. (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n',
'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don't support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n",
'unary': '\nUnary arithmetic and bitwise operations\n***************************************\n\nAll unary arithmetic and bitwise operations have the same priority:\n\n u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n\nThe unary ``-`` (minus) operator yields the negation of its numeric\nargument.\n\nThe unary ``+`` (plus) operator yields its numeric argument unchanged.\n\nThe unary ``~`` (invert) operator yields the bitwise inversion of its\ninteger argument. The bitwise inversion of ``x`` is defined as\n``-(x+1)``. It only applies to integral numbers.\n\nIn all three cases, if the argument does not have the proper type, a\n``TypeError`` exception is raised.\n',
'while': '\nThe ``while`` statement\n***********************\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n',
diff --git a/Lib/quopri.py b/Lib/quopri.py
index 3d0f0ac..e5bd010 100755
--- a/Lib/quopri.py
+++ b/Lib/quopri.py
@@ -223,7 +223,7 @@ def main():
else:
try:
fp = open(file, "rb")
- except IOError as msg:
+ except OSError as msg:
sys.stderr.write("%s: can't open (%s)\n" % (file, msg))
sts = 1
continue
diff --git a/Lib/random.py b/Lib/random.py
index 7d8d4f3..b183f56 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -151,6 +151,9 @@ class Random(_random.Random):
## -------------------- pickle support -------------------
+ # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
+ # longer called; we leave it here because it has been here since random was
+ # rewritten back in 2001 and why risk breaking something.
def __getstate__(self): # for pickle
return self.getstate()
@@ -252,10 +255,11 @@ class Random(_random.Random):
return seq[i]
def shuffle(self, x, random=None, int=int):
- """x, random=random.random -> shuffle list x in place; return None.
+ """Shuffle list x in place, and return None.
- Optional arg random is a 0-argument function returning a random
- float in [0.0, 1.0); by default, the standard random.random.
+ Optional argument random is a 0-argument function returning a
+ random float in [0.0, 1.0); if it is the default None, the
+ standard random.random will be used.
"""
randbelow = self._randbelow
diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py
index 3f97053..94f9341 100644
--- a/Lib/rlcompleter.py
+++ b/Lib/rlcompleter.py
@@ -29,6 +29,7 @@ Notes:
"""
+import atexit
import builtins
import __main__
@@ -158,3 +159,7 @@ except ImportError:
pass
else:
readline.set_completer(Completer().complete)
+ # Release references early at shutdown (the readline module's
+ # contents are quasi-immortal, and the completer function holds a
+ # reference to globals).
+ atexit.register(lambda: readline.set_completer(None))
diff --git a/Lib/runpy.py b/Lib/runpy.py
index 39c0e9f..1e0a2be 100644
--- a/Lib/runpy.py
+++ b/Lib/runpy.py
@@ -13,7 +13,7 @@ importers when locating support scripts as well as when importing modules.
import os
import sys
import importlib.machinery # importlib first so we can test #15386 via -m
-import imp
+import types
from pkgutil import read_code, get_loader, get_importer
__all__ = [
@@ -24,7 +24,7 @@ class _TempModule(object):
"""Temporarily replace a module in sys.modules with an empty namespace"""
def __init__(self, mod_name):
self.mod_name = mod_name
- self.module = imp.new_module(mod_name)
+ self.module = types.ModuleType(mod_name)
self._saved_module = []
def __enter__(self):
@@ -223,7 +223,12 @@ def run_path(path_name, init_globals=None, run_name=None):
run_name = "<run_path>"
pkg_name = run_name.rpartition(".")[0]
importer = get_importer(path_name)
- if isinstance(importer, (type(None), imp.NullImporter)):
+ # Trying to avoid importing imp so as to not consume the deprecation warning.
+ is_NullImporter = False
+ if type(importer).__module__ == 'imp':
+ if type(importer).__name__ == 'NullImporter':
+ is_NullImporter = True
+ if isinstance(importer, type(None)) or is_NullImporter:
# Not a valid sys.path entry, so run the code directly
# execfile() doesn't help as we want to allow compiled files
code, mod_loader = _get_code_from_file(run_name, path_name)
diff --git a/Lib/sched.py b/Lib/sched.py
index b9a7ad1..2e6b00a 100644
--- a/Lib/sched.py
+++ b/Lib/sched.py
@@ -71,10 +71,10 @@ class scheduler:
"""
if kwargs is _sentinel:
kwargs = {}
+ event = Event(time, priority, action, argument, kwargs)
with self._lock:
- event = Event(time, priority, action, argument, kwargs)
heapq.heappush(self._queue, event)
- return event # The ID
+ return event # The ID
def enter(self, delay, priority, action, argument=(), kwargs=_sentinel):
"""A variant that specifies the time as a relative time.
@@ -82,9 +82,8 @@ class scheduler:
This is actually the more commonly used interface.
"""
- with self._lock:
- time = self.timefunc() + delay
- return self.enterabs(time, priority, action, argument, kwargs)
+ time = self.timefunc() + delay
+ return self.enterabs(time, priority, action, argument, kwargs)
def cancel(self, event):
"""Remove an event from the queue.
@@ -165,4 +164,4 @@ class scheduler:
# the actual order they would be retrieved.
with self._lock:
events = self._queue[:]
- return list(map(heapq.heappop, [events]*len(events)))
+ return list(map(heapq.heappop, [events]*len(events)))
diff --git a/Lib/shelve.py b/Lib/shelve.py
index cc1815e..cef580e 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -61,7 +61,7 @@ from io import BytesIO
import collections
-__all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"]
+__all__ = ["Shelf", "BsdDbShelf", "DbfilenameShelf", "open"]
class _ClosedDict(collections.MutableMapping):
'Marker for a closed dict. Access attempts raise a ValueError.'
@@ -131,6 +131,12 @@ class Shelf(collections.MutableMapping):
except KeyError:
pass
+ def __enter__(self):
+ return self
+
+ def __exit__(self, type, value, traceback):
+ self.close()
+
def close(self):
self.sync()
try:
@@ -147,6 +153,7 @@ class Shelf(collections.MutableMapping):
def __del__(self):
if not hasattr(self, 'writeback'):
# __init__ didn't succeed, so don't bother closing
+ # see http://bugs.python.org/issue1339007 for details
return
self.close()
diff --git a/Lib/shutil.py b/Lib/shutil.py
index a5b2d24..502bb67 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -39,17 +39,20 @@ __all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
"ignore_patterns", "chown", "which"]
# disk_usage is added later, if available on the platform
-class Error(EnvironmentError):
+class Error(OSError):
pass
-class SpecialFileError(EnvironmentError):
+class SameFileError(Error):
+ """Raised when source and destination are the same file."""
+
+class SpecialFileError(OSError):
"""Raised when trying to do a kind of operation (e.g. copying) which is
not supported on a special file (e.g. a named pipe)"""
-class ExecError(EnvironmentError):
+class ExecError(OSError):
"""Raised when a command could not be executed"""
-class ReadError(EnvironmentError):
+class ReadError(OSError):
"""Raised when an archive cannot be read"""
class RegistryError(Exception):
@@ -57,11 +60,6 @@ class RegistryError(Exception):
and unpacking registeries fails"""
-try:
- WindowsError
-except NameError:
- WindowsError = None
-
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
@@ -90,7 +88,7 @@ def copyfile(src, dst, *, follow_symlinks=True):
"""
if _samefile(src, dst):
- raise Error("`%s` and `%s` are the same file" % (src, dst))
+ raise SameFileError("{!r} and {!r} are the same file".format(src, dst))
for fn in [src, dst]:
try:
@@ -221,6 +219,9 @@ def copy(src, dst, *, follow_symlinks=True):
If follow_symlinks is false, symlinks won't be followed. This
resembles GNU's "cp -P src dst".
+ If source and destination are the same file, a SameFileError will be
+ raised.
+
"""
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
@@ -329,15 +330,13 @@ def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
# continue with other files
except Error as err:
errors.extend(err.args[0])
- except EnvironmentError as why:
+ except OSError as why:
errors.append((srcname, dstname, str(why)))
try:
copystat(src, dst)
except OSError as why:
- if WindowsError is not None and isinstance(why, WindowsError):
- # Copying file access times may fail on Windows
- pass
- else:
+ # Copying file access times may fail on Windows
+ if why.winerror is None:
errors.append((src, dst, str(why)))
if errors:
raise Error(errors)
@@ -356,24 +355,24 @@ def _rmtree_unsafe(path, onerror):
names = []
try:
names = os.listdir(path)
- except os.error:
+ except OSError:
onerror(os.listdir, path, sys.exc_info())
for name in names:
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
- except os.error:
+ except OSError:
mode = 0
if stat.S_ISDIR(mode):
_rmtree_unsafe(fullname, onerror)
else:
try:
os.unlink(fullname)
- except os.error:
+ except OSError:
onerror(os.unlink, fullname, sys.exc_info())
try:
os.rmdir(path)
- except os.error:
+ except OSError:
onerror(os.rmdir, path, sys.exc_info())
# Version using fd-based APIs to protect against races
@@ -464,7 +463,7 @@ def rmtree(path, ignore_errors=False, onerror=None):
_rmtree_safe_fd(fd, path, onerror)
try:
os.rmdir(path)
- except os.error:
+ except OSError:
onerror(os.rmdir, path, sys.exc_info())
else:
try:
diff --git a/Lib/site.py b/Lib/site.py
index 13e7336..77d198a 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -58,17 +58,21 @@ Note that bletch is omitted because it doesn't exist; bar precedes foo
because bar.pth comes alphabetically before foo.pth; and spam is
omitted because it is not mentioned in either path configuration file.
-After these path manipulations, an attempt is made to import a module
+The readline module is also automatically configured to enable
+completion for systems that support it. This can be overriden in
+sitecustomize, usercustomize or PYTHONSTARTUP.
+
+After these operations, an attempt is made to import a module
named sitecustomize, which can perform arbitrary additional
site-specific customizations. If this import fails with an
ImportError exception, it is silently ignored.
-
"""
import sys
import os
import re
import builtins
+import _sitebuiltins
# Prefixes for site-packages; add additional prefixes like /usr/local here
PREFIXES = [sys.prefix, sys.exec_prefix]
@@ -146,14 +150,14 @@ def addpackage(sitedir, name, known_paths):
and add that to known_paths, or execute it if it starts with 'import '.
"""
if known_paths is None:
- _init_pathinfo()
+ known_paths = _init_pathinfo()
reset = 1
else:
reset = 0
fullname = os.path.join(sitedir, name)
try:
f = open(fullname, "r")
- except IOError:
+ except OSError:
return
with f:
for n, line in enumerate(f):
@@ -196,7 +200,7 @@ def addsitedir(sitedir, known_paths=None):
known_paths.add(sitedircase)
try:
names = os.listdir(sitedir)
- except os.error:
+ except OSError:
return
names = [name for name in names if name.endswith(".pth")]
for name in sorted(names):
@@ -300,9 +304,7 @@ def getsitepackages(prefixes=None):
continue
seen.add(prefix)
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
- elif os.sep == '/':
+ if os.sep == '/':
sitepackages.append(os.path.join(prefix, "lib",
"python" + sys.version[:3],
"site-packages"))
@@ -329,23 +331,6 @@ def addsitepackages(known_paths, prefixes=None):
return known_paths
-def setBEGINLIBPATH():
- """The OS/2 EMX port has optional extension modules that do double duty
- as DLLs (and must use the .DLL file extension) for other extensions.
- The library search path needs to be amended so these will be found
- during module import. Use BEGINLIBPATH so that these are at the start
- of the library search path.
-
- """
- dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
- libpath = os.environ['BEGINLIBPATH'].split(';')
- if libpath[-1]:
- libpath.append(dllpath)
- else:
- libpath[-1] = dllpath
- os.environ['BEGINLIBPATH'] = ';'.join(libpath)
-
-
def setquit():
"""Define new builtins 'quit' and 'exit'.
@@ -360,117 +345,72 @@ def setquit():
else:
eof = 'Ctrl-D (i.e. EOF)'
- class Quitter(object):
- def __init__(self, name):
- self.name = name
- def __repr__(self):
- return 'Use %s() or %s to exit' % (self.name, eof)
- def __call__(self, code=None):
- # Shells like IDLE catch the SystemExit, but listen when their
- # stdin wrapper is closed.
- try:
- sys.stdin.close()
- except:
- pass
- raise SystemExit(code)
- builtins.quit = Quitter('quit')
- builtins.exit = Quitter('exit')
-
-
-class _Printer(object):
- """interactive prompt objects for printing the license text, a list of
- contributors and the copyright notice."""
+ builtins.quit = _sitebuiltins.Quitter('quit', eof)
+ builtins.exit = _sitebuiltins.Quitter('exit', eof)
- MAXLINES = 23
-
- def __init__(self, name, data, files=(), dirs=()):
- self.__name = name
- self.__data = data
- self.__files = files
- self.__dirs = dirs
- self.__lines = None
-
- def __setup(self):
- if self.__lines:
- return
- data = None
- for dir in self.__dirs:
- for filename in self.__files:
- filename = os.path.join(dir, filename)
- try:
- fp = open(filename, "r")
- data = fp.read()
- fp.close()
- break
- except IOError:
- pass
- if data:
- break
- if not data:
- data = self.__data
- self.__lines = data.split('\n')
- self.__linecnt = len(self.__lines)
-
- def __repr__(self):
- self.__setup()
- if len(self.__lines) <= self.MAXLINES:
- return "\n".join(self.__lines)
- else:
- return "Type %s() to see the full %s text" % ((self.__name,)*2)
-
- def __call__(self):
- self.__setup()
- prompt = 'Hit Return for more, or q (and Return) to quit: '
- lineno = 0
- while 1:
- try:
- for i in range(lineno, lineno + self.MAXLINES):
- print(self.__lines[i])
- except IndexError:
- break
- else:
- lineno += self.MAXLINES
- key = None
- while key is None:
- key = input(prompt)
- if key not in ('', 'q'):
- key = None
- if key == 'q':
- break
def setcopyright():
"""Set 'copyright' and 'credits' in builtins"""
- builtins.copyright = _Printer("copyright", sys.copyright)
+ builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright)
if sys.platform[:4] == 'java':
- builtins.credits = _Printer(
+ builtins.credits = _sitebuiltins._Printer(
"credits",
"Jython is maintained by the Jython developers (www.jython.org).")
else:
- builtins.credits = _Printer("credits", """\
+ builtins.credits = _sitebuiltins._Printer("credits", """\
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
for supporting Python development. See www.python.org for more information.""")
here = os.path.dirname(os.__file__)
- builtins.license = _Printer(
+ builtins.license = _sitebuiltins._Printer(
"license", "See http://www.python.org/%.3s/license.html" % sys.version,
["LICENSE.txt", "LICENSE"],
[os.path.join(here, os.pardir), here, os.curdir])
-class _Helper(object):
- """Define the builtin 'help'.
- This is a wrapper around pydoc.help (with a twist).
+def sethelper():
+ builtins.help = _sitebuiltins._Helper()
+
+def enablerlcompleter():
+ """Enable default readline configuration on interactive prompts, by
+ registering a sys.__interactivehook__.
+ If the readline module can be imported, the hook will set the Tab key
+ as completion key and register ~/.python_history as history file.
+ This can be overriden in the sitecustomize or usercustomize module,
+ or in a PYTHONSTARTUP file.
"""
+ def register_readline():
+ import atexit
+ try:
+ import readline
+ import rlcompleter
+ except ImportError:
+ return
- def __repr__(self):
- return "Type help() for interactive help, " \
- "or help(object) for help about object."
- def __call__(self, *args, **kwds):
- import pydoc
- return pydoc.help(*args, **kwds)
+ # Reading the initialization (config) file may not be enough to set a
+ # completion key, so we set one first and then read the file
+ if 'libedit' in getattr(readline, '__doc__', ''):
+ readline.parse_and_bind('bind ^I rl_complete')
+ else:
+ readline.parse_and_bind('tab: complete')
-def sethelper():
- builtins.help = _Helper()
+ try:
+ readline.read_init_file()
+ except OSError:
+ # An OSError here could have many causes, but the most likely one
+ # is that there's no .inputrc file (or .editrc file in the case of
+ # Mac OS X + libedit) in the expected location. In that case, we
+ # want to ignore the exception.
+ pass
+
+ history = os.path.join(os.path.expanduser('~'), '.python_history')
+ try:
+ readline.read_history_file(history)
+ except IOError:
+ pass
+ atexit.register(readline.write_history_file, history)
+
+ sys.__interactivehook__ = register_readline
def aliasmbcs():
"""On Windows, some default encodings are not provided by Python,
@@ -588,11 +528,10 @@ def main():
ENABLE_USER_SITE = check_enableusersite()
known_paths = addusersitepackages(known_paths)
known_paths = addsitepackages(known_paths)
- if sys.platform == 'os2emx':
- setBEGINLIBPATH()
setquit()
setcopyright()
sethelper()
+ enablerlcompleter()
aliasmbcs()
execsitecustomize()
if ENABLE_USER_SITE:
diff --git a/Lib/smtpd.py b/Lib/smtpd.py
index 778d6d6..f28036a 100755
--- a/Lib/smtpd.py
+++ b/Lib/smtpd.py
@@ -121,8 +121,9 @@ class SMTPChannel(asynchat.async_chat):
})
max_command_size_limit = max(command_size_limits.values())
- def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT):
- asynchat.async_chat.__init__(self, conn)
+ def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT,
+ map=None):
+ asynchat.async_chat.__init__(self, conn, map=map)
self.smtp_server = server
self.conn = conn
self.addr = addr
@@ -137,7 +138,7 @@ class SMTPChannel(asynchat.async_chat):
self.num_bytes = 0
try:
self.peer = conn.getpeername()
- except socket.error as err:
+ except OSError as err:
# a race condition may occur if the other end is closing
# before we can get the peername
self.close()
@@ -576,11 +577,11 @@ class SMTPServer(asyncore.dispatcher):
channel_class = SMTPChannel
def __init__(self, localaddr, remoteaddr,
- data_size_limit=DATA_SIZE_DEFAULT):
+ data_size_limit=DATA_SIZE_DEFAULT, map=None):
self._localaddr = localaddr
self._remoteaddr = remoteaddr
self.data_size_limit = data_size_limit
- asyncore.dispatcher.__init__(self)
+ asyncore.dispatcher.__init__(self, map=map)
try:
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
# try to re-use a server port if possible
@@ -597,7 +598,8 @@ class SMTPServer(asyncore.dispatcher):
def handle_accepted(self, conn, addr):
print('Incoming connection from %s' % repr(addr), file=DEBUGSTREAM)
- channel = self.channel_class(self, conn, addr, self.data_size_limit)
+ channel = self.channel_class(self, conn, addr, self.data_size_limit,
+ self._map)
# API for "doing something useful with the message"
def process_message(self, peer, mailfrom, rcpttos, data):
@@ -668,7 +670,7 @@ class PureProxy(SMTPServer):
except smtplib.SMTPRecipientsRefused as e:
print('got SMTPRecipientsRefused', file=DEBUGSTREAM)
refused = e.recipients
- except (socket.error, smtplib.SMTPException) as e:
+ except (OSError, smtplib.SMTPException) as e:
print('got', e.__class__, file=DEBUGSTREAM)
# All recipients were refused. If the exception had an associated
# error code, use it. Otherwise,fake it with a non-triggering
@@ -850,8 +852,7 @@ if __name__ == '__main__':
nobody = pwd.getpwnam('nobody')[2]
try:
os.setuid(nobody)
- except OSError as e:
- if e.errno != errno.EPERM: raise
+ except PermissionError:
print('Cannot setuid "nobody"; try running with -n option.', file=sys.stderr)
sys.exit(1)
try:
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index 072b973..e1a32ed 100644
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -66,7 +66,7 @@ bCRLF = b"\r\n"
OLDSTYLE_AUTH = re.compile(r"auth=(.*)", re.I)
# Exception classes used by this module.
-class SMTPException(Exception):
+class SMTPException(OSError):
"""Base class for all exceptions raised by this module."""
class SMTPServerDisconnected(SMTPException):
@@ -311,7 +311,7 @@ class SMTP:
try:
port = int(port)
except ValueError:
- raise socket.error("nonnumeric port")
+ raise OSError("nonnumeric port")
if not port:
port = self.default_port
if self.debuglevel > 0:
@@ -332,7 +332,7 @@ class SMTP:
s = s.encode("ascii")
try:
self.sock.sendall(s)
- except socket.error:
+ except OSError:
self.close()
raise SMTPServerDisconnected('Server not connected')
else:
@@ -365,7 +365,7 @@ class SMTP:
while 1:
try:
line = self.file.readline()
- except socket.error as e:
+ except OSError as e:
self.close()
raise SMTPServerDisconnected("Connection unexpectedly closed: "
+ str(e))
@@ -934,7 +934,7 @@ class LMTP(SMTP):
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.file = None
self.sock.connect(host)
- except socket.error:
+ except OSError:
if self.debuglevel > 0:
print('connect fail:', host, file=stderr)
if self.sock:
diff --git a/Lib/sndhdr.py b/Lib/sndhdr.py
index 9f5dcc9..240e507 100644
--- a/Lib/sndhdr.py
+++ b/Lib/sndhdr.py
@@ -11,7 +11,7 @@ The return tuple contains the following items, in this order:
- number of bits/sample, or 'U' for U-LAW, or 'A' for A-LAW
If the file doesn't have a recognizable type, it returns None.
-If the file can't be opened, IOError is raised.
+If the file can't be opened, OSError is raised.
To compute the total time, divide the number of frames by the
sampling rate (a frame contains a sample for each channel).
@@ -137,14 +137,17 @@ tests.append(test_voc)
def test_wav(h, f):
+ import wave
# 'RIFF' <len> 'WAVE' 'fmt ' <len>
if not h.startswith(b'RIFF') or h[8:12] != b'WAVE' or h[12:16] != b'fmt ':
return None
- style = get_short_le(h[20:22])
- nchannels = get_short_le(h[22:24])
- rate = get_long_le(h[24:28])
- sample_bits = get_short_le(h[34:36])
- return 'wav', rate, nchannels, -1, sample_bits
+ f.seek(0)
+ try:
+ w = wave.openfp(f, 'r')
+ except (EOFError, wave.Error):
+ return None
+ return ('wav', w.getframerate(), w.getnchannels(),
+ w.getnframes(), 8*w.getsampwidth())
tests.append(test_wav)
@@ -230,7 +233,7 @@ def testall(list, recursive, toplevel):
sys.stdout.flush()
try:
print(what(filename))
- except IOError:
+ except OSError:
print('*** not found ***')
if __name__ == '__main__':
diff --git a/Lib/socket.py b/Lib/socket.py
index d4f1b65..96f8ed0 100644
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -103,13 +103,32 @@ class socket(_socket.socket):
self.close()
def __repr__(self):
- """Wrap __repr__() to reveal the real class name."""
- s = _socket.socket.__repr__(self)
- if s.startswith("<socket object"):
- s = "<%s.%s%s%s" % (self.__class__.__module__,
- self.__class__.__name__,
- getattr(self, '_closed', False) and " [closed] " or "",
- s[7:])
+ """Wrap __repr__() to reveal the real class name and socket
+ address(es).
+ """
+ closed = getattr(self, '_closed', False)
+ s = "<%s.%s%s fd=%i, family=%i, type=%i, proto=%i" \
+ % (self.__class__.__module__,
+ self.__class__.__name__,
+ " [closed]" if closed else "",
+ self.fileno(),
+ self.family,
+ self.type,
+ self.proto)
+ if not closed:
+ try:
+ laddr = self.getsockname()
+ if laddr:
+ s += ", laddr=%s" % str(laddr)
+ except error:
+ pass
+ try:
+ raddr = self.getpeername()
+ if raddr:
+ s += ", raddr=%s" % str(raddr)
+ except error:
+ pass
+ s += '>'
return s
def __getstate__(self):
@@ -291,7 +310,7 @@ class SocketIO(io.RawIOBase):
self._checkClosed()
self._checkReadable()
if self._timeout_occurred:
- raise IOError("cannot read from timed out object")
+ raise OSError("cannot read from timed out object")
while True:
try:
return self._sock.recv_into(b)
diff --git a/Lib/socketserver.py b/Lib/socketserver.py
index 8332fdf..e9e4e4e 100644
--- a/Lib/socketserver.py
+++ b/Lib/socketserver.py
@@ -299,7 +299,7 @@ class BaseServer:
"""
try:
request, client_address = self.get_request()
- except socket.error:
+ except OSError:
return
if self.verify_request(request, client_address):
try:
@@ -479,7 +479,7 @@ class TCPServer(BaseServer):
#explicitly shutdown. socket.close() merely releases
#the socket and waits for GC to perform the actual close.
request.shutdown(socket.SHUT_WR)
- except socket.error:
+ except OSError:
pass #some platforms may raise ENOTCONN here
self.close_request(request)
@@ -532,7 +532,7 @@ class ForkingMixIn:
# children.
try:
pid, status = os.waitpid(0, 0)
- except os.error:
+ except OSError:
pid = None
if pid not in self.active_children: continue
self.active_children.remove(pid)
@@ -545,7 +545,7 @@ class ForkingMixIn:
for child in self.active_children:
try:
pid, status = os.waitpid(child, os.WNOHANG)
- except os.error:
+ except OSError:
pid = None
if not pid: continue
try:
diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py
index b7ec1ad..04649fc 100644
--- a/Lib/sqlite3/test/dbapi.py
+++ b/Lib/sqlite3/test/dbapi.py
@@ -28,6 +28,9 @@ try:
except ImportError:
threading = None
+from test.support import TESTFN, unlink
+
+
class ModuleTests(unittest.TestCase):
def CheckAPILevel(self):
self.assertEqual(sqlite.apilevel, "2.0",
@@ -163,6 +166,21 @@ class ConnectionTests(unittest.TestCase):
with self.assertRaises(AttributeError):
self.cx.in_transaction = True
+ def CheckOpenUri(self):
+ if sqlite.sqlite_version_info < (3, 7, 7):
+ with self.assertRaises(sqlite.NotSupportedError):
+ sqlite.connect(':memory:', uri=True)
+ return
+ self.addCleanup(unlink, TESTFN)
+ with sqlite.connect(TESTFN) as cx:
+ cx.execute('create table test(id integer)')
+ with sqlite.connect('file:' + TESTFN, uri=True) as cx:
+ cx.execute('insert into test(id) values(0)')
+ with sqlite.connect('file:' + TESTFN + '?mode=ro', uri=True) as cx:
+ with self.assertRaises(sqlite.OperationalError):
+ cx.execute('insert into test(id) values(1)')
+
+
class CursorTests(unittest.TestCase):
def setUp(self):
self.cx = sqlite.connect(":memory:")
diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
index 9f59c77..d6dc60c 100644
--- a/Lib/sre_compile.py
+++ b/Lib/sre_compile.py
@@ -65,13 +65,6 @@ def _compile(code, pattern, flags):
elif op in REPEATING_CODES:
if flags & SRE_FLAG_TEMPLATE:
raise error("internal: unsupported template operator")
- emit(OPCODES[REPEAT])
- skip = _len(code); emit(0)
- emit(av[0])
- emit(av[1])
- _compile(code, av[2], flags)
- emit(OPCODES[SUCCESS])
- code[skip] = _len(code) - skip
elif _simple(av) and op is not REPEAT:
if op is MAX_REPEAT:
emit(OPCODES[REPEAT_ONE])
diff --git a/Lib/ssl.py b/Lib/ssl.py
index efd674c..d17f8de 100644
--- a/Lib/ssl.py
+++ b/Lib/ssl.py
@@ -52,10 +52,46 @@ PROTOCOL_SSLv2
PROTOCOL_SSLv3
PROTOCOL_SSLv23
PROTOCOL_TLSv1
+PROTOCOL_TLSv1_1
+PROTOCOL_TLSv1_2
+
+The following constants identify various SSL alert message descriptions as per
+http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6
+
+ALERT_DESCRIPTION_CLOSE_NOTIFY
+ALERT_DESCRIPTION_UNEXPECTED_MESSAGE
+ALERT_DESCRIPTION_BAD_RECORD_MAC
+ALERT_DESCRIPTION_RECORD_OVERFLOW
+ALERT_DESCRIPTION_DECOMPRESSION_FAILURE
+ALERT_DESCRIPTION_HANDSHAKE_FAILURE
+ALERT_DESCRIPTION_BAD_CERTIFICATE
+ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE
+ALERT_DESCRIPTION_CERTIFICATE_REVOKED
+ALERT_DESCRIPTION_CERTIFICATE_EXPIRED
+ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN
+ALERT_DESCRIPTION_ILLEGAL_PARAMETER
+ALERT_DESCRIPTION_UNKNOWN_CA
+ALERT_DESCRIPTION_ACCESS_DENIED
+ALERT_DESCRIPTION_DECODE_ERROR
+ALERT_DESCRIPTION_DECRYPT_ERROR
+ALERT_DESCRIPTION_PROTOCOL_VERSION
+ALERT_DESCRIPTION_INSUFFICIENT_SECURITY
+ALERT_DESCRIPTION_INTERNAL_ERROR
+ALERT_DESCRIPTION_USER_CANCELLED
+ALERT_DESCRIPTION_NO_RENEGOTIATION
+ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION
+ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
+ALERT_DESCRIPTION_UNRECOGNIZED_NAME
+ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE
+ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE
+ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY
"""
import textwrap
import re
+import sys
+import os
+import collections
import _ssl # if we can't import it, let the error propagate
@@ -66,35 +102,23 @@ from _ssl import (
SSLSyscallError, SSLEOFError,
)
from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
-from _ssl import (
- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1,
- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE
- )
-try:
- from _ssl import OP_NO_COMPRESSION
-except ImportError:
- pass
-try:
- from _ssl import OP_SINGLE_ECDH_USE
-except ImportError:
- pass
from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes
-from _ssl import (
- SSL_ERROR_ZERO_RETURN,
- SSL_ERROR_WANT_READ,
- SSL_ERROR_WANT_WRITE,
- SSL_ERROR_WANT_X509_LOOKUP,
- SSL_ERROR_SYSCALL,
- SSL_ERROR_SSL,
- SSL_ERROR_WANT_CONNECT,
- SSL_ERROR_EOF,
- SSL_ERROR_INVALID_ERROR_CODE,
- )
+
+def _import_symbols(prefix):
+ for n in dir(_ssl):
+ if n.startswith(prefix):
+ globals()[n] = getattr(_ssl, n)
+
+_import_symbols('OP_')
+_import_symbols('ALERT_DESCRIPTION_')
+_import_symbols('SSL_ERROR_')
+
from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN
-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23,
- PROTOCOL_TLSv1)
+
+from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1
from _ssl import _OPENSSL_API_VERSION
+
_PROTOCOL_NAMES = {
PROTOCOL_TLSv1: "TLSv1",
PROTOCOL_SSLv23: "SSLv23",
@@ -108,13 +132,26 @@ except ImportError:
else:
_PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2"
+try:
+ from _ssl import PROTOCOL_TLSv1_1, PROTOCOL_TLSv1_2
+except ImportError:
+ pass
+else:
+ _PROTOCOL_NAMES[PROTOCOL_TLSv1_1] = "TLSv1.1"
+ _PROTOCOL_NAMES[PROTOCOL_TLSv1_2] = "TLSv1.2"
+
+if sys.platform == "win32":
+ from _ssl import enum_cert_store, X509_ASN_ENCODING, PKCS_7_ASN_ENCODING
+
from socket import getnameinfo as _getnameinfo
-from socket import error as socket_error
from socket import socket, AF_INET, SOCK_STREAM, create_connection
import base64 # for DER-to-PEM translation
import traceback
import errno
+
+socket_error = OSError # keep that public name in module namespace
+
if _ssl.HAS_TLS_UNIQUE:
CHANNEL_BINDING_TYPES = ['tls-unique']
else:
@@ -191,11 +228,29 @@ def match_hostname(cert, hostname):
"subjectAltName fields were found")
+DefaultVerifyPaths = collections.namedtuple("DefaultVerifyPaths",
+ "cafile capath openssl_cafile_env openssl_cafile openssl_capath_env "
+ "openssl_capath")
+
+def get_default_verify_paths():
+ """Return paths to default cafile and capath.
+ """
+ parts = _ssl.get_default_verify_paths()
+
+ # environment vars shadow paths
+ cafile = os.environ.get(parts[0], parts[1])
+ capath = os.environ.get(parts[2], parts[3])
+
+ return DefaultVerifyPaths(cafile if os.path.isfile(cafile) else None,
+ capath if os.path.isdir(capath) else None,
+ *parts)
+
+
class SSLContext(_SSLContext):
"""An SSLContext holds various SSL-related configuration options and
data, such as certificates and possibly a private key."""
- __slots__ = ('protocol',)
+ __slots__ = ('protocol', '__weakref__')
def __new__(cls, protocol, *args, **kwargs):
self = _SSLContext.__new__(cls, protocol)
@@ -243,7 +298,7 @@ class SSLSocket(socket):
_context=None):
if _context:
- self.context = _context
+ self._context = _context
else:
if server_side and not certfile:
raise ValueError("certfile must be specified for server-side "
@@ -252,16 +307,16 @@ class SSLSocket(socket):
raise ValueError("certfile must be specified")
if certfile and not keyfile:
keyfile = certfile
- self.context = SSLContext(ssl_version)
- self.context.verify_mode = cert_reqs
+ self._context = SSLContext(ssl_version)
+ self._context.verify_mode = cert_reqs
if ca_certs:
- self.context.load_verify_locations(ca_certs)
+ self._context.load_verify_locations(ca_certs)
if certfile:
- self.context.load_cert_chain(certfile, keyfile)
+ self._context.load_cert_chain(certfile, keyfile)
if npn_protocols:
- self.context.set_npn_protocols(npn_protocols)
+ self._context.set_npn_protocols(npn_protocols)
if ciphers:
- self.context.set_ciphers(ciphers)
+ self._context.set_ciphers(ciphers)
self.keyfile = keyfile
self.certfile = certfile
self.cert_reqs = cert_reqs
@@ -275,7 +330,6 @@ class SSLSocket(socket):
self.server_hostname = server_hostname
self.do_handshake_on_connect = do_handshake_on_connect
self.suppress_ragged_eofs = suppress_ragged_eofs
- connected = False
if sock is not None:
socket.__init__(self,
family=sock.family,
@@ -283,27 +337,29 @@ class SSLSocket(socket):
proto=sock.proto,
fileno=sock.fileno())
self.settimeout(sock.gettimeout())
- # see if it's connected
- try:
- sock.getpeername()
- except socket_error as e:
- if e.errno != errno.ENOTCONN:
- raise
- else:
- connected = True
sock.detach()
elif fileno is not None:
socket.__init__(self, fileno=fileno)
else:
socket.__init__(self, family=family, type=type, proto=proto)
+ # See if we are connected
+ try:
+ self.getpeername()
+ except OSError as e:
+ if e.errno != errno.ENOTCONN:
+ raise
+ connected = False
+ else:
+ connected = True
+
self._closed = False
self._sslobj = None
self._connected = connected
if connected:
# create the SSL object
try:
- self._sslobj = self.context._wrap_socket(self, server_side,
+ self._sslobj = self._context._wrap_socket(self, server_side,
server_hostname)
if do_handshake_on_connect:
timeout = self.gettimeout()
@@ -312,10 +368,19 @@ class SSLSocket(socket):
raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
self.do_handshake()
- except socket_error as x:
+ except OSError as x:
self.close()
raise x
+ @property
+ def context(self):
+ return self._context
+
+ @context.setter
+ def context(self, ctx):
+ self._context = ctx
+ self._sslobj.context = ctx
+
def dup(self):
raise NotImplemented("Can't dup() %s instances" %
self.__class__.__name__)
@@ -324,11 +389,21 @@ class SSLSocket(socket):
# raise an exception here if you wish to check for spurious closes
pass
+ def _check_connected(self):
+ if not self._connected:
+ # getpeername() will raise ENOTCONN if the socket is really
+ # not connected; note that we can be connected even without
+ # _connected being set, e.g. if connect() first returned
+ # EAGAIN.
+ self.getpeername()
+
def read(self, len=0, buffer=None):
"""Read up to LEN bytes and return them.
Return zero-length string on EOF."""
self._checkClosed()
+ if not self._sslobj:
+ raise ValueError("Read on closed or unwrapped SSL socket.")
try:
if buffer is not None:
v = self._sslobj.read(len, buffer)
@@ -349,6 +424,8 @@ class SSLSocket(socket):
number of bytes of DATA actually transmitted."""
self._checkClosed()
+ if not self._sslobj:
+ raise ValueError("Write on closed or unwrapped SSL socket.")
return self._sslobj.write(data)
def getpeercert(self, binary_form=False):
@@ -358,6 +435,7 @@ class SSLSocket(socket):
certificate was provided, but not validated."""
self._checkClosed()
+ self._check_connected()
return self._sslobj.peer_certificate(binary_form)
def selected_npn_protocol(self):
@@ -388,18 +466,17 @@ class SSLSocket(socket):
raise ValueError(
"non-zero flags not allowed in calls to send() on %s" %
self.__class__)
- while True:
- try:
- v = self._sslobj.write(data)
- except SSLError as x:
- if x.args[0] == SSL_ERROR_WANT_READ:
- return 0
- elif x.args[0] == SSL_ERROR_WANT_WRITE:
- return 0
- else:
- raise
+ try:
+ v = self._sslobj.write(data)
+ except SSLError as x:
+ if x.args[0] == SSL_ERROR_WANT_READ:
+ return 0
+ elif x.args[0] == SSL_ERROR_WANT_WRITE:
+ return 0
else:
- return v
+ raise
+ else:
+ return v
else:
return socket.send(self, data, flags)
@@ -507,12 +584,11 @@ class SSLSocket(socket):
def _real_close(self):
self._sslobj = None
- # self._closed = True
socket._real_close(self)
def do_handshake(self, block=False):
"""Perform a TLS/SSL handshake."""
-
+ self._check_connected()
timeout = self.gettimeout()
try:
if timeout == 0.0 and block:
@@ -536,11 +612,11 @@ class SSLSocket(socket):
rc = None
socket.connect(self, addr)
if not rc:
+ self._connected = True
if self.do_handshake_on_connect:
self.do_handshake()
- self._connected = True
return rc
- except socket_error:
+ except OSError:
self._sslobj = None
raise
diff --git a/Lib/stat.py b/Lib/stat.py
index 704adfe..3eecc3e 100644
--- a/Lib/stat.py
+++ b/Lib/stat.py
@@ -147,3 +147,9 @@ def filemode(mode):
else:
perm.append("-")
return "".join(perm)
+
+# If available, use C implementation
+try:
+ from _stat import *
+except ImportError:
+ pass
diff --git a/Lib/struct.py b/Lib/struct.py
index 9bfc23f..d6bba58 100644
--- a/Lib/struct.py
+++ b/Lib/struct.py
@@ -1,6 +1,7 @@
__all__ = [
# Functions
'calcsize', 'pack', 'pack_into', 'unpack', 'unpack_from',
+ 'iter_unpack',
# Classes
'Struct',
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 376b505..6ebcc25 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -178,6 +178,9 @@ check_output(*popenargs, **kwargs):
>>> output = subprocess.check_output(["ls", "-l", "/dev/null"])
+ There is an additional optional argument, "input", allowing you to
+ pass a string to the subprocess's stdin. If you use this argument
+ you may not also use the Popen constructor's "stdin" argument.
Exceptions
----------
@@ -398,8 +401,6 @@ if mswindows:
hStdOutput = None
hStdError = None
wShowWindow = 0
- class pywintypes:
- error = IOError
else:
import select
_has_poll = hasattr(select, 'poll')
@@ -568,14 +569,31 @@ def check_output(*popenargs, timeout=None, **kwargs):
... stderr=STDOUT)
b'ls: non_existent_file: No such file or directory\n'
+ There is an additional optional argument, "input", allowing you to
+ pass a string to the subprocess's stdin. If you use this argument
+ you may not also use the Popen constructor's "stdin" argument, as
+ it too will be used internally. Example:
+
+ >>> check_output(["sed", "-e", "s/foo/bar/"],
+ ... input=b"when in the course of fooman events\n")
+ b'when in the course of barman events\n'
+
If universal_newlines=True is passed, the return value will be a
string rather than bytes.
"""
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
+ if 'input' in kwargs:
+ if 'stdin' in kwargs:
+ raise ValueError('stdin and input arguments may not both be used.')
+ inputdata = kwargs['input']
+ del kwargs['input']
+ kwargs['stdin'] = PIPE
+ else:
+ inputdata = None
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
try:
- output, unused_err = process.communicate(timeout=timeout)
+ output, unused_err = process.communicate(inputdata, timeout=timeout)
except TimeoutExpired:
process.kill()
output, unused_err = process.communicate()
@@ -827,7 +845,7 @@ class Popen(object):
for f in filter(None, (self.stdin, self.stdout, self.stderr)):
try:
f.close()
- except EnvironmentError:
+ except OSError:
pass # Ignore EBADF or other errors.
if not self._closed_child_pipe_fds:
@@ -843,7 +861,7 @@ class Popen(object):
for fd in to_close:
try:
os.close(fd)
- except EnvironmentError:
+ except OSError:
pass
raise
@@ -907,7 +925,7 @@ class Popen(object):
if input:
try:
self.stdin.write(input)
- except IOError as e:
+ except OSError as e:
if e.errno != errno.EPIPE and e.errno != errno.EINVAL:
raise
self.stdin.close()
@@ -1039,23 +1057,6 @@ class Popen(object):
return Handle(h)
- def _find_w9xpopen(self):
- """Find and return absolut path to w9xpopen.exe"""
- w9xpopen = os.path.join(
- os.path.dirname(_winapi.GetModuleFileName(0)),
- "w9xpopen.exe")
- if not os.path.exists(w9xpopen):
- # Eeek - file-not-found - possibly an embedding
- # situation - see if we can locate it in sys.exec_prefix
- w9xpopen = os.path.join(os.path.dirname(sys.base_exec_prefix),
- "w9xpopen.exe")
- if not os.path.exists(w9xpopen):
- raise RuntimeError("Cannot locate w9xpopen.exe, which is "
- "needed for Popen to work with your "
- "shell or platform.")
- return w9xpopen
-
-
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env,
startupinfo, creationflags, shell,
@@ -1084,21 +1085,6 @@ class Popen(object):
startupinfo.wShowWindow = _winapi.SW_HIDE
comspec = os.environ.get("COMSPEC", "cmd.exe")
args = '{} /c "{}"'.format (comspec, args)
- if (_winapi.GetVersion() >= 0x80000000 or
- os.path.basename(comspec).lower() == "command.com"):
- # Win9x, or using command.com on NT. We need to
- # use the w9xpopen intermediate program. For more
- # information, see KB Q150956
- # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
- w9xpopen = self._find_w9xpopen()
- args = '"%s" %s' % (w9xpopen, args)
- # Not passing CREATE_NEW_CONSOLE has been known to
- # cause random failures on win9x. Specifically a
- # dialog: "Your program accessed mem currently in
- # use at xxx" and a hopeful warning about the
- # stability of your system. Cost is Ctrl+C won't
- # kill children.
- creationflags |= _winapi.CREATE_NEW_CONSOLE
# Start the process
try:
@@ -1110,12 +1096,6 @@ class Popen(object):
env,
cwd,
startupinfo)
- except pywintypes.error as e:
- # Translate pywintypes.error to WindowsError, which is
- # a subclass of OSError. FIXME: We should really
- # translate errno using _sys_errlist (or similar), but
- # how can this be done from Python?
- raise WindowsError(*e.args)
finally:
# Child is launched. Close the parent's copy of those pipe
# handles that only the child should have open. You need
@@ -1200,7 +1180,7 @@ class Popen(object):
if input is not None:
try:
self.stdin.write(input)
- except IOError as e:
+ except OSError as e:
if e.errno != errno.EPIPE:
raise
self.stdin.close()
@@ -1424,13 +1404,13 @@ class Popen(object):
exception_name, hex_errno, err_msg = (
errpipe_data.split(b':', 2))
except ValueError:
- exception_name = b'RuntimeError'
+ exception_name = b'SubprocessError'
hex_errno = b'0'
err_msg = (b'Bad exception data from child: ' +
repr(errpipe_data))
child_exception_type = getattr(
builtins, exception_name.decode('ascii'),
- RuntimeError)
+ SubprocessError)
err_msg = err_msg.decode(errors="surrogatepass")
if issubclass(child_exception_type, OSError) and hex_errno:
errno_num = int(hex_errno, 16)
@@ -1460,11 +1440,11 @@ class Popen(object):
self.returncode = _WEXITSTATUS(sts)
else:
# Should never happen
- raise RuntimeError("Unknown child exit status!")
+ raise SubprocessError("Unknown child exit status!")
def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
- _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD):
+ _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD):
"""Check if child process has terminated. Returns returncode
attribute.
@@ -1477,7 +1457,7 @@ class Popen(object):
pid, sts = _waitpid(self.pid, _WNOHANG)
if pid == self.pid:
self._handle_exitstatus(sts)
- except _os_error as e:
+ except OSError as e:
if _deadstate is not None:
self.returncode = _deadstate
elif e.errno == _ECHILD:
@@ -1634,7 +1614,7 @@ class Popen(object):
raise TimeoutExpired(self.args, orig_timeout)
try:
ready = poller.poll(timeout)
- except select.error as e:
+ except OSError as e:
if e.args[0] == errno.EINTR:
continue
raise
@@ -1702,7 +1682,7 @@ class Popen(object):
(rlist, wlist, xlist) = \
select.select(self._read_set, self._write_set, [],
timeout)
- except select.error as e:
+ except OSError as e:
if e.args[0] == errno.EINTR:
continue
raise
diff --git a/Lib/symbol.py b/Lib/symbol.py
index 34143b5..5cf4a65 100755
--- a/Lib/symbol.py
+++ b/Lib/symbol.py
@@ -100,7 +100,7 @@ for _name, _value in list(globals().items()):
sym_name[_value] = _name
-def main():
+def _main():
import sys
import token
if len(sys.argv) == 1:
@@ -108,4 +108,4 @@ def main():
token._main()
if __name__ == "__main__":
- main()
+ _main()
diff --git a/Lib/symtable.py b/Lib/symtable.py
index 39c1a80..c0e32df 100644
--- a/Lib/symtable.py
+++ b/Lib/symtable.py
@@ -235,7 +235,8 @@ class Symbol(object):
if __name__ == "__main__":
import os, sys
- src = open(sys.argv[0]).read()
+ with open(sys.argv[0]) as f:
+ src = f.read()
mod = symtable(src, os.path.split(sys.argv[0])[1], "exec")
for ident in mod.get_identifiers():
info = mod.lookup(ident)
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
index 2f5f740..ee38a20 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -52,25 +52,6 @@ _INSTALL_SCHEMES = {
'scripts': '{base}/Scripts',
'data': '{base}',
},
- 'os2': {
- 'stdlib': '{installed_base}/Lib',
- 'platstdlib': '{base}/Lib',
- 'purelib': '{base}/Lib/site-packages',
- 'platlib': '{base}/Lib/site-packages',
- 'include': '{installed_base}/Include',
- 'platinclude': '{installed_base}/Include',
- 'scripts': '{base}/Scripts',
- 'data': '{base}',
- },
- 'os2_home': {
- 'stdlib': '{userbase}/lib/python{py_version_short}',
- 'platstdlib': '{userbase}/lib/python{py_version_short}',
- 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
- 'include': '{userbase}/include/python{py_version_short}',
- 'scripts': '{userbase}/bin',
- 'data': '{userbase}',
- },
'nt_user': {
'stdlib': '{userbase}/Python{py_version_nodot}',
'platstdlib': '{userbase}/Python{py_version_nodot}',
@@ -210,7 +191,6 @@ def _getuserbase():
def joinuser(*args):
return os.path.expanduser(os.path.join(*args))
- # what about 'os2emx', 'riscos' ?
if os.name == "nt":
base = os.environ.get("APPDATA") or "~"
if env_base:
@@ -369,21 +349,21 @@ def _generate_posix_vars():
makefile = get_makefile_filename()
try:
_parse_makefile(makefile, vars)
- except IOError as e:
+ except OSError as e:
msg = "invalid Python installation: unable to open %s" % makefile
if hasattr(e, "strerror"):
msg = msg + " (%s)" % e.strerror
- raise IOError(msg)
+ raise OSError(msg)
# load the installed pyconfig.h:
config_h = get_config_h_filename()
try:
with open(config_h) as f:
parse_config_h(f, vars)
- except IOError as e:
+ except OSError as e:
msg = "invalid Python installation: unable to open %s" % config_h
if hasattr(e, "strerror"):
msg = msg + " (%s)" % e.strerror
- raise IOError(msg)
+ raise OSError(msg)
# On AIX, there are wrong paths to the linker scripts in the Makefile
# -- these paths are relative to the Python source, but when installed
# the scripts are in another directory.
@@ -403,8 +383,8 @@ def _generate_posix_vars():
# get_platform() succeeds.
name = '_sysconfigdata'
if 'darwin' in sys.platform:
- import imp
- module = imp.new_module(name)
+ import types
+ module = types.ModuleType(name)
module.build_time_vars = vars
sys.modules[name] = module
@@ -436,7 +416,6 @@ def _init_non_posix(vars):
vars['LIBDEST'] = get_path('stdlib')
vars['BINLIBDEST'] = get_path('platstdlib')
vars['INCLUDEPY'] = get_path('include')
- vars['SO'] = '.pyd'
vars['EXT_SUFFIX'] = '.pyd'
vars['EXE'] = '.exe'
vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
@@ -552,7 +531,7 @@ def get_config_vars(*args):
# sys.abiflags may not be defined on all platforms.
_CONFIG_VARS['abiflags'] = ''
- if os.name in ('nt', 'os2'):
+ if os.name == 'nt':
_init_non_posix(_CONFIG_VARS)
if os.name == 'posix':
_init_posix(_CONFIG_VARS)
diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py
index 5b9b444..46e0f56 100755
--- a/Lib/tabnanny.py
+++ b/Lib/tabnanny.py
@@ -95,7 +95,7 @@ def check(file):
try:
f = tokenize.open(file)
- except IOError as msg:
+ except OSError as msg:
errprint("%r: I/O Error: %s" % (file, msg))
return
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index 16d338c..7766e4a 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -56,9 +56,9 @@ except ImportError:
# os.symlink on Windows prior to 6.0 raises NotImplementedError
symlink_exception = (AttributeError, NotImplementedError)
try:
- # WindowsError (1314) will be raised if the caller does not hold the
+ # OSError (winerror=1314) will be raised if the caller does not hold the
# SeCreateSymbolicLinkPrivilege privilege
- symlink_exception += (WindowsError,)
+ symlink_exception += (OSError,)
except NameError:
pass
@@ -264,13 +264,13 @@ def copyfileobj(src, dst, length=None):
for b in range(blocks):
buf = src.read(BUFSIZE)
if len(buf) < BUFSIZE:
- raise IOError("end of file reached")
+ raise OSError("end of file reached")
dst.write(buf)
if remainder != 0:
buf = src.read(remainder)
if len(buf) < remainder:
- raise IOError("end of file reached")
+ raise OSError("end of file reached")
dst.write(buf)
return
@@ -399,7 +399,7 @@ class _Stream:
if mode == "r":
self.dbuf = b""
self.cmp = bz2.BZ2Decompressor()
- self.exception = IOError
+ self.exception = OSError
else:
self.cmp = bz2.BZ2Compressor()
@@ -1631,7 +1631,7 @@ class TarFile(object):
try:
fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
t = cls.taropen(name, mode, fileobj, **kwargs)
- except IOError:
+ except OSError:
if not extfileobj and fileobj is not None:
fileobj.close()
if fileobj is None:
@@ -1662,7 +1662,7 @@ class TarFile(object):
try:
t = cls.taropen(name, mode, fileobj, **kwargs)
- except (IOError, EOFError):
+ except (OSError, EOFError):
fileobj.close()
raise ReadError("not a bzip2 file")
t._extfileobj = False
@@ -2022,7 +2022,7 @@ class TarFile(object):
try:
self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
set_attrs=set_attrs)
- except EnvironmentError as e:
+ except OSError as e:
if self.errorlevel > 0:
raise
else:
@@ -2211,9 +2211,8 @@ class TarFile(object):
if tarinfo.issym() and hasattr(os, "lchown"):
os.lchown(targetpath, u, g)
else:
- if sys.platform != "os2emx":
- os.chown(targetpath, u, g)
- except EnvironmentError as e:
+ os.chown(targetpath, u, g)
+ except OSError as e:
raise ExtractError("could not change owner")
def chmod(self, tarinfo, targetpath):
@@ -2222,7 +2221,7 @@ class TarFile(object):
if hasattr(os, 'chmod'):
try:
os.chmod(targetpath, tarinfo.mode)
- except EnvironmentError as e:
+ except OSError as e:
raise ExtractError("could not change mode")
def utime(self, tarinfo, targetpath):
@@ -2232,7 +2231,7 @@ class TarFile(object):
return
try:
os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
- except EnvironmentError as e:
+ except OSError as e:
raise ExtractError("could not change modification time")
#--------------------------------------------------------------------------
@@ -2323,9 +2322,9 @@ class TarFile(object):
corresponds to TarFile's mode.
"""
if self.closed:
- raise IOError("%s is closed" % self.__class__.__name__)
+ raise OSError("%s is closed" % self.__class__.__name__)
if mode is not None and self.mode not in mode:
- raise IOError("bad operation for mode %r" % self.mode)
+ raise OSError("bad operation for mode %r" % self.mode)
def _find_link_target(self, tarinfo):
"""Find the target member of a symlink or hardlink member in the
diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
index a59693e..b4b7cd4 100644
--- a/Lib/telnetlib.py
+++ b/Lib/telnetlib.py
@@ -273,7 +273,7 @@ class Telnet:
"""Write a string to the socket, doubling any IAC characters.
Can block if the connection is blocked. May raise
- socket.error if the connection is closed.
+ OSError if the connection is closed.
"""
if IAC in buffer:
@@ -313,7 +313,7 @@ class Telnet:
while i < 0 and not self.eof:
try:
ready = poller.poll(call_timeout)
- except select.error as e:
+ except OSError as e:
if e.errno == errno.EINTR:
if timeout is not None:
elapsed = time() - time_start
@@ -683,7 +683,7 @@ class Telnet:
while not m and not self.eof:
try:
ready = poller.poll(call_timeout)
- except select.error as e:
+ except OSError as e:
if e.errno == errno.EINTR:
if timeout is not None:
elapsed = time() - time_start
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index ed5c857..df73289 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -58,6 +58,8 @@ except ImportError:
_allocate_lock = _thread.allocate_lock
_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
+if hasattr(_os, 'O_CLOEXEC'):
+ _text_openflags |= _os.O_CLOEXEC
if hasattr(_os, 'O_NOINHERIT'):
_text_openflags |= _os.O_NOINHERIT
if hasattr(_os, 'O_NOFOLLOW'):
@@ -123,7 +125,7 @@ class _RandomNameSequence:
def __next__(self):
c = self.characters
choose = self.rng.choice
- letters = [choose(c) for dummy in "123456"]
+ letters = [choose(c) for dummy in range(8)]
return ''.join(letters)
def _candidate_tempdir_list():
@@ -684,7 +686,6 @@ class TemporaryDirectory(object):
_islink = staticmethod(_os.path.islink)
_remove = staticmethod(_os.remove)
_rmdir = staticmethod(_os.rmdir)
- _os_error = OSError
_warn = _warnings.warn
def _rmtree(self, path):
@@ -694,16 +695,16 @@ class TemporaryDirectory(object):
fullname = self._path_join(path, name)
try:
isdir = self._isdir(fullname) and not self._islink(fullname)
- except self._os_error:
+ except OSError:
isdir = False
if isdir:
self._rmtree(fullname)
else:
try:
self._remove(fullname)
- except self._os_error:
+ except OSError:
pass
try:
self._rmdir(path)
- except self._os_error:
+ except OSError:
pass
diff --git a/Lib/test/__main__.py b/Lib/test/__main__.py
index ce5615b..d5fbe15 100644
--- a/Lib/test/__main__.py
+++ b/Lib/test/__main__.py
@@ -1,13 +1,3 @@
-from test import regrtest, support
+from test import regrtest
-
-TEMPDIR, TESTCWD = regrtest._make_temp_dir_for_build(regrtest.TEMPDIR)
-regrtest.TEMPDIR = TEMPDIR
-regrtest.TESTCWD = TESTCWD
-
-# Run the tests in a context manager that temporary changes the CWD to a
-# temporary and writable directory. If it's not possible to create or
-# change the CWD, the original CWD will be used. The original CWD is
-# available from support.SAVEDCWD.
-with support.temp_cwd(TESTCWD, quiet=True):
- regrtest.main()
+regrtest.main_in_temp_cwd()
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index aa985e3..f777edc 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -43,7 +43,7 @@ from multiprocessing import util
try:
from multiprocessing import reduction
- HAS_REDUCTION = True
+ HAS_REDUCTION = reduction.HAVE_SEND_HANDLE
except ImportError:
HAS_REDUCTION = False
@@ -99,6 +99,9 @@ try:
except:
MAXFD = 256
+# To speed up tests when using the forkserver, we can preload these:
+PRELOAD = ['__main__', 'test.test_multiprocessing_forkserver']
+
#
# Some tests require ctypes
#
@@ -330,7 +333,6 @@ class _TestProcess(BaseTestCase):
@classmethod
def _test_recursion(cls, wconn, id):
- from multiprocessing import forking
wconn.send(id)
if len(id) < 2:
for i in range(2):
@@ -378,7 +380,7 @@ class _TestProcess(BaseTestCase):
self.assertFalse(wait_for_handle(sentinel, timeout=0.0))
event.set()
p.join()
- self.assertTrue(wait_for_handle(sentinel, timeout=DELTA))
+ self.assertTrue(wait_for_handle(sentinel, timeout=1))
#
#
@@ -1757,6 +1759,35 @@ class _TestPool(BaseTestCase):
self.assertEqual(r.get(), expected)
self.assertRaises(ValueError, p.map_async, sqr, L)
+ @classmethod
+ def _test_traceback(cls):
+ raise RuntimeError(123) # some comment
+
+ def test_traceback(self):
+ # We want ensure that the traceback from the child process is
+ # contained in the traceback raised in the main process.
+ if self.TYPE == 'processes':
+ with self.Pool(1) as p:
+ try:
+ p.apply(self._test_traceback)
+ except Exception as e:
+ exc = e
+ else:
+ raise AssertionError('expected RuntimeError')
+ self.assertIs(type(exc), RuntimeError)
+ self.assertEqual(exc.args, (123,))
+ cause = exc.__cause__
+ self.assertIs(type(cause), multiprocessing.pool.RemoteTraceback)
+ self.assertIn('raise RuntimeError(123) # some comment', cause.tb)
+
+ with test.support.captured_stderr() as f1:
+ try:
+ raise exc
+ except RuntimeError:
+ sys.excepthook(*sys.exc_info())
+ self.assertIn('raise RuntimeError(123) # some comment',
+ f1.getvalue())
+
def raising():
raise KeyError("key")
@@ -2464,7 +2495,7 @@ class _TestPicklingConnections(BaseTestCase):
@classmethod
def tearDownClass(cls):
- from multiprocessing.reduction import resource_sharer
+ from multiprocessing import resource_sharer
resource_sharer.stop(timeout=5)
@classmethod
@@ -2778,30 +2809,40 @@ class _TestFinalize(BaseTestCase):
# Test that from ... import * works for each module
#
-class _TestImportStar(BaseTestCase):
+class _TestImportStar(unittest.TestCase):
- ALLOWED_TYPES = ('processes',)
+ def get_module_names(self):
+ import glob
+ folder = os.path.dirname(multiprocessing.__file__)
+ pattern = os.path.join(folder, '*.py')
+ files = glob.glob(pattern)
+ modules = [os.path.splitext(os.path.split(f)[1])[0] for f in files]
+ modules = ['multiprocessing.' + m for m in modules]
+ modules.remove('multiprocessing.__init__')
+ modules.append('multiprocessing')
+ return modules
def test_import(self):
- modules = [
- 'multiprocessing', 'multiprocessing.connection',
- 'multiprocessing.heap', 'multiprocessing.managers',
- 'multiprocessing.pool', 'multiprocessing.process',
- 'multiprocessing.synchronize', 'multiprocessing.util'
- ]
-
- if HAS_REDUCTION:
- modules.append('multiprocessing.reduction')
+ modules = self.get_module_names()
+ if sys.platform == 'win32':
+ modules.remove('multiprocessing.popen_fork')
+ modules.remove('multiprocessing.popen_forkserver')
+ modules.remove('multiprocessing.popen_spawn_posix')
+ else:
+ modules.remove('multiprocessing.popen_spawn_win32')
+ if not HAS_REDUCTION:
+ modules.remove('multiprocessing.popen_forkserver')
- if c_int is not None:
+ if c_int is None:
# This module requires _ctypes
- modules.append('multiprocessing.sharedctypes')
+ modules.remove('multiprocessing.sharedctypes')
for name in modules:
__import__(name)
mod = sys.modules[name]
+ self.assertTrue(hasattr(mod, '__all__'), name)
- for attr in getattr(mod, '__all__', ()):
+ for attr in mod.__all__:
self.assertTrue(
hasattr(mod, attr),
'%r does not have attribute %r' % (mod, attr)
@@ -2924,131 +2965,6 @@ class TestInvalidHandle(unittest.TestCase):
self.assertRaises((ValueError, OSError),
multiprocessing.connection.Connection, -1)
-#
-# Functions used to create test cases from the base ones in this module
-#
-
-def create_test_cases(Mixin, type):
- result = {}
- glob = globals()
- Type = type.capitalize()
- ALL_TYPES = {'processes', 'threads', 'manager'}
-
- for name in list(glob.keys()):
- if name.startswith('_Test'):
- base = glob[name]
- assert set(base.ALLOWED_TYPES) <= ALL_TYPES, set(base.ALLOWED_TYPES)
- if type in base.ALLOWED_TYPES:
- newname = 'With' + Type + name[1:]
- class Temp(base, Mixin, unittest.TestCase):
- pass
- result[newname] = Temp
- Temp.__name__ = Temp.__qualname__ = newname
- Temp.__module__ = Mixin.__module__
- return result
-
-#
-# Create test cases
-#
-
-class ProcessesMixin(object):
- TYPE = 'processes'
- Process = multiprocessing.Process
- connection = multiprocessing.connection
- current_process = staticmethod(multiprocessing.current_process)
- active_children = staticmethod(multiprocessing.active_children)
- Pool = staticmethod(multiprocessing.Pool)
- Pipe = staticmethod(multiprocessing.Pipe)
- Queue = staticmethod(multiprocessing.Queue)
- JoinableQueue = staticmethod(multiprocessing.JoinableQueue)
- Lock = staticmethod(multiprocessing.Lock)
- RLock = staticmethod(multiprocessing.RLock)
- Semaphore = staticmethod(multiprocessing.Semaphore)
- BoundedSemaphore = staticmethod(multiprocessing.BoundedSemaphore)
- Condition = staticmethod(multiprocessing.Condition)
- Event = staticmethod(multiprocessing.Event)
- Barrier = staticmethod(multiprocessing.Barrier)
- Value = staticmethod(multiprocessing.Value)
- Array = staticmethod(multiprocessing.Array)
- RawValue = staticmethod(multiprocessing.RawValue)
- RawArray = staticmethod(multiprocessing.RawArray)
-
-testcases_processes = create_test_cases(ProcessesMixin, type='processes')
-globals().update(testcases_processes)
-
-
-class ManagerMixin(object):
- TYPE = 'manager'
- Process = multiprocessing.Process
- Queue = property(operator.attrgetter('manager.Queue'))
- JoinableQueue = property(operator.attrgetter('manager.JoinableQueue'))
- Lock = property(operator.attrgetter('manager.Lock'))
- RLock = property(operator.attrgetter('manager.RLock'))
- Semaphore = property(operator.attrgetter('manager.Semaphore'))
- BoundedSemaphore = property(operator.attrgetter('manager.BoundedSemaphore'))
- Condition = property(operator.attrgetter('manager.Condition'))
- Event = property(operator.attrgetter('manager.Event'))
- Barrier = property(operator.attrgetter('manager.Barrier'))
- Value = property(operator.attrgetter('manager.Value'))
- Array = property(operator.attrgetter('manager.Array'))
- list = property(operator.attrgetter('manager.list'))
- dict = property(operator.attrgetter('manager.dict'))
- Namespace = property(operator.attrgetter('manager.Namespace'))
-
- @classmethod
- def Pool(cls, *args, **kwds):
- return cls.manager.Pool(*args, **kwds)
-
- @classmethod
- def setUpClass(cls):
- cls.manager = multiprocessing.Manager()
-
- @classmethod
- def tearDownClass(cls):
- # only the manager process should be returned by active_children()
- # but this can take a bit on slow machines, so wait a few seconds
- # if there are other children too (see #17395)
- t = 0.01
- while len(multiprocessing.active_children()) > 1 and t < 5:
- time.sleep(t)
- t *= 2
- gc.collect() # do garbage collection
- if cls.manager._number_of_objects() != 0:
- # This is not really an error since some tests do not
- # ensure that all processes which hold a reference to a
- # managed object have been joined.
- print('Shared objects which still exist at manager shutdown:')
- print(cls.manager._debug_info())
- cls.manager.shutdown()
- cls.manager.join()
- cls.manager = None
-
-testcases_manager = create_test_cases(ManagerMixin, type='manager')
-globals().update(testcases_manager)
-
-
-class ThreadsMixin(object):
- TYPE = 'threads'
- Process = multiprocessing.dummy.Process
- connection = multiprocessing.dummy.connection
- current_process = staticmethod(multiprocessing.dummy.current_process)
- active_children = staticmethod(multiprocessing.dummy.active_children)
- Pool = staticmethod(multiprocessing.Pool)
- Pipe = staticmethod(multiprocessing.dummy.Pipe)
- Queue = staticmethod(multiprocessing.dummy.Queue)
- JoinableQueue = staticmethod(multiprocessing.dummy.JoinableQueue)
- Lock = staticmethod(multiprocessing.dummy.Lock)
- RLock = staticmethod(multiprocessing.dummy.RLock)
- Semaphore = staticmethod(multiprocessing.dummy.Semaphore)
- BoundedSemaphore = staticmethod(multiprocessing.dummy.BoundedSemaphore)
- Condition = staticmethod(multiprocessing.dummy.Condition)
- Event = staticmethod(multiprocessing.dummy.Event)
- Barrier = staticmethod(multiprocessing.dummy.Barrier)
- Value = staticmethod(multiprocessing.dummy.Value)
- Array = staticmethod(multiprocessing.dummy.Array)
-
-testcases_threads = create_test_cases(ThreadsMixin, type='threads')
-globals().update(testcases_threads)
class OtherTest(unittest.TestCase):
@@ -3398,7 +3314,7 @@ class TestFlags(unittest.TestCase):
def test_flags(self):
import json, subprocess
# start child process using unusual flags
- prog = ('from test.test_multiprocessing import TestFlags; ' +
+ prog = ('from test._test_multiprocessing import TestFlags; ' +
'TestFlags.run_in_child()')
data = subprocess.check_output(
[sys.executable, '-E', '-S', '-O', '-c', prog])
@@ -3445,13 +3361,14 @@ class TestTimeouts(unittest.TestCase):
class TestNoForkBomb(unittest.TestCase):
def test_noforkbomb(self):
+ sm = multiprocessing.get_start_method()
name = os.path.join(os.path.dirname(__file__), 'mp_fork_bomb.py')
- if WIN32:
- rc, out, err = test.script_helper.assert_python_failure(name)
+ if sm != 'fork':
+ rc, out, err = test.script_helper.assert_python_failure(name, sm)
self.assertEqual('', out.decode('ascii'))
self.assertIn('RuntimeError', err.decode('ascii'))
else:
- rc, out, err = test.script_helper.assert_python_ok(name)
+ rc, out, err = test.script_helper.assert_python_ok(name, sm)
self.assertEqual('123', out.decode('ascii').rstrip())
self.assertEqual('', err.decode('ascii'))
@@ -3485,6 +3402,72 @@ class TestForkAwareThreadLock(unittest.TestCase):
self.assertLessEqual(new_size, old_size)
#
+# Check that non-forked child processes do not inherit unneeded fds/handles
+#
+
+class TestCloseFds(unittest.TestCase):
+
+ def get_high_socket_fd(self):
+ if WIN32:
+ # The child process will not have any socket handles, so
+ # calling socket.fromfd() should produce WSAENOTSOCK even
+ # if there is a handle of the same number.
+ return socket.socket().detach()
+ else:
+ # We want to produce a socket with an fd high enough that a
+ # freshly created child process will not have any fds as high.
+ fd = socket.socket().detach()
+ to_close = []
+ while fd < 50:
+ to_close.append(fd)
+ fd = os.dup(fd)
+ for x in to_close:
+ os.close(x)
+ return fd
+
+ def close(self, fd):
+ if WIN32:
+ socket.socket(fileno=fd).close()
+ else:
+ os.close(fd)
+
+ @classmethod
+ def _test_closefds(cls, conn, fd):
+ try:
+ s = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
+ except Exception as e:
+ conn.send(e)
+ else:
+ s.close()
+ conn.send(None)
+
+ def test_closefd(self):
+ if not HAS_REDUCTION:
+ raise unittest.SkipTest('requires fd pickling')
+
+ reader, writer = multiprocessing.Pipe()
+ fd = self.get_high_socket_fd()
+ try:
+ p = multiprocessing.Process(target=self._test_closefds,
+ args=(writer, fd))
+ p.start()
+ writer.close()
+ e = reader.recv()
+ p.join(timeout=5)
+ finally:
+ self.close(fd)
+ writer.close()
+ reader.close()
+
+ if multiprocessing.get_start_method() == 'fork':
+ self.assertIs(e, None)
+ else:
+ WSAENOTSOCK = 10038
+ self.assertIsInstance(e, OSError)
+ self.assertTrue(e.errno == errno.EBADF or
+ e.winerror == WSAENOTSOCK, e)
+
+#
# Issue #17097: EINTR should be ignored by recv(), send(), accept() etc
#
@@ -3528,10 +3511,10 @@ class TestIgnoreEINTR(unittest.TestCase):
def handler(signum, frame):
pass
signal.signal(signal.SIGUSR1, handler)
- l = multiprocessing.connection.Listener()
- conn.send(l.address)
- a = l.accept()
- a.send('welcome')
+ with multiprocessing.connection.Listener() as l:
+ conn.send(l.address)
+ a = l.accept()
+ a.send('welcome')
@unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1')
def test_ignore_listener(self):
@@ -3552,26 +3535,221 @@ class TestIgnoreEINTR(unittest.TestCase):
finally:
conn.close()
+class TestStartMethod(unittest.TestCase):
+ def test_set_get(self):
+ multiprocessing.set_forkserver_preload(PRELOAD)
+ count = 0
+ old_method = multiprocessing.get_start_method()
+ try:
+ for method in ('fork', 'spawn', 'forkserver'):
+ try:
+ multiprocessing.set_start_method(method)
+ except ValueError:
+ continue
+ self.assertEqual(multiprocessing.get_start_method(), method)
+ count += 1
+ finally:
+ multiprocessing.set_start_method(old_method)
+ self.assertGreaterEqual(count, 1)
+
+ def test_get_all(self):
+ methods = multiprocessing.get_all_start_methods()
+ if sys.platform == 'win32':
+ self.assertEqual(methods, ['spawn'])
+ else:
+ self.assertTrue(methods == ['fork', 'spawn'] or
+ methods == ['fork', 'spawn', 'forkserver'])
+
+#
+# Check that killing process does not leak named semaphores
+#
+
+@unittest.skipIf(sys.platform == "win32",
+ "test semantics don't make sense on Windows")
+class TestSemaphoreTracker(unittest.TestCase):
+ def test_semaphore_tracker(self):
+ import subprocess
+ cmd = '''if 1:
+ import multiprocessing as mp, time, os
+ mp.set_start_method("spawn")
+ lock1 = mp.Lock()
+ lock2 = mp.Lock()
+ os.write(%d, lock1._semlock.name.encode("ascii") + b"\\n")
+ os.write(%d, lock2._semlock.name.encode("ascii") + b"\\n")
+ time.sleep(10)
+ '''
+ print("\nTestSemaphoreTracker will output warnings a bit like:\n"
+ " ... There appear to be 2 leaked semaphores"
+ " to clean up at shutdown\n"
+ " ... '/mp-03jgqz': [Errno 2] No such file or directory",
+ file=sys.stderr)
+ r, w = os.pipe()
+ p = subprocess.Popen([sys.executable,
+ #'-W', 'ignore:semaphore_tracker',
+ '-c', cmd % (w, w)],
+ pass_fds=[w])
+ os.close(w)
+ with open(r, 'rb', closefd=True) as f:
+ name1 = f.readline().rstrip().decode('ascii')
+ name2 = f.readline().rstrip().decode('ascii')
+ _multiprocessing.sem_unlink(name1)
+ p.terminate()
+ p.wait()
+ time.sleep(1.0)
+ with self.assertRaises(OSError) as ctx:
+ _multiprocessing.sem_unlink(name2)
+ # docs say it should be ENOENT, but OSX seems to give EINVAL
+ self.assertIn(ctx.exception.errno, (errno.ENOENT, errno.EINVAL))
+
#
+# Mixins
+#
+
+class ProcessesMixin(object):
+ TYPE = 'processes'
+ Process = multiprocessing.Process
+ connection = multiprocessing.connection
+ current_process = staticmethod(multiprocessing.current_process)
+ active_children = staticmethod(multiprocessing.active_children)
+ Pool = staticmethod(multiprocessing.Pool)
+ Pipe = staticmethod(multiprocessing.Pipe)
+ Queue = staticmethod(multiprocessing.Queue)
+ JoinableQueue = staticmethod(multiprocessing.JoinableQueue)
+ Lock = staticmethod(multiprocessing.Lock)
+ RLock = staticmethod(multiprocessing.RLock)
+ Semaphore = staticmethod(multiprocessing.Semaphore)
+ BoundedSemaphore = staticmethod(multiprocessing.BoundedSemaphore)
+ Condition = staticmethod(multiprocessing.Condition)
+ Event = staticmethod(multiprocessing.Event)
+ Barrier = staticmethod(multiprocessing.Barrier)
+ Value = staticmethod(multiprocessing.Value)
+ Array = staticmethod(multiprocessing.Array)
+ RawValue = staticmethod(multiprocessing.RawValue)
+ RawArray = staticmethod(multiprocessing.RawArray)
+
+
+class ManagerMixin(object):
+ TYPE = 'manager'
+ Process = multiprocessing.Process
+ Queue = property(operator.attrgetter('manager.Queue'))
+ JoinableQueue = property(operator.attrgetter('manager.JoinableQueue'))
+ Lock = property(operator.attrgetter('manager.Lock'))
+ RLock = property(operator.attrgetter('manager.RLock'))
+ Semaphore = property(operator.attrgetter('manager.Semaphore'))
+ BoundedSemaphore = property(operator.attrgetter('manager.BoundedSemaphore'))
+ Condition = property(operator.attrgetter('manager.Condition'))
+ Event = property(operator.attrgetter('manager.Event'))
+ Barrier = property(operator.attrgetter('manager.Barrier'))
+ Value = property(operator.attrgetter('manager.Value'))
+ Array = property(operator.attrgetter('manager.Array'))
+ list = property(operator.attrgetter('manager.list'))
+ dict = property(operator.attrgetter('manager.dict'))
+ Namespace = property(operator.attrgetter('manager.Namespace'))
+
+ @classmethod
+ def Pool(cls, *args, **kwds):
+ return cls.manager.Pool(*args, **kwds)
+
+ @classmethod
+ def setUpClass(cls):
+ cls.manager = multiprocessing.Manager()
+
+ @classmethod
+ def tearDownClass(cls):
+ # only the manager process should be returned by active_children()
+ # but this can take a bit on slow machines, so wait a few seconds
+ # if there are other children too (see #17395)
+ t = 0.01
+ while len(multiprocessing.active_children()) > 1 and t < 5:
+ time.sleep(t)
+ t *= 2
+ gc.collect() # do garbage collection
+ if cls.manager._number_of_objects() != 0:
+ # This is not really an error since some tests do not
+ # ensure that all processes which hold a reference to a
+ # managed object have been joined.
+ print('Shared objects which still exist at manager shutdown:')
+ print(cls.manager._debug_info())
+ cls.manager.shutdown()
+ cls.manager.join()
+ cls.manager = None
+
+
+class ThreadsMixin(object):
+ TYPE = 'threads'
+ Process = multiprocessing.dummy.Process
+ connection = multiprocessing.dummy.connection
+ current_process = staticmethod(multiprocessing.dummy.current_process)
+ active_children = staticmethod(multiprocessing.dummy.active_children)
+ Pool = staticmethod(multiprocessing.Pool)
+ Pipe = staticmethod(multiprocessing.dummy.Pipe)
+ Queue = staticmethod(multiprocessing.dummy.Queue)
+ JoinableQueue = staticmethod(multiprocessing.dummy.JoinableQueue)
+ Lock = staticmethod(multiprocessing.dummy.Lock)
+ RLock = staticmethod(multiprocessing.dummy.RLock)
+ Semaphore = staticmethod(multiprocessing.dummy.Semaphore)
+ BoundedSemaphore = staticmethod(multiprocessing.dummy.BoundedSemaphore)
+ Condition = staticmethod(multiprocessing.dummy.Condition)
+ Event = staticmethod(multiprocessing.dummy.Event)
+ Barrier = staticmethod(multiprocessing.dummy.Barrier)
+ Value = staticmethod(multiprocessing.dummy.Value)
+ Array = staticmethod(multiprocessing.dummy.Array)
+
#
+# Functions used to create test cases from the base ones in this module
#
-def setUpModule():
- if sys.platform.startswith("linux"):
- try:
- lock = multiprocessing.RLock()
- except OSError:
- raise unittest.SkipTest("OSError raises on RLock creation, "
- "see issue 3111!")
- check_enough_semaphores()
- util.get_temp_dir() # creates temp directory for use by all processes
- multiprocessing.get_logger().setLevel(LOG_LEVEL)
+def install_tests_in_module_dict(remote_globs, start_method):
+ __module__ = remote_globs['__name__']
+ local_globs = globals()
+ ALL_TYPES = {'processes', 'threads', 'manager'}
+ for name, base in local_globs.items():
+ if not isinstance(base, type):
+ continue
+ if issubclass(base, BaseTestCase):
+ if base is BaseTestCase:
+ continue
+ assert set(base.ALLOWED_TYPES) <= ALL_TYPES, base.ALLOWED_TYPES
+ for type_ in base.ALLOWED_TYPES:
+ newname = 'With' + type_.capitalize() + name[1:]
+ Mixin = local_globs[type_.capitalize() + 'Mixin']
+ class Temp(base, Mixin, unittest.TestCase):
+ pass
+ Temp.__name__ = Temp.__qualname__ = newname
+ Temp.__module__ = __module__
+ remote_globs[newname] = Temp
+ elif issubclass(base, unittest.TestCase):
+ class Temp(base, object):
+ pass
+ Temp.__name__ = Temp.__qualname__ = name
+ Temp.__module__ = __module__
+ remote_globs[name] = Temp
-def tearDownModule():
- # pause a bit so we don't get warning about dangling threads/processes
- time.sleep(0.5)
+ def setUpModule():
+ multiprocessing.set_forkserver_preload(PRELOAD)
+ remote_globs['old_start_method'] = multiprocessing.get_start_method()
+ try:
+ multiprocessing.set_start_method(start_method)
+ except ValueError:
+ raise unittest.SkipTest(start_method +
+ ' start method not supported')
+ print('Using start method %r' % multiprocessing.get_start_method())
+ if sys.platform.startswith("linux"):
+ try:
+ lock = multiprocessing.RLock()
+ except OSError:
+ raise unittest.SkipTest("OSError raises on RLock creation, "
+ "see issue 3111!")
+ check_enough_semaphores()
+ util.get_temp_dir() # creates temp directory
+ multiprocessing.get_logger().setLevel(LOG_LEVEL)
+
+ def tearDownModule():
+ multiprocessing.set_start_method(remote_globs['old_start_method'])
+ # pause a bit so we don't get warning about dangling threads/processes
+ time.sleep(0.5)
-if __name__ == '__main__':
- unittest.main()
+ remote_globs['setUpModule'] = setUpModule
+ remote_globs['tearDownModule'] = tearDownModule
diff --git a/Lib/test/badsyntax_future10.py b/Lib/test/badsyntax_future10.py
new file mode 100644
index 0000000..fa5ab67
--- /dev/null
+++ b/Lib/test/badsyntax_future10.py
@@ -0,0 +1,3 @@
+from __future__ import absolute_import
+"spam, bar, blah"
+from __future__ import print_function
diff --git a/Lib/test/bytecode_helper.py b/Lib/test/bytecode_helper.py
new file mode 100644
index 0000000..c4943cd
--- /dev/null
+++ b/Lib/test/bytecode_helper.py
@@ -0,0 +1,72 @@
+"""bytecode_helper - support tools for testing correct bytecode generation"""
+
+import unittest
+import dis
+import io
+
+_UNSPECIFIED = object()
+
+class BytecodeTestCase(unittest.TestCase):
+ """Custom assertion methods for inspecting bytecode."""
+
+ def get_disassembly_as_string(self, co):
+ s = io.StringIO()
+ dis.dis(co, file=s)
+ return s.getvalue()
+
+ def assertInstructionMatches(self, instr, expected, *, line_offset=0):
+ # Deliberately test opname first, since that gives a more
+ # meaningful error message than testing opcode
+ self.assertEqual(instr.opname, expected.opname)
+ self.assertEqual(instr.opcode, expected.opcode)
+ self.assertEqual(instr.arg, expected.arg)
+ self.assertEqual(instr.argval, expected.argval)
+ self.assertEqual(instr.argrepr, expected.argrepr)
+ self.assertEqual(instr.offset, expected.offset)
+ if expected.starts_line is None:
+ self.assertIsNone(instr.starts_line)
+ else:
+ self.assertEqual(instr.starts_line,
+ expected.starts_line + line_offset)
+ self.assertEqual(instr.is_jump_target, expected.is_jump_target)
+
+
+ def assertBytecodeExactlyMatches(self, x, expected, *, line_offset=0):
+ """Throws AssertionError if any discrepancy is found in bytecode
+
+ *x* is the object to be introspected
+ *expected* is a list of dis.Instruction objects
+
+ Set *line_offset* as appropriate to adjust for the location of the
+ object to be disassembled within the test file. If the expected list
+ assumes the first line is line 1, then an appropriate offset would be
+ ``1 - f.__code__.co_firstlineno``.
+ """
+ actual = dis.get_instructions(x, line_offset=line_offset)
+ self.assertEqual(list(actual), expected)
+
+ def assertInBytecode(self, x, opname, argval=_UNSPECIFIED):
+ """Returns instr if op is found, otherwise throws AssertionError"""
+ for instr in dis.get_instructions(x):
+ if instr.opname == opname:
+ if argval is _UNSPECIFIED or instr.argval == argval:
+ return instr
+ disassembly = self.get_disassembly_as_string(x)
+ if argval is _UNSPECIFIED:
+ msg = '%s not found in bytecode:\n%s' % (opname, disassembly)
+ else:
+ msg = '(%s,%r) not found in bytecode:\n%s'
+ msg = msg % (opname, argval, disassembly)
+ self.fail(msg)
+
+ def assertNotInBytecode(self, x, opname, argval=_UNSPECIFIED):
+ """Throws AssertionError if op is found"""
+ for instr in dis.get_instructions(x):
+ if instr.opname == opname:
+ disassembly = self.get_disassembly_as_string(co)
+ if opargval is _UNSPECIFIED:
+ msg = '%s occurs in bytecode:\n%s' % (opname, disassembly)
+ elif instr.argval == argval:
+ msg = '(%s,%r) occurs in bytecode:\n%s'
+ msg = msg % (opname, argval, disassembly)
+ self.fail(msg)
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index 3226bce..49140a5 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -619,6 +619,10 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
eq(td(hours=-.2/us_per_hour), td(0))
eq(td(days=-.4/us_per_day, hours=-.2/us_per_hour), td(microseconds=-1))
+ # Test for a patch in Issue 8860
+ eq(td(microseconds=0.5), 0.5*td(microseconds=1.0))
+ eq(td(microseconds=0.5)//td.resolution, 0.5*td.resolution//td.resolution)
+
def test_massive_normalization(self):
td = timedelta(microseconds=-1)
self.assertEqual((td.days, td.seconds, td.microseconds),
diff --git a/Lib/test/final_a.py b/Lib/test/final_a.py
new file mode 100644
index 0000000..390ee88
--- /dev/null
+++ b/Lib/test/final_a.py
@@ -0,0 +1,19 @@
+"""
+Fodder for module finalization tests in test_module.
+"""
+
+import shutil
+import test.final_b
+
+x = 'a'
+
+class C:
+ def __del__(self):
+ # Inspect module globals and builtins
+ print("x =", x)
+ print("final_b.x =", test.final_b.x)
+ print("shutil.rmtree =", getattr(shutil.rmtree, '__name__', None))
+ print("len =", getattr(len, '__name__', None))
+
+c = C()
+_underscored = C()
diff --git a/Lib/test/final_b.py b/Lib/test/final_b.py
new file mode 100644
index 0000000..7228d82
--- /dev/null
+++ b/Lib/test/final_b.py
@@ -0,0 +1,19 @@
+"""
+Fodder for module finalization tests in test_module.
+"""
+
+import shutil
+import test.final_a
+
+x = 'b'
+
+class C:
+ def __del__(self):
+ # Inspect module globals and builtins
+ print("x =", x)
+ print("final_a.x =", test.final_a.x)
+ print("shutil.rmtree =", getattr(shutil.rmtree, '__name__', None))
+ print("len =", getattr(len, '__name__', None))
+
+c = C()
+_underscored = C()
diff --git a/Lib/test/fork_wait.py b/Lib/test/fork_wait.py
index 88527df..19b54ec 100644
--- a/Lib/test/fork_wait.py
+++ b/Lib/test/fork_wait.py
@@ -28,7 +28,7 @@ class ForkWait(unittest.TestCase):
self.alive[id] = os.getpid()
try:
time.sleep(SHORTSLEEP)
- except IOError:
+ except OSError:
pass
def wait_impl(self, cpid):
diff --git a/Lib/test/keycert3.pem b/Lib/test/keycert3.pem
new file mode 100644
index 0000000..5bfa62c
--- /dev/null
+++ b/Lib/test/keycert3.pem
@@ -0,0 +1,73 @@
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMLgD0kAKDb5cFyP
+jbwNfR5CtewdXC+kMXAWD8DLxiTTvhMW7qVnlwOm36mZlszHKvsRf05lT4pegiFM
+9z2j1OlaN+ci/X7NU22TNN6crYSiN77FjYJP464j876ndSxyD+rzys386T+1r1aZ
+aggEdkj1TsSsv1zWIYKlPIjlvhuxAgMBAAECgYA0aH+T2Vf3WOPv8KdkcJg6gCRe
+yJKXOWgWRcicx/CUzOEsTxmFIDPLxqAWA3k7v0B+3vjGw5Y9lycV/5XqXNoQI14j
+y09iNsumds13u5AKkGdTJnZhQ7UKdoVHfuP44ZdOv/rJ5/VD6F4zWywpe90pcbK+
+AWDVtusgGQBSieEl1QJBAOyVrUG5l2yoUBtd2zr/kiGm/DYyXlIthQO/A3/LngDW
+5/ydGxVsT7lAVOgCsoT+0L4efTh90PjzW8LPQrPBWVMCQQDS3h/FtYYd5lfz+FNL
+9CEe1F1w9l8P749uNUD0g317zv1tatIqVCsQWHfVHNdVvfQ+vSFw38OORO00Xqs9
+1GJrAkBkoXXEkxCZoy4PteheO/8IWWLGGr6L7di6MzFl1lIqwT6D8L9oaV2vynFT
+DnKop0pa09Unhjyw57KMNmSE2SUJAkEArloTEzpgRmCq4IK2/NpCeGdHS5uqRlbh
+1VIa/xGps7EWQl5Mn8swQDel/YP3WGHTjfx7pgSegQfkyaRtGpZ9OQJAa9Vumj8m
+JAAtI0Bnga8hgQx7BhTQY4CadDxyiRGOGYhwUzYVCqkb2sbVRH9HnwUaJT7cWBY3
+RnJdHOMXWem7/w==
+-----END PRIVATE KEY-----
+Certificate:
+ Data:
+ Version: 1 (0x0)
+ Serial Number: 12723342612721443281 (0xb09264b1f2da21d1)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=XY, O=Python Software Foundation CA, CN=our-ca-server
+ Validity
+ Not Before: Jan 4 19:47:07 2013 GMT
+ Not After : Nov 13 19:47:07 2022 GMT
+ Subject: C=XY, L=Castle Anthrax, O=Python Software Foundation, CN=localhost
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (1024 bit)
+ Modulus:
+ 00:c2:e0:0f:49:00:28:36:f9:70:5c:8f:8d:bc:0d:
+ 7d:1e:42:b5:ec:1d:5c:2f:a4:31:70:16:0f:c0:cb:
+ c6:24:d3:be:13:16:ee:a5:67:97:03:a6:df:a9:99:
+ 96:cc:c7:2a:fb:11:7f:4e:65:4f:8a:5e:82:21:4c:
+ f7:3d:a3:d4:e9:5a:37:e7:22:fd:7e:cd:53:6d:93:
+ 34:de:9c:ad:84:a2:37:be:c5:8d:82:4f:e3:ae:23:
+ f3:be:a7:75:2c:72:0f:ea:f3:ca:cd:fc:e9:3f:b5:
+ af:56:99:6a:08:04:76:48:f5:4e:c4:ac:bf:5c:d6:
+ 21:82:a5:3c:88:e5:be:1b:b1
+ Exponent: 65537 (0x10001)
+ Signature Algorithm: sha1WithRSAEncryption
+ 2f:42:5f:a3:09:2c:fa:51:88:c7:37:7f:ea:0e:63:f0:a2:9a:
+ e5:5a:e2:c8:20:f0:3f:60:bc:c8:0f:b6:c6:76:ce:db:83:93:
+ f5:a3:33:67:01:8e:04:cd:00:9a:73:fd:f3:35:86:fa:d7:13:
+ e2:46:c6:9d:c0:29:53:d4:a9:90:b8:77:4b:e6:83:76:e4:92:
+ d6:9c:50:cf:43:d0:c6:01:77:61:9a:de:9b:70:f7:72:cd:59:
+ 00:31:69:d9:b4:ca:06:9c:6d:c3:c7:80:8c:68:e6:b5:a2:f8:
+ ef:1d:bb:16:9f:77:77:ef:87:62:22:9b:4d:69:a4:3a:1a:f1:
+ 21:5e:8c:32:ac:92:fd:15:6b:18:c2:7f:15:0d:98:30:ca:75:
+ 8f:1a:71:df:da:1d:b2:ef:9a:e8:2d:2e:02:fd:4a:3c:aa:96:
+ 0b:06:5d:35:b3:3d:24:87:4b:e0:b0:58:60:2f:45:ac:2e:48:
+ 8a:b0:99:10:65:27:ff:cc:b1:d8:fd:bd:26:6b:b9:0c:05:2a:
+ f4:45:63:35:51:07:ed:83:85:fe:6f:69:cb:bb:40:a8:ae:b6:
+ 3b:56:4a:2d:a4:ed:6d:11:2c:4d:ed:17:24:fd:47:bc:d3:41:
+ a2:d3:06:fe:0c:90:d8:d8:94:26:c4:ff:cc:a1:d8:42:77:eb:
+ fc:a9:94:71
+-----BEGIN CERTIFICATE-----
+MIICpDCCAYwCCQCwkmSx8toh0TANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJY
+WTEmMCQGA1UECgwdUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gQ0ExFjAUBgNV
+BAMMDW91ci1jYS1zZXJ2ZXIwHhcNMTMwMTA0MTk0NzA3WhcNMjIxMTEzMTk0NzA3
+WjBfMQswCQYDVQQGEwJYWTEXMBUGA1UEBxMOQ2FzdGxlIEFudGhyYXgxIzAhBgNV
+BAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMRIwEAYDVQQDEwlsb2NhbGhv
+c3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMLgD0kAKDb5cFyPjbwNfR5C
+tewdXC+kMXAWD8DLxiTTvhMW7qVnlwOm36mZlszHKvsRf05lT4pegiFM9z2j1Ola
+N+ci/X7NU22TNN6crYSiN77FjYJP464j876ndSxyD+rzys386T+1r1aZaggEdkj1
+TsSsv1zWIYKlPIjlvhuxAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAC9CX6MJLPpR
+iMc3f+oOY/CimuVa4sgg8D9gvMgPtsZ2ztuDk/WjM2cBjgTNAJpz/fM1hvrXE+JG
+xp3AKVPUqZC4d0vmg3bkktacUM9D0MYBd2Ga3ptw93LNWQAxadm0ygacbcPHgIxo
+5rWi+O8duxafd3fvh2Iim01ppDoa8SFejDKskv0VaxjCfxUNmDDKdY8acd/aHbLv
+mugtLgL9SjyqlgsGXTWzPSSHS+CwWGAvRawuSIqwmRBlJ//Msdj9vSZruQwFKvRF
+YzVRB+2Dhf5vacu7QKiutjtWSi2k7W0RLE3tFyT9R7zTQaLTBv4MkNjYlCbE/8yh
+2EJ36/yplHE=
+-----END CERTIFICATE-----
diff --git a/Lib/test/keycert4.pem b/Lib/test/keycert4.pem
new file mode 100644
index 0000000..53355c8
--- /dev/null
+++ b/Lib/test/keycert4.pem
@@ -0,0 +1,73 @@
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAK5UQiMI5VkNs2Qv
+L7gUaiDdFevNUXRjU4DHAe3ZzzYLZNE69h9gO9VCSS16tJ5fT5VEu0EZyGr0e3V2
+NkX0ZoU0Hc/UaY4qx7LHmn5SYZpIxhJnkf7SyHJK1zUaGlU0/LxYqIuGCtF5dqx1
+L2OQhEx1GM6RydHdgX69G64LXcY5AgMBAAECgYAhsRMfJkb9ERLMl/oG/5sLQu9L
+pWDKt6+ZwdxzlZbggQ85CMYshjLKIod2DLL/sLf2x1PRXyRG131M1E3k8zkkz6de
+R1uDrIN/x91iuYzfLQZGh8bMY7Yjd2eoroa6R/7DjpElGejLxOAaDWO0ST2IFQy9
+myTGS2jSM97wcXfsSQJBANP3jelJoS5X6BRjTSneY21wcocxVuQh8pXpErALVNsT
+drrFTeaBuZp7KvbtnIM5g2WRNvaxLZlAY/hXPJvi6ncCQQDSix1cebml6EmPlEZS
+Mm8gwI2F9ufUunwJmBJcz826Do0ZNGByWDAM/JQZH4FX4GfAFNuj8PUb+GQfadkx
+i1DPAkEA0lVsNHojvuDsIo8HGuzarNZQT2beWjJ1jdxh9t7HrTx7LIps6rb/fhOK
+Zs0R6gVAJaEbcWAPZ2tFyECInAdnsQJAUjaeXXjuxFkjOFym5PvqpvhpivEx78Bu
+JPTr3rAKXmfGMxxfuOa0xK1wSyshP6ZR/RBn/+lcXPKubhHQDOegwwJAJF1DBQnN
++/tLmOPULtDwfP4Zixn+/8GmGOahFoRcu6VIGHmRilJTn6MOButw7Glv2YdeC6l/
+e83Gq6ffLVfKNQ==
+-----END PRIVATE KEY-----
+Certificate:
+ Data:
+ Version: 1 (0x0)
+ Serial Number: 12723342612721443282 (0xb09264b1f2da21d2)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=XY, O=Python Software Foundation CA, CN=our-ca-server
+ Validity
+ Not Before: Jan 4 19:47:07 2013 GMT
+ Not After : Nov 13 19:47:07 2022 GMT
+ Subject: C=XY, L=Castle Anthrax, O=Python Software Foundation, CN=fakehostname
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (1024 bit)
+ Modulus:
+ 00:ae:54:42:23:08:e5:59:0d:b3:64:2f:2f:b8:14:
+ 6a:20:dd:15:eb:cd:51:74:63:53:80:c7:01:ed:d9:
+ cf:36:0b:64:d1:3a:f6:1f:60:3b:d5:42:49:2d:7a:
+ b4:9e:5f:4f:95:44:bb:41:19:c8:6a:f4:7b:75:76:
+ 36:45:f4:66:85:34:1d:cf:d4:69:8e:2a:c7:b2:c7:
+ 9a:7e:52:61:9a:48:c6:12:67:91:fe:d2:c8:72:4a:
+ d7:35:1a:1a:55:34:fc:bc:58:a8:8b:86:0a:d1:79:
+ 76:ac:75:2f:63:90:84:4c:75:18:ce:91:c9:d1:dd:
+ 81:7e:bd:1b:ae:0b:5d:c6:39
+ Exponent: 65537 (0x10001)
+ Signature Algorithm: sha1WithRSAEncryption
+ ad:45:8a:8e:ef:c6:ef:04:41:5c:2c:4a:84:dc:02:76:0c:d0:
+ 66:0f:f0:16:04:58:4d:fd:68:b7:b8:d3:a8:41:a5:5c:3c:6f:
+ 65:3c:d1:f8:ce:43:35:e7:41:5f:53:3d:c9:2c:c3:7d:fc:56:
+ 4a:fa:47:77:38:9d:bb:97:28:0a:3b:91:19:7f:bc:74:ae:15:
+ 6b:bd:20:36:67:45:a5:1e:79:d7:75:e6:89:5c:6d:54:84:d1:
+ 95:d7:a7:b4:33:3c:af:37:c4:79:8f:5e:75:dc:75:c2:18:fb:
+ 61:6f:2d:dc:38:65:5b:ba:67:28:d0:88:d7:8d:b9:23:5a:8e:
+ e8:c6:bb:db:ce:d5:b8:41:2a:ce:93:08:b6:95:ad:34:20:18:
+ d5:3b:37:52:74:50:0b:07:2c:b0:6d:a4:4c:7b:f4:e0:fd:d1:
+ af:17:aa:20:cd:62:e3:f0:9d:37:69:db:41:bd:d4:1c:fb:53:
+ 20:da:88:9d:76:26:67:ce:01:90:a7:80:1d:a9:5b:39:73:68:
+ 54:0a:d1:2a:03:1b:8f:3c:43:5d:5d:c4:51:f1:a7:e7:11:da:
+ 31:2c:49:06:af:04:f4:b8:3c:99:c4:20:b9:06:36:a2:00:92:
+ 61:1d:0c:6d:24:05:e2:82:e1:47:db:a0:5f:ba:b9:fb:ba:fa:
+ 49:12:1e:ce
+-----BEGIN CERTIFICATE-----
+MIICpzCCAY8CCQCwkmSx8toh0jANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJY
+WTEmMCQGA1UECgwdUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gQ0ExFjAUBgNV
+BAMMDW91ci1jYS1zZXJ2ZXIwHhcNMTMwMTA0MTk0NzA3WhcNMjIxMTEzMTk0NzA3
+WjBiMQswCQYDVQQGEwJYWTEXMBUGA1UEBxMOQ2FzdGxlIEFudGhyYXgxIzAhBgNV
+BAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMRUwEwYDVQQDEwxmYWtlaG9z
+dG5hbWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAK5UQiMI5VkNs2QvL7gU
+aiDdFevNUXRjU4DHAe3ZzzYLZNE69h9gO9VCSS16tJ5fT5VEu0EZyGr0e3V2NkX0
+ZoU0Hc/UaY4qx7LHmn5SYZpIxhJnkf7SyHJK1zUaGlU0/LxYqIuGCtF5dqx1L2OQ
+hEx1GM6RydHdgX69G64LXcY5AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAK1Fio7v
+xu8EQVwsSoTcAnYM0GYP8BYEWE39aLe406hBpVw8b2U80fjOQzXnQV9TPcksw338
+Vkr6R3c4nbuXKAo7kRl/vHSuFWu9IDZnRaUeedd15olcbVSE0ZXXp7QzPK83xHmP
+XnXcdcIY+2FvLdw4ZVu6ZyjQiNeNuSNajujGu9vO1bhBKs6TCLaVrTQgGNU7N1J0
+UAsHLLBtpEx79OD90a8XqiDNYuPwnTdp20G91Bz7UyDaiJ12JmfOAZCngB2pWzlz
+aFQK0SoDG488Q11dxFHxp+cR2jEsSQavBPS4PJnEILkGNqIAkmEdDG0kBeKC4Ufb
+oF+6ufu6+kkSHs4=
+-----END CERTIFICATE-----
diff --git a/Lib/test/leakers/test_gestalt.py b/Lib/test/leakers/test_gestalt.py
deleted file mode 100644
index e0081c1..0000000
--- a/Lib/test/leakers/test_gestalt.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import sys
-
-if sys.platform != 'darwin':
- raise ValueError("This test only leaks on Mac OS X")
-
-def leak():
- # taken from platform._mac_ver_lookup()
- from gestalt import gestalt
- import MacOS
-
- try:
- gestalt('sysu')
- except MacOS.Error:
- pass
diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py
index bfbf44e..1a24bde 100644
--- a/Lib/test/lock_tests.py
+++ b/Lib/test/lock_tests.py
@@ -80,6 +80,11 @@ class BaseLockTests(BaseTestCase):
lock = self.locktype()
del lock
+ def test_repr(self):
+ lock = self.locktype()
+ repr(lock)
+ del lock
+
def test_acquire_destroy(self):
lock = self.locktype()
lock.acquire()
diff --git a/Lib/test/make_ssl_certs.py b/Lib/test/make_ssl_certs.py
index 48d2e57..f630813 100644
--- a/Lib/test/make_ssl_certs.py
+++ b/Lib/test/make_ssl_certs.py
@@ -2,6 +2,7 @@
and friends."""
import os
+import shutil
import sys
import tempfile
from subprocess import *
@@ -20,11 +21,52 @@ req_template = """
[req_x509_extensions]
subjectAltName = DNS:{hostname}
+
+ [ ca ]
+ default_ca = CA_default
+
+ [ CA_default ]
+ dir = cadir
+ database = $dir/index.txt
+ default_md = sha1
+ default_days = 3600
+ certificate = pycacert.pem
+ private_key = pycakey.pem
+ serial = $dir/serial
+ RANDFILE = $dir/.rand
+
+ policy = policy_match
+
+ [ policy_match ]
+ countryName = match
+ stateOrProvinceName = optional
+ organizationName = match
+ organizationalUnitName = optional
+ commonName = supplied
+ emailAddress = optional
+
+ [ policy_anything ]
+ countryName = optional
+ stateOrProvinceName = optional
+ localityName = optional
+ organizationName = optional
+ organizationalUnitName = optional
+ commonName = supplied
+ emailAddress = optional
+
+
+ [ v3_ca ]
+
+ subjectKeyIdentifier=hash
+ authorityKeyIdentifier=keyid:always,issuer
+ basicConstraints = CA:true
+
"""
here = os.path.abspath(os.path.dirname(__file__))
-def make_cert_key(hostname):
+def make_cert_key(hostname, sign=False):
+ print("creating cert for " + hostname)
tempnames = []
for i in range(3):
with tempfile.NamedTemporaryFile(delete=False) as f:
@@ -33,10 +75,25 @@ def make_cert_key(hostname):
try:
with open(req_file, 'w') as f:
f.write(req_template.format(hostname=hostname))
- args = ['req', '-new', '-days', '3650', '-nodes', '-x509',
+ args = ['req', '-new', '-days', '3650', '-nodes',
'-newkey', 'rsa:1024', '-keyout', key_file,
- '-out', cert_file, '-config', req_file]
+ '-config', req_file]
+ if sign:
+ with tempfile.NamedTemporaryFile(delete=False) as f:
+ tempnames.append(f.name)
+ reqfile = f.name
+ args += ['-out', reqfile ]
+
+ else:
+ args += ['-x509', '-out', cert_file ]
check_call(['openssl'] + args)
+
+ if sign:
+ args = ['ca', '-config', req_file, '-out', cert_file, '-outdir', 'cadir',
+ '-policy', 'policy_anything', '-batch', '-infiles', reqfile ]
+ check_call(['openssl'] + args)
+
+
with open(cert_file, 'r') as f:
cert = f.read()
with open(key_file, 'r') as f:
@@ -46,6 +103,32 @@ def make_cert_key(hostname):
for name in tempnames:
os.remove(name)
+TMP_CADIR = 'cadir'
+
+def unmake_ca():
+ shutil.rmtree(TMP_CADIR)
+
+def make_ca():
+ os.mkdir(TMP_CADIR)
+ with open(os.path.join('cadir','index.txt'),'a+') as f:
+ pass # empty file
+ with open(os.path.join('cadir','index.txt.attr'),'w+') as f:
+ f.write('unique_subject = no')
+
+ with tempfile.NamedTemporaryFile("w") as t:
+ t.write(req_template.format(hostname='our-ca-server'))
+ t.flush()
+ with tempfile.NamedTemporaryFile() as f:
+ args = ['req', '-new', '-days', '3650', '-extensions', 'v3_ca', '-nodes',
+ '-newkey', 'rsa:2048', '-keyout', 'pycakey.pem',
+ '-out', f.name,
+ '-subj', '/C=XY/L=Castle Anthrax/O=Python Software Foundation CA/CN=our-ca-server']
+ check_call(['openssl'] + args)
+ args = ['ca', '-config', t.name, '-create_serial',
+ '-out', 'pycacert.pem', '-batch', '-outdir', TMP_CADIR,
+ '-keyfile', 'pycakey.pem', '-days', '3650',
+ '-selfsign', '-extensions', 'v3_ca', '-infiles', f.name ]
+ check_call(['openssl'] + args)
if __name__ == '__main__':
os.chdir(here)
@@ -54,11 +137,34 @@ if __name__ == '__main__':
f.write(cert)
with open('ssl_key.pem', 'w') as f:
f.write(key)
+ print("password protecting ssl_key.pem in ssl_key.passwd.pem")
+ check_call(['openssl','rsa','-in','ssl_key.pem','-out','ssl_key.passwd.pem','-des3','-passout','pass:somepass'])
+ check_call(['openssl','rsa','-in','ssl_key.pem','-out','keycert.passwd.pem','-des3','-passout','pass:somepass'])
+
with open('keycert.pem', 'w') as f:
f.write(key)
f.write(cert)
+
+ with open('keycert.passwd.pem', 'a+') as f:
+ f.write(cert)
+
# For certificate matching tests
+ make_ca()
cert, key = make_cert_key('fakehostname')
with open('keycert2.pem', 'w') as f:
f.write(key)
f.write(cert)
+
+ cert, key = make_cert_key('localhost', True)
+ with open('keycert3.pem', 'w') as f:
+ f.write(key)
+ f.write(cert)
+
+ cert, key = make_cert_key('fakehostname', True)
+ with open('keycert4.pem', 'w') as f:
+ f.write(key)
+ f.write(cert)
+
+ unmake_ca()
+ print("\n\nPlease change the values in test_ssl.py, test_parse_cert function related to notAfter,notBefore and serialNumber")
+ check_call(['openssl','x509','-in','keycert.pem','-dates','-serial','-noout'])
diff --git a/Lib/test/mock_socket.py b/Lib/test/mock_socket.py
index d09e78c..8ef0ec8 100644
--- a/Lib/test/mock_socket.py
+++ b/Lib/test/mock_socket.py
@@ -140,12 +140,8 @@ def gethostbyname(name):
return ""
-class gaierror(Exception):
- pass
-
-
-class error(Exception):
- pass
+gaierror = socket_module.gaierror
+error = socket_module.error
# Constants
diff --git a/Lib/test/mp_fork_bomb.py b/Lib/test/mp_fork_bomb.py
index 908afe3..017e010 100644
--- a/Lib/test/mp_fork_bomb.py
+++ b/Lib/test/mp_fork_bomb.py
@@ -7,6 +7,11 @@ def foo():
# correctly on Windows. However, we should get a RuntimeError rather
# than the Windows equivalent of a fork bomb.
+if len(sys.argv) > 1:
+ multiprocessing.set_start_method(sys.argv[1])
+else:
+ multiprocessing.set_start_method('spawn')
+
p = multiprocessing.Process(target=foo)
p.start()
p.join()
diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py
index 26bac7b..dcaae7b 100644
--- a/Lib/test/multibytecodec_support.py
+++ b/Lib/test/multibytecodec_support.py
@@ -282,7 +282,7 @@ class TestBase_Mapping(unittest.TestCase):
unittest.TestCase.__init__(self, *args, **kw)
try:
self.open_mapping_file().close() # test it to report the error early
- except (IOError, HTTPException):
+ except (OSError, HTTPException):
self.skipTest("Could not retrieve "+self.mapfileurl)
def open_mapping_file(self):
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 3423462..7e6e758 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -601,30 +601,6 @@ class AbstractPickleTests(unittest.TestCase):
self.assertRaises(KeyError, self.loads, b'g0\np0')
self.assertEqual(self.loads(b'((Kdtp0\nh\x00l.))'), [(100,), (100,)])
- def test_insecure_strings(self):
- # XXX Some of these tests are temporarily disabled
- insecure = [b"abc", b"2 + 2", # not quoted
- ## b"'abc' + 'def'", # not a single quoted string
- b"'abc", # quote is not closed
- b"'abc\"", # open quote and close quote don't match
- b"'abc' ?", # junk after close quote
- b"'\\'", # trailing backslash
- # Variations on issue #17710
- b"'",
- b'"',
- b"' ",
- b"' ",
- b"' ",
- b"' ",
- b'" ',
- # some tests of the quoting rules
- ## b"'abc\"\''",
- ## b"'\\\\a\'\'\'\\\'\\\\\''",
- ]
- for b in insecure:
- buf = b"S" + b + b"\012p0\012."
- self.assertRaises(ValueError, self.loads, buf)
-
def test_unicode(self):
endcases = ['', '<\\u>', '<\\\u1234>', '<\n>',
'<\\>', '<\\\U00012345>',
@@ -1214,6 +1190,35 @@ class AbstractPickleTests(unittest.TestCase):
dumped = b'\x80\x03X\x01\x00\x00\x00ar\xff\xff\xff\xff.'
self.assertRaises(ValueError, self.loads, dumped)
+ def test_badly_escaped_string(self):
+ self.assertRaises(ValueError, self.loads, b"S'\\'\n.")
+
+ def test_badly_quoted_string(self):
+ # Issue #17710
+ badpickles = [b"S'\n.",
+ b'S"\n.',
+ b'S\' \n.',
+ b'S" \n.',
+ b'S\'"\n.',
+ b'S"\'\n.',
+ b"S' ' \n.",
+ b'S" " \n.',
+ b"S ''\n.",
+ b'S ""\n.',
+ b'S \n.',
+ b'S\n.',
+ b'S.']
+ for p in badpickles:
+ self.assertRaises(pickle.UnpicklingError, self.loads, p)
+
+ def test_correctly_quoted_string(self):
+ goodpickles = [(b"S''\n.", ''),
+ (b'S""\n.', ''),
+ (b'S"\\n"\n.', '\n'),
+ (b"S'\\n'\n.", '\n')]
+ for p, expected in goodpickles:
+ self.assertEqual(self.loads(p), expected)
+
def _check_pickling_with_opcode(self, obj, opcode, proto):
pickled = self.dumps(obj, proto)
self.assertTrue(opcode_in_pickle(opcode, pickled))
diff --git a/Lib/test/pycacert.pem b/Lib/test/pycacert.pem
new file mode 100644
index 0000000..09b1f3e
--- /dev/null
+++ b/Lib/test/pycacert.pem
@@ -0,0 +1,78 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 12723342612721443280 (0xb09264b1f2da21d0)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=XY, O=Python Software Foundation CA, CN=our-ca-server
+ Validity
+ Not Before: Jan 4 19:47:07 2013 GMT
+ Not After : Jan 2 19:47:07 2023 GMT
+ Subject: C=XY, O=Python Software Foundation CA, CN=our-ca-server
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:e7:de:e9:e3:0c:9f:00:b6:a1:fd:2b:5b:96:d2:
+ 6f:cc:e0:be:86:b9:20:5e:ec:03:7a:55:ab:ea:a4:
+ e9:f9:49:85:d2:66:d5:ed:c7:7a:ea:56:8e:2d:8f:
+ e7:42:e2:62:28:a9:9f:d6:1b:8e:eb:b5:b4:9c:9f:
+ 14:ab:df:e6:94:8b:76:1d:3e:6d:24:61:ed:0c:bf:
+ 00:8a:61:0c:df:5c:c8:36:73:16:00:cd:47:ba:6d:
+ a4:a4:74:88:83:23:0a:19:fc:09:a7:3c:4a:4b:d3:
+ e7:1d:2d:e4:ea:4c:54:21:f3:26:db:89:37:18:d4:
+ 02:bb:40:32:5f:a4:ff:2d:1c:f7:d4:bb:ec:8e:cf:
+ 5c:82:ac:e6:7c:08:6c:48:85:61:07:7f:25:e0:5c:
+ e0:bc:34:5f:e0:b9:04:47:75:c8:47:0b:8d:bc:d6:
+ c8:68:5f:33:83:62:d2:20:44:35:b1:ad:81:1a:8a:
+ cd:bc:35:b0:5c:8b:47:d6:18:e9:9c:18:97:cc:01:
+ 3c:29:cc:e8:1e:e4:e4:c1:b8:de:e7:c2:11:18:87:
+ 5a:93:34:d8:a6:25:f7:14:71:eb:e4:21:a2:d2:0f:
+ 2e:2e:d4:62:00:35:d3:d6:ef:5c:60:4b:4c:a9:14:
+ e2:dd:15:58:46:37:33:26:b7:e7:2e:5d:ed:42:e4:
+ c5:4d
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ BC:DD:62:D9:76:DA:1B:D2:54:6B:CF:E0:66:9B:1E:1E:7B:56:0C:0B
+ X509v3 Authority Key Identifier:
+ keyid:BC:DD:62:D9:76:DA:1B:D2:54:6B:CF:E0:66:9B:1E:1E:7B:56:0C:0B
+
+ X509v3 Basic Constraints:
+ CA:TRUE
+ Signature Algorithm: sha1WithRSAEncryption
+ 7d:0a:f5:cb:8d:d3:5d:bd:99:8e:f8:2b:0f:ba:eb:c2:d9:a6:
+ 27:4f:2e:7b:2f:0e:64:d8:1c:35:50:4e:ee:fc:90:b9:8d:6d:
+ a8:c5:c6:06:b0:af:f3:2d:bf:3b:b8:42:07:dd:18:7d:6d:95:
+ 54:57:85:18:60:47:2f:eb:78:1b:f9:e8:17:fd:5a:0d:87:17:
+ 28:ac:4c:6a:e6:bc:29:f4:f4:55:70:29:42:de:85:ea:ab:6c:
+ 23:06:64:30:75:02:8e:53:bc:5e:01:33:37:cc:1e:cd:b8:a4:
+ fd:ca:e4:5f:65:3b:83:1c:86:f1:55:02:a0:3a:8f:db:91:b7:
+ 40:14:b4:e7:8d:d2:ee:73:ba:e3:e5:34:2d:bc:94:6f:4e:24:
+ 06:f7:5f:8b:0e:a7:8e:6b:de:5e:75:f4:32:9a:50:b1:44:33:
+ 9a:d0:05:e2:78:82:ff:db:da:8a:63:eb:a9:dd:d1:bf:a0:61:
+ ad:e3:9e:8a:24:5d:62:0e:e7:4c:91:7f:ef:df:34:36:3b:2f:
+ 5d:f5:84:b2:2f:c4:6d:93:96:1a:6f:30:28:f1:da:12:9a:64:
+ b4:40:33:1d:bd:de:2b:53:a8:ea:be:d6:bc:4e:96:f5:44:fb:
+ 32:18:ae:d5:1f:f6:69:af:b6:4e:7b:1d:58:ec:3b:a9:53:a3:
+ 5e:58:c8:9e
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIJALCSZLHy2iHQMA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV
+BAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBDQTEW
+MBQGA1UEAwwNb3VyLWNhLXNlcnZlcjAeFw0xMzAxMDQxOTQ3MDdaFw0yMzAxMDIx
+OTQ3MDdaME0xCzAJBgNVBAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUg
+Rm91bmRhdGlvbiBDQTEWMBQGA1UEAwwNb3VyLWNhLXNlcnZlcjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAOfe6eMMnwC2of0rW5bSb8zgvoa5IF7sA3pV
+q+qk6flJhdJm1e3HeupWji2P50LiYiipn9Ybjuu1tJyfFKvf5pSLdh0+bSRh7Qy/
+AIphDN9cyDZzFgDNR7ptpKR0iIMjChn8Cac8SkvT5x0t5OpMVCHzJtuJNxjUArtA
+Ml+k/y0c99S77I7PXIKs5nwIbEiFYQd/JeBc4Lw0X+C5BEd1yEcLjbzWyGhfM4Ni
+0iBENbGtgRqKzbw1sFyLR9YY6ZwYl8wBPCnM6B7k5MG43ufCERiHWpM02KYl9xRx
+6+QhotIPLi7UYgA109bvXGBLTKkU4t0VWEY3Mya35y5d7ULkxU0CAwEAAaNQME4w
+HQYDVR0OBBYEFLzdYtl22hvSVGvP4GabHh57VgwLMB8GA1UdIwQYMBaAFLzdYtl2
+2hvSVGvP4GabHh57VgwLMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AH0K9cuN0129mY74Kw+668LZpidPLnsvDmTYHDVQTu78kLmNbajFxgawr/Mtvzu4
+QgfdGH1tlVRXhRhgRy/reBv56Bf9Wg2HFyisTGrmvCn09FVwKULeheqrbCMGZDB1
+Ao5TvF4BMzfMHs24pP3K5F9lO4MchvFVAqA6j9uRt0AUtOeN0u5zuuPlNC28lG9O
+JAb3X4sOp45r3l519DKaULFEM5rQBeJ4gv/b2opj66nd0b+gYa3jnookXWIO50yR
+f+/fNDY7L131hLIvxG2TlhpvMCjx2hKaZLRAMx293itTqOq+1rxOlvVE+zIYrtUf
+9mmvtk57HVjsO6lTo15YyJ4=
+-----END CERTIFICATE-----
diff --git a/Lib/test/pycakey.pem b/Lib/test/pycakey.pem
new file mode 100644
index 0000000..fc6effe
--- /dev/null
+++ b/Lib/test/pycakey.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDn3unjDJ8AtqH9
+K1uW0m/M4L6GuSBe7AN6VavqpOn5SYXSZtXtx3rqVo4tj+dC4mIoqZ/WG47rtbSc
+nxSr3+aUi3YdPm0kYe0MvwCKYQzfXMg2cxYAzUe6baSkdIiDIwoZ/AmnPEpL0+cd
+LeTqTFQh8ybbiTcY1AK7QDJfpP8tHPfUu+yOz1yCrOZ8CGxIhWEHfyXgXOC8NF/g
+uQRHdchHC4281shoXzODYtIgRDWxrYEais28NbBci0fWGOmcGJfMATwpzOge5OTB
+uN7nwhEYh1qTNNimJfcUcevkIaLSDy4u1GIANdPW71xgS0ypFOLdFVhGNzMmt+cu
+Xe1C5MVNAgMBAAECggEBAJPM7QuUrPn4cLN/Ysd15lwTWn9oHDFFgkYFvCs66gXE
+ju/6Kx2BjWE4wTJby09AHM/MqB0DvguT7Mf1Q2j3tPQ1HZowg8OwRDleuwp6KIls
+jBbhL0Jdl/5HC67ktWvZ9wNvO/wFG1rQfT6FVajf9LUbWEaSZbOG2SLhHfsHorzu
+xjTJaI3bQ/0+79B1exwk5ruwhzFRd/XpY8hls7D/RfPIuHDlBghkW3N59KFWrf5h
+6bNEh2THm0+IyGcGqs0FD+QCOXyvsjwSUswqrr2ctLREOeDcd5ReUjSxYgjcJRrm
+J7ceIY/+uwDJxw/OlnmBvF6pQMkKwYW2gFztu+g2t4UCgYEA/9yo01Exz4crxXsy
+tAlnDJM++nZcm07rtFjTKHUfKY/cCgNTa8udM0svnfwlid/dpgLsI38gx04HHC1i
+EZ4acz+ToIWedLxM0nq73//xeRWEazOvCz1mMTZaMldahTWAyzN8qVK2B/625Yy4
+wNYWyweBBwEB8MzaCs73spksXOsCgYEA5/7wvhiofYGFAfMuANeJIwDL2OtBnoOv
+mVNfCmi3GC38fzwyi5ZpskWDiS2woJ+LQfs9Qu4EcZbUFLd7gbeOvb5gmFUtYope
+LitUUKunIR18MkQ+mQDBpQPQPhk4QJP5reCbWkrfTu7b5o/iS41s6fBTFmuzhLcT
+C71vFdCyeKcCgYAiCCqYeOtELDmBOeLDmaCQRqGQ1N96dOPbCBmF/xYXBCCDYG/f
+HaUaJnz96YTgstsbcrYP/p/Qgqtlbw/lQf9IpwMuzbcG1ejt8g89OyDWNyt2ytgU
+iaUnFJCos3/Byh0Iah/BsdOueo2/OJl2ZMOBW80orlSgv86cs2y037TL4wKBgQDm
+OOyW+MlbowhnIvfoBfwlLEkefnej4nKD6WRLZBcue5Qyf355X06Mhsc9foXlH+6G
+D9h/bswiHNdhp6N82rdgPGiHQx/CxiUoE/+b/nvgNO5mw6qLE2EXbG1e8pAMJcyE
+bHw+YkawggDfELI036fRj5gki8SeUz8nS1nNgElbyQKBgCRDX9Jh+MwSLu4QBWdt
+/fi+lv3K6kun/fI7EOV1vCV/j871tICu7pu5BrOLxAHqoVfU9AUX299/2KjCb5pv
+kjogiUK6qWCWBlfuqDNWGCoUGt1rhznUva0nNjSMy5rinBhhjpROZC2pw48lOluP
+UuvXsaPph7GTqPuy4Kab12YC
+-----END PRIVATE KEY-----
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index ae62c6e..b9945d7 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -1,11 +1,18 @@
#! /usr/bin/env python3
"""
-Usage:
+Script to run Python regression tests.
+Run this script with -h or --help for documentation.
+"""
+
+USAGE = """\
python -m test [options] [test_name1 [test_name2 ...]]
python path/to/Lib/test/regrtest.py [options] [test_name1 [test_name2 ...]]
+"""
+DESCRIPTION = """\
+Run Python regression tests.
If no arguments or options are provided, finds all files matching
the pattern "test_*" in the Lib/test subdirectory and runs
@@ -15,63 +22,10 @@ For more rigorous testing, it is useful to use the following
command line:
python -E -Wd -m test [options] [test_name1 ...]
+"""
-
-Options:
-
--h/--help -- print this text and exit
---timeout TIMEOUT
- -- dump the traceback and exit if a test takes more
- than TIMEOUT seconds; disabled if TIMEOUT is negative
- or equals to zero
---wait -- wait for user input, e.g., allow a debugger to be attached
-
-Verbosity
-
--v/--verbose -- run tests in verbose mode with output to stdout
--w/--verbose2 -- re-run failed tests in verbose mode
--W/--verbose3 -- display test output on failure
--d/--debug -- print traceback for failed tests
--q/--quiet -- no output unless one or more tests fail
--o/--slow -- print the slowest 10 tests
- --header -- print header with interpreter info
-
-Selecting tests
-
--r/--randomize -- randomize test execution order (see below)
- --randseed -- pass a random seed to reproduce a previous random run
--f/--fromfile -- read names of tests to run from a file (see below)
--x/--exclude -- arguments are tests to *exclude*
--s/--single -- single step through a set of tests (see below)
--m/--match PAT -- match test cases and methods with glob pattern PAT
--G/--failfast -- fail as soon as a test fails (only with -v or -W)
--u/--use RES1,RES2,...
- -- specify which special resource intensive tests to run
--M/--memlimit LIMIT
- -- run very large memory-consuming tests
- --testdir DIR
- -- execute test files in the specified directory (instead
- of the Python stdlib test suite)
-
-Special runs
-
--l/--findleaks -- if GC is available detect tests that leak memory
--L/--runleaks -- run the leaks(1) command just before exit
--R/--huntrleaks RUNCOUNTS
- -- search for reference leaks (needs debug build, v. slow)
--j/--multiprocess PROCESSES
- -- run PROCESSES processes at once
--T/--coverage -- turn on code coverage tracing using the trace module
--D/--coverdir DIRECTORY
- -- Directory where coverage files are put
--N/--nocoverdir -- Put coverage files alongside modules
--t/--threshold THRESHOLD
- -- call gc.set_threshold(THRESHOLD)
--n/--nowindows -- suppress error message boxes on Windows
--F/--forever -- run the specified tests in a loop, until an error happens
-
-
-Additional Option Details:
+EPILOG = """\
+Additional option details:
-r randomizes test execution order. You can use --randseed=int to provide a
int seed value for the randomizer; this is useful for reproducing troublesome
@@ -168,11 +122,12 @@ option '-uall,-gui'.
# We import importlib *ASAP* in order to test #15386
import importlib
+import argparse
import builtins
import faulthandler
-import getopt
import io
import json
+import locale
import logging
import os
import platform
@@ -194,7 +149,7 @@ try:
except ImportError:
threading = None
try:
- import multiprocessing.process
+ import _multiprocessing, multiprocessing.process
except ImportError:
multiprocessing = None
@@ -246,12 +201,147 @@ from test import support
RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network',
'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui')
-TEMPDIR = os.path.abspath(tempfile.gettempdir())
-
-def usage(msg):
- print(msg, file=sys.stderr)
- print("Use --help for usage", file=sys.stderr)
- sys.exit(2)
+# When tests are run from the Python build directory, it is best practice
+# to keep the test files in a subfolder. This eases the cleanup of leftover
+# files using the "make distclean" command.
+if sysconfig.is_python_build():
+ TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
+else:
+ TEMPDIR = tempfile.gettempdir()
+TEMPDIR = os.path.abspath(TEMPDIR)
+
+class _ArgParser(argparse.ArgumentParser):
+
+ def error(self, message):
+ super().error(message + "\nPass -h or --help for complete help.")
+
+def _create_parser():
+ # Set prog to prevent the uninformative "__main__.py" from displaying in
+ # error messages when using "python -m test ...".
+ parser = _ArgParser(prog='regrtest.py',
+ usage=USAGE,
+ description=DESCRIPTION,
+ epilog=EPILOG,
+ add_help=False,
+ formatter_class=argparse.RawDescriptionHelpFormatter)
+
+ # Arguments with this clause added to its help are described further in
+ # the epilog's "Additional option details" section.
+ more_details = ' See the section at bottom for more details.'
+
+ group = parser.add_argument_group('General options')
+ # We add help explicitly to control what argument group it renders under.
+ group.add_argument('-h', '--help', action='help',
+ help='show this help message and exit')
+ group.add_argument('--timeout', metavar='TIMEOUT',
+ help='dump the traceback and exit if a test takes '
+ 'more than TIMEOUT seconds; disabled if TIMEOUT '
+ 'is negative or equals to zero')
+ group.add_argument('--wait', action='store_true', help='wait for user '
+ 'input, e.g., allow a debugger to be attached')
+ group.add_argument('--slaveargs', metavar='ARGS')
+ group.add_argument('-S', '--start', metavar='START', help='the name of '
+ 'the test at which to start.' + more_details)
+
+ group = parser.add_argument_group('Verbosity')
+ group.add_argument('-v', '--verbose', action='store_true',
+ help='run tests in verbose mode with output to stdout')
+ group.add_argument('-w', '--verbose2', action='store_true',
+ help='re-run failed tests in verbose mode')
+ group.add_argument('-W', '--verbose3', action='store_true',
+ help='display test output on failure')
+ group.add_argument('-d', '--debug', action='store_true',
+ help='print traceback for failed tests')
+ group.add_argument('-q', '--quiet', action='store_true',
+ help='no output unless one or more tests fail')
+ group.add_argument('-o', '--slow', action='store_true',
+ help='print the slowest 10 tests')
+ group.add_argument('--header', action='store_true',
+ help='print header with interpreter info')
+
+ group = parser.add_argument_group('Selecting tests')
+ group.add_argument('-r', '--randomize', action='store_true',
+ help='randomize test execution order.' + more_details)
+ group.add_argument('--randseed', metavar='SEED', help='pass a random seed '
+ 'to reproduce a previous random run')
+ group.add_argument('-f', '--fromfile', metavar='FILE', help='read names '
+ 'of tests to run from a file.' + more_details)
+ group.add_argument('-x', '--exclude', action='store_true',
+ help='arguments are tests to *exclude*')
+ group.add_argument('-s', '--single', action='store_true', help='single '
+ 'step through a set of tests.' + more_details)
+ group.add_argument('-m', '--match', metavar='PAT', help='match test cases '
+ 'and methods with glob pattern PAT')
+ group.add_argument('-G', '--failfast', action='store_true', help='fail as '
+ 'soon as a test fails (only with -v or -W)')
+ group.add_argument('-u', '--use', metavar='RES1,RES2,...', help='specify '
+ 'which special resource intensive tests to run.' +
+ more_details)
+ group.add_argument('-M', '--memlimit', metavar='LIMIT', help='run very '
+ 'large memory-consuming tests.' + more_details)
+ group.add_argument('--testdir', metavar='DIR',
+ help='execute test files in the specified directory '
+ '(instead of the Python stdlib test suite)')
+
+ group = parser.add_argument_group('Special runs')
+ group.add_argument('-l', '--findleaks', action='store_true', help='if GC '
+ 'is available detect tests that leak memory')
+ group.add_argument('-L', '--runleaks', action='store_true',
+ help='run the leaks(1) command just before exit.' +
+ more_details)
+ group.add_argument('-R', '--huntrleaks', metavar='RUNCOUNTS',
+ help='search for reference leaks (needs debug build, '
+ 'very slow).' + more_details)
+ group.add_argument('-j', '--multiprocess', metavar='PROCESSES',
+ help='run PROCESSES processes at once')
+ group.add_argument('-T', '--coverage', action='store_true', help='turn on '
+ 'code coverage tracing using the trace module')
+ group.add_argument('-D', '--coverdir', metavar='DIR',
+ help='directory where coverage files are put')
+ group.add_argument('-N', '--nocoverdir', action='store_true',
+ help='put coverage files alongside modules')
+ group.add_argument('-t', '--threshold', metavar='THRESHOLD',
+ help='call gc.set_threshold(THRESHOLD)')
+ group.add_argument('-n', '--nowindows', action='store_true',
+ help='suppress error message boxes on Windows')
+ group.add_argument('-F', '--forever', action='store_true',
+ help='run the specified tests in a loop, until an '
+ 'error happens')
+
+ parser.add_argument('args', nargs=argparse.REMAINDER,
+ help=argparse.SUPPRESS)
+
+ return parser
+
+# TODO: remove this function as described in issue #16799, for example.
+# We use this function since regrtest.main() was originally written to use
+# getopt for parsing.
+def _convert_namespace_to_getopt(ns):
+ """Convert an argparse.Namespace object to a getopt-style opts list.
+
+ The return value of this function mimics the first element of
+ getopt.getopt()'s (opts, args) return value. In addition, the (option,
+ value) pairs in the opts list are sorted by option and use the long
+ option string. The args part of (opts, args) can be mimicked by the
+ args attribute of the Namespace object we are using in regrtest.
+ """
+ opts = []
+ args_dict = vars(ns)
+ for key in sorted(args_dict.keys()):
+ if key == 'args':
+ continue
+ val = args_dict[key]
+ # Don't continue if val equals '' because this means an option
+ # accepting a value was provided the empty string. Such values should
+ # show up in the returned opts list.
+ if val is None or val is False:
+ continue
+ if val is True:
+ # Then an option with action store_true was passed. getopt
+ # includes these with value '' in the opts list.
+ val = ''
+ opts.append(('--' + key, val))
+ return opts
def main(tests=None, testdir=None, verbose=0, quiet=False,
@@ -298,17 +388,12 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
replace_stdout()
support.record_original_stdout(sys.stdout)
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'hvqxsoS:rf:lu:t:TD:NLR:FdwWM:nj:Gm:',
- ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
- 'exclude', 'single', 'slow', 'randomize', 'fromfile=', 'findleaks',
- 'use=', 'threshold=', 'coverdir=', 'nocoverdir',
- 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
- 'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug',
- 'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait',
- 'failfast', 'match='])
- except getopt.error as msg:
- usage(msg)
+
+ parser = _create_parser()
+ ns = parser.parse_args()
+ opts = _convert_namespace_to_getopt(ns)
+ args = ns.args
+ usage = parser.error
# Defaults
if random_seed is None:
@@ -319,10 +404,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
start = None
timeout = None
for o, a in opts:
- if o in ('-h', '--help'):
- print(__doc__)
- return
- elif o in ('-v', '--verbose'):
+ if o in ('-v', '--verbose'):
verbose += 1
elif o in ('-w', '--verbose2'):
verbose2 = True
@@ -427,12 +509,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
elif o in ('-j', '--multiprocess'):
use_mp = int(a)
if use_mp <= 0:
- try:
- import multiprocessing
- # Use all cores + extras for tests that like to sleep
- use_mp = 2 + multiprocessing.cpu_count()
- except (ImportError, NotImplementedError):
- use_mp = 3
+ # Use all cores + extras for tests that like to sleep
+ use_mp = 2 + (os.cpu_count() or 1)
if use_mp == 1:
use_mp = None
elif o == '--header':
@@ -507,7 +585,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
next_test = fp.read().strip()
tests = [next_test]
fp.close()
- except IOError:
+ except OSError:
pass
if fromfile:
@@ -616,11 +694,12 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
sys.exit(2)
from queue import Queue
from subprocess import Popen, PIPE
- debug_output_pat = re.compile(r"\[\d+ refs\]$")
+ debug_output_pat = re.compile(r"\[\d+ refs, \d+ blocks\]$")
output = Queue()
pending = MultiprocessTests(tests)
opt_args = support.args_from_interpreter_flags()
- base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
+ base_cmd = [sys.executable] + opt_args
+ base_cmd += ['-X', 'faulthandler', '-m', 'test.regrtest']
def work():
# A worker thread.
try:
@@ -764,20 +843,6 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
print(count(len(skipped), "test"), "skipped:")
printlist(skipped)
- e = _ExpectedSkips()
- plat = sys.platform
- if e.isvalid():
- surprise = set(skipped) - e.getexpected() - set(resource_denieds)
- if surprise:
- print(count(len(surprise), "skip"), \
- "unexpected on", plat + ":")
- printlist(surprise)
- else:
- print("Those skips are all expected on", plat + ".")
- else:
- print("Ask someone to teach regrtest.py about which tests are")
- print("expected to get skipped on", plat + ".")
-
if verbose2 and bad:
print("Re-running failed tests in verbose mode")
for test in bad:
@@ -995,7 +1060,7 @@ class saved_test_environment:
'sys.warnoptions', 'threading._dangling',
'multiprocessing.process._dangling',
'sysconfig._CONFIG_VARS', 'sysconfig._INSTALL_SCHEMES',
- 'support.TESTFN',
+ 'support.TESTFN', 'locale', 'warnings.showwarning',
)
def get_sys_argv(self):
@@ -1164,6 +1229,25 @@ class saved_test_environment:
elif os.path.isdir(support.TESTFN):
shutil.rmtree(support.TESTFN)
+ _lc = [getattr(locale, lc) for lc in dir(locale)
+ if lc.startswith('LC_')]
+ def get_locale(self):
+ pairings = []
+ for lc in self._lc:
+ try:
+ pairings.append((lc, locale.setlocale(lc, None)))
+ except (TypeError, ValueError):
+ continue
+ return pairings
+ def restore_locale(self, saved):
+ for lc, setting in saved:
+ locale.setlocale(lc, setting)
+
+ def get_warnings_showwarning(self):
+ return warnings.showwarning
+ def restore_warnings_showwarning(self, fxn):
+ warnings.showwarning = fxn
+
def resource_info(self):
for name in self.resources:
method_suffix = name.replace('.', '_')
@@ -1211,8 +1295,7 @@ def runtest_inner(test, verbose, quiet,
abstest = 'test.' + test
with saved_test_environment(test, verbose, quiet) as environment:
start_time = time.time()
- the_package = __import__(abstest, globals(), locals(), [])
- the_module = getattr(the_package, test)
+ the_module = importlib.import_module(abstest)
# If the test has a test_main, that will run the appropriate
# tests. If not, use normal unittest test loading.
test_runner = getattr(the_module, "test_main", None)
@@ -1328,41 +1411,50 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
for obj in abc.__subclasses__() + [abc]:
abcs[obj] = obj._abc_registry.copy()
- if indirect_test:
- def run_the_test():
- indirect_test()
- else:
- def run_the_test():
- del sys.modules[the_module.__name__]
- exec('import ' + the_module.__name__)
-
- deltas = []
nwarmup, ntracked, fname = huntrleaks
fname = os.path.join(support.SAVEDCWD, fname)
repcount = nwarmup + ntracked
+ rc_deltas = [0] * repcount
+ alloc_deltas = [0] * repcount
+
print("beginning", repcount, "repetitions", file=sys.stderr)
print(("1234567890"*(repcount//10 + 1))[:repcount], file=sys.stderr)
sys.stderr.flush()
- dash_R_cleanup(fs, ps, pic, zdc, abcs)
for i in range(repcount):
- rc_before = sys.gettotalrefcount()
- run_the_test()
+ indirect_test()
+ alloc_after, rc_after = dash_R_cleanup(fs, ps, pic, zdc, abcs)
sys.stderr.write('.')
sys.stderr.flush()
- dash_R_cleanup(fs, ps, pic, zdc, abcs)
- rc_after = sys.gettotalrefcount()
if i >= nwarmup:
- deltas.append(rc_after - rc_before)
+ rc_deltas[i] = rc_after - rc_before
+ alloc_deltas[i] = alloc_after - alloc_before
+ alloc_before, rc_before = alloc_after, rc_after
print(file=sys.stderr)
- if any(deltas):
- msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas))
- print(msg, file=sys.stderr)
- sys.stderr.flush()
- with open(fname, "a") as refrep:
- print(msg, file=refrep)
- refrep.flush()
- return True
- return False
+ # These checkers return False on success, True on failure
+ def check_rc_deltas(deltas):
+ return any(deltas)
+ def check_alloc_deltas(deltas):
+ # At least 1/3rd of 0s
+ if 3 * deltas.count(0) < len(deltas):
+ return True
+ # Nothing else than 1s, 0s and -1s
+ if not set(deltas) <= {1,0,-1}:
+ return True
+ return False
+ failed = False
+ for deltas, item_name, checker in [
+ (rc_deltas, 'references', check_rc_deltas),
+ (alloc_deltas, 'memory blocks', check_alloc_deltas)]:
+ if checker(deltas):
+ msg = '%s leaked %s %s, sum=%s' % (
+ test, deltas[nwarmup:], item_name, sum(deltas))
+ print(msg, file=sys.stderr)
+ sys.stderr.flush()
+ with open(fname, "a") as refrep:
+ print(msg, file=refrep)
+ refrep.flush()
+ failed = True
+ return failed
def dash_R_cleanup(fs, ps, pic, zdc, abcs):
import gc, copyreg
@@ -1428,8 +1520,11 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs):
else:
ctypes._reset_cache()
- # Collect cyclic trash.
+ # Collect cyclic trash and read memory statistics immediately after.
+ func1 = sys.getallocatedblocks
+ func2 = sys.gettotalrefcount
gc.collect()
+ return func1(), func2()
def warm_caches():
# char cache
@@ -1472,307 +1567,10 @@ def printlist(x, width=70, indent=4):
print(fill(' '.join(str(elt) for elt in sorted(x)), width,
initial_indent=blanks, subsequent_indent=blanks))
-# Map sys.platform to a string containing the basenames of tests
-# expected to be skipped on that platform.
-#
-# Special cases:
-# test_pep277
-# The _ExpectedSkips constructor adds this to the set of expected
-# skips if not os.path.supports_unicode_filenames.
-# test_timeout
-# Controlled by test_timeout.skip_expected. Requires the network
-# resource and a socket module.
-#
-# Tests that are expected to be skipped everywhere except on one platform
-# are also handled separately.
-
-_expectations = (
- ('win32',
- """
- test__locale
- test_crypt
- test_curses
- test_dbm
- test_devpoll
- test_fcntl
- test_fork1
- test_epoll
- test_dbm_gnu
- test_dbm_ndbm
- test_grp
- test_ioctl
- test_largefile
- test_kqueue
- test_openpty
- test_ossaudiodev
- test_pipes
- test_poll
- test_posix
- test_pty
- test_pwd
- test_resource
- test_signal
- test_syslog
- test_threadsignals
- test_wait3
- test_wait4
- """),
- ('linux',
- """
- test_curses
- test_devpoll
- test_largefile
- test_kqueue
- test_ossaudiodev
- """),
- ('unixware',
- """
- test_epoll
- test_largefile
- test_kqueue
- test_minidom
- test_openpty
- test_pyexpat
- test_sax
- test_sundry
- """),
- ('openunix',
- """
- test_epoll
- test_largefile
- test_kqueue
- test_minidom
- test_openpty
- test_pyexpat
- test_sax
- test_sundry
- """),
- ('sco_sv',
- """
- test_asynchat
- test_fork1
- test_epoll
- test_gettext
- test_largefile
- test_locale
- test_kqueue
- test_minidom
- test_openpty
- test_pyexpat
- test_queue
- test_sax
- test_sundry
- test_thread
- test_threaded_import
- test_threadedtempfile
- test_threading
- """),
- ('darwin',
- """
- test__locale
- test_curses
- test_devpoll
- test_epoll
- test_dbm_gnu
- test_gdb
- test_largefile
- test_locale
- test_minidom
- test_ossaudiodev
- test_poll
- """),
- ('sunos',
- """
- test_curses
- test_dbm
- test_epoll
- test_kqueue
- test_dbm_gnu
- test_gzip
- test_openpty
- test_zipfile
- test_zlib
- """),
- ('hp-ux',
- """
- test_curses
- test_epoll
- test_dbm_gnu
- test_gzip
- test_largefile
- test_locale
- test_kqueue
- test_minidom
- test_openpty
- test_pyexpat
- test_sax
- test_zipfile
- test_zlib
- """),
- ('cygwin',
- """
- test_curses
- test_dbm
- test_devpoll
- test_epoll
- test_ioctl
- test_kqueue
- test_largefile
- test_locale
- test_ossaudiodev
- test_socketserver
- """),
- ('os2emx',
- """
- test_audioop
- test_curses
- test_epoll
- test_kqueue
- test_largefile
- test_mmap
- test_openpty
- test_ossaudiodev
- test_pty
- test_resource
- test_signal
- """),
- ('freebsd',
- """
- test_devpoll
- test_epoll
- test_dbm_gnu
- test_locale
- test_ossaudiodev
- test_pep277
- test_pty
- test_socketserver
- test_tcl
- test_tk
- test_ttk_guionly
- test_ttk_textonly
- test_timeout
- test_urllibnet
- test_multiprocessing
- """),
- ('aix',
- """
- test_bz2
- test_epoll
- test_dbm_gnu
- test_gzip
- test_kqueue
- test_ossaudiodev
- test_tcl
- test_tk
- test_ttk_guionly
- test_ttk_textonly
- test_zipimport
- test_zlib
- """),
- ('openbsd',
- """
- test_ctypes
- test_devpoll
- test_epoll
- test_dbm_gnu
- test_locale
- test_normalization
- test_ossaudiodev
- test_pep277
- test_tcl
- test_tk
- test_ttk_guionly
- test_ttk_textonly
- test_multiprocessing
- """),
- ('netbsd',
- """
- test_ctypes
- test_curses
- test_devpoll
- test_epoll
- test_dbm_gnu
- test_locale
- test_ossaudiodev
- test_pep277
- test_tcl
- test_tk
- test_ttk_guionly
- test_ttk_textonly
- test_multiprocessing
- """),
-)
-
-class _ExpectedSkips:
- def __init__(self):
- import os.path
- from test import test_timeout
-
- self.valid = False
- expected = None
- for item in _expectations:
- if sys.platform.startswith(item[0]):
- expected = item[1]
- break
- if expected is not None:
- self.expected = set(expected.split())
-
- # These are broken tests, for now skipped on every platform.
- # XXX Fix these!
- self.expected.add('test_nis')
-
- # expected to be skipped on every platform, even Linux
- if not os.path.supports_unicode_filenames:
- self.expected.add('test_pep277')
-
- # doctest, profile and cProfile tests fail when the codec for the
- # fs encoding isn't built in because PyUnicode_Decode() adds two
- # calls into Python.
- encs = ("utf-8", "latin-1", "ascii", "mbcs", "utf-16", "utf-32")
- if sys.getfilesystemencoding().lower() not in encs:
- self.expected.add('test_profile')
- self.expected.add('test_cProfile')
- self.expected.add('test_doctest')
-
- if test_timeout.skip_expected:
- self.expected.add('test_timeout')
-
- if sys.platform != "win32":
- # test_sqlite is only reliable on Windows where the library
- # is distributed with Python
- WIN_ONLY = {"test_unicode_file", "test_winreg",
- "test_winsound", "test_startfile",
- "test_sqlite", "test_msilib"}
- self.expected |= WIN_ONLY
-
- if sys.platform != 'sunos5':
- self.expected.add('test_nis')
-
- if support.python_is_optimized():
- self.expected.add("test_gdb")
-
- self.valid = True
-
- def isvalid(self):
- "Return true iff _ExpectedSkips knows about the current platform."
- return self.valid
-
- def getexpected(self):
- """Return set of test names we expect to skip on current platform.
-
- self.isvalid() must be true.
- """
-
- assert self.isvalid()
- return self.expected
-
-def _make_temp_dir_for_build(TEMPDIR):
- # When tests are run from the Python build directory, it is best practice
- # to keep the test files in a subfolder. It eases the cleanup of leftover
- # files using command "make distclean".
+
+def main_in_temp_cwd():
+ """Run main() in a temporary working directory."""
if sysconfig.is_python_build():
- TEMPDIR = os.path.join(sysconfig.get_config_var('srcdir'), 'build')
- TEMPDIR = os.path.abspath(TEMPDIR)
try:
os.mkdir(TEMPDIR)
except FileExistsError:
@@ -1781,10 +1579,16 @@ def _make_temp_dir_for_build(TEMPDIR):
# Define a writable temp dir that will be used as cwd while running
# the tests. The name of the dir includes the pid to allow parallel
# testing (see the -j option).
- TESTCWD = 'test_python_{}'.format(os.getpid())
+ test_cwd = 'test_python_{}'.format(os.getpid())
+ test_cwd = os.path.join(TEMPDIR, test_cwd)
+
+ # Run the tests in a context manager that temporarily changes the CWD to a
+ # temporary and writable directory. If it's not possible to create or
+ # change the CWD, the original CWD will be used. The original CWD is
+ # available from support.SAVEDCWD.
+ with support.temp_cwd(test_cwd, quiet=True):
+ main()
- TESTCWD = os.path.join(TEMPDIR, TESTCWD)
- return TEMPDIR, TESTCWD
if __name__ == '__main__':
# Remove regrtest.py's own directory from the module search path. Despite
@@ -1808,11 +1612,4 @@ if __name__ == '__main__':
# sanity check
assert __file__ == os.path.abspath(sys.argv[0])
- TEMPDIR, TESTCWD = _make_temp_dir_for_build(TEMPDIR)
-
- # Run the tests in a context manager that temporary changes the CWD to a
- # temporary and writable directory. If it's not possible to create or
- # change the CWD, the original CWD will be used. The original CWD is
- # available from support.SAVEDCWD.
- with support.temp_cwd(TESTCWD, quiet=True):
- main()
+ main_in_temp_cwd()
diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py
index ab20164..f9d2b65 100644
--- a/Lib/test/script_helper.py
+++ b/Lib/test/script_helper.py
@@ -12,12 +12,12 @@ import contextlib
import shutil
import zipfile
-from imp import source_from_cache
+from importlib.util import source_from_cache
from test.support import make_legacy_pyc, strip_python_stderr, temp_dir
# Executing the interpreter in a subprocess
def _assert_python(expected_success, *args, **env_vars):
- cmd_line = [sys.executable]
+ cmd_line = [sys.executable, '-X', 'faulthandler']
if not env_vars:
cmd_line.append('-E')
# Need to preserve the original environment, for in-place testing of
@@ -39,7 +39,7 @@ def _assert_python(expected_success, *args, **env_vars):
p.stdout.close()
p.stderr.close()
rc = p.returncode
- err = strip_python_stderr(err)
+ err = strip_python_stderr(err)
if (rc and expected_success) or (not rc and not expected_success):
raise AssertionError(
"Process return code is %d, "
@@ -49,18 +49,25 @@ def _assert_python(expected_success, *args, **env_vars):
def assert_python_ok(*args, **env_vars):
"""
Assert that running the interpreter with `args` and optional environment
- variables `env_vars` is ok and return a (return code, stdout, stderr) tuple.
+ variables `env_vars` succeeds (rc == 0) and return a (return code, stdout,
+ stderr) tuple.
"""
return _assert_python(True, *args, **env_vars)
def assert_python_failure(*args, **env_vars):
"""
Assert that running the interpreter with `args` and optional environment
- variables `env_vars` fails and return a (return code, stdout, stderr) tuple.
+ variables `env_vars` fails (rc != 0) and return a (return code, stdout,
+ stderr) tuple.
"""
return _assert_python(False, *args, **env_vars)
def spawn_python(*args, **kw):
+ """Run a Python subprocess with the given arguments.
+
+ kw is extra keyword args to pass to subprocess.Popen. Returns a Popen
+ object.
+ """
cmd_line = [sys.executable, '-E']
cmd_line.extend(args)
return subprocess.Popen(cmd_line, stdin=subprocess.PIPE,
@@ -68,6 +75,7 @@ def spawn_python(*args, **kw):
**kw)
def kill_python(p):
+ """Run the given Popen process until completion and return stdout."""
p.stdin.close()
data = p.stdout.read()
p.stdout.close()
diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py
index af7c0b4..90722f7 100644
--- a/Lib/test/sortperf.py
+++ b/Lib/test/sortperf.py
@@ -22,7 +22,7 @@ def randfloats(n):
fn = os.path.join(td, "rr%06d" % n)
try:
fp = open(fn, "rb")
- except IOError:
+ except OSError:
r = random.random
result = [r() for i in range(n)]
try:
@@ -35,9 +35,9 @@ def randfloats(n):
if fp:
try:
os.unlink(fn)
- except os.error:
+ except OSError:
pass
- except IOError as msg:
+ except OSError as msg:
print("can't write", fn, ":", msg)
else:
result = marshal.load(fp)
diff --git a/Lib/test/ssl_servers.py b/Lib/test/ssl_servers.py
index 8686153..759b3f4 100644
--- a/Lib/test/ssl_servers.py
+++ b/Lib/test/ssl_servers.py
@@ -35,7 +35,7 @@ class HTTPSServer(_HTTPServer):
try:
sock, addr = self.socket.accept()
sslconn = self.context.wrap_socket(sock, server_side=True)
- except socket.error as e:
+ except OSError as e:
# socket errors are silenced by the caller, print them here
if support.verbose:
sys.stderr.write("Got an error:\n%s\n" % e)
@@ -147,9 +147,11 @@ class HTTPSServerThread(threading.Thread):
self.server.shutdown()
-def make_https_server(case, certfile=CERTFILE, host=HOST, handler_class=None):
- # we assume the certfile contains both private key and certificate
- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+def make_https_server(case, *, context=None, certfile=CERTFILE,
+ host=HOST, handler_class=None):
+ if context is None:
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ # We assume the certfile contains both private key and certificate
context.load_cert_chain(certfile)
server = HTTPSServerThread(context, host, handler_class)
flag = threading.Event()
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 0b3bd68..befbe8b 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -15,10 +15,10 @@ import shutil
import warnings
import unittest
import importlib
+import importlib.util
import collections.abc
import re
import subprocess
-import imp
import time
import sysconfig
import fnmatch
@@ -98,7 +98,8 @@ def _ignore_deprecated_imports(ignore=True):
"""Context manager to suppress package and module deprecation
warnings when importing them.
- If ignore is False, this context manager has no effect."""
+ If ignore is False, this context manager has no effect.
+ """
if ignore:
with warnings.catch_warnings():
warnings.filterwarnings("ignore", ".+ (module|package)",
@@ -108,16 +109,21 @@ def _ignore_deprecated_imports(ignore=True):
yield
-def import_module(name, deprecated=False):
+def import_module(name, deprecated=False, *, required_on=()):
"""Import and return the module to be tested, raising SkipTest if
it is not available.
If deprecated is True, any module or package deprecation messages
- will be suppressed."""
+ will be suppressed. If a module is required on a platform but optional for
+ others, set required_on to an iterable of platform prefixes which will be
+ compared against sys.platform.
+ """
with _ignore_deprecated_imports(deprecated):
try:
return importlib.import_module(name)
except ImportError as msg:
+ if sys.platform.startswith(tuple(required_on)):
+ raise
raise unittest.SkipTest(str(msg))
@@ -303,25 +309,20 @@ else:
def unlink(filename):
try:
_unlink(filename)
- except OSError as error:
- # The filename need not exist.
- if error.errno not in (errno.ENOENT, errno.ENOTDIR):
- raise
+ except (FileNotFoundError, NotADirectoryError):
+ pass
def rmdir(dirname):
try:
_rmdir(dirname)
- except OSError as error:
- # The directory need not exist.
- if error.errno != errno.ENOENT:
- raise
+ except FileNotFoundError:
+ pass
def rmtree(path):
try:
_rmtree(path)
- except OSError as error:
- if error.errno != errno.ENOENT:
- raise
+ except FileNotFoundError:
+ pass
def make_legacy_pyc(source):
"""Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
@@ -333,7 +334,7 @@ def make_legacy_pyc(source):
does not need to exist, however the PEP 3147 pyc file must exist.
:return: The file system path to the legacy pyc file.
"""
- pyc_file = imp.cache_from_source(source)
+ pyc_file = importlib.util.cache_from_source(source)
up_one = os.path.dirname(os.path.abspath(source))
legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
os.rename(pyc_file, legacy_pyc)
@@ -352,8 +353,8 @@ def forget(modname):
# combinations of PEP 3147 and legacy pyc and pyo files.
unlink(source + 'c')
unlink(source + 'o')
- unlink(imp.cache_from_source(source, debug_override=True))
- unlink(imp.cache_from_source(source, debug_override=False))
+ unlink(importlib.util.cache_from_source(source, debug_override=True))
+ unlink(importlib.util.cache_from_source(source, debug_override=False))
# On some platforms, should not run gui test even if it is allowed
# in `use_resources'.
@@ -508,7 +509,7 @@ def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
the SO_REUSEADDR socket option having different semantics on Windows versus
Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind,
listen and then accept connections on identical host/ports. An EADDRINUSE
- socket.error will be raised at some point (depending on the platform and
+ OSError will be raised at some point (depending on the platform and
the order bind and listen were called on each socket).
However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE
@@ -582,7 +583,7 @@ def _is_ipv6_enabled():
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.bind(('::1', 0))
return True
- except (socket.error, socket.gaierror):
+ except OSError:
pass
finally:
if sock:
@@ -1156,9 +1157,9 @@ class TransientResource(object):
# Context managers that raise ResourceDenied when various issues
# with the Internet connection manifest themselves as exceptions.
# XXX deprecate these and use transient_internet() instead
-time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
-socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
-ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
+time_out = TransientResource(OSError, errno=errno.ETIMEDOUT)
+socket_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET)
+ioerror_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET)
@contextlib.contextmanager
@@ -1204,17 +1205,17 @@ def transient_internet(resource_name, *, timeout=30.0, errnos=()):
if timeout is not None:
socket.setdefaulttimeout(timeout)
yield
- except IOError as err:
+ except OSError as err:
# urllib can wrap original socket errors multiple times (!), we must
# unwrap to get at the original error.
while True:
a = err.args
- if len(a) >= 1 and isinstance(a[0], IOError):
+ if len(a) >= 1 and isinstance(a[0], OSError):
err = a[0]
# The error can also be wrapped as args[1]:
# except socket.error as msg:
- # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
- elif len(a) >= 2 and isinstance(a[1], IOError):
+ # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2])
+ elif len(a) >= 2 and isinstance(a[1], OSError):
err = a[1]
else:
break
@@ -1749,12 +1750,12 @@ def threading_setup():
def threading_cleanup(*original_values):
if not _thread:
return
- _MAX_COUNT = 10
+ _MAX_COUNT = 100
for count in range(_MAX_COUNT):
values = _thread._count(), threading._dangling
if values == original_values:
break
- time.sleep(0.1)
+ time.sleep(0.01)
gc_collect()
# XXX print a warning in case of failure?
@@ -1856,7 +1857,7 @@ def strip_python_stderr(stderr):
This will typically be run on the result of the communicate() method
of a subprocess.Popen object.
"""
- stderr = re.sub(br"\[\d+ refs\]\r?\n?", b"", stderr).strip()
+ stderr = re.sub(br"\[\d+ refs, \d+ blocks\]\r?\n?", b"", stderr).strip()
return stderr
def args_from_interpreter_flags():
diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index 608ec01..8cc285f 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -29,17 +29,20 @@ class AllTest(unittest.TestCase):
if not hasattr(sys.modules[modname], "__all__"):
raise NoAll(modname)
names = {}
- try:
- exec("from %s import *" % modname, names)
- except Exception as e:
- # Include the module name in the exception string
- self.fail("__all__ failure in {}: {}: {}".format(
- modname, e.__class__.__name__, e))
- if "__builtins__" in names:
- del names["__builtins__"]
- keys = set(names)
- all = set(sys.modules[modname].__all__)
- self.assertEqual(keys, all)
+ with self.subTest(module=modname):
+ try:
+ exec("from %s import *" % modname, names)
+ except Exception as e:
+ # Include the module name in the exception string
+ self.fail("__all__ failure in {}: {}: {}".format(
+ modname, e.__class__.__name__, e))
+ if "__builtins__" in names:
+ del names["__builtins__"]
+ keys = set(names)
+ all_list = sys.modules[modname].__all__
+ all_set = set(all_list)
+ self.assertCountEqual(all_set, all_list, "in module {}".format(modname))
+ self.assertEqual(keys, all_set, "in module {}".format(modname))
def walk_modules(self, basedir, modpath):
for fn in sorted(os.listdir(basedir)):
@@ -110,8 +113,5 @@ class AllTest(unittest.TestCase):
print('Following modules failed to be imported:', failed_imports)
-def test_main():
- support.run_unittest(AllTest)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py
index d4d7556..93f9dae 100644
--- a/Lib/test/test_abc.py
+++ b/Lib/test/test_abc.py
@@ -68,6 +68,19 @@ class TestLegacyAPI(unittest.TestCase):
class TestABC(unittest.TestCase):
+ def test_ABC_helper(self):
+ # create an ABC using the helper class and perform basic checks
+ class C(abc.ABC):
+ @classmethod
+ @abc.abstractmethod
+ def foo(cls): return cls.__name__
+ self.assertEqual(type(C), abc.ABCMeta)
+ self.assertRaises(TypeError, C)
+ class D(C):
+ @classmethod
+ def foo(cls): return super().foo()
+ self.assertEqual(D.foo(), 'D')
+
def test_abstractmethod_basics(self):
@abc.abstractmethod
def foo(self): pass
@@ -288,7 +301,10 @@ class TestABC(unittest.TestCase):
b = B()
self.assertFalse(isinstance(b, A))
self.assertFalse(isinstance(b, (A,)))
+ token_old = abc.get_cache_token()
A.register(B)
+ token_new = abc.get_cache_token()
+ self.assertNotEqual(token_old, token_new)
self.assertTrue(isinstance(b, A))
self.assertTrue(isinstance(b, (A,)))
diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py
index 9c0e7b9..05e4ca0 100644
--- a/Lib/test/test_aifc.py
+++ b/Lib/test/test_aifc.py
@@ -3,6 +3,7 @@ import unittest
import os
import io
import struct
+import pickle
import aifc
@@ -31,6 +32,7 @@ class AIFCTest(unittest.TestCase):
def test_params(self):
f = self.f = aifc.open(self.sndfilepath)
+ params = f.getparams()
self.assertEqual(f.getfp().name, self.sndfilepath)
self.assertEqual(f.getnchannels(), 2)
self.assertEqual(f.getsampwidth(), 2)
@@ -43,6 +45,48 @@ class AIFCTest(unittest.TestCase):
(2, 2, 48000, 14400, b'NONE', b'not compressed'),
)
+ params = f.getparams()
+ self.assertEqual(params.nchannels, 2)
+ self.assertEqual(params.sampwidth, 2)
+ self.assertEqual(params.framerate, 48000)
+ self.assertEqual(params.nframes, 14400)
+ self.assertEqual(params.comptype, b'NONE')
+ self.assertEqual(params.compname, b'not compressed')
+
+ def test_params_added(self):
+ f = self.f = aifc.open(TESTFN, 'wb')
+ f.aiff()
+ f.setparams((1, 1, 1, 1, b'NONE', b''))
+ f.close()
+
+ f = self.f = aifc.open(TESTFN, 'rb')
+ params = f.getparams()
+ self.assertEqual(params.nchannels, f.getnchannels())
+ self.assertEqual(params.sampwidth, f.getsampwidth())
+ self.assertEqual(params.framerate, f.getframerate())
+ self.assertEqual(params.nframes, f.getnframes())
+ self.assertEqual(params.comptype, f.getcomptype())
+ self.assertEqual(params.compname, f.getcompname())
+
+ def test_getparams_picklable(self):
+ self.f = aifc.open(self.sndfilepath)
+ params = self.f.getparams()
+ dump = pickle.dumps(params)
+ self.assertEqual(pickle.loads(dump), params)
+ self.f.close()
+
+ def test_context_manager(self):
+ with open(self.sndfilepath, 'rb') as testfile:
+ with aifc.open(testfile) as f:
+ pass
+ self.assertEqual(testfile.closed, True)
+ with open(TESTFN, 'wb') as testfile:
+ with self.assertRaises(aifc.Error):
+ with aifc.open(testfile, 'wb') as fout:
+ pass
+ self.assertEqual(testfile.closed, True)
+ fout.close() # do nothing
+
def test_read(self):
f = self.f = aifc.open(self.sndfilepath)
self.assertEqual(f.readframes(0), b'')
@@ -319,12 +363,14 @@ class AIFCLowLevelTest(unittest.TestCase):
def test_write_aiff_by_extension(self):
sampwidth = 2
- fout = self.fout = aifc.open(TESTFN + '.aiff', 'wb')
+ filename = TESTFN + '.aiff'
+ fout = self.fout = aifc.open(filename, 'wb')
+ self.addCleanup(unlink, filename)
fout.setparams((1, sampwidth, 1, 1, b'ULAW', b''))
frames = b'\x00' * fout.getnchannels() * sampwidth
fout.writeframes(frames)
fout.close()
- f = self.f = aifc.open(TESTFN + '.aiff', 'rb')
+ f = self.f = aifc.open(filename, 'rb')
self.assertEqual(f.getcomptype(), b'NONE')
f.close()
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index c06c940..00cde2e 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -14,6 +14,7 @@ import argparse
from io import StringIO
from test import support
+from unittest import mock
class StdIOBuffer(StringIO):
pass
@@ -1421,6 +1422,19 @@ class TestFileTypeRepr(TestCase):
type = argparse.FileType('wb', 1)
self.assertEqual("FileType('wb', 1)", repr(type))
+ def test_r_latin(self):
+ type = argparse.FileType('r', encoding='latin_1')
+ self.assertEqual("FileType('r', encoding='latin_1')", repr(type))
+
+ def test_w_big5_ignore(self):
+ type = argparse.FileType('w', encoding='big5', errors='ignore')
+ self.assertEqual("FileType('w', encoding='big5', errors='ignore')",
+ repr(type))
+
+ def test_r_1_replace(self):
+ type = argparse.FileType('r', 1, errors='replace')
+ self.assertEqual("FileType('r', 1, errors='replace')", repr(type))
+
class RFile(object):
seen = {}
@@ -1557,6 +1571,24 @@ class TestFileTypeWB(TempDirMixin, ParserTestCase):
]
+class TestFileTypeOpenArgs(TestCase):
+ """Test that open (the builtin) is correctly called"""
+
+ def test_open_args(self):
+ FT = argparse.FileType
+ cases = [
+ (FT('rb'), ('rb', -1, None, None)),
+ (FT('w', 1), ('w', 1, None, None)),
+ (FT('w', errors='replace'), ('w', -1, None, 'replace')),
+ (FT('wb', encoding='big5'), ('wb', -1, 'big5', None)),
+ (FT('w', 0, 'l1', 'strict'), ('w', 0, 'l1', 'strict')),
+ ]
+ with mock.patch('builtins.open') as m:
+ for type, args in cases:
+ type('foo')
+ m.assert_called_with('foo', *args)
+
+
class TestTypeCallable(ParserTestCase):
"""Test some callables as option/argument types"""
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py
index f21b69f..a44ee07 100755
--- a/Lib/test/test_array.py
+++ b/Lib/test/test_array.py
@@ -353,12 +353,12 @@ class BaseTest:
support.unlink(support.TESTFN)
def test_fromfile_ioerror(self):
- # Issue #5395: Check if fromfile raises a proper IOError
+ # Issue #5395: Check if fromfile raises a proper OSError
# instead of EOFError.
a = array.array(self.typecode)
f = open(support.TESTFN, 'wb')
try:
- self.assertRaises(IOError, a.fromfile, f, len(self.example))
+ self.assertRaises(OSError, a.fromfile, f, len(self.example))
finally:
f.close()
support.unlink(support.TESTFN)
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 6352888..e69422a 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -180,20 +180,36 @@ eval_tests = [
class AST_Tests(unittest.TestCase):
- def _assertTrueorder(self, ast_node, parent_pos):
+ def _assertTrueorder(self, ast_node, parent_pos, reverse_check = False):
+ def should_reverse_check(parent, child):
+ # In some situations, the children of nodes occur before
+ # their parents, for example in a.b.c, a occurs before b
+ # but a is a child of b.
+ if isinstance(parent, ast.Call):
+ if parent.func == child:
+ return True
+ if isinstance(parent, (ast.Attribute, ast.Subscript)):
+ return True
+ return False
+
if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
return
if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
node_pos = (ast_node.lineno, ast_node.col_offset)
- self.assertTrue(node_pos >= parent_pos)
+ if reverse_check:
+ self.assertTrue(node_pos <= parent_pos)
+ else:
+ self.assertTrue(node_pos >= parent_pos)
parent_pos = (ast_node.lineno, ast_node.col_offset)
for name in ast_node._fields:
value = getattr(ast_node, name)
if isinstance(value, list):
for child in value:
- self._assertTrueorder(child, parent_pos)
+ self._assertTrueorder(child, parent_pos,
+ should_reverse_check(ast_node, child))
elif value is not None:
- self._assertTrueorder(value, parent_pos)
+ self._assertTrueorder(value, parent_pos,
+ should_reverse_check(ast_node, value))
def test_AST_objects(self):
x = ast.AST()
@@ -262,14 +278,14 @@ class AST_Tests(unittest.TestCase):
def test_arguments(self):
x = ast.arguments()
- self.assertEqual(x._fields, ('args', 'vararg', 'varargannotation',
- 'kwonlyargs', 'kwarg', 'kwargannotation',
- 'defaults', 'kw_defaults'))
+ self.assertEqual(x._fields, ('args', 'vararg',
+ 'kwonlyargs', 'kw_defaults',
+ 'kwarg', 'defaults'))
with self.assertRaises(AttributeError):
x.vararg
- x = ast.arguments(*range(1, 9))
+ x = ast.arguments(*range(1, 7))
self.assertEqual(x.vararg, 2)
def test_field_attr_writable(self):
@@ -439,7 +455,7 @@ class ASTHelpers_Test(unittest.TestCase):
"lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
"lineno=1, col_offset=5), Str(s='and cheese', lineno=1, "
"col_offset=11)], keywords=[], starargs=None, kwargs=None, "
- "lineno=1, col_offset=0), lineno=1, col_offset=0)])"
+ "lineno=1, col_offset=4), lineno=1, col_offset=0)])"
)
def test_copy_location(self):
@@ -460,7 +476,7 @@ class ASTHelpers_Test(unittest.TestCase):
"Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
"lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, "
"col_offset=6)], keywords=[], starargs=None, kwargs=None, "
- "lineno=1, col_offset=0), lineno=1, col_offset=0), "
+ "lineno=1, col_offset=5), lineno=1, col_offset=0), "
"Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
"col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], "
"keywords=[], starargs=None, kwargs=None, lineno=1, "
@@ -560,8 +576,8 @@ class ASTValidatorTests(unittest.TestCase):
self.mod(m, "must have Load context", "eval")
def _check_arguments(self, fac, check):
- def arguments(args=None, vararg=None, varargannotation=None,
- kwonlyargs=None, kwarg=None, kwargannotation=None,
+ def arguments(args=None, vararg=None,
+ kwonlyargs=None, kwarg=None,
defaults=None, kw_defaults=None):
if args is None:
args = []
@@ -571,20 +587,12 @@ class ASTValidatorTests(unittest.TestCase):
defaults = []
if kw_defaults is None:
kw_defaults = []
- args = ast.arguments(args, vararg, varargannotation, kwonlyargs,
- kwarg, kwargannotation, defaults, kw_defaults)
+ args = ast.arguments(args, vararg, kwonlyargs, kw_defaults,
+ kwarg, defaults)
return fac(args)
args = [ast.arg("x", ast.Name("x", ast.Store()))]
check(arguments(args=args), "must have Load context")
- check(arguments(varargannotation=ast.Num(3)),
- "varargannotation but no vararg")
- check(arguments(varargannotation=ast.Name("x", ast.Store()), vararg="x"),
- "must have Load context")
check(arguments(kwonlyargs=args), "must have Load context")
- check(arguments(kwargannotation=ast.Num(42)),
- "kwargannotation but no kwarg")
- check(arguments(kwargannotation=ast.Name("x", ast.Store()),
- kwarg="x"), "must have Load context")
check(arguments(defaults=[ast.Num(3)]),
"more positional defaults than args")
check(arguments(kw_defaults=[ast.Num(4)]),
@@ -599,7 +607,7 @@ class ASTValidatorTests(unittest.TestCase):
"must have Load context")
def test_funcdef(self):
- a = ast.arguments([], None, None, [], None, None, [], [])
+ a = ast.arguments([], None, [], [], None, [])
f = ast.FunctionDef("x", a, [], [], None)
self.stmt(f, "empty body on FunctionDef")
f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
@@ -770,7 +778,7 @@ class ASTValidatorTests(unittest.TestCase):
self.expr(u, "must have Load context")
def test_lambda(self):
- a = ast.arguments([], None, None, [], None, None, [], [])
+ a = ast.arguments([], None, [], [], None, [])
self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
"must have Load context")
def fac(args):
@@ -928,6 +936,9 @@ class ASTValidatorTests(unittest.TestCase):
def test_tuple(self):
self._sequence(ast.Tuple)
+ def test_nameconstant(self):
+ self.expr(ast.NameConstant(4), "singleton must be True, False, or None")
+
def test_stdlib_validates(self):
stdlib = os.path.dirname(ast.__file__)
tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
@@ -936,13 +947,10 @@ class ASTValidatorTests(unittest.TestCase):
fn = os.path.join(stdlib, module)
with open(fn, "r", encoding="utf-8") as fp:
source = fp.read()
- mod = ast.parse(source)
+ mod = ast.parse(source, fn)
compile(mod, fn, "exec")
-def test_main():
- support.run_unittest(AST_Tests, ASTHelpers_Test, ASTValidatorTests)
-
def main():
if __name__ != '__main__':
return
@@ -955,20 +963,20 @@ def main():
print("]")
print("main()")
raise SystemExit
- test_main()
+ unittest.main()
#### EVERYTHING BELOW IS GENERATED #####
exec_results = [
-('Module', [('Expr', (1, 0), ('Name', (1, 0), 'None', ('Load',)))]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Pass', (1, 9))], [], None)]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', 'a', None)], None, None, [], None, None, [], []), [('Pass', (1, 10))], [], None)]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', 'a', None)], None, None, [], None, None, [('Num', (1, 8), 0)], []), [('Pass', (1, 12))], [], None)]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], 'args', None, [], None, None, [], []), [('Pass', (1, 14))], [], None)]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], 'kwargs', None, [], []), [('Pass', (1, 17))], [], None)]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', 'a', None), ('arg', 'b', None), ('arg', 'c', None), ('arg', 'd', None), ('arg', 'e', None)], 'args', None, [], 'kwargs', None, [('Num', (1, 11), 1), ('Name', (1, 16), 'None', ('Load',)), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])], []), [('Pass', (1, 52))], [], None)]),
+('Module', [('Expr', (1, 0), ('NameConstant', (1, 0), None))]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None)]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, []), [('Pass', (1, 10))], [], None)]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, [('Num', (1, 8), 0)]), [('Pass', (1, 12))], [], None)]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None), [], [], None, []), [('Pass', (1, 14))], [], None)]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None), []), [('Pass', (1, 17))], [], None)]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None), ('arg', (1, 9), 'b', None), ('arg', (1, 14), 'c', None), ('arg', (1, 22), 'd', None), ('arg', (1, 28), 'e', None)], ('arg', (1, 35), 'args', None), [], [], ('arg', (1, 43), 'kwargs', None), [('Num', (1, 11), 1), ('NameConstant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Pass', (1, 52))], [], None)]),
('Module', [('ClassDef', (1, 0), 'C', [], [], None, None, [('Pass', (1, 8))], [])]),
('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], None, None, [('Pass', (1, 17))], [])]),
-('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Return', (1, 8), ('Num', (1, 15), 1))], [], None)]),
+('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Return', (1, 8), ('Num', (1, 15), 1))], [], None)]),
('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Num', (1, 5), 1))]),
@@ -977,7 +985,7 @@ exec_results = [
('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))])]),
('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))])]),
-('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]),
+('Module', [('Raise', (1, 0), ('Call', (1, 15), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]),
('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])]),
('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])]),
('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
@@ -1002,29 +1010,29 @@ single_results = [
('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
]
eval_results = [
-('Expression', ('Name', (1, 0), 'None', ('Load',))),
+('Expression', ('NameConstant', (1, 0), None)),
('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
-('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, [], None, None, [], []), ('Name', (1, 7), 'None', ('Load',)))),
+('Expression', ('Lambda', (1, 0), ('arguments', [], None, [], [], None, []), ('NameConstant', (1, 7), None))),
('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])),
('Expression', ('Dict', (1, 0), [], [])),
-('Expression', ('Set', (1, 0), [('Name', (1, 1), 'None', ('Load',))])),
+('Expression', ('Set', (1, 0), [('NameConstant', (1, 1), None)])),
('Expression', ('Dict', (1, 0), [('Num', (2, 6), 1)], [('Num', (4, 10), 2)])),
('Expression', ('ListComp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))])])),
('Expression', ('GeneratorExp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))])])),
('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])),
-('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Num', (1, 2), 1), ('Num', (1, 4), 2)], [('keyword', 'c', ('Num', (1, 8), 3))], ('Name', (1, 11), 'd', ('Load',)), ('Name', (1, 15), 'e', ('Load',)))),
+('Expression', ('Call', (1, 1), ('Name', (1, 0), 'f', ('Load',)), [('Num', (1, 2), 1), ('Num', (1, 4), 2)], [('keyword', 'c', ('Num', (1, 8), 3))], ('Name', (1, 11), 'd', ('Load',)), ('Name', (1, 15), 'e', ('Load',)))),
('Expression', ('Num', (1, 0), 10)),
('Expression', ('Str', (1, 0), 'string')),
-('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
-('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
+('Expression', ('Attribute', (1, 2), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
+('Expression', ('Subscript', (1, 2), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
('Expression', ('Name', (1, 0), 'v', ('Load',))),
('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
('Expression', ('List', (1, 0), [], ('Load',))),
('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))),
('Expression', ('Tuple', (1, 1), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
('Expression', ('Tuple', (1, 0), [], ('Load',))),
-('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [], None, None)),
+('Expression', ('Call', (1, 7), ('Attribute', (1, 6), ('Attribute', (1, 4), ('Attribute', (1, 2), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 12), ('Attribute', (1, 10), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [], None, None)),
]
main()
diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py
index c79fe6f..f93a52d 100644
--- a/Lib/test/test_asynchat.py
+++ b/Lib/test/test_asynchat.py
@@ -15,6 +15,7 @@ except ImportError:
HOST = support.HOST
SERVER_QUIT = b'QUIT\n'
+TIMEOUT = 3.0
if threading:
class echo_server(threading.Thread):
@@ -123,7 +124,9 @@ class TestAsynchat(unittest.TestCase):
c.push(b"I'm not dead yet!" + term)
c.push(SERVER_QUIT)
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"])
@@ -154,7 +157,9 @@ class TestAsynchat(unittest.TestCase):
c.push(data)
c.push(SERVER_QUIT)
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents, [data[:termlen]])
@@ -174,7 +179,9 @@ class TestAsynchat(unittest.TestCase):
c.push(data)
c.push(SERVER_QUIT)
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents, [])
self.assertEqual(c.buffer, data)
@@ -186,7 +193,9 @@ class TestAsynchat(unittest.TestCase):
p = asynchat.simple_producer(data+SERVER_QUIT, buffer_size=8)
c.push_with_producer(p)
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"])
@@ -196,7 +205,9 @@ class TestAsynchat(unittest.TestCase):
data = b"hello world\nI'm not dead yet!\n"
c.push_with_producer(data+SERVER_QUIT)
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"])
@@ -207,7 +218,9 @@ class TestAsynchat(unittest.TestCase):
c.push(b"hello world\n\nI'm not dead yet!\n")
c.push(SERVER_QUIT)
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents,
[b"hello world", b"", b"I'm not dead yet!"])
@@ -226,7 +239,9 @@ class TestAsynchat(unittest.TestCase):
# where the server echoes all of its data before we can check that it
# got any down below.
s.start_resend_event.set()
- s.join()
+ s.join(timeout=TIMEOUT)
+ if s.is_alive():
+ self.fail("join() timed out")
self.assertEqual(c.contents, [])
# the server might have been able to send a byte or two back, but this
@@ -268,9 +283,5 @@ class TestFifo(unittest.TestCase):
self.assertEqual(f.pop(), (0, None))
-def test_main(verbose=None):
- support.run_unittest(TestAsynchat, TestAsynchat_WithPoll,
- TestHelperFunctions, TestFifo)
-
if __name__ == "__main__":
- test_main(verbose=True)
+ unittest.main()
diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py
index 878b26c..c02a976 100644
--- a/Lib/test/test_asyncore.py
+++ b/Lib/test/test_asyncore.py
@@ -20,7 +20,7 @@ except ImportError:
threading = None
HOST = support.HOST
-
+TIMEOUT = 3
HAS_UNIX_SOCKETS = hasattr(socket, 'AF_UNIX')
class dummysocket:
@@ -397,7 +397,10 @@ class DispatcherWithSendTests(unittest.TestCase):
self.assertEqual(cap.getvalue(), data*2)
finally:
- t.join()
+ t.join(timeout=TIMEOUT)
+ if t.is_alive():
+ self.fail("join() timed out")
+
class DispatcherWithSendTests_UsePoll(DispatcherWithSendTests):
@@ -756,7 +759,7 @@ class BaseTestAPI:
s2 = asyncore.dispatcher()
s2.create_socket(self.family)
# EADDRINUSE indicates the socket was correctly bound
- self.assertRaises(socket.error, s2.bind, (self.addr[0], port))
+ self.assertRaises(OSError, s2.bind, (self.addr[0], port))
def test_set_reuse_addr(self):
if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
@@ -764,7 +767,7 @@ class BaseTestAPI:
sock = socket.socket(self.family)
try:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- except socket.error:
+ except OSError:
unittest.skip("SO_REUSEADDR not supported on this platform")
else:
# if SO_REUSEADDR succeeded for sock we expect asyncore
@@ -789,7 +792,11 @@ class BaseTestAPI:
t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1,
count=500))
t.start()
- self.addCleanup(t.join)
+ def cleanup():
+ t.join(timeout=TIMEOUT)
+ if t.is_alive():
+ self.fail("join() timed out")
+ self.addCleanup(cleanup)
s = socket.socket(self.family, socket.SOCK_STREAM)
s.settimeout(.2)
@@ -797,7 +804,7 @@ class BaseTestAPI:
struct.pack('ii', 1, 0))
try:
s.connect(server.address)
- except socket.error:
+ except OSError:
pass
finally:
s.close()
diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py
index 5200af7..3e25236 100644
--- a/Lib/test/test_atexit.py
+++ b/Lib/test/test_atexit.py
@@ -2,6 +2,7 @@ import sys
import unittest
import io
import atexit
+import _testcapi
from test import support
### helpers
@@ -23,7 +24,9 @@ def raise1():
def raise2():
raise SystemError
-class TestCase(unittest.TestCase):
+
+class GeneralTest(unittest.TestCase):
+
def setUp(self):
self.save_stdout = sys.stdout
self.save_stderr = sys.stderr
@@ -122,8 +125,43 @@ class TestCase(unittest.TestCase):
self.assertEqual(l, [5])
+class SubinterpreterTest(unittest.TestCase):
+
+ def test_callbacks_leak(self):
+ # This test shows a leak in refleak mode if atexit doesn't
+ # take care to free callbacks in its per-subinterpreter module
+ # state.
+ n = atexit._ncallbacks()
+ code = r"""if 1:
+ import atexit
+ def f():
+ pass
+ atexit.register(f)
+ del atexit
+ """
+ ret = _testcapi.run_in_subinterp(code)
+ self.assertEqual(ret, 0)
+ self.assertEqual(atexit._ncallbacks(), n)
+
+ def test_callbacks_leak_refcycle(self):
+ # Similar to the above, but with a refcycle through the atexit
+ # module.
+ n = atexit._ncallbacks()
+ code = r"""if 1:
+ import atexit
+ def f():
+ pass
+ atexit.register(f)
+ atexit.__atexit = atexit
+ """
+ ret = _testcapi.run_in_subinterp(code)
+ self.assertEqual(ret, 0)
+ self.assertEqual(atexit._ncallbacks(), n)
+
+
def test_main():
- support.run_unittest(TestCase)
+ support.run_unittest(__name__)
+
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py
index 7b9bd19..580a963 100644
--- a/Lib/test/test_bisect.py
+++ b/Lib/test/test_bisect.py
@@ -7,7 +7,7 @@ py_bisect = support.import_fresh_module('bisect', blocked=['_bisect'])
c_bisect = support.import_fresh_module('bisect', fresh=['_bisect'])
class Range(object):
- """A trivial range()-like object without any integer width limitations."""
+ """A trivial range()-like object that has an insert() method."""
def __init__(self, start, stop):
self.start = start
self.stop = stop
@@ -120,10 +120,10 @@ class TestBisect:
def test_negative_lo(self):
# Issue 3301
mod = self.module
- self.assertRaises(ValueError, mod.bisect_left, [1, 2, 3], 5, -1, 3),
- self.assertRaises(ValueError, mod.bisect_right, [1, 2, 3], 5, -1, 3),
- self.assertRaises(ValueError, mod.insort_left, [1, 2, 3], 5, -1, 3),
- self.assertRaises(ValueError, mod.insort_right, [1, 2, 3], 5, -1, 3),
+ self.assertRaises(ValueError, mod.bisect_left, [1, 2, 3], 5, -1, 3)
+ self.assertRaises(ValueError, mod.bisect_right, [1, 2, 3], 5, -1, 3)
+ self.assertRaises(ValueError, mod.insort_left, [1, 2, 3], 5, -1, 3)
+ self.assertRaises(ValueError, mod.insort_right, [1, 2, 3], 5, -1, 3)
def test_large_range(self):
# Issue 13496
diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py
index 747e2a2..a4fb770 100644
--- a/Lib/test/test_buffer.py
+++ b/Lib/test/test_buffer.py
@@ -4283,9 +4283,5 @@ class TestBufferProtocol(unittest.TestCase):
self.assertRaises(BufferError, memoryview, x)
-def test_main():
- support.run_unittest(TestBufferProtocol)
-
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index c342a43..acbc29c 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -464,6 +464,11 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError, eval, ())
self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
+ class X:
+ def __getitem__(self, key):
+ raise ValueError
+ self.assertRaises(ValueError, eval, "foo", {}, X())
+
def test_general_eval(self):
# Tests that general mappings can be used for the locals argument
@@ -579,7 +584,10 @@ class BuiltinTest(unittest.TestCase):
raise frozendict_error("frozendict is readonly")
# read-only builtins
- frozen_builtins = frozendict(__builtins__)
+ if isinstance(__builtins__, types.ModuleType):
+ frozen_builtins = frozendict(__builtins__.__dict__)
+ else:
+ frozen_builtins = frozendict(__builtins__)
code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
self.assertRaises(frozendict_error,
exec, code, {'__builtins__': frozen_builtins})
@@ -839,8 +847,19 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(max(1, 2.0, 3), 3)
self.assertEqual(max(1.0, 2, 3), 3)
+ self.assertRaises(TypeError, max)
+ self.assertRaises(TypeError, max, 42)
+ self.assertRaises(ValueError, max, ())
+ class BadSeq:
+ def __getitem__(self, index):
+ raise ValueError
+ self.assertRaises(ValueError, max, BadSeq())
+
for stmt in (
"max(key=int)", # no args
+ "max(default=None)",
+ "max(1, 2, default=None)", # require container for default
+ "max(default=None, key=int)",
"max(1, key=int)", # single arg not iterable
"max(1, 2, keystone=int)", # wrong keyword
"max(1, 2, key=int, abc=int)", # two many keywords
@@ -857,6 +876,13 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
self.assertEqual(max(1, 2, key=neg), 1) # two elems
+ self.assertEqual(max((), default=None), None) # zero elem iterable
+ self.assertEqual(max((1,), default=None), 1) # one elem iterable
+ self.assertEqual(max((1,2), default=None), 2) # two elem iterable
+
+ self.assertEqual(max((), default=1, key=neg), 1)
+ self.assertEqual(max((1, 2), default=3, key=neg), 1)
+
data = [random.randrange(200) for i in range(100)]
keys = dict((elem, random.randrange(50)) for elem in data)
f = keys.__getitem__
@@ -883,6 +909,9 @@ class BuiltinTest(unittest.TestCase):
for stmt in (
"min(key=int)", # no args
+ "min(default=None)",
+ "min(1, 2, default=None)", # require container for default
+ "min(default=None, key=int)",
"min(1, key=int)", # single arg not iterable
"min(1, 2, keystone=int)", # wrong keyword
"min(1, 2, key=int, abc=int)", # two many keywords
@@ -899,6 +928,13 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
self.assertEqual(min(1, 2, key=neg), 2) # two elems
+ self.assertEqual(min((), default=None), None) # zero elem iterable
+ self.assertEqual(min((1,), default=None), 1) # one elem iterable
+ self.assertEqual(min((1,2), default=None), 1) # two elem iterable
+
+ self.assertEqual(min((), default=1, key=neg), 1)
+ self.assertEqual(min((1, 2), default=1, key=neg), 2)
+
data = [random.randrange(200) for i in range(100)]
keys = dict((elem, random.randrange(50)) for elem in data)
f = keys.__getitem__
@@ -1476,17 +1512,11 @@ class BuiltinTest(unittest.TestCase):
# --------------------------------------------------------------------
# Issue #7994: object.__format__ with a non-empty format string is
# deprecated
- def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
- with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter("always", DeprecationWarning)
- format(obj, fmt_str)
- if should_raise_warning:
- self.assertEqual(len(w), 1)
- self.assertIsInstance(w[0].message, DeprecationWarning)
- self.assertIn('object.__format__ with a non-empty format '
- 'string', str(w[0].message))
+ def test_deprecated_format_string(obj, fmt_str, should_raise):
+ if should_raise:
+ self.assertRaises(TypeError, format, obj, fmt_str)
else:
- self.assertEqual(len(w), 0)
+ format(obj, fmt_str)
fmt_strs = ['', 's']
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index 3520e83..f12f911 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -288,8 +288,22 @@ class BaseBytesTest:
self.assertEqual(self.type2test(b"").join(lst), b"abc")
self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
- self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
- # XXX more...
+ dot_join = self.type2test(b".:").join
+ self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
+ self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
+ self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
+ self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
+ self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
+ # Stress it with many items
+ seq = [b"abc"] * 1000
+ expected = b"abc" + b".:abc" * 999
+ self.assertEqual(dot_join(seq), expected)
+ # Error handling and cleanup when some item in the middle of the
+ # sequence has the wrong type.
+ with self.assertRaises(TypeError):
+ dot_join([bytearray(b"ab"), "cd", b"ef"])
+ with self.assertRaises(TypeError):
+ dot_join([memoryview(b"ab"), "cd", b"ef"])
def test_count(self):
b = self.type2test(b'mississippi')
@@ -759,7 +773,7 @@ class ByteArrayTest(BaseBytesTest, unittest.TestCase):
finally:
try:
os.remove(tfn)
- except os.error:
+ except OSError:
pass
def test_reverse(self):
@@ -1274,6 +1288,11 @@ class BytearrayPEP3137Test(unittest.TestCase,
self.assertEqual(val, newval)
self.assertTrue(val is not newval,
expr+' returned val on a mutable object')
+ sep = self.marshal(b'')
+ newval = sep.join([val])
+ self.assertEqual(val, newval)
+ self.assertIsNot(val, newval)
+
class FixedStringTest(test.string_tests.BaseTest):
diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py
index 912fac1..7090cd6 100644
--- a/Lib/test/test_bz2.py
+++ b/Lib/test/test_bz2.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
from test import support
-from test.support import TESTFN, bigmemtest, _4G
+from test.support import bigmemtest, _4G
import unittest
from io import BytesIO
@@ -18,10 +18,10 @@ except ImportError:
bz2 = support.import_module('bz2')
from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor
-has_cmdline_bunzip2 = sys.platform not in ("win32", "os2emx")
class BaseTest(unittest.TestCase):
"Base for other testcases."
+
TEXT_LINES = [
b'root:x:0:0:root:/root:/bin/bash\n',
b'bin:x:1:1:bin:/bin:\n',
@@ -50,13 +50,17 @@ class BaseTest(unittest.TestCase):
EMPTY_DATA = b'BZh9\x17rE8P\x90\x00\x00\x00\x00'
def setUp(self):
- self.filename = TESTFN
+ self.filename = support.TESTFN
def tearDown(self):
if os.path.isfile(self.filename):
os.unlink(self.filename)
- if has_cmdline_bunzip2:
+ if sys.platform == "win32":
+ # bunzip2 isn't available to run on Windows.
+ def decompress(self, data):
+ return bz2.decompress(data)
+ else:
def decompress(self, data):
pop = subprocess.Popen("bunzip2", shell=True,
stdin=subprocess.PIPE,
@@ -70,31 +74,21 @@ class BaseTest(unittest.TestCase):
ret = bz2.decompress(data)
return ret
- else:
- # bunzip2 isn't available to run on Windows.
- def decompress(self, data):
- return bz2.decompress(data)
class BZ2FileTest(BaseTest):
- "Test BZ2File type miscellaneous methods."
+ "Test the BZ2File class."
def createTempFile(self, streams=1):
with open(self.filename, "wb") as f:
f.write(self.DATA * streams)
def testBadArgs(self):
- with self.assertRaises(TypeError):
- BZ2File(123.456)
- with self.assertRaises(ValueError):
- BZ2File("/dev/null", "z")
- with self.assertRaises(ValueError):
- BZ2File("/dev/null", "rx")
- with self.assertRaises(ValueError):
- BZ2File("/dev/null", "rbt")
- with self.assertRaises(ValueError):
- BZ2File("/dev/null", compresslevel=0)
- with self.assertRaises(ValueError):
- BZ2File("/dev/null", compresslevel=10)
+ self.assertRaises(TypeError, BZ2File, 123.456)
+ self.assertRaises(ValueError, BZ2File, "/dev/null", "z")
+ self.assertRaises(ValueError, BZ2File, "/dev/null", "rx")
+ self.assertRaises(ValueError, BZ2File, "/dev/null", "rbt")
+ self.assertRaises(ValueError, BZ2File, "/dev/null", compresslevel=0)
+ self.assertRaises(ValueError, BZ2File, "/dev/null", compresslevel=10)
def testRead(self):
self.createTempFile()
@@ -215,9 +209,8 @@ class BZ2FileTest(BaseTest):
self.createTempFile()
bz2f = BZ2File(self.filename)
bz2f.close()
- self.assertRaises(ValueError, bz2f.__next__)
- # This call will deadlock if the above .__next__ call failed to
- # release the lock.
+ self.assertRaises(ValueError, next, bz2f)
+ # This call will deadlock if the above call failed to release the lock.
self.assertRaises(ValueError, bz2f.readlines)
def testWrite(self):
@@ -261,8 +254,8 @@ class BZ2FileTest(BaseTest):
bz2f.write(b"abc")
with BZ2File(self.filename, "r") as bz2f:
- self.assertRaises(IOError, bz2f.write, b"a")
- self.assertRaises(IOError, bz2f.writelines, [b"a"])
+ self.assertRaises(OSError, bz2f.write, b"a")
+ self.assertRaises(OSError, bz2f.writelines, [b"a"])
def testAppend(self):
with BZ2File(self.filename, "w") as bz2f:
@@ -380,7 +373,7 @@ class BZ2FileTest(BaseTest):
bz2f.close()
self.assertRaises(ValueError, bz2f.seekable)
- bz2f = BZ2File(BytesIO(), mode="w")
+ bz2f = BZ2File(BytesIO(), "w")
try:
self.assertFalse(bz2f.seekable())
finally:
@@ -406,7 +399,7 @@ class BZ2FileTest(BaseTest):
bz2f.close()
self.assertRaises(ValueError, bz2f.readable)
- bz2f = BZ2File(BytesIO(), mode="w")
+ bz2f = BZ2File(BytesIO(), "w")
try:
self.assertFalse(bz2f.readable())
finally:
@@ -423,7 +416,7 @@ class BZ2FileTest(BaseTest):
bz2f.close()
self.assertRaises(ValueError, bz2f.writable)
- bz2f = BZ2File(BytesIO(), mode="w")
+ bz2f = BZ2File(BytesIO(), "w")
try:
self.assertTrue(bz2f.writable())
finally:
@@ -437,7 +430,7 @@ class BZ2FileTest(BaseTest):
del o
def testOpenNonexistent(self):
- self.assertRaises(IOError, BZ2File, "/non/existent")
+ self.assertRaises(OSError, BZ2File, "/non/existent")
def testReadlinesNoNewline(self):
# Issue #1191043: readlines() fails on a file containing no newline.
@@ -477,7 +470,7 @@ class BZ2FileTest(BaseTest):
# Issue #7205: Using a BZ2File from several threads shouldn't deadlock.
data = b"1" * 2**20
nthreads = 10
- with bz2.BZ2File(self.filename, 'wb') as f:
+ with BZ2File(self.filename, 'wb') as f:
def comp():
for i in range(5):
f.write(data)
@@ -488,28 +481,27 @@ class BZ2FileTest(BaseTest):
t.join()
def testWithoutThreading(self):
- bz2 = support.import_fresh_module("bz2", blocked=("threading",))
- with bz2.BZ2File(self.filename, "wb") as f:
+ module = support.import_fresh_module("bz2", blocked=("threading",))
+ with module.BZ2File(self.filename, "wb") as f:
f.write(b"abc")
- with bz2.BZ2File(self.filename, "rb") as f:
+ with module.BZ2File(self.filename, "rb") as f:
self.assertEqual(f.read(), b"abc")
def testMixedIterationAndReads(self):
self.createTempFile()
linelen = len(self.TEXT_LINES[0])
halflen = linelen // 2
- with bz2.BZ2File(self.filename) as bz2f:
+ with BZ2File(self.filename) as bz2f:
bz2f.read(halflen)
self.assertEqual(next(bz2f), self.TEXT_LINES[0][halflen:])
self.assertEqual(bz2f.read(), self.TEXT[linelen:])
- with bz2.BZ2File(self.filename) as bz2f:
+ with BZ2File(self.filename) as bz2f:
bz2f.readline()
self.assertEqual(next(bz2f), self.TEXT_LINES[1])
self.assertEqual(bz2f.readline(), self.TEXT_LINES[2])
- with bz2.BZ2File(self.filename) as bz2f:
+ with BZ2File(self.filename) as bz2f:
bz2f.readlines()
- with self.assertRaises(StopIteration):
- next(bz2f)
+ self.assertRaises(StopIteration, next, bz2f)
self.assertEqual(bz2f.readlines(), [])
def testMultiStreamOrdering(self):
@@ -577,6 +569,20 @@ class BZ2FileTest(BaseTest):
bz2f.seek(-150, 1)
self.assertEqual(bz2f.read(), self.TEXT[500-150:])
+ def test_read_truncated(self):
+ # Drop the eos_magic field (6 bytes) and CRC (4 bytes).
+ truncated = self.DATA[:-10]
+ with BZ2File(BytesIO(truncated)) as f:
+ self.assertRaises(EOFError, f.read)
+ with BZ2File(BytesIO(truncated)) as f:
+ self.assertEqual(f.read(len(self.TEXT)), self.TEXT)
+ self.assertRaises(EOFError, f.read, 1)
+ # Incomplete 4-byte file header, and block header of at least 146 bits.
+ for i in range(22):
+ with BZ2File(BytesIO(truncated[:i])) as f:
+ self.assertRaises(EOFError, f.read, 1)
+
+
class BZ2CompressorTest(BaseTest):
def testCompress(self):
bz2c = BZ2Compressor()
@@ -703,97 +709,102 @@ class CompressDecompressTest(BaseTest):
class OpenTest(BaseTest):
+ "Test the open function."
+
+ def open(self, *args, **kwargs):
+ return bz2.open(*args, **kwargs)
+
def test_binary_modes(self):
- with bz2.open(self.filename, "wb") as f:
+ with self.open(self.filename, "wb") as f:
f.write(self.TEXT)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read())
+ file_data = self.decompress(f.read())
self.assertEqual(file_data, self.TEXT)
- with bz2.open(self.filename, "rb") as f:
+ with self.open(self.filename, "rb") as f:
self.assertEqual(f.read(), self.TEXT)
- with bz2.open(self.filename, "ab") as f:
+ with self.open(self.filename, "ab") as f:
f.write(self.TEXT)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read())
+ file_data = self.decompress(f.read())
self.assertEqual(file_data, self.TEXT * 2)
def test_implicit_binary_modes(self):
# Test implicit binary modes (no "b" or "t" in mode string).
- with bz2.open(self.filename, "w") as f:
+ with self.open(self.filename, "w") as f:
f.write(self.TEXT)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read())
+ file_data = self.decompress(f.read())
self.assertEqual(file_data, self.TEXT)
- with bz2.open(self.filename, "r") as f:
+ with self.open(self.filename, "r") as f:
self.assertEqual(f.read(), self.TEXT)
- with bz2.open(self.filename, "a") as f:
+ with self.open(self.filename, "a") as f:
f.write(self.TEXT)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read())
+ file_data = self.decompress(f.read())
self.assertEqual(file_data, self.TEXT * 2)
def test_text_modes(self):
text = self.TEXT.decode("ascii")
text_native_eol = text.replace("\n", os.linesep)
- with bz2.open(self.filename, "wt") as f:
+ with self.open(self.filename, "wt") as f:
f.write(text)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read()).decode("ascii")
+ file_data = self.decompress(f.read()).decode("ascii")
self.assertEqual(file_data, text_native_eol)
- with bz2.open(self.filename, "rt") as f:
+ with self.open(self.filename, "rt") as f:
self.assertEqual(f.read(), text)
- with bz2.open(self.filename, "at") as f:
+ with self.open(self.filename, "at") as f:
f.write(text)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read()).decode("ascii")
+ file_data = self.decompress(f.read()).decode("ascii")
self.assertEqual(file_data, text_native_eol * 2)
def test_fileobj(self):
- with bz2.open(BytesIO(self.DATA), "r") as f:
+ with self.open(BytesIO(self.DATA), "r") as f:
self.assertEqual(f.read(), self.TEXT)
- with bz2.open(BytesIO(self.DATA), "rb") as f:
+ with self.open(BytesIO(self.DATA), "rb") as f:
self.assertEqual(f.read(), self.TEXT)
text = self.TEXT.decode("ascii")
- with bz2.open(BytesIO(self.DATA), "rt") as f:
+ with self.open(BytesIO(self.DATA), "rt") as f:
self.assertEqual(f.read(), text)
def test_bad_params(self):
# Test invalid parameter combinations.
- with self.assertRaises(ValueError):
- bz2.open(self.filename, "wbt")
- with self.assertRaises(ValueError):
- bz2.open(self.filename, "rb", encoding="utf-8")
- with self.assertRaises(ValueError):
- bz2.open(self.filename, "rb", errors="ignore")
- with self.assertRaises(ValueError):
- bz2.open(self.filename, "rb", newline="\n")
+ self.assertRaises(ValueError,
+ self.open, self.filename, "wbt")
+ self.assertRaises(ValueError,
+ self.open, self.filename, "rb", encoding="utf-8")
+ self.assertRaises(ValueError,
+ self.open, self.filename, "rb", errors="ignore")
+ self.assertRaises(ValueError,
+ self.open, self.filename, "rb", newline="\n")
def test_encoding(self):
# Test non-default encoding.
text = self.TEXT.decode("ascii")
text_native_eol = text.replace("\n", os.linesep)
- with bz2.open(self.filename, "wt", encoding="utf-16-le") as f:
+ with self.open(self.filename, "wt", encoding="utf-16-le") as f:
f.write(text)
with open(self.filename, "rb") as f:
- file_data = bz2.decompress(f.read()).decode("utf-16-le")
+ file_data = self.decompress(f.read()).decode("utf-16-le")
self.assertEqual(file_data, text_native_eol)
- with bz2.open(self.filename, "rt", encoding="utf-16-le") as f:
+ with self.open(self.filename, "rt", encoding="utf-16-le") as f:
self.assertEqual(f.read(), text)
def test_encoding_error_handler(self):
# Test with non-default encoding error handler.
- with bz2.open(self.filename, "wb") as f:
+ with self.open(self.filename, "wb") as f:
f.write(b"foo\xffbar")
- with bz2.open(self.filename, "rt", encoding="ascii", errors="ignore") \
+ with self.open(self.filename, "rt", encoding="ascii", errors="ignore") \
as f:
self.assertEqual(f.read(), "foobar")
def test_newline(self):
# Test with explicit newline (universal newline mode disabled).
text = self.TEXT.decode("ascii")
- with bz2.open(self.filename, "wt", newline="\n") as f:
+ with self.open(self.filename, "wt", newline="\n") as f:
f.write(text)
- with bz2.open(self.filename, "rt", newline="\r") as f:
+ with self.open(self.filename, "rt", newline="\r") as f:
self.assertEqual(f.readlines(), [text])
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index f1ea5a9..62827e5 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -193,6 +193,9 @@ class TestPendingCalls(unittest.TestCase):
self.pendingcalls_submit(l, n)
self.pendingcalls_wait(l, n)
+
+class SubinterpreterTest(unittest.TestCase):
+
def test_subinterps(self):
import builtins
r, w = os.pipe()
@@ -208,6 +211,7 @@ class TestPendingCalls(unittest.TestCase):
self.assertNotEqual(pickle.load(f), id(sys.modules))
self.assertNotEqual(pickle.load(f), id(builtins))
+
# Bug #6012
class Test6012(unittest.TestCase):
def test(self):
@@ -354,7 +358,8 @@ class TestThreadState(unittest.TestCase):
def test_main():
support.run_unittest(CAPITest, TestPendingCalls, Test6012,
- EmbeddingTest, SkipitemTest, TestThreadState)
+ EmbeddingTest, SkipitemTest, TestThreadState,
+ SubinterpreterTest)
for name in dir(_testcapi):
if name.startswith('test_'):
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index a89d7e4..efe4546 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -4,6 +4,7 @@
import test.support, unittest
import os
+import shutil
import sys
import subprocess
import tempfile
@@ -41,8 +42,10 @@ class CmdLineTest(unittest.TestCase):
def test_version(self):
version = ('Python %d.%d' % sys.version_info[:2]).encode("ascii")
- rc, out, err = assert_python_ok('-V')
- self.assertTrue(err.startswith(version))
+ for switch in '-V', '--version':
+ rc, out, err = assert_python_ok(switch)
+ self.assertFalse(err.startswith(version))
+ self.assertTrue(out.startswith(version))
def test_verbose(self):
# -v causes imports to write to stderr. If the write to
@@ -54,14 +57,49 @@ class CmdLineTest(unittest.TestCase):
self.assertNotIn(b'stack overflow', err)
def test_xoptions(self):
- rc, out, err = assert_python_ok('-c', 'import sys; print(sys._xoptions)')
- opts = eval(out.splitlines()[0])
+ def get_xoptions(*args):
+ # use subprocess module directly because test.script_helper adds
+ # "-X faulthandler" to the command line
+ args = (sys.executable, '-E') + args
+ args += ('-c', 'import sys; print(sys._xoptions)')
+ out = subprocess.check_output(args)
+ opts = eval(out.splitlines()[0])
+ return opts
+
+ opts = get_xoptions()
self.assertEqual(opts, {})
- rc, out, err = assert_python_ok(
- '-Xa', '-Xb=c,d=e', '-c', 'import sys; print(sys._xoptions)')
- opts = eval(out.splitlines()[0])
+
+ opts = get_xoptions('-Xa', '-Xb=c,d=e')
self.assertEqual(opts, {'a': True, 'b': 'c,d=e'})
+ def test_showrefcount(self):
+ def run_python(*args):
+ # this is similar to assert_python_ok but doesn't strip
+ # the refcount from stderr. It can be replaced once
+ # assert_python_ok stops doing that.
+ cmd = [sys.executable]
+ cmd.extend(args)
+ PIPE = subprocess.PIPE
+ p = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE)
+ out, err = p.communicate()
+ p.stdout.close()
+ p.stderr.close()
+ rc = p.returncode
+ self.assertEqual(rc, 0)
+ return rc, out, err
+ code = 'import sys; print(sys._xoptions)'
+ # normally the refcount is hidden
+ rc, out, err = run_python('-c', code)
+ self.assertEqual(out.rstrip(), b'{}')
+ self.assertEqual(err, b'')
+ # "-X showrefcount" shows the refcount, but only in debug builds
+ rc, out, err = run_python('-X', 'showrefcount', '-c', code)
+ self.assertEqual(out.rstrip(), b"{'showrefcount': True}")
+ if hasattr(sys, 'gettotalrefcount'): # debug build
+ self.assertRegex(err, br'^\[\d+ refs, \d+ blocks\]')
+ else:
+ self.assertEqual(err, b'')
+
def test_run_module(self):
# Test expected operation of the '-m' switch
# Switch needs an argument
@@ -70,9 +108,9 @@ class CmdLineTest(unittest.TestCase):
assert_python_failure('-m', 'fnord43520xyz')
# Check the runpy module also gives an error for
# a nonexistent module
- assert_python_failure('-m', 'runpy', 'fnord43520xyz'),
+ assert_python_failure('-m', 'runpy', 'fnord43520xyz')
# All good if module is located and run successfully
- assert_python_ok('-m', 'timeit', '-n', '1'),
+ assert_python_ok('-m', 'timeit', '-n', '1')
def test_run_module_bug1764407(self):
# -m and -i need to play well together
@@ -213,6 +251,23 @@ class CmdLineTest(unittest.TestCase):
self.assertIn(path1.encode('ascii'), out)
self.assertIn(path2.encode('ascii'), out)
+ def test_empty_PYTHONPATH_issue16309(self):
+ # On Posix, it is documented that setting PATH to the
+ # empty string is equivalent to not setting PATH at all,
+ # which is an exception to the rule that in a string like
+ # "/bin::/usr/bin" the empty string in the middle gets
+ # interpreted as '.'
+ code = """if 1:
+ import sys
+ path = ":".join(sys.path)
+ path = path.encode("ascii", "backslashreplace")
+ sys.stdout.buffer.write(path)"""
+ rc1, out1, err1 = assert_python_ok('-c', code, PYTHONPATH="")
+ rc2, out2, err2 = assert_python_ok('-c', code)
+ # regarding to Posix specification, outputs should be equal
+ # for empty and unset PYTHONPATH
+ self.assertEqual(out1, out2)
+
def test_displayhook_unencodable(self):
for encoding in ('ascii', 'latin-1', 'utf-8'):
env = os.environ.copy()
@@ -290,7 +345,7 @@ class CmdLineTest(unittest.TestCase):
rc, out, err = assert_python_ok('-c', code)
self.assertEqual(b'', out)
self.assertRegex(err.decode('ascii', 'ignore'),
- 'Exception OSError: .* ignored')
+ 'Exception ignored in.*\nOSError: .*')
def test_closed_stdout(self):
# Issue #13444: if stdout has been explicitly closed, we should
@@ -385,6 +440,31 @@ class CmdLineTest(unittest.TestCase):
self.assertEqual(b'', out)
+ def test_isolatedmode(self):
+ self.verify_valid_flag('-I')
+ self.verify_valid_flag('-IEs')
+ rc, out, err = assert_python_ok('-I', '-c',
+ 'from sys import flags as f; '
+ 'print(f.no_user_site, f.ignore_environment, f.isolated)',
+ # dummyvar to prevent extranous -E
+ dummyvar="")
+ self.assertEqual(out.strip(), b'1 1 1')
+ with test.support.temp_cwd() as tmpdir:
+ fake = os.path.join(tmpdir, "uuid.py")
+ main = os.path.join(tmpdir, "main.py")
+ with open(fake, "w") as f:
+ f.write("raise RuntimeError('isolated mode test')\n")
+ with open(main, "w") as f:
+ f.write("import uuid\n")
+ f.write("print('ok')\n")
+ self.assertRaises(subprocess.CalledProcessError,
+ subprocess.check_output,
+ [sys.executable, main], cwd=tmpdir,
+ stderr=subprocess.DEVNULL)
+ out = subprocess.check_output([sys.executable, "-I", main],
+ cwd=tmpdir)
+ self.assertEqual(out.strip(), b"ok")
+
def test_main():
test.support.run_unittest(CmdLineTest)
test.support.reap_children()
diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py
index fd88505..84804bb 100644
--- a/Lib/test/test_codeccallbacks.py
+++ b/Lib/test/test_codeccallbacks.py
@@ -875,8 +875,6 @@ class CodecCallbackTest(unittest.TestCase):
with self.assertRaises(TypeError):
data.decode(encoding, "test.replacing")
-def test_main():
- test.support.run_unittest(CodecCallbackTest)
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index c68088e..2f3cf4d 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -2295,8 +2295,8 @@ class CodePageTest(unittest.TestCase):
def test_invalid_code_page(self):
self.assertRaises(ValueError, codecs.code_page_encode, -1, 'a')
self.assertRaises(ValueError, codecs.code_page_decode, -1, b'a')
- self.assertRaises(WindowsError, codecs.code_page_encode, 123, 'a')
- self.assertRaises(WindowsError, codecs.code_page_decode, 123, b'a')
+ self.assertRaises(OSError, codecs.code_page_encode, 123, 'a')
+ self.assertRaises(OSError, codecs.code_page_decode, 123, b'a')
def test_code_page_name(self):
self.assertRaisesRegex(UnicodeEncodeError, 'cp932',
diff --git a/Lib/test/test_coding.py b/Lib/test/test_coding.py
deleted file mode 100644
index 989c7a8..0000000
--- a/Lib/test/test_coding.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import unittest
-from test.support import TESTFN, unlink, unload
-import importlib, os, sys
-
-class CodingTest(unittest.TestCase):
- def test_bad_coding(self):
- module_name = 'bad_coding'
- self.verify_bad_module(module_name)
-
- def test_bad_coding2(self):
- module_name = 'bad_coding2'
- self.verify_bad_module(module_name)
-
- def verify_bad_module(self, module_name):
- self.assertRaises(SyntaxError, __import__, 'test.' + module_name)
-
- path = os.path.dirname(__file__)
- filename = os.path.join(path, module_name + '.py')
- with open(filename, "rb") as fp:
- bytes = fp.read()
- self.assertRaises(SyntaxError, compile, bytes, filename, 'exec')
-
- def test_exec_valid_coding(self):
- d = {}
- exec(b'# coding: cp949\na = "\xaa\xa7"\n', d)
- self.assertEqual(d['a'], '\u3047')
-
- def test_file_parse(self):
- # issue1134: all encodings outside latin-1 and utf-8 fail on
- # multiline strings and long lines (>512 columns)
- unload(TESTFN)
- filename = TESTFN + ".py"
- f = open(filename, "w", encoding="cp1252")
- sys.path.insert(0, os.curdir)
- try:
- with f:
- f.write("# -*- coding: cp1252 -*-\n")
- f.write("'''A short string\n")
- f.write("'''\n")
- f.write("'A very long string %s'\n" % ("X" * 1000))
-
- importlib.invalidate_caches()
- __import__(TESTFN)
- finally:
- del sys.path[0]
- unlink(filename)
- unlink(filename + "c")
- unlink(filename + "o")
- unload(TESTFN)
-
- def test_error_from_string(self):
- # See http://bugs.python.org/issue6289
- input = "# coding: ascii\n\N{SNOWMAN}".encode('utf-8')
- with self.assertRaises(SyntaxError) as c:
- compile(input, "<string>", "exec")
- expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \
- "ordinal not in range(128)"
- self.assertTrue(c.exception.args[0].startswith(expected),
- msg=c.exception.args[0])
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index af27d22..706cc9e 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -112,6 +112,38 @@ class TestChainMap(unittest.TestCase):
self.assertEqual(dict(d), dict(a=1, b=2, c=30))
self.assertEqual(dict(d.items()), dict(a=1, b=2, c=30))
+ def test_new_child(self):
+ 'Tests for changes for issue #16613.'
+ c = ChainMap()
+ c['a'] = 1
+ c['b'] = 2
+ m = {'b':20, 'c': 30}
+ d = c.new_child(m)
+ self.assertEqual(d.maps, [{'b':20, 'c':30}, {'a':1, 'b':2}]) # check internal state
+ self.assertIs(m, d.maps[0])
+
+ # Use a different map than a dict
+ class lowerdict(dict):
+ def __getitem__(self, key):
+ if isinstance(key, str):
+ key = key.lower()
+ return dict.__getitem__(self, key)
+ def __contains__(self, key):
+ if isinstance(key, str):
+ key = key.lower()
+ return dict.__contains__(self, key)
+
+ c = ChainMap()
+ c['a'] = 1
+ c['b'] = 2
+ m = lowerdict(b=20, c=30)
+ d = c.new_child(m)
+ self.assertIs(m, d.maps[0])
+ for key in 'abc': # check contains
+ self.assertIn(key, d)
+ for k, v in dict(a=1, B=20, C=30, z=100).items(): # check get
+ self.assertEqual(d.get(k, 100), v)
+
################################################################################
### Named Tuples
@@ -886,23 +918,26 @@ class TestCounter(unittest.TestCase):
words = Counter('which witch had which witches wrist watch'.split())
update_test = Counter()
update_test.update(words)
- for i, dup in enumerate([
- words.copy(),
- copy.copy(words),
- copy.deepcopy(words),
- pickle.loads(pickle.dumps(words, 0)),
- pickle.loads(pickle.dumps(words, 1)),
- pickle.loads(pickle.dumps(words, 2)),
- pickle.loads(pickle.dumps(words, -1)),
- eval(repr(words)),
- update_test,
- Counter(words),
- ]):
- msg = (i, dup, words)
- self.assertTrue(dup is not words)
- self.assertEqual(dup, words)
- self.assertEqual(len(dup), len(words))
- self.assertEqual(type(dup), type(words))
+ for label, dup in [
+ ('words.copy()', words.copy()),
+ ('copy.copy(words)', copy.copy(words)),
+ ('copy.deepcopy(words)', copy.deepcopy(words)),
+ ('pickle.loads(pickle.dumps(words, 0))',
+ pickle.loads(pickle.dumps(words, 0))),
+ ('pickle.loads(pickle.dumps(words, 1))',
+ pickle.loads(pickle.dumps(words, 1))),
+ ('pickle.loads(pickle.dumps(words, 2))',
+ pickle.loads(pickle.dumps(words, 2))),
+ ('pickle.loads(pickle.dumps(words, -1))',
+ pickle.loads(pickle.dumps(words, -1))),
+ ('eval(repr(words))', eval(repr(words))),
+ ('update_test', update_test),
+ ('Counter(words)', Counter(words)),
+ ]:
+ with self.subTest(label=label):
+ msg = "\ncopy: %s\nwords: %s" % (dup, words)
+ self.assertIsNot(dup, words, msg)
+ self.assertEqual(dup, words)
def test_copy_subclass(self):
class MyCounter(Counter):
@@ -1181,24 +1216,28 @@ class TestOrderedDict(unittest.TestCase):
od = OrderedDict(pairs)
update_test = OrderedDict()
update_test.update(od)
- for i, dup in enumerate([
- od.copy(),
- copy.copy(od),
- copy.deepcopy(od),
- pickle.loads(pickle.dumps(od, 0)),
- pickle.loads(pickle.dumps(od, 1)),
- pickle.loads(pickle.dumps(od, 2)),
- pickle.loads(pickle.dumps(od, 3)),
- pickle.loads(pickle.dumps(od, -1)),
- eval(repr(od)),
- update_test,
- OrderedDict(od),
- ]):
- self.assertTrue(dup is not od)
- self.assertEqual(dup, od)
- self.assertEqual(list(dup.items()), list(od.items()))
- self.assertEqual(len(dup), len(od))
- self.assertEqual(type(dup), type(od))
+ for label, dup in [
+ ('od.copy()', od.copy()),
+ ('copy.copy(od)', copy.copy(od)),
+ ('copy.deepcopy(od)', copy.deepcopy(od)),
+ ('pickle.loads(pickle.dumps(od, 0))',
+ pickle.loads(pickle.dumps(od, 0))),
+ ('pickle.loads(pickle.dumps(od, 1))',
+ pickle.loads(pickle.dumps(od, 1))),
+ ('pickle.loads(pickle.dumps(od, 2))',
+ pickle.loads(pickle.dumps(od, 2))),
+ ('pickle.loads(pickle.dumps(od, 3))',
+ pickle.loads(pickle.dumps(od, 3))),
+ ('pickle.loads(pickle.dumps(od, -1))',
+ pickle.loads(pickle.dumps(od, -1))),
+ ('eval(repr(od))', eval(repr(od))),
+ ('update_test', update_test),
+ ('OrderedDict(od)', OrderedDict(od)),
+ ]:
+ with self.subTest(label=label):
+ msg = "\ncopy: %s\nod: %s" % (dup, od)
+ self.assertIsNot(dup, od, msg)
+ self.assertEqual(dup, od)
def test_yaml_linkage(self):
# Verify that __reduce__ is setup in a way that supports PyYAML's dump() feature.
@@ -1213,9 +1252,18 @@ class TestOrderedDict(unittest.TestCase):
# do not save instance dictionary if not needed
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
od = OrderedDict(pairs)
- self.assertEqual(len(od.__reduce__()), 2)
+ self.assertIsNone(od.__reduce__()[2])
od.x = 10
- self.assertEqual(len(od.__reduce__()), 3)
+ self.assertIsNotNone(od.__reduce__()[2])
+
+ def test_pickle_recursive(self):
+ od = OrderedDict()
+ od[1] = od
+ for proto in range(-1, pickle.HIGHEST_PROTOCOL + 1):
+ dup = pickle.loads(pickle.dumps(od, proto))
+ self.assertIsNot(dup, od)
+ self.assertEqual(list(dup.keys()), [1])
+ self.assertIs(dup[1], dup)
def test_repr(self):
od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])
diff --git a/Lib/test/test_colorsys.py b/Lib/test/test_colorsys.py
index e405b8a..a24e3ad 100644
--- a/Lib/test/test_colorsys.py
+++ b/Lib/test/test_colorsys.py
@@ -1,4 +1,4 @@
-import unittest, test.support
+import unittest
import colorsys
def frange(start, stop, step):
@@ -69,8 +69,32 @@ class ColorsysTest(unittest.TestCase):
self.assertTripleEqual(hls, colorsys.rgb_to_hls(*rgb))
self.assertTripleEqual(rgb, colorsys.hls_to_rgb(*hls))
-def test_main():
- test.support.run_unittest(ColorsysTest)
+ def test_yiq_roundtrip(self):
+ for r in frange(0.0, 1.0, 0.2):
+ for g in frange(0.0, 1.0, 0.2):
+ for b in frange(0.0, 1.0, 0.2):
+ rgb = (r, g, b)
+ self.assertTripleEqual(
+ rgb,
+ colorsys.yiq_to_rgb(*colorsys.rgb_to_yiq(*rgb))
+ )
+
+ def test_yiq_values(self):
+ values = [
+ # rgb, yiq
+ ((0.0, 0.0, 0.0), (0.0, 0.0, 0.0)), # black
+ ((0.0, 0.0, 1.0), (0.11, -0.3217, 0.3121)), # blue
+ ((0.0, 1.0, 0.0), (0.59, -0.2773, -0.5251)), # green
+ ((0.0, 1.0, 1.0), (0.7, -0.599, -0.213)), # cyan
+ ((1.0, 0.0, 0.0), (0.3, 0.599, 0.213)), # red
+ ((1.0, 0.0, 1.0), (0.41, 0.2773, 0.5251)), # purple
+ ((1.0, 1.0, 0.0), (0.89, 0.3217, -0.3121)), # yellow
+ ((1.0, 1.0, 1.0), (1.0, 0.0, 0.0)), # white
+ ((0.5, 0.5, 0.5), (0.5, 0.0, 0.0)), # grey
+ ]
+ for (rgb, yiq) in values:
+ self.assertTripleEqual(yiq, colorsys.rgb_to_yiq(*rgb))
+ self.assertTripleEqual(rgb, colorsys.yiq_to_rgb(*yiq))
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py
index ba9fe46..cf58ca6 100644
--- a/Lib/test/test_compileall.py
+++ b/Lib/test/test_compileall.py
@@ -1,11 +1,12 @@
import sys
import compileall
-import imp
+import importlib.util
import os
import py_compile
import shutil
import struct
import subprocess
+import sys
import tempfile
import time
import unittest
@@ -18,11 +19,11 @@ class CompileallTests(unittest.TestCase):
def setUp(self):
self.directory = tempfile.mkdtemp()
self.source_path = os.path.join(self.directory, '_test.py')
- self.bc_path = imp.cache_from_source(self.source_path)
+ self.bc_path = importlib.util.cache_from_source(self.source_path)
with open(self.source_path, 'w') as file:
file.write('x = 123\n')
self.source_path2 = os.path.join(self.directory, '_test2.py')
- self.bc_path2 = imp.cache_from_source(self.source_path2)
+ self.bc_path2 = importlib.util.cache_from_source(self.source_path2)
shutil.copyfile(self.source_path, self.source_path2)
self.subdirectory = os.path.join(self.directory, '_subdir')
os.mkdir(self.subdirectory)
@@ -36,7 +37,7 @@ class CompileallTests(unittest.TestCase):
with open(self.bc_path, 'rb') as file:
data = file.read(8)
mtime = int(os.stat(self.source_path).st_mtime)
- compare = struct.pack('<4sl', imp.get_magic(), mtime)
+ compare = struct.pack('<4sl', importlib.util.MAGIC_NUMBER, mtime)
return data, compare
def recreation_check(self, metadata):
@@ -57,7 +58,8 @@ class CompileallTests(unittest.TestCase):
def test_mtime(self):
# Test a change in mtime leads to a new .pyc.
- self.recreation_check(struct.pack('<4sl', imp.get_magic(), 1))
+ self.recreation_check(struct.pack('<4sl', importlib.util.MAGIC_NUMBER,
+ 1))
def test_magic_number(self):
# Test a change in mtime leads to a new .pyc.
@@ -97,14 +99,14 @@ class CompileallTests(unittest.TestCase):
# interpreter's creates the correct file names
optimize = 1 if __debug__ else 0
compileall.compile_dir(self.directory, quiet=True, optimize=optimize)
- cached = imp.cache_from_source(self.source_path,
- debug_override=not optimize)
+ cached = importlib.util.cache_from_source(self.source_path,
+ debug_override=not optimize)
self.assertTrue(os.path.isfile(cached))
- cached2 = imp.cache_from_source(self.source_path2,
- debug_override=not optimize)
+ cached2 = importlib.util.cache_from_source(self.source_path2,
+ debug_override=not optimize)
self.assertTrue(os.path.isfile(cached2))
- cached3 = imp.cache_from_source(self.source_path3,
- debug_override=not optimize)
+ cached3 = importlib.util.cache_from_source(self.source_path3,
+ debug_override=not optimize)
self.assertTrue(os.path.isfile(cached3))
@@ -152,10 +154,12 @@ class CommandLineTests(unittest.TestCase):
return rc, out, err
def assertCompiled(self, fn):
- self.assertTrue(os.path.exists(imp.cache_from_source(fn)))
+ path = importlib.util.cache_from_source(fn)
+ self.assertTrue(os.path.exists(path))
def assertNotCompiled(self, fn):
- self.assertFalse(os.path.exists(imp.cache_from_source(fn)))
+ path = importlib.util.cache_from_source(fn)
+ self.assertFalse(os.path.exists(path))
def setUp(self):
self.addCleanup(self._cleanup)
@@ -190,8 +194,8 @@ class CommandLineTests(unittest.TestCase):
['-m', 'compileall', '-q', self.pkgdir]))
# Verify the __pycache__ directory contents.
self.assertTrue(os.path.exists(self.pkgdir_cachedir))
- expected = sorted(base.format(imp.get_tag(), ext) for base in
- ('__init__.{}.{}', 'bar.{}.{}'))
+ expected = sorted(base.format(sys.implementation.cache_tag, ext)
+ for base in ('__init__.{}.{}', 'bar.{}.{}'))
self.assertEqual(sorted(os.listdir(self.pkgdir_cachedir)), expected)
# Make sure there are no .pyc files in the source directory.
self.assertFalse([fn for fn in os.listdir(self.pkgdir)
@@ -224,7 +228,7 @@ class CommandLineTests(unittest.TestCase):
def test_force(self):
self.assertRunOK('-q', self.pkgdir)
- pycpath = imp.cache_from_source(self.barfn)
+ pycpath = importlib.util.cache_from_source(self.barfn)
# set atime/mtime backward to avoid file timestamp resolution issues
os.utime(pycpath, (time.time()-60,)*2)
mtime = os.stat(pycpath).st_mtime
@@ -288,7 +292,7 @@ class CommandLineTests(unittest.TestCase):
bazfn = script_helper.make_script(self.pkgdir, 'baz', 'raise Exception')
self.assertRunOK('-q', '-d', 'dinsdale', self.pkgdir)
fn = script_helper.make_script(self.pkgdir, 'bing', 'import baz')
- pyc = imp.cache_from_source(bazfn)
+ pyc = importlib.util.cache_from_source(bazfn)
os.rename(pyc, os.path.join(self.pkgdir, 'baz.pyc'))
os.remove(bazfn)
rc, out, err = script_helper.assert_python_failure(fn)
@@ -299,7 +303,7 @@ class CommandLineTests(unittest.TestCase):
'-i', os.path.join(self.directory, 'nosuchfile'), self.pkgdir)
self.assertRegex(out, b'rror.*nosuchfile')
self.assertNotRegex(err, b'Traceback')
- self.assertFalse(os.path.exists(imp.cache_from_source(
+ self.assertFalse(os.path.exists(importlib.util.cache_from_source(
self.pkgdir_cachedir)))
def test_include_file_with_arg(self):
@@ -356,13 +360,5 @@ class CommandLineTests(unittest.TestCase):
self.assertRegex(out, b"Can't list 'badfilename'")
-def test_main():
- support.run_unittest(
- CommandLineTests,
- CompileallTests,
- EncodingTest,
- )
-
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py
index 6b34ddc..2a85bf4 100644
--- a/Lib/test/test_complex.py
+++ b/Lib/test/test_complex.py
@@ -221,6 +221,8 @@ class ComplexTest(unittest.TestCase):
self.assertRaises(TypeError, complex, OS(None))
self.assertRaises(TypeError, complex, NS(None))
self.assertRaises(TypeError, complex, {})
+ self.assertRaises(TypeError, complex, NS(1.5))
+ self.assertRaises(TypeError, complex, NS(1))
self.assertAlmostEqual(complex("1+10j"), 1+10j)
self.assertAlmostEqual(complex(10), 10+0j)
diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
index 6ae450d..4ad3309 100644
--- a/Lib/test/test_concurrent_futures.py
+++ b/Lib/test/test_concurrent_futures.py
@@ -15,6 +15,7 @@ import sys
import threading
import time
import unittest
+import weakref
from concurrent import futures
from concurrent.futures._base import (
@@ -52,6 +53,11 @@ def sleep_and_print(t, msg):
sys.stdout.flush()
+class MyObject(object):
+ def my_method(self):
+ pass
+
+
class ExecutorMixin:
worker_count = 5
@@ -396,6 +402,22 @@ class ExecutorTest(unittest.TestCase):
self.executor.map(str, [2] * (self.worker_count + 1))
self.executor.shutdown()
+ @test.support.cpython_only
+ def test_no_stale_references(self):
+ # Issue #16284: check that the executors don't unnecessarily hang onto
+ # references.
+ my_object = MyObject()
+ my_object_collected = threading.Event()
+ my_object_callback = weakref.ref(
+ my_object, lambda obj: my_object_collected.set())
+ # Deliberately discarding the future.
+ self.executor.submit(my_object.my_method)
+ del my_object
+
+ collected = my_object_collected.wait(timeout=5.0)
+ self.assertTrue(collected,
+ "Stale reference not collected within timeout.")
+
class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest):
def test_map_submits_without_iteration(self):
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
index e52ed91..a38cc48 100644
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -594,10 +594,28 @@ class TestExitStack(unittest.TestCase):
stack.push(cm)
self.assertIs(stack._exit_callbacks[-1], cm)
+class TestIgnored(unittest.TestCase):
+
+ def test_no_exception(self):
+
+ with ignored(ValueError):
+ self.assertEqual(pow(2, 5), 32)
+
+ def test_exact_exception(self):
+
+ with ignored(TypeError):
+ len(5)
+
+ def test_multiple_exception_args(self):
+
+ with ignored(ZeroDivisionError, TypeError):
+ len(5)
+
+ def test_exception_hierarchy(self):
+
+ with ignored(LookupError):
+ 'Hello'[50]
-# This is needed to make the test actually run under regrtest.py!
-def test_main():
- support.run_unittest(__name__)
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
index 5676668..c3eb7fa 100644
--- a/Lib/test/test_cprofile.py
+++ b/Lib/test/test_cprofile.py
@@ -6,9 +6,11 @@ from test.support import run_unittest, TESTFN, unlink
# rip off all interesting stuff from test_profile
import cProfile
from test.test_profile import ProfileTest, regenerate_expected_output
+from test.profilee import testfunc
class CProfileTest(ProfileTest):
profilerclass = cProfile.Profile
+ profilermodule = cProfile
expected_max_output = "{built-in method max}"
def get_expected_output(self):
diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py
index cfb7341..624d702 100644
--- a/Lib/test/test_crypt.py
+++ b/Lib/test/test_crypt.py
@@ -1,11 +1,7 @@
from test import support
import unittest
-def setUpModule():
- # this import will raise unittest.SkipTest if _crypt doesn't exist,
- # so it has to be done in setUpModule for test discovery to work
- global crypt
- crypt = support.import_module('crypt')
+crypt = support.import_module('crypt')
class CryptTestCase(unittest.TestCase):
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 5e28586..559e51f 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -136,12 +136,12 @@ class Test_Csv(unittest.TestCase):
return 10;
def __getitem__(self, i):
if i > 2:
- raise IOError
- self.assertRaises(IOError, self._write_test, BadList(), '')
+ raise OSError
+ self.assertRaises(OSError, self._write_test, BadList(), '')
class BadItem:
def __str__(self):
- raise IOError
- self.assertRaises(IOError, self._write_test, [BadItem()], '')
+ raise OSError
+ self.assertRaises(OSError, self._write_test, [BadItem()], '')
def test_write_bigfield(self):
# This exercises the buffer realloc functionality
@@ -186,9 +186,9 @@ class Test_Csv(unittest.TestCase):
def test_writerows(self):
class BrokenFile:
def write(self, buf):
- raise IOError
+ raise OSError
writer = csv.writer(BrokenFile())
- self.assertRaises(IOError, writer.writerows, [['a']])
+ self.assertRaises(OSError, writer.writerows, [['a']])
with TemporaryFile("w+", newline='') as fileobj:
writer = csv.writer(fileobj)
@@ -308,6 +308,15 @@ class Test_Csv(unittest.TestCase):
for i, row in enumerate(csv.reader(fileobj)):
self.assertEqual(row, rows[i])
+ def test_roundtrip_escaped_unquoted_newlines(self):
+ with TemporaryFile("w+", newline='') as fileobj:
+ writer = csv.writer(fileobj,quoting=csv.QUOTE_NONE,escapechar="\\")
+ rows = [['a\nb','b'],['c','x\r\nd']]
+ writer.writerows(rows)
+ fileobj.seek(0)
+ for i, row in enumerate(csv.reader(fileobj,quoting=csv.QUOTE_NONE,escapechar="\\")):
+ self.assertEqual(row,rows[i])
+
class TestDialectRegistry(unittest.TestCase):
def test_registry_badargs(self):
self.assertRaises(TypeError, csv.list_dialects, None)
diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py
index 243a0af..1c57770 100644
--- a/Lib/test/test_dbm.py
+++ b/Lib/test/test_dbm.py
@@ -62,7 +62,7 @@ class AnyDBMTestCase:
return keys
def test_error(self):
- self.assertTrue(issubclass(self.module.error, IOError))
+ self.assertTrue(issubclass(self.module.error, OSError))
def test_anydbm_not_existing(self):
self.assertRaises(dbm.error, dbm.open, _fname)
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 50a9ad4..ae36893 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -290,7 +290,6 @@ class IBMTestCases(unittest.TestCase):
global skip_expected
if skip_expected:
raise unittest.SkipTest
- return
with open(file) as f:
for line in f:
line = line.replace('\r\n', '').replace('\n', '')
diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py
index a8487d2..7bff1d2 100644
--- a/Lib/test/test_deque.py
+++ b/Lib/test/test_deque.py
@@ -543,8 +543,8 @@ class TestBasic(unittest.TestCase):
check = self.check_sizeof
check(deque(), basesize + blocksize)
check(deque('a'), basesize + blocksize)
- check(deque('a' * (BLOCKLEN // 2)), basesize + blocksize)
- check(deque('a' * (BLOCKLEN // 2 + 1)), basesize + 2 * blocksize)
+ check(deque('a' * (BLOCKLEN - 1)), basesize + blocksize)
+ check(deque('a' * BLOCKLEN), basesize + 2 * blocksize)
check(deque('a' * (42 * BLOCKLEN)), basesize + 43 * blocksize)
class TestVariousIteratorArgs(unittest.TestCase):
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 3776389..f0d6d1c 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1789,6 +1789,7 @@ order (MRO) for bases """
("__trunc__", int, zero, set(), {}),
("__ceil__", math.ceil, zero, set(), {}),
("__dir__", dir, empty_seq, set(), {}),
+ ("__round__", round, zero, set(), {}),
]
class Checker(object):
@@ -2249,7 +2250,9 @@ order (MRO) for bases """
minstance = M("m")
minstance.b = 2
minstance.a = 1
- names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
+ default_attributes = ['__name__', '__doc__', '__package__',
+ '__loader__']
+ names = [x for x in dir(minstance) if x not in default_attributes]
self.assertEqual(names, ['a', 'b'])
class M2(M):
@@ -3733,18 +3736,8 @@ order (MRO) for bases """
# bug).
del c
- # If that didn't blow up, it's also interesting to see whether clearing
- # the last container slot works: that will attempt to delete c again,
- # which will cause c to get appended back to the container again
- # "during" the del. (On non-CPython implementations, however, __del__
- # is typically not called again.)
support.gc_collect()
self.assertEqual(len(C.container), 1)
- del C.container[-1]
- if support.check_impl_detail():
- support.gc_collect()
- self.assertEqual(len(C.container), 1)
- self.assertEqual(C.container[-1].attr, 42)
# Make c mortal again, so that the test framework with -l doesn't report
# it as a leak.
diff --git a/Lib/test/test_devpoll.py b/Lib/test/test_devpoll.py
index bef4e18..ec350cd 100644
--- a/Lib/test/test_devpoll.py
+++ b/Lib/test/test_devpoll.py
@@ -8,7 +8,7 @@ from test.support import TESTFN, run_unittest
try:
select.devpoll
except AttributeError:
- raise unittest.SkipTest("select.devpoll not defined -- skipping test_devpoll")
+ raise unittest.SkipTest("select.devpoll not defined")
def find_ready_matching(ready, flag):
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index 1bcd693..a1c6582 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -1,11 +1,13 @@
# Minimal tests for dis module
from test.support import run_unittest, captured_stdout
+from test.bytecode_helper import BytecodeTestCase
import difflib
import unittest
import sys
import dis
import io
+import types
class _C:
def __init__(self, x):
@@ -22,12 +24,12 @@ dis_c_instance_method = """\
""" % (_C.__init__.__code__.co_firstlineno + 1,)
dis_c_instance_method_bytes = """\
- 0 LOAD_FAST 1 (1)
- 3 LOAD_CONST 1 (1)
- 6 COMPARE_OP 2 (==)
- 9 LOAD_FAST 0 (0)
- 12 STORE_ATTR 0 (0)
- 15 LOAD_CONST 0 (0)
+ 0 LOAD_FAST 1 (1)
+ 3 LOAD_CONST 1 (1)
+ 6 COMPARE_OP 2 (==)
+ 9 LOAD_FAST 0 (0)
+ 12 STORE_ATTR 0 (0)
+ 15 LOAD_CONST 0 (0)
18 RETURN_VALUE
"""
@@ -48,11 +50,11 @@ dis_f = """\
dis_f_co_code = """\
- 0 LOAD_GLOBAL 0 (0)
- 3 LOAD_FAST 0 (0)
- 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
+ 0 LOAD_GLOBAL 0 (0)
+ 3 LOAD_FAST 0 (0)
+ 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
- 10 LOAD_CONST 1 (1)
+ 10 LOAD_CONST 1 (1)
13 RETURN_VALUE
"""
@@ -298,29 +300,16 @@ Filename: (.*)
Argument count: 1
Kw-only arguments: 0
Number of locals: 1
-Stack size: 4
+Stack size: 3
Flags: OPTIMIZED, NEWLOCALS, NOFREE
Constants:
0: %r
- 1: '__func__'
- 2: '__code__'
- 3: '<code_info>'
- 4: 'co_code'
- 5: "don't know how to disassemble %%s objects"
-%sNames:
- 0: hasattr
- 1: __func__
- 2: __code__
- 3: isinstance
- 4: str
- 5: _try_compile
- 6: _format_code_info
- 7: TypeError
- 8: type
- 9: __name__
+Names:
+ 0: _format_code_info
+ 1: _get_code_object
Variable names:
- 0: x""" % (('Formatted details of methods, functions, or code.', ' 6: None\n')
- if sys.flags.optimize < 2 else (None, ''))
+ 0: x""" % (('Formatted details of methods, functions, or code.',)
+ if sys.flags.optimize < 2 else (None,))
@staticmethod
def tricky(x, y, z=True, *args, c, d, e=[], **kwds):
@@ -384,7 +373,7 @@ Free variables:
code_info_expr_str = """\
Name: <module>
-Filename: <code_info>
+Filename: <disassembly>
Argument count: 0
Kw-only arguments: 0
Number of locals: 0
@@ -397,7 +386,7 @@ Names:
code_info_simple_stmt_str = """\
Name: <module>
-Filename: <code_info>
+Filename: <disassembly>
Argument count: 0
Kw-only arguments: 0
Number of locals: 0
@@ -411,7 +400,7 @@ Names:
code_info_compound_stmt_str = """\
Name: <module>
-Filename: <code_info>
+Filename: <disassembly>
Argument count: 0
Kw-only arguments: 0
Number of locals: 0
@@ -445,6 +434,9 @@ class CodeInfoTests(unittest.TestCase):
with captured_stdout() as output:
dis.show_code(x)
self.assertRegex(output.getvalue(), expected+"\n")
+ output = io.StringIO()
+ dis.show_code(x, file=output)
+ self.assertRegex(output.getvalue(), expected)
def test_code_info_object(self):
self.assertRaises(TypeError, dis.code_info, object())
@@ -453,8 +445,289 @@ class CodeInfoTests(unittest.TestCase):
self.assertEqual(dis.pretty_flags(0), '0x0')
+# Fodder for instruction introspection tests
+# Editing any of these may require recalculating the expected output
+def outer(a=1, b=2):
+ def f(c=3, d=4):
+ def inner(e=5, f=6):
+ print(a, b, c, d, e, f)
+ print(a, b, c, d)
+ return inner
+ print(a, b, '', 1, [], {}, "Hello world!")
+ return f
+
+def jumpy():
+ # This won't actually run (but that's OK, we only disassemble it)
+ for i in range(10):
+ print(i)
+ if i < 4:
+ continue
+ if i > 6:
+ break
+ else:
+ print("I can haz else clause?")
+ while i:
+ print(i)
+ i -= 1
+ if i > 6:
+ continue
+ if i < 4:
+ break
+ else:
+ print("Who let lolcatz into this test suite?")
+ try:
+ 1 / 0
+ except ZeroDivisionError:
+ print("Here we go, here we go, here we go...")
+ else:
+ with i as dodgy:
+ print("Never reach this")
+ finally:
+ print("OK, now we're done")
+
+# End fodder for opinfo generation tests
+expected_outer_offset = 1 - outer.__code__.co_firstlineno
+expected_jumpy_offset = 1 - jumpy.__code__.co_firstlineno
+code_object_f = outer.__code__.co_consts[3]
+code_object_inner = code_object_f.co_consts[3]
+
+# The following lines are useful to regenerate the expected results after
+# either the fodder is modified or the bytecode generation changes
+# After regeneration, update the references to code_object_f and
+# code_object_inner before rerunning the tests
+
+#_instructions = dis.get_instructions(outer, line_offset=expected_outer_offset)
+#print('expected_opinfo_outer = [\n ',
+ #',\n '.join(map(str, _instructions)), ',\n]', sep='')
+#_instructions = dis.get_instructions(outer(), line_offset=expected_outer_offset)
+#print('expected_opinfo_f = [\n ',
+ #',\n '.join(map(str, _instructions)), ',\n]', sep='')
+#_instructions = dis.get_instructions(outer()(), line_offset=expected_outer_offset)
+#print('expected_opinfo_inner = [\n ',
+ #',\n '.join(map(str, _instructions)), ',\n]', sep='')
+#_instructions = dis.get_instructions(jumpy, line_offset=expected_jumpy_offset)
+#print('expected_opinfo_jumpy = [\n ',
+ #',\n '.join(map(str, _instructions)), ',\n]', sep='')
+
+
+Instruction = dis.Instruction
+expected_opinfo_outer = [
+ Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=3, argrepr='3', offset=0, starts_line=2, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=0, argval='a', argrepr='a', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=1, argval='b', argrepr='b', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_TUPLE', opcode=102, arg=2, argval=2, argrepr='', offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_f, argrepr=repr(code_object_f), offset=15, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer.<locals>.f', argrepr="'outer.<locals>.f'", offset=18, starts_line=None, is_jump_target=False),
+ Instruction(opname='MAKE_CLOSURE', opcode=134, arg=2, argval=2, argrepr='', offset=21, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='f', argrepr='f', offset=24, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=27, starts_line=7, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=30, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='b', argrepr='b', offset=33, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval='', argrepr="''", offset=36, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval=1, argrepr='1', offset=39, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_LIST', opcode=103, arg=0, argval=0, argrepr='', offset=42, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=45, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval='Hello world!', argrepr="'Hello world!'", offset=48, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=7, argval=7, argrepr='7 positional, 0 keyword pair', offset=51, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=55, starts_line=8, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=58, starts_line=None, is_jump_target=False),
+]
+
+expected_opinfo_f = [
+ Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=5, argrepr='5', offset=0, starts_line=3, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=6, argrepr='6', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=2, argval='a', argrepr='a', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=3, argval='b', argrepr='b', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=0, argval='c', argrepr='c', offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CLOSURE', opcode=135, arg=1, argval='d', argrepr='d', offset=15, starts_line=None, is_jump_target=False),
+ Instruction(opname='BUILD_TUPLE', opcode=102, arg=4, argval=4, argrepr='', offset=18, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=code_object_inner, argrepr=repr(code_object_inner), offset=21, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='outer.<locals>.f.<locals>.inner', argrepr="'outer.<locals>.f.<locals>.inner'", offset=24, starts_line=None, is_jump_target=False),
+ Instruction(opname='MAKE_CLOSURE', opcode=134, arg=2, argval=2, argrepr='', offset=27, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=2, argval='inner', argrepr='inner', offset=30, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=33, starts_line=5, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='a', argrepr='a', offset=36, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=3, argval='b', argrepr='b', offset=39, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='c', argrepr='c', offset=42, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='d', argrepr='d', offset=45, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=4, argval=4, argrepr='4 positional, 0 keyword pair', offset=48, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=51, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=52, starts_line=6, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=55, starts_line=None, is_jump_target=False),
+]
+
+expected_opinfo_inner = [
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=0, starts_line=4, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=0, argval='a', argrepr='a', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=1, argval='b', argrepr='b', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=2, argval='c', argrepr='c', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_DEREF', opcode=136, arg=3, argval='d', argrepr='d', offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='e', argrepr='e', offset=15, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='f', argrepr='f', offset=18, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=6, argval=6, argrepr='6 positional, 0 keyword pair', offset=21, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=25, starts_line=None, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False),
+]
+
+expected_opinfo_jumpy = [
+ Instruction(opname='SETUP_LOOP', opcode=120, arg=74, argval=77, argrepr='to 77', offset=0, starts_line=3, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='range', argrepr='range', offset=3, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=6, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=9, starts_line=None, is_jump_target=False),
+ Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=12, starts_line=None, is_jump_target=False),
+ Instruction(opname='FOR_ITER', opcode=93, arg=50, argval=66, argrepr='to 66', offset=13, starts_line=None, is_jump_target=True),
+ Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=16, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=19, starts_line=4, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=22, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=25, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=29, starts_line=5, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=32, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=35, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=47, argval=47, argrepr='', offset=38, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=13, argval=13, argrepr='', offset=41, starts_line=6, is_jump_target=False),
+ Instruction(opname='JUMP_FORWARD', opcode=110, arg=0, argval=47, argrepr='to 47', offset=44, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=47, starts_line=7, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=50, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=53, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=13, argval=13, argrepr='', offset=56, starts_line=None, is_jump_target=False),
+ Instruction(opname='BREAK_LOOP', opcode=80, arg=None, argval=None, argrepr='', offset=59, starts_line=8, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=13, argval=13, argrepr='', offset=60, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=13, argval=13, argrepr='', offset=63, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=66, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=67, starts_line=10, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=70, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=73, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=76, starts_line=None, is_jump_target=False),
+ Instruction(opname='SETUP_LOOP', opcode=120, arg=74, argval=154, argrepr='to 154', offset=77, starts_line=11, is_jump_target=True),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=80, starts_line=None, is_jump_target=True),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=143, argval=143, argrepr='', offset=83, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=86, starts_line=12, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=89, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=92, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=95, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=96, starts_line=13, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=99, starts_line=None, is_jump_target=False),
+ Instruction(opname='INPLACE_SUBTRACT', opcode=56, arg=None, argval=None, argrepr='', offset=102, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=103, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=106, starts_line=14, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=109, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=112, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=124, argval=124, argrepr='', offset=115, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=80, argval=80, argrepr='', offset=118, starts_line=15, is_jump_target=False),
+ Instruction(opname='JUMP_FORWARD', opcode=110, arg=0, argval=124, argrepr='to 124', offset=121, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=124, starts_line=16, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=127, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=130, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=80, argval=80, argrepr='', offset=133, starts_line=None, is_jump_target=False),
+ Instruction(opname='BREAK_LOOP', opcode=80, arg=None, argval=None, argrepr='', offset=136, starts_line=17, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=80, argval=80, argrepr='', offset=137, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=80, argval=80, argrepr='', offset=140, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=143, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=144, starts_line=19, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=147, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=150, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=153, starts_line=None, is_jump_target=False),
+ Instruction(opname='SETUP_FINALLY', opcode=122, arg=72, argval=229, argrepr='to 229', offset=154, starts_line=20, is_jump_target=True),
+ Instruction(opname='SETUP_EXCEPT', opcode=121, arg=12, argval=172, argrepr='to 172', offset=157, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=160, starts_line=21, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=163, starts_line=None, is_jump_target=False),
+ Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=167, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_FORWARD', opcode=110, arg=28, argval=200, argrepr='to 200', offset=169, starts_line=None, is_jump_target=False),
+ Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=172, starts_line=22, is_jump_target=True),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=173, starts_line=None, is_jump_target=False),
+ Instruction(opname='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=176, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=199, argval=199, argrepr='', offset=179, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=183, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=185, starts_line=23, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=188, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=191, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=194, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=195, starts_line=None, is_jump_target=False),
+ Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=225, argrepr='to 225', offset=196, starts_line=None, is_jump_target=False),
+ Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=199, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=200, starts_line=25, is_jump_target=True),
+ Instruction(opname='SETUP_WITH', opcode=143, arg=17, argval=223, argrepr='to 223', offset=203, starts_line=None, is_jump_target=False),
+ Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=206, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=209, starts_line=26, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=212, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=215, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=218, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=219, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=220, starts_line=None, is_jump_target=False),
+ Instruction(opname='WITH_CLEANUP', opcode=81, arg=None, argval=None, argrepr='', offset=223, starts_line=None, is_jump_target=True),
+ Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=224, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=225, starts_line=None, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=226, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=229, starts_line=28, is_jump_target=True),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=232, starts_line=None, is_jump_target=False),
+ Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='1 positional, 0 keyword pair', offset=235, starts_line=None, is_jump_target=False),
+ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=238, starts_line=None, is_jump_target=False),
+ Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=239, starts_line=None, is_jump_target=False),
+ Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=240, starts_line=None, is_jump_target=False),
+ Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=243, starts_line=None, is_jump_target=False),
+]
+
+class InstructionTests(BytecodeTestCase):
+ def test_outer(self):
+ self.assertBytecodeExactlyMatches(outer, expected_opinfo_outer,
+ line_offset=expected_outer_offset)
+
+ def test_nested(self):
+ with captured_stdout():
+ f = outer()
+ self.assertBytecodeExactlyMatches(f, expected_opinfo_f,
+ line_offset=expected_outer_offset)
+
+ def test_doubly_nested(self):
+ with captured_stdout():
+ inner = outer()()
+ self.assertBytecodeExactlyMatches(inner, expected_opinfo_inner,
+ line_offset=expected_outer_offset)
+
+ def test_jumpy(self):
+ self.assertBytecodeExactlyMatches(jumpy, expected_opinfo_jumpy,
+ line_offset=expected_jumpy_offset)
+
+class BytecodeTests(unittest.TestCase):
+ def test_instantiation(self):
+ # Test with function, method, code string and code object
+ for obj in [_f, _C(1).__init__, "a=1", _f.__code__]:
+ b = dis.Bytecode(obj)
+ self.assertIsInstance(b.codeobj, types.CodeType)
+
+ self.assertRaises(TypeError, dis.Bytecode, object())
+
+ def test_iteration(self):
+ b = dis.Bytecode(_f)
+ for instr in b:
+ self.assertIsInstance(instr, dis.Instruction)
+
+ assert len(list(b)) > 0 # Iterating should yield at least 1 instruction
+
+ def test_info(self):
+ self.maxDiff = 1000
+ for x, expected in CodeInfoTests.test_pairs:
+ b = dis.Bytecode(x)
+ self.assertRegex(b.info(), expected)
+
+ def test_display_code(self):
+ b = dis.Bytecode(_f)
+ output = io.StringIO()
+ b.display_code(file=output)
+ result = [line.rstrip() for line in output.getvalue().splitlines()]
+ self.assertEqual(result, dis_f.splitlines())
+
+
def test_main():
- run_unittest(DisTests, CodeInfoTests)
+ run_unittest(DisTests, CodeInfoTests, InstructionTests, BytecodeTests)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index 8f8c7c7..d4ff049 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -1409,8 +1409,40 @@ However, output from `report_start` is not suppressed:
2
TestResults(failed=3, attempted=5)
-For the purposes of REPORT_ONLY_FIRST_FAILURE, unexpected exceptions
-count as failures:
+The FAIL_FAST flag causes the runner to exit after the first failing example,
+so subsequent examples are not even attempted:
+
+ >>> flags = doctest.FAIL_FAST
+ >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
+ ... # doctest: +ELLIPSIS
+ **********************************************************************
+ File ..., line 5, in f
+ Failed example:
+ print(2) # first failure
+ Expected:
+ 200
+ Got:
+ 2
+ TestResults(failed=1, attempted=2)
+
+Specifying both FAIL_FAST and REPORT_ONLY_FIRST_FAILURE is equivalent to
+FAIL_FAST only:
+
+ >>> flags = doctest.FAIL_FAST | doctest.REPORT_ONLY_FIRST_FAILURE
+ >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
+ ... # doctest: +ELLIPSIS
+ **********************************************************************
+ File ..., line 5, in f
+ Failed example:
+ print(2) # first failure
+ Expected:
+ 200
+ Got:
+ 2
+ TestResults(failed=1, attempted=2)
+
+For the purposes of both REPORT_ONLY_FIRST_FAILURE and FAIL_FAST, unexpected
+exceptions count as failures:
>>> def f(x):
... r'''
@@ -1437,6 +1469,17 @@ count as failures:
...
ValueError: 2
TestResults(failed=3, attempted=5)
+ >>> flags = doctest.FAIL_FAST
+ >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
+ ... # doctest: +ELLIPSIS
+ **********************************************************************
+ File ..., line 5, in f
+ Failed example:
+ raise ValueError(2) # first failure
+ Exception raised:
+ ...
+ ValueError: 2
+ TestResults(failed=1, attempted=2)
New option flags can also be registered, via register_optionflag(). Here
we reach into doctest's internals a bit.
@@ -2553,6 +2596,240 @@ Check doctest with a non-ascii filename:
TestResults(failed=1, attempted=1)
"""
+def test_CLI(): r"""
+The doctest module can be used to run doctests against an arbitrary file.
+These tests test this CLI functionality.
+
+We'll use the support module's script_helpers for this, and write a test files
+to a temp dir to run the command against. Due to a current limitation in
+script_helpers, though, we need a little utility function to turn the returned
+output into something we can doctest against:
+
+ >>> def normalize(s):
+ ... return '\n'.join(s.decode().splitlines())
+
+Note: we also pass TERM='' to all the assert_python calls to avoid a bug
+in the readline library that is triggered in these tests because we are
+running them in a new python process. See:
+
+ http://lists.gnu.org/archive/html/bug-readline/2013-06/msg00000.html
+
+With those preliminaries out of the way, we'll start with a file with two
+simple tests and no errors. We'll run both the unadorned doctest command, and
+the verbose version, and then check the output:
+
+ >>> from test import script_helper
+ >>> with script_helper.temp_dir() as tmpdir:
+ ... fn = os.path.join(tmpdir, 'myfile.doc')
+ ... with open(fn, 'w') as f:
+ ... _ = f.write('This is a very simple test file.\n')
+ ... _ = f.write(' >>> 1 + 1\n')
+ ... _ = f.write(' 2\n')
+ ... _ = f.write(' >>> "a"\n')
+ ... _ = f.write(" 'a'\n")
+ ... _ = f.write('\n')
+ ... _ = f.write('And that is it.\n')
+ ... rc1, out1, err1 = script_helper.assert_python_ok(
+ ... '-m', 'doctest', fn, TERM='')
+ ... rc2, out2, err2 = script_helper.assert_python_ok(
+ ... '-m', 'doctest', '-v', fn, TERM='')
+
+With no arguments and passing tests, we should get no output:
+
+ >>> rc1, out1, err1
+ (0, b'', b'')
+
+With the verbose flag, we should see the test output, but no error output:
+
+ >>> rc2, err2
+ (0, b'')
+ >>> print(normalize(out2))
+ Trying:
+ 1 + 1
+ Expecting:
+ 2
+ ok
+ Trying:
+ "a"
+ Expecting:
+ 'a'
+ ok
+ 1 items passed all tests:
+ 2 tests in myfile.doc
+ 2 tests in 1 items.
+ 2 passed and 0 failed.
+ Test passed.
+
+Now we'll write a couple files, one with three tests, the other a python module
+with two tests, both of the files having "errors" in the tests that can be made
+non-errors by applying the appropriate doctest options to the run (ELLIPSIS in
+the first file, NORMALIZE_WHITESPACE in the second). This combination will
+allow to thoroughly test the -f and -o flags, as well as the doctest command's
+ability to process more than one file on the command line and, since the second
+file ends in '.py', its handling of python module files (as opposed to straight
+text files).
+
+ >>> from test import script_helper
+ >>> with script_helper.temp_dir() as tmpdir:
+ ... fn = os.path.join(tmpdir, 'myfile.doc')
+ ... with open(fn, 'w') as f:
+ ... _ = f.write('This is another simple test file.\n')
+ ... _ = f.write(' >>> 1 + 1\n')
+ ... _ = f.write(' 2\n')
+ ... _ = f.write(' >>> "abcdef"\n')
+ ... _ = f.write(" 'a...f'\n")
+ ... _ = f.write(' >>> "ajkml"\n')
+ ... _ = f.write(" 'a...l'\n")
+ ... _ = f.write('\n')
+ ... _ = f.write('And that is it.\n')
+ ... fn2 = os.path.join(tmpdir, 'myfile2.py')
+ ... with open(fn2, 'w') as f:
+ ... _ = f.write('def test_func():\n')
+ ... _ = f.write(' \"\"\"\n')
+ ... _ = f.write(' This is simple python test function.\n')
+ ... _ = f.write(' >>> 1 + 1\n')
+ ... _ = f.write(' 2\n')
+ ... _ = f.write(' >>> "abc def"\n')
+ ... _ = f.write(" 'abc def'\n")
+ ... _ = f.write("\n")
+ ... _ = f.write(' \"\"\"\n')
+ ... import shutil
+ ... rc1, out1, err1 = script_helper.assert_python_failure(
+ ... '-m', 'doctest', fn, fn2, TERM='')
+ ... rc2, out2, err2 = script_helper.assert_python_ok(
+ ... '-m', 'doctest', '-o', 'ELLIPSIS', fn, TERM='')
+ ... rc3, out3, err3 = script_helper.assert_python_ok(
+ ... '-m', 'doctest', '-o', 'ELLIPSIS',
+ ... '-o', 'NORMALIZE_WHITESPACE', fn, fn2, TERM='')
+ ... rc4, out4, err4 = script_helper.assert_python_failure(
+ ... '-m', 'doctest', '-f', fn, fn2, TERM='')
+ ... rc5, out5, err5 = script_helper.assert_python_ok(
+ ... '-m', 'doctest', '-v', '-o', 'ELLIPSIS',
+ ... '-o', 'NORMALIZE_WHITESPACE', fn, fn2, TERM='')
+
+Our first test run will show the errors from the first file (doctest stops if a
+file has errors). Note that doctest test-run error output appears on stdout,
+not stderr:
+
+ >>> rc1, err1
+ (1, b'')
+ >>> print(normalize(out1)) # doctest: +ELLIPSIS
+ **********************************************************************
+ File "...myfile.doc", line 4, in myfile.doc
+ Failed example:
+ "abcdef"
+ Expected:
+ 'a...f'
+ Got:
+ 'abcdef'
+ **********************************************************************
+ File "...myfile.doc", line 6, in myfile.doc
+ Failed example:
+ "ajkml"
+ Expected:
+ 'a...l'
+ Got:
+ 'ajkml'
+ **********************************************************************
+ 1 items had failures:
+ 2 of 3 in myfile.doc
+ ***Test Failed*** 2 failures.
+
+With -o ELLIPSIS specified, the second run, against just the first file, should
+produce no errors, and with -o NORMALIZE_WHITESPACE also specified, neither
+should the third, which ran against both files:
+
+ >>> rc2, out2, err2
+ (0, b'', b'')
+ >>> rc3, out3, err3
+ (0, b'', b'')
+
+The fourth run uses FAIL_FAST, so we should see only one error:
+
+ >>> rc4, err4
+ (1, b'')
+ >>> print(normalize(out4)) # doctest: +ELLIPSIS
+ **********************************************************************
+ File "...myfile.doc", line 4, in myfile.doc
+ Failed example:
+ "abcdef"
+ Expected:
+ 'a...f'
+ Got:
+ 'abcdef'
+ **********************************************************************
+ 1 items had failures:
+ 1 of 2 in myfile.doc
+ ***Test Failed*** 1 failures.
+
+The fifth test uses verbose with the two options, so we should get verbose
+success output for the tests in both files:
+
+ >>> rc5, err5
+ (0, b'')
+ >>> print(normalize(out5))
+ Trying:
+ 1 + 1
+ Expecting:
+ 2
+ ok
+ Trying:
+ "abcdef"
+ Expecting:
+ 'a...f'
+ ok
+ Trying:
+ "ajkml"
+ Expecting:
+ 'a...l'
+ ok
+ 1 items passed all tests:
+ 3 tests in myfile.doc
+ 3 tests in 1 items.
+ 3 passed and 0 failed.
+ Test passed.
+ Trying:
+ 1 + 1
+ Expecting:
+ 2
+ ok
+ Trying:
+ "abc def"
+ Expecting:
+ 'abc def'
+ ok
+ 1 items had no tests:
+ myfile2
+ 1 items passed all tests:
+ 2 tests in myfile2.test_func
+ 2 tests in 2 items.
+ 2 passed and 0 failed.
+ Test passed.
+
+We should also check some typical error cases.
+
+Invalid file name:
+
+ >>> rc, out, err = script_helper.assert_python_failure(
+ ... '-m', 'doctest', 'nosuchfile', TERM='')
+ >>> rc, out
+ (1, b'')
+ >>> print(normalize(err)) # doctest: +ELLIPSIS
+ Traceback (most recent call last):
+ ...
+ FileNotFoundError: [Errno ...] No such file or directory: 'nosuchfile'
+
+Invalid doctest option:
+
+ >>> rc, out, err = script_helper.assert_python_failure(
+ ... '-m', 'doctest', '-o', 'nosuchoption', TERM='')
+ >>> rc, out
+ (2, b'')
+ >>> print(normalize(err)) # doctest: +ELLIPSIS
+ usage...invalid...nosuchoption...
+
+"""
+
######################################################################
## Main
######################################################################
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index 56be794..b2c8b7d 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -249,15 +249,42 @@ class TestMessageAPI(TestEmailBase):
self.assertTrue('TO' in msg)
def test_as_string(self):
- eq = self.ndiffAssertEqual
msg = self._msgobj('msg_01.txt')
with openfile('msg_01.txt') as fp:
text = fp.read()
- eq(text, str(msg))
+ self.assertEqual(text, str(msg))
fullrepr = msg.as_string(unixfrom=True)
lines = fullrepr.split('\n')
self.assertTrue(lines[0].startswith('From '))
- eq(text, NL.join(lines[1:]))
+ self.assertEqual(text, NL.join(lines[1:]))
+
+ def test_as_string_policy(self):
+ msg = self._msgobj('msg_01.txt')
+ newpolicy = msg.policy.clone(linesep='\r\n')
+ fullrepr = msg.as_string(policy=newpolicy)
+ s = StringIO()
+ g = Generator(s, policy=newpolicy)
+ g.flatten(msg)
+ self.assertEqual(fullrepr, s.getvalue())
+
+ def test_as_bytes(self):
+ msg = self._msgobj('msg_01.txt')
+ with openfile('msg_01.txt', 'rb') as fp:
+ data = fp.read()
+ self.assertEqual(data, bytes(msg))
+ fullrepr = msg.as_bytes(unixfrom=True)
+ lines = fullrepr.split(b'\n')
+ self.assertTrue(lines[0].startswith(b'From '))
+ self.assertEqual(data, b'\n'.join(lines[1:]))
+
+ def test_as_bytes_policy(self):
+ msg = self._msgobj('msg_01.txt')
+ newpolicy = msg.policy.clone(linesep='\r\n')
+ fullrepr = msg.as_bytes(policy=newpolicy)
+ s = BytesIO()
+ g = BytesGenerator(s,policy=newpolicy)
+ g.flatten(msg)
+ self.assertEqual(fullrepr, s.getvalue())
# test_headerregistry.TestContentTypeHeader.bad_params
def test_bad_param(self):
diff --git a/Lib/test/test_email/torture_test.py b/Lib/test/test_email/torture_test.py
index 544b1bb..19cf64f 100644
--- a/Lib/test/test_email/torture_test.py
+++ b/Lib/test/test_email/torture_test.py
@@ -27,7 +27,7 @@ def openfile(filename):
# Prevent this test from running in the Python distro
try:
openfile('crispin-torture.txt')
-except IOError:
+except OSError:
raise TestSkipped
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
new file mode 100644
index 0000000..71c77a0
--- /dev/null
+++ b/Lib/test/test_enum.py
@@ -0,0 +1,1007 @@
+import enum
+import unittest
+from collections import OrderedDict
+from pickle import dumps, loads, PicklingError
+from enum import Enum, IntEnum, unique
+
+# for pickle tests
+try:
+ class Stooges(Enum):
+ LARRY = 1
+ CURLY = 2
+ MOE = 3
+except Exception as exc:
+ Stooges = exc
+
+try:
+ class IntStooges(int, Enum):
+ LARRY = 1
+ CURLY = 2
+ MOE = 3
+except Exception as exc:
+ IntStooges = exc
+
+try:
+ class FloatStooges(float, Enum):
+ LARRY = 1.39
+ CURLY = 2.72
+ MOE = 3.142596
+except Exception as exc:
+ FloatStooges = exc
+
+# for pickle test and subclass tests
+try:
+ class StrEnum(str, Enum):
+ 'accepts only string values'
+ class Name(StrEnum):
+ BDFL = 'Guido van Rossum'
+ FLUFL = 'Barry Warsaw'
+except Exception as exc:
+ Name = exc
+
+try:
+ Question = Enum('Question', 'who what when where why', module=__name__)
+except Exception as exc:
+ Question = exc
+
+try:
+ Answer = Enum('Answer', 'him this then there because')
+except Exception as exc:
+ Answer = exc
+
+# for doctests
+try:
+ class Fruit(Enum):
+ tomato = 1
+ banana = 2
+ cherry = 3
+except Exception:
+ pass
+
+class TestEnum(unittest.TestCase):
+ def setUp(self):
+ class Season(Enum):
+ SPRING = 1
+ SUMMER = 2
+ AUTUMN = 3
+ WINTER = 4
+ self.Season = Season
+
+ def test_dir_on_class(self):
+ Season = self.Season
+ self.assertEqual(
+ set(dir(Season)),
+ set(['__class__', '__doc__', '__members__',
+ 'SPRING', 'SUMMER', 'AUTUMN', 'WINTER']),
+ )
+
+ def test_dir_on_item(self):
+ Season = self.Season
+ self.assertEqual(
+ set(dir(Season.WINTER)),
+ set(['__class__', '__doc__', 'name', 'value']),
+ )
+
+ def test_enum_in_enum_out(self):
+ Season = self.Season
+ self.assertIs(Season(Season.WINTER), Season.WINTER)
+
+ def test_enum_value(self):
+ Season = self.Season
+ self.assertEqual(Season.SPRING.value, 1)
+
+ def test_intenum_value(self):
+ self.assertEqual(IntStooges.CURLY.value, 2)
+
+ def test_enum(self):
+ Season = self.Season
+ lst = list(Season)
+ self.assertEqual(len(lst), len(Season))
+ self.assertEqual(len(Season), 4, Season)
+ self.assertEqual(
+ [Season.SPRING, Season.SUMMER, Season.AUTUMN, Season.WINTER], lst)
+
+ for i, season in enumerate('SPRING SUMMER AUTUMN WINTER'.split(), 1):
+ e = Season(i)
+ self.assertEqual(e, getattr(Season, season))
+ self.assertEqual(e.value, i)
+ self.assertNotEqual(e, i)
+ self.assertEqual(e.name, season)
+ self.assertIn(e, Season)
+ self.assertIs(type(e), Season)
+ self.assertIsInstance(e, Season)
+ self.assertEqual(str(e), 'Season.' + season)
+ self.assertEqual(
+ repr(e),
+ '<Season.{0}: {1}>'.format(season, i),
+ )
+
+ def test_value_name(self):
+ Season = self.Season
+ self.assertEqual(Season.SPRING.name, 'SPRING')
+ self.assertEqual(Season.SPRING.value, 1)
+ with self.assertRaises(AttributeError):
+ Season.SPRING.name = 'invierno'
+ with self.assertRaises(AttributeError):
+ Season.SPRING.value = 2
+
+ def test_invalid_names(self):
+ with self.assertRaises(ValueError):
+ class Wrong(Enum):
+ mro = 9
+ with self.assertRaises(ValueError):
+ class Wrong(Enum):
+ _create_= 11
+ with self.assertRaises(ValueError):
+ class Wrong(Enum):
+ _get_mixins_ = 9
+ with self.assertRaises(ValueError):
+ class Wrong(Enum):
+ _find_new_ = 1
+ with self.assertRaises(ValueError):
+ class Wrong(Enum):
+ _any_name_ = 9
+
+ def test_contains(self):
+ Season = self.Season
+ self.assertIn(Season.AUTUMN, Season)
+ self.assertNotIn(3, Season)
+
+ val = Season(3)
+ self.assertIn(val, Season)
+
+ class OtherEnum(Enum):
+ one = 1; two = 2
+ self.assertNotIn(OtherEnum.two, Season)
+
+ def test_comparisons(self):
+ Season = self.Season
+ with self.assertRaises(TypeError):
+ Season.SPRING < Season.WINTER
+ with self.assertRaises(TypeError):
+ Season.SPRING > 4
+
+ self.assertNotEqual(Season.SPRING, 1)
+
+ class Part(Enum):
+ SPRING = 1
+ CLIP = 2
+ BARREL = 3
+
+ self.assertNotEqual(Season.SPRING, Part.SPRING)
+ with self.assertRaises(TypeError):
+ Season.SPRING < Part.CLIP
+
+ def test_enum_duplicates(self):
+ class Season(Enum):
+ SPRING = 1
+ SUMMER = 2
+ AUTUMN = FALL = 3
+ WINTER = 4
+ ANOTHER_SPRING = 1
+ lst = list(Season)
+ self.assertEqual(
+ lst,
+ [Season.SPRING, Season.SUMMER,
+ Season.AUTUMN, Season.WINTER,
+ ])
+ self.assertIs(Season.FALL, Season.AUTUMN)
+ self.assertEqual(Season.FALL.value, 3)
+ self.assertEqual(Season.AUTUMN.value, 3)
+ self.assertIs(Season(3), Season.AUTUMN)
+ self.assertIs(Season(1), Season.SPRING)
+ self.assertEqual(Season.FALL.name, 'AUTUMN')
+ self.assertEqual(
+ [k for k,v in Season.__members__.items() if v.name != k],
+ ['FALL', 'ANOTHER_SPRING'],
+ )
+
+ def test_enum_with_value_name(self):
+ class Huh(Enum):
+ name = 1
+ value = 2
+ self.assertEqual(
+ list(Huh),
+ [Huh.name, Huh.value],
+ )
+ self.assertIs(type(Huh.name), Huh)
+ self.assertEqual(Huh.name.name, 'name')
+ self.assertEqual(Huh.name.value, 1)
+ def test_hash(self):
+ Season = self.Season
+ dates = {}
+ dates[Season.WINTER] = '1225'
+ dates[Season.SPRING] = '0315'
+ dates[Season.SUMMER] = '0704'
+ dates[Season.AUTUMN] = '1031'
+ self.assertEqual(dates[Season.AUTUMN], '1031')
+
+ def test_intenum_from_scratch(self):
+ class phy(int, Enum):
+ pi = 3
+ tau = 2 * pi
+ self.assertTrue(phy.pi < phy.tau)
+
+ def test_intenum_inherited(self):
+ class IntEnum(int, Enum):
+ pass
+ class phy(IntEnum):
+ pi = 3
+ tau = 2 * pi
+ self.assertTrue(phy.pi < phy.tau)
+
+ def test_floatenum_from_scratch(self):
+ class phy(float, Enum):
+ pi = 3.141596
+ tau = 2 * pi
+ self.assertTrue(phy.pi < phy.tau)
+
+ def test_floatenum_inherited(self):
+ class FloatEnum(float, Enum):
+ pass
+ class phy(FloatEnum):
+ pi = 3.141596
+ tau = 2 * pi
+ self.assertTrue(phy.pi < phy.tau)
+
+ def test_strenum_from_scratch(self):
+ class phy(str, Enum):
+ pi = 'Pi'
+ tau = 'Tau'
+ self.assertTrue(phy.pi < phy.tau)
+
+ def test_strenum_inherited(self):
+ class StrEnum(str, Enum):
+ pass
+ class phy(StrEnum):
+ pi = 'Pi'
+ tau = 'Tau'
+ self.assertTrue(phy.pi < phy.tau)
+
+
+ def test_intenum(self):
+ class WeekDay(IntEnum):
+ SUNDAY = 1
+ MONDAY = 2
+ TUESDAY = 3
+ WEDNESDAY = 4
+ THURSDAY = 5
+ FRIDAY = 6
+ SATURDAY = 7
+
+ self.assertEqual(['a', 'b', 'c'][WeekDay.MONDAY], 'c')
+ self.assertEqual([i for i in range(WeekDay.TUESDAY)], [0, 1, 2])
+
+ lst = list(WeekDay)
+ self.assertEqual(len(lst), len(WeekDay))
+ self.assertEqual(len(WeekDay), 7)
+ target = 'SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY'
+ target = target.split()
+ for i, weekday in enumerate(target, 1):
+ e = WeekDay(i)
+ self.assertEqual(e, i)
+ self.assertEqual(int(e), i)
+ self.assertEqual(e.name, weekday)
+ self.assertIn(e, WeekDay)
+ self.assertEqual(lst.index(e)+1, i)
+ self.assertTrue(0 < e < 8)
+ self.assertIs(type(e), WeekDay)
+ self.assertIsInstance(e, int)
+ self.assertIsInstance(e, Enum)
+
+ def test_intenum_duplicates(self):
+ class WeekDay(IntEnum):
+ SUNDAY = 1
+ MONDAY = 2
+ TUESDAY = TEUSDAY = 3
+ WEDNESDAY = 4
+ THURSDAY = 5
+ FRIDAY = 6
+ SATURDAY = 7
+ self.assertIs(WeekDay.TEUSDAY, WeekDay.TUESDAY)
+ self.assertEqual(WeekDay(3).name, 'TUESDAY')
+ self.assertEqual([k for k,v in WeekDay.__members__.items()
+ if v.name != k], ['TEUSDAY', ])
+
+ def test_pickle_enum(self):
+ if isinstance(Stooges, Exception):
+ raise Stooges
+ self.assertIs(Stooges.CURLY, loads(dumps(Stooges.CURLY)))
+ self.assertIs(Stooges, loads(dumps(Stooges)))
+
+ def test_pickle_int(self):
+ if isinstance(IntStooges, Exception):
+ raise IntStooges
+ self.assertIs(IntStooges.CURLY, loads(dumps(IntStooges.CURLY)))
+ self.assertIs(IntStooges, loads(dumps(IntStooges)))
+
+ def test_pickle_float(self):
+ if isinstance(FloatStooges, Exception):
+ raise FloatStooges
+ self.assertIs(FloatStooges.CURLY, loads(dumps(FloatStooges.CURLY)))
+ self.assertIs(FloatStooges, loads(dumps(FloatStooges)))
+
+ def test_pickle_enum_function(self):
+ if isinstance(Answer, Exception):
+ raise Answer
+ self.assertIs(Answer.him, loads(dumps(Answer.him)))
+ self.assertIs(Answer, loads(dumps(Answer)))
+
+ def test_pickle_enum_function_with_module(self):
+ if isinstance(Question, Exception):
+ raise Question
+ self.assertIs(Question.who, loads(dumps(Question.who)))
+ self.assertIs(Question, loads(dumps(Question)))
+
+ def test_exploding_pickle(self):
+ BadPickle = Enum('BadPickle', 'dill sweet bread-n-butter')
+ enum._make_class_unpicklable(BadPickle)
+ globals()['BadPickle'] = BadPickle
+ with self.assertRaises(TypeError):
+ dumps(BadPickle.dill)
+ with self.assertRaises(PicklingError):
+ dumps(BadPickle)
+
+ def test_string_enum(self):
+ class SkillLevel(str, Enum):
+ master = 'what is the sound of one hand clapping?'
+ journeyman = 'why did the chicken cross the road?'
+ apprentice = 'knock, knock!'
+ self.assertEqual(SkillLevel.apprentice, 'knock, knock!')
+
+ def test_getattr_getitem(self):
+ class Period(Enum):
+ morning = 1
+ noon = 2
+ evening = 3
+ night = 4
+ self.assertIs(Period(2), Period.noon)
+ self.assertIs(getattr(Period, 'night'), Period.night)
+ self.assertIs(Period['morning'], Period.morning)
+
+ def test_getattr_dunder(self):
+ Season = self.Season
+ self.assertTrue(getattr(Season, '__eq__'))
+
+ def test_iteration_order(self):
+ class Season(Enum):
+ SUMMER = 2
+ WINTER = 4
+ AUTUMN = 3
+ SPRING = 1
+ self.assertEqual(
+ list(Season),
+ [Season.SUMMER, Season.WINTER, Season.AUTUMN, Season.SPRING],
+ )
+
+ def test_programatic_function_string(self):
+ SummerMonth = Enum('SummerMonth', 'june july august')
+ lst = list(SummerMonth)
+ self.assertEqual(len(lst), len(SummerMonth))
+ self.assertEqual(len(SummerMonth), 3, SummerMonth)
+ self.assertEqual(
+ [SummerMonth.june, SummerMonth.july, SummerMonth.august],
+ lst,
+ )
+ for i, month in enumerate('june july august'.split(), 1):
+ e = SummerMonth(i)
+ self.assertEqual(int(e.value), i)
+ self.assertNotEqual(e, i)
+ self.assertEqual(e.name, month)
+ self.assertIn(e, SummerMonth)
+ self.assertIs(type(e), SummerMonth)
+
+ def test_programatic_function_string_list(self):
+ SummerMonth = Enum('SummerMonth', ['june', 'july', 'august'])
+ lst = list(SummerMonth)
+ self.assertEqual(len(lst), len(SummerMonth))
+ self.assertEqual(len(SummerMonth), 3, SummerMonth)
+ self.assertEqual(
+ [SummerMonth.june, SummerMonth.july, SummerMonth.august],
+ lst,
+ )
+ for i, month in enumerate('june july august'.split(), 1):
+ e = SummerMonth(i)
+ self.assertEqual(int(e.value), i)
+ self.assertNotEqual(e, i)
+ self.assertEqual(e.name, month)
+ self.assertIn(e, SummerMonth)
+ self.assertIs(type(e), SummerMonth)
+
+ def test_programatic_function_iterable(self):
+ SummerMonth = Enum(
+ 'SummerMonth',
+ (('june', 1), ('july', 2), ('august', 3))
+ )
+ lst = list(SummerMonth)
+ self.assertEqual(len(lst), len(SummerMonth))
+ self.assertEqual(len(SummerMonth), 3, SummerMonth)
+ self.assertEqual(
+ [SummerMonth.june, SummerMonth.july, SummerMonth.august],
+ lst,
+ )
+ for i, month in enumerate('june july august'.split(), 1):
+ e = SummerMonth(i)
+ self.assertEqual(int(e.value), i)
+ self.assertNotEqual(e, i)
+ self.assertEqual(e.name, month)
+ self.assertIn(e, SummerMonth)
+ self.assertIs(type(e), SummerMonth)
+
+ def test_programatic_function_from_dict(self):
+ SummerMonth = Enum(
+ 'SummerMonth',
+ OrderedDict((('june', 1), ('july', 2), ('august', 3)))
+ )
+ lst = list(SummerMonth)
+ self.assertEqual(len(lst), len(SummerMonth))
+ self.assertEqual(len(SummerMonth), 3, SummerMonth)
+ self.assertEqual(
+ [SummerMonth.june, SummerMonth.july, SummerMonth.august],
+ lst,
+ )
+ for i, month in enumerate('june july august'.split(), 1):
+ e = SummerMonth(i)
+ self.assertEqual(int(e.value), i)
+ self.assertNotEqual(e, i)
+ self.assertEqual(e.name, month)
+ self.assertIn(e, SummerMonth)
+ self.assertIs(type(e), SummerMonth)
+
+ def test_programatic_function_type(self):
+ SummerMonth = Enum('SummerMonth', 'june july august', type=int)
+ lst = list(SummerMonth)
+ self.assertEqual(len(lst), len(SummerMonth))
+ self.assertEqual(len(SummerMonth), 3, SummerMonth)
+ self.assertEqual(
+ [SummerMonth.june, SummerMonth.july, SummerMonth.august],
+ lst,
+ )
+ for i, month in enumerate('june july august'.split(), 1):
+ e = SummerMonth(i)
+ self.assertEqual(e, i)
+ self.assertEqual(e.name, month)
+ self.assertIn(e, SummerMonth)
+ self.assertIs(type(e), SummerMonth)
+
+ def test_programatic_function_type_from_subclass(self):
+ SummerMonth = IntEnum('SummerMonth', 'june july august')
+ lst = list(SummerMonth)
+ self.assertEqual(len(lst), len(SummerMonth))
+ self.assertEqual(len(SummerMonth), 3, SummerMonth)
+ self.assertEqual(
+ [SummerMonth.june, SummerMonth.july, SummerMonth.august],
+ lst,
+ )
+ for i, month in enumerate('june july august'.split(), 1):
+ e = SummerMonth(i)
+ self.assertEqual(e, i)
+ self.assertEqual(e.name, month)
+ self.assertIn(e, SummerMonth)
+ self.assertIs(type(e), SummerMonth)
+
+ def test_subclassing(self):
+ if isinstance(Name, Exception):
+ raise Name
+ self.assertEqual(Name.BDFL, 'Guido van Rossum')
+ self.assertTrue(Name.BDFL, Name('Guido van Rossum'))
+ self.assertIs(Name.BDFL, getattr(Name, 'BDFL'))
+ self.assertIs(Name.BDFL, loads(dumps(Name.BDFL)))
+
+ def test_extending(self):
+ class Color(Enum):
+ red = 1
+ green = 2
+ blue = 3
+ with self.assertRaises(TypeError):
+ class MoreColor(Color):
+ cyan = 4
+ magenta = 5
+ yellow = 6
+
+ def test_exclude_methods(self):
+ class whatever(Enum):
+ this = 'that'
+ these = 'those'
+ def really(self):
+ return 'no, not %s' % self.value
+ self.assertIsNot(type(whatever.really), whatever)
+ self.assertEqual(whatever.this.really(), 'no, not that')
+
+ def test_overwrite_enums(self):
+ class Why(Enum):
+ question = 1
+ answer = 2
+ propisition = 3
+ def question(self):
+ print(42)
+ self.assertIsNot(type(Why.question), Why)
+ self.assertNotIn(Why.question, Why._member_names_)
+ self.assertNotIn(Why.question, Why)
+
+ def test_wrong_inheritance_order(self):
+ with self.assertRaises(TypeError):
+ class Wrong(Enum, str):
+ NotHere = 'error before this point'
+
+ def test_intenum_transitivity(self):
+ class number(IntEnum):
+ one = 1
+ two = 2
+ three = 3
+ class numero(IntEnum):
+ uno = 1
+ dos = 2
+ tres = 3
+ self.assertEqual(number.one, numero.uno)
+ self.assertEqual(number.two, numero.dos)
+ self.assertEqual(number.three, numero.tres)
+
+ def test_wrong_enum_in_call(self):
+ class Monochrome(Enum):
+ black = 0
+ white = 1
+ class Gender(Enum):
+ male = 0
+ female = 1
+ self.assertRaises(ValueError, Monochrome, Gender.male)
+
+ def test_wrong_enum_in_mixed_call(self):
+ class Monochrome(IntEnum):
+ black = 0
+ white = 1
+ class Gender(Enum):
+ male = 0
+ female = 1
+ self.assertRaises(ValueError, Monochrome, Gender.male)
+
+ def test_mixed_enum_in_call_1(self):
+ class Monochrome(IntEnum):
+ black = 0
+ white = 1
+ class Gender(IntEnum):
+ male = 0
+ female = 1
+ self.assertIs(Monochrome(Gender.female), Monochrome.white)
+
+ def test_mixed_enum_in_call_2(self):
+ class Monochrome(Enum):
+ black = 0
+ white = 1
+ class Gender(IntEnum):
+ male = 0
+ female = 1
+ self.assertIs(Monochrome(Gender.male), Monochrome.black)
+
+ def test_flufl_enum(self):
+ class Fluflnum(Enum):
+ def __int__(self):
+ return int(self.value)
+ class MailManOptions(Fluflnum):
+ option1 = 1
+ option2 = 2
+ option3 = 3
+ self.assertEqual(int(MailManOptions.option1), 1)
+
+ def test_introspection(self):
+ class Number(IntEnum):
+ one = 100
+ two = 200
+ self.assertIs(Number.one._member_type_, int)
+ self.assertIs(Number._member_type_, int)
+ class String(str, Enum):
+ yarn = 'soft'
+ rope = 'rough'
+ wire = 'hard'
+ self.assertIs(String.yarn._member_type_, str)
+ self.assertIs(String._member_type_, str)
+ class Plain(Enum):
+ vanilla = 'white'
+ one = 1
+ self.assertIs(Plain.vanilla._member_type_, object)
+ self.assertIs(Plain._member_type_, object)
+
+ def test_no_such_enum_member(self):
+ class Color(Enum):
+ red = 1
+ green = 2
+ blue = 3
+ with self.assertRaises(ValueError):
+ Color(4)
+ with self.assertRaises(KeyError):
+ Color['chartreuse']
+
+ def test_new_repr(self):
+ class Color(Enum):
+ red = 1
+ green = 2
+ blue = 3
+ def __repr__(self):
+ return "don't you just love shades of %s?" % self.name
+ self.assertEqual(
+ repr(Color.blue),
+ "don't you just love shades of blue?",
+ )
+
+ def test_inherited_repr(self):
+ class MyEnum(Enum):
+ def __repr__(self):
+ return "My name is %s." % self.name
+ class MyIntEnum(int, MyEnum):
+ this = 1
+ that = 2
+ theother = 3
+ self.assertEqual(repr(MyIntEnum.that), "My name is that.")
+
+ def test_multiple_mixin_mro(self):
+ class auto_enum(type(Enum)):
+ def __new__(metacls, cls, bases, classdict):
+ temp = type(classdict)()
+ names = set(classdict._member_names)
+ i = 0
+ for k in classdict._member_names:
+ v = classdict[k]
+ if v is Ellipsis:
+ v = i
+ else:
+ i = v
+ i += 1
+ temp[k] = v
+ for k, v in classdict.items():
+ if k not in names:
+ temp[k] = v
+ return super(auto_enum, metacls).__new__(
+ metacls, cls, bases, temp)
+
+ class AutoNumberedEnum(Enum, metaclass=auto_enum):
+ pass
+
+ class AutoIntEnum(IntEnum, metaclass=auto_enum):
+ pass
+
+ class TestAutoNumber(AutoNumberedEnum):
+ a = ...
+ b = 3
+ c = ...
+
+ class TestAutoInt(AutoIntEnum):
+ a = ...
+ b = 3
+ c = ...
+
+ def test_subclasses_with_getnewargs(self):
+ class NamedInt(int):
+ def __new__(cls, *args):
+ _args = args
+ name, *args = args
+ if len(args) == 0:
+ raise TypeError("name and value must be specified")
+ self = int.__new__(cls, *args)
+ self._intname = name
+ self._args = _args
+ return self
+ def __getnewargs__(self):
+ return self._args
+ @property
+ def __name__(self):
+ return self._intname
+ def __repr__(self):
+ # repr() is updated to include the name and type info
+ return "{}({!r}, {})".format(type(self).__name__,
+ self.__name__,
+ int.__repr__(self))
+ def __str__(self):
+ # str() is unchanged, even if it relies on the repr() fallback
+ base = int
+ base_str = base.__str__
+ if base_str.__objclass__ is object:
+ return base.__repr__(self)
+ return base_str(self)
+ # for simplicity, we only define one operator that
+ # propagates expressions
+ def __add__(self, other):
+ temp = int(self) + int( other)
+ if isinstance(self, NamedInt) and isinstance(other, NamedInt):
+ return NamedInt(
+ '({0} + {1})'.format(self.__name__, other.__name__),
+ temp )
+ else:
+ return temp
+
+ class NEI(NamedInt, Enum):
+ x = ('the-x', 1)
+ y = ('the-y', 2)
+
+
+ self.assertIs(NEI.__new__, Enum.__new__)
+ self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
+ globals()['NamedInt'] = NamedInt
+ globals()['NEI'] = NEI
+ NI5 = NamedInt('test', 5)
+ self.assertEqual(NI5, 5)
+ self.assertEqual(loads(dumps(NI5)), 5)
+ self.assertEqual(NEI.y.value, 2)
+ self.assertIs(loads(dumps(NEI.y)), NEI.y)
+
+ def test_subclasses_without_getnewargs(self):
+ class NamedInt(int):
+ def __new__(cls, *args):
+ _args = args
+ name, *args = args
+ if len(args) == 0:
+ raise TypeError("name and value must be specified")
+ self = int.__new__(cls, *args)
+ self._intname = name
+ self._args = _args
+ return self
+ @property
+ def __name__(self):
+ return self._intname
+ def __repr__(self):
+ # repr() is updated to include the name and type info
+ return "{}({!r}, {})".format(type(self).__name__,
+ self.__name__,
+ int.__repr__(self))
+ def __str__(self):
+ # str() is unchanged, even if it relies on the repr() fallback
+ base = int
+ base_str = base.__str__
+ if base_str.__objclass__ is object:
+ return base.__repr__(self)
+ return base_str(self)
+ # for simplicity, we only define one operator that
+ # propagates expressions
+ def __add__(self, other):
+ temp = int(self) + int( other)
+ if isinstance(self, NamedInt) and isinstance(other, NamedInt):
+ return NamedInt(
+ '({0} + {1})'.format(self.__name__, other.__name__),
+ temp )
+ else:
+ return temp
+
+ class NEI(NamedInt, Enum):
+ x = ('the-x', 1)
+ y = ('the-y', 2)
+
+ self.assertIs(NEI.__new__, Enum.__new__)
+ self.assertEqual(repr(NEI.x + NEI.y), "NamedInt('(the-x + the-y)', 3)")
+ globals()['NamedInt'] = NamedInt
+ globals()['NEI'] = NEI
+ NI5 = NamedInt('test', 5)
+ self.assertEqual(NI5, 5)
+ self.assertEqual(NEI.y.value, 2)
+ with self.assertRaises(TypeError):
+ dumps(NEI.x)
+ with self.assertRaises(PicklingError):
+ dumps(NEI)
+
+ def test_tuple_subclass(self):
+ class SomeTuple(tuple, Enum):
+ first = (1, 'for the money')
+ second = (2, 'for the show')
+ third = (3, 'for the music')
+ self.assertIs(type(SomeTuple.first), SomeTuple)
+ self.assertIsInstance(SomeTuple.second, tuple)
+ self.assertEqual(SomeTuple.third, (3, 'for the music'))
+ globals()['SomeTuple'] = SomeTuple
+ self.assertIs(loads(dumps(SomeTuple.first)), SomeTuple.first)
+
+ def test_duplicate_values_give_unique_enum_items(self):
+ class AutoNumber(Enum):
+ first = ()
+ second = ()
+ third = ()
+ def __new__(cls):
+ value = len(cls.__members__) + 1
+ obj = object.__new__(cls)
+ obj._value_ = value
+ return obj
+ def __int__(self):
+ return int(self._value_)
+ self.assertEqual(
+ list(AutoNumber),
+ [AutoNumber.first, AutoNumber.second, AutoNumber.third],
+ )
+ self.assertEqual(int(AutoNumber.second), 2)
+ self.assertEqual(AutoNumber.third.value, 3)
+ self.assertIs(AutoNumber(1), AutoNumber.first)
+
+ def test_inherited_new_from_enhanced_enum(self):
+ class AutoNumber(Enum):
+ def __new__(cls):
+ value = len(cls.__members__) + 1
+ obj = object.__new__(cls)
+ obj._value_ = value
+ return obj
+ def __int__(self):
+ return int(self._value_)
+ class Color(AutoNumber):
+ red = ()
+ green = ()
+ blue = ()
+ self.assertEqual(list(Color), [Color.red, Color.green, Color.blue])
+ self.assertEqual(list(map(int, Color)), [1, 2, 3])
+
+ def test_inherited_new_from_mixed_enum(self):
+ class AutoNumber(IntEnum):
+ def __new__(cls):
+ value = len(cls.__members__) + 1
+ obj = int.__new__(cls, value)
+ obj._value_ = value
+ return obj
+ class Color(AutoNumber):
+ red = ()
+ green = ()
+ blue = ()
+ self.assertEqual(list(Color), [Color.red, Color.green, Color.blue])
+ self.assertEqual(list(map(int, Color)), [1, 2, 3])
+
+ def test_ordered_mixin(self):
+ class OrderedEnum(Enum):
+ def __ge__(self, other):
+ if self.__class__ is other.__class__:
+ return self._value_ >= other._value_
+ return NotImplemented
+ def __gt__(self, other):
+ if self.__class__ is other.__class__:
+ return self._value_ > other._value_
+ return NotImplemented
+ def __le__(self, other):
+ if self.__class__ is other.__class__:
+ return self._value_ <= other._value_
+ return NotImplemented
+ def __lt__(self, other):
+ if self.__class__ is other.__class__:
+ return self._value_ < other._value_
+ return NotImplemented
+ class Grade(OrderedEnum):
+ A = 5
+ B = 4
+ C = 3
+ D = 2
+ F = 1
+ self.assertGreater(Grade.A, Grade.B)
+ self.assertLessEqual(Grade.F, Grade.C)
+ self.assertLess(Grade.D, Grade.A)
+ self.assertGreaterEqual(Grade.B, Grade.B)
+
+ def test_extending2(self):
+ class Shade(Enum):
+ def shade(self):
+ print(self.name)
+ class Color(Shade):
+ red = 1
+ green = 2
+ blue = 3
+ with self.assertRaises(TypeError):
+ class MoreColor(Color):
+ cyan = 4
+ magenta = 5
+ yellow = 6
+
+ def test_extending3(self):
+ class Shade(Enum):
+ def shade(self):
+ return self.name
+ class Color(Shade):
+ def hex(self):
+ return '%s hexlified!' % self.value
+ class MoreColor(Color):
+ cyan = 4
+ magenta = 5
+ yellow = 6
+ self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!')
+
+
+ def test_no_duplicates(self):
+ class UniqueEnum(Enum):
+ def __init__(self, *args):
+ cls = self.__class__
+ if any(self.value == e.value for e in cls):
+ a = self.name
+ e = cls(self.value).name
+ raise ValueError(
+ "aliases not allowed in UniqueEnum: %r --> %r"
+ % (a, e)
+ )
+ class Color(UniqueEnum):
+ red = 1
+ green = 2
+ blue = 3
+ with self.assertRaises(ValueError):
+ class Color(UniqueEnum):
+ red = 1
+ green = 2
+ blue = 3
+ grene = 2
+
+ def test_init(self):
+ class Planet(Enum):
+ MERCURY = (3.303e+23, 2.4397e6)
+ VENUS = (4.869e+24, 6.0518e6)
+ EARTH = (5.976e+24, 6.37814e6)
+ MARS = (6.421e+23, 3.3972e6)
+ JUPITER = (1.9e+27, 7.1492e7)
+ SATURN = (5.688e+26, 6.0268e7)
+ URANUS = (8.686e+25, 2.5559e7)
+ NEPTUNE = (1.024e+26, 2.4746e7)
+ def __init__(self, mass, radius):
+ self.mass = mass # in kilograms
+ self.radius = radius # in meters
+ @property
+ def surface_gravity(self):
+ # universal gravitational constant (m3 kg-1 s-2)
+ G = 6.67300E-11
+ return G * self.mass / (self.radius * self.radius)
+ self.assertEqual(round(Planet.EARTH.surface_gravity, 2), 9.80)
+ self.assertEqual(Planet.EARTH.value, (5.976e+24, 6.37814e6))
+
+ def test_nonhash_value(self):
+ class AutoNumberInAList(Enum):
+ def __new__(cls):
+ value = [len(cls.__members__) + 1]
+ obj = object.__new__(cls)
+ obj._value_ = value
+ return obj
+ class ColorInAList(AutoNumberInAList):
+ red = ()
+ green = ()
+ blue = ()
+ self.assertEqual(list(ColorInAList), [ColorInAList.red, ColorInAList.green, ColorInAList.blue])
+ self.assertEqual(ColorInAList.red.value, [1])
+ self.assertEqual(ColorInAList([1]), ColorInAList.red)
+
+ def test_conflicting_types_resolved_in_new(self):
+ class LabelledIntEnum(int, Enum):
+ def __new__(cls, *args):
+ value, label = args
+ obj = int.__new__(cls, value)
+ obj.label = label
+ obj._value_ = value
+ return obj
+
+ class LabelledList(LabelledIntEnum):
+ unprocessed = (1, "Unprocessed")
+ payment_complete = (2, "Payment Complete")
+
+ self.assertEqual(list(LabelledList), [LabelledList.unprocessed, LabelledList.payment_complete])
+ self.assertEqual(LabelledList.unprocessed, 1)
+ self.assertEqual(LabelledList(1), LabelledList.unprocessed)
+
+
+class TestUnique(unittest.TestCase):
+
+ def test_unique_clean(self):
+ @unique
+ class Clean(Enum):
+ one = 1
+ two = 'dos'
+ tres = 4.0
+ @unique
+ class Cleaner(IntEnum):
+ single = 1
+ double = 2
+ triple = 3
+
+ def test_unique_dirty(self):
+ with self.assertRaisesRegex(ValueError, 'tres.*one'):
+ @unique
+ class Dirty(Enum):
+ one = 1
+ two = 'dos'
+ tres = 1
+ with self.assertRaisesRegex(
+ ValueError,
+ 'double.*single.*turkey.*triple',
+ ):
+ @unique
+ class Dirtier(IntEnum):
+ single = 1
+ double = 1
+ triple = 3
+ turkey = 3
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
index 2e904cf..a2d18d0 100644
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -1,4 +1,5 @@
import unittest
+import operator
import sys
import pickle
@@ -168,15 +169,12 @@ class TestReversed(unittest.TestCase, PickleTest):
x = range(1)
self.assertEqual(type(reversed(x)), type(iter(x)))
- @support.cpython_only
def test_len(self):
- # This is an implementation detail, not an interface requirement
- from test.test_iterlen import len
for s in ('hello', tuple('hello'), list('hello'), range(5)):
- self.assertEqual(len(reversed(s)), len(s))
+ self.assertEqual(operator.length_hint(reversed(s)), len(s))
r = reversed(s)
list(r)
- self.assertEqual(len(r), 0)
+ self.assertEqual(operator.length_hint(r), 0)
class SeqWithWeirdLen:
called = False
def __len__(self):
@@ -187,7 +185,7 @@ class TestReversed(unittest.TestCase, PickleTest):
def __getitem__(self, index):
return index
r = reversed(SeqWithWeirdLen())
- self.assertRaises(ZeroDivisionError, len, r)
+ self.assertRaises(ZeroDivisionError, operator.length_hint, r)
def test_gc(self):
diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py
index 7f9547f..7077a70 100644
--- a/Lib/test/test_epoll.py
+++ b/Lib/test/test_epoll.py
@@ -33,7 +33,7 @@ if not hasattr(select, "epoll"):
try:
select.epoll()
-except IOError as e:
+except OSError as e:
if e.errno == errno.ENOSYS:
raise unittest.SkipTest("kernel doesn't support epoll()")
raise
@@ -56,7 +56,7 @@ class TestEPoll(unittest.TestCase):
client.setblocking(False)
try:
client.connect(('127.0.0.1', self.serverSocket.getsockname()[1]))
- except socket.error as e:
+ except OSError as e:
self.assertEqual(e.args[0], errno.EINPROGRESS)
else:
raise AssertionError("Connect should have raised EINPROGRESS")
@@ -87,6 +87,13 @@ class TestEPoll(unittest.TestCase):
self.assertRaises(TypeError, select.epoll, ['foo'])
self.assertRaises(TypeError, select.epoll, {})
+ def test_context_manager(self):
+ with select.epoll(16) as ep:
+ self.assertGreater(ep.fileno(), 0)
+ self.assertFalse(ep.closed)
+ self.assertTrue(ep.closed)
+ self.assertRaises(ValueError, ep.fileno)
+
def test_add(self):
server, client = self._connected_pair()
@@ -115,12 +122,12 @@ class TestEPoll(unittest.TestCase):
# ValueError: file descriptor cannot be a negative integer (-1)
self.assertRaises(ValueError, ep.register, -1,
select.EPOLLIN | select.EPOLLOUT)
- # IOError: [Errno 9] Bad file descriptor
- self.assertRaises(IOError, ep.register, 10000,
+ # OSError: [Errno 9] Bad file descriptor
+ self.assertRaises(OSError, ep.register, 10000,
select.EPOLLIN | select.EPOLLOUT)
# registering twice also raises an exception
ep.register(server, select.EPOLLIN | select.EPOLLOUT)
- self.assertRaises(IOError, ep.register, server,
+ self.assertRaises(OSError, ep.register, server,
select.EPOLLIN | select.EPOLLOUT)
finally:
ep.close()
@@ -142,7 +149,7 @@ class TestEPoll(unittest.TestCase):
ep.close()
try:
ep2.poll(1, 4)
- except IOError as e:
+ except OSError as e:
self.assertEqual(e.args[0], errno.EBADF, e)
else:
self.fail("epoll on closed fd didn't raise EBADF")
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 1ad7f97..f0851bd 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -8,8 +8,8 @@ import weakref
import errno
from test.support import (TESTFN, captured_output, check_impl_detail,
- cpython_only, gc_collect, run_unittest, no_tracing,
- unlink)
+ check_warnings, cpython_only, gc_collect, run_unittest,
+ no_tracing, unlink)
class NaiveException(Exception):
def __init__(self, x):
@@ -244,22 +244,22 @@ class ExceptionTests(unittest.TestCase):
{'args' : ('foo', 1)}),
(SystemExit, ('foo',),
{'args' : ('foo',), 'code' : 'foo'}),
- (IOError, ('foo',),
+ (OSError, ('foo',),
{'args' : ('foo',), 'filename' : None,
'errno' : None, 'strerror' : None}),
- (IOError, ('foo', 'bar'),
+ (OSError, ('foo', 'bar'),
{'args' : ('foo', 'bar'), 'filename' : None,
'errno' : 'foo', 'strerror' : 'bar'}),
- (IOError, ('foo', 'bar', 'baz'),
+ (OSError, ('foo', 'bar', 'baz'),
{'args' : ('foo', 'bar'), 'filename' : 'baz',
'errno' : 'foo', 'strerror' : 'bar'}),
- (IOError, ('foo', 'bar', 'baz', 'quux'),
+ (OSError, ('foo', 'bar', 'baz', 'quux'),
{'args' : ('foo', 'bar', 'baz', 'quux')}),
- (EnvironmentError, ('errnoStr', 'strErrorStr', 'filenameStr'),
+ (OSError, ('errnoStr', 'strErrorStr', 'filenameStr'),
{'args' : ('errnoStr', 'strErrorStr'),
'strerror' : 'strErrorStr', 'errno' : 'errnoStr',
'filename' : 'filenameStr'}),
- (EnvironmentError, (1, 'strErrorStr', 'filenameStr'),
+ (OSError, (1, 'strErrorStr', 'filenameStr'),
{'args' : (1, 'strErrorStr'), 'errno' : 1,
'strerror' : 'strErrorStr', 'filename' : 'filenameStr'}),
(SyntaxError, (), {'msg' : None, 'text' : None,
@@ -409,7 +409,7 @@ class ExceptionTests(unittest.TestCase):
self.assertIsNone(e.__context__)
self.assertIsNone(e.__cause__)
- class MyException(EnvironmentError):
+ class MyException(OSError):
pass
e = MyException()
@@ -947,13 +947,11 @@ class ImportErrorTests(unittest.TestCase):
def test_non_str_argument(self):
# Issue #15778
- arg = b'abc'
- exc = ImportError(arg)
- self.assertEqual(str(arg), str(exc))
+ with check_warnings(('', BytesWarning), quiet=True):
+ arg = b'abc'
+ exc = ImportError(arg)
+ self.assertEqual(str(arg), str(exc))
-def test_main():
- run_unittest(ExceptionTests, ImportErrorTests)
-
if __name__ == '__main__':
unittest.main()
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 770e70c..4a8becf 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -264,9 +264,11 @@ faulthandler._sigsegv()
def test_disabled_by_default(self):
# By default, the module should be disabled
code = "import faulthandler; print(faulthandler.is_enabled())"
- rc, stdout, stderr = assert_python_ok("-c", code)
- stdout = (stdout + stderr).strip()
- self.assertEqual(stdout, b"False")
+ args = (sys.executable, '-E', '-c', code)
+ # use subprocess module directly because test.script_helper adds
+ # "-X faulthandler" to the command line
+ stdout = subprocess.check_output(args)
+ self.assertEqual(stdout.rstrip(), b"False")
def test_sys_xoptions(self):
# Test python -X faulthandler
@@ -590,8 +592,5 @@ sys.exit(exitcode)
self.check_register(chain=True)
-def test_main():
- support.run_unittest(FaultHandlerTests)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
index e2a1b37..b64eba2 100644
--- a/Lib/test/test_fcntl.py
+++ b/Lib/test/test_fcntl.py
@@ -1,7 +1,4 @@
"""Test program for the fcntl C module.
-
-OS/2+EMX doesn't support the file locking operations.
-
"""
import platform
import os
@@ -39,8 +36,6 @@ def get_lockdata():
lockdata = struct.pack('qqihhi', 0, 0, 0, fcntl.F_WRLCK, 0, 0)
elif sys.platform in ['aix3', 'aix4', 'hp-uxB', 'unixware7']:
lockdata = struct.pack('hhlllii', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
- elif sys.platform in ['os2emx']:
- lockdata = None
else:
lockdata = struct.pack('hh'+start_len+'hh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
if lockdata:
@@ -66,18 +61,16 @@ class TestFcntl(unittest.TestCase):
rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
if verbose:
print('Status from fcntl with O_NONBLOCK: ', rv)
- if sys.platform not in ['os2emx']:
- rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETLKW, lockdata)
- if verbose:
- print('String from fcntl with F_SETLKW: ', repr(rv))
+ rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETLKW, lockdata)
+ if verbose:
+ print('String from fcntl with F_SETLKW: ', repr(rv))
self.f.close()
def test_fcntl_file_descriptor(self):
# again, but pass the file rather than numeric descriptor
self.f = open(TESTFN, 'wb')
rv = fcntl.fcntl(self.f, fcntl.F_SETFL, os.O_NONBLOCK)
- if sys.platform not in ['os2emx']:
- rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata)
+ rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata)
self.f.close()
def test_fcntl_bad_file(self):
diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py
index 76b1694..d54e976 100644
--- a/Lib/test/test_file.py
+++ b/Lib/test/test_file.py
@@ -87,7 +87,7 @@ class AutoFileTests:
self.assertTrue(not f.closed)
if hasattr(f, "readinto"):
- self.assertRaises((IOError, TypeError), f.readinto, "")
+ self.assertRaises((OSError, TypeError), f.readinto, "")
f.close()
self.assertTrue(f.closed)
@@ -126,7 +126,7 @@ class AutoFileTests:
self.assertEqual(self.f.__exit__(*sys.exc_info()), None)
def testReadWhenWriting(self):
- self.assertRaises(IOError, self.f.read)
+ self.assertRaises(OSError, self.f.read)
class CAutoFileTests(AutoFileTests, unittest.TestCase):
open = io.open
@@ -177,7 +177,7 @@ class OtherFileTests:
d = int(f.read().decode("ascii"))
f.close()
f.close()
- except IOError as msg:
+ except OSError as msg:
self.fail('error setting buffer size %d: %s' % (s, str(msg)))
self.assertEqual(d, s)
diff --git a/Lib/test/test_filecmp.py b/Lib/test/test_filecmp.py
index 0959979..c7cb3fc 100644
--- a/Lib/test/test_filecmp.py
+++ b/Lib/test/test_filecmp.py
@@ -1,4 +1,3 @@
-
import os, filecmp, shutil, tempfile
import unittest
from test import support
@@ -40,15 +39,27 @@ class FileCompareTestCase(unittest.TestCase):
self.assertFalse(filecmp.cmp(self.name, self.dir),
"File and directory compare as equal")
+ def test_cache_clear(self):
+ first_compare = filecmp.cmp(self.name, self.name_same, shallow=False)
+ second_compare = filecmp.cmp(self.name, self.name_diff, shallow=False)
+ filecmp.clear_cache()
+ self.assertTrue(len(filecmp._cache) == 0,
+ "Cache not cleared after calling clear_cache")
+
class DirCompareTestCase(unittest.TestCase):
def setUp(self):
tmpdir = tempfile.gettempdir()
self.dir = os.path.join(tmpdir, 'dir')
self.dir_same = os.path.join(tmpdir, 'dir-same')
self.dir_diff = os.path.join(tmpdir, 'dir-diff')
+
+ # Another dir is created under dir_same, but it has a name from the
+ # ignored list so it should not affect testing results.
+ self.dir_ignored = os.path.join(self.dir_same, '.hg')
+
self.caseinsensitive = os.path.normcase('A') == os.path.normcase('a')
data = 'Contents of file go here.\n'
- for dir in [self.dir, self.dir_same, self.dir_diff]:
+ for dir in (self.dir, self.dir_same, self.dir_diff, self.dir_ignored):
shutil.rmtree(dir, True)
os.mkdir(dir)
if self.caseinsensitive and dir is self.dir_same:
@@ -64,9 +75,11 @@ class DirCompareTestCase(unittest.TestCase):
output.close()
def tearDown(self):
- shutil.rmtree(self.dir)
- shutil.rmtree(self.dir_same)
- shutil.rmtree(self.dir_diff)
+ for dir in (self.dir, self.dir_same, self.dir_diff):
+ shutil.rmtree(dir)
+
+ def test_default_ignores(self):
+ self.assertIn('.hg', filecmp.DEFAULT_IGNORES)
def test_cmpfiles(self):
self.assertTrue(filecmp.cmpfiles(self.dir, self.dir, ['file']) ==
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index 1e70641..c5e57d4 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -275,8 +275,8 @@ class FileInputTests(unittest.TestCase):
try:
t1 = writeTmp(1, [""])
with FileInput(files=t1) as fi:
- raise IOError
- except IOError:
+ raise OSError
+ except OSError:
self.assertEqual(fi._files, ())
finally:
remove_tempfiles(t1)
@@ -835,22 +835,6 @@ class Test_hook_encoded(unittest.TestCase):
self.assertIs(kwargs.pop('encoding'), encoding)
self.assertFalse(kwargs)
-def test_main():
- run_unittest(
- BufferSizesTests,
- FileInputTests,
- Test_fileinput_input,
- Test_fileinput_close,
- Test_fileinput_nextfile,
- Test_fileinput_filename,
- Test_fileinput_lineno,
- Test_fileinput_filelineno,
- Test_fileinput_fileno,
- Test_fileinput_isfirstline,
- Test_fileinput_isstdin,
- Test_hook_compressed,
- Test_hook_encoded,
- )
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py
index 19737d9..0ccbda2 100644
--- a/Lib/test/test_fileio.py
+++ b/Lib/test/test_fileio.py
@@ -145,16 +145,16 @@ class AutoFileTests(unittest.TestCase):
# Unix calls dircheck() and returns "[Errno 21]: Is a directory"
try:
_FileIO('.', 'r')
- except IOError as e:
+ except OSError as e:
self.assertNotEqual(e.errno, 0)
self.assertEqual(e.filename, ".")
else:
- self.fail("Should have raised IOError")
+ self.fail("Should have raised OSError")
@unittest.skipIf(os.name == 'nt', "test only works on a POSIX-like system")
def testOpenDirFD(self):
fd = os.open('.', os.O_RDONLY)
- with self.assertRaises(IOError) as cm:
+ with self.assertRaises(OSError) as cm:
_FileIO(fd, 'r')
os.close(fd)
self.assertEqual(cm.exception.errno, errno.EISDIR)
@@ -172,7 +172,7 @@ class AutoFileTests(unittest.TestCase):
finally:
try:
self.f.close()
- except IOError:
+ except OSError:
pass
return wrapper
@@ -184,14 +184,14 @@ class AutoFileTests(unittest.TestCase):
os.close(f.fileno())
try:
func(self, f)
- except IOError as e:
+ except OSError as e:
self.assertEqual(e.errno, errno.EBADF)
else:
- self.fail("Should have raised IOError")
+ self.fail("Should have raised OSError")
finally:
try:
self.f.close()
- except IOError:
+ except OSError:
pass
return wrapper
@@ -238,7 +238,7 @@ class AutoFileTests(unittest.TestCase):
def ReopenForRead(self):
try:
self.f.close()
- except IOError:
+ except OSError:
pass
self.f = _FileIO(TESTFN, 'r')
os.close(self.f.fileno())
@@ -286,7 +286,7 @@ class OtherFileTests(unittest.TestCase):
if sys.platform != "win32":
try:
f = _FileIO("/dev/tty", "a")
- except EnvironmentError:
+ except OSError:
# When run in a cron job there just aren't any
# ttys, so skip the test. This also handles other
# OS'es that don't support /dev/tty.
@@ -347,7 +347,7 @@ class OtherFileTests(unittest.TestCase):
self.assertRaises(OSError, _FileIO, make_bad_fd())
if sys.platform == 'win32':
import msvcrt
- self.assertRaises(IOError, msvcrt.get_osfhandle, make_bad_fd())
+ self.assertRaises(OSError, msvcrt.get_osfhandle, make_bad_fd())
# Issue 15989
self.assertRaises(TypeError, _FileIO, _testcapi.INT_MAX + 1)
self.assertRaises(TypeError, _FileIO, _testcapi.INT_MIN - 1)
diff --git a/Lib/test/test_finalization.py b/Lib/test/test_finalization.py
new file mode 100644
index 0000000..80c9b87
--- /dev/null
+++ b/Lib/test/test_finalization.py
@@ -0,0 +1,513 @@
+"""
+Tests for object finalization semantics, as outlined in PEP 442.
+"""
+
+import contextlib
+import gc
+import unittest
+import weakref
+
+import _testcapi
+from test import support
+
+
+class NonGCSimpleBase:
+ """
+ The base class for all the objects under test, equipped with various
+ testing features.
+ """
+
+ survivors = []
+ del_calls = []
+ tp_del_calls = []
+ errors = []
+
+ _cleaning = False
+
+ __slots__ = ()
+
+ @classmethod
+ def _cleanup(cls):
+ cls.survivors.clear()
+ cls.errors.clear()
+ gc.garbage.clear()
+ gc.collect()
+ cls.del_calls.clear()
+ cls.tp_del_calls.clear()
+
+ @classmethod
+ @contextlib.contextmanager
+ def test(cls):
+ """
+ A context manager to use around all finalization tests.
+ """
+ with support.disable_gc():
+ cls.del_calls.clear()
+ cls.tp_del_calls.clear()
+ NonGCSimpleBase._cleaning = False
+ try:
+ yield
+ if cls.errors:
+ raise cls.errors[0]
+ finally:
+ NonGCSimpleBase._cleaning = True
+ cls._cleanup()
+
+ def check_sanity(self):
+ """
+ Check the object is sane (non-broken).
+ """
+
+ def __del__(self):
+ """
+ PEP 442 finalizer. Record that this was called, check the
+ object is in a sane state, and invoke a side effect.
+ """
+ try:
+ if not self._cleaning:
+ self.del_calls.append(id(self))
+ self.check_sanity()
+ self.side_effect()
+ except Exception as e:
+ self.errors.append(e)
+
+ def side_effect(self):
+ """
+ A side effect called on destruction.
+ """
+
+
+class SimpleBase(NonGCSimpleBase):
+
+ def __init__(self):
+ self.id_ = id(self)
+
+ def check_sanity(self):
+ assert self.id_ == id(self)
+
+
+class NonGC(NonGCSimpleBase):
+ __slots__ = ()
+
+class NonGCResurrector(NonGCSimpleBase):
+ __slots__ = ()
+
+ def side_effect(self):
+ """
+ Resurrect self by storing self in a class-wide list.
+ """
+ self.survivors.append(self)
+
+class Simple(SimpleBase):
+ pass
+
+class SimpleResurrector(NonGCResurrector, SimpleBase):
+ pass
+
+
+class TestBase:
+
+ def setUp(self):
+ self.old_garbage = gc.garbage[:]
+ gc.garbage[:] = []
+
+ def tearDown(self):
+ # None of the tests here should put anything in gc.garbage
+ try:
+ self.assertEqual(gc.garbage, [])
+ finally:
+ del self.old_garbage
+ gc.collect()
+
+ def assert_del_calls(self, ids):
+ self.assertEqual(sorted(SimpleBase.del_calls), sorted(ids))
+
+ def assert_tp_del_calls(self, ids):
+ self.assertEqual(sorted(SimpleBase.tp_del_calls), sorted(ids))
+
+ def assert_survivors(self, ids):
+ self.assertEqual(sorted(id(x) for x in SimpleBase.survivors), sorted(ids))
+
+ def assert_garbage(self, ids):
+ self.assertEqual(sorted(id(x) for x in gc.garbage), sorted(ids))
+
+ def clear_survivors(self):
+ SimpleBase.survivors.clear()
+
+
+class SimpleFinalizationTest(TestBase, unittest.TestCase):
+ """
+ Test finalization without refcycles.
+ """
+
+ def test_simple(self):
+ with SimpleBase.test():
+ s = Simple()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+
+ def test_simple_resurrect(self):
+ with SimpleBase.test():
+ s = SimpleResurrector()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors(ids)
+ self.assertIsNot(wr(), None)
+ self.clear_survivors()
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+
+ def test_non_gc(self):
+ with SimpleBase.test():
+ s = NonGC()
+ self.assertFalse(gc.is_tracked(s))
+ ids = [id(s)]
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+
+ def test_non_gc_resurrect(self):
+ with SimpleBase.test():
+ s = NonGCResurrector()
+ self.assertFalse(gc.is_tracked(s))
+ ids = [id(s)]
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors(ids)
+ self.clear_survivors()
+ gc.collect()
+ self.assert_del_calls(ids * 2)
+ self.assert_survivors(ids)
+
+
+class SelfCycleBase:
+
+ def __init__(self):
+ super().__init__()
+ self.ref = self
+
+ def check_sanity(self):
+ super().check_sanity()
+ assert self.ref is self
+
+class SimpleSelfCycle(SelfCycleBase, Simple):
+ pass
+
+class SelfCycleResurrector(SelfCycleBase, SimpleResurrector):
+ pass
+
+class SuicidalSelfCycle(SelfCycleBase, Simple):
+
+ def side_effect(self):
+ """
+ Explicitly break the reference cycle.
+ """
+ self.ref = None
+
+
+class SelfCycleFinalizationTest(TestBase, unittest.TestCase):
+ """
+ Test finalization of an object having a single cyclic reference to
+ itself.
+ """
+
+ def test_simple(self):
+ with SimpleBase.test():
+ s = SimpleSelfCycle()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+
+ def test_simple_resurrect(self):
+ # Test that __del__ can resurrect the object being finalized.
+ with SimpleBase.test():
+ s = SelfCycleResurrector()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors(ids)
+ # XXX is this desirable?
+ self.assertIs(wr(), None)
+ # When trying to destroy the object a second time, __del__
+ # isn't called anymore (and the object isn't resurrected).
+ self.clear_survivors()
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+
+ def test_simple_suicide(self):
+ # Test the GC is able to deal with an object that kills its last
+ # reference during __del__.
+ with SimpleBase.test():
+ s = SuicidalSelfCycle()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+
+
+class ChainedBase:
+
+ def chain(self, left):
+ self.suicided = False
+ self.left = left
+ left.right = self
+
+ def check_sanity(self):
+ super().check_sanity()
+ if self.suicided:
+ assert self.left is None
+ assert self.right is None
+ else:
+ left = self.left
+ if left.suicided:
+ assert left.right is None
+ else:
+ assert left.right is self
+ right = self.right
+ if right.suicided:
+ assert right.left is None
+ else:
+ assert right.left is self
+
+class SimpleChained(ChainedBase, Simple):
+ pass
+
+class ChainedResurrector(ChainedBase, SimpleResurrector):
+ pass
+
+class SuicidalChained(ChainedBase, Simple):
+
+ def side_effect(self):
+ """
+ Explicitly break the reference cycle.
+ """
+ self.suicided = True
+ self.left = None
+ self.right = None
+
+
+class CycleChainFinalizationTest(TestBase, unittest.TestCase):
+ """
+ Test finalization of a cyclic chain. These tests are similar in
+ spirit to the self-cycle tests above, but the collectable object
+ graph isn't trivial anymore.
+ """
+
+ def build_chain(self, classes):
+ nodes = [cls() for cls in classes]
+ for i in range(len(nodes)):
+ nodes[i].chain(nodes[i-1])
+ return nodes
+
+ def check_non_resurrecting_chain(self, classes):
+ N = len(classes)
+ with SimpleBase.test():
+ nodes = self.build_chain(classes)
+ ids = [id(s) for s in nodes]
+ wrs = [weakref.ref(s) for s in nodes]
+ del nodes
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+ self.assertEqual([wr() for wr in wrs], [None] * N)
+ gc.collect()
+ self.assert_del_calls(ids)
+
+ def check_resurrecting_chain(self, classes):
+ N = len(classes)
+ with SimpleBase.test():
+ nodes = self.build_chain(classes)
+ N = len(nodes)
+ ids = [id(s) for s in nodes]
+ survivor_ids = [id(s) for s in nodes if isinstance(s, SimpleResurrector)]
+ wrs = [weakref.ref(s) for s in nodes]
+ del nodes
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors(survivor_ids)
+ # XXX desirable?
+ self.assertEqual([wr() for wr in wrs], [None] * N)
+ self.clear_survivors()
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_survivors([])
+
+ def test_homogenous(self):
+ self.check_non_resurrecting_chain([SimpleChained] * 3)
+
+ def test_homogenous_resurrect(self):
+ self.check_resurrecting_chain([ChainedResurrector] * 3)
+
+ def test_homogenous_suicidal(self):
+ self.check_non_resurrecting_chain([SuicidalChained] * 3)
+
+ def test_heterogenous_suicidal_one(self):
+ self.check_non_resurrecting_chain([SuicidalChained, SimpleChained] * 2)
+
+ def test_heterogenous_suicidal_two(self):
+ self.check_non_resurrecting_chain(
+ [SuicidalChained] * 2 + [SimpleChained] * 2)
+
+ def test_heterogenous_resurrect_one(self):
+ self.check_resurrecting_chain([ChainedResurrector, SimpleChained] * 2)
+
+ def test_heterogenous_resurrect_two(self):
+ self.check_resurrecting_chain(
+ [ChainedResurrector, SimpleChained, SuicidalChained] * 2)
+
+ def test_heterogenous_resurrect_three(self):
+ self.check_resurrecting_chain(
+ [ChainedResurrector] * 2 + [SimpleChained] * 2 + [SuicidalChained] * 2)
+
+
+# NOTE: the tp_del slot isn't automatically inherited, so we have to call
+# with_tp_del() for each instantiated class.
+
+class LegacyBase(SimpleBase):
+
+ def __del__(self):
+ try:
+ # Do not invoke side_effect here, since we are now exercising
+ # the tp_del slot.
+ if not self._cleaning:
+ self.del_calls.append(id(self))
+ self.check_sanity()
+ except Exception as e:
+ self.errors.append(e)
+
+ def __tp_del__(self):
+ """
+ Legacy (pre-PEP 442) finalizer, mapped to a tp_del slot.
+ """
+ try:
+ if not self._cleaning:
+ self.tp_del_calls.append(id(self))
+ self.check_sanity()
+ self.side_effect()
+ except Exception as e:
+ self.errors.append(e)
+
+@_testcapi.with_tp_del
+class Legacy(LegacyBase):
+ pass
+
+@_testcapi.with_tp_del
+class LegacyResurrector(LegacyBase):
+
+ def side_effect(self):
+ """
+ Resurrect self by storing self in a class-wide list.
+ """
+ self.survivors.append(self)
+
+@_testcapi.with_tp_del
+class LegacySelfCycle(SelfCycleBase, LegacyBase):
+ pass
+
+
+class LegacyFinalizationTest(TestBase, unittest.TestCase):
+ """
+ Test finalization of objects with a tp_del.
+ """
+
+ def tearDown(self):
+ # These tests need to clean up a bit more, since they create
+ # uncollectable objects.
+ gc.garbage.clear()
+ gc.collect()
+ super().tearDown()
+
+ def test_legacy(self):
+ with SimpleBase.test():
+ s = Legacy()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_tp_del_calls(ids)
+ self.assert_survivors([])
+ self.assertIs(wr(), None)
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_tp_del_calls(ids)
+
+ def test_legacy_resurrect(self):
+ with SimpleBase.test():
+ s = LegacyResurrector()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_tp_del_calls(ids)
+ self.assert_survivors(ids)
+ # weakrefs are cleared before tp_del is called.
+ self.assertIs(wr(), None)
+ self.clear_survivors()
+ gc.collect()
+ self.assert_del_calls(ids)
+ self.assert_tp_del_calls(ids * 2)
+ self.assert_survivors(ids)
+ self.assertIs(wr(), None)
+
+ def test_legacy_self_cycle(self):
+ # Self-cycles with legacy finalizers end up in gc.garbage.
+ with SimpleBase.test():
+ s = LegacySelfCycle()
+ ids = [id(s)]
+ wr = weakref.ref(s)
+ del s
+ gc.collect()
+ self.assert_del_calls([])
+ self.assert_tp_del_calls([])
+ self.assert_survivors([])
+ self.assert_garbage(ids)
+ self.assertIsNot(wr(), None)
+ # Break the cycle to allow collection
+ gc.garbage[0].ref = None
+ self.assert_garbage([])
+ self.assertIs(wr(), None)
+
+
+def test_main():
+ support.run_unittest(__name__)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py
index 8192c38..e0626df 100644
--- a/Lib/test/test_fork1.py
+++ b/Lib/test/test_fork1.py
@@ -1,7 +1,7 @@
"""This test checks for correct fork() behavior.
"""
-import imp
+import _imp as imp
import os
import signal
import sys
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index bd159f5..9f7630c 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -307,6 +307,25 @@ class FormatTest(unittest.TestCase):
finally:
locale.setlocale(locale.LC_ALL, oldloc)
+ @support.cpython_only
+ def test_optimisations(self):
+ text = "abcde" # 5 characters
+
+ self.assertIs("%s" % text, text)
+ self.assertIs("%.5s" % text, text)
+ self.assertIs("%.10s" % text, text)
+ self.assertIs("%1s" % text, text)
+ self.assertIs("%5s" % text, text)
+
+ self.assertIs("{0}".format(text), text)
+ self.assertIs("{0:s}".format(text), text)
+ self.assertIs("{0:.5s}".format(text), text)
+ self.assertIs("{0:.10s}".format(text), text)
+ self.assertIs("{0:1s}".format(text), text)
+ self.assertIs("{0:5s}".format(text), text)
+
+ self.assertIs(text % (), text)
+ self.assertIs(text.format(), text)
def test_main():
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 1fad921..3336532 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -146,9 +146,10 @@ class FractionTest(unittest.TestCase):
self.assertEqual((0, 1), _components(F(-0.0)))
self.assertEqual((3602879701896397, 36028797018963968),
_components(F(0.1)))
- self.assertRaises(TypeError, F, float('nan'))
- self.assertRaises(TypeError, F, float('inf'))
- self.assertRaises(TypeError, F, float('-inf'))
+ # bug 16469: error types should be consistent with float -> int
+ self.assertRaises(ValueError, F, float('nan'))
+ self.assertRaises(OverflowError, F, float('inf'))
+ self.assertRaises(OverflowError, F, float('-inf'))
def testInitFromDecimal(self):
self.assertEqual((11, 10),
@@ -157,10 +158,11 @@ class FractionTest(unittest.TestCase):
_components(F(Decimal('3.5e-2'))))
self.assertEqual((0, 1),
_components(F(Decimal('.000e20'))))
- self.assertRaises(TypeError, F, Decimal('nan'))
- self.assertRaises(TypeError, F, Decimal('snan'))
- self.assertRaises(TypeError, F, Decimal('inf'))
- self.assertRaises(TypeError, F, Decimal('-inf'))
+ # bug 16469: error types should be consistent with decimal -> int
+ self.assertRaises(ValueError, F, Decimal('nan'))
+ self.assertRaises(ValueError, F, Decimal('snan'))
+ self.assertRaises(OverflowError, F, Decimal('inf'))
+ self.assertRaises(OverflowError, F, Decimal('-inf'))
def testFromString(self):
self.assertEqual((5, 1), _components(F("5")))
@@ -248,14 +250,15 @@ class FractionTest(unittest.TestCase):
inf = 1e1000
nan = inf - inf
+ # bug 16469: error types should be consistent with float -> int
self.assertRaisesMessage(
- TypeError, "Cannot convert inf to Fraction.",
+ OverflowError, "Cannot convert inf to Fraction.",
F.from_float, inf)
self.assertRaisesMessage(
- TypeError, "Cannot convert -inf to Fraction.",
+ OverflowError, "Cannot convert -inf to Fraction.",
F.from_float, -inf)
self.assertRaisesMessage(
- TypeError, "Cannot convert nan to Fraction.",
+ ValueError, "Cannot convert nan to Fraction.",
F.from_float, nan)
def testFromDecimal(self):
@@ -268,17 +271,18 @@ class FractionTest(unittest.TestCase):
self.assertEqual(1 - F(1, 10**30),
F.from_decimal(Decimal("0." + "9" * 30)))
+ # bug 16469: error types should be consistent with decimal -> int
self.assertRaisesMessage(
- TypeError, "Cannot convert Infinity to Fraction.",
+ OverflowError, "Cannot convert Infinity to Fraction.",
F.from_decimal, Decimal("inf"))
self.assertRaisesMessage(
- TypeError, "Cannot convert -Infinity to Fraction.",
+ OverflowError, "Cannot convert -Infinity to Fraction.",
F.from_decimal, Decimal("-inf"))
self.assertRaisesMessage(
- TypeError, "Cannot convert NaN to Fraction.",
+ ValueError, "Cannot convert NaN to Fraction.",
F.from_decimal, Decimal("nan"))
self.assertRaisesMessage(
- TypeError, "Cannot convert sNaN to Fraction.",
+ ValueError, "Cannot convert sNaN to Fraction.",
F.from_decimal, Decimal("snan"))
def testLimitDenominator(self):
diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py
new file mode 100644
index 0000000..2dd5780
--- /dev/null
+++ b/Lib/test/test_frame.py
@@ -0,0 +1,116 @@
+import gc
+import sys
+import unittest
+import weakref
+
+from test import support
+
+
+class ClearTest(unittest.TestCase):
+ """
+ Tests for frame.clear().
+ """
+
+ def inner(self, x=5, **kwargs):
+ 1/0
+
+ def outer(self, **kwargs):
+ try:
+ self.inner(**kwargs)
+ except ZeroDivisionError as e:
+ exc = e
+ return exc
+
+ def clear_traceback_frames(self, tb):
+ """
+ Clear all frames in a traceback.
+ """
+ while tb is not None:
+ tb.tb_frame.clear()
+ tb = tb.tb_next
+
+ def test_clear_locals(self):
+ class C:
+ pass
+ c = C()
+ wr = weakref.ref(c)
+ exc = self.outer(c=c)
+ del c
+ support.gc_collect()
+ # A reference to c is held through the frames
+ self.assertIsNot(None, wr())
+ self.clear_traceback_frames(exc.__traceback__)
+ support.gc_collect()
+ # The reference was released by .clear()
+ self.assertIs(None, wr())
+
+ def test_clear_generator(self):
+ endly = False
+ def g():
+ nonlocal endly
+ try:
+ yield
+ inner()
+ finally:
+ endly = True
+ gen = g()
+ next(gen)
+ self.assertFalse(endly)
+ # Clearing the frame closes the generator
+ gen.gi_frame.clear()
+ self.assertTrue(endly)
+
+ def test_clear_executing(self):
+ # Attempting to clear an executing frame is forbidden.
+ try:
+ 1/0
+ except ZeroDivisionError as e:
+ f = e.__traceback__.tb_frame
+ with self.assertRaises(RuntimeError):
+ f.clear()
+ with self.assertRaises(RuntimeError):
+ f.f_back.clear()
+
+ def test_clear_executing_generator(self):
+ # Attempting to clear an executing generator frame is forbidden.
+ endly = False
+ def g():
+ nonlocal endly
+ try:
+ 1/0
+ except ZeroDivisionError as e:
+ f = e.__traceback__.tb_frame
+ with self.assertRaises(RuntimeError):
+ f.clear()
+ with self.assertRaises(RuntimeError):
+ f.f_back.clear()
+ yield f
+ finally:
+ endly = True
+ gen = g()
+ f = next(gen)
+ self.assertFalse(endly)
+ # Clearing the frame closes the generator
+ f.clear()
+ self.assertTrue(endly)
+
+ @support.cpython_only
+ def test_clear_refcycles(self):
+ # .clear() doesn't leave any refcycle behind
+ with support.disable_gc():
+ class C:
+ pass
+ c = C()
+ wr = weakref.ref(c)
+ exc = self.outer(c=c)
+ del c
+ self.assertIsNot(None, wr())
+ self.clear_traceback_frames(exc.__traceback__)
+ self.assertIs(None, wr())
+
+
+def test_main():
+ support.run_unittest(__name__)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_frozen.py b/Lib/test/test_frozen.py
index fd6761c..4c50cb7 100644
--- a/Lib/test/test_frozen.py
+++ b/Lib/test/test_frozen.py
@@ -36,7 +36,7 @@ class FrozenTests(unittest.TestCase):
else:
expect.add('spam')
self.assertEqual(set(dir(__phello__)), expect)
- self.assertEqual(__phello__.__path__, [__phello__.__name__])
+ self.assertEqual(__phello__.__path__, [])
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
with captured_stdout() as stdout:
@@ -72,8 +72,6 @@ class FrozenTests(unittest.TestCase):
del sys.modules['__phello__']
del sys.modules['__phello__.spam']
-def test_main():
- run_unittest(FrozenTests)
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
index 3a99042..25e34be 100644
--- a/Lib/test/test_ftplib.py
+++ b/Lib/test/test_ftplib.py
@@ -21,6 +21,7 @@ from test import support
from test.support import HOST
threading = support.import_module('threading')
+TIMEOUT = 3
# the dummy data returned by server over the data channel when
# RETR, LIST, NLST, MLSD commands are issued
RETR_DATA = 'abcde12345\r\n' * 1000
@@ -125,7 +126,7 @@ class DummyFTPHandler(asynchat.async_chat):
addr = list(map(int, arg.split(',')))
ip = '%d.%d.%d.%d' %tuple(addr[:4])
port = (addr[4] * 256) + addr[5]
- s = socket.create_connection((ip, port), timeout=2)
+ s = socket.create_connection((ip, port), timeout=TIMEOUT)
self.dtp = self.dtp_handler(s, baseclass=self)
self.push('200 active data connection established')
@@ -133,7 +134,7 @@ class DummyFTPHandler(asynchat.async_chat):
with socket.socket() as sock:
sock.bind((self.socket.getsockname()[0], 0))
sock.listen(5)
- sock.settimeout(10)
+ sock.settimeout(TIMEOUT)
ip, port = sock.getsockname()[:2]
ip = ip.replace('.', ','); p1 = port / 256; p2 = port % 256
self.push('227 entering passive mode (%s,%d,%d)' %(ip, p1, p2))
@@ -143,7 +144,7 @@ class DummyFTPHandler(asynchat.async_chat):
def cmd_eprt(self, arg):
af, ip, port = arg.split(arg[0])[1:-1]
port = int(port)
- s = socket.create_connection((ip, port), timeout=2)
+ s = socket.create_connection((ip, port), timeout=TIMEOUT)
self.dtp = self.dtp_handler(s, baseclass=self)
self.push('200 active data connection established')
@@ -151,7 +152,7 @@ class DummyFTPHandler(asynchat.async_chat):
with socket.socket(socket.AF_INET6) as sock:
sock.bind((self.socket.getsockname()[0], 0))
sock.listen(5)
- sock.settimeout(10)
+ sock.settimeout(TIMEOUT)
port = sock.getsockname()[1]
self.push('229 entering extended passive mode (|||%d|)' %port)
conn, addr = sock.accept()
@@ -321,7 +322,7 @@ if ssl is not None:
elif err.args[0] == ssl.SSL_ERROR_EOF:
return self.handle_close()
raise
- except socket.error as err:
+ except OSError as err:
if err.args[0] == errno.ECONNABORTED:
return self.handle_close()
else:
@@ -335,7 +336,7 @@ if ssl is not None:
if err.args[0] in (ssl.SSL_ERROR_WANT_READ,
ssl.SSL_ERROR_WANT_WRITE):
return
- except socket.error as err:
+ except OSError as err:
# Any "socket error" corresponds to a SSL_ERROR_SYSCALL return
# from OpenSSL's SSL_shutdown(), corresponding to a
# closed socket condition. See also:
@@ -454,7 +455,7 @@ class TestFTPClass(TestCase):
def setUp(self):
self.server = DummyFTPServer((HOST, 0))
self.server.start()
- self.client = ftplib.FTP(timeout=2)
+ self.client = ftplib.FTP(timeout=TIMEOUT)
self.client.connect(self.server.host, self.server.port)
def tearDown(self):
@@ -482,7 +483,7 @@ class TestFTPClass(TestCase):
def test_all_errors(self):
exceptions = (ftplib.error_reply, ftplib.error_temp, ftplib.error_perm,
- ftplib.error_proto, ftplib.Error, IOError, EOFError)
+ ftplib.error_proto, ftplib.Error, OSError, EOFError)
for x in exceptions:
try:
raise x('exception not included in all_errors set')
@@ -676,7 +677,7 @@ class TestFTPClass(TestCase):
def test_makepasv(self):
host, port = self.client.makepasv()
- conn = socket.create_connection((host, port), 10)
+ conn = socket.create_connection((host, port), timeout=TIMEOUT)
conn.close()
# IPv4 is in use, just make sure send_epsv has not been used
self.assertEqual(self.server.handler_instance.last_received_cmd, 'pasv')
@@ -689,12 +690,12 @@ class TestFTPClass(TestCase):
return False
try:
self.client.sendcmd('noop')
- except (socket.error, EOFError):
+ except (OSError, EOFError):
return False
return True
# base test
- with ftplib.FTP(timeout=2) as self.client:
+ with ftplib.FTP(timeout=TIMEOUT) as self.client:
self.client.connect(self.server.host, self.server.port)
self.client.sendcmd('noop')
self.assertTrue(is_client_connected())
@@ -702,7 +703,7 @@ class TestFTPClass(TestCase):
self.assertFalse(is_client_connected())
# QUIT sent inside the with block
- with ftplib.FTP(timeout=2) as self.client:
+ with ftplib.FTP(timeout=TIMEOUT) as self.client:
self.client.connect(self.server.host, self.server.port)
self.client.sendcmd('noop')
self.client.quit()
@@ -712,7 +713,7 @@ class TestFTPClass(TestCase):
# force a wrong response code to be sent on QUIT: error_perm
# is expected and the connection is supposed to be closed
try:
- with ftplib.FTP(timeout=2) as self.client:
+ with ftplib.FTP(timeout=TIMEOUT) as self.client:
self.client.connect(self.server.host, self.server.port)
self.client.sendcmd('noop')
self.server.handler_instance.next_response = '550 error on quit'
@@ -734,7 +735,7 @@ class TestFTPClass(TestCase):
source_address=(HOST, port))
self.assertEqual(self.client.sock.getsockname()[1], port)
self.client.quit()
- except IOError as e:
+ except OSError as e:
if e.errno == errno.EADDRINUSE:
self.skipTest("couldn't bind to port %d" % port)
raise
@@ -745,7 +746,7 @@ class TestFTPClass(TestCase):
try:
with self.client.transfercmd('list') as sock:
self.assertEqual(sock.getsockname()[1], port)
- except IOError as e:
+ except OSError as e:
if e.errno == errno.EADDRINUSE:
self.skipTest("couldn't bind to port %d" % port)
raise
@@ -768,7 +769,7 @@ class TestIPv6Environment(TestCase):
def setUp(self):
self.server = DummyFTPServer(('::1', 0), af=socket.AF_INET6)
self.server.start()
- self.client = ftplib.FTP()
+ self.client = ftplib.FTP(timeout=TIMEOUT)
self.client.connect(self.server.host, self.server.port)
def tearDown(self):
@@ -785,7 +786,7 @@ class TestIPv6Environment(TestCase):
def test_makepasv(self):
host, port = self.client.makepasv()
- conn = socket.create_connection((host, port), 10)
+ conn = socket.create_connection((host, port), timeout=TIMEOUT)
conn.close()
self.assertEqual(self.server.handler_instance.last_received_cmd, 'epsv')
@@ -811,7 +812,7 @@ class TestTLS_FTPClassMixin(TestFTPClass):
def setUp(self):
self.server = DummyTLS_FTPServer((HOST, 0))
self.server.start()
- self.client = ftplib.FTP_TLS(timeout=2)
+ self.client = ftplib.FTP_TLS(timeout=TIMEOUT)
self.client.connect(self.server.host, self.server.port)
# enable TLS
self.client.auth()
@@ -824,7 +825,7 @@ class TestTLS_FTPClass(TestCase):
def setUp(self):
self.server = DummyTLS_FTPServer((HOST, 0))
self.server.start()
- self.client = ftplib.FTP_TLS(timeout=2)
+ self.client = ftplib.FTP_TLS(timeout=TIMEOUT)
self.client.connect(self.server.host, self.server.port)
def tearDown(self):
@@ -884,7 +885,7 @@ class TestTLS_FTPClass(TestCase):
self.assertRaises(ValueError, ftplib.FTP_TLS, certfile=CERTFILE,
keyfile=CERTFILE, context=ctx)
- self.client = ftplib.FTP_TLS(context=ctx, timeout=2)
+ self.client = ftplib.FTP_TLS(context=ctx, timeout=TIMEOUT)
self.client.connect(self.server.host, self.server.port)
self.assertNotIsInstance(self.client.sock, ssl.SSLSocket)
self.client.auth()
@@ -998,8 +999,19 @@ class TestTimeouts(TestCase):
ftp.close()
+class TestNetrcDeprecation(TestCase):
+
+ def test_deprecation(self):
+ with support.temp_cwd(), support.EnvironmentVarGuard() as env:
+ env['HOME'] = os.getcwd()
+ open('.netrc', 'w').close()
+ with self.assertWarns(DeprecationWarning):
+ ftplib.Netrc()
+
+
+
def test_main():
- tests = [TestFTPClass, TestTimeouts]
+ tests = [TestFTPClass, TestTimeouts, TestNetrcDeprecation]
if support.IPV6_ENABLED:
tests.append(TestIPv6Environment)
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index db1e934..ab76efb 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -1,57 +1,54 @@
-import functools
import collections
+from itertools import permutations
+import pickle
+from random import choice
import sys
-import unittest
from test import support
+import unittest
from weakref import proxy
-import pickle
-from random import choice
-@staticmethod
-def PythonPartial(func, *args, **keywords):
- 'Pure Python approximation of partial()'
- def newfunc(*fargs, **fkeywords):
- newkeywords = keywords.copy()
- newkeywords.update(fkeywords)
- return func(*(args + fargs), **newkeywords)
- newfunc.func = func
- newfunc.args = args
- newfunc.keywords = keywords
- return newfunc
+import functools
+
+py_functools = support.import_fresh_module('functools', blocked=['_functools'])
+c_functools = support.import_fresh_module('functools', fresh=['_functools'])
+
+decimal = support.import_fresh_module('decimal', fresh=['_decimal'])
+
def capture(*args, **kw):
"""capture all positional and keyword arguments"""
return args, kw
+
def signature(part):
""" return the signature of a partial object """
return (part.func, part.args, part.keywords, part.__dict__)
-class TestPartial(unittest.TestCase):
- thetype = functools.partial
+class TestPartial:
def test_basic_examples(self):
- p = self.thetype(capture, 1, 2, a=10, b=20)
+ p = self.partial(capture, 1, 2, a=10, b=20)
+ self.assertTrue(callable(p))
self.assertEqual(p(3, 4, b=30, c=40),
((1, 2, 3, 4), dict(a=10, b=30, c=40)))
- p = self.thetype(map, lambda x: x*10)
+ p = self.partial(map, lambda x: x*10)
self.assertEqual(list(p([1,2,3,4])), [10, 20, 30, 40])
def test_attributes(self):
- p = self.thetype(capture, 1, 2, a=10, b=20)
+ p = self.partial(capture, 1, 2, a=10, b=20)
# attributes should be readable
self.assertEqual(p.func, capture)
self.assertEqual(p.args, (1, 2))
self.assertEqual(p.keywords, dict(a=10, b=20))
# attributes should not be writable
- if not isinstance(self.thetype, type):
+ if not isinstance(self.partial, type):
return
self.assertRaises(AttributeError, setattr, p, 'func', map)
self.assertRaises(AttributeError, setattr, p, 'args', (1, 2))
self.assertRaises(AttributeError, setattr, p, 'keywords', dict(a=1, b=2))
- p = self.thetype(hex)
+ p = self.partial(hex)
try:
del p.__dict__
except TypeError:
@@ -60,9 +57,9 @@ class TestPartial(unittest.TestCase):
self.fail('partial object allowed __dict__ to be deleted')
def test_argument_checking(self):
- self.assertRaises(TypeError, self.thetype) # need at least a func arg
+ self.assertRaises(TypeError, self.partial) # need at least a func arg
try:
- self.thetype(2)()
+ self.partial(2)()
except TypeError:
pass
else:
@@ -73,7 +70,7 @@ class TestPartial(unittest.TestCase):
def func(a=10, b=20):
return a
d = {'a':3}
- p = self.thetype(func, a=5)
+ p = self.partial(func, a=5)
self.assertEqual(p(**d), 3)
self.assertEqual(d, {'a':3})
p(b=7)
@@ -82,20 +79,20 @@ class TestPartial(unittest.TestCase):
def test_arg_combinations(self):
# exercise special code paths for zero args in either partial
# object or the caller
- p = self.thetype(capture)
+ p = self.partial(capture)
self.assertEqual(p(), ((), {}))
self.assertEqual(p(1,2), ((1,2), {}))
- p = self.thetype(capture, 1, 2)
+ p = self.partial(capture, 1, 2)
self.assertEqual(p(), ((1,2), {}))
self.assertEqual(p(3,4), ((1,2,3,4), {}))
def test_kw_combinations(self):
# exercise special code paths for no keyword args in
# either the partial object or the caller
- p = self.thetype(capture)
+ p = self.partial(capture)
self.assertEqual(p(), ((), {}))
self.assertEqual(p(a=1), ((), {'a':1}))
- p = self.thetype(capture, a=1)
+ p = self.partial(capture, a=1)
self.assertEqual(p(), ((), {'a':1}))
self.assertEqual(p(b=2), ((), {'a':1, 'b':2}))
# keyword args in the call override those in the partial object
@@ -104,7 +101,7 @@ class TestPartial(unittest.TestCase):
def test_positional(self):
# make sure positional arguments are captured correctly
for args in [(), (0,), (0,1), (0,1,2), (0,1,2,3)]:
- p = self.thetype(capture, *args)
+ p = self.partial(capture, *args)
expected = args + ('x',)
got, empty = p('x')
self.assertTrue(expected == got and empty == {})
@@ -112,14 +109,14 @@ class TestPartial(unittest.TestCase):
def test_keyword(self):
# make sure keyword arguments are captured correctly
for a in ['a', 0, None, 3.5]:
- p = self.thetype(capture, a=a)
+ p = self.partial(capture, a=a)
expected = {'a':a,'x':None}
empty, got = p(x=None)
self.assertTrue(expected == got and empty == ())
def test_no_side_effects(self):
# make sure there are no side effects that affect subsequent calls
- p = self.thetype(capture, 0, a=1)
+ p = self.partial(capture, 0, a=1)
args1, kw1 = p(1, b=2)
self.assertTrue(args1 == (0,1) and kw1 == {'a':1,'b':2})
args2, kw2 = p()
@@ -128,13 +125,13 @@ class TestPartial(unittest.TestCase):
def test_error_propagation(self):
def f(x, y):
x / y
- self.assertRaises(ZeroDivisionError, self.thetype(f, 1, 0))
- self.assertRaises(ZeroDivisionError, self.thetype(f, 1), 0)
- self.assertRaises(ZeroDivisionError, self.thetype(f), 1, 0)
- self.assertRaises(ZeroDivisionError, self.thetype(f, y=0), 1)
+ self.assertRaises(ZeroDivisionError, self.partial(f, 1, 0))
+ self.assertRaises(ZeroDivisionError, self.partial(f, 1), 0)
+ self.assertRaises(ZeroDivisionError, self.partial(f), 1, 0)
+ self.assertRaises(ZeroDivisionError, self.partial(f, y=0), 1)
def test_weakref(self):
- f = self.thetype(int, base=16)
+ f = self.partial(int, base=16)
p = proxy(f)
self.assertEqual(f.func, p.func)
f = None
@@ -142,39 +139,45 @@ class TestPartial(unittest.TestCase):
def test_with_bound_and_unbound_methods(self):
data = list(map(str, range(10)))
- join = self.thetype(str.join, '')
+ join = self.partial(str.join, '')
self.assertEqual(join(data), '0123456789')
- join = self.thetype(''.join)
+ join = self.partial(''.join)
self.assertEqual(join(data), '0123456789')
+
+@unittest.skipUnless(c_functools, 'requires the C _functools module')
+class TestPartialC(TestPartial, unittest.TestCase):
+ if c_functools:
+ partial = c_functools.partial
+
def test_repr(self):
args = (object(), object())
args_repr = ', '.join(repr(a) for a in args)
kwargs = {'a': object(), 'b': object()}
kwargs_repr = ', '.join("%s=%r" % (k, v) for k, v in kwargs.items())
- if self.thetype is functools.partial:
+ if self.partial is c_functools.partial:
name = 'functools.partial'
else:
- name = self.thetype.__name__
+ name = self.partial.__name__
- f = self.thetype(capture)
+ f = self.partial(capture)
self.assertEqual('{}({!r})'.format(name, capture),
repr(f))
- f = self.thetype(capture, *args)
+ f = self.partial(capture, *args)
self.assertEqual('{}({!r}, {})'.format(name, capture, args_repr),
repr(f))
- f = self.thetype(capture, **kwargs)
+ f = self.partial(capture, **kwargs)
self.assertEqual('{}({!r}, {})'.format(name, capture, kwargs_repr),
repr(f))
- f = self.thetype(capture, *args, **kwargs)
+ f = self.partial(capture, *args, **kwargs)
self.assertEqual('{}({!r}, {}, {})'.format(name, capture, args_repr, kwargs_repr),
repr(f))
def test_pickle(self):
- f = self.thetype(signature, 'asdf', bar=True)
+ f = self.partial(signature, 'asdf', bar=True)
f.add_something_to__dict__ = True
f_copy = pickle.loads(pickle.dumps(f))
self.assertEqual(signature(f), signature(f_copy))
@@ -193,28 +196,26 @@ class TestPartial(unittest.TestCase):
return {}
raise IndexError
- f = self.thetype(object)
+ f = self.partial(object)
self.assertRaisesRegex(SystemError,
"new style getargs format but argument is not a tuple",
f.__setstate__, BadSequence())
-class PartialSubclass(functools.partial):
- pass
-class TestPartialSubclass(TestPartial):
+class TestPartialPy(TestPartial, unittest.TestCase):
+ partial = staticmethod(py_functools.partial)
- thetype = PartialSubclass
-class TestPythonPartial(TestPartial):
+if c_functools:
+ class PartialSubclass(c_functools.partial):
+ pass
- thetype = PythonPartial
- # the python version hasn't a nice repr
- def test_repr(self): pass
+@unittest.skipUnless(c_functools, 'requires the C _functools module')
+class TestPartialCSubclass(TestPartialC):
+ if c_functools:
+ partial = PartialSubclass
- # the python version isn't picklable
- def test_pickle(self): pass
- def test_setstate_refcount(self): pass
class TestUpdateWrapper(unittest.TestCase):
@@ -223,19 +224,26 @@ class TestUpdateWrapper(unittest.TestCase):
updated=functools.WRAPPER_UPDATES):
# Check attributes were assigned
for name in assigned:
- self.assertTrue(getattr(wrapper, name) is getattr(wrapped, name))
+ self.assertIs(getattr(wrapper, name), getattr(wrapped, name))
# Check attributes were updated
for name in updated:
wrapper_attr = getattr(wrapper, name)
wrapped_attr = getattr(wrapped, name)
for key in wrapped_attr:
- self.assertTrue(wrapped_attr[key] is wrapper_attr[key])
+ if name == "__dict__" and key == "__wrapped__":
+ # __wrapped__ is overwritten by the update code
+ continue
+ self.assertIs(wrapped_attr[key], wrapper_attr[key])
+ # Check __wrapped__
+ self.assertIs(wrapper.__wrapped__, wrapped)
+
def _default_update(self):
def f(a:'This is a new annotation'):
"""This is a test"""
pass
f.attr = 'This is also a test'
+ f.__wrapped__ = "This is a bald faced lie"
def wrapper(b:'This is the prior annotation'):
pass
functools.update_wrapper(wrapper, f)
@@ -322,6 +330,7 @@ class TestUpdateWrapper(unittest.TestCase):
self.assertTrue(wrapper.__doc__.startswith('max('))
self.assertEqual(wrapper.__annotations__, {})
+
class TestWraps(TestUpdateWrapper):
def _default_update(self):
@@ -329,14 +338,15 @@ class TestWraps(TestUpdateWrapper):
"""This is a test"""
pass
f.attr = 'This is also a test'
+ f.__wrapped__ = "This is still a bald faced lie"
@functools.wraps(f)
def wrapper():
pass
- self.check_wrapper(wrapper, f)
return wrapper, f
def test_default_update(self):
wrapper, f = self._default_update()
+ self.check_wrapper(wrapper, f)
self.assertEqual(wrapper.__name__, 'f')
self.assertEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.attr, 'This is also a test')
@@ -382,6 +392,7 @@ class TestWraps(TestUpdateWrapper):
self.assertEqual(wrapper.attr, 'This is a different test')
self.assertEqual(wrapper.dict_attr, f.dict_attr)
+
class TestReduce(unittest.TestCase):
func = functools.reduce
@@ -462,24 +473,29 @@ class TestReduce(unittest.TestCase):
d = {"one": 1, "two": 2, "three": 3}
self.assertEqual(self.func(add, d), "".join(d.keys()))
-class TestCmpToKey(unittest.TestCase):
+
+class TestCmpToKey:
def test_cmp_to_key(self):
def cmp1(x, y):
return (x > y) - (x < y)
- key = functools.cmp_to_key(cmp1)
+ key = self.cmp_to_key(cmp1)
self.assertEqual(key(3), key(3))
self.assertGreater(key(3), key(1))
+ self.assertGreaterEqual(key(3), key(3))
+
def cmp2(x, y):
return int(x) - int(y)
- key = functools.cmp_to_key(cmp2)
+ key = self.cmp_to_key(cmp2)
self.assertEqual(key(4.0), key('4'))
self.assertLess(key(2), key('35'))
+ self.assertLessEqual(key(2), key('35'))
+ self.assertNotEqual(key(2), key('35'))
def test_cmp_to_key_arguments(self):
def cmp1(x, y):
return (x > y) - (x < y)
- key = functools.cmp_to_key(mycmp=cmp1)
+ key = self.cmp_to_key(mycmp=cmp1)
self.assertEqual(key(obj=3), key(obj=3))
self.assertGreater(key(obj=3), key(obj=1))
with self.assertRaises((TypeError, AttributeError)):
@@ -487,10 +503,10 @@ class TestCmpToKey(unittest.TestCase):
with self.assertRaises((TypeError, AttributeError)):
1 < key(3) # lhs is not a K object
with self.assertRaises(TypeError):
- key = functools.cmp_to_key() # too few args
+ key = self.cmp_to_key() # too few args
with self.assertRaises(TypeError):
- key = functools.cmp_to_key(cmp1, None) # too many args
- key = functools.cmp_to_key(cmp1)
+ key = self.cmp_to_key(cmp1, None) # too many args
+ key = self.cmp_to_key(cmp1)
with self.assertRaises(TypeError):
key() # too few args
with self.assertRaises(TypeError):
@@ -499,7 +515,7 @@ class TestCmpToKey(unittest.TestCase):
def test_bad_cmp(self):
def cmp1(x, y):
raise ZeroDivisionError
- key = functools.cmp_to_key(cmp1)
+ key = self.cmp_to_key(cmp1)
with self.assertRaises(ZeroDivisionError):
key(3) > key(1)
@@ -514,13 +530,13 @@ class TestCmpToKey(unittest.TestCase):
def test_obj_field(self):
def cmp1(x, y):
return (x > y) - (x < y)
- key = functools.cmp_to_key(mycmp=cmp1)
+ key = self.cmp_to_key(mycmp=cmp1)
self.assertEqual(key(50).obj, 50)
def test_sort_int(self):
def mycmp(x, y):
return y - x
- self.assertEqual(sorted(range(5), key=functools.cmp_to_key(mycmp)),
+ self.assertEqual(sorted(range(5), key=self.cmp_to_key(mycmp)),
[4, 3, 2, 1, 0])
def test_sort_int_str(self):
@@ -528,18 +544,29 @@ class TestCmpToKey(unittest.TestCase):
x, y = int(x), int(y)
return (x > y) - (x < y)
values = [5, '3', 7, 2, '0', '1', 4, '10', 1]
- values = sorted(values, key=functools.cmp_to_key(mycmp))
+ values = sorted(values, key=self.cmp_to_key(mycmp))
self.assertEqual([int(value) for value in values],
[0, 1, 1, 2, 3, 4, 5, 7, 10])
def test_hash(self):
def mycmp(x, y):
return y - x
- key = functools.cmp_to_key(mycmp)
+ key = self.cmp_to_key(mycmp)
k = key(10)
self.assertRaises(TypeError, hash, k)
self.assertNotIsInstance(k, collections.Hashable)
+
+@unittest.skipUnless(c_functools, 'requires the C _functools module')
+class TestCmpToKeyC(TestCmpToKey, unittest.TestCase):
+ if c_functools:
+ cmp_to_key = c_functools.cmp_to_key
+
+
+class TestCmpToKeyPy(TestCmpToKey, unittest.TestCase):
+ cmp_to_key = staticmethod(py_functools.cmp_to_key)
+
+
class TestTotalOrdering(unittest.TestCase):
def test_total_ordering_lt(self):
@@ -640,11 +667,12 @@ class TestTotalOrdering(unittest.TestCase):
with self.assertRaises(TypeError):
TestTO(8) <= ()
+
class TestLRU(unittest.TestCase):
def test_lru(self):
def orig(x, y):
- return 3*x+y
+ return 3 * x + y
f = functools.lru_cache(maxsize=20)(orig)
hits, misses, maxsize, currsize = f.cache_info()
self.assertEqual(maxsize, 20)
@@ -749,7 +777,7 @@ class TestLRU(unittest.TestCase):
# Verify that user_function exceptions get passed through without
# creating a hard-to-read chained exception.
# http://bugs.python.org/issue13177
- for maxsize in (None, 100):
+ for maxsize in (None, 128):
@functools.lru_cache(maxsize)
def func(i):
return 'abc'[i]
@@ -762,7 +790,7 @@ class TestLRU(unittest.TestCase):
func(15)
def test_lru_with_types(self):
- for maxsize in (None, 100):
+ for maxsize in (None, 128):
@functools.lru_cache(maxsize=maxsize, typed=True)
def square(x):
return x * x
@@ -777,6 +805,36 @@ class TestLRU(unittest.TestCase):
self.assertEqual(square.cache_info().hits, 4)
self.assertEqual(square.cache_info().misses, 4)
+ def test_lru_with_keyword_args(self):
+ @functools.lru_cache()
+ def fib(n):
+ if n < 2:
+ return n
+ return fib(n=n-1) + fib(n=n-2)
+ self.assertEqual(
+ [fib(n=number) for number in range(16)],
+ [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
+ )
+ self.assertEqual(fib.cache_info(),
+ functools._CacheInfo(hits=28, misses=16, maxsize=128, currsize=16))
+ fib.cache_clear()
+ self.assertEqual(fib.cache_info(),
+ functools._CacheInfo(hits=0, misses=0, maxsize=128, currsize=0))
+
+ def test_lru_with_keyword_args_maxsize_none(self):
+ @functools.lru_cache(maxsize=None)
+ def fib(n):
+ if n < 2:
+ return n
+ return fib(n=n-1) + fib(n=n-2)
+ self.assertEqual([fib(n=number) for number in range(16)],
+ [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610])
+ self.assertEqual(fib.cache_info(),
+ functools._CacheInfo(hits=28, misses=16, maxsize=None, currsize=16))
+ fib.cache_clear()
+ self.assertEqual(fib.cache_info(),
+ functools._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0))
+
def test_need_for_rlock(self):
# This will deadlock on an LRU cache that uses a regular lock
@@ -802,17 +860,493 @@ class TestLRU(unittest.TestCase):
DoubleEq(2)) # Verify the correct return value
+class TestSingleDispatch(unittest.TestCase):
+ def test_simple_overloads(self):
+ @functools.singledispatch
+ def g(obj):
+ return "base"
+ def g_int(i):
+ return "integer"
+ g.register(int, g_int)
+ self.assertEqual(g("str"), "base")
+ self.assertEqual(g(1), "integer")
+ self.assertEqual(g([1,2,3]), "base")
+
+ def test_mro(self):
+ @functools.singledispatch
+ def g(obj):
+ return "base"
+ class A:
+ pass
+ class C(A):
+ pass
+ class B(A):
+ pass
+ class D(C, B):
+ pass
+ def g_A(a):
+ return "A"
+ def g_B(b):
+ return "B"
+ g.register(A, g_A)
+ g.register(B, g_B)
+ self.assertEqual(g(A()), "A")
+ self.assertEqual(g(B()), "B")
+ self.assertEqual(g(C()), "A")
+ self.assertEqual(g(D()), "B")
+
+ def test_register_decorator(self):
+ @functools.singledispatch
+ def g(obj):
+ return "base"
+ @g.register(int)
+ def g_int(i):
+ return "int %s" % (i,)
+ self.assertEqual(g(""), "base")
+ self.assertEqual(g(12), "int 12")
+ self.assertIs(g.dispatch(int), g_int)
+ self.assertIs(g.dispatch(object), g.dispatch(str))
+ # Note: in the assert above this is not g.
+ # @singledispatch returns the wrapper.
+
+ def test_wrapping_attributes(self):
+ @functools.singledispatch
+ def g(obj):
+ "Simple test"
+ return "Test"
+ self.assertEqual(g.__name__, "g")
+ self.assertEqual(g.__doc__, "Simple test")
+
+ @unittest.skipUnless(decimal, 'requires _decimal')
+ @support.cpython_only
+ def test_c_classes(self):
+ @functools.singledispatch
+ def g(obj):
+ return "base"
+ @g.register(decimal.DecimalException)
+ def _(obj):
+ return obj.args
+ subn = decimal.Subnormal("Exponent < Emin")
+ rnd = decimal.Rounded("Number got rounded")
+ self.assertEqual(g(subn), ("Exponent < Emin",))
+ self.assertEqual(g(rnd), ("Number got rounded",))
+ @g.register(decimal.Subnormal)
+ def _(obj):
+ return "Too small to care."
+ self.assertEqual(g(subn), "Too small to care.")
+ self.assertEqual(g(rnd), ("Number got rounded",))
+
+ def test_compose_mro(self):
+ # None of the examples in this test depend on haystack ordering.
+ c = collections
+ mro = functools._compose_mro
+ bases = [c.Sequence, c.MutableMapping, c.Mapping, c.Set]
+ for haystack in permutations(bases):
+ m = mro(dict, haystack)
+ self.assertEqual(m, [dict, c.MutableMapping, c.Mapping, c.Sized,
+ c.Iterable, c.Container, object])
+ bases = [c.Container, c.Mapping, c.MutableMapping, c.OrderedDict]
+ for haystack in permutations(bases):
+ m = mro(c.ChainMap, haystack)
+ self.assertEqual(m, [c.ChainMap, c.MutableMapping, c.Mapping,
+ c.Sized, c.Iterable, c.Container, object])
+
+ # If there's a generic function with implementations registered for
+ # both Sized and Container, passing a defaultdict to it results in an
+ # ambiguous dispatch which will cause a RuntimeError (see
+ # test_mro_conflicts).
+ bases = [c.Container, c.Sized, str]
+ for haystack in permutations(bases):
+ m = mro(c.defaultdict, [c.Sized, c.Container, str])
+ self.assertEqual(m, [c.defaultdict, dict, c.Sized, c.Container,
+ object])
+
+ # MutableSequence below is registered directly on D. In other words, it
+ # preceeds MutableMapping which means single dispatch will always
+ # choose MutableSequence here.
+ class D(c.defaultdict):
+ pass
+ c.MutableSequence.register(D)
+ bases = [c.MutableSequence, c.MutableMapping]
+ for haystack in permutations(bases):
+ m = mro(D, bases)
+ self.assertEqual(m, [D, c.MutableSequence, c.Sequence,
+ c.defaultdict, dict, c.MutableMapping,
+ c.Mapping, c.Sized, c.Iterable, c.Container,
+ object])
+
+ # Container and Callable are registered on different base classes and
+ # a generic function supporting both should always pick the Callable
+ # implementation if a C instance is passed.
+ class C(c.defaultdict):
+ def __call__(self):
+ pass
+ bases = [c.Sized, c.Callable, c.Container, c.Mapping]
+ for haystack in permutations(bases):
+ m = mro(C, haystack)
+ self.assertEqual(m, [C, c.Callable, c.defaultdict, dict, c.Mapping,
+ c.Sized, c.Iterable, c.Container, object])
+
+ def test_register_abc(self):
+ c = collections
+ d = {"a": "b"}
+ l = [1, 2, 3]
+ s = {object(), None}
+ f = frozenset(s)
+ t = (1, 2, 3)
+ @functools.singledispatch
+ def g(obj):
+ return "base"
+ self.assertEqual(g(d), "base")
+ self.assertEqual(g(l), "base")
+ self.assertEqual(g(s), "base")
+ self.assertEqual(g(f), "base")
+ self.assertEqual(g(t), "base")
+ g.register(c.Sized, lambda obj: "sized")
+ self.assertEqual(g(d), "sized")
+ self.assertEqual(g(l), "sized")
+ self.assertEqual(g(s), "sized")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sized")
+ g.register(c.MutableMapping, lambda obj: "mutablemapping")
+ self.assertEqual(g(d), "mutablemapping")
+ self.assertEqual(g(l), "sized")
+ self.assertEqual(g(s), "sized")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sized")
+ g.register(c.ChainMap, lambda obj: "chainmap")
+ self.assertEqual(g(d), "mutablemapping") # irrelevant ABCs registered
+ self.assertEqual(g(l), "sized")
+ self.assertEqual(g(s), "sized")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sized")
+ g.register(c.MutableSequence, lambda obj: "mutablesequence")
+ self.assertEqual(g(d), "mutablemapping")
+ self.assertEqual(g(l), "mutablesequence")
+ self.assertEqual(g(s), "sized")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sized")
+ g.register(c.MutableSet, lambda obj: "mutableset")
+ self.assertEqual(g(d), "mutablemapping")
+ self.assertEqual(g(l), "mutablesequence")
+ self.assertEqual(g(s), "mutableset")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sized")
+ g.register(c.Mapping, lambda obj: "mapping")
+ self.assertEqual(g(d), "mutablemapping") # not specific enough
+ self.assertEqual(g(l), "mutablesequence")
+ self.assertEqual(g(s), "mutableset")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sized")
+ g.register(c.Sequence, lambda obj: "sequence")
+ self.assertEqual(g(d), "mutablemapping")
+ self.assertEqual(g(l), "mutablesequence")
+ self.assertEqual(g(s), "mutableset")
+ self.assertEqual(g(f), "sized")
+ self.assertEqual(g(t), "sequence")
+ g.register(c.Set, lambda obj: "set")
+ self.assertEqual(g(d), "mutablemapping")
+ self.assertEqual(g(l), "mutablesequence")
+ self.assertEqual(g(s), "mutableset")
+ self.assertEqual(g(f), "set")
+ self.assertEqual(g(t), "sequence")
+ g.register(dict, lambda obj: "dict")
+ self.assertEqual(g(d), "dict")
+ self.assertEqual(g(l), "mutablesequence")
+ self.assertEqual(g(s), "mutableset")
+ self.assertEqual(g(f), "set")
+ self.assertEqual(g(t), "sequence")
+ g.register(list, lambda obj: "list")
+ self.assertEqual(g(d), "dict")
+ self.assertEqual(g(l), "list")
+ self.assertEqual(g(s), "mutableset")
+ self.assertEqual(g(f), "set")
+ self.assertEqual(g(t), "sequence")
+ g.register(set, lambda obj: "concrete-set")
+ self.assertEqual(g(d), "dict")
+ self.assertEqual(g(l), "list")
+ self.assertEqual(g(s), "concrete-set")
+ self.assertEqual(g(f), "set")
+ self.assertEqual(g(t), "sequence")
+ g.register(frozenset, lambda obj: "frozen-set")
+ self.assertEqual(g(d), "dict")
+ self.assertEqual(g(l), "list")
+ self.assertEqual(g(s), "concrete-set")
+ self.assertEqual(g(f), "frozen-set")
+ self.assertEqual(g(t), "sequence")
+ g.register(tuple, lambda obj: "tuple")
+ self.assertEqual(g(d), "dict")
+ self.assertEqual(g(l), "list")
+ self.assertEqual(g(s), "concrete-set")
+ self.assertEqual(g(f), "frozen-set")
+ self.assertEqual(g(t), "tuple")
+
+ def test_c3_abc(self):
+ c = collections
+ mro = functools._c3_mro
+ class A(object):
+ pass
+ class B(A):
+ def __len__(self):
+ return 0 # implies Sized
+ @c.Container.register
+ class C(object):
+ pass
+ class D(object):
+ pass # unrelated
+ class X(D, C, B):
+ def __call__(self):
+ pass # implies Callable
+ expected = [X, c.Callable, D, C, c.Container, B, c.Sized, A, object]
+ for abcs in permutations([c.Sized, c.Callable, c.Container]):
+ self.assertEqual(mro(X, abcs=abcs), expected)
+ # unrelated ABCs don't appear in the resulting MRO
+ many_abcs = [c.Mapping, c.Sized, c.Callable, c.Container, c.Iterable]
+ self.assertEqual(mro(X, abcs=many_abcs), expected)
+
+ def test_mro_conflicts(self):
+ c = collections
+ @functools.singledispatch
+ def g(arg):
+ return "base"
+ class O(c.Sized):
+ def __len__(self):
+ return 0
+ o = O()
+ self.assertEqual(g(o), "base")
+ g.register(c.Iterable, lambda arg: "iterable")
+ g.register(c.Container, lambda arg: "container")
+ g.register(c.Sized, lambda arg: "sized")
+ g.register(c.Set, lambda arg: "set")
+ self.assertEqual(g(o), "sized")
+ c.Iterable.register(O)
+ self.assertEqual(g(o), "sized") # because it's explicitly in __mro__
+ c.Container.register(O)
+ self.assertEqual(g(o), "sized") # see above: Sized is in __mro__
+ c.Set.register(O)
+ self.assertEqual(g(o), "set") # because c.Set is a subclass of
+ # c.Sized and c.Container
+ class P:
+ pass
+ p = P()
+ self.assertEqual(g(p), "base")
+ c.Iterable.register(P)
+ self.assertEqual(g(p), "iterable")
+ c.Container.register(P)
+ with self.assertRaises(RuntimeError) as re_one:
+ g(p)
+ self.assertIn(
+ str(re_one.exception),
+ (("Ambiguous dispatch: <class 'collections.abc.Container'> "
+ "or <class 'collections.abc.Iterable'>"),
+ ("Ambiguous dispatch: <class 'collections.abc.Iterable'> "
+ "or <class 'collections.abc.Container'>")),
+ )
+ class Q(c.Sized):
+ def __len__(self):
+ return 0
+ q = Q()
+ self.assertEqual(g(q), "sized")
+ c.Iterable.register(Q)
+ self.assertEqual(g(q), "sized") # because it's explicitly in __mro__
+ c.Set.register(Q)
+ self.assertEqual(g(q), "set") # because c.Set is a subclass of
+ # c.Sized and c.Iterable
+ @functools.singledispatch
+ def h(arg):
+ return "base"
+ @h.register(c.Sized)
+ def _(arg):
+ return "sized"
+ @h.register(c.Container)
+ def _(arg):
+ return "container"
+ # Even though Sized and Container are explicit bases of MutableMapping,
+ # this ABC is implicitly registered on defaultdict which makes all of
+ # MutableMapping's bases implicit as well from defaultdict's
+ # perspective.
+ with self.assertRaises(RuntimeError) as re_two:
+ h(c.defaultdict(lambda: 0))
+ self.assertIn(
+ str(re_two.exception),
+ (("Ambiguous dispatch: <class 'collections.abc.Container'> "
+ "or <class 'collections.abc.Sized'>"),
+ ("Ambiguous dispatch: <class 'collections.abc.Sized'> "
+ "or <class 'collections.abc.Container'>")),
+ )
+ class R(c.defaultdict):
+ pass
+ c.MutableSequence.register(R)
+ @functools.singledispatch
+ def i(arg):
+ return "base"
+ @i.register(c.MutableMapping)
+ def _(arg):
+ return "mapping"
+ @i.register(c.MutableSequence)
+ def _(arg):
+ return "sequence"
+ r = R()
+ self.assertEqual(i(r), "sequence")
+ class S:
+ pass
+ class T(S, c.Sized):
+ def __len__(self):
+ return 0
+ t = T()
+ self.assertEqual(h(t), "sized")
+ c.Container.register(T)
+ self.assertEqual(h(t), "sized") # because it's explicitly in the MRO
+ class U:
+ def __len__(self):
+ return 0
+ u = U()
+ self.assertEqual(h(u), "sized") # implicit Sized subclass inferred
+ # from the existence of __len__()
+ c.Container.register(U)
+ # There is no preference for registered versus inferred ABCs.
+ with self.assertRaises(RuntimeError) as re_three:
+ h(u)
+ self.assertIn(
+ str(re_three.exception),
+ (("Ambiguous dispatch: <class 'collections.abc.Container'> "
+ "or <class 'collections.abc.Sized'>"),
+ ("Ambiguous dispatch: <class 'collections.abc.Sized'> "
+ "or <class 'collections.abc.Container'>")),
+ )
+ class V(c.Sized, S):
+ def __len__(self):
+ return 0
+ @functools.singledispatch
+ def j(arg):
+ return "base"
+ @j.register(S)
+ def _(arg):
+ return "s"
+ @j.register(c.Container)
+ def _(arg):
+ return "container"
+ v = V()
+ self.assertEqual(j(v), "s")
+ c.Container.register(V)
+ self.assertEqual(j(v), "container") # because it ends up right after
+ # Sized in the MRO
+
+ def test_cache_invalidation(self):
+ from collections import UserDict
+ class TracingDict(UserDict):
+ def __init__(self, *args, **kwargs):
+ super(TracingDict, self).__init__(*args, **kwargs)
+ self.set_ops = []
+ self.get_ops = []
+ def __getitem__(self, key):
+ result = self.data[key]
+ self.get_ops.append(key)
+ return result
+ def __setitem__(self, key, value):
+ self.set_ops.append(key)
+ self.data[key] = value
+ def clear(self):
+ self.data.clear()
+ _orig_wkd = functools.WeakKeyDictionary
+ td = TracingDict()
+ functools.WeakKeyDictionary = lambda: td
+ c = collections
+ @functools.singledispatch
+ def g(arg):
+ return "base"
+ d = {}
+ l = []
+ self.assertEqual(len(td), 0)
+ self.assertEqual(g(d), "base")
+ self.assertEqual(len(td), 1)
+ self.assertEqual(td.get_ops, [])
+ self.assertEqual(td.set_ops, [dict])
+ self.assertEqual(td.data[dict], g.registry[object])
+ self.assertEqual(g(l), "base")
+ self.assertEqual(len(td), 2)
+ self.assertEqual(td.get_ops, [])
+ self.assertEqual(td.set_ops, [dict, list])
+ self.assertEqual(td.data[dict], g.registry[object])
+ self.assertEqual(td.data[list], g.registry[object])
+ self.assertEqual(td.data[dict], td.data[list])
+ self.assertEqual(g(l), "base")
+ self.assertEqual(g(d), "base")
+ self.assertEqual(td.get_ops, [list, dict])
+ self.assertEqual(td.set_ops, [dict, list])
+ g.register(list, lambda arg: "list")
+ self.assertEqual(td.get_ops, [list, dict])
+ self.assertEqual(len(td), 0)
+ self.assertEqual(g(d), "base")
+ self.assertEqual(len(td), 1)
+ self.assertEqual(td.get_ops, [list, dict])
+ self.assertEqual(td.set_ops, [dict, list, dict])
+ self.assertEqual(td.data[dict],
+ functools._find_impl(dict, g.registry))
+ self.assertEqual(g(l), "list")
+ self.assertEqual(len(td), 2)
+ self.assertEqual(td.get_ops, [list, dict])
+ self.assertEqual(td.set_ops, [dict, list, dict, list])
+ self.assertEqual(td.data[list],
+ functools._find_impl(list, g.registry))
+ class X:
+ pass
+ c.MutableMapping.register(X) # Will not invalidate the cache,
+ # not using ABCs yet.
+ self.assertEqual(g(d), "base")
+ self.assertEqual(g(l), "list")
+ self.assertEqual(td.get_ops, [list, dict, dict, list])
+ self.assertEqual(td.set_ops, [dict, list, dict, list])
+ g.register(c.Sized, lambda arg: "sized")
+ self.assertEqual(len(td), 0)
+ self.assertEqual(g(d), "sized")
+ self.assertEqual(len(td), 1)
+ self.assertEqual(td.get_ops, [list, dict, dict, list])
+ self.assertEqual(td.set_ops, [dict, list, dict, list, dict])
+ self.assertEqual(g(l), "list")
+ self.assertEqual(len(td), 2)
+ self.assertEqual(td.get_ops, [list, dict, dict, list])
+ self.assertEqual(td.set_ops, [dict, list, dict, list, dict, list])
+ self.assertEqual(g(l), "list")
+ self.assertEqual(g(d), "sized")
+ self.assertEqual(td.get_ops, [list, dict, dict, list, list, dict])
+ self.assertEqual(td.set_ops, [dict, list, dict, list, dict, list])
+ g.dispatch(list)
+ g.dispatch(dict)
+ self.assertEqual(td.get_ops, [list, dict, dict, list, list, dict,
+ list, dict])
+ self.assertEqual(td.set_ops, [dict, list, dict, list, dict, list])
+ c.MutableSet.register(X) # Will invalidate the cache.
+ self.assertEqual(len(td), 2) # Stale cache.
+ self.assertEqual(g(l), "list")
+ self.assertEqual(len(td), 1)
+ g.register(c.MutableMapping, lambda arg: "mutablemapping")
+ self.assertEqual(len(td), 0)
+ self.assertEqual(g(d), "mutablemapping")
+ self.assertEqual(len(td), 1)
+ self.assertEqual(g(l), "list")
+ self.assertEqual(len(td), 2)
+ g.register(dict, lambda arg: "dict")
+ self.assertEqual(g(d), "dict")
+ self.assertEqual(g(l), "list")
+ g._clear_cache()
+ self.assertEqual(len(td), 0)
+ functools.WeakKeyDictionary = _orig_wkd
+
+
def test_main(verbose=None):
test_classes = (
- TestPartial,
- TestPartialSubclass,
- TestPythonPartial,
+ TestPartialC,
+ TestPartialPy,
+ TestPartialCSubclass,
TestUpdateWrapper,
TestTotalOrdering,
- TestCmpToKey,
+ TestCmpToKeyC,
+ TestCmpToKeyPy,
TestWraps,
TestReduce,
TestLRU,
+ TestSingleDispatch,
)
support.run_unittest(*test_classes)
diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py
index a0c156f..beac993 100644
--- a/Lib/test/test_future.py
+++ b/Lib/test/test_future.py
@@ -82,6 +82,14 @@ class FutureTest(unittest.TestCase):
else:
self.fail("expected exception didn't occur")
+ def test_badfuture10(self):
+ try:
+ from test import badsyntax_future10
+ except SyntaxError as msg:
+ self.assertEqual(get_error_location(msg), ("badsyntax_future10", '3'))
+ else:
+ self.fail("expected exception didn't occur")
+
def test_parserhack(self):
# test that the parser.c::future_hack function works as expected
# Note: although this test must pass, it's not testing the original
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index c59b72e..e8f52a5 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,6 +1,9 @@
+import _testcapi
import unittest
from test.support import (verbose, refcount_test, run_unittest,
strip_python_stderr)
+from test.script_helper import assert_python_ok, make_script, temp_dir
+
import sys
import time
import gc
@@ -38,6 +41,7 @@ class GC_Detector(object):
# gc collects it.
self.wr = weakref.ref(C1055820(666), it_happened)
+@_testcapi.with_tp_del
class Uncollectable(object):
"""Create a reference cycle with multiple __del__ methods.
@@ -50,7 +54,7 @@ class Uncollectable(object):
self.partner = Uncollectable(partner=self)
else:
self.partner = partner
- def __del__(self):
+ def __tp_del__(self):
pass
### Tests
@@ -139,11 +143,12 @@ class GCTests(unittest.TestCase):
del a
self.assertNotEqual(gc.collect(), 0)
- def test_finalizer(self):
+ def test_legacy_finalizer(self):
# A() is uncollectable if it is part of a cycle, make sure it shows up
# in gc.garbage.
+ @_testcapi.with_tp_del
class A:
- def __del__(self): pass
+ def __tp_del__(self): pass
class B:
pass
a = A()
@@ -163,11 +168,12 @@ class GCTests(unittest.TestCase):
self.fail("didn't find obj in garbage (finalizer)")
gc.garbage.remove(obj)
- def test_finalizer_newclass(self):
+ def test_legacy_finalizer_newclass(self):
# A() is uncollectable if it is part of a cycle, make sure it shows up
# in gc.garbage.
+ @_testcapi.with_tp_del
class A(object):
- def __del__(self): pass
+ def __tp_del__(self): pass
class B(object):
pass
a = A()
@@ -568,12 +574,14 @@ class GCTests(unittest.TestCase):
import subprocess
code = """if 1:
import gc
+ import _testcapi
+ @_testcapi.with_tp_del
class X:
def __init__(self, name):
self.name = name
def __repr__(self):
return "<X %%r>" %% self.name
- def __del__(self):
+ def __tp_del__(self):
pass
x = X('first')
@@ -610,6 +618,66 @@ class GCTests(unittest.TestCase):
stderr = run_command(code % "gc.DEBUG_SAVEALL")
self.assertNotIn(b"uncollectable objects at shutdown", stderr)
+ def test_gc_main_module_at_shutdown(self):
+ # Create a reference cycle through the __main__ module and check
+ # it gets collected at interpreter shutdown.
+ code = """if 1:
+ import weakref
+ class C:
+ def __del__(self):
+ print('__del__ called')
+ l = [C()]
+ l.append(l)
+ """
+ rc, out, err = assert_python_ok('-c', code)
+ self.assertEqual(out.strip(), b'__del__ called')
+
+ def test_gc_ordinary_module_at_shutdown(self):
+ # Same as above, but with a non-__main__ module.
+ with temp_dir() as script_dir:
+ module = """if 1:
+ import weakref
+ class C:
+ def __del__(self):
+ print('__del__ called')
+ l = [C()]
+ l.append(l)
+ """
+ code = """if 1:
+ import sys
+ sys.path.insert(0, %r)
+ import gctest
+ """ % (script_dir,)
+ make_script(script_dir, 'gctest', module)
+ rc, out, err = assert_python_ok('-c', code)
+ self.assertEqual(out.strip(), b'__del__ called')
+
+ def test_get_stats(self):
+ stats = gc.get_stats()
+ self.assertEqual(len(stats), 3)
+ for st in stats:
+ self.assertIsInstance(st, dict)
+ self.assertEqual(set(st),
+ {"collected", "collections", "uncollectable"})
+ self.assertGreaterEqual(st["collected"], 0)
+ self.assertGreaterEqual(st["collections"], 0)
+ self.assertGreaterEqual(st["uncollectable"], 0)
+ # Check that collection counts are incremented correctly
+ if gc.isenabled():
+ self.addCleanup(gc.enable)
+ gc.disable()
+ old = gc.get_stats()
+ gc.collect(0)
+ new = gc.get_stats()
+ self.assertEqual(new[0]["collections"], old[0]["collections"] + 1)
+ self.assertEqual(new[1]["collections"], old[1]["collections"])
+ self.assertEqual(new[2]["collections"], old[2]["collections"])
+ gc.collect(2)
+ new = gc.get_stats()
+ self.assertEqual(new[0]["collections"], old[0]["collections"] + 1)
+ self.assertEqual(new[1]["collections"], old[1]["collections"])
+ self.assertEqual(new[2]["collections"], old[2]["collections"] + 1)
+
class GCCallbackTests(unittest.TestCase):
def setUp(self):
diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
index abcb23e..4c037a1 100644
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -164,6 +164,7 @@ class DebuggerTests(unittest.TestCase):
'linux-gate.so',
'Do you need "set solib-search-path" or '
'"set sysroot"?',
+ 'warning: Source file is more recent than executable.',
)
for line in errlines:
if not line.startswith(ignore_patterns):
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
index 958054a..4e92117 100644
--- a/Lib/test/test_generators.py
+++ b/Lib/test/test_generators.py
@@ -1,3 +1,55 @@
+import gc
+import sys
+import unittest
+import weakref
+
+from test import support
+
+
+class FinalizationTest(unittest.TestCase):
+
+ def test_frame_resurrect(self):
+ # A generator frame can be resurrected by a generator's finalization.
+ def gen():
+ nonlocal frame
+ try:
+ yield
+ finally:
+ frame = sys._getframe()
+
+ g = gen()
+ wr = weakref.ref(g)
+ next(g)
+ del g
+ support.gc_collect()
+ self.assertIs(wr(), None)
+ self.assertTrue(frame)
+ del frame
+ support.gc_collect()
+
+ def test_refcycle(self):
+ # A generator caught in a refcycle gets finalized anyway.
+ old_garbage = gc.garbage[:]
+ finalized = False
+ def gen():
+ nonlocal finalized
+ try:
+ g = yield
+ yield 1
+ finally:
+ finalized = True
+
+ g = gen()
+ next(g)
+ g.send(g)
+ self.assertGreater(sys.getrefcount(g), 2)
+ self.assertFalse(finalized)
+ del g
+ support.gc_collect()
+ self.assertTrue(finalized)
+ self.assertEqual(gc.garbage, old_garbage)
+
+
tutorial_tests = """
Let's try a simple generator:
@@ -1729,9 +1781,7 @@ Our ill-behaved code should be invoked during GC:
>>> g = f()
>>> next(g)
>>> del g
->>> sys.stderr.getvalue().startswith(
-... "Exception RuntimeError: 'generator ignored GeneratorExit' in "
-... )
+>>> "RuntimeError: generator ignored GeneratorExit" in sys.stderr.getvalue()
True
>>> sys.stderr = old
@@ -1841,22 +1891,23 @@ to test.
... sys.stderr = io.StringIO()
... class Leaker:
... def __del__(self):
-... raise RuntimeError
+... def invoke(message):
+... raise RuntimeError(message)
+... invoke("test")
...
... l = Leaker()
... del l
... err = sys.stderr.getvalue().strip()
-... err.startswith(
-... "Exception RuntimeError: RuntimeError() in <"
-... )
-... err.endswith("> ignored")
-... len(err.splitlines())
+... "Exception ignored in" in err
+... "RuntimeError: test" in err
+... "Traceback" in err
+... "in invoke" in err
... finally:
... sys.stderr = old
True
True
-1
-
+True
+True
These refleak tests should perhaps be in a testfile of their own,
@@ -1881,6 +1932,7 @@ __test__ = {"tut": tutorial_tests,
# so this works as expected in both ways of running regrtest.
def test_main(verbose=None):
from test import support, test_generators
+ support.run_unittest(__name__)
support.run_doctest(test_generators, verbose)
# This part isn't needed for regrtest, but for running the test directly.
diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py
index fd8bc57..e967897 100644
--- a/Lib/test/test_genericpath.py
+++ b/Lib/test/test_genericpath.py
@@ -188,12 +188,93 @@ class GenericTest:
support.unlink(support.TESTFN)
safe_rmdir(support.TESTFN)
+ @staticmethod
+ def _create_file(filename):
+ with open(filename, 'wb') as f:
+ f.write(b'foo')
+
+ def test_samefile(self):
+ try:
+ test_fn = support.TESTFN + "1"
+ self._create_file(test_fn)
+ self.assertTrue(self.pathmodule.samefile(test_fn, test_fn))
+ self.assertRaises(TypeError, self.pathmodule.samefile)
+ finally:
+ os.remove(test_fn)
+
+ @support.skip_unless_symlink
+ def test_samefile_on_symlink(self):
+ self._test_samefile_on_link_func(os.symlink)
+
+ def test_samefile_on_link(self):
+ self._test_samefile_on_link_func(os.link)
+
+ def _test_samefile_on_link_func(self, func):
+ try:
+ test_fn1 = support.TESTFN + "1"
+ test_fn2 = support.TESTFN + "2"
+ self._create_file(test_fn1)
+
+ func(test_fn1, test_fn2)
+ self.assertTrue(self.pathmodule.samefile(test_fn1, test_fn2))
+ os.remove(test_fn2)
+
+ self._create_file(test_fn2)
+ self.assertFalse(self.pathmodule.samefile(test_fn1, test_fn2))
+ finally:
+ os.remove(test_fn1)
+ os.remove(test_fn2)
+
+ def test_samestat(self):
+ try:
+ test_fn = support.TESTFN + "1"
+ self._create_file(test_fn)
+ test_fns = [test_fn]*2
+ stats = map(os.stat, test_fns)
+ self.assertTrue(self.pathmodule.samestat(*stats))
+ finally:
+ os.remove(test_fn)
+
+ @support.skip_unless_symlink
+ def test_samestat_on_symlink(self):
+ self._test_samestat_on_link_func(os.symlink)
+
+ def test_samestat_on_link(self):
+ self._test_samestat_on_link_func(os.link)
+
+ def _test_samestat_on_link_func(self, func):
+ try:
+ test_fn1 = support.TESTFN + "1"
+ test_fn2 = support.TESTFN + "2"
+ self._create_file(test_fn1)
+ test_fns = (test_fn1, test_fn2)
+ func(*test_fns)
+ stats = map(os.stat, test_fns)
+ self.assertTrue(self.pathmodule.samestat(*stats))
+ os.remove(test_fn2)
+
+ self._create_file(test_fn2)
+ stats = map(os.stat, test_fns)
+ self.assertFalse(self.pathmodule.samestat(*stats))
+
+ self.assertRaises(TypeError, self.pathmodule.samestat)
+ finally:
+ os.remove(test_fn1)
+ os.remove(test_fn2)
+
+ def test_sameopenfile(self):
+ fname = support.TESTFN + "1"
+ with open(fname, "wb") as a, open(fname, "wb") as b:
+ self.assertTrue(self.pathmodule.sameopenfile(
+ a.fileno(), b.fileno()))
+
class TestGenericTest(GenericTest, unittest.TestCase):
# Issue 16852: GenericTest can't inherit from unittest.TestCase
# for test discovery purposes; CommonTest inherits from GenericTest
# and is only meant to be inherited by others.
pathmodule = genericpath
+
# Following TestCase is not supposed to be run from test_genericpath.
# It is inherited by other test modules (macpath, ntpath, posixpath).
@@ -322,7 +403,6 @@ class CommonTest(GenericTest):
else:
self.skipTest("need support.TESTFN_NONASCII")
- # Test non-ASCII, non-UTF8 bytes in the path.
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
with support.temp_cwd(name):
diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py
index 48ca94e..beea76a 100644
--- a/Lib/test/test_getargs2.py
+++ b/Lib/test/test_getargs2.py
@@ -1,38 +1,40 @@
import unittest
from test import support
from _testcapi import getargs_keywords, getargs_keyword_only
-
-"""
-> How about the following counterproposal. This also changes some of
-> the other format codes to be a little more regular.
->
-> Code C type Range check
->
-> b unsigned char 0..UCHAR_MAX
-> h signed short SHRT_MIN..SHRT_MAX
-> B unsigned char none **
-> H unsigned short none **
-> k * unsigned long none
-> I * unsigned int 0..UINT_MAX
-
-
-> i int INT_MIN..INT_MAX
-> l long LONG_MIN..LONG_MAX
-
-> K * unsigned long long none
-> L long long LLONG_MIN..LLONG_MAX
-
-> Notes:
->
-> * New format codes.
->
-> ** Changed from previous "range-and-a-half" to "none"; the
-> range-and-a-half checking wasn't particularly useful.
-
-Plus a C API or two, e.g. PyInt_AsLongMask() ->
-unsigned long and PyInt_AsLongLongMask() -> unsigned
-long long (if that exists).
-"""
+try:
+ from _testcapi import getargs_L, getargs_K
+except ImportError:
+ getargs_L = None # PY_LONG_LONG not available
+
+# > How about the following counterproposal. This also changes some of
+# > the other format codes to be a little more regular.
+# >
+# > Code C type Range check
+# >
+# > b unsigned char 0..UCHAR_MAX
+# > h signed short SHRT_MIN..SHRT_MAX
+# > B unsigned char none **
+# > H unsigned short none **
+# > k * unsigned long none
+# > I * unsigned int 0..UINT_MAX
+#
+#
+# > i int INT_MIN..INT_MAX
+# > l long LONG_MIN..LONG_MAX
+#
+# > K * unsigned long long none
+# > L long long LLONG_MIN..LLONG_MAX
+#
+# > Notes:
+# >
+# > * New format codes.
+# >
+# > ** Changed from previous "range-and-a-half" to "none"; the
+# > range-and-a-half checking wasn't particularly useful.
+#
+# Plus a C API or two, e.g. PyInt_AsLongMask() ->
+# unsigned long and PyInt_AsLongLongMask() -> unsigned
+# long long (if that exists).
LARGE = 0x7FFFFFFF
VERY_LARGE = 0xFF0000121212121212121242
@@ -184,6 +186,7 @@ class Signed_TestCase(unittest.TestCase):
self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
+@unittest.skipIf(getargs_L is None, 'PY_LONG_LONG is not available')
class LongLong_TestCase(unittest.TestCase):
def test_L(self):
from _testcapi import getargs_L
@@ -536,24 +539,5 @@ class Unicode_TestCase(unittest.TestCase):
self.assertIsNone(getargs_Z_hash(None))
-def test_main():
- tests = [
- Signed_TestCase,
- Unsigned_TestCase,
- Boolean_TestCase,
- Tuple_TestCase,
- Keywords_TestCase,
- KeywordOnly_TestCase,
- Bytes_TestCase,
- Unicode_TestCase,
- ]
- try:
- from _testcapi import getargs_L, getargs_K
- except ImportError:
- pass # PY_LONG_LONG not available
- else:
- tests.append(LongLong_TestCase)
- support.run_unittest(*tests)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_getpass.py b/Lib/test/test_getpass.py
new file mode 100644
index 0000000..1731bd4
--- /dev/null
+++ b/Lib/test/test_getpass.py
@@ -0,0 +1,155 @@
+import getpass
+import os
+import unittest
+from io import BytesIO, StringIO
+from unittest import mock
+from test import support
+
+try:
+ import termios
+except ImportError:
+ termios = None
+try:
+ import pwd
+except ImportError:
+ pwd = None
+
+@mock.patch('os.environ')
+class GetpassGetuserTest(unittest.TestCase):
+
+ def test_username_takes_username_from_env(self, environ):
+ expected_name = 'some_name'
+ environ.get.return_value = expected_name
+ self.assertEqual(expected_name, getpass.getuser())
+
+ def test_username_priorities_of_env_values(self, environ):
+ environ.get.return_value = None
+ try:
+ getpass.getuser()
+ except ImportError: # in case there's no pwd module
+ pass
+ self.assertEqual(
+ environ.get.call_args_list,
+ [mock.call(x) for x in ('LOGNAME', 'USER', 'LNAME', 'USERNAME')])
+
+ def test_username_falls_back_to_pwd(self, environ):
+ expected_name = 'some_name'
+ environ.get.return_value = None
+ if pwd:
+ with mock.patch('os.getuid') as uid, \
+ mock.patch('pwd.getpwuid') as getpw:
+ uid.return_value = 42
+ getpw.return_value = [expected_name]
+ self.assertEqual(expected_name,
+ getpass.getuser())
+ getpw.assert_called_once_with(42)
+ else:
+ self.assertRaises(ImportError, getpass.getuser)
+
+
+class GetpassRawinputTest(unittest.TestCase):
+
+ def test_flushes_stream_after_prompt(self):
+ # see issue 1703
+ stream = mock.Mock(spec=StringIO)
+ input = StringIO('input_string')
+ getpass._raw_input('some_prompt', stream, input=input)
+ stream.flush.assert_called_once_with()
+
+ def test_uses_stderr_as_default(self):
+ input = StringIO('input_string')
+ prompt = 'some_prompt'
+ with mock.patch('sys.stderr') as stderr:
+ getpass._raw_input(prompt, input=input)
+ stderr.write.assert_called_once_with(prompt)
+
+ @mock.patch('sys.stdin')
+ def test_uses_stdin_as_default_input(self, mock_input):
+ mock_input.readline.return_value = 'input_string'
+ getpass._raw_input(stream=StringIO())
+ mock_input.readline.assert_called_once_with()
+
+ def test_raises_on_empty_input(self):
+ input = StringIO('')
+ self.assertRaises(EOFError, getpass._raw_input, input=input)
+
+ def test_trims_trailing_newline(self):
+ input = StringIO('test\n')
+ self.assertEqual('test', getpass._raw_input(input=input))
+
+
+# Some of these tests are a bit white-box. The functional requirement is that
+# the password input be taken directly from the tty, and that it not be echoed
+# on the screen, unless we are falling back to stderr/stdin.
+
+# Some of these might run on platforms without termios, but play it safe.
+@unittest.skipUnless(termios, 'tests require system with termios')
+class UnixGetpassTest(unittest.TestCase):
+
+ def test_uses_tty_directly(self):
+ with mock.patch('os.open') as open, \
+ mock.patch('io.FileIO') as fileio, \
+ mock.patch('io.TextIOWrapper') as textio:
+ # By setting open's return value to None the implementation will
+ # skip code we don't care about in this test. We can mock this out
+ # fully if an alternate implementation works differently.
+ open.return_value = None
+ getpass.unix_getpass()
+ open.assert_called_once_with('/dev/tty',
+ os.O_RDWR | os.O_NOCTTY)
+ fileio.assert_called_once_with(open.return_value, 'w+')
+ textio.assert_called_once_with(fileio.return_value)
+
+ def test_resets_termios(self):
+ with mock.patch('os.open') as open, \
+ mock.patch('io.FileIO'), \
+ mock.patch('io.TextIOWrapper'), \
+ mock.patch('termios.tcgetattr') as tcgetattr, \
+ mock.patch('termios.tcsetattr') as tcsetattr:
+ open.return_value = 3
+ fake_attrs = [255, 255, 255, 255, 255]
+ tcgetattr.return_value = list(fake_attrs)
+ getpass.unix_getpass()
+ tcsetattr.assert_called_with(3, mock.ANY, fake_attrs)
+
+ def test_falls_back_to_fallback_if_termios_raises(self):
+ with mock.patch('os.open') as open, \
+ mock.patch('io.FileIO') as fileio, \
+ mock.patch('io.TextIOWrapper') as textio, \
+ mock.patch('termios.tcgetattr'), \
+ mock.patch('termios.tcsetattr') as tcsetattr, \
+ mock.patch('getpass.fallback_getpass') as fallback:
+ open.return_value = 3
+ fileio.return_value = BytesIO()
+ tcsetattr.side_effect = termios.error
+ getpass.unix_getpass()
+ fallback.assert_called_once_with('Password: ',
+ textio.return_value)
+
+ def test_flushes_stream_after_input(self):
+ # issue 7208
+ with mock.patch('os.open') as open, \
+ mock.patch('io.FileIO'), \
+ mock.patch('io.TextIOWrapper'), \
+ mock.patch('termios.tcgetattr'), \
+ mock.patch('termios.tcsetattr'):
+ open.return_value = 3
+ mock_stream = mock.Mock(spec=StringIO)
+ getpass.unix_getpass(stream=mock_stream)
+ mock_stream.flush.assert_called_with()
+
+ def test_falls_back_to_stdin(self):
+ with mock.patch('os.open') as os_open, \
+ mock.patch('sys.stdin', spec=StringIO) as stdin:
+ os_open.side_effect = IOError
+ stdin.fileno.side_effect = AttributeError
+ with support.captured_stderr() as stderr:
+ with self.assertWarns(getpass.GetPassWarning):
+ getpass.unix_getpass()
+ stdin.readline.assert_called_once_with()
+ self.assertIn('Warning', stderr.getvalue())
+ self.assertIn('Password:', stderr.getvalue())
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index 5eac921..37fe853 100755..100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -389,6 +389,20 @@ class TestGzip(BaseTest):
datac = gzip.compress(data)
self.assertEqual(gzip.decompress(datac), data)
+ def test_read_truncated(self):
+ data = data1*50
+ # Drop the CRC (4 bytes) and file size (4 bytes).
+ truncated = gzip.compress(data)[:-8]
+ with gzip.GzipFile(fileobj=io.BytesIO(truncated)) as f:
+ self.assertRaises(EOFError, f.read)
+ with gzip.GzipFile(fileobj=io.BytesIO(truncated)) as f:
+ self.assertEqual(f.read(len(data)), data)
+ self.assertRaises(EOFError, f.read, 1)
+ # Incomplete 10-byte header.
+ for i in range(2, 10):
+ with gzip.GzipFile(fileobj=io.BytesIO(truncated[:i])) as f:
+ self.assertRaises(EOFError, f.read, 1)
+
def test_read_with_extra(self):
# Gzip data with an extra field
gzdata = (b'\x1f\x8b\x08\x04\xb2\x17cQ\x02\xff'
diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
index f3385f6..6d5c5a4 100644
--- a/Lib/test/test_hashlib.py
+++ b/Lib/test/test_hashlib.py
@@ -36,7 +36,10 @@ def hexstr(s):
class HashLibTestCase(unittest.TestCase):
supported_hash_names = ( 'md5', 'MD5', 'sha1', 'SHA1',
'sha224', 'SHA224', 'sha256', 'SHA256',
- 'sha384', 'SHA384', 'sha512', 'SHA512' )
+ 'sha384', 'SHA384', 'sha512', 'SHA512',
+ 'sha3_224', 'sha3_256', 'sha3_384',
+ 'sha3_512', 'SHA3_224', 'SHA3_256',
+ 'SHA3_384', 'SHA3_512' )
# Issue #14693: fallback modules are always compiled under POSIX
_warn_on_extension_import = os.name == 'posix' or COMPILED_WITH_PYDEBUG
@@ -72,8 +75,8 @@ class HashLibTestCase(unittest.TestCase):
if _hashlib:
# These two algorithms should always be present when this module
# is compiled. If not, something was compiled wrong.
- assert hasattr(_hashlib, 'openssl_md5')
- assert hasattr(_hashlib, 'openssl_sha1')
+ self.assertTrue(hasattr(_hashlib, 'openssl_md5'))
+ self.assertTrue(hasattr(_hashlib, 'openssl_sha1'))
for algorithm, constructors in self.constructors_to_test.items():
constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
if constructor:
@@ -93,6 +96,12 @@ class HashLibTestCase(unittest.TestCase):
if _sha512:
self.constructors_to_test['sha384'].add(_sha512.sha384)
self.constructors_to_test['sha512'].add(_sha512.sha512)
+ _sha3 = self._conditional_import_module('_sha3')
+ if _sha3:
+ self.constructors_to_test['sha3_224'].add(_sha3.sha3_224)
+ self.constructors_to_test['sha3_256'].add(_sha3.sha3_256)
+ self.constructors_to_test['sha3_384'].add(_sha3.sha3_384)
+ self.constructors_to_test['sha3_512'].add(_sha3.sha3_512)
super(HashLibTestCase, self).__init__(*args, **kwargs)
@@ -142,9 +151,16 @@ class HashLibTestCase(unittest.TestCase):
def test_hexdigest(self):
for cons in self.hash_constructors:
h = cons()
- assert isinstance(h.digest(), bytes), name
+ self.assertIsInstance(h.digest(), bytes)
self.assertEqual(hexstr(h.digest()), h.hexdigest())
+ def test_name_attribute(self):
+ for cons in self.hash_constructors:
+ h = cons()
+ self.assertIsInstance(h.name, str)
+ self.assertIn(h.name, self.supported_hash_names)
+ self.assertEqual(h.name, hashlib.new(h.name).name)
+
def test_large_update(self):
aas = b'a' * 128
bees = b'b' * 127
@@ -205,6 +221,10 @@ class HashLibTestCase(unittest.TestCase):
self.check_no_unicode('sha256')
self.check_no_unicode('sha384')
self.check_no_unicode('sha512')
+ self.check_no_unicode('sha3_224')
+ self.check_no_unicode('sha3_256')
+ self.check_no_unicode('sha3_384')
+ self.check_no_unicode('sha3_512')
def check_blocksize_name(self, name, block_size=0, digest_size=0):
constructors = self.constructors_to_test[name]
@@ -213,8 +233,9 @@ class HashLibTestCase(unittest.TestCase):
self.assertEqual(m.block_size, block_size)
self.assertEqual(m.digest_size, digest_size)
self.assertEqual(len(m.digest()), digest_size)
- self.assertEqual(m.name.lower(), name.lower())
- self.assertIn(name.split("_")[0], repr(m).lower())
+ self.assertEqual(m.name, name)
+ # split for sha3_512 / _sha3.sha3 object
+ self.assertIn(name.split("_")[0], repr(m))
def test_blocksize_name(self):
self.check_blocksize_name('md5', 64, 16)
@@ -223,6 +244,10 @@ class HashLibTestCase(unittest.TestCase):
self.check_blocksize_name('sha256', 64, 32)
self.check_blocksize_name('sha384', 128, 48)
self.check_blocksize_name('sha512', 128, 64)
+ self.check_blocksize_name('sha3_224', NotImplemented, 28)
+ self.check_blocksize_name('sha3_256', NotImplemented, 32)
+ self.check_blocksize_name('sha3_384', NotImplemented, 48)
+ self.check_blocksize_name('sha3_512', NotImplemented, 64)
def test_case_md5_0(self):
self.check('md5', b'', 'd41d8cd98f00b204e9800998ecf8427e')
@@ -358,6 +383,108 @@ class HashLibTestCase(unittest.TestCase):
"e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb"+
"de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b")
+ # SHA-3 family
+ def test_case_sha3_224_0(self):
+ self.check('sha3_224', b"",
+ "F71837502BA8E10837BDD8D365ADB85591895602FC552B48B7390ABD")
+
+ def test_case_sha3_224_1(self):
+ self.check('sha3_224', bytes.fromhex("CC"),
+ "A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802")
+
+ def test_case_sha3_224_2(self):
+ self.check('sha3_224', bytes.fromhex("41FB"),
+ "615BA367AFDC35AAC397BC7EB5D58D106A734B24986D5D978FEFD62C")
+
+ def test_case_sha3_224_3(self):
+ self.check('sha3_224', bytes.fromhex(
+ "433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B9"+
+ "8214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784"+
+ "444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53"+
+ "E7E0846DCBB4CE"),
+ "62B10F1B6236EBC2DA72957742A8D4E48E213B5F8934604BFD4D2C3A")
+
+ @bigmemtest(size=_4G + 5, memuse=1)
+ def test_case_sha3_224_huge(self, size):
+ if size == _4G + 5:
+ try:
+ self.check('sha3_224', b'A'*size,
+ '58ef60057c9dddb6a87477e9ace5a26f0d9db01881cf9b10a9f8c224')
+ except OverflowError:
+ pass # 32-bit arch
+
+
+ def test_case_sha3_256_0(self):
+ self.check('sha3_256', b"",
+ "C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470")
+
+ def test_case_sha3_256_1(self):
+ self.check('sha3_256', bytes.fromhex("CC"),
+ "EEAD6DBFC7340A56CAEDC044696A168870549A6A7F6F56961E84A54BD9970B8A")
+
+ def test_case_sha3_256_2(self):
+ self.check('sha3_256', bytes.fromhex("41FB"),
+ "A8EACEDA4D47B3281A795AD9E1EA2122B407BAF9AABCB9E18B5717B7873537D2")
+
+ def test_case_sha3_256_3(self):
+ self.check('sha3_256', bytes.fromhex(
+ "433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B9"+
+ "8214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784"+
+ "444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53"+
+ "E7E0846DCBB4CE"),
+ "CE87A5173BFFD92399221658F801D45C294D9006EE9F3F9D419C8D427748DC41")
+
+
+ def test_case_sha3_384_0(self):
+ self.check('sha3_384', b"",
+ "2C23146A63A29ACF99E73B88F8C24EAA7DC60AA771780CCC006AFBFA8FE2479B"+
+ "2DD2B21362337441AC12B515911957FF")
+
+ def test_case_sha3_384_1(self):
+ self.check('sha3_384', bytes.fromhex("CC"),
+ "1B84E62A46E5A201861754AF5DC95C4A1A69CAF4A796AE405680161E29572641"+
+ "F5FA1E8641D7958336EE7B11C58F73E9")
+
+ def test_case_sha3_384_2(self):
+ self.check('sha3_384', bytes.fromhex("41FB"),
+ "495CCE2714CD72C8C53C3363D22C58B55960FE26BE0BF3BBC7A3316DD563AD1D"+
+ "B8410E75EEFEA655E39D4670EC0B1792")
+
+ def test_case_sha3_384_3(self):
+ self.check('sha3_384', bytes.fromhex(
+ "433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B9"+
+ "8214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784"+
+ "444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53"+
+ "E7E0846DCBB4CE"),
+ "135114508DD63E279E709C26F7817C0482766CDE49132E3EDF2EEDD8996F4E35"+
+ "96D184100B384868249F1D8B8FDAA2C9")
+
+
+ def test_case_sha3_512_0(self):
+ self.check('sha3_512', b"",
+ "0EAB42DE4C3CEB9235FC91ACFFE746B29C29A8C366B7C60E4E67C466F36A4304"+
+ "C00FA9CAF9D87976BA469BCBE06713B435F091EF2769FB160CDAB33D3670680E")
+
+ def test_case_sha3_512_1(self):
+ self.check('sha3_512', bytes.fromhex("CC"),
+ "8630C13CBD066EA74BBE7FE468FEC1DEE10EDC1254FB4C1B7C5FD69B646E4416"+
+ "0B8CE01D05A0908CA790DFB080F4B513BC3B6225ECE7A810371441A5AC666EB9")
+
+ def test_case_sha3_512_2(self):
+ self.check('sha3_512', bytes.fromhex("41FB"),
+ "551DA6236F8B96FCE9F97F1190E901324F0B45E06DBBB5CDB8355D6ED1DC34B3"+
+ "F0EAE7DCB68622FF232FA3CECE0D4616CDEB3931F93803662A28DF1CD535B731")
+
+ def test_case_sha3_512_3(self):
+ self.check('sha3_512', bytes.fromhex(
+ "433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B9"+
+ "8214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784"+
+ "444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53"+
+ "E7E0846DCBB4CE"),
+ "527D28E341E6B14F4684ADB4B824C496C6482E51149565D3D17226828884306B"+
+ "51D6148A72622C2B75F5D3510B799D8BDC03EAEDE453676A6EC8FE03A1AD0EAB")
+
+
def test_gil(self):
# Check things work fine with an input larger than the size required
# for multithreaded operation (which is hardwired to 2048).
@@ -406,8 +533,8 @@ class HashLibTestCase(unittest.TestCase):
events = []
for threadnum in range(num_threads):
chunk_size = len(data) // (10**threadnum)
- assert chunk_size > 0
- assert chunk_size % len(smallest_data) == 0
+ self.assertGreater(chunk_size, 0)
+ self.assertEqual(chunk_size % len(smallest_data), 0)
event = threading.Event()
events.append(event)
threading.Thread(target=hash_in_chunks,
@@ -418,8 +545,6 @@ class HashLibTestCase(unittest.TestCase):
self.assertEqual(expected_hash, hasher.hexdigest())
-def test_main():
- support.run_unittest(HashLibTestCase)
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py
index 4ca7cec..efd63ad 100644
--- a/Lib/test/test_hmac.py
+++ b/Lib/test/test_hmac.py
@@ -253,6 +253,20 @@ class ConstructorTestCase(unittest.TestCase):
except:
self.fail("Constructor call with text argument raised exception.")
+ def test_with_bytearray(self):
+ try:
+ h = hmac.HMAC(bytearray(b"key"), bytearray(b"hash this!"))
+ self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864')
+ except:
+ self.fail("Constructor call with bytearray arguments raised exception.")
+
+ def test_with_memoryview_msg(self):
+ try:
+ h = hmac.HMAC(b"key", memoryview(b"hash this!"))
+ self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864')
+ except:
+ self.fail("Constructor call with memoryview msg raised exception.")
+
def test_withmodule(self):
# Constructor call with text and digest module.
try:
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
index 863e4bc..b3688af 100644
--- a/Lib/test/test_httplib.py
+++ b/Lib/test/test_httplib.py
@@ -27,8 +27,10 @@ class FakeSocket:
self.text = text
self.fileclass = fileclass
self.data = b''
+ self.sendall_calls = 0
def sendall(self, data):
+ self.sendall_calls += 1
self.data += data
def makefile(self, mode, bufsize=None):
@@ -45,7 +47,7 @@ class EPipeSocket(FakeSocket):
def sendall(self, data):
if self.pipe_trigger in data:
- raise socket.error(errno.EPIPE, "gotcha")
+ raise OSError(errno.EPIPE, "gotcha")
self.data += data
def close(self):
@@ -588,7 +590,7 @@ class BasicTest(TestCase):
b"Content-Length")
conn = client.HTTPConnection("example.com")
conn.sock = sock
- self.assertRaises(socket.error,
+ self.assertRaises(OSError,
lambda: conn.request("PUT", "/url", "body"))
resp = conn.getresponse()
self.assertEqual(401, resp.status)
@@ -634,6 +636,28 @@ class BasicTest(TestCase):
resp.close()
self.assertTrue(resp.closed)
+ def test_delayed_ack_opt(self):
+ # Test that Nagle/delayed_ack optimistaion works correctly.
+
+ # For small payloads, it should coalesce the body with
+ # headers, resulting in a single sendall() call
+ conn = client.HTTPConnection('example.com')
+ sock = FakeSocket(None)
+ conn.sock = sock
+ body = b'x' * (conn.mss - 1)
+ conn.request('POST', '/', body)
+ self.assertEqual(sock.sendall_calls, 1)
+
+ # For large payloads, it should send the headers and
+ # then the body, resulting in more than one sendall()
+ # call
+ conn = client.HTTPConnection('example.com')
+ sock = FakeSocket(None)
+ conn.sock = sock
+ body = b'x' * conn.mss
+ conn.request('POST', '/', body)
+ self.assertGreater(sock.sendall_calls, 1)
+
class OfflineTest(TestCase):
def test_responses(self):
self.assertEqual(client.responses[client.NOT_FOUND], "Not Found")
@@ -724,7 +748,7 @@ class HTTPSTest(TestCase):
def make_server(self, certfile):
from test.ssl_servers import make_https_server
- return make_https_server(self, certfile)
+ return make_https_server(self, certfile=certfile)
def test_attributes(self):
# simple test to check it's storing the timeout
diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
index 03c0776..ec751cc 100644
--- a/Lib/test/test_httpservers.py
+++ b/Lib/test/test_httpservers.py
@@ -92,6 +92,13 @@ class BaseHTTPServerTestCase(BaseTestCase):
def do_KEYERROR(self):
self.send_error(999)
+ def do_NOTFOUND(self):
+ self.send_error(404)
+
+ def do_EXPLAINERROR(self):
+ self.send_error(999, "Short Message",
+ "This is a long \n explaination")
+
def do_CUSTOM(self):
self.send_response(999)
self.send_header('Content-Type', 'text/html')
@@ -203,6 +210,12 @@ class BaseHTTPServerTestCase(BaseTestCase):
res = self.con.getresponse()
self.assertEqual(res.status, 999)
+ def test_return_explain_error(self):
+ self.con.request('EXPLAINERROR', '/')
+ res = self.con.getresponse()
+ self.assertEqual(res.status, 999)
+ self.assertTrue(int(res.getheader('Content-Length')))
+
def test_latin1_header(self):
self.con.request('LATINONEHEADER', '/', headers={
'X-Special-Incoming': 'Ärger mit Unicode'
@@ -211,6 +224,14 @@ class BaseHTTPServerTestCase(BaseTestCase):
self.assertEqual(res.getheader('X-Special'), 'Dängerous Mind')
self.assertEqual(res.read(), 'Ärger mit Unicode'.encode('utf-8'))
+ def test_error_content_length(self):
+ # Issue #16088: standard error responses should have a content-length
+ self.con.request('NOTFOUND', '/')
+ res = self.con.getresponse()
+ self.assertEqual(res.status, 404)
+ data = res.read()
+ self.assertEqual(int(res.getheader('Content-Length')), len(data))
+
class SimpleHTTPServerTestCase(BaseTestCase):
class request_handler(NoLogRequestHandler, SimpleHTTPRequestHandler):
diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
index 7db3f7d..c37ea1d 100644
--- a/Lib/test/test_imaplib.py
+++ b/Lib/test/test_imaplib.py
@@ -125,7 +125,7 @@ class SimpleIMAPHandler(socketserver.StreamRequestHandler):
# Naked sockets return empty strings..
return
line += part
- except IOError:
+ except OSError:
# ..but SSLSockets raise exceptions.
return
if line.endswith(b'\r\n'):
diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index bf29e42..8eb56f6 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -1,14 +1,29 @@
-import imp
+try:
+ import _thread
+except ImportError:
+ _thread = None
import importlib
import os
import os.path
import shutil
import sys
from test import support
-from test.test_importlib import util
import unittest
import warnings
+with warnings.catch_warnings():
+ warnings.simplefilter('ignore', PendingDeprecationWarning)
+ import imp
+
+def requires_load_dynamic(meth):
+ """Decorator to skip a test if not running under CPython or lacking
+ imp.load_dynamic()."""
+ meth = support.cpython_only(meth)
+ return unittest.skipIf(not hasattr(imp, 'load_dynamic'),
+ 'imp.load_dynamic() required')(meth)
+
+
+@unittest.skipIf(_thread is None, '_thread module is required')
class LockTests(unittest.TestCase):
"""Very basic test of import lock functions."""
@@ -208,9 +223,7 @@ class ImportTests(unittest.TestCase):
self.assertIs(orig_path, new_os.path)
self.assertIsNot(orig_getenv, new_os.getenv)
- @support.cpython_only
- @unittest.skipIf(not hasattr(imp, 'load_dynamic'),
- 'imp.load_dynamic() required')
+ @requires_load_dynamic
def test_issue15828_load_extensions(self):
# Issue 15828 picked up that the adapter between the old imp API
# and importlib couldn't handle C extensions
@@ -222,6 +235,22 @@ class ImportTests(unittest.TestCase):
mod = imp.load_module(example, *x)
self.assertEqual(mod.__name__, example)
+ @requires_load_dynamic
+ def test_issue16421_multiple_modules_in_one_dll(self):
+ # Issue 16421: loading several modules from the same compiled file fails
+ m = '_testimportmultiple'
+ fileobj, pathname, description = imp.find_module(m)
+ fileobj.close()
+ mod0 = imp.load_dynamic(m, pathname)
+ mod1 = imp.load_dynamic('_testimportmultiple_foo', pathname)
+ mod2 = imp.load_dynamic('_testimportmultiple_bar', pathname)
+ self.assertEqual(mod0.__name__, m)
+ self.assertEqual(mod1.__name__, '_testimportmultiple_foo')
+ self.assertEqual(mod2.__name__, '_testimportmultiple_bar')
+ with self.assertRaises(ImportError):
+ imp.load_dynamic('nonexistent', pathname)
+
+ @requires_load_dynamic
def test_load_dynamic_ImportError_path(self):
# Issue #1559549 added `name` and `path` attributes to ImportError
# in order to provide better detail. Issue #10854 implemented those
@@ -233,14 +262,12 @@ class ImportTests(unittest.TestCase):
self.assertIn(path, err.exception.path)
self.assertEqual(name, err.exception.name)
- @support.cpython_only
- @unittest.skipIf(not hasattr(imp, 'load_dynamic'),
- 'imp.load_dynamic() required')
+ @requires_load_dynamic
def test_load_module_extension_file_is_None(self):
# When loading an extension module and the file is None, open one
# on the behalf of imp.load_dynamic().
# Issue #15902
- name = '_heapq'
+ name = '_testimportmultiple'
found = imp.find_module(name)
if found[0] is not None:
found[0].close()
@@ -248,6 +275,15 @@ class ImportTests(unittest.TestCase):
return
imp.load_module(name, None, *found[1:])
+ @unittest.skipIf(sys.dont_write_bytecode,
+ "test meaningful only when writing bytecode")
+ def test_bug7732(self):
+ with support.temp_cwd():
+ source = support.TESTFN + '.py'
+ os.mkdir(source)
+ self.assertRaisesRegex(ImportError, '^No module',
+ imp.find_module, support.TESTFN, ["."])
+
class ReloadTests(unittest.TestCase):
@@ -286,22 +322,6 @@ class ReloadTests(unittest.TestCase):
with self.assertRaisesRegex(ImportError, 'html'):
imp.reload(parser)
- def test_module_replaced(self):
- # see #18698
- def code():
- module = type(sys)('top_level')
- module.spam = 3
- sys.modules['top_level'] = module
- mock = util.mock_modules('top_level',
- module_code={'top_level': code})
- with mock:
- with util.import_state(meta_path=[mock]):
- module = importlib.import_module('top_level')
- reloaded = imp.reload(module)
- actual = sys.modules['top_level']
- self.assertEqual(actual.spam, 3)
- self.assertEqual(reloaded.spam, 3)
-
class PEP3147Tests(unittest.TestCase):
"""Tests of PEP 3147."""
@@ -454,20 +474,5 @@ class NullImporterTests(unittest.TestCase):
os.rmdir(name)
-def test_main():
- tests = [
- ImportTests,
- PEP3147Tests,
- ReloadTests,
- NullImporterTests,
- ]
- try:
- import _thread
- except ImportError:
- pass
- else:
- tests.append(LockTests)
- support.run_unittest(*tests)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index e710122..61df86a 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -1,8 +1,8 @@
# We import importlib *ASAP* in order to test #15386
import importlib
+import importlib.util
from importlib._bootstrap import _get_sourcefile
import builtins
-import imp
from test.test_importlib.import_ import util as importlib_util
import marshal
import os
@@ -70,8 +70,6 @@ class ImportTests(unittest.TestCase):
def tearDown(self):
unload(TESTFN)
- setUp = tearDown
-
def test_case_sensitivity(self):
# Brief digression to test that import is case-sensitive: if we got
# this far, we know for sure that "random" exists.
@@ -129,16 +127,6 @@ class ImportTests(unittest.TestCase):
finally:
del sys.path[0]
- @skip_if_dont_write_bytecode
- def test_bug7732(self):
- source = TESTFN + '.py'
- os.mkdir(source)
- try:
- self.assertRaisesRegex(ImportError, '^No module',
- imp.find_module, TESTFN, ["."])
- finally:
- os.rmdir(source)
-
def test_module_with_large_stack(self, module='longlist'):
# Regression test for http://bugs.python.org/issue561858.
filename = module + '.py'
@@ -225,7 +213,7 @@ class ImportTests(unittest.TestCase):
with open(source, "w") as f:
f.write("a = 10\nb=20//0\n")
- self.assertRaises(ZeroDivisionError, imp.reload, mod)
+ self.assertRaises(ZeroDivisionError, importlib.reload, mod)
# But we still expect the module to be in sys.modules.
mod = sys.modules.get(TESTFN)
self.assertIsNot(mod, None, "expected module to be in sys.modules")
@@ -291,7 +279,7 @@ class ImportTests(unittest.TestCase):
import sys
class C:
def __del__(self):
- import imp
+ import importlib
sys.argv.insert(0, C())
"""))
script_helper.assert_python_ok(testfn)
@@ -302,7 +290,7 @@ class ImportTests(unittest.TestCase):
sys.path.insert(0, os.curdir)
try:
source = TESTFN + ".py"
- compiled = imp.cache_from_source(source)
+ compiled = importlib.util.cache_from_source(source)
with open(source, 'w') as f:
pass
try:
@@ -333,6 +321,14 @@ class ImportTests(unittest.TestCase):
stdout, stderr = popen.communicate()
self.assertIn(b"ImportError", stdout)
+ def test_from_import_message_for_nonexistent_module(self):
+ with self.assertRaisesRegexp(ImportError, "^No module named 'bogus'"):
+ from bogus import foo
+
+ def test_from_import_message_for_existing_module(self):
+ with self.assertRaisesRegexp(ImportError, "^cannot import name 'bogus'"):
+ from re import bogus
+
@skip_if_dont_write_bytecode
class FilePermissionTests(unittest.TestCase):
@@ -343,7 +339,7 @@ class FilePermissionTests(unittest.TestCase):
def test_creation_mode(self):
mask = 0o022
with temp_umask(mask), _ready_to_import() as (name, path):
- cached_path = imp.cache_from_source(path)
+ cached_path = importlib.util.cache_from_source(path)
module = __import__(name)
if not os.path.exists(cached_path):
self.fail("__import__ did not result in creation of "
@@ -361,7 +357,7 @@ class FilePermissionTests(unittest.TestCase):
# permissions of .pyc should match those of .py, regardless of mask
mode = 0o600
with temp_umask(0o022), _ready_to_import() as (name, path):
- cached_path = imp.cache_from_source(path)
+ cached_path = importlib.util.cache_from_source(path)
os.chmod(path, mode)
__import__(name)
if not os.path.exists(cached_path):
@@ -376,7 +372,7 @@ class FilePermissionTests(unittest.TestCase):
def test_cached_readonly(self):
mode = 0o400
with temp_umask(0o022), _ready_to_import() as (name, path):
- cached_path = imp.cache_from_source(path)
+ cached_path = importlib.util.cache_from_source(path)
os.chmod(path, mode)
__import__(name)
if not os.path.exists(cached_path):
@@ -416,7 +412,7 @@ class FilePermissionTests(unittest.TestCase):
bytecode_only = path + "c"
else:
bytecode_only = path + "o"
- os.rename(imp.cache_from_source(path), bytecode_only)
+ os.rename(importlib.util.cache_from_source(path), bytecode_only)
m = __import__(name)
self.assertEqual(m.x, 'rewritten')
@@ -438,7 +434,7 @@ func_filename = func.__code__.co_filename
"""
dir_name = os.path.abspath(TESTFN)
file_name = os.path.join(dir_name, module_name) + os.extsep + "py"
- compiled_name = imp.cache_from_source(file_name)
+ compiled_name = importlib.util.cache_from_source(file_name)
def setUp(self):
self.sys_path = sys.path[:]
@@ -499,7 +495,7 @@ func_filename = func.__code__.co_filename
header = f.read(12)
code = marshal.load(f)
constants = list(code.co_consts)
- foreign_code = test_main.__code__
+ foreign_code = importlib.import_module.__code__
pos = constants.index(1)
constants[pos] = foreign_code
code = type(code)(code.co_argcount, code.co_kwonlyargcount,
@@ -641,7 +637,7 @@ class OverridingImportBuiltinTests(unittest.TestCase):
class PycacheTests(unittest.TestCase):
# Test the various PEP 3147 related behaviors.
- tag = imp.get_tag()
+ tag = sys.implementation.cache_tag
def _clean(self):
forget(TESTFN)
@@ -689,7 +685,7 @@ class PycacheTests(unittest.TestCase):
# With PEP 3147 cache layout, removing the source but leaving the pyc
# file does not satisfy the import.
__import__(TESTFN)
- pyc_file = imp.cache_from_source(self.source)
+ pyc_file = importlib.util.cache_from_source(self.source)
self.assertTrue(os.path.exists(pyc_file))
os.remove(self.source)
forget(TESTFN)
@@ -714,7 +710,7 @@ class PycacheTests(unittest.TestCase):
def test___cached__(self):
# Modules now also have an __cached__ that points to the pyc file.
m = __import__(TESTFN)
- pyc_file = imp.cache_from_source(TESTFN + '.py')
+ pyc_file = importlib.util.cache_from_source(TESTFN + '.py')
self.assertEqual(m.__cached__, os.path.join(os.curdir, pyc_file))
@skip_if_dont_write_bytecode
@@ -749,10 +745,10 @@ class PycacheTests(unittest.TestCase):
pass
importlib.invalidate_caches()
m = __import__('pep3147.foo')
- init_pyc = imp.cache_from_source(
+ init_pyc = importlib.util.cache_from_source(
os.path.join('pep3147', '__init__.py'))
self.assertEqual(m.__cached__, os.path.join(os.curdir, init_pyc))
- foo_pyc = imp.cache_from_source(os.path.join('pep3147', 'foo.py'))
+ foo_pyc = importlib.util.cache_from_source(os.path.join('pep3147', 'foo.py'))
self.assertEqual(sys.modules['pep3147.foo'].__cached__,
os.path.join(os.curdir, foo_pyc))
@@ -776,10 +772,10 @@ class PycacheTests(unittest.TestCase):
unload('pep3147')
importlib.invalidate_caches()
m = __import__('pep3147.foo')
- init_pyc = imp.cache_from_source(
+ init_pyc = importlib.util.cache_from_source(
os.path.join('pep3147', '__init__.py'))
self.assertEqual(m.__cached__, os.path.join(os.curdir, init_pyc))
- foo_pyc = imp.cache_from_source(os.path.join('pep3147', 'foo.py'))
+ foo_pyc = importlib.util.cache_from_source(os.path.join('pep3147', 'foo.py'))
self.assertEqual(sys.modules['pep3147.foo'].__cached__,
os.path.join(os.curdir, foo_pyc))
@@ -863,7 +859,6 @@ class ImportlibBootstrapTests(unittest.TestCase):
from importlib import machinery
mod = sys.modules['_frozen_importlib']
self.assertIs(machinery.FileFinder, mod.FileFinder)
- self.assertIs(imp.new_module, mod.new_module)
@cpython_only
@@ -1060,16 +1055,6 @@ class ImportTracebackTests(unittest.TestCase):
importlib.SourceLoader.load_module = old_load_module
-def test_main(verbose=None):
- run_unittest(ImportTests, PycacheTests, FilePermissionTests,
- PycRewritingTests, PathsTests, RelativeImportTests,
- OverridingImportBuiltinTests,
- ImportlibBootstrapTests, GetSourcefileTests,
- TestSymbolicallyLinkedPackage,
- ImportTracebackTests)
-
-
if __name__ == '__main__':
# Test needs to be a package, so we can do relative imports.
- from test.test_import import test_main
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py
deleted file mode 100644
index 2a22d1a..0000000
--- a/Lib/test/test_importhooks.py
+++ /dev/null
@@ -1,250 +0,0 @@
-import sys
-import imp
-import os
-import unittest
-from test import support
-
-
-test_src = """\
-def get_name():
- return __name__
-def get_file():
- return __file__
-"""
-
-absimp = "import sub\n"
-relimp = "from . import sub\n"
-deeprelimp = "from .... import sub\n"
-futimp = "from __future__ import absolute_import\n"
-
-reload_src = test_src+"""\
-reloaded = True
-"""
-
-test_co = compile(test_src, "<???>", "exec")
-reload_co = compile(reload_src, "<???>", "exec")
-
-test2_oldabs_co = compile(absimp + test_src, "<???>", "exec")
-test2_newabs_co = compile(futimp + absimp + test_src, "<???>", "exec")
-test2_newrel_co = compile(relimp + test_src, "<???>", "exec")
-test2_deeprel_co = compile(deeprelimp + test_src, "<???>", "exec")
-test2_futrel_co = compile(futimp + relimp + test_src, "<???>", "exec")
-
-test_path = "!!!_test_!!!"
-
-
-class TestImporter:
-
- modules = {
- "hooktestmodule": (False, test_co),
- "hooktestpackage": (True, test_co),
- "hooktestpackage.sub": (True, test_co),
- "hooktestpackage.sub.subber": (True, test_co),
- "hooktestpackage.oldabs": (False, test2_oldabs_co),
- "hooktestpackage.newabs": (False, test2_newabs_co),
- "hooktestpackage.newrel": (False, test2_newrel_co),
- "hooktestpackage.sub.subber.subest": (True, test2_deeprel_co),
- "hooktestpackage.futrel": (False, test2_futrel_co),
- "sub": (False, test_co),
- "reloadmodule": (False, test_co),
- }
-
- def __init__(self, path=test_path):
- if path != test_path:
- # if our class is on sys.path_hooks, we must raise
- # ImportError for any path item that we can't handle.
- raise ImportError
- self.path = path
-
- def _get__path__(self):
- raise NotImplementedError
-
- def find_module(self, fullname, path=None):
- if fullname in self.modules:
- return self
- else:
- return None
-
- def load_module(self, fullname):
- ispkg, code = self.modules[fullname]
- mod = sys.modules.setdefault(fullname,imp.new_module(fullname))
- mod.__file__ = "<%s>" % self.__class__.__name__
- mod.__loader__ = self
- if ispkg:
- mod.__path__ = self._get__path__()
- exec(code, mod.__dict__)
- return mod
-
-
-class MetaImporter(TestImporter):
- def _get__path__(self):
- return []
-
-class PathImporter(TestImporter):
- def _get__path__(self):
- return [self.path]
-
-
-class ImportBlocker:
- """Place an ImportBlocker instance on sys.meta_path and you
- can be sure the modules you specified can't be imported, even
- if it's a builtin."""
- def __init__(self, *namestoblock):
- self.namestoblock = dict.fromkeys(namestoblock)
- def find_module(self, fullname, path=None):
- if fullname in self.namestoblock:
- return self
- return None
- def load_module(self, fullname):
- raise ImportError("I dare you")
-
-
-class ImpWrapper:
-
- def __init__(self, path=None):
- if path is not None and not os.path.isdir(path):
- raise ImportError
- self.path = path
-
- def find_module(self, fullname, path=None):
- subname = fullname.split(".")[-1]
- if subname != fullname and self.path is None:
- return None
- if self.path is None:
- path = None
- else:
- path = [self.path]
- try:
- file, filename, stuff = imp.find_module(subname, path)
- except ImportError:
- return None
- return ImpLoader(file, filename, stuff)
-
-
-class ImpLoader:
-
- def __init__(self, file, filename, stuff):
- self.file = file
- self.filename = filename
- self.stuff = stuff
-
- def load_module(self, fullname):
- mod = imp.load_module(fullname, self.file, self.filename, self.stuff)
- if self.file:
- self.file.close()
- mod.__loader__ = self # for introspection
- return mod
-
-
-class ImportHooksBaseTestCase(unittest.TestCase):
-
- def setUp(self):
- self.path = sys.path[:]
- self.meta_path = sys.meta_path[:]
- self.path_hooks = sys.path_hooks[:]
- sys.path_importer_cache.clear()
- self.modules_before = support.modules_setup()
-
- def tearDown(self):
- sys.path[:] = self.path
- sys.meta_path[:] = self.meta_path
- sys.path_hooks[:] = self.path_hooks
- sys.path_importer_cache.clear()
- support.modules_cleanup(*self.modules_before)
-
-
-class ImportHooksTestCase(ImportHooksBaseTestCase):
-
- def doTestImports(self, importer=None):
- import hooktestmodule
- import hooktestpackage
- import hooktestpackage.sub
- import hooktestpackage.sub.subber
- self.assertEqual(hooktestmodule.get_name(),
- "hooktestmodule")
- self.assertEqual(hooktestpackage.get_name(),
- "hooktestpackage")
- self.assertEqual(hooktestpackage.sub.get_name(),
- "hooktestpackage.sub")
- self.assertEqual(hooktestpackage.sub.subber.get_name(),
- "hooktestpackage.sub.subber")
- if importer:
- self.assertEqual(hooktestmodule.__loader__, importer)
- self.assertEqual(hooktestpackage.__loader__, importer)
- self.assertEqual(hooktestpackage.sub.__loader__, importer)
- self.assertEqual(hooktestpackage.sub.subber.__loader__, importer)
-
- TestImporter.modules['reloadmodule'] = (False, test_co)
- import reloadmodule
- self.assertFalse(hasattr(reloadmodule,'reloaded'))
-
- import hooktestpackage.newrel
- self.assertEqual(hooktestpackage.newrel.get_name(),
- "hooktestpackage.newrel")
- self.assertEqual(hooktestpackage.newrel.sub,
- hooktestpackage.sub)
-
- import hooktestpackage.sub.subber.subest as subest
- self.assertEqual(subest.get_name(),
- "hooktestpackage.sub.subber.subest")
- self.assertEqual(subest.sub,
- hooktestpackage.sub)
-
- import hooktestpackage.futrel
- self.assertEqual(hooktestpackage.futrel.get_name(),
- "hooktestpackage.futrel")
- self.assertEqual(hooktestpackage.futrel.sub,
- hooktestpackage.sub)
-
- import sub
- self.assertEqual(sub.get_name(), "sub")
-
- import hooktestpackage.oldabs
- self.assertEqual(hooktestpackage.oldabs.get_name(),
- "hooktestpackage.oldabs")
- self.assertEqual(hooktestpackage.oldabs.sub, sub)
-
- import hooktestpackage.newabs
- self.assertEqual(hooktestpackage.newabs.get_name(),
- "hooktestpackage.newabs")
- self.assertEqual(hooktestpackage.newabs.sub, sub)
-
- def testMetaPath(self):
- i = MetaImporter()
- sys.meta_path.append(i)
- self.doTestImports(i)
-
- def testPathHook(self):
- sys.path_hooks.insert(0, PathImporter)
- sys.path.append(test_path)
- self.doTestImports()
-
- def testBlocker(self):
- mname = "exceptions" # an arbitrary harmless builtin module
- support.unload(mname)
- sys.meta_path.append(ImportBlocker(mname))
- self.assertRaises(ImportError, __import__, mname)
-
- def testImpWrapper(self):
- i = ImpWrapper()
- sys.meta_path.append(i)
- sys.path_hooks.insert(0, ImpWrapper)
- mnames = (
- "colorsys", "urllib.parse", "distutils.core", "sys",
- )
- for mname in mnames:
- parent = mname.split(".")[0]
- for n in list(sys.modules):
- if n.startswith(parent):
- del sys.modules[n]
- for mname in mnames:
- m = __import__(mname, globals(), locals(), ["__dummy__"])
- # to make sure we actually handled the import
- self.assertTrue(hasattr(m, "__loader__"))
-
-
-def test_main():
- support.run_unittest(ImportHooksTestCase)
-
-if __name__ == "__main__":
- test_main()
diff --git a/Lib/test/test_importlib/extension/test_case_sensitivity.py b/Lib/test/test_importlib/extension/test_case_sensitivity.py
index 76c53e4..2b536e2 100644
--- a/Lib/test/test_importlib/extension/test_case_sensitivity.py
+++ b/Lib/test/test_importlib/extension/test_case_sensitivity.py
@@ -1,8 +1,9 @@
-import imp
import sys
from test import support
import unittest
+
from importlib import _bootstrap
+from importlib import machinery
from .. import util
from . import util as ext_util
@@ -14,9 +15,9 @@ class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
good_name = ext_util.NAME
bad_name = good_name.upper()
assert good_name != bad_name
- finder = _bootstrap.FileFinder(ext_util.PATH,
- (_bootstrap.ExtensionFileLoader,
- _bootstrap.EXTENSION_SUFFIXES))
+ finder = machinery.FileFinder(ext_util.PATH,
+ (machinery.ExtensionFileLoader,
+ machinery.EXTENSION_SUFFIXES))
return finder.find_module(bad_name)
def test_case_sensitive(self):
diff --git a/Lib/test/test_importlib/extension/test_path_hook.py b/Lib/test/test_importlib/extension/test_path_hook.py
index 1d969a1..c4b4f4e 100644
--- a/Lib/test/test_importlib/extension/test_path_hook.py
+++ b/Lib/test/test_importlib/extension/test_path_hook.py
@@ -2,7 +2,6 @@ from importlib import machinery
from . import util
import collections
-import imp
import sys
import unittest
diff --git a/Lib/test/test_importlib/extension/util.py b/Lib/test/test_importlib/extension/util.py
index a266dd9..8d089f0 100644
--- a/Lib/test/test_importlib/extension/util.py
+++ b/Lib/test/test_importlib/extension/util.py
@@ -1,4 +1,3 @@
-import imp
from importlib import machinery
import os
import sys
diff --git a/Lib/test/test_importlib/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py
index 4b8ec15..3e80138 100644
--- a/Lib/test/test_importlib/frozen/test_loader.py
+++ b/Lib/test/test_importlib/frozen/test_loader.py
@@ -1,9 +1,11 @@
-from importlib import machinery
-import imp
-import unittest
from .. import abc
from .. import util
+
+from importlib import machinery
+import unittest
from test.support import captured_stdout
+import types
+
class LoaderTests(abc.LoaderTests):
@@ -24,7 +26,7 @@ class LoaderTests(abc.LoaderTests):
module = machinery.FrozenImporter.load_module('__phello__')
check = {'__name__': '__phello__',
'__package__': '__phello__',
- '__path__': ['__phello__'],
+ '__path__': [],
'__loader__': machinery.FrozenImporter,
}
for attr, value in check.items():
@@ -85,7 +87,7 @@ class InspectLoaderTests(unittest.TestCase):
name = '__hello__'
with captured_stdout() as stdout:
code = machinery.FrozenImporter.get_code(name)
- mod = imp.new_module(name)
+ mod = types.ModuleType(name)
exec(code, mod.__dict__)
self.assertTrue(hasattr(mod, 'initialized'))
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
diff --git a/Lib/test/test_importlib/import_/test___loader__.py b/Lib/test/test_importlib/import_/test___loader__.py
new file mode 100644
index 0000000..535daa0
--- /dev/null
+++ b/Lib/test/test_importlib/import_/test___loader__.py
@@ -0,0 +1,44 @@
+import sys
+import types
+import unittest
+
+from .. import util
+from . import util as import_util
+
+
+class LoaderMock:
+
+ def find_module(self, fullname, path=None):
+ return self
+
+ def load_module(self, fullname):
+ sys.modules[fullname] = self.module
+ return self.module
+
+
+class LoaderAttributeTests(unittest.TestCase):
+
+ def test___loader___missing(self):
+ module = types.ModuleType('blah')
+ try:
+ del module.__loader__
+ except AttributeError:
+ pass
+ loader = LoaderMock()
+ loader.module = module
+ with util.uncache('blah'), util.import_state(meta_path=[loader]):
+ module = import_util.import_('blah')
+ self.assertEqual(loader, module.__loader__)
+
+ def test___loader___is_None(self):
+ module = types.ModuleType('blah')
+ module.__loader__ = None
+ loader = LoaderMock()
+ loader.module = module
+ with util.uncache('blah'), util.import_state(meta_path=[loader]):
+ returned_module = import_util.import_('blah')
+ self.assertEqual(loader, module.__loader__)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_importlib/import_/test_api.py b/Lib/test/test_importlib/import_/test_api.py
index 3d4cd94..bf74937 100644
--- a/Lib/test/test_importlib/import_/test_api.py
+++ b/Lib/test/test_importlib/import_/test_api.py
@@ -1,7 +1,7 @@
from .. import util as importlib_test_util
from . import util
-import imp
import sys
+import types
import unittest
@@ -37,7 +37,7 @@ class APITest(unittest.TestCase):
def test_nonexistent_fromlist_entry(self):
# If something in fromlist doesn't exist, that's okay.
# issue15715
- mod = imp.new_module('fine')
+ mod = types.ModuleType('fine')
mod.__path__ = ['XXX']
with importlib_test_util.import_state(meta_path=[BadLoaderFinder]):
with importlib_test_util.uncache('fine'):
@@ -48,7 +48,7 @@ class APITest(unittest.TestCase):
# If something in fromlist triggers an exception not related to not
# existing, let that exception propagate.
# issue15316
- mod = imp.new_module('fine')
+ mod = types.ModuleType('fine')
mod.__path__ = ['XXX']
with importlib_test_util.import_state(meta_path=[BadLoaderFinder]):
with importlib_test_util.uncache('fine'):
diff --git a/Lib/test/test_importlib/import_/test_fromlist.py b/Lib/test/test_importlib/import_/test_fromlist.py
index c16c337..e440566 100644
--- a/Lib/test/test_importlib/import_/test_fromlist.py
+++ b/Lib/test/test_importlib/import_/test_fromlist.py
@@ -1,7 +1,6 @@
"""Test that the semantics relating to the 'fromlist' argument are correct."""
from .. import util
from . import util as import_util
-import imp
import unittest
class ReturnValue(unittest.TestCase):
diff --git a/Lib/test/test_importlib/source/test_abc_loader.py b/Lib/test/test_importlib/source/test_abc_loader.py
deleted file mode 100644
index 0d912b6..0000000
--- a/Lib/test/test_importlib/source/test_abc_loader.py
+++ /dev/null
@@ -1,906 +0,0 @@
-import importlib
-from importlib import abc
-
-from .. import abc as testing_abc
-from .. import util
-from . import util as source_util
-
-import imp
-import inspect
-import io
-import marshal
-import os
-import sys
-import types
-import unittest
-import warnings
-
-
-class SourceOnlyLoaderMock(abc.SourceLoader):
-
- # Globals that should be defined for all modules.
- source = (b"_ = '::'.join([__name__, __file__, __cached__, __package__, "
- b"repr(__loader__)])")
-
- def __init__(self, path):
- self.path = path
-
- def get_data(self, path):
- assert self.path == path
- return self.source
-
- def get_filename(self, fullname):
- return self.path
-
- def module_repr(self, module):
- return '<module>'
-
-
-class SourceLoaderMock(SourceOnlyLoaderMock):
-
- source_mtime = 1
-
- def __init__(self, path, magic=imp.get_magic()):
- super().__init__(path)
- self.bytecode_path = imp.cache_from_source(self.path)
- self.source_size = len(self.source)
- data = bytearray(magic)
- data.extend(importlib._w_long(self.source_mtime))
- data.extend(importlib._w_long(self.source_size))
- code_object = compile(self.source, self.path, 'exec',
- dont_inherit=True)
- data.extend(marshal.dumps(code_object))
- self.bytecode = bytes(data)
- self.written = {}
-
- def get_data(self, path):
- if path == self.path:
- return super().get_data(path)
- elif path == self.bytecode_path:
- return self.bytecode
- else:
- raise IOError
-
- def path_stats(self, path):
- assert path == self.path
- return {'mtime': self.source_mtime, 'size': self.source_size}
-
- def set_data(self, path, data):
- self.written[path] = bytes(data)
- return path == self.bytecode_path
-
-
-class PyLoaderMock(abc.PyLoader):
-
- # Globals that should be defined for all modules.
- source = (b"_ = '::'.join([__name__, __file__, __package__, "
- b"repr(__loader__)])")
-
- def __init__(self, data):
- """Take a dict of 'module_name: path' pairings.
-
- Paths should have no file extension, allowing packages to be denoted by
- ending in '__init__'.
-
- """
- self.module_paths = data
- self.path_to_module = {val:key for key,val in data.items()}
-
- def get_data(self, path):
- if path not in self.path_to_module:
- raise IOError
- return self.source
-
- def is_package(self, name):
- filename = os.path.basename(self.get_filename(name))
- return os.path.splitext(filename)[0] == '__init__'
-
- def source_path(self, name):
- try:
- return self.module_paths[name]
- except KeyError:
- raise ImportError
-
- def get_filename(self, name):
- """Silence deprecation warning."""
- with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter("always")
- path = super().get_filename(name)
- assert len(w) == 1
- assert issubclass(w[0].category, DeprecationWarning)
- return path
-
- def module_repr(self):
- return '<module>'
-
-
-class PyLoaderCompatMock(PyLoaderMock):
-
- """Mock that matches what is suggested to have a loader that is compatible
- from Python 3.1 onwards."""
-
- def get_filename(self, fullname):
- try:
- return self.module_paths[fullname]
- except KeyError:
- raise ImportError
-
- def source_path(self, fullname):
- try:
- return self.get_filename(fullname)
- except ImportError:
- return None
-
-
-class PyPycLoaderMock(abc.PyPycLoader, PyLoaderMock):
-
- default_mtime = 1
-
- def __init__(self, source, bc={}):
- """Initialize mock.
-
- 'bc' is a dict keyed on a module's name. The value is dict with
- possible keys of 'path', 'mtime', 'magic', and 'bc'. Except for 'path',
- each of those keys control if any part of created bytecode is to
- deviate from default values.
-
- """
- super().__init__(source)
- self.module_bytecode = {}
- self.path_to_bytecode = {}
- self.bytecode_to_path = {}
- for name, data in bc.items():
- self.path_to_bytecode[data['path']] = name
- self.bytecode_to_path[name] = data['path']
- magic = data.get('magic', imp.get_magic())
- mtime = importlib._w_long(data.get('mtime', self.default_mtime))
- source_size = importlib._w_long(len(self.source) & 0xFFFFFFFF)
- if 'bc' in data:
- bc = data['bc']
- else:
- bc = self.compile_bc(name)
- self.module_bytecode[name] = magic + mtime + source_size + bc
-
- def compile_bc(self, name):
- source_path = self.module_paths.get(name, '<test>') or '<test>'
- code = compile(self.source, source_path, 'exec')
- return marshal.dumps(code)
-
- def source_mtime(self, name):
- if name in self.module_paths:
- return self.default_mtime
- elif name in self.module_bytecode:
- return None
- else:
- raise ImportError
-
- def bytecode_path(self, name):
- try:
- return self.bytecode_to_path[name]
- except KeyError:
- if name in self.module_paths:
- return None
- else:
- raise ImportError
-
- def write_bytecode(self, name, bytecode):
- self.module_bytecode[name] = bytecode
- return True
-
- def get_data(self, path):
- if path in self.path_to_module:
- return super().get_data(path)
- elif path in self.path_to_bytecode:
- name = self.path_to_bytecode[path]
- return self.module_bytecode[name]
- else:
- raise IOError
-
- def is_package(self, name):
- try:
- return super().is_package(name)
- except TypeError:
- return '__init__' in self.bytecode_to_path[name]
-
- def get_code(self, name):
- with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter("always")
- code_object = super().get_code(name)
- assert len(w) == 1
- assert issubclass(w[0].category, DeprecationWarning)
- return code_object
-
-class PyLoaderTests(testing_abc.LoaderTests):
-
- """Tests for importlib.abc.PyLoader."""
-
- mocker = PyLoaderMock
-
- def eq_attrs(self, ob, **kwargs):
- for attr, val in kwargs.items():
- found = getattr(ob, attr)
- self.assertEqual(found, val,
- "{} attribute: {} != {}".format(attr, found, val))
-
- def test_module(self):
- name = '<module>'
- path = os.path.join('', 'path', 'to', 'module')
- mock = self.mocker({name: path})
- with util.uncache(name):
- module = mock.load_module(name)
- self.assertIn(name, sys.modules)
- self.eq_attrs(module, __name__=name, __file__=path, __package__='',
- __loader__=mock)
- self.assertTrue(not hasattr(module, '__path__'))
- return mock, name
-
- def test_package(self):
- name = '<pkg>'
- path = os.path.join('path', 'to', name, '__init__')
- mock = self.mocker({name: path})
- with util.uncache(name):
- module = mock.load_module(name)
- self.assertIn(name, sys.modules)
- self.eq_attrs(module, __name__=name, __file__=path,
- __path__=[os.path.dirname(path)], __package__=name,
- __loader__=mock)
- return mock, name
-
- def test_lacking_parent(self):
- name = 'pkg.mod'
- path = os.path.join('path', 'to', 'pkg', 'mod')
- mock = self.mocker({name: path})
- with util.uncache(name):
- module = mock.load_module(name)
- self.assertIn(name, sys.modules)
- self.eq_attrs(module, __name__=name, __file__=path, __package__='pkg',
- __loader__=mock)
- self.assertFalse(hasattr(module, '__path__'))
- return mock, name
-
- def test_module_reuse(self):
- name = 'mod'
- path = os.path.join('path', 'to', 'mod')
- module = imp.new_module(name)
- mock = self.mocker({name: path})
- with util.uncache(name):
- sys.modules[name] = module
- loaded_module = mock.load_module(name)
- self.assertIs(loaded_module, module)
- self.assertIs(sys.modules[name], module)
- return mock, name
-
- def test_state_after_failure(self):
- name = "mod"
- module = imp.new_module(name)
- module.blah = None
- mock = self.mocker({name: os.path.join('path', 'to', 'mod')})
- mock.source = b"1/0"
- with util.uncache(name):
- sys.modules[name] = module
- with self.assertRaises(ZeroDivisionError):
- mock.load_module(name)
- self.assertIs(sys.modules[name], module)
- self.assertTrue(hasattr(module, 'blah'))
- return mock
-
- def test_unloadable(self):
- name = "mod"
- mock = self.mocker({name: os.path.join('path', 'to', 'mod')})
- mock.source = b"1/0"
- with util.uncache(name):
- with self.assertRaises(ZeroDivisionError):
- mock.load_module(name)
- self.assertNotIn(name, sys.modules)
- return mock
-
-
-class PyLoaderCompatTests(PyLoaderTests):
-
- """Test that the suggested code to make a loader that is compatible from
- Python 3.1 forward works."""
-
- mocker = PyLoaderCompatMock
-
-
-class PyLoaderInterfaceTests(unittest.TestCase):
-
- """Tests for importlib.abc.PyLoader to make sure that when source_path()
- doesn't return a path everything works as expected."""
-
- def test_no_source_path(self):
- # No source path should lead to ImportError.
- name = 'mod'
- mock = PyLoaderMock({})
- with util.uncache(name), self.assertRaises(ImportError):
- mock.load_module(name)
-
- def test_source_path_is_None(self):
- name = 'mod'
- mock = PyLoaderMock({name: None})
- with util.uncache(name), self.assertRaises(ImportError):
- mock.load_module(name)
-
- def test_get_filename_with_source_path(self):
- # get_filename() should return what source_path() returns.
- name = 'mod'
- path = os.path.join('path', 'to', 'source')
- mock = PyLoaderMock({name: path})
- with util.uncache(name):
- self.assertEqual(mock.get_filename(name), path)
-
- def test_get_filename_no_source_path(self):
- # get_filename() should raise ImportError if source_path returns None.
- name = 'mod'
- mock = PyLoaderMock({name: None})
- with util.uncache(name), self.assertRaises(ImportError):
- mock.get_filename(name)
-
-
-class PyPycLoaderTests(PyLoaderTests):
-
- """Tests for importlib.abc.PyPycLoader."""
-
- mocker = PyPycLoaderMock
-
- @source_util.writes_bytecode_files
- def verify_bytecode(self, mock, name):
- assert name in mock.module_paths
- self.assertIn(name, mock.module_bytecode)
- magic = mock.module_bytecode[name][:4]
- self.assertEqual(magic, imp.get_magic())
- mtime = importlib._r_long(mock.module_bytecode[name][4:8])
- self.assertEqual(mtime, 1)
- source_size = mock.module_bytecode[name][8:12]
- self.assertEqual(len(mock.source) & 0xFFFFFFFF,
- importlib._r_long(source_size))
- bc = mock.module_bytecode[name][12:]
- self.assertEqual(bc, mock.compile_bc(name))
-
- def test_module(self):
- mock, name = super().test_module()
- self.verify_bytecode(mock, name)
-
- def test_package(self):
- mock, name = super().test_package()
- self.verify_bytecode(mock, name)
-
- def test_lacking_parent(self):
- mock, name = super().test_lacking_parent()
- self.verify_bytecode(mock, name)
-
- def test_module_reuse(self):
- mock, name = super().test_module_reuse()
- self.verify_bytecode(mock, name)
-
- def test_state_after_failure(self):
- super().test_state_after_failure()
-
- def test_unloadable(self):
- super().test_unloadable()
-
-
-class PyPycLoaderInterfaceTests(unittest.TestCase):
-
- """Test for the interface of importlib.abc.PyPycLoader."""
-
- def get_filename_check(self, src_path, bc_path, expect):
- name = 'mod'
- mock = PyPycLoaderMock({name: src_path}, {name: {'path': bc_path}})
- with util.uncache(name):
- assert mock.source_path(name) == src_path
- assert mock.bytecode_path(name) == bc_path
- self.assertEqual(mock.get_filename(name), expect)
-
- def test_filename_with_source_bc(self):
- # When source and bytecode paths present, return the source path.
- self.get_filename_check('source_path', 'bc_path', 'source_path')
-
- def test_filename_with_source_no_bc(self):
- # With source but no bc, return source path.
- self.get_filename_check('source_path', None, 'source_path')
-
- def test_filename_with_no_source_bc(self):
- # With not source but bc, return the bc path.
- self.get_filename_check(None, 'bc_path', 'bc_path')
-
- def test_filename_with_no_source_or_bc(self):
- # With no source or bc, raise ImportError.
- name = 'mod'
- mock = PyPycLoaderMock({name: None}, {name: {'path': None}})
- with util.uncache(name), self.assertRaises(ImportError):
- mock.get_filename(name)
-
-
-class SkipWritingBytecodeTests(unittest.TestCase):
-
- """Test that bytecode is properly handled based on
- sys.dont_write_bytecode."""
-
- @source_util.writes_bytecode_files
- def run_test(self, dont_write_bytecode):
- name = 'mod'
- mock = PyPycLoaderMock({name: os.path.join('path', 'to', 'mod')})
- sys.dont_write_bytecode = dont_write_bytecode
- with util.uncache(name):
- mock.load_module(name)
- self.assertIsNot(name in mock.module_bytecode, dont_write_bytecode)
-
- def test_no_bytecode_written(self):
- self.run_test(True)
-
- def test_bytecode_written(self):
- self.run_test(False)
-
-
-class RegeneratedBytecodeTests(unittest.TestCase):
-
- """Test that bytecode is regenerated as expected."""
-
- @source_util.writes_bytecode_files
- def test_different_magic(self):
- # A different magic number should lead to new bytecode.
- name = 'mod'
- bad_magic = b'\x00\x00\x00\x00'
- assert bad_magic != imp.get_magic()
- mock = PyPycLoaderMock({name: os.path.join('path', 'to', 'mod')},
- {name: {'path': os.path.join('path', 'to',
- 'mod.bytecode'),
- 'magic': bad_magic}})
- with util.uncache(name):
- mock.load_module(name)
- self.assertIn(name, mock.module_bytecode)
- magic = mock.module_bytecode[name][:4]
- self.assertEqual(magic, imp.get_magic())
-
- @source_util.writes_bytecode_files
- def test_old_mtime(self):
- # Bytecode with an older mtime should be regenerated.
- name = 'mod'
- old_mtime = PyPycLoaderMock.default_mtime - 1
- mock = PyPycLoaderMock({name: os.path.join('path', 'to', 'mod')},
- {name: {'path': 'path/to/mod.bytecode', 'mtime': old_mtime}})
- with util.uncache(name):
- mock.load_module(name)
- self.assertIn(name, mock.module_bytecode)
- mtime = importlib._r_long(mock.module_bytecode[name][4:8])
- self.assertEqual(mtime, PyPycLoaderMock.default_mtime)
-
-
-class BadBytecodeFailureTests(unittest.TestCase):
-
- """Test import failures when there is no source and parts of the bytecode
- is bad."""
-
- def test_bad_magic(self):
- # A bad magic number should lead to an ImportError.
- name = 'mod'
- bad_magic = b'\x00\x00\x00\x00'
- bc = {name:
- {'path': os.path.join('path', 'to', 'mod'),
- 'magic': bad_magic}}
- mock = PyPycLoaderMock({name: None}, bc)
- with util.uncache(name), self.assertRaises(ImportError) as cm:
- mock.load_module(name)
- self.assertEqual(cm.exception.name, name)
-
- def test_no_bytecode(self):
- # Missing code object bytecode should lead to an EOFError.
- name = 'mod'
- bc = {name: {'path': os.path.join('path', 'to', 'mod'), 'bc': b''}}
- mock = PyPycLoaderMock({name: None}, bc)
- with util.uncache(name), self.assertRaises(EOFError):
- mock.load_module(name)
-
- def test_bad_bytecode(self):
- # Malformed code object bytecode should lead to a ValueError.
- name = 'mod'
- bc = {name: {'path': os.path.join('path', 'to', 'mod'), 'bc': b'1234'}}
- mock = PyPycLoaderMock({name: None}, bc)
- with util.uncache(name), self.assertRaises(ValueError):
- mock.load_module(name)
-
-
-def raise_ImportError(*args, **kwargs):
- raise ImportError
-
-class MissingPathsTests(unittest.TestCase):
-
- """Test what happens when a source or bytecode path does not exist (either
- from *_path returning None or raising ImportError)."""
-
- def test_source_path_None(self):
- # Bytecode should be used when source_path returns None, along with
- # __file__ being set to the bytecode path.
- name = 'mod'
- bytecode_path = 'path/to/mod'
- mock = PyPycLoaderMock({name: None}, {name: {'path': bytecode_path}})
- with util.uncache(name):
- module = mock.load_module(name)
- self.assertEqual(module.__file__, bytecode_path)
-
- # Testing for bytecode_path returning None handled by all tests where no
- # bytecode initially exists.
-
- def test_all_paths_None(self):
- # If all *_path methods return None, raise ImportError.
- name = 'mod'
- mock = PyPycLoaderMock({name: None})
- with util.uncache(name), self.assertRaises(ImportError) as cm:
- mock.load_module(name)
- self.assertEqual(cm.exception.name, name)
-
- def test_source_path_ImportError(self):
- # An ImportError from source_path should trigger an ImportError.
- name = 'mod'
- mock = PyPycLoaderMock({}, {name: {'path': os.path.join('path', 'to',
- 'mod')}})
- with util.uncache(name), self.assertRaises(ImportError):
- mock.load_module(name)
-
- def test_bytecode_path_ImportError(self):
- # An ImportError from bytecode_path should trigger an ImportError.
- name = 'mod'
- mock = PyPycLoaderMock({name: os.path.join('path', 'to', 'mod')})
- bad_meth = types.MethodType(raise_ImportError, mock)
- mock.bytecode_path = bad_meth
- with util.uncache(name), self.assertRaises(ImportError) as cm:
- mock.load_module(name)
-
-
-class SourceLoaderTestHarness(unittest.TestCase):
-
- def setUp(self, *, is_package=True, **kwargs):
- self.package = 'pkg'
- if is_package:
- self.path = os.path.join(self.package, '__init__.py')
- self.name = self.package
- else:
- module_name = 'mod'
- self.path = os.path.join(self.package, '.'.join(['mod', 'py']))
- self.name = '.'.join([self.package, module_name])
- self.cached = imp.cache_from_source(self.path)
- self.loader = self.loader_mock(self.path, **kwargs)
-
- def verify_module(self, module):
- self.assertEqual(module.__name__, self.name)
- self.assertEqual(module.__file__, self.path)
- self.assertEqual(module.__cached__, self.cached)
- self.assertEqual(module.__package__, self.package)
- self.assertEqual(module.__loader__, self.loader)
- values = module._.split('::')
- self.assertEqual(values[0], self.name)
- self.assertEqual(values[1], self.path)
- self.assertEqual(values[2], self.cached)
- self.assertEqual(values[3], self.package)
- self.assertEqual(values[4], repr(self.loader))
-
- def verify_code(self, code_object):
- module = imp.new_module(self.name)
- module.__file__ = self.path
- module.__cached__ = self.cached
- module.__package__ = self.package
- module.__loader__ = self.loader
- module.__path__ = []
- exec(code_object, module.__dict__)
- self.verify_module(module)
-
-
-class SourceOnlyLoaderTests(SourceLoaderTestHarness):
-
- """Test importlib.abc.SourceLoader for source-only loading.
-
- Reload testing is subsumed by the tests for
- importlib.util.module_for_loader.
-
- """
-
- loader_mock = SourceOnlyLoaderMock
-
- def test_get_source(self):
- # Verify the source code is returned as a string.
- # If an IOError is raised by get_data then raise ImportError.
- expected_source = self.loader.source.decode('utf-8')
- self.assertEqual(self.loader.get_source(self.name), expected_source)
- def raise_IOError(path):
- raise IOError
- self.loader.get_data = raise_IOError
- with self.assertRaises(ImportError) as cm:
- self.loader.get_source(self.name)
- self.assertEqual(cm.exception.name, self.name)
-
- def test_is_package(self):
- # Properly detect when loading a package.
- self.setUp(is_package=False)
- self.assertFalse(self.loader.is_package(self.name))
- self.setUp(is_package=True)
- self.assertTrue(self.loader.is_package(self.name))
- self.assertFalse(self.loader.is_package(self.name + '.__init__'))
-
- def test_get_code(self):
- # Verify the code object is created.
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object)
-
- def test_load_module(self):
- # Loading a module should set __name__, __loader__, __package__,
- # __path__ (for packages), __file__, and __cached__.
- # The module should also be put into sys.modules.
- with util.uncache(self.name):
- module = self.loader.load_module(self.name)
- self.verify_module(module)
- self.assertEqual(module.__path__, [os.path.dirname(self.path)])
- self.assertIn(self.name, sys.modules)
-
- def test_package_settings(self):
- # __package__ needs to be set, while __path__ is set on if the module
- # is a package.
- # Testing the values for a package are covered by test_load_module.
- self.setUp(is_package=False)
- with util.uncache(self.name):
- module = self.loader.load_module(self.name)
- self.verify_module(module)
- self.assertTrue(not hasattr(module, '__path__'))
-
- def test_get_source_encoding(self):
- # Source is considered encoded in UTF-8 by default unless otherwise
- # specified by an encoding line.
- source = "_ = 'ü'"
- self.loader.source = source.encode('utf-8')
- returned_source = self.loader.get_source(self.name)
- self.assertEqual(returned_source, source)
- source = "# coding: latin-1\n_ = ü"
- self.loader.source = source.encode('latin-1')
- returned_source = self.loader.get_source(self.name)
- self.assertEqual(returned_source, source)
-
-
-@unittest.skipIf(sys.dont_write_bytecode, "sys.dont_write_bytecode is true")
-class SourceLoaderBytecodeTests(SourceLoaderTestHarness):
-
- """Test importlib.abc.SourceLoader's use of bytecode.
-
- Source-only testing handled by SourceOnlyLoaderTests.
-
- """
-
- loader_mock = SourceLoaderMock
-
- def verify_code(self, code_object, *, bytecode_written=False):
- super().verify_code(code_object)
- if bytecode_written:
- self.assertIn(self.cached, self.loader.written)
- data = bytearray(imp.get_magic())
- data.extend(importlib._w_long(self.loader.source_mtime))
- data.extend(importlib._w_long(self.loader.source_size))
- data.extend(marshal.dumps(code_object))
- self.assertEqual(self.loader.written[self.cached], bytes(data))
-
- def test_code_with_everything(self):
- # When everything should work.
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object)
-
- def test_no_bytecode(self):
- # If no bytecode exists then move on to the source.
- self.loader.bytecode_path = "<does not exist>"
- # Sanity check
- with self.assertRaises(IOError):
- bytecode_path = imp.cache_from_source(self.path)
- self.loader.get_data(bytecode_path)
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object, bytecode_written=True)
-
- def test_code_bad_timestamp(self):
- # Bytecode is only used when the timestamp matches the source EXACTLY.
- for source_mtime in (0, 2):
- assert source_mtime != self.loader.source_mtime
- original = self.loader.source_mtime
- self.loader.source_mtime = source_mtime
- # If bytecode is used then EOFError would be raised by marshal.
- self.loader.bytecode = self.loader.bytecode[8:]
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object, bytecode_written=True)
- self.loader.source_mtime = original
-
- def test_code_bad_magic(self):
- # Skip over bytecode with a bad magic number.
- self.setUp(magic=b'0000')
- # If bytecode is used then EOFError would be raised by marshal.
- self.loader.bytecode = self.loader.bytecode[8:]
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object, bytecode_written=True)
-
- def test_dont_write_bytecode(self):
- # Bytecode is not written if sys.dont_write_bytecode is true.
- # Can assume it is false already thanks to the skipIf class decorator.
- try:
- sys.dont_write_bytecode = True
- self.loader.bytecode_path = "<does not exist>"
- code_object = self.loader.get_code(self.name)
- self.assertNotIn(self.cached, self.loader.written)
- finally:
- sys.dont_write_bytecode = False
-
- def test_no_set_data(self):
- # If set_data is not defined, one can still read bytecode.
- self.setUp(magic=b'0000')
- original_set_data = self.loader.__class__.set_data
- try:
- del self.loader.__class__.set_data
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object)
- finally:
- self.loader.__class__.set_data = original_set_data
-
- def test_set_data_raises_exceptions(self):
- # Raising NotImplementedError or IOError is okay for set_data.
- def raise_exception(exc):
- def closure(*args, **kwargs):
- raise exc
- return closure
-
- self.setUp(magic=b'0000')
- self.loader.set_data = raise_exception(NotImplementedError)
- code_object = self.loader.get_code(self.name)
- self.verify_code(code_object)
-
-
-class SourceLoaderGetSourceTests(unittest.TestCase):
-
- """Tests for importlib.abc.SourceLoader.get_source()."""
-
- def test_default_encoding(self):
- # Should have no problems with UTF-8 text.
- name = 'mod'
- mock = SourceOnlyLoaderMock('mod.file')
- source = 'x = "ü"'
- mock.source = source.encode('utf-8')
- returned_source = mock.get_source(name)
- self.assertEqual(returned_source, source)
-
- def test_decoded_source(self):
- # Decoding should work.
- name = 'mod'
- mock = SourceOnlyLoaderMock("mod.file")
- source = "# coding: Latin-1\nx='ü'"
- assert source.encode('latin-1') != source.encode('utf-8')
- mock.source = source.encode('latin-1')
- returned_source = mock.get_source(name)
- self.assertEqual(returned_source, source)
-
- def test_universal_newlines(self):
- # PEP 302 says universal newlines should be used.
- name = 'mod'
- mock = SourceOnlyLoaderMock('mod.file')
- source = "x = 42\r\ny = -13\r\n"
- mock.source = source.encode('utf-8')
- expect = io.IncrementalNewlineDecoder(None, True).decode(source)
- self.assertEqual(mock.get_source(name), expect)
-
-
-class AbstractMethodImplTests(unittest.TestCase):
-
- """Test the concrete abstractmethod implementations."""
-
- class MetaPathFinder(abc.MetaPathFinder):
- def find_module(self, fullname, path):
- super().find_module(fullname, path)
-
- class PathEntryFinder(abc.PathEntryFinder):
- def find_module(self, _):
- super().find_module(_)
-
- def find_loader(self, _):
- super().find_loader(_)
-
- class Finder(abc.Finder):
- def find_module(self, fullname, path):
- super().find_module(fullname, path)
-
- class Loader(abc.Loader):
- def load_module(self, fullname):
- super().load_module(fullname)
- def module_repr(self, module):
- super().module_repr(module)
-
- class ResourceLoader(Loader, abc.ResourceLoader):
- def get_data(self, _):
- super().get_data(_)
-
- class InspectLoader(Loader, abc.InspectLoader):
- def is_package(self, _):
- super().is_package(_)
-
- def get_code(self, _):
- super().get_code(_)
-
- def get_source(self, _):
- super().get_source(_)
-
- class ExecutionLoader(InspectLoader, abc.ExecutionLoader):
- def get_filename(self, _):
- super().get_filename(_)
-
- class SourceLoader(ResourceLoader, ExecutionLoader, abc.SourceLoader):
- pass
-
- class PyLoader(ResourceLoader, InspectLoader, abc.PyLoader):
- def source_path(self, _):
- super().source_path(_)
-
- class PyPycLoader(PyLoader, abc.PyPycLoader):
- def bytecode_path(self, _):
- super().bytecode_path(_)
-
- def source_mtime(self, _):
- super().source_mtime(_)
-
- def write_bytecode(self, _, _2):
- super().write_bytecode(_, _2)
-
- def raises_NotImplementedError(self, ins, *args):
- for method_name in args:
- method = getattr(ins, method_name)
- arg_count = len(inspect.getfullargspec(method)[0]) - 1
- args = [''] * arg_count
- try:
- method(*args)
- except NotImplementedError:
- pass
- else:
- msg = "{}.{} did not raise NotImplementedError"
- self.fail(msg.format(ins.__class__.__name__, method_name))
-
- def test_Loader(self):
- self.raises_NotImplementedError(self.Loader(), 'load_module')
-
- # XXX misplaced; should be somewhere else
- def test_Finder(self):
- self.raises_NotImplementedError(self.Finder(), 'find_module')
-
- def test_ResourceLoader(self):
- self.raises_NotImplementedError(self.ResourceLoader(), 'load_module',
- 'get_data')
-
- def test_InspectLoader(self):
- self.raises_NotImplementedError(self.InspectLoader(), 'load_module',
- 'is_package', 'get_code', 'get_source')
-
- def test_ExecutionLoader(self):
- self.raises_NotImplementedError(self.ExecutionLoader(), 'load_module',
- 'is_package', 'get_code', 'get_source',
- 'get_filename')
-
- def test_SourceLoader(self):
- ins = self.SourceLoader()
- # Required abstractmethods.
- self.raises_NotImplementedError(ins, 'get_filename', 'get_data')
- # Optional abstractmethods.
- self.raises_NotImplementedError(ins,'path_stats', 'set_data')
-
- def test_PyLoader(self):
- self.raises_NotImplementedError(self.PyLoader(), 'source_path',
- 'get_data', 'is_package')
-
- def test_PyPycLoader(self):
- self.raises_NotImplementedError(self.PyPycLoader(), 'source_path',
- 'source_mtime', 'bytecode_path',
- 'write_bytecode')
-
-
-def test_main():
- from test.support import run_unittest
- run_unittest(PyLoaderTests, PyLoaderCompatTests,
- PyLoaderInterfaceTests,
- PyPycLoaderTests, PyPycLoaderInterfaceTests,
- SkipWritingBytecodeTests, RegeneratedBytecodeTests,
- BadBytecodeFailureTests, MissingPathsTests,
- SourceOnlyLoaderTests,
- SourceLoaderBytecodeTests,
- SourceLoaderGetSourceTests,
- AbstractMethodImplTests)
-
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/test/test_importlib/source/test_case_sensitivity.py b/Lib/test/test_importlib/source/test_case_sensitivity.py
index 241173f..bb78d2e 100644
--- a/Lib/test/test_importlib/source/test_case_sensitivity.py
+++ b/Lib/test/test_importlib/source/test_case_sensitivity.py
@@ -1,9 +1,9 @@
"""Test case-sensitivity (PEP 235)."""
-from importlib import _bootstrap
-from importlib import machinery
from .. import util
from . import util as source_util
-import imp
+
+from importlib import _bootstrap
+from importlib import machinery
import os
import sys
from test import support as test_support
diff --git a/Lib/test/test_importlib/source/test_file_loader.py b/Lib/test/test_importlib/source/test_file_loader.py
index d59969a..66ad96e 100644
--- a/Lib/test/test_importlib/source/test_file_loader.py
+++ b/Lib/test/test_importlib/source/test_file_loader.py
@@ -1,21 +1,22 @@
from importlib import machinery
import importlib
import importlib.abc
+import importlib.util
from .. import abc
from .. import util
from . import util as source_util
import errno
-import imp
import marshal
import os
import py_compile
import shutil
import stat
import sys
+import types
import unittest
-from test.support import make_legacy_pyc
+from test.support import make_legacy_pyc, unload
class SimpleTest(unittest.TestCase):
@@ -26,23 +27,13 @@ class SimpleTest(unittest.TestCase):
"""
def test_load_module_API(self):
- # If fullname is not specified that assume self.name is desired.
- class TesterMixin(importlib.abc.Loader):
- def load_module(self, fullname): return fullname
- def module_repr(self, module): return '<module>'
-
- class Tester(importlib.abc.FileLoader, TesterMixin):
- def get_code(self, _): pass
- def get_source(self, _): pass
- def is_package(self, _): pass
+ class Tester(importlib.abc.FileLoader):
+ def get_source(self, _): return 'attr = 42'
+ def is_package(self, _): return False
- name = 'mod_name'
- loader = Tester(name, 'some_path')
- self.assertEqual(name, loader.load_module())
- self.assertEqual(name, loader.load_module(None))
- self.assertEqual(name, loader.load_module(name))
- with self.assertRaises(ImportError):
- loader.load_module(loader.name + 'XXX')
+ loader = Tester('blah', 'blah.py')
+ self.addCleanup(unload, 'blah')
+ module = loader.load_module() # Should not raise an exception.
def test_get_filename_API(self):
# If fullname is not set then assume self.path is desired.
@@ -122,7 +113,7 @@ class SimpleTest(unittest.TestCase):
value = '<test>'
name = '_temp'
with source_util.create_modules(name) as mapping:
- orig_module = imp.new_module(name)
+ orig_module = types.ModuleType(name)
for attr in attributes:
setattr(orig_module, attr, value)
with open(mapping[name], 'w') as file:
@@ -154,11 +145,11 @@ class SimpleTest(unittest.TestCase):
loader = machinery.SourceFileLoader('_temp', file_path)
mod = loader.load_module('_temp')
self.assertEqual(file_path, mod.__file__)
- self.assertEqual(imp.cache_from_source(file_path),
+ self.assertEqual(importlib.util.cache_from_source(file_path),
mod.__cached__)
finally:
os.unlink(file_path)
- pycache = os.path.dirname(imp.cache_from_source(file_path))
+ pycache = os.path.dirname(importlib.util.cache_from_source(file_path))
if os.path.exists(pycache):
shutil.rmtree(pycache)
@@ -167,7 +158,7 @@ class SimpleTest(unittest.TestCase):
# truncated rather than raise an OverflowError.
with source_util.create_modules('_temp') as mapping:
source = mapping['_temp']
- compiled = imp.cache_from_source(source)
+ compiled = importlib.util.cache_from_source(source)
with open(source, 'w') as f:
f.write("x = 5")
try:
@@ -204,7 +195,7 @@ class BadBytecodeTest(unittest.TestCase):
pass
py_compile.compile(mapping[name])
if not del_source:
- bytecode_path = imp.cache_from_source(mapping[name])
+ bytecode_path = importlib.util.cache_from_source(mapping[name])
else:
os.unlink(mapping[name])
bytecode_path = make_legacy_pyc(mapping[name])
@@ -332,7 +323,8 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
def test(name, mapping, bytecode_path):
self.import_(mapping[name], name)
with open(bytecode_path, 'rb') as bytecode_file:
- self.assertEqual(bytecode_file.read(4), imp.get_magic())
+ self.assertEqual(bytecode_file.read(4),
+ importlib.util.MAGIC_NUMBER)
self._test_bad_magic(test)
@@ -382,7 +374,7 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
zeros = b'\x00\x00\x00\x00'
with source_util.create_modules('_temp') as mapping:
py_compile.compile(mapping['_temp'])
- bytecode_path = imp.cache_from_source(mapping['_temp'])
+ bytecode_path = importlib.util.cache_from_source(mapping['_temp'])
with open(bytecode_path, 'r+b') as bytecode_file:
bytecode_file.seek(4)
bytecode_file.write(zeros)
@@ -400,7 +392,7 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
with source_util.create_modules('_temp') as mapping:
# Create bytecode that will need to be re-created.
py_compile.compile(mapping['_temp'])
- bytecode_path = imp.cache_from_source(mapping['_temp'])
+ bytecode_path = importlib.util.cache_from_source(mapping['_temp'])
with open(bytecode_path, 'r+b') as bytecode_file:
bytecode_file.seek(0)
bytecode_file.write(b'\x00\x00\x00\x00')
@@ -408,7 +400,7 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
os.chmod(bytecode_path,
stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
try:
- # Should not raise IOError!
+ # Should not raise OSError!
self.import_(mapping['_temp'], '_temp')
finally:
# Make writable for eventual clean-up.
@@ -473,13 +465,6 @@ class SourcelessLoaderBadBytecodeTest(BadBytecodeTest):
self._test_non_code_marshal(del_source=True)
-def test_main():
- from test.support import run_unittest
- run_unittest(SimpleTest,
- SourceLoaderBadBytecodeTest,
- SourcelessLoaderBadBytecodeTest
- )
-
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_importlib/source/test_finder.py b/Lib/test/test_importlib/source/test_finder.py
index 8e49868..2d70691 100644
--- a/Lib/test/test_importlib/source/test_finder.py
+++ b/Lib/test/test_importlib/source/test_finder.py
@@ -3,7 +3,6 @@ from . import util as source_util
from importlib import machinery
import errno
-import imp
import os
import py_compile
import stat
diff --git a/Lib/test/test_importlib/source/test_path_hook.py b/Lib/test/test_importlib/source/test_path_hook.py
index 6a78792..d320f8e 100644
--- a/Lib/test/test_importlib/source/test_path_hook.py
+++ b/Lib/test/test_importlib/source/test_path_hook.py
@@ -1,7 +1,6 @@
from . import util as source_util
from importlib import machinery
-import imp
import unittest
diff --git a/Lib/test/test_importlib/source/util.py b/Lib/test/test_importlib/source/util.py
index ae65663..63cd25a 100644
--- a/Lib/test/test_importlib/source/util.py
+++ b/Lib/test/test_importlib/source/util.py
@@ -2,7 +2,6 @@ from .. import util
import contextlib
import errno
import functools
-import imp
import os
import os.path
import sys
diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py
index c620c37..0d0bcd1 100644
--- a/Lib/test/test_importlib/test_abc.py
+++ b/Lib/test/test_importlib/test_abc.py
@@ -1,9 +1,22 @@
+import importlib
+import importlib.util
from importlib import abc
from importlib import machinery
+
+import contextlib
import inspect
+import io
+import marshal
+import os
+import sys
+from test import support
+import types
import unittest
+from unittest import mock
+from . import util
+##### Inheritance ##############################################################
class InheritanceTests:
"""Test that the specified class is a subclass/superclass of the expected
@@ -43,11 +56,6 @@ class PathEntryFinder(InheritanceTests, unittest.TestCase):
subclasses = [machinery.FileFinder]
-class Loader(InheritanceTests, unittest.TestCase):
-
- subclasses = [abc.PyLoader]
-
-
class ResourceLoader(InheritanceTests, unittest.TestCase):
superclasses = [abc.Loader]
@@ -56,14 +64,13 @@ class ResourceLoader(InheritanceTests, unittest.TestCase):
class InspectLoader(InheritanceTests, unittest.TestCase):
superclasses = [abc.Loader]
- subclasses = [abc.PyLoader, machinery.BuiltinImporter,
+ subclasses = [machinery.BuiltinImporter,
machinery.FrozenImporter, machinery.ExtensionFileLoader]
class ExecutionLoader(InheritanceTests, unittest.TestCase):
superclasses = [abc.InspectLoader]
- subclasses = [abc.PyLoader]
class FileLoader(InheritanceTests, unittest.TestCase):
@@ -78,26 +85,745 @@ class SourceLoader(InheritanceTests, unittest.TestCase):
subclasses = [machinery.SourceFileLoader]
-class PyLoader(InheritanceTests, unittest.TestCase):
+##### Default return values ####################################################
+class MetaPathFinderSubclass(abc.MetaPathFinder):
+
+ def find_module(self, fullname, path):
+ return super().find_module(fullname, path)
+
+
+class MetaPathFinderDefaultsTests(unittest.TestCase):
+
+ ins = MetaPathFinderSubclass()
+
+ def test_find_module(self):
+ # Default should return None.
+ self.assertIsNone(self.ins.find_module('something', None))
+
+ def test_invalidate_caches(self):
+ # Calling the method is a no-op.
+ self.ins.invalidate_caches()
+
+
+class PathEntryFinderSubclass(abc.PathEntryFinder):
+
+ def find_loader(self, fullname):
+ return super().find_loader(fullname)
+
+
+class PathEntryFinderDefaultsTests(unittest.TestCase):
+
+ ins = PathEntryFinderSubclass()
+
+ def test_find_loader(self):
+ self.assertEqual((None, []), self.ins.find_loader('something'))
+
+ def find_module(self):
+ self.assertEqual(None, self.ins.find_module('something'))
+
+ def test_invalidate_caches(self):
+ # Should be a no-op.
+ self.ins.invalidate_caches()
+
+
+class LoaderSubclass(abc.Loader):
+
+ def load_module(self, fullname):
+ return super().load_module(fullname)
+
+
+class LoaderDefaultsTests(unittest.TestCase):
+
+ ins = LoaderSubclass()
+
+ def test_load_module(self):
+ with self.assertRaises(ImportError):
+ self.ins.load_module('something')
+
+ def test_module_repr(self):
+ mod = types.ModuleType('blah')
+ with self.assertRaises(NotImplementedError):
+ self.ins.module_repr(mod)
+ original_repr = repr(mod)
+ mod.__loader__ = self.ins
+ # Should still return a proper repr.
+ self.assertTrue(repr(mod))
+
+
+class ResourceLoaderSubclass(LoaderSubclass, abc.ResourceLoader):
+
+ def get_data(self, path):
+ return super().get_data(path)
+
+
+class ResourceLoaderDefaultsTests(unittest.TestCase):
+
+ ins = ResourceLoaderSubclass()
+
+ def test_get_data(self):
+ with self.assertRaises(IOError):
+ self.ins.get_data('/some/path')
+
+
+class InspectLoaderSubclass(LoaderSubclass, abc.InspectLoader):
+
+ def is_package(self, fullname):
+ return super().is_package(fullname)
+
+ def get_source(self, fullname):
+ return super().get_source(fullname)
+
+
+class InspectLoaderDefaultsTests(unittest.TestCase):
+
+ ins = InspectLoaderSubclass()
+
+ def test_is_package(self):
+ with self.assertRaises(ImportError):
+ self.ins.is_package('blah')
+
+ def test_get_source(self):
+ with self.assertRaises(ImportError):
+ self.ins.get_source('blah')
+
+
+class ExecutionLoaderSubclass(InspectLoaderSubclass, abc.ExecutionLoader):
+
+ def get_filename(self, fullname):
+ return super().get_filename(fullname)
+
+
+class ExecutionLoaderDefaultsTests(unittest.TestCase):
+
+ ins = ExecutionLoaderSubclass()
+
+ def test_get_filename(self):
+ with self.assertRaises(ImportError):
+ self.ins.get_filename('blah')
+
+##### Loader concrete methods ##################################################
+class LoaderConcreteMethodTests(unittest.TestCase):
+
+ def test_init_module_attrs(self):
+ loader = LoaderSubclass()
+ module = types.ModuleType('blah')
+ loader.init_module_attrs(module)
+ self.assertEqual(module.__loader__, loader)
+
+
+##### InspectLoader concrete methods ###########################################
+class InspectLoaderSourceToCodeTests(unittest.TestCase):
+
+ def source_to_module(self, data, path=None):
+ """Help with source_to_code() tests."""
+ module = types.ModuleType('blah')
+ loader = InspectLoaderSubclass()
+ if path is None:
+ code = loader.source_to_code(data)
+ else:
+ code = loader.source_to_code(data, path)
+ exec(code, module.__dict__)
+ return module
+
+ def test_source_to_code_source(self):
+ # Since compile() can handle strings, so should source_to_code().
+ source = 'attr = 42'
+ module = self.source_to_module(source)
+ self.assertTrue(hasattr(module, 'attr'))
+ self.assertEqual(module.attr, 42)
- superclasses = [abc.Loader, abc.ResourceLoader, abc.ExecutionLoader]
+ def test_source_to_code_bytes(self):
+ # Since compile() can handle bytes, so should source_to_code().
+ source = b'attr = 42'
+ module = self.source_to_module(source)
+ self.assertTrue(hasattr(module, 'attr'))
+ self.assertEqual(module.attr, 42)
+ def test_source_to_code_path(self):
+ # Specifying a path should set it for the code object.
+ path = 'path/to/somewhere'
+ loader = InspectLoaderSubclass()
+ code = loader.source_to_code('', path)
+ self.assertEqual(code.co_filename, path)
-class PyPycLoader(InheritanceTests, unittest.TestCase):
+ def test_source_to_code_no_path(self):
+ # Not setting a path should still work and be set to <string> since that
+ # is a pre-existing practice as a default to compile().
+ loader = InspectLoaderSubclass()
+ code = loader.source_to_code('')
+ self.assertEqual(code.co_filename, '<string>')
- superclasses = [abc.PyLoader]
+class InspectLoaderGetCodeTests(unittest.TestCase):
+
+ def test_get_code(self):
+ # Test success.
+ module = types.ModuleType('blah')
+ with mock.patch.object(InspectLoaderSubclass, 'get_source') as mocked:
+ mocked.return_value = 'attr = 42'
+ loader = InspectLoaderSubclass()
+ code = loader.get_code('blah')
+ exec(code, module.__dict__)
+ self.assertEqual(module.attr, 42)
+
+ def test_get_code_source_is_None(self):
+ # If get_source() is None then this should be None.
+ with mock.patch.object(InspectLoaderSubclass, 'get_source') as mocked:
+ mocked.return_value = None
+ loader = InspectLoaderSubclass()
+ code = loader.get_code('blah')
+ self.assertIsNone(code)
+
+ def test_get_code_source_not_found(self):
+ # If there is no source then there is no code object.
+ loader = InspectLoaderSubclass()
+ with self.assertRaises(ImportError):
+ loader.get_code('blah')
+
+
+class InspectLoaderInitModuleTests(unittest.TestCase):
+
+ @staticmethod
+ def mock_is_package(return_value):
+ return mock.patch.object(InspectLoaderSubclass, 'is_package',
+ return_value=return_value)
+
+ def init_module_attrs(self, name):
+ loader = InspectLoaderSubclass()
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertEqual(module.__loader__, loader)
+ return module
+
+ def test_package(self):
+ # If a package, then __package__ == __name__, __path__ == []
+ with self.mock_is_package(True):
+ name = 'blah'
+ module = self.init_module_attrs(name)
+ self.assertEqual(module.__package__, name)
+ self.assertEqual(module.__path__, [])
+
+ def test_toplevel(self):
+ # If a module is top-level, __package__ == ''
+ with self.mock_is_package(False):
+ name = 'blah'
+ module = self.init_module_attrs(name)
+ self.assertEqual(module.__package__, '')
+
+ def test_submodule(self):
+ # If a module is contained within a package then set __package__ to the
+ # package name.
+ with self.mock_is_package(False):
+ name = 'pkg.mod'
+ module = self.init_module_attrs(name)
+ self.assertEqual(module.__package__, 'pkg')
+
+ def test_is_package_ImportError(self):
+ # If is_package() raises ImportError, __package__ should be None and
+ # __path__ should not be set.
+ with self.mock_is_package(False) as mocked_method:
+ mocked_method.side_effect = ImportError
+ name = 'mod'
+ module = self.init_module_attrs(name)
+ self.assertIsNone(module.__package__)
+ self.assertFalse(hasattr(module, '__path__'))
+
+
+class InspectLoaderLoadModuleTests(unittest.TestCase):
+
+ """Test InspectLoader.load_module()."""
+
+ module_name = 'blah'
+
+ def setUp(self):
+ support.unload(self.module_name)
+ self.addCleanup(support.unload, self.module_name)
+
+ def mock_get_code(self):
+ return mock.patch.object(InspectLoaderSubclass, 'get_code')
+
+ def test_get_code_ImportError(self):
+ # If get_code() raises ImportError, it should propagate.
+ with self.mock_get_code() as mocked_get_code:
+ mocked_get_code.side_effect = ImportError
+ with self.assertRaises(ImportError):
+ loader = InspectLoaderSubclass()
+ loader.load_module(self.module_name)
+
+ def test_get_code_None(self):
+ # If get_code() returns None, raise ImportError.
+ with self.mock_get_code() as mocked_get_code:
+ mocked_get_code.return_value = None
+ with self.assertRaises(ImportError):
+ loader = InspectLoaderSubclass()
+ loader.load_module(self.module_name)
+
+ def test_module_returned(self):
+ # The loaded module should be returned.
+ code = compile('attr = 42', '<string>', 'exec')
+ with self.mock_get_code() as mocked_get_code:
+ mocked_get_code.return_value = code
+ loader = InspectLoaderSubclass()
+ module = loader.load_module(self.module_name)
+ self.assertEqual(module, sys.modules[self.module_name])
+
+
+##### ExecutionLoader concrete methods #########################################
+class ExecutionLoaderGetCodeTests(unittest.TestCase):
+
+ def mock_methods(self, *, get_source=False, get_filename=False):
+ source_mock_context, filename_mock_context = None, None
+ if get_source:
+ source_mock_context = mock.patch.object(ExecutionLoaderSubclass,
+ 'get_source')
+ if get_filename:
+ filename_mock_context = mock.patch.object(ExecutionLoaderSubclass,
+ 'get_filename')
+ return source_mock_context, filename_mock_context
+
+ def test_get_code(self):
+ path = 'blah.py'
+ source_mock_context, filename_mock_context = self.mock_methods(
+ get_source=True, get_filename=True)
+ with source_mock_context as source_mock, filename_mock_context as name_mock:
+ source_mock.return_value = 'attr = 42'
+ name_mock.return_value = path
+ loader = ExecutionLoaderSubclass()
+ code = loader.get_code('blah')
+ self.assertEqual(code.co_filename, path)
+ module = types.ModuleType('blah')
+ exec(code, module.__dict__)
+ self.assertEqual(module.attr, 42)
+
+ def test_get_code_source_is_None(self):
+ # If get_source() is None then this should be None.
+ source_mock_context, _ = self.mock_methods(get_source=True)
+ with source_mock_context as mocked:
+ mocked.return_value = None
+ loader = ExecutionLoaderSubclass()
+ code = loader.get_code('blah')
+ self.assertIsNone(code)
+
+ def test_get_code_source_not_found(self):
+ # If there is no source then there is no code object.
+ loader = ExecutionLoaderSubclass()
+ with self.assertRaises(ImportError):
+ loader.get_code('blah')
+
+ def test_get_code_no_path(self):
+ # If get_filename() raises ImportError then simply skip setting the path
+ # on the code object.
+ source_mock_context, filename_mock_context = self.mock_methods(
+ get_source=True, get_filename=True)
+ with source_mock_context as source_mock, filename_mock_context as name_mock:
+ source_mock.return_value = 'attr = 42'
+ name_mock.side_effect = ImportError
+ loader = ExecutionLoaderSubclass()
+ code = loader.get_code('blah')
+ self.assertEqual(code.co_filename, '<string>')
+ module = types.ModuleType('blah')
+ exec(code, module.__dict__)
+ self.assertEqual(module.attr, 42)
+
+
+class ExecutionLoaderInitModuleTests(unittest.TestCase):
+
+ @staticmethod
+ @contextlib.contextmanager
+ def mock_methods(is_package, filename):
+ is_package_manager = InspectLoaderInitModuleTests.mock_is_package(is_package)
+ get_filename_manager = mock.patch.object(ExecutionLoaderSubclass,
+ 'get_filename', return_value=filename)
+ with is_package_manager as mock_is_package:
+ with get_filename_manager as mock_get_filename:
+ yield {'is_package': mock_is_package,
+ 'get_filename': mock_get_filename}
+
+ def test_toplevel(self):
+ # Verify __loader__, __file__, and __package__; no __path__.
+ name = 'blah'
+ path = os.path.join('some', 'path', '{}.py'.format(name))
+ with self.mock_methods(False, path):
+ loader = ExecutionLoaderSubclass()
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertIs(module.__loader__, loader)
+ self.assertEqual(module.__file__, path)
+ self.assertEqual(module.__package__, '')
+ self.assertFalse(hasattr(module, '__path__'))
+
+ def test_package(self):
+ # Verify __loader__, __file__, __package__, and __path__.
+ name = 'pkg'
+ path = os.path.join('some', 'pkg', '__init__.py')
+ with self.mock_methods(True, path):
+ loader = ExecutionLoaderSubclass()
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertIs(module.__loader__, loader)
+ self.assertEqual(module.__file__, path)
+ self.assertEqual(module.__package__, 'pkg')
+ self.assertEqual(module.__path__, [os.path.dirname(path)])
+
+ def test_submodule(self):
+ # Verify __package__ and not __path__; test_toplevel() takes care of
+ # other attributes.
+ name = 'pkg.submodule'
+ path = os.path.join('some', 'pkg', 'submodule.py')
+ with self.mock_methods(False, path):
+ loader = ExecutionLoaderSubclass()
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertEqual(module.__package__, 'pkg')
+ self.assertEqual(module.__file__, path)
+ self.assertFalse(hasattr(module, '__path__'))
+
+ def test_get_filename_ImportError(self):
+ # If get_filename() raises ImportError, don't set __file__.
+ name = 'blah'
+ path = 'blah.py'
+ with self.mock_methods(False, path) as mocked_methods:
+ mocked_methods['get_filename'].side_effect = ImportError
+ loader = ExecutionLoaderSubclass()
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertFalse(hasattr(module, '__file__'))
+
+
+##### SourceLoader concrete methods ############################################
+class SourceOnlyLoaderMock(abc.SourceLoader):
+
+ # Globals that should be defined for all modules.
+ source = (b"_ = '::'.join([__name__, __file__, __cached__, __package__, "
+ b"repr(__loader__)])")
+
+ def __init__(self, path):
+ self.path = path
+
+ def get_data(self, path):
+ if path != self.path:
+ raise IOError
+ return self.source
+
+ def get_filename(self, fullname):
+ return self.path
+
+ def module_repr(self, module):
+ return '<module>'
+
+
+class SourceLoaderMock(SourceOnlyLoaderMock):
+
+ source_mtime = 1
+
+ def __init__(self, path, magic=importlib.util.MAGIC_NUMBER):
+ super().__init__(path)
+ self.bytecode_path = importlib.util.cache_from_source(self.path)
+ self.source_size = len(self.source)
+ data = bytearray(magic)
+ data.extend(importlib._w_long(self.source_mtime))
+ data.extend(importlib._w_long(self.source_size))
+ code_object = compile(self.source, self.path, 'exec',
+ dont_inherit=True)
+ data.extend(marshal.dumps(code_object))
+ self.bytecode = bytes(data)
+ self.written = {}
+
+ def get_data(self, path):
+ if path == self.path:
+ return super().get_data(path)
+ elif path == self.bytecode_path:
+ return self.bytecode
+ else:
+ raise OSError
+
+ def path_stats(self, path):
+ if path != self.path:
+ raise IOError
+ return {'mtime': self.source_mtime, 'size': self.source_size}
+
+ def set_data(self, path, data):
+ self.written[path] = bytes(data)
+ return path == self.bytecode_path
+
+
+class SourceLoaderTestHarness(unittest.TestCase):
+
+ def setUp(self, *, is_package=True, **kwargs):
+ self.package = 'pkg'
+ if is_package:
+ self.path = os.path.join(self.package, '__init__.py')
+ self.name = self.package
+ else:
+ module_name = 'mod'
+ self.path = os.path.join(self.package, '.'.join(['mod', 'py']))
+ self.name = '.'.join([self.package, module_name])
+ self.cached = importlib.util.cache_from_source(self.path)
+ self.loader = self.loader_mock(self.path, **kwargs)
+
+ def verify_module(self, module):
+ self.assertEqual(module.__name__, self.name)
+ self.assertEqual(module.__file__, self.path)
+ self.assertEqual(module.__cached__, self.cached)
+ self.assertEqual(module.__package__, self.package)
+ self.assertEqual(module.__loader__, self.loader)
+ values = module._.split('::')
+ self.assertEqual(values[0], self.name)
+ self.assertEqual(values[1], self.path)
+ self.assertEqual(values[2], self.cached)
+ self.assertEqual(values[3], self.package)
+ self.assertEqual(values[4], repr(self.loader))
+
+ def verify_code(self, code_object):
+ module = types.ModuleType(self.name)
+ module.__file__ = self.path
+ module.__cached__ = self.cached
+ module.__package__ = self.package
+ module.__loader__ = self.loader
+ module.__path__ = []
+ exec(code_object, module.__dict__)
+ self.verify_module(module)
+
+
+class SourceOnlyLoaderTests(SourceLoaderTestHarness):
+
+ """Test importlib.abc.SourceLoader for source-only loading.
+
+ Reload testing is subsumed by the tests for
+ importlib.util.module_for_loader.
+
+ """
+
+ loader_mock = SourceOnlyLoaderMock
+
+ def test_get_source(self):
+ # Verify the source code is returned as a string.
+ # If an OSError is raised by get_data then raise ImportError.
+ expected_source = self.loader.source.decode('utf-8')
+ self.assertEqual(self.loader.get_source(self.name), expected_source)
+ def raise_OSError(path):
+ raise OSError
+ self.loader.get_data = raise_OSError
+ with self.assertRaises(ImportError) as cm:
+ self.loader.get_source(self.name)
+ self.assertEqual(cm.exception.name, self.name)
+
+ def test_is_package(self):
+ # Properly detect when loading a package.
+ self.setUp(is_package=False)
+ self.assertFalse(self.loader.is_package(self.name))
+ self.setUp(is_package=True)
+ self.assertTrue(self.loader.is_package(self.name))
+ self.assertFalse(self.loader.is_package(self.name + '.__init__'))
+
+ def test_get_code(self):
+ # Verify the code object is created.
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object)
+
+ def test_source_to_code(self):
+ # Verify the compiled code object.
+ code = self.loader.source_to_code(self.loader.source, self.path)
+ self.verify_code(code)
+
+ def test_load_module(self):
+ # Loading a module should set __name__, __loader__, __package__,
+ # __path__ (for packages), __file__, and __cached__.
+ # The module should also be put into sys.modules.
+ with util.uncache(self.name):
+ module = self.loader.load_module(self.name)
+ self.verify_module(module)
+ self.assertEqual(module.__path__, [os.path.dirname(self.path)])
+ self.assertIn(self.name, sys.modules)
+
+ def test_package_settings(self):
+ # __package__ needs to be set, while __path__ is set on if the module
+ # is a package.
+ # Testing the values for a package are covered by test_load_module.
+ self.setUp(is_package=False)
+ with util.uncache(self.name):
+ module = self.loader.load_module(self.name)
+ self.verify_module(module)
+ self.assertTrue(not hasattr(module, '__path__'))
+
+ def test_get_source_encoding(self):
+ # Source is considered encoded in UTF-8 by default unless otherwise
+ # specified by an encoding line.
+ source = "_ = 'ü'"
+ self.loader.source = source.encode('utf-8')
+ returned_source = self.loader.get_source(self.name)
+ self.assertEqual(returned_source, source)
+ source = "# coding: latin-1\n_ = ü"
+ self.loader.source = source.encode('latin-1')
+ returned_source = self.loader.get_source(self.name)
+ self.assertEqual(returned_source, source)
+
+
+@unittest.skipIf(sys.dont_write_bytecode, "sys.dont_write_bytecode is true")
+class SourceLoaderBytecodeTests(SourceLoaderTestHarness):
+
+ """Test importlib.abc.SourceLoader's use of bytecode.
+
+ Source-only testing handled by SourceOnlyLoaderTests.
+
+ """
+
+ loader_mock = SourceLoaderMock
+
+ def verify_code(self, code_object, *, bytecode_written=False):
+ super().verify_code(code_object)
+ if bytecode_written:
+ self.assertIn(self.cached, self.loader.written)
+ data = bytearray(importlib.util.MAGIC_NUMBER)
+ data.extend(importlib._w_long(self.loader.source_mtime))
+ data.extend(importlib._w_long(self.loader.source_size))
+ data.extend(marshal.dumps(code_object))
+ self.assertEqual(self.loader.written[self.cached], bytes(data))
+
+ def test_code_with_everything(self):
+ # When everything should work.
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object)
+
+ def test_no_bytecode(self):
+ # If no bytecode exists then move on to the source.
+ self.loader.bytecode_path = "<does not exist>"
+ # Sanity check
+ with self.assertRaises(OSError):
+ bytecode_path = importlib.util.cache_from_source(self.path)
+ self.loader.get_data(bytecode_path)
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object, bytecode_written=True)
+
+ def test_code_bad_timestamp(self):
+ # Bytecode is only used when the timestamp matches the source EXACTLY.
+ for source_mtime in (0, 2):
+ assert source_mtime != self.loader.source_mtime
+ original = self.loader.source_mtime
+ self.loader.source_mtime = source_mtime
+ # If bytecode is used then EOFError would be raised by marshal.
+ self.loader.bytecode = self.loader.bytecode[8:]
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object, bytecode_written=True)
+ self.loader.source_mtime = original
+
+ def test_code_bad_magic(self):
+ # Skip over bytecode with a bad magic number.
+ self.setUp(magic=b'0000')
+ # If bytecode is used then EOFError would be raised by marshal.
+ self.loader.bytecode = self.loader.bytecode[8:]
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object, bytecode_written=True)
+
+ def test_dont_write_bytecode(self):
+ # Bytecode is not written if sys.dont_write_bytecode is true.
+ # Can assume it is false already thanks to the skipIf class decorator.
+ try:
+ sys.dont_write_bytecode = True
+ self.loader.bytecode_path = "<does not exist>"
+ code_object = self.loader.get_code(self.name)
+ self.assertNotIn(self.cached, self.loader.written)
+ finally:
+ sys.dont_write_bytecode = False
+
+ def test_no_set_data(self):
+ # If set_data is not defined, one can still read bytecode.
+ self.setUp(magic=b'0000')
+ original_set_data = self.loader.__class__.set_data
+ try:
+ del self.loader.__class__.set_data
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object)
+ finally:
+ self.loader.__class__.set_data = original_set_data
+
+ def test_set_data_raises_exceptions(self):
+ # Raising NotImplementedError or OSError is okay for set_data.
+ def raise_exception(exc):
+ def closure(*args, **kwargs):
+ raise exc
+ return closure
+
+ self.setUp(magic=b'0000')
+ self.loader.set_data = raise_exception(NotImplementedError)
+ code_object = self.loader.get_code(self.name)
+ self.verify_code(code_object)
+
+
+class SourceLoaderGetSourceTests(unittest.TestCase):
+
+ """Tests for importlib.abc.SourceLoader.get_source()."""
+
+ def test_default_encoding(self):
+ # Should have no problems with UTF-8 text.
+ name = 'mod'
+ mock = SourceOnlyLoaderMock('mod.file')
+ source = 'x = "ü"'
+ mock.source = source.encode('utf-8')
+ returned_source = mock.get_source(name)
+ self.assertEqual(returned_source, source)
+
+ def test_decoded_source(self):
+ # Decoding should work.
+ name = 'mod'
+ mock = SourceOnlyLoaderMock("mod.file")
+ source = "# coding: Latin-1\nx='ü'"
+ assert source.encode('latin-1') != source.encode('utf-8')
+ mock.source = source.encode('latin-1')
+ returned_source = mock.get_source(name)
+ self.assertEqual(returned_source, source)
+
+ def test_universal_newlines(self):
+ # PEP 302 says universal newlines should be used.
+ name = 'mod'
+ mock = SourceOnlyLoaderMock('mod.file')
+ source = "x = 42\r\ny = -13\r\n"
+ mock.source = source.encode('utf-8')
+ expect = io.IncrementalNewlineDecoder(None, True).decode(source)
+ self.assertEqual(mock.get_source(name), expect)
+
+
+class SourceLoaderInitModuleAttrTests(unittest.TestCase):
+
+ """Tests for importlib.abc.SourceLoader.init_module_attrs()."""
+
+ def test_init_module_attrs(self):
+ # If __file__ set, __cached__ == importlib.util.cached_from_source(__file__).
+ name = 'blah'
+ path = 'blah.py'
+ loader = SourceOnlyLoaderMock(path)
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertEqual(module.__loader__, loader)
+ self.assertEqual(module.__package__, '')
+ self.assertEqual(module.__file__, path)
+ self.assertEqual(module.__cached__, importlib.util.cache_from_source(path))
+
+ @mock.patch('importlib._bootstrap.cache_from_source')
+ def test_cache_from_source_NotImplementedError(self, mock_cache_from_source):
+ # If importlib.util.cache_from_source() raises NotImplementedError don't set
+ # __cached__.
+ mock_cache_from_source.side_effect = NotImplementedError
+ name = 'blah'
+ path = 'blah.py'
+ loader = SourceOnlyLoaderMock(path)
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertEqual(module.__file__, path)
+ self.assertFalse(hasattr(module, '__cached__'))
+
+ def test_no_get_filename(self):
+ # No __file__, no __cached__.
+ with mock.patch.object(SourceOnlyLoaderMock, 'get_filename') as mocked:
+ mocked.side_effect = ImportError
+ name = 'blah'
+ loader = SourceOnlyLoaderMock('blah.py')
+ module = types.ModuleType(name)
+ loader.init_module_attrs(module)
+ self.assertFalse(hasattr(module, '__file__'))
+ self.assertFalse(hasattr(module, '__cached__'))
-def test_main():
- from test.support import run_unittest
- classes = []
- for class_ in globals().values():
- if (inspect.isclass(class_) and
- issubclass(class_, unittest.TestCase) and
- issubclass(class_, InheritanceTests)):
- classes.append(class_)
- run_unittest(*classes)
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py
index b1a5894..0c0e851 100644
--- a/Lib/test/test_importlib/test_api.py
+++ b/Lib/test/test_importlib/test_api.py
@@ -1,6 +1,7 @@
from . import util
-import imp
+
import importlib
+from importlib import _bootstrap
from importlib import machinery
import sys
from test import support
@@ -98,7 +99,7 @@ class FindLoaderTests(unittest.TestCase):
# If a module with __loader__ is in sys.modules, then return it.
name = 'some_mod'
with util.uncache(name):
- module = imp.new_module(name)
+ module = types.ModuleType(name)
loader = 'a loader!'
module.__loader__ = loader
sys.modules[name] = module
@@ -109,12 +110,26 @@ class FindLoaderTests(unittest.TestCase):
# If sys.modules[name].__loader__ is None, raise ValueError.
name = 'some_mod'
with util.uncache(name):
- module = imp.new_module(name)
+ module = types.ModuleType(name)
module.__loader__ = None
sys.modules[name] = module
with self.assertRaises(ValueError):
importlib.find_loader(name)
+ def test_sys_modules_loader_is_not_set(self):
+ # Should raise ValueError
+ # Issue #17099
+ name = 'some_mod'
+ with util.uncache(name):
+ module = types.ModuleType(name)
+ try:
+ del module.__loader__
+ except AttributeError:
+ pass
+ sys.modules[name] = module
+ with self.assertRaises(ValueError):
+ importlib.find_loader(name)
+
def test_success(self):
# Return the loader found on sys.meta_path.
name = 'some_mod'
@@ -136,6 +151,34 @@ class FindLoaderTests(unittest.TestCase):
self.assertIsNone(importlib.find_loader('nevergoingtofindthismodule'))
+class ReloadTests(unittest.TestCase):
+
+ """Test module reloading for builtin and extension modules."""
+
+ def test_reload_modules(self):
+ for mod in ('tokenize', 'time', 'marshal'):
+ with self.subTest(module=mod):
+ with support.CleanImport(mod):
+ module = importlib.import_module(mod)
+ importlib.reload(module)
+
+ def test_module_replaced(self):
+ def code():
+ import sys
+ module = type(sys)('top_level')
+ module.spam = 3
+ sys.modules['top_level'] = module
+ mock = util.mock_modules('top_level',
+ module_code={'top_level': code})
+ with mock:
+ with util.import_state(meta_path=[mock]):
+ module = importlib.import_module('top_level')
+ reloaded = importlib.reload(module)
+ actual = sys.modules['top_level']
+ self.assertEqual(actual.spam, 3)
+ self.assertEqual(reloaded.spam, 3)
+
+
class InvalidateCacheTests(unittest.TestCase):
def test_method_called(self):
@@ -162,7 +205,7 @@ class InvalidateCacheTests(unittest.TestCase):
def test_method_lacking(self):
# There should be no issues if the method is not defined.
key = 'gobbledeegook'
- sys.path_importer_cache[key] = imp.NullImporter('abc')
+ sys.path_importer_cache[key] = None
self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
importlib.invalidate_caches() # Shouldn't trigger an exception.
@@ -182,21 +225,13 @@ class StartupTests(unittest.TestCase):
# Issue #17098: all modules should have __loader__ defined.
for name, module in sys.modules.items():
if isinstance(module, types.ModuleType):
- if name in sys.builtin_module_names:
- self.assertEqual(importlib.machinery.BuiltinImporter,
- module.__loader__)
- elif imp.is_frozen(name):
- self.assertEqual(importlib.machinery.FrozenImporter,
- module.__loader__)
-
-def test_main():
- from test.support import run_unittest
- run_unittest(ImportModuleTests,
- FindLoaderTests,
- InvalidateCacheTests,
- FrozenImportlibTests,
- StartupTests)
+ self.assertTrue(hasattr(module, '__loader__'),
+ '{!r} lacks a __loader__ attribute'.format(name))
+ if importlib.machinery.BuiltinImporter.find_module(name):
+ self.assertIsNot(module.__loader__, None)
+ elif importlib.machinery.FrozenImporter.find_module(name):
+ self.assertIsNot(module.__loader__, None)
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py
index efc8977..5fcbdae 100644
--- a/Lib/test/test_importlib/test_util.py
+++ b/Lib/test/test_importlib/test_util.py
@@ -1,23 +1,121 @@
from importlib import util
from . import util as test_util
-import imp
+
+import os
import sys
+from test import support
import types
import unittest
+import warnings
+
+
+class DecodeSourceBytesTests(unittest.TestCase):
+
+ source = "string ='ü'"
+
+ def test_ut8_default(self):
+ source_bytes = self.source.encode('utf-8')
+ self.assertEqual(util.decode_source(source_bytes), self.source)
+
+ def test_specified_encoding(self):
+ source = '# coding=latin-1\n' + self.source
+ source_bytes = source.encode('latin-1')
+ assert source_bytes != source.encode('utf-8')
+ self.assertEqual(util.decode_source(source_bytes), source)
+
+ def test_universal_newlines(self):
+ source = '\r\n'.join([self.source, self.source])
+ source_bytes = source.encode('utf-8')
+ self.assertEqual(util.decode_source(source_bytes),
+ '\n'.join([self.source, self.source]))
+
+
+class ModuleToLoadTests(unittest.TestCase):
+
+ module_name = 'ModuleManagerTest_module'
+
+ def setUp(self):
+ support.unload(self.module_name)
+ self.addCleanup(support.unload, self.module_name)
+
+ def test_new_module(self):
+ # Test a new module is created, inserted into sys.modules, has
+ # __initializing__ set to True after entering the context manager,
+ # and __initializing__ set to False after exiting.
+ with util.module_to_load(self.module_name) as module:
+ self.assertIn(self.module_name, sys.modules)
+ self.assertIs(sys.modules[self.module_name], module)
+ self.assertTrue(module.__initializing__)
+ self.assertFalse(module.__initializing__)
+
+ def test_new_module_failed(self):
+ # Test the module is removed from sys.modules.
+ try:
+ with util.module_to_load(self.module_name) as module:
+ self.assertIn(self.module_name, sys.modules)
+ raise exception
+ except Exception:
+ self.assertNotIn(self.module_name, sys.modules)
+ else:
+ self.fail('importlib.util.module_to_load swallowed an exception')
+
+ def test_reload(self):
+ # Test that the same module is in sys.modules.
+ created_module = types.ModuleType(self.module_name)
+ sys.modules[self.module_name] = created_module
+ with util.module_to_load(self.module_name) as module:
+ self.assertIs(module, created_module)
+
+ def test_reload_failed(self):
+ # Test that the module was left in sys.modules.
+ created_module = types.ModuleType(self.module_name)
+ sys.modules[self.module_name] = created_module
+ try:
+ with util.module_to_load(self.module_name) as module:
+ raise Exception
+ except Exception:
+ self.assertIn(self.module_name, sys.modules)
+ else:
+ self.fail('importlib.util.module_to_load swallowed an exception')
+
+ def test_reset_name(self):
+ # If reset_name is true then module.__name__ = name, else leave it be.
+ odd_name = 'not your typical name'
+ created_module = types.ModuleType(self.module_name)
+ created_module.__name__ = odd_name
+ sys.modules[self.module_name] = created_module
+ with util.module_to_load(self.module_name) as module:
+ self.assertEqual(module.__name__, self.module_name)
+ created_module.__name__ = odd_name
+ with util.module_to_load(self.module_name, reset_name=False) as module:
+ self.assertEqual(module.__name__, odd_name)
class ModuleForLoaderTests(unittest.TestCase):
"""Tests for importlib.util.module_for_loader."""
+ @staticmethod
+ def module_for_loader(func):
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore', PendingDeprecationWarning)
+ return util.module_for_loader(func)
+
+ def test_warning(self):
+ # Should raise a PendingDeprecationWarning when used.
+ with warnings.catch_warnings():
+ warnings.simplefilter('error', PendingDeprecationWarning)
+ with self.assertRaises(PendingDeprecationWarning):
+ func = util.module_for_loader(lambda x: x)
+
def return_module(self, name):
- fxn = util.module_for_loader(lambda self, module: module)
+ fxn = self.module_for_loader(lambda self, module: module)
return fxn(self, name)
def raise_exception(self, name):
def to_wrap(self, module):
raise ImportError
- fxn = util.module_for_loader(to_wrap)
+ fxn = self.module_for_loader(to_wrap)
try:
fxn(self, name)
except ImportError:
@@ -35,12 +133,23 @@ class ModuleForLoaderTests(unittest.TestCase):
def test_reload(self):
# Test that a module is reused if already in sys.modules.
+ class FakeLoader:
+ def is_package(self, name):
+ return True
+ @self.module_for_loader
+ def load_module(self, module):
+ return module
name = 'a.b.c'
- module = imp.new_module('a.b.c')
+ module = types.ModuleType('a.b.c')
+ module.__loader__ = 42
+ module.__package__ = 42
with test_util.uncache(name):
sys.modules[name] = module
- returned_module = self.return_module(name)
+ loader = FakeLoader()
+ returned_module = loader.load_module(name)
self.assertIs(returned_module, sys.modules[name])
+ self.assertEqual(module.__loader__, loader)
+ self.assertEqual(module.__package__, name)
def test_new_module_failure(self):
# Test that a module is removed from sys.modules if added but an
@@ -53,7 +162,7 @@ class ModuleForLoaderTests(unittest.TestCase):
def test_reload_failure(self):
# Test that a failure on reload leaves the module in-place.
name = 'a.b.c'
- module = imp.new_module(name)
+ module = types.ModuleType(name)
with test_util.uncache(name):
sys.modules[name] = module
self.raise_exception(name)
@@ -61,7 +170,7 @@ class ModuleForLoaderTests(unittest.TestCase):
def test_decorator_attrs(self):
def fxn(self, module): pass
- wrapped = util.module_for_loader(fxn)
+ wrapped = self.module_for_loader(fxn)
self.assertEqual(wrapped.__name__, fxn.__name__)
self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
@@ -87,7 +196,7 @@ class ModuleForLoaderTests(unittest.TestCase):
self._pkg = is_package
def is_package(self, name):
return self._pkg
- @util.module_for_loader
+ @self.module_for_loader
def load_module(self, module):
return module
@@ -124,26 +233,26 @@ class SetPackageTests(unittest.TestCase):
def test_top_level(self):
# __package__ should be set to the empty string if a top-level module.
# Implicitly tests when package is set to None.
- module = imp.new_module('module')
+ module = types.ModuleType('module')
module.__package__ = None
self.verify(module, '')
def test_package(self):
# Test setting __package__ for a package.
- module = imp.new_module('pkg')
+ module = types.ModuleType('pkg')
module.__path__ = ['<path>']
module.__package__ = None
self.verify(module, 'pkg')
def test_submodule(self):
# Test __package__ for a module in a package.
- module = imp.new_module('pkg.mod')
+ module = types.ModuleType('pkg.mod')
module.__package__ = None
self.verify(module, 'pkg')
def test_setting_if_missing(self):
# __package__ should be set if it is missing.
- module = imp.new_module('mod')
+ module = types.ModuleType('mod')
if hasattr(module, '__package__'):
delattr(module, '__package__')
self.verify(module, '')
@@ -151,7 +260,7 @@ class SetPackageTests(unittest.TestCase):
def test_leaving_alone(self):
# If __package__ is set and not None then leave it alone.
for value in (True, False):
- module = imp.new_module('mod')
+ module = types.ModuleType('mod')
module.__package__ = value
self.verify(module, value)
@@ -162,6 +271,37 @@ class SetPackageTests(unittest.TestCase):
self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
+class SetLoaderTests(unittest.TestCase):
+
+ """Tests importlib.util.set_loader()."""
+
+ class DummyLoader:
+ @util.set_loader
+ def load_module(self, module):
+ return self.module
+
+ def test_no_attribute(self):
+ loader = self.DummyLoader()
+ loader.module = types.ModuleType('blah')
+ try:
+ del loader.module.__loader__
+ except AttributeError:
+ pass
+ self.assertEqual(loader, loader.load_module('blah').__loader__)
+
+ def test_attribute_is_None(self):
+ loader = self.DummyLoader()
+ loader.module = types.ModuleType('blah')
+ loader.module.__loader__ = None
+ self.assertEqual(loader, loader.load_module('blah').__loader__)
+
+ def test_not_reset(self):
+ loader = self.DummyLoader()
+ loader.module = types.ModuleType('blah')
+ loader.module.__loader__ = 42
+ self.assertEqual(42, loader.load_module('blah').__loader__)
+
+
class ResolveNameTests(unittest.TestCase):
"""Tests importlib.util.resolve_name()."""
@@ -195,14 +335,131 @@ class ResolveNameTests(unittest.TestCase):
util.resolve_name('..bacon', 'spam')
-def test_main():
- from test import support
- support.run_unittest(
- ModuleForLoaderTests,
- SetPackageTests,
- ResolveNameTests
- )
+class MagicNumberTests(unittest.TestCase):
+
+ def test_length(self):
+ # Should be 4 bytes.
+ self.assertEqual(len(util.MAGIC_NUMBER), 4)
+
+ def test_incorporates_rn(self):
+ # The magic number uses \r\n to come out wrong when splitting on lines.
+ self.assertTrue(util.MAGIC_NUMBER.endswith(b'\r\n'))
+
+
+class PEP3147Tests(unittest.TestCase):
+ """Tests of PEP 3147-related functions:
+ cache_from_source and source_from_cache.
+
+ """
+
+ tag = sys.implementation.cache_tag
+
+ @unittest.skipUnless(sys.implementation.cache_tag is not None,
+ 'requires sys.implementation.cache_tag not be None')
+ def test_cache_from_source(self):
+ # Given the path to a .py file, return the path to its PEP 3147
+ # defined .pyc file (i.e. under __pycache__).
+ path = os.path.join('foo', 'bar', 'baz', 'qux.py')
+ expect = os.path.join('foo', 'bar', 'baz', '__pycache__',
+ 'qux.{}.pyc'.format(self.tag))
+ self.assertEqual(util.cache_from_source(path, True), expect)
+
+ def test_cache_from_source_no_cache_tag(self):
+ # No cache tag means NotImplementedError.
+ with support.swap_attr(sys.implementation, 'cache_tag', None):
+ with self.assertRaises(NotImplementedError):
+ util.cache_from_source('whatever.py')
+
+ def test_cache_from_source_no_dot(self):
+ # Directory with a dot, filename without dot.
+ path = os.path.join('foo.bar', 'file')
+ expect = os.path.join('foo.bar', '__pycache__',
+ 'file{}.pyc'.format(self.tag))
+ self.assertEqual(util.cache_from_source(path, True), expect)
+
+ def test_cache_from_source_optimized(self):
+ # Given the path to a .py file, return the path to its PEP 3147
+ # defined .pyo file (i.e. under __pycache__).
+ path = os.path.join('foo', 'bar', 'baz', 'qux.py')
+ expect = os.path.join('foo', 'bar', 'baz', '__pycache__',
+ 'qux.{}.pyo'.format(self.tag))
+ self.assertEqual(util.cache_from_source(path, False), expect)
+
+ def test_cache_from_source_cwd(self):
+ path = 'foo.py'
+ expect = os.path.join('__pycache__', 'foo.{}.pyc'.format(self.tag))
+ self.assertEqual(util.cache_from_source(path, True), expect)
+
+ def test_cache_from_source_override(self):
+ # When debug_override is not None, it can be any true-ish or false-ish
+ # value.
+ path = os.path.join('foo', 'bar', 'baz.py')
+ partial_expect = os.path.join('foo', 'bar', '__pycache__',
+ 'baz.{}.py'.format(self.tag))
+ self.assertEqual(util.cache_from_source(path, []), partial_expect + 'o')
+ self.assertEqual(util.cache_from_source(path, [17]),
+ partial_expect + 'c')
+ # However if the bool-ishness can't be determined, the exception
+ # propagates.
+ class Bearish:
+ def __bool__(self): raise RuntimeError
+ with self.assertRaises(RuntimeError):
+ util.cache_from_source('/foo/bar/baz.py', Bearish())
+
+ @unittest.skipUnless(os.sep == '\\' and os.altsep == '/',
+ 'test meaningful only where os.altsep is defined')
+ def test_sep_altsep_and_sep_cache_from_source(self):
+ # Windows path and PEP 3147 where sep is right of altsep.
+ self.assertEqual(
+ util.cache_from_source('\\foo\\bar\\baz/qux.py', True),
+ '\\foo\\bar\\baz\\__pycache__\\qux.{}.pyc'.format(self.tag))
+
+ @unittest.skipUnless(sys.implementation.cache_tag is not None,
+ 'requires sys.implementation.cache_tag to not be '
+ 'None')
+ def test_source_from_cache(self):
+ # Given the path to a PEP 3147 defined .pyc file, return the path to
+ # its source. This tests the good path.
+ path = os.path.join('foo', 'bar', 'baz', '__pycache__',
+ 'qux.{}.pyc'.format(self.tag))
+ expect = os.path.join('foo', 'bar', 'baz', 'qux.py')
+ self.assertEqual(util.source_from_cache(path), expect)
+
+ def test_source_from_cache_no_cache_tag(self):
+ # If sys.implementation.cache_tag is None, raise NotImplementedError.
+ path = os.path.join('blah', '__pycache__', 'whatever.pyc')
+ with support.swap_attr(sys.implementation, 'cache_tag', None):
+ with self.assertRaises(NotImplementedError):
+ util.source_from_cache(path)
+
+ def test_source_from_cache_bad_path(self):
+ # When the path to a pyc file is not in PEP 3147 format, a ValueError
+ # is raised.
+ self.assertRaises(
+ ValueError, util.source_from_cache, '/foo/bar/bazqux.pyc')
+
+ def test_source_from_cache_no_slash(self):
+ # No slashes at all in path -> ValueError
+ self.assertRaises(
+ ValueError, util.source_from_cache, 'foo.cpython-32.pyc')
+
+ def test_source_from_cache_too_few_dots(self):
+ # Too few dots in final path component -> ValueError
+ self.assertRaises(
+ ValueError, util.source_from_cache, '__pycache__/foo.pyc')
+
+ def test_source_from_cache_too_many_dots(self):
+ # Too many dots in final path component -> ValueError
+ self.assertRaises(
+ ValueError, util.source_from_cache,
+ '__pycache__/foo.cpython-32.foo.pyc')
+
+ def test_source_from_cache_no__pycache__(self):
+ # Another problem with the path -> ValueError
+ self.assertRaises(
+ ValueError, util.source_from_cache,
+ '/foo/bar/foo.cpython-32.foo.pyc')
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py
index ef32f7d..f97ca72 100644
--- a/Lib/test/test_importlib/util.py
+++ b/Lib/test/test_importlib/util.py
@@ -1,9 +1,9 @@
from contextlib import contextmanager
-import imp
import os.path
from test import support
import unittest
import sys
+import types
CASE_INSENSITIVE_FS = True
@@ -98,7 +98,7 @@ class mock_modules:
package = name.rsplit('.', 1)[0]
else:
package = import_name
- module = imp.new_module(import_name)
+ module = types.ModuleType(import_name)
module.__loader__ = self
module.__file__ = '<mock __file__>'
module.__package__ = package
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 9f5e93b..5de6212 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -8,6 +8,7 @@ import datetime
import collections
import os
import shutil
+import functools
from os.path import normcase
from test.support import run_unittest, TESTFN, DirsOnSysPath
@@ -401,14 +402,14 @@ class TestBuggyCases(GetSourceBase):
unicodedata.__file__[-4:] in (".pyc", ".pyo"),
"unicodedata is not an external binary module")
def test_findsource_binary(self):
- self.assertRaises(IOError, inspect.getsource, unicodedata)
- self.assertRaises(IOError, inspect.findsource, unicodedata)
+ self.assertRaises(OSError, inspect.getsource, unicodedata)
+ self.assertRaises(OSError, inspect.findsource, unicodedata)
def test_findsource_code_in_linecache(self):
lines = ["x=1"]
co = compile(lines[0], "_dynamically_created_file", "exec")
- self.assertRaises(IOError, inspect.findsource, co)
- self.assertRaises(IOError, inspect.getsource, co)
+ self.assertRaises(OSError, inspect.findsource, co)
+ self.assertRaises(OSError, inspect.getsource, co)
linecache.cache[co.co_filename] = (1, None, lines, co.co_filename)
try:
self.assertEqual(inspect.findsource(co), (lines,0))
@@ -1719,6 +1720,17 @@ class TestSignatureObject(unittest.TestCase):
((('b', ..., ..., "positional_or_keyword"),),
...))
+ # Test we handle __signature__ partway down the wrapper stack
+ def wrapped_foo_call():
+ pass
+ wrapped_foo_call.__wrapped__ = Foo.__call__
+
+ self.assertEqual(self.signature(wrapped_foo_call),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', ..., ..., "positional_or_keyword")),
+ ...))
+
+
def test_signature_on_class(self):
class C:
def __init__(self, a):
@@ -1833,6 +1845,10 @@ class TestSignatureObject(unittest.TestCase):
self.assertEqual(self.signature(Wrapped),
((('a', ..., ..., "positional_or_keyword"),),
...))
+ # wrapper loop:
+ Wrapped.__wrapped__ = Wrapped
+ with self.assertRaisesRegex(ValueError, 'wrapper loop'):
+ self.signature(Wrapped)
def test_signature_on_lambdas(self):
self.assertEqual(self.signature((lambda a=10: a)),
@@ -2284,6 +2300,62 @@ class TestBoundArguments(unittest.TestCase):
self.assertNotEqual(ba, ba4)
+class TestUnwrap(unittest.TestCase):
+
+ def test_unwrap_one(self):
+ def func(a, b):
+ return a + b
+ wrapper = functools.lru_cache(maxsize=20)(func)
+ self.assertIs(inspect.unwrap(wrapper), func)
+
+ def test_unwrap_several(self):
+ def func(a, b):
+ return a + b
+ wrapper = func
+ for __ in range(10):
+ @functools.wraps(wrapper)
+ def wrapper():
+ pass
+ self.assertIsNot(wrapper.__wrapped__, func)
+ self.assertIs(inspect.unwrap(wrapper), func)
+
+ def test_stop(self):
+ def func1(a, b):
+ return a + b
+ @functools.wraps(func1)
+ def func2():
+ pass
+ @functools.wraps(func2)
+ def wrapper():
+ pass
+ func2.stop_here = 1
+ unwrapped = inspect.unwrap(wrapper,
+ stop=(lambda f: hasattr(f, "stop_here")))
+ self.assertIs(unwrapped, func2)
+
+ def test_cycle(self):
+ def func1(): pass
+ func1.__wrapped__ = func1
+ with self.assertRaisesRegex(ValueError, 'wrapper loop'):
+ inspect.unwrap(func1)
+
+ def func2(): pass
+ func2.__wrapped__ = func1
+ func1.__wrapped__ = func2
+ with self.assertRaisesRegex(ValueError, 'wrapper loop'):
+ inspect.unwrap(func1)
+ with self.assertRaisesRegex(ValueError, 'wrapper loop'):
+ inspect.unwrap(func2)
+
+ def test_unhashable(self):
+ def func(): pass
+ func.__wrapped__ = None
+ class C:
+ __hash__ = None
+ __wrapped__ = func
+ self.assertIsNone(inspect.unwrap(C()))
+
+
def test_main():
run_unittest(
TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases,
@@ -2291,7 +2363,7 @@ def test_main():
TestGetcallargsFunctions, TestGetcallargsMethods,
TestGetcallargsUnboundMethods, TestGetattrStatic, TestGetGeneratorState,
TestNoEOL, TestSignatureObject, TestSignatureBind, TestParameterObject,
- TestBoundArguments, TestGetClosureVars
+ TestBoundArguments, TestGetClosureVars, TestUnwrap
)
if __name__ == "__main__":
diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py
index c198bcc..4e00622 100644
--- a/Lib/test/test_int.py
+++ b/Lib/test/test_int.py
@@ -228,6 +228,47 @@ class IntTestCases(unittest.TestCase):
self.assertRaises(TypeError, int, base=10)
self.assertRaises(TypeError, int, base=0)
+ def test_int_base_limits(self):
+ """Testing the supported limits of the int() base parameter."""
+ self.assertEqual(int('0', 5), 0)
+ with self.assertRaises(ValueError):
+ int('0', 1)
+ with self.assertRaises(ValueError):
+ int('0', 37)
+ with self.assertRaises(ValueError):
+ int('0', -909) # An old magic value base from Python 2.
+ with self.assertRaises(ValueError):
+ int('0', base=0-(2**234))
+ with self.assertRaises(ValueError):
+ int('0', base=2**234)
+ # Bases 2 through 36 are supported.
+ for base in range(2,37):
+ self.assertEqual(int('0', base=base), 0)
+
+ def test_int_base_bad_types(self):
+ """Not integer types are not valid bases; issue16772."""
+ with self.assertRaises(TypeError):
+ int('0', 5.5)
+ with self.assertRaises(TypeError):
+ int('0', 5.0)
+
+ def test_int_base_indexable(self):
+ class MyIndexable(object):
+ def __init__(self, value):
+ self.value = value
+ def __index__(self):
+ return self.value
+
+ # Check out of range bases.
+ for base in 2**100, -2**100, 1, 37:
+ with self.assertRaises(ValueError):
+ int('43', base)
+
+ # Check in-range bases.
+ self.assertEqual(int('101', base=MyIndexable(2)), 5)
+ self.assertEqual(int('101', base=MyIndexable(10)), 101)
+ self.assertEqual(int('101', base=MyIndexable(36)), 1 + 36**2)
+
def test_non_numeric_input_types(self):
# Test possible non-numeric types for the argument x, including
# subclasses of the explicitly documented accepted types.
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 9b89202..c1ea6f2 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -165,7 +165,7 @@ class CloseFailureIO(MockRawIO):
def close(self):
if not self.closed:
self.closed = 1
- raise IOError
+ raise OSError
class CCloseFailureIO(CloseFailureIO, io.RawIOBase):
pass
@@ -601,9 +601,9 @@ class IOTest(unittest.TestCase):
def test_flush_error_on_close(self):
f = self.open(support.TESTFN, "wb", buffering=0)
def bad_flush():
- raise IOError()
+ raise OSError()
f.flush = bad_flush
- self.assertRaises(IOError, f.close) # exception not swallowed
+ self.assertRaises(OSError, f.close) # exception not swallowed
self.assertTrue(f.closed)
def test_multi_close(self):
@@ -762,7 +762,7 @@ class CommonBufferedTests:
if s:
# The destructor *may* have printed an unraisable error, check it
self.assertEqual(len(s.splitlines()), 1)
- self.assertTrue(s.startswith("Exception IOError: "), s)
+ self.assertTrue(s.startswith("Exception OSError: "), s)
self.assertTrue(s.endswith(" ignored"), s)
def test_repr(self):
@@ -778,22 +778,22 @@ class CommonBufferedTests:
def test_flush_error_on_close(self):
raw = self.MockRawIO()
def bad_flush():
- raise IOError()
+ raise OSError()
raw.flush = bad_flush
b = self.tp(raw)
- self.assertRaises(IOError, b.close) # exception not swallowed
+ self.assertRaises(OSError, b.close) # exception not swallowed
self.assertTrue(b.closed)
def test_close_error_on_close(self):
raw = self.MockRawIO()
def bad_flush():
- raise IOError('flush')
+ raise OSError('flush')
def bad_close():
- raise IOError('close')
+ raise OSError('close')
raw.close = bad_close
b = self.tp(raw)
b.flush = bad_flush
- with self.assertRaises(IOError) as err: # exception not swallowed
+ with self.assertRaises(OSError) as err: # exception not swallowed
b.close()
self.assertEqual(err.exception.args, ('close',))
self.assertEqual(err.exception.__context__.args, ('flush',))
@@ -833,6 +833,14 @@ class SizeofTest:
bufio = self.tp(rawio, buffer_size=bufsize2)
self.assertEqual(sys.getsizeof(bufio), size + bufsize2)
+ @support.cpython_only
+ def test_buffer_freeing(self) :
+ bufsize = 4096
+ rawio = self.MockRawIO()
+ bufio = self.tp(rawio, buffer_size=bufsize)
+ size = sys.getsizeof(bufio) - bufsize
+ bufio.close()
+ self.assertEqual(sys.getsizeof(bufio), size)
class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
read_mode = "rb"
@@ -1007,8 +1015,8 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
def test_misbehaved_io(self):
rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
bufio = self.tp(rawio)
- self.assertRaises(IOError, bufio.seek, 0)
- self.assertRaises(IOError, bufio.tell)
+ self.assertRaises(OSError, bufio.seek, 0)
+ self.assertRaises(OSError, bufio.tell)
def test_no_extraneous_read(self):
# Issue #9550; when the raw IO object has satisfied the read request,
@@ -1059,17 +1067,18 @@ class CBufferedReaderTest(BufferedReaderTest, SizeofTest):
bufio = self.tp(rawio)
# _pyio.BufferedReader seems to implement reading different, so that
# checking this is not so easy.
- self.assertRaises(IOError, bufio.read, 10)
+ self.assertRaises(OSError, bufio.read, 10)
def test_garbage_collection(self):
# C BufferedReader objects are collected.
# The Python version has __del__, so it ends into gc.garbage instead
- rawio = self.FileIO(support.TESTFN, "w+b")
- f = self.tp(rawio)
- f.f = f
- wr = weakref.ref(f)
- del f
- support.gc_collect()
+ with support.check_warnings(('', ResourceWarning)):
+ rawio = self.FileIO(support.TESTFN, "w+b")
+ f = self.tp(rawio)
+ f.f = f
+ wr = weakref.ref(f)
+ del f
+ support.gc_collect()
self.assertTrue(wr() is None, wr)
def test_args_error(self):
@@ -1312,9 +1321,9 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
def test_misbehaved_io(self):
rawio = self.MisbehavedRawIO()
bufio = self.tp(rawio, 5)
- self.assertRaises(IOError, bufio.seek, 0)
- self.assertRaises(IOError, bufio.tell)
- self.assertRaises(IOError, bufio.write, b"abcdef")
+ self.assertRaises(OSError, bufio.seek, 0)
+ self.assertRaises(OSError, bufio.tell)
+ self.assertRaises(OSError, bufio.write, b"abcdef")
def test_max_buffer_size_removal(self):
with self.assertRaises(TypeError):
@@ -1323,11 +1332,11 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
def test_write_error_on_close(self):
raw = self.MockRawIO()
def bad_write(b):
- raise IOError()
+ raise OSError()
raw.write = bad_write
b = self.tp(raw)
b.write(b'spam')
- self.assertRaises(IOError, b.close) # exception not swallowed
+ self.assertRaises(OSError, b.close) # exception not swallowed
self.assertTrue(b.closed)
@@ -1358,13 +1367,14 @@ class CBufferedWriterTest(BufferedWriterTest, SizeofTest):
# C BufferedWriter objects are collected, and collecting them flushes
# all data to disk.
# The Python version has __del__, so it ends into gc.garbage instead
- rawio = self.FileIO(support.TESTFN, "w+b")
- f = self.tp(rawio)
- f.write(b"123xxx")
- f.x = f
- wr = weakref.ref(f)
- del f
- support.gc_collect()
+ with support.check_warnings(('', ResourceWarning)):
+ rawio = self.FileIO(support.TESTFN, "w+b")
+ f = self.tp(rawio)
+ f.write(b"123xxx")
+ f.x = f
+ wr = weakref.ref(f)
+ del f
+ support.gc_collect()
self.assertTrue(wr() is None, wr)
with self.open(support.TESTFN, "rb") as f:
self.assertEqual(f.read(), b"123xxx")
@@ -1397,14 +1407,14 @@ class BufferedRWPairTest(unittest.TestCase):
def readable(self):
return False
- self.assertRaises(IOError, self.tp, NotReadable(), self.MockRawIO())
+ self.assertRaises(OSError, self.tp, NotReadable(), self.MockRawIO())
def test_constructor_with_not_writeable(self):
class NotWriteable(MockRawIO):
def writable(self):
return False
- self.assertRaises(IOError, self.tp, self.MockRawIO(), NotWriteable())
+ self.assertRaises(OSError, self.tp, self.MockRawIO(), NotWriteable())
def test_read(self):
pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
@@ -2165,7 +2175,7 @@ class TextIOWrapperTest(unittest.TestCase):
if s:
# The destructor *may* have printed an unraisable error, check it
self.assertEqual(len(s.splitlines()), 1)
- self.assertTrue(s.startswith("Exception IOError: "), s)
+ self.assertTrue(s.startswith("Exception OSError: "), s)
self.assertTrue(s.endswith(" ignored"), s)
# Systematic tests of the text I/O API
@@ -2237,7 +2247,7 @@ class TextIOWrapperTest(unittest.TestCase):
f.seek(0)
for line in f:
self.assertEqual(line, "\xff\n")
- self.assertRaises(IOError, f.tell)
+ self.assertRaises(OSError, f.tell)
self.assertEqual(f.tell(), p2)
f.close()
@@ -2341,7 +2351,7 @@ class TextIOWrapperTest(unittest.TestCase):
def readable(self):
return False
txt = self.TextIOWrapper(UnReadable())
- self.assertRaises(IOError, txt.read)
+ self.assertRaises(OSError, txt.read)
def test_read_one_by_one(self):
txt = self.TextIOWrapper(self.BytesIO(b"AA\r\nBB"))
@@ -2516,9 +2526,9 @@ class TextIOWrapperTest(unittest.TestCase):
def test_flush_error_on_close(self):
txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
def bad_flush():
- raise IOError()
+ raise OSError()
txt.flush = bad_flush
- self.assertRaises(IOError, txt.close) # exception not swallowed
+ self.assertRaises(OSError, txt.close) # exception not swallowed
self.assertTrue(txt.closed)
def test_multi_close(self):
@@ -2599,14 +2609,15 @@ class CTextIOWrapperTest(TextIOWrapperTest):
# C TextIOWrapper objects are collected, and collecting them flushes
# all data to disk.
# The Python version has __del__, so it ends in gc.garbage instead.
- rawio = io.FileIO(support.TESTFN, "wb")
- b = self.BufferedWriter(rawio)
- t = self.TextIOWrapper(b, encoding="ascii")
- t.write("456def")
- t.x = t
- wr = weakref.ref(t)
- del t
- support.gc_collect()
+ with support.check_warnings(('', ResourceWarning)):
+ rawio = io.FileIO(support.TESTFN, "wb")
+ b = self.BufferedWriter(rawio)
+ t = self.TextIOWrapper(b, encoding="ascii")
+ t.write("456def")
+ t.x = t
+ wr = weakref.ref(t)
+ del t
+ support.gc_collect()
self.assertTrue(wr() is None, wr)
with self.open(support.TESTFN, "rb") as f:
self.assertEqual(f.read(), b"456def")
@@ -2896,7 +2907,7 @@ class MiscIOTest(unittest.TestCase):
for fd in fds:
try:
os.close(fd)
- except EnvironmentError as e:
+ except OSError as e:
if e.errno != errno.EBADF:
raise
self.addCleanup(cleanup_fds)
@@ -3062,15 +3073,18 @@ class SignalsTest(unittest.TestCase):
try:
wio = self.io.open(w, **fdopen_kwargs)
t.start()
- signal.alarm(1)
# Fill the pipe enough that the write will be blocking.
# It will be interrupted by the timer armed above. Since the
# other thread has read one byte, the low-level write will
# return with a successful (partial) result rather than an EINTR.
# The buffered IO layer must check for pending signal
# handlers, which in this case will invoke alarm_interrupt().
- self.assertRaises(ZeroDivisionError,
- wio.write, item * (support.PIPE_MAX_SIZE // len(item) + 1))
+ signal.alarm(1)
+ try:
+ self.assertRaises(ZeroDivisionError,
+ wio.write, item * (support.PIPE_MAX_SIZE // len(item) + 1))
+ finally:
+ signal.alarm(0)
t.join()
# We got one byte, get another one and check that it isn't a
# repeat of the first one.
@@ -3084,7 +3098,7 @@ class SignalsTest(unittest.TestCase):
# buffer, and block again.
try:
wio.close()
- except IOError as e:
+ except OSError as e:
if e.errno != errno.EBADF:
raise
@@ -3212,7 +3226,7 @@ class SignalsTest(unittest.TestCase):
# buffer, and could block (in case of failure).
try:
wio.close()
- except IOError as e:
+ except OSError as e:
if e.errno != errno.EBADF:
raise
diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py
index 531c9af..efe9f51 100644
--- a/Lib/test/test_ioctl.py
+++ b/Lib/test/test_ioctl.py
@@ -8,7 +8,7 @@ get_attribute(termios, 'TIOCGPGRP') #Can't run tests without this feature
try:
tty = open("/dev/tty", "rb")
-except IOError:
+except OSError:
raise unittest.SkipTest("Unable to open /dev/tty")
else:
# Skip if another process is in foreground
@@ -86,8 +86,6 @@ class IoctlTests(unittest.TestCase):
os.close(mfd)
os.close(sfd)
-def test_main():
- run_unittest(IoctlTests)
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_iterlen.py b/Lib/test/test_iterlen.py
index 9101f6c..152f5fc 100644
--- a/Lib/test/test_iterlen.py
+++ b/Lib/test/test_iterlen.py
@@ -45,31 +45,21 @@ import unittest
from test import support
from itertools import repeat
from collections import deque
-from builtins import len as _len
+from operator import length_hint
n = 10
-def len(obj):
- try:
- return _len(obj)
- except TypeError:
- try:
- # note: this is an internal undocumented API,
- # don't rely on it in your own programs
- return obj.__length_hint__()
- except AttributeError:
- raise TypeError
class TestInvariantWithoutMutations:
def test_invariant(self):
it = self.it
for i in reversed(range(1, n+1)):
- self.assertEqual(len(it), i)
+ self.assertEqual(length_hint(it), i)
next(it)
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
self.assertRaises(StopIteration, next, it)
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
class TestTemporarilyImmutable(TestInvariantWithoutMutations):
@@ -78,12 +68,12 @@ class TestTemporarilyImmutable(TestInvariantWithoutMutations):
# length immutability during iteration
it = self.it
- self.assertEqual(len(it), n)
+ self.assertEqual(length_hint(it), n)
next(it)
- self.assertEqual(len(it), n-1)
+ self.assertEqual(length_hint(it), n-1)
self.mutate()
self.assertRaises(RuntimeError, next, it)
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
## ------- Concrete Type Tests -------
@@ -92,10 +82,6 @@ class TestRepeat(TestInvariantWithoutMutations, unittest.TestCase):
def setUp(self):
self.it = repeat(None, n)
- def test_no_len_for_infinite_repeat(self):
- # The repeat() object can also be infinite
- self.assertRaises(TypeError, len, repeat(None))
-
class TestXrange(TestInvariantWithoutMutations, unittest.TestCase):
def setUp(self):
@@ -167,14 +153,15 @@ class TestList(TestInvariantWithoutMutations, unittest.TestCase):
it = iter(d)
next(it)
next(it)
- self.assertEqual(len(it), n-2)
+ self.assertEqual(length_hint(it), n - 2)
d.append(n)
- self.assertEqual(len(it), n-1) # grow with append
+ self.assertEqual(length_hint(it), n - 1) # grow with append
d[1:] = []
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
self.assertEqual(list(it), [])
d.extend(range(20))
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
+
class TestListReversed(TestInvariantWithoutMutations, unittest.TestCase):
@@ -186,32 +173,41 @@ class TestListReversed(TestInvariantWithoutMutations, unittest.TestCase):
it = reversed(d)
next(it)
next(it)
- self.assertEqual(len(it), n-2)
+ self.assertEqual(length_hint(it), n - 2)
d.append(n)
- self.assertEqual(len(it), n-2) # ignore append
+ self.assertEqual(length_hint(it), n - 2) # ignore append
d[1:] = []
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
self.assertEqual(list(it), []) # confirm invariant
d.extend(range(20))
- self.assertEqual(len(it), 0)
+ self.assertEqual(length_hint(it), 0)
## -- Check to make sure exceptions are not suppressed by __length_hint__()
class BadLen(object):
- def __iter__(self): return iter(range(10))
+ def __iter__(self):
+ return iter(range(10))
+
def __len__(self):
raise RuntimeError('hello')
+
class BadLengthHint(object):
- def __iter__(self): return iter(range(10))
+ def __iter__(self):
+ return iter(range(10))
+
def __length_hint__(self):
raise RuntimeError('hello')
+
class NoneLengthHint(object):
- def __iter__(self): return iter(range(10))
+ def __iter__(self):
+ return iter(range(10))
+
def __length_hint__(self):
- return None
+ return NotImplemented
+
class TestLengthHintExceptions(unittest.TestCase):
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index 53926a9..fdf7984 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -1729,9 +1729,8 @@ class TestVariousIteratorArgs(unittest.TestCase):
class LengthTransparency(unittest.TestCase):
def test_repeat(self):
- from test.test_iterlen import len
- self.assertEqual(len(repeat(None, 50)), 50)
- self.assertRaises(TypeError, len, repeat(None))
+ self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
+ self.assertEqual(operator.length_hint(repeat(None), 12), 12)
class RegressionTests(unittest.TestCase):
diff --git a/Lib/test/test_json/test_enum.py b/Lib/test/test_json/test_enum.py
new file mode 100644
index 0000000..66c6480
--- /dev/null
+++ b/Lib/test/test_json/test_enum.py
@@ -0,0 +1,81 @@
+from enum import Enum, IntEnum
+from test.test_json import PyTest, CTest
+
+SMALL = 1
+BIG = 1<<32
+HUGE = 1<<64
+REALLY_HUGE = 1<<96
+
+class BigNum(IntEnum):
+ small = SMALL
+ big = BIG
+ huge = HUGE
+ really_huge = REALLY_HUGE
+
+E = 2.718281
+PI = 3.141593
+TAU = 2 * PI
+
+class FloatNum(float, Enum):
+ e = E
+ pi = PI
+ tau = TAU
+
+class TestEnum:
+
+ def test_floats(self):
+ for enum in FloatNum:
+ self.assertEqual(self.dumps(enum), repr(enum.value))
+ self.assertEqual(float(self.dumps(enum)), enum)
+ self.assertEqual(self.loads(self.dumps(enum)), enum)
+
+ def test_ints(self):
+ for enum in BigNum:
+ self.assertEqual(self.dumps(enum), str(enum.value))
+ self.assertEqual(int(self.dumps(enum)), enum)
+ self.assertEqual(self.loads(self.dumps(enum)), enum)
+
+ def test_list(self):
+ self.assertEqual(
+ self.dumps(list(BigNum)),
+ str([SMALL, BIG, HUGE, REALLY_HUGE]),
+ )
+ self.assertEqual(self.dumps(list(FloatNum)), str([E, PI, TAU]))
+
+ def test_dict_keys(self):
+ s, b, h, r = BigNum
+ e, p, t = FloatNum
+ d = {
+ s:'tiny', b:'large', h:'larger', r:'largest',
+ e:"Euler's number", p:'pi', t:'tau',
+ }
+ nd = self.loads(self.dumps(d))
+ self.assertEqual(nd[str(SMALL)], 'tiny')
+ self.assertEqual(nd[str(BIG)], 'large')
+ self.assertEqual(nd[str(HUGE)], 'larger')
+ self.assertEqual(nd[str(REALLY_HUGE)], 'largest')
+ self.assertEqual(nd[repr(E)], "Euler's number")
+ self.assertEqual(nd[repr(PI)], 'pi')
+ self.assertEqual(nd[repr(TAU)], 'tau')
+
+ def test_dict_values(self):
+ d = dict(
+ tiny=BigNum.small,
+ large=BigNum.big,
+ larger=BigNum.huge,
+ largest=BigNum.really_huge,
+ e=FloatNum.e,
+ pi=FloatNum.pi,
+ tau=FloatNum.tau,
+ )
+ nd = self.loads(self.dumps(d))
+ self.assertEqual(nd['tiny'], SMALL)
+ self.assertEqual(nd['large'], BIG)
+ self.assertEqual(nd['larger'], HUGE)
+ self.assertEqual(nd['largest'], REALLY_HUGE)
+ self.assertEqual(nd['e'], E)
+ self.assertEqual(nd['pi'], PI)
+ self.assertEqual(nd['tau'], TAU)
+
+class TestPyEnum(TestEnum, PyTest): pass
+class TestCEnum(TestEnum, CTest): pass
diff --git a/Lib/test/test_json/test_fail.py b/Lib/test/test_json/test_fail.py
index 3dd877a..7caafdb 100644
--- a/Lib/test/test_json/test_fail.py
+++ b/Lib/test/test_json/test_fail.py
@@ -1,4 +1,5 @@
from test.test_json import PyTest, CTest
+import re
# 2007-10-05
JSONDOCS = [
@@ -100,6 +101,94 @@ class TestFail:
#This is for python encoder
self.assertRaises(TypeError, self.dumps, data, indent=True)
+ def test_truncated_input(self):
+ test_cases = [
+ ('', 'Expecting value', 0),
+ ('[', 'Expecting value', 1),
+ ('[42', "Expecting ',' delimiter", 3),
+ ('[42,', 'Expecting value', 4),
+ ('["', 'Unterminated string starting at', 1),
+ ('["spam', 'Unterminated string starting at', 1),
+ ('["spam"', "Expecting ',' delimiter", 7),
+ ('["spam",', 'Expecting value', 8),
+ ('{', 'Expecting property name enclosed in double quotes', 1),
+ ('{"', 'Unterminated string starting at', 1),
+ ('{"spam', 'Unterminated string starting at', 1),
+ ('{"spam"', "Expecting ':' delimiter", 7),
+ ('{"spam":', 'Expecting value', 8),
+ ('{"spam":42', "Expecting ',' delimiter", 10),
+ ('{"spam":42,', 'Expecting property name enclosed in double quotes', 11),
+ ]
+ test_cases += [
+ ('"', 'Unterminated string starting at', 0),
+ ('"spam', 'Unterminated string starting at', 0),
+ ]
+ for data, msg, idx in test_cases:
+ self.assertRaisesRegex(ValueError,
+ r'^{0}: line 1 column {1} \(char {2}\)'.format(
+ re.escape(msg), idx + 1, idx),
+ self.loads, data)
+
+ def test_unexpected_data(self):
+ test_cases = [
+ ('[,', 'Expecting value', 1),
+ ('{"spam":[}', 'Expecting value', 9),
+ ('[42:', "Expecting ',' delimiter", 3),
+ ('[42 "spam"', "Expecting ',' delimiter", 4),
+ ('[42,]', 'Expecting value', 4),
+ ('{"spam":[42}', "Expecting ',' delimiter", 11),
+ ('["]', 'Unterminated string starting at', 1),
+ ('["spam":', "Expecting ',' delimiter", 7),
+ ('["spam",]', 'Expecting value', 8),
+ ('{:', 'Expecting property name enclosed in double quotes', 1),
+ ('{,', 'Expecting property name enclosed in double quotes', 1),
+ ('{42', 'Expecting property name enclosed in double quotes', 1),
+ ('[{]', 'Expecting property name enclosed in double quotes', 2),
+ ('{"spam",', "Expecting ':' delimiter", 7),
+ ('{"spam"}', "Expecting ':' delimiter", 7),
+ ('[{"spam"]', "Expecting ':' delimiter", 8),
+ ('{"spam":}', 'Expecting value', 8),
+ ('[{"spam":]', 'Expecting value', 9),
+ ('{"spam":42 "ham"', "Expecting ',' delimiter", 11),
+ ('[{"spam":42]', "Expecting ',' delimiter", 11),
+ ('{"spam":42,}', 'Expecting property name enclosed in double quotes', 11),
+ ]
+ for data, msg, idx in test_cases:
+ self.assertRaisesRegex(ValueError,
+ r'^{0}: line 1 column {1} \(char {2}\)'.format(
+ re.escape(msg), idx + 1, idx),
+ self.loads, data)
+
+ def test_extra_data(self):
+ test_cases = [
+ ('[]]', 'Extra data', 2),
+ ('{}}', 'Extra data', 2),
+ ('[],[]', 'Extra data', 2),
+ ('{},{}', 'Extra data', 2),
+ ]
+ test_cases += [
+ ('42,"spam"', 'Extra data', 2),
+ ('"spam",42', 'Extra data', 6),
+ ]
+ for data, msg, idx in test_cases:
+ self.assertRaisesRegex(ValueError,
+ r'^{0}: line 1 column {1} - line 1 column {2}'
+ r' \(char {3} - {4}\)'.format(
+ re.escape(msg), idx + 1, len(data) + 1, idx, len(data)),
+ self.loads, data)
+
+ def test_linecol(self):
+ test_cases = [
+ ('!', 1, 1, 0),
+ (' !', 1, 2, 1),
+ ('\n!', 2, 1, 1),
+ ('\n \n\n !', 4, 6, 10),
+ ]
+ for data, line, col, idx in test_cases:
+ self.assertRaisesRegex(ValueError,
+ r'^Expecting value: line {0} column {1}'
+ r' \(char {2}\)$'.format(line, col, idx),
+ self.loads, data)
class TestPyFail(TestFail, PyTest): pass
class TestCFail(TestFail, CTest): pass
diff --git a/Lib/test/test_json/test_indent.py b/Lib/test/test_json/test_indent.py
index a4d4d20..e07856f 100644
--- a/Lib/test/test_json/test_indent.py
+++ b/Lib/test/test_json/test_indent.py
@@ -32,6 +32,8 @@ class TestIndent:
d1 = self.dumps(h)
d2 = self.dumps(h, indent=2, sort_keys=True, separators=(',', ': '))
d3 = self.dumps(h, indent='\t', sort_keys=True, separators=(',', ': '))
+ d4 = self.dumps(h, indent=2, sort_keys=True)
+ d5 = self.dumps(h, indent='\t', sort_keys=True)
h1 = self.loads(d1)
h2 = self.loads(d2)
@@ -42,6 +44,8 @@ class TestIndent:
self.assertEqual(h3, h)
self.assertEqual(d2, expect.expandtabs(2))
self.assertEqual(d3, expect)
+ self.assertEqual(d4, d2)
+ self.assertEqual(d5, d3)
def test_indent0(self):
h = {3: 1}
diff --git a/Lib/test/test_keyword.py b/Lib/test/test_keyword.py
new file mode 100644
index 0000000..af99f52
--- /dev/null
+++ b/Lib/test/test_keyword.py
@@ -0,0 +1,138 @@
+import keyword
+import unittest
+from test import support
+import filecmp
+import os
+import sys
+import subprocess
+import shutil
+import textwrap
+
+KEYWORD_FILE = support.findfile('keyword.py')
+GRAMMAR_FILE = os.path.join(os.path.split(__file__)[0],
+ '..', '..', 'Python', 'graminit.c')
+TEST_PY_FILE = 'keyword_test.py'
+GRAMMAR_TEST_FILE = 'graminit_test.c'
+PY_FILE_WITHOUT_KEYWORDS = 'minimal_keyword.py'
+NONEXISTENT_FILE = 'not_here.txt'
+
+
+class Test_iskeyword(unittest.TestCase):
+ def test_true_is_a_keyword(self):
+ self.assertTrue(keyword.iskeyword('True'))
+
+ def test_uppercase_true_is_not_a_keyword(self):
+ self.assertFalse(keyword.iskeyword('TRUE'))
+
+ def test_none_value_is_not_a_keyword(self):
+ self.assertFalse(keyword.iskeyword(None))
+
+ # This is probably an accident of the current implementation, but should be
+ # preserved for backward compatibility.
+ def test_changing_the_kwlist_does_not_affect_iskeyword(self):
+ oldlist = keyword.kwlist
+ self.addCleanup(setattr, keyword, 'kwlist', oldlist)
+ keyword.kwlist = ['its', 'all', 'eggs', 'beans', 'and', 'a', 'slice']
+ self.assertFalse(keyword.iskeyword('eggs'))
+
+
+class TestKeywordGeneration(unittest.TestCase):
+
+ def _copy_file_without_generated_keywords(self, source_file, dest_file):
+ with open(source_file, 'rb') as fp:
+ lines = fp.readlines()
+ nl = lines[0][len(lines[0].strip()):]
+ with open(dest_file, 'wb') as fp:
+ fp.writelines(lines[:lines.index(b"#--start keywords--" + nl) + 1])
+ fp.writelines(lines[lines.index(b"#--end keywords--" + nl):])
+
+ def _generate_keywords(self, grammar_file, target_keyword_py_file):
+ proc = subprocess.Popen([sys.executable,
+ KEYWORD_FILE,
+ grammar_file,
+ target_keyword_py_file], stderr=subprocess.PIPE)
+ stderr = proc.communicate()[1]
+ return proc.returncode, stderr
+
+ @unittest.skipIf(not os.path.exists(GRAMMAR_FILE),
+ 'test only works from source build directory')
+ def test_real_grammar_and_keyword_file(self):
+ self._copy_file_without_generated_keywords(KEYWORD_FILE, TEST_PY_FILE)
+ self.addCleanup(support.unlink, TEST_PY_FILE)
+ self.assertFalse(filecmp.cmp(KEYWORD_FILE, TEST_PY_FILE))
+ self.assertEqual((0, b''), self._generate_keywords(GRAMMAR_FILE,
+ TEST_PY_FILE))
+ self.assertTrue(filecmp.cmp(KEYWORD_FILE, TEST_PY_FILE))
+
+ def test_grammar(self):
+ self._copy_file_without_generated_keywords(KEYWORD_FILE, TEST_PY_FILE)
+ self.addCleanup(support.unlink, TEST_PY_FILE)
+ with open(GRAMMAR_TEST_FILE, 'w') as fp:
+ # Some of these are probably implementation accidents.
+ fp.writelines(textwrap.dedent("""\
+ {2, 1},
+ {11, "encoding_decl", 0, 2, states_79,
+ "\000\000\040\000\000\000\000\000\000\000\000\000"
+ "\000\000\000\000\000\000\000\000\000"},
+ {1, "jello"},
+ {326, 0},
+ {1, "turnip"},
+ \t{1, "This one is tab indented"
+ {278, 0},
+ {1, "crazy but legal"
+ "also legal" {1, "
+ {1, "continue"},
+ {1, "lemon"},
+ {1, "tomato"},
+ {1, "wigii"},
+ {1, 'no good'}
+ {283, 0},
+ {1, "too many spaces"}"""))
+ self.addCleanup(support.unlink, GRAMMAR_TEST_FILE)
+ self._generate_keywords(GRAMMAR_TEST_FILE, TEST_PY_FILE)
+ expected = [
+ " 'This one is tab indented',",
+ " 'also legal',",
+ " 'continue',",
+ " 'crazy but legal',",
+ " 'jello',",
+ " 'lemon',",
+ " 'tomato',",
+ " 'turnip',",
+ " 'wigii',",
+ ]
+ with open(TEST_PY_FILE) as fp:
+ lines = fp.read().splitlines()
+ start = lines.index("#--start keywords--") + 1
+ end = lines.index("#--end keywords--")
+ actual = lines[start:end]
+ self.assertEqual(actual, expected)
+
+ def test_empty_grammar_results_in_no_keywords(self):
+ self._copy_file_without_generated_keywords(KEYWORD_FILE,
+ PY_FILE_WITHOUT_KEYWORDS)
+ self.addCleanup(support.unlink, PY_FILE_WITHOUT_KEYWORDS)
+ shutil.copyfile(KEYWORD_FILE, TEST_PY_FILE)
+ self.addCleanup(support.unlink, TEST_PY_FILE)
+ self.assertEqual((0, b''), self._generate_keywords(os.devnull,
+ TEST_PY_FILE))
+ self.assertTrue(filecmp.cmp(TEST_PY_FILE, PY_FILE_WITHOUT_KEYWORDS))
+
+ def test_keywords_py_without_markers_produces_error(self):
+ rc, stderr = self._generate_keywords(os.devnull, os.devnull)
+ self.assertNotEqual(rc, 0)
+ self.assertRegex(stderr, b'does not contain format markers')
+
+ def test_missing_grammar_file_produces_error(self):
+ rc, stderr = self._generate_keywords(NONEXISTENT_FILE, KEYWORD_FILE)
+ self.assertNotEqual(rc, 0)
+ self.assertRegex(stderr, b'(?ms)' + NONEXISTENT_FILE.encode())
+
+ def test_missing_keywords_py_file_produces_error(self):
+ rc, stderr = self._generate_keywords(os.devnull, NONEXISTENT_FILE)
+ self.assertNotEqual(rc, 0)
+ self.assertRegex(stderr, b'(?ms)' + NONEXISTENT_FILE.encode())
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Lib/test/test_keywordonlyarg.py b/Lib/test/test_keywordonlyarg.py
index 0503a7f..e4a44c1 100644
--- a/Lib/test/test_keywordonlyarg.py
+++ b/Lib/test/test_keywordonlyarg.py
@@ -176,6 +176,18 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
return __a
self.assertEqual(X().f(), 42)
+ def test_default_evaluation_order(self):
+ # See issue 16967
+ a = 42
+ with self.assertRaises(NameError) as err:
+ def f(v=a, x=b, *, y=c, z=d):
+ pass
+ self.assertEqual(str(err.exception), "name 'b' is not defined")
+ with self.assertRaises(NameError) as err:
+ f = lambda v=a, x=b, *, y=c, z=d: None
+ self.assertEqual(str(err.exception), "name 'b' is not defined")
+
+
def test_main():
run_unittest(KeywordOnlyArgTestCase)
diff --git a/Lib/test/test_kqueue.py b/Lib/test/test_kqueue.py
index e5e6058..5b33af2 100644
--- a/Lib/test/test_kqueue.py
+++ b/Lib/test/test_kqueue.py
@@ -94,7 +94,7 @@ class TestKQueue(unittest.TestCase):
client.setblocking(False)
try:
client.connect(('127.0.0.1', serverSocket.getsockname()[1]))
- except socket.error as e:
+ except OSError as e:
self.assertEqual(e.args[0], errno.EINPROGRESS)
else:
#raise AssertionError("Connect should have raised EINPROGRESS")
diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py
index 63ee697..5b276e7 100644
--- a/Lib/test/test_largefile.py
+++ b/Lib/test/test_largefile.py
@@ -159,7 +159,7 @@ def setUpModule():
# Seeking is not enough of a test: you must write and flush, too!
f.write(b'x')
f.flush()
- except (IOError, OverflowError):
+ except (OSError, OverflowError):
raise unittest.SkipTest("filesystem does not have "
"largefile support")
finally:
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index c9a051a..63d49fe 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -26,6 +26,7 @@ import logging.handlers
import logging.config
import codecs
+import configparser
import datetime
import pickle
import io
@@ -81,7 +82,7 @@ class BaseTest(unittest.TestCase):
"""Base class for logging tests."""
log_format = "%(name)s -> %(levelname)s: %(message)s"
- expected_log_pat = r"^([\w.]+) -> ([\w]+): ([\d]+)$"
+ expected_log_pat = r"^([\w.]+) -> (\w+): (\d+)$"
message_num = 0
def setUp(self):
@@ -93,7 +94,8 @@ class BaseTest(unittest.TestCase):
self.saved_handlers = logging._handlers.copy()
self.saved_handler_list = logging._handlerList[:]
self.saved_loggers = saved_loggers = logger_dict.copy()
- self.saved_level_names = logging._levelNames.copy()
+ self.saved_name_to_level = logging._nameToLevel.copy()
+ self.saved_level_to_name = logging._levelToName.copy()
self.logger_states = logger_states = {}
for name in saved_loggers:
logger_states[name] = getattr(saved_loggers[name],
@@ -135,8 +137,10 @@ class BaseTest(unittest.TestCase):
self.root_logger.setLevel(self.original_logging_level)
logging._acquireLock()
try:
- logging._levelNames.clear()
- logging._levelNames.update(self.saved_level_names)
+ logging._levelToName.clear()
+ logging._levelToName.update(self.saved_level_to_name)
+ logging._nameToLevel.clear()
+ logging._nameToLevel.update(self.saved_name_to_level)
logging._handlers.clear()
logging._handlers.update(self.saved_handlers)
logging._handlerList[:] = self.saved_handler_list
@@ -150,14 +154,17 @@ class BaseTest(unittest.TestCase):
finally:
logging._releaseLock()
- def assert_log_lines(self, expected_values, stream=None):
+ def assert_log_lines(self, expected_values, stream=None, pat=None):
"""Match the collected log lines against the regular expression
self.expected_log_pat, and compare the extracted group values to
the expected_values list of tuples."""
stream = stream or self.stream
- pat = re.compile(self.expected_log_pat)
+ pat = re.compile(pat or self.expected_log_pat)
try:
- stream.reset()
+ if hasattr(stream, 'reset'):
+ stream.reset()
+ elif hasattr(stream, 'seek'):
+ stream.seek(0)
actual_lines = stream.readlines()
except AttributeError:
# StringIO.StringIO lacks a reset() method.
@@ -435,7 +442,7 @@ class CustomLevelsAndFiltersTest(BaseTest):
"""Test various filtering possibilities with custom logging levels."""
# Skip the logger name group.
- expected_log_pat = r"^[\w.]+ -> ([\w]+): ([\d]+)$"
+ expected_log_pat = r"^[\w.]+ -> (\w+): (\d+)$"
def setUp(self):
BaseTest.setUp(self)
@@ -565,7 +572,7 @@ class HandlerTest(BaseTest):
self.assertEqual(h.facility, h.LOG_USER)
self.assertTrue(h.unixsocket)
h.close()
- except socket.error: # syslogd might not be available
+ except OSError: # syslogd might not be available
pass
for method in ('GET', 'POST', 'PUT'):
if method == 'PUT':
@@ -652,41 +659,6 @@ class StreamHandlerTest(BaseTest):
# -- if it proves to be of wider utility than just test_logging
if threading:
- class TestSMTPChannel(smtpd.SMTPChannel):
- """
- This derived class has had to be created because smtpd does not
- support use of custom channel maps, although they are allowed by
- asyncore's design. Issue #11959 has been raised to address this,
- and if resolved satisfactorily, some of this code can be removed.
- """
- def __init__(self, server, conn, addr, sockmap):
- asynchat.async_chat.__init__(self, conn, sockmap)
- self.smtp_server = server
- self.conn = conn
- self.addr = addr
- self.data_size_limit = None
- self.received_lines = []
- self.smtp_state = self.COMMAND
- self.seen_greeting = ''
- self.mailfrom = None
- self.rcpttos = []
- self.received_data = ''
- self.fqdn = socket.getfqdn()
- self.num_bytes = 0
- try:
- self.peer = conn.getpeername()
- except socket.error as err:
- # a race condition may occur if the other end is closing
- # before we can get the peername
- self.close()
- if err.args[0] != errno.ENOTCONN:
- raise
- return
- self.push('220 %s %s' % (self.fqdn, smtpd.__version__))
- self.set_terminator(b'\r\n')
- self.extended_smtp = False
-
-
class TestSMTPServer(smtpd.SMTPServer):
"""
This class implements a test SMTP server.
@@ -707,37 +679,14 @@ if threading:
:func:`asyncore.loop`. This avoids changing the
:mod:`asyncore` module's global state.
"""
- channel_class = TestSMTPChannel
def __init__(self, addr, handler, poll_interval, sockmap):
- self._localaddr = addr
- self._remoteaddr = None
- self.data_size_limit = None
- self.sockmap = sockmap
- asyncore.dispatcher.__init__(self, map=sockmap)
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.setblocking(0)
- self.set_socket(sock, map=sockmap)
- # try to re-use a server port if possible
- self.set_reuse_addr()
- self.bind(addr)
- self.port = sock.getsockname()[1]
- self.listen(5)
- except:
- self.close()
- raise
+ smtpd.SMTPServer.__init__(self, addr, None, map=sockmap)
+ self.port = self.socket.getsockname()[1]
self._handler = handler
self._thread = None
self.poll_interval = poll_interval
- def handle_accepted(self, conn, addr):
- """
- Redefined only because the base class does not pass in a
- map, forcing use of a global in :mod:`asyncore`.
- """
- channel = self.channel_class(self, conn, addr, self.sockmap)
-
def process_message(self, peer, mailfrom, rcpttos, data):
"""
Delegates to the handler passed in to the server's constructor.
@@ -768,8 +717,8 @@ if threading:
:func:`asyncore.loop`.
"""
try:
- asyncore.loop(poll_interval, map=self.sockmap)
- except select.error:
+ asyncore.loop(poll_interval, map=self._map)
+ except OSError:
# On FreeBSD 8, closing the server repeatably
# raises this error. We swallow it if the
# server has been closed.
@@ -876,7 +825,7 @@ if threading:
sock, addr = self.socket.accept()
if self.sslctx:
sock = self.sslctx.wrap_socket(sock, server_side=True)
- except socket.error as e:
+ except OSError as e:
# socket errors are silenced by the caller, print them here
sys.stderr.write("Got an error:\n%s\n" % e)
raise
@@ -942,7 +891,7 @@ if threading:
if data:
try:
super(DelegatingUDPRequestHandler, self).finish()
- except socket.error:
+ except OSError:
if not self.server._closed:
raise
@@ -996,7 +945,7 @@ class MemoryHandlerTest(BaseTest):
"""Tests for the MemoryHandler."""
# Do not bother with a logger name group.
- expected_log_pat = r"^[\w.]+ -> ([\w]+): ([\d]+)$"
+ expected_log_pat = r"^[\w.]+ -> (\w+): (\d+)$"
def setUp(self):
BaseTest.setUp(self)
@@ -1049,7 +998,7 @@ class ConfigFileTest(BaseTest):
"""Reading logging config from a .ini-style config file."""
- expected_log_pat = r"^([\w]+) \+\+ ([\w]+)$"
+ expected_log_pat = r"^(\w+) \+\+ (\w+)$"
# config0 is a standard configuration.
config0 = """
@@ -1297,6 +1246,24 @@ class ConfigFileTest(BaseTest):
# Original logger output is empty.
self.assert_log_lines([])
+ def test_config0_using_cp_ok(self):
+ # A simple config file which overrides the default settings.
+ with captured_stdout() as output:
+ file = io.StringIO(textwrap.dedent(self.config0))
+ cp = configparser.ConfigParser()
+ cp.read_file(file)
+ logging.config.fileConfig(cp)
+ logger = logging.getLogger()
+ # Won't output anything
+ logger.info(self.next_message())
+ # Outputs a message
+ logger.error(self.next_message())
+ self.assert_log_lines([
+ ('ERROR', '2'),
+ ], stream=output)
+ # Original logger output is empty.
+ self.assert_log_lines([])
+
def test_config1_ok(self, config=config1):
# A config file defining a sub-parser as well.
with captured_stdout() as output:
@@ -1449,16 +1416,19 @@ class SocketHandlerTest(BaseTest):
self.assertEqual(self.log_output, "spam\neggs\n")
def test_noserver(self):
+ # Avoid timing-related failures due to SocketHandler's own hard-wired
+ # one-second timeout on socket.create_connection() (issue #16264).
+ self.sock_hdlr.retryStart = 2.5
# Kill the server
self.server.stop(2.0)
- #The logging call should try to connect, which should fail
+ # The logging call should try to connect, which should fail
try:
raise RuntimeError('Deliberate mistake')
except RuntimeError:
self.root_logger.exception('Never sent')
self.root_logger.error('Never sent, either')
now = time.time()
- self.assertTrue(self.sock_hdlr.retryTime > now)
+ self.assertGreater(self.sock_hdlr.retryTime, now)
time.sleep(self.sock_hdlr.retryTime - now + 0.001)
self.root_logger.error('Nor this')
@@ -1784,7 +1754,7 @@ class WarningsTest(BaseTest):
logger.removeHandler(h)
s = stream.getvalue()
h.close()
- self.assertTrue(s.find("UserWarning: I'm warning you...\n") > 0)
+ self.assertGreater(s.find("UserWarning: I'm warning you...\n"), 0)
#See if an explicit file uses the original implementation
a_file = io.StringIO()
@@ -1822,7 +1792,7 @@ class ConfigDictTest(BaseTest):
"""Reading logging config from a dictionary."""
- expected_log_pat = r"^([\w]+) \+\+ ([\w]+)$"
+ expected_log_pat = r"^(\w+) \+\+ (\w+)$"
# config0 is a standard configuration.
config0 = {
@@ -2394,6 +2364,32 @@ class ConfigDictTest(BaseTest):
},
}
+ # As config0, but with properties
+ config14 = {
+ 'version': 1,
+ 'formatters': {
+ 'form1' : {
+ 'format' : '%(levelname)s ++ %(message)s',
+ },
+ },
+ 'handlers' : {
+ 'hand1' : {
+ 'class' : 'logging.StreamHandler',
+ 'formatter' : 'form1',
+ 'level' : 'NOTSET',
+ 'stream' : 'ext://sys.stdout',
+ '.': {
+ 'foo': 'bar',
+ 'terminator': '!\n',
+ }
+ },
+ },
+ 'root' : {
+ 'level' : 'WARNING',
+ 'handlers' : ['hand1'],
+ },
+ }
+
out_of_order = {
"version": 1,
"formatters": {
@@ -2661,11 +2657,20 @@ class ConfigDictTest(BaseTest):
def test_config13_failure(self):
self.assertRaises(Exception, self.apply_config, self.config13)
+ def test_config14_ok(self):
+ with captured_stdout() as output:
+ self.apply_config(self.config14)
+ h = logging._handlers['hand1']
+ self.assertEqual(h.foo, 'bar')
+ self.assertEqual(h.terminator, '!\n')
+ logging.warning('Exclamation')
+ self.assertTrue(output.getvalue().endswith('Exclamation!\n'))
+
@unittest.skipUnless(threading, 'listen() needs threading to work')
- def setup_via_listener(self, text):
+ def setup_via_listener(self, text, verify=None):
text = text.encode("utf-8")
# Ask for a randomly assigned port (by using port 0)
- t = logging.config.listen(0)
+ t = logging.config.listen(0, verify)
t.start()
t.ready.wait()
# Now get the port allocated
@@ -2725,6 +2730,69 @@ class ConfigDictTest(BaseTest):
# Original logger output is empty.
self.assert_log_lines([])
+ @unittest.skipUnless(threading, 'Threading required for this test.')
+ def test_listen_verify(self):
+
+ def verify_fail(stuff):
+ return None
+
+ def verify_reverse(stuff):
+ return stuff[::-1]
+
+ logger = logging.getLogger("compiler.parser")
+ to_send = textwrap.dedent(ConfigFileTest.config1)
+ # First, specify a verification function that will fail.
+ # We expect to see no output, since our configuration
+ # never took effect.
+ with captured_stdout() as output:
+ self.setup_via_listener(to_send, verify_fail)
+ # Both will output a message
+ logger.info(self.next_message())
+ logger.error(self.next_message())
+ self.assert_log_lines([], stream=output)
+ # Original logger output has the stuff we logged.
+ self.assert_log_lines([
+ ('INFO', '1'),
+ ('ERROR', '2'),
+ ], pat=r"^[\w.]+ -> (\w+): (\d+)$")
+
+ # Now, perform no verification. Our configuration
+ # should take effect.
+
+ with captured_stdout() as output:
+ self.setup_via_listener(to_send) # no verify callable specified
+ logger = logging.getLogger("compiler.parser")
+ # Both will output a message
+ logger.info(self.next_message())
+ logger.error(self.next_message())
+ self.assert_log_lines([
+ ('INFO', '3'),
+ ('ERROR', '4'),
+ ], stream=output)
+ # Original logger output still has the stuff we logged before.
+ self.assert_log_lines([
+ ('INFO', '1'),
+ ('ERROR', '2'),
+ ], pat=r"^[\w.]+ -> (\w+): (\d+)$")
+
+ # Now, perform verification which transforms the bytes.
+
+ with captured_stdout() as output:
+ self.setup_via_listener(to_send[::-1], verify_reverse)
+ logger = logging.getLogger("compiler.parser")
+ # Both will output a message
+ logger.info(self.next_message())
+ logger.error(self.next_message())
+ self.assert_log_lines([
+ ('INFO', '5'),
+ ('ERROR', '6'),
+ ], stream=output)
+ # Original logger output still has the stuff we logged before.
+ self.assert_log_lines([
+ ('INFO', '1'),
+ ('ERROR', '2'),
+ ], pat=r"^[\w.]+ -> (\w+): (\d+)$")
+
def test_out_of_order(self):
self.apply_config(self.out_of_order)
handler = logging.getLogger('mymodule').handlers[0]
@@ -2784,14 +2852,14 @@ class ChildLoggerTest(BaseTest):
l2 = logging.getLogger('def.ghi')
c1 = r.getChild('xyz')
c2 = r.getChild('uvw.xyz')
- self.assertTrue(c1 is logging.getLogger('xyz'))
- self.assertTrue(c2 is logging.getLogger('uvw.xyz'))
+ self.assertIs(c1, logging.getLogger('xyz'))
+ self.assertIs(c2, logging.getLogger('uvw.xyz'))
c1 = l1.getChild('def')
c2 = c1.getChild('ghi')
c3 = l1.getChild('def.ghi')
- self.assertTrue(c1 is logging.getLogger('abc.def'))
- self.assertTrue(c2 is logging.getLogger('abc.def.ghi'))
- self.assertTrue(c2 is c3)
+ self.assertIs(c1, logging.getLogger('abc.def'))
+ self.assertIs(c2, logging.getLogger('abc.def.ghi'))
+ self.assertIs(c2, c3)
class DerivedLogRecord(logging.LogRecord):
@@ -2834,7 +2902,7 @@ class LogRecordFactoryTest(BaseTest):
class QueueHandlerTest(BaseTest):
# Do not bother with a logger name group.
- expected_log_pat = r"^[\w.]+ -> ([\w]+): ([\d]+)$"
+ expected_log_pat = r"^[\w.]+ -> (\w+): (\d+)$"
def setUp(self):
BaseTest.setUp(self)
@@ -3128,13 +3196,13 @@ class ShutdownTest(BaseTest):
self.assertEqual('0 - release', self.called[-1])
def test_with_ioerror_in_acquire(self):
- self._test_with_failure_in_method('acquire', IOError)
+ self._test_with_failure_in_method('acquire', OSError)
def test_with_ioerror_in_flush(self):
- self._test_with_failure_in_method('flush', IOError)
+ self._test_with_failure_in_method('flush', OSError)
def test_with_ioerror_in_close(self):
- self._test_with_failure_in_method('close', IOError)
+ self._test_with_failure_in_method('close', OSError)
def test_with_valueerror_in_acquire(self):
self._test_with_failure_in_method('acquire', ValueError)
@@ -3341,6 +3409,12 @@ class BasicConfigTest(unittest.TestCase):
self.assertEqual(logging.root.level, self.original_logging_level)
def test_filename(self):
+
+ def cleanup(h1, h2, fn):
+ h1.close()
+ h2.close()
+ os.remove(fn)
+
logging.basicConfig(filename='test.log')
self.assertEqual(len(logging.root.handlers), 1)
@@ -3348,17 +3422,23 @@ class BasicConfigTest(unittest.TestCase):
self.assertIsInstance(handler, logging.FileHandler)
expected = logging.FileHandler('test.log', 'a')
- self.addCleanup(expected.close)
self.assertEqual(handler.stream.mode, expected.stream.mode)
self.assertEqual(handler.stream.name, expected.stream.name)
+ self.addCleanup(cleanup, handler, expected, 'test.log')
def test_filemode(self):
+
+ def cleanup(h1, h2, fn):
+ h1.close()
+ h2.close()
+ os.remove(fn)
+
logging.basicConfig(filename='test.log', filemode='wb')
handler = logging.root.handlers[0]
expected = logging.FileHandler('test.log', 'wb')
- self.addCleanup(expected.close)
self.assertEqual(handler.stream.mode, expected.stream.mode)
+ self.addCleanup(cleanup, handler, expected, 'test.log')
def test_stream(self):
stream = io.StringIO()
@@ -3814,6 +3894,63 @@ class TimedRotatingFileHandlerTest(BaseFileTest):
assertRaises(ValueError, logging.handlers.TimedRotatingFileHandler,
self.fn, 'W7', delay=True)
+ def test_compute_rollover_daily_attime(self):
+ currentTime = 0
+ atTime = datetime.time(12, 0, 0)
+ rh = logging.handlers.TimedRotatingFileHandler(
+ self.fn, when='MIDNIGHT', interval=1, backupCount=0, utc=True,
+ atTime=atTime)
+ try:
+ actual = rh.computeRollover(currentTime)
+ self.assertEqual(actual, currentTime + 12 * 60 * 60)
+
+ actual = rh.computeRollover(currentTime + 13 * 60 * 60)
+ self.assertEqual(actual, currentTime + 36 * 60 * 60)
+ finally:
+ rh.close()
+
+ #@unittest.skipIf(True, 'Temporarily skipped while failures investigated.')
+ def test_compute_rollover_weekly_attime(self):
+ currentTime = int(time.time())
+ today = currentTime - currentTime % 86400
+
+ atTime = datetime.time(12, 0, 0)
+
+ wday = time.gmtime(today).tm_wday
+ for day in range(7):
+ rh = logging.handlers.TimedRotatingFileHandler(
+ self.fn, when='W%d' % day, interval=1, backupCount=0, utc=True,
+ atTime=atTime)
+ try:
+ if wday > day:
+ # The rollover day has already passed this week, so we
+ # go over into next week
+ expected = (7 - wday + day)
+ else:
+ expected = (day - wday)
+ # At this point expected is in days from now, convert to seconds
+ expected *= 24 * 60 * 60
+ # Add in the rollover time
+ expected += 12 * 60 * 60
+ # Add in adjustment for today
+ expected += today
+ actual = rh.computeRollover(today)
+ if actual != expected:
+ print('failed in timezone: %d' % time.timezone)
+ print('local vars: %s' % locals())
+ self.assertEqual(actual, expected)
+ if day == wday:
+ # goes into following week
+ expected += 7 * 24 * 60 * 60
+ actual = rh.computeRollover(today + 13 * 60 * 60)
+ if actual != expected:
+ print('failed in timezone: %d' % time.timezone)
+ print('local vars: %s' % locals())
+ self.assertEqual(actual, expected)
+ finally:
+ rh.close()
+
+
def secs(**kw):
return datetime.timedelta(**kw) // datetime.timedelta(seconds=1)
@@ -3872,7 +4009,7 @@ class NTEventLogHandlerTest(BaseTest):
h.handle(r)
h.close()
# Now see if the event is recorded
- self.assertTrue(num_recs < win32evtlog.GetNumberOfEventLogRecords(elh))
+ self.assertLess(num_recs, win32evtlog.GetNumberOfEventLogRecords(elh))
flags = win32evtlog.EVENTLOG_BACKWARDS_READ | \
win32evtlog.EVENTLOG_SEQUENTIAL_READ
found = False
diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index b417bea..b598192 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -1086,7 +1086,7 @@ class LongTest(unittest.TestCase):
self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True)
self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False)
self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True)
- self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False),
+ self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False)
self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False)
self.assertEqual((0).to_bytes(0, 'big'), b'')
self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01')
diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py
index a13cf3b..20d8582 100644
--- a/Lib/test/test_lzma.py
+++ b/Lib/test/test_lzma.py
@@ -669,6 +669,20 @@ class FileTestCase(unittest.TestCase):
with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
self.assertRaises(EOFError, f.read)
+ def test_read_truncated(self):
+ # Drop stream footer: CRC (4 bytes), index size (4 bytes),
+ # flags (2 bytes) and magic number (2 bytes).
+ truncated = COMPRESSED_XZ[:-12]
+ with LZMAFile(BytesIO(truncated)) as f:
+ self.assertRaises(EOFError, f.read)
+ with LZMAFile(BytesIO(truncated)) as f:
+ self.assertEqual(f.read(len(INPUT)), INPUT)
+ self.assertRaises(EOFError, f.read, 1)
+ # Incomplete 12-byte header.
+ for i in range(12):
+ with LZMAFile(BytesIO(truncated[:i])) as f:
+ self.assertRaises(EOFError, f.read, 1)
+
def test_read_bad_args(self):
f = LZMAFile(BytesIO(COMPRESSED_XZ))
f.close()
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
index 39e8643..6c679ce 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -596,7 +596,7 @@ class TestMaildir(TestMailbox, unittest.TestCase):
def setUp(self):
TestMailbox.setUp(self)
- if os.name in ('nt', 'os2') or sys.platform == 'cygwin':
+ if (os.name == 'nt') or (sys.platform == 'cygwin'):
self._box.colon = '!'
def assertMailboxEmpty(self):
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
index 7e37f39..ab06237 100644
--- a/Lib/test/test_marshal.py
+++ b/Lib/test/test_marshal.py
@@ -24,37 +24,13 @@ class HelperMixin:
class IntTestCase(unittest.TestCase, HelperMixin):
def test_ints(self):
- # Test the full range of Python ints.
- n = sys.maxsize
+ # Test a range of Python ints larger than the machine word size.
+ n = sys.maxsize ** 2
while n:
for expected in (-n, n):
self.helper(expected)
n = n >> 1
- def test_int64(self):
- # Simulate int marshaling on a 64-bit box. This is most interesting if
- # we're running the test on a 32-bit box, of course.
-
- def to_little_endian_string(value, nbytes):
- b = bytearray()
- for i in range(nbytes):
- b.append(value & 0xff)
- value >>= 8
- return b
-
- maxint64 = (1 << 63) - 1
- minint64 = -maxint64-1
-
- for base in maxint64, minint64, -maxint64, -(minint64 >> 1):
- while base:
- s = b'I' + to_little_endian_string(base, 8)
- got = marshal.loads(s)
- self.assertEqual(base, got)
- if base == -1: # a fixed-point for shifting right 1
- base = 0
- else:
- base >>= 1
-
def test_bool(self):
for b in (True, False):
self.helper(b)
@@ -201,10 +177,14 @@ class BugsTestCase(unittest.TestCase):
except Exception:
pass
- def test_loads_recursion(self):
+ def test_loads_2x_code(self):
s = b'c' + (b'X' * 4*4) + b'{' * 2**20
self.assertRaises(ValueError, marshal.loads, s)
+ def test_loads_recursion(self):
+ s = b'c' + (b'X' * 4*5) + b'{' * 2**20
+ self.assertRaises(ValueError, marshal.loads, s)
+
def test_recursion_limit(self):
# Create a deeply nested structure.
head = last = []
@@ -291,6 +271,11 @@ class BugsTestCase(unittest.TestCase):
self.assertRaises(ValueError, marshal.load,
BadReader(marshal.dumps(value)))
+ def _test_eof(self):
+ data = marshal.dumps(("hello", "dolly", None))
+ for i in range(len(data)):
+ self.assertRaises(EOFError, marshal.loads, data[0: i])
+
LARGE_SIZE = 2**31
pointer_size = 8 if sys.maxsize > 0xFFFFFFFF else 4
@@ -335,6 +320,122 @@ class LargeValuesTestCase(unittest.TestCase):
def test_bytearray(self, size):
self.check_unmarshallable(bytearray(size))
+def CollectObjectIDs(ids, obj):
+ """Collect object ids seen in a structure"""
+ if id(obj) in ids:
+ return
+ ids.add(id(obj))
+ if isinstance(obj, (list, tuple, set, frozenset)):
+ for e in obj:
+ CollectObjectIDs(ids, e)
+ elif isinstance(obj, dict):
+ for k, v in obj.items():
+ CollectObjectIDs(ids, k)
+ CollectObjectIDs(ids, v)
+ return len(ids)
+
+class InstancingTestCase(unittest.TestCase, HelperMixin):
+ intobj = 123321
+ floatobj = 1.2345
+ strobj = "abcde"*3
+ dictobj = {"hello":floatobj, "goodbye":floatobj, floatobj:"hello"}
+
+ def helper3(self, rsample, recursive=False, simple=False):
+ #we have two instances
+ sample = (rsample, rsample)
+
+ n0 = CollectObjectIDs(set(), sample)
+
+ s3 = marshal.dumps(sample, 3)
+ n3 = CollectObjectIDs(set(), marshal.loads(s3))
+
+ #same number of instances generated
+ self.assertEqual(n3, n0)
+
+ if not recursive:
+ #can compare with version 2
+ s2 = marshal.dumps(sample, 2)
+ n2 = CollectObjectIDs(set(), marshal.loads(s2))
+ #old format generated more instances
+ self.assertGreater(n2, n0)
+
+ #if complex objects are in there, old format is larger
+ if not simple:
+ self.assertGreater(len(s2), len(s3))
+ else:
+ self.assertGreaterEqual(len(s2), len(s3))
+
+ def testInt(self):
+ self.helper(self.intobj)
+ self.helper3(self.intobj, simple=True)
+
+ def testFloat(self):
+ self.helper(self.floatobj)
+ self.helper3(self.floatobj)
+
+ def testStr(self):
+ self.helper(self.strobj)
+ self.helper3(self.strobj)
+
+ def testDict(self):
+ self.helper(self.dictobj)
+ self.helper3(self.dictobj)
+
+ def testModule(self):
+ with open(__file__, "rb") as f:
+ code = f.read()
+ if __file__.endswith(".py"):
+ code = compile(code, __file__, "exec")
+ self.helper(code)
+ self.helper3(code)
+
+ def testRecursion(self):
+ d = dict(self.dictobj)
+ d["self"] = d
+ self.helper3(d, recursive=True)
+ l = [self.dictobj]
+ l.append(l)
+ self.helper3(l, recursive=True)
+
+class CompatibilityTestCase(unittest.TestCase):
+ def _test(self, version):
+ with open(__file__, "rb") as f:
+ code = f.read()
+ if __file__.endswith(".py"):
+ code = compile(code, __file__, "exec")
+ data = marshal.dumps(code, version)
+ marshal.loads(data)
+
+ def test0To3(self):
+ self._test(0)
+
+ def test1To3(self):
+ self._test(1)
+
+ def test2To3(self):
+ self._test(2)
+
+ def test3To3(self):
+ self._test(3)
+
+class InterningTestCase(unittest.TestCase, HelperMixin):
+ strobj = "this is an interned string"
+ strobj = sys.intern(strobj)
+
+ def testIntern(self):
+ s = marshal.loads(marshal.dumps(self.strobj))
+ self.assertEqual(s, self.strobj)
+ self.assertEqual(id(s), id(self.strobj))
+ s2 = sys.intern(s)
+ self.assertEqual(id(s2), id(s))
+
+ def testNoIntern(self):
+ s = marshal.loads(marshal.dumps(self.strobj, 2))
+ self.assertEqual(s, self.strobj)
+ self.assertNotEqual(id(s), id(self.strobj))
+ s2 = sys.intern(s)
+ self.assertNotEqual(id(s2), id(s))
+
def test_main():
support.run_unittest(IntTestCase,
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py
index d611a31..4de4f65 100644
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -520,12 +520,12 @@ class TextIOTestMixin:
def test_relative_seek(self):
memio = self.ioclass()
- self.assertRaises(IOError, memio.seek, -1, 1)
- self.assertRaises(IOError, memio.seek, 3, 1)
- self.assertRaises(IOError, memio.seek, -3, 1)
- self.assertRaises(IOError, memio.seek, -1, 2)
- self.assertRaises(IOError, memio.seek, 1, 1)
- self.assertRaises(IOError, memio.seek, 1, 2)
+ self.assertRaises(OSError, memio.seek, -1, 1)
+ self.assertRaises(OSError, memio.seek, 3, 1)
+ self.assertRaises(OSError, memio.seek, -3, 1)
+ self.assertRaises(OSError, memio.seek, -1, 2)
+ self.assertRaises(OSError, memio.seek, 1, 1)
+ self.assertRaises(OSError, memio.seek, 1, 2)
def test_textio_properties(self):
memio = self.ioclass()
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index d066368..b1cc973 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -1,11 +1,12 @@
from test.support import (TESTFN, run_unittest, import_module, unlink,
- requires, _2G, _4G)
+ requires, _2G, _4G, gc_collect)
import unittest
import os
import re
import itertools
import socket
import sys
+import weakref
# Skip test if we can't import mmap.
mmap = import_module('mmap')
@@ -245,7 +246,7 @@ class MmapTests(unittest.TestCase):
def test_bad_file_desc(self):
# Try opening a bad file descriptor...
- self.assertRaises(mmap.error, mmap.mmap, -2, 4096)
+ self.assertRaises(OSError, mmap.mmap, -2, 4096)
def test_tougher_find(self):
# Do a tougher .find() test. SF bug 515943 pointed out that, in 2.2,
@@ -658,7 +659,7 @@ class MmapTests(unittest.TestCase):
m = mmap.mmap(f.fileno(), 0)
f.close()
try:
- m.resize(0) # will raise WindowsError
+ m.resize(0) # will raise OSError
except:
pass
try:
@@ -673,7 +674,7 @@ class MmapTests(unittest.TestCase):
# parameters to _get_osfhandle.
s = socket.socket()
try:
- with self.assertRaises(mmap.error):
+ with self.assertRaises(OSError):
m = mmap.mmap(s.fileno(), 10)
finally:
s.close()
@@ -684,14 +685,23 @@ class MmapTests(unittest.TestCase):
self.assertTrue(m.closed)
def test_context_manager_exception(self):
- # Test that the IOError gets passed through
+ # Test that the OSError gets passed through
with self.assertRaises(Exception) as exc:
with mmap.mmap(-1, 10) as m:
- raise IOError
- self.assertIsInstance(exc.exception, IOError,
+ raise OSError
+ self.assertIsInstance(exc.exception, OSError,
"wrong exception raised in context manager")
self.assertTrue(m.closed, "context manager failed")
+ def test_weakref(self):
+ # Check mmap objects are weakrefable
+ mm = mmap.mmap(-1, 16)
+ wr = weakref.ref(mm)
+ self.assertIs(wr(), mm)
+ del mm
+ gc_collect()
+ self.assertIs(wr(), None)
+
class LargeMmapTests(unittest.TestCase):
def setUp(self):
@@ -709,7 +719,7 @@ class LargeMmapTests(unittest.TestCase):
f.seek(num_zeroes)
f.write(tail)
f.flush()
- except (IOError, OverflowError):
+ except (OSError, OverflowError):
f.close()
raise unittest.SkipTest("filesystem does not have largefile support")
return f
diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py
index e5a2525..5a9b503 100644
--- a/Lib/test/test_module.py
+++ b/Lib/test/test_module.py
@@ -1,6 +1,8 @@
# Test the module type
import unittest
+import weakref
from test.support import run_unittest, gc_collect
+from test.script_helper import assert_python_ok
import sys
ModuleType = type(sys)
@@ -33,7 +35,10 @@ class ModuleTests(unittest.TestCase):
foo = ModuleType("foo")
self.assertEqual(foo.__name__, "foo")
self.assertEqual(foo.__doc__, None)
- self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None})
+ self.assertIs(foo.__loader__, None)
+ self.assertIs(foo.__package__, None)
+ self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None,
+ "__loader__": None, "__package__": None})
def test_ascii_docstring(self):
# ASCII docstring
@@ -41,7 +46,8 @@ class ModuleTests(unittest.TestCase):
self.assertEqual(foo.__name__, "foo")
self.assertEqual(foo.__doc__, "foodoc")
self.assertEqual(foo.__dict__,
- {"__name__": "foo", "__doc__": "foodoc"})
+ {"__name__": "foo", "__doc__": "foodoc",
+ "__loader__": None, "__package__": None})
def test_unicode_docstring(self):
# Unicode docstring
@@ -49,7 +55,8 @@ class ModuleTests(unittest.TestCase):
self.assertEqual(foo.__name__, "foo")
self.assertEqual(foo.__doc__, "foodoc\u1234")
self.assertEqual(foo.__dict__,
- {"__name__": "foo", "__doc__": "foodoc\u1234"})
+ {"__name__": "foo", "__doc__": "foodoc\u1234",
+ "__loader__": None, "__package__": None})
def test_reinit(self):
# Reinitialization should not replace the __dict__
@@ -61,10 +68,10 @@ class ModuleTests(unittest.TestCase):
self.assertEqual(foo.__doc__, "foodoc")
self.assertEqual(foo.bar, 42)
self.assertEqual(foo.__dict__,
- {"__name__": "foo", "__doc__": "foodoc", "bar": 42})
+ {"__name__": "foo", "__doc__": "foodoc", "bar": 42,
+ "__loader__": None, "__package__": None})
self.assertTrue(foo.__dict__ is d)
- @unittest.expectedFailure
def test_dont_clear_dict(self):
# See issue 7140.
def f():
@@ -89,6 +96,14 @@ a = A(destroyed)"""
gc_collect()
self.assertEqual(destroyed, [1])
+ def test_weakref(self):
+ m = ModuleType("foo")
+ wr = weakref.ref(m)
+ self.assertIs(wr(), m)
+ del m
+ gc_collect()
+ self.assertIs(wr(), None)
+
def test_module_repr_minimal(self):
# reprs when modules have no __file__, __name__, or __loader__
m = ModuleType('foo')
@@ -110,13 +125,19 @@ a = A(destroyed)"""
m.__file__ = '/tmp/foo.py'
self.assertEqual(repr(m), "<module '?' from '/tmp/foo.py'>")
+ def test_module_repr_with_loader_as_None(self):
+ m = ModuleType('foo')
+ assert m.__loader__ is None
+ self.assertEqual(repr(m), "<module 'foo'>")
+
def test_module_repr_with_bare_loader_but_no_name(self):
m = ModuleType('foo')
del m.__name__
# Yes, a class not an instance.
m.__loader__ = BareLoader
+ loader_repr = repr(BareLoader)
self.assertEqual(
- repr(m), "<module '?' (<class 'test.test_module.BareLoader'>)>")
+ repr(m), "<module '?' ({})>".format(loader_repr))
def test_module_repr_with_full_loader_but_no_name(self):
# m.__loader__.module_repr() will fail because the module has no
@@ -126,15 +147,17 @@ a = A(destroyed)"""
del m.__name__
# Yes, a class not an instance.
m.__loader__ = FullLoader
+ loader_repr = repr(FullLoader)
self.assertEqual(
- repr(m), "<module '?' (<class 'test.test_module.FullLoader'>)>")
+ repr(m), "<module '?' ({})>".format(loader_repr))
def test_module_repr_with_bare_loader(self):
m = ModuleType('foo')
# Yes, a class not an instance.
m.__loader__ = BareLoader
+ module_repr = repr(BareLoader)
self.assertEqual(
- repr(m), "<module 'foo' (<class 'test.test_module.BareLoader'>)>")
+ repr(m), "<module 'foo' ({})>".format(module_repr))
def test_module_repr_with_full_loader(self):
m = ModuleType('foo')
@@ -167,6 +190,19 @@ a = A(destroyed)"""
self.assertEqual(r[:25], "<module 'unittest' from '")
self.assertEqual(r[-13:], "__init__.py'>")
+ def test_module_finalization_at_shutdown(self):
+ # Module globals and builtins should still be available during shutdown
+ rc, out, err = assert_python_ok("-c", "from test import final_a")
+ self.assertFalse(err)
+ lines = out.splitlines()
+ self.assertEqual(set(lines), {
+ b"x = a",
+ b"x = b",
+ b"final_a.x = a",
+ b"final_b.x = b",
+ b"len = len",
+ b"shutil.rmtree = rmtree"})
+
# frozen and namespace module reprs are tested in importlib.
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py
index feb7bd5..91148a6 100644
--- a/Lib/test/test_multibytecodec.py
+++ b/Lib/test/test_multibytecodec.py
@@ -176,57 +176,28 @@ class Test_StreamReader(unittest.TestCase):
support.unlink(TESTFN)
class Test_StreamWriter(unittest.TestCase):
- if len('\U00012345') == 2: # UCS2
- def test_gb18030(self):
- s= io.BytesIO()
- c = codecs.getwriter('gb18030')(s)
- c.write('123')
- self.assertEqual(s.getvalue(), b'123')
- c.write('\U00012345')
- self.assertEqual(s.getvalue(), b'123\x907\x959')
- c.write('\U00012345'[0])
- self.assertEqual(s.getvalue(), b'123\x907\x959')
- c.write('\U00012345'[1] + '\U00012345' + '\uac00\u00ac')
- self.assertEqual(s.getvalue(),
- b'123\x907\x959\x907\x959\x907\x959\x827\xcf5\x810\x851')
- c.write('\U00012345'[0])
- self.assertEqual(s.getvalue(),
- b'123\x907\x959\x907\x959\x907\x959\x827\xcf5\x810\x851')
- self.assertRaises(UnicodeError, c.reset)
- self.assertEqual(s.getvalue(),
- b'123\x907\x959\x907\x959\x907\x959\x827\xcf5\x810\x851')
-
- def test_utf_8(self):
- s= io.BytesIO()
- c = codecs.getwriter('utf-8')(s)
- c.write('123')
- self.assertEqual(s.getvalue(), b'123')
- c.write('\U00012345')
- self.assertEqual(s.getvalue(), b'123\xf0\x92\x8d\x85')
-
- # Python utf-8 codec can't buffer surrogate pairs yet.
- if 0:
- c.write('\U00012345'[0])
- self.assertEqual(s.getvalue(), b'123\xf0\x92\x8d\x85')
- c.write('\U00012345'[1] + '\U00012345' + '\uac00\u00ac')
- self.assertEqual(s.getvalue(),
- b'123\xf0\x92\x8d\x85\xf0\x92\x8d\x85\xf0\x92\x8d\x85'
- b'\xea\xb0\x80\xc2\xac')
- c.write('\U00012345'[0])
- self.assertEqual(s.getvalue(),
- b'123\xf0\x92\x8d\x85\xf0\x92\x8d\x85\xf0\x92\x8d\x85'
- b'\xea\xb0\x80\xc2\xac')
- c.reset()
- self.assertEqual(s.getvalue(),
- b'123\xf0\x92\x8d\x85\xf0\x92\x8d\x85\xf0\x92\x8d\x85'
- b'\xea\xb0\x80\xc2\xac\xed\xa0\x88')
- c.write('\U00012345'[1])
- self.assertEqual(s.getvalue(),
- b'123\xf0\x92\x8d\x85\xf0\x92\x8d\x85\xf0\x92\x8d\x85'
- b'\xea\xb0\x80\xc2\xac\xed\xa0\x88\xed\xbd\x85')
-
- else: # UCS4
- pass
+ def test_gb18030(self):
+ s= io.BytesIO()
+ c = codecs.getwriter('gb18030')(s)
+ c.write('123')
+ self.assertEqual(s.getvalue(), b'123')
+ c.write('\U00012345')
+ self.assertEqual(s.getvalue(), b'123\x907\x959')
+ c.write('\uac00\u00ac')
+ self.assertEqual(s.getvalue(),
+ b'123\x907\x959\x827\xcf5\x810\x851')
+
+ def test_utf_8(self):
+ s= io.BytesIO()
+ c = codecs.getwriter('utf-8')(s)
+ c.write('123')
+ self.assertEqual(s.getvalue(), b'123')
+ c.write('\U00012345')
+ self.assertEqual(s.getvalue(), b'123\xf0\x92\x8d\x85')
+ c.write('\uac00\u00ac')
+ self.assertEqual(s.getvalue(),
+ b'123\xf0\x92\x8d\x85'
+ b'\xea\xb0\x80\xc2\xac')
def test_streamwriter_strwrite(self):
s = io.BytesIO()
diff --git a/Lib/test/test_multiprocessing_fork.py b/Lib/test/test_multiprocessing_fork.py
new file mode 100644
index 0000000..2bf4e75
--- /dev/null
+++ b/Lib/test/test_multiprocessing_fork.py
@@ -0,0 +1,7 @@
+import unittest
+import test._test_multiprocessing
+
+test._test_multiprocessing.install_tests_in_module_dict(globals(), 'fork')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_multiprocessing_forkserver.py b/Lib/test/test_multiprocessing_forkserver.py
new file mode 100644
index 0000000..193a04a
--- /dev/null
+++ b/Lib/test/test_multiprocessing_forkserver.py
@@ -0,0 +1,7 @@
+import unittest
+import test._test_multiprocessing
+
+test._test_multiprocessing.install_tests_in_module_dict(globals(), 'forkserver')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_multiprocessing_spawn.py b/Lib/test/test_multiprocessing_spawn.py
new file mode 100644
index 0000000..334ae9e
--- /dev/null
+++ b/Lib/test/test_multiprocessing_spawn.py
@@ -0,0 +1,7 @@
+import unittest
+import test._test_multiprocessing
+
+test._test_multiprocessing.install_tests_in_module_dict(globals(), 'spawn')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_namespace_pkgs.py b/Lib/test/test_namespace_pkgs.py
index 7067b12..4570bee 100644
--- a/Lib/test/test_namespace_pkgs.py
+++ b/Lib/test/test_namespace_pkgs.py
@@ -1,7 +1,11 @@
-import sys
import contextlib
-import unittest
+from importlib._bootstrap import NamespaceLoader
+import importlib.abc
+import importlib.machinery
import os
+import sys
+import types
+import unittest
from test.test_importlib import util
from test.support import run_unittest
@@ -286,9 +290,24 @@ class ModuleAndNamespacePackageInSameDir(NamespacePackageTest):
self.assertEqual(a_test.attr, 'in module')
-def test_main():
- run_unittest(*NamespacePackageTest.__subclasses__())
+class ABCTests(unittest.TestCase):
+
+ def setUp(self):
+ self.loader = NamespaceLoader('foo', ['pkg'],
+ importlib.machinery.PathFinder)
+
+ def test_is_package(self):
+ self.assertTrue(self.loader.is_package('foo'))
+
+ def test_get_code(self):
+ self.assertTrue(isinstance(self.loader.get_code('foo'), types.CodeType))
+
+ def test_get_source(self):
+ self.assertEqual(self.loader.get_source('foo'), '')
+
+ def test_abc_isinstance(self):
+ self.assertTrue(isinstance(self.loader, importlib.abc.InspectLoader))
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py
index 19fb10a..7cf497a 100644
--- a/Lib/test/test_nntplib.py
+++ b/Lib/test/test_nntplib.py
@@ -264,7 +264,7 @@ class NetworkedNNTPTestsMixin:
return False
try:
server.help()
- except (socket.error, EOFError):
+ except (OSError, EOFError):
return False
return True
diff --git a/Lib/test/test_normalization.py b/Lib/test/test_normalization.py
index 28ede34..ab2eeb7 100644
--- a/Lib/test/test_normalization.py
+++ b/Lib/test/test_normalization.py
@@ -43,7 +43,7 @@ class NormalizationTest(unittest.TestCase):
try:
testdata = open_urlresource(TESTDATAURL, encoding="utf-8",
check=check_version)
- except (IOError, HTTPException):
+ except (OSError, HTTPException):
self.skipTest("Could not retrieve " + TESTDATAURL)
self.addCleanup(testdata.close)
for line in testdata:
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index f809876..285ef62 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -256,6 +256,40 @@ class TestNtpath(unittest.TestCase):
# dialogs (#4804)
ntpath.sameopenfile(-1, -1)
+ def test_ismount(self):
+ self.assertTrue(ntpath.ismount("c:\\"))
+ self.assertTrue(ntpath.ismount("C:\\"))
+ self.assertTrue(ntpath.ismount("c:/"))
+ self.assertTrue(ntpath.ismount("C:/"))
+ self.assertTrue(ntpath.ismount("\\\\.\\c:\\"))
+ self.assertTrue(ntpath.ismount("\\\\.\\C:\\"))
+
+ self.assertTrue(ntpath.ismount(b"c:\\"))
+ self.assertTrue(ntpath.ismount(b"C:\\"))
+ self.assertTrue(ntpath.ismount(b"c:/"))
+ self.assertTrue(ntpath.ismount(b"C:/"))
+ self.assertTrue(ntpath.ismount(b"\\\\.\\c:\\"))
+ self.assertTrue(ntpath.ismount(b"\\\\.\\C:\\"))
+
+ with support.temp_dir() as d:
+ self.assertFalse(ntpath.ismount(d))
+
+ if sys.platform == "win32":
+ #
+ # Make sure the current folder isn't the root folder
+ # (or any other volume root). The drive-relative
+ # locations below cannot then refer to mount points
+ #
+ drive, path = ntpath.splitdrive(sys.executable)
+ with support.change_cwd(os.path.dirname(sys.executable)):
+ self.assertFalse(ntpath.ismount(drive.lower()))
+ self.assertFalse(ntpath.ismount(drive.upper()))
+
+ self.assertTrue(ntpath.ismount("\\\\localhost\\c$"))
+ self.assertTrue(ntpath.ismount("\\\\localhost\\c$\\"))
+
+ self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$"))
+ self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$\\"))
class NtCommonTest(test_genericpath.CommonTest, unittest.TestCase):
pathmodule = ntpath
diff --git a/Lib/test/test_openpty.py b/Lib/test/test_openpty.py
index 6384370..4785107 100644
--- a/Lib/test/test_openpty.py
+++ b/Lib/test/test_openpty.py
@@ -4,7 +4,7 @@ import os, unittest
from test.support import run_unittest
if not hasattr(os, "openpty"):
- raise unittest.SkipTest("No openpty() available.")
+ raise unittest.SkipTest("os.openpty() not available.")
class OpenptyTest(unittest.TestCase):
diff --git a/Lib/test/test_operator.py b/Lib/test/test_operator.py
index fa608b9..ab58a98 100644
--- a/Lib/test/test_operator.py
+++ b/Lib/test/test_operator.py
@@ -1,8 +1,10 @@
-import operator
import unittest
from test import support
+py_operator = support.import_fresh_module('operator', blocked=['_operator'])
+c_operator = support.import_fresh_module('operator', fresh=['_operator'])
+
class Seq1:
def __init__(self, lst):
self.lst = lst
@@ -32,8 +34,9 @@ class Seq2(object):
return other * self.lst
-class OperatorTestCase(unittest.TestCase):
+class OperatorTestCase:
def test_lt(self):
+ operator = self.module
self.assertRaises(TypeError, operator.lt)
self.assertRaises(TypeError, operator.lt, 1j, 2j)
self.assertFalse(operator.lt(1, 0))
@@ -44,6 +47,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertTrue(operator.lt(1, 2.0))
def test_le(self):
+ operator = self.module
self.assertRaises(TypeError, operator.le)
self.assertRaises(TypeError, operator.le, 1j, 2j)
self.assertFalse(operator.le(1, 0))
@@ -54,6 +58,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertTrue(operator.le(1, 2.0))
def test_eq(self):
+ operator = self.module
class C(object):
def __eq__(self, other):
raise SyntaxError
@@ -67,6 +72,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertFalse(operator.eq(1, 2.0))
def test_ne(self):
+ operator = self.module
class C(object):
def __ne__(self, other):
raise SyntaxError
@@ -80,6 +86,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertTrue(operator.ne(1, 2.0))
def test_ge(self):
+ operator = self.module
self.assertRaises(TypeError, operator.ge)
self.assertRaises(TypeError, operator.ge, 1j, 2j)
self.assertTrue(operator.ge(1, 0))
@@ -90,6 +97,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertFalse(operator.ge(1, 2.0))
def test_gt(self):
+ operator = self.module
self.assertRaises(TypeError, operator.gt)
self.assertRaises(TypeError, operator.gt, 1j, 2j)
self.assertTrue(operator.gt(1, 0))
@@ -100,22 +108,26 @@ class OperatorTestCase(unittest.TestCase):
self.assertFalse(operator.gt(1, 2.0))
def test_abs(self):
+ operator = self.module
self.assertRaises(TypeError, operator.abs)
self.assertRaises(TypeError, operator.abs, None)
self.assertEqual(operator.abs(-1), 1)
self.assertEqual(operator.abs(1), 1)
def test_add(self):
+ operator = self.module
self.assertRaises(TypeError, operator.add)
self.assertRaises(TypeError, operator.add, None, None)
self.assertTrue(operator.add(3, 4) == 7)
def test_bitwise_and(self):
+ operator = self.module
self.assertRaises(TypeError, operator.and_)
self.assertRaises(TypeError, operator.and_, None, None)
self.assertTrue(operator.and_(0xf, 0xa) == 0xa)
def test_concat(self):
+ operator = self.module
self.assertRaises(TypeError, operator.concat)
self.assertRaises(TypeError, operator.concat, None, None)
self.assertTrue(operator.concat('py', 'thon') == 'python')
@@ -125,12 +137,14 @@ class OperatorTestCase(unittest.TestCase):
self.assertRaises(TypeError, operator.concat, 13, 29)
def test_countOf(self):
+ operator = self.module
self.assertRaises(TypeError, operator.countOf)
self.assertRaises(TypeError, operator.countOf, None, None)
self.assertTrue(operator.countOf([1, 2, 1, 3, 1, 4], 3) == 1)
self.assertTrue(operator.countOf([1, 2, 1, 3, 1, 4], 5) == 0)
def test_delitem(self):
+ operator = self.module
a = [4, 3, 2, 1]
self.assertRaises(TypeError, operator.delitem, a)
self.assertRaises(TypeError, operator.delitem, a, None)
@@ -138,33 +152,39 @@ class OperatorTestCase(unittest.TestCase):
self.assertTrue(a == [4, 2, 1])
def test_floordiv(self):
+ operator = self.module
self.assertRaises(TypeError, operator.floordiv, 5)
self.assertRaises(TypeError, operator.floordiv, None, None)
self.assertTrue(operator.floordiv(5, 2) == 2)
def test_truediv(self):
+ operator = self.module
self.assertRaises(TypeError, operator.truediv, 5)
self.assertRaises(TypeError, operator.truediv, None, None)
self.assertTrue(operator.truediv(5, 2) == 2.5)
def test_getitem(self):
+ operator = self.module
a = range(10)
self.assertRaises(TypeError, operator.getitem)
self.assertRaises(TypeError, operator.getitem, a, None)
self.assertTrue(operator.getitem(a, 2) == 2)
def test_indexOf(self):
+ operator = self.module
self.assertRaises(TypeError, operator.indexOf)
self.assertRaises(TypeError, operator.indexOf, None, None)
self.assertTrue(operator.indexOf([4, 3, 2, 1], 3) == 1)
self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
def test_invert(self):
+ operator = self.module
self.assertRaises(TypeError, operator.invert)
self.assertRaises(TypeError, operator.invert, None)
self.assertEqual(operator.inv(4), -5)
def test_lshift(self):
+ operator = self.module
self.assertRaises(TypeError, operator.lshift)
self.assertRaises(TypeError, operator.lshift, None, 42)
self.assertTrue(operator.lshift(5, 1) == 10)
@@ -172,16 +192,19 @@ class OperatorTestCase(unittest.TestCase):
self.assertRaises(ValueError, operator.lshift, 2, -1)
def test_mod(self):
+ operator = self.module
self.assertRaises(TypeError, operator.mod)
self.assertRaises(TypeError, operator.mod, None, 42)
self.assertTrue(operator.mod(5, 2) == 1)
def test_mul(self):
+ operator = self.module
self.assertRaises(TypeError, operator.mul)
self.assertRaises(TypeError, operator.mul, None, None)
self.assertTrue(operator.mul(5, 2) == 10)
def test_neg(self):
+ operator = self.module
self.assertRaises(TypeError, operator.neg)
self.assertRaises(TypeError, operator.neg, None)
self.assertEqual(operator.neg(5), -5)
@@ -190,11 +213,13 @@ class OperatorTestCase(unittest.TestCase):
self.assertEqual(operator.neg(-0), 0)
def test_bitwise_or(self):
+ operator = self.module
self.assertRaises(TypeError, operator.or_)
self.assertRaises(TypeError, operator.or_, None, None)
self.assertTrue(operator.or_(0xa, 0x5) == 0xf)
def test_pos(self):
+ operator = self.module
self.assertRaises(TypeError, operator.pos)
self.assertRaises(TypeError, operator.pos, None)
self.assertEqual(operator.pos(5), 5)
@@ -203,14 +228,15 @@ class OperatorTestCase(unittest.TestCase):
self.assertEqual(operator.pos(-0), 0)
def test_pow(self):
+ operator = self.module
self.assertRaises(TypeError, operator.pow)
self.assertRaises(TypeError, operator.pow, None, None)
self.assertEqual(operator.pow(3,5), 3**5)
- self.assertEqual(operator.__pow__(3,5), 3**5)
self.assertRaises(TypeError, operator.pow, 1)
self.assertRaises(TypeError, operator.pow, 1, 2, 3)
def test_rshift(self):
+ operator = self.module
self.assertRaises(TypeError, operator.rshift)
self.assertRaises(TypeError, operator.rshift, None, 42)
self.assertTrue(operator.rshift(5, 1) == 2)
@@ -218,12 +244,14 @@ class OperatorTestCase(unittest.TestCase):
self.assertRaises(ValueError, operator.rshift, 2, -1)
def test_contains(self):
+ operator = self.module
self.assertRaises(TypeError, operator.contains)
self.assertRaises(TypeError, operator.contains, None, None)
self.assertTrue(operator.contains(range(4), 2))
self.assertFalse(operator.contains(range(4), 5))
def test_setitem(self):
+ operator = self.module
a = list(range(3))
self.assertRaises(TypeError, operator.setitem, a)
self.assertRaises(TypeError, operator.setitem, a, None, None)
@@ -232,11 +260,13 @@ class OperatorTestCase(unittest.TestCase):
self.assertRaises(IndexError, operator.setitem, a, 4, 2)
def test_sub(self):
+ operator = self.module
self.assertRaises(TypeError, operator.sub)
self.assertRaises(TypeError, operator.sub, None, None)
self.assertTrue(operator.sub(5, 2) == 3)
def test_truth(self):
+ operator = self.module
class C(object):
def __bool__(self):
raise SyntaxError
@@ -248,11 +278,13 @@ class OperatorTestCase(unittest.TestCase):
self.assertFalse(operator.truth([]))
def test_bitwise_xor(self):
+ operator = self.module
self.assertRaises(TypeError, operator.xor)
self.assertRaises(TypeError, operator.xor, None, None)
self.assertTrue(operator.xor(0xb, 0xc) == 0x7)
def test_is(self):
+ operator = self.module
a = b = 'xyzpdq'
c = a[:3] + b[3:]
self.assertRaises(TypeError, operator.is_)
@@ -260,6 +292,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertFalse(operator.is_(a,c))
def test_is_not(self):
+ operator = self.module
a = b = 'xyzpdq'
c = a[:3] + b[3:]
self.assertRaises(TypeError, operator.is_not)
@@ -267,6 +300,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertTrue(operator.is_not(a,c))
def test_attrgetter(self):
+ operator = self.module
class A:
pass
a = A()
@@ -316,6 +350,7 @@ class OperatorTestCase(unittest.TestCase):
self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
def test_itemgetter(self):
+ operator = self.module
a = 'ABCDE'
f = operator.itemgetter(2)
self.assertEqual(f(a), 'C')
@@ -350,12 +385,15 @@ class OperatorTestCase(unittest.TestCase):
self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
def test_methodcaller(self):
+ operator = self.module
self.assertRaises(TypeError, operator.methodcaller)
class A:
def foo(self, *args, **kwds):
return args[0] + args[1]
def bar(self, f=42):
return f
+ def baz(*args, **kwds):
+ return kwds['name'], kwds['self']
a = A()
f = operator.methodcaller('foo')
self.assertRaises(IndexError, f, a)
@@ -366,8 +404,11 @@ class OperatorTestCase(unittest.TestCase):
self.assertRaises(TypeError, f, a, a)
f = operator.methodcaller('bar', f=5)
self.assertEqual(f(a), 5)
+ f = operator.methodcaller('baz', name='spam', self='eggs')
+ self.assertEqual(f(a), ('spam', 'eggs'))
def test_inplace(self):
+ operator = self.module
class C(object):
def __iadd__ (self, other): return "iadd"
def __iand__ (self, other): return "iand"
@@ -396,37 +437,48 @@ class OperatorTestCase(unittest.TestCase):
self.assertEqual(operator.itruediv (c, 5), "itruediv")
self.assertEqual(operator.ixor (c, 5), "ixor")
self.assertEqual(operator.iconcat (c, c), "iadd")
- self.assertEqual(operator.__iadd__ (c, 5), "iadd")
- self.assertEqual(operator.__iand__ (c, 5), "iand")
- self.assertEqual(operator.__ifloordiv__(c, 5), "ifloordiv")
- self.assertEqual(operator.__ilshift__ (c, 5), "ilshift")
- self.assertEqual(operator.__imod__ (c, 5), "imod")
- self.assertEqual(operator.__imul__ (c, 5), "imul")
- self.assertEqual(operator.__ior__ (c, 5), "ior")
- self.assertEqual(operator.__ipow__ (c, 5), "ipow")
- self.assertEqual(operator.__irshift__ (c, 5), "irshift")
- self.assertEqual(operator.__isub__ (c, 5), "isub")
- self.assertEqual(operator.__itruediv__ (c, 5), "itruediv")
- self.assertEqual(operator.__ixor__ (c, 5), "ixor")
- self.assertEqual(operator.__iconcat__ (c, c), "iadd")
-
-def test_main(verbose=None):
- import sys
- test_classes = (
- OperatorTestCase,
- )
-
- support.run_unittest(*test_classes)
-
- # verify reference counting
- if verbose and hasattr(sys, "gettotalrefcount"):
- import gc
- counts = [None] * 5
- for i in range(len(counts)):
- support.run_unittest(*test_classes)
- gc.collect()
- counts[i] = sys.gettotalrefcount()
- print(counts)
+
+ def test_length_hint(self):
+ operator = self.module
+ class X(object):
+ def __init__(self, value):
+ self.value = value
+
+ def __length_hint__(self):
+ if type(self.value) is type:
+ raise self.value
+ else:
+ return self.value
+
+ self.assertEqual(operator.length_hint([], 2), 0)
+ self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
+
+ self.assertEqual(operator.length_hint(X(2)), 2)
+ self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
+ self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
+ with self.assertRaises(TypeError):
+ operator.length_hint(X("abc"))
+ with self.assertRaises(ValueError):
+ operator.length_hint(X(-2))
+ with self.assertRaises(LookupError):
+ operator.length_hint(X(LookupError))
+
+ def test_dunder_is_original(self):
+ operator = self.module
+
+ names = [name for name in dir(operator) if not name.startswith('_')]
+ for name in names:
+ orig = getattr(operator, name)
+ dunder = getattr(operator, '__' + name.strip('_') + '__', None)
+ if dunder:
+ self.assertIs(dunder, orig)
+
+class PyOperatorTestCase(OperatorTestCase, unittest.TestCase):
+ module = py_operator
+
+@unittest.skipUnless(c_operator, 'requires _operator')
+class COperatorTestCase(OperatorTestCase, unittest.TestCase):
+ module = c_operator
if __name__ == "__main__":
- test_main(verbose=True)
+ unittest.main()
diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py
index 78de278..9473011 100644
--- a/Lib/test/test_optparse.py
+++ b/Lib/test/test_optparse.py
@@ -730,7 +730,7 @@ class TestStandard(BaseTest):
def test_short_and_long_option_split(self):
self.assertParseOK(["-a", "xyz", "--foo", "bar"],
{'a': 'xyz', 'boo': None, 'foo': ["bar"]},
- []),
+ [])
def test_short_option_split_long_option_append(self):
self.assertParseOK(["--foo=bar", "-b", "123", "--foo", "baz"],
@@ -740,15 +740,15 @@ class TestStandard(BaseTest):
def test_short_option_split_one_positional_arg(self):
self.assertParseOK(["-a", "foo", "bar"],
{'a': "foo", 'boo': None, 'foo': None},
- ["bar"]),
+ ["bar"])
def test_short_option_consumes_separator(self):
self.assertParseOK(["-a", "--", "foo", "bar"],
{'a': "--", 'boo': None, 'foo': None},
- ["foo", "bar"]),
+ ["foo", "bar"])
self.assertParseOK(["-a", "--", "--foo", "bar"],
{'a': "--", 'boo': None, 'foo': ["bar"]},
- []),
+ [])
def test_short_option_joined_and_separator(self):
self.assertParseOK(["-ab", "--", "--foo", "bar"],
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 2db030e..b7796b5 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -24,6 +24,8 @@ import itertools
import stat
import locale
import codecs
+import decimal
+import fractions
try:
import threading
except ImportError:
@@ -476,9 +478,9 @@ class StatAttributeTests(unittest.TestCase):
# Verify that an open file can be stat'ed
try:
os.stat(r"c:\pagefile.sys")
- except WindowsError as e:
- if e.errno == 2: # file does not exist; cannot run test
- return
+ except FileNotFoundError:
+ pass # file does not exist; cannot run test
+ except OSError as e:
self.fail("Could not stat pagefile.sys")
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
@@ -870,6 +872,17 @@ class MakedirTests(unittest.TestCase):
os.makedirs(path, mode=mode, exist_ok=True)
os.umask(old_mask)
+ @unittest.skipUnless(hasattr(os, 'chown'), 'test needs os.chown')
+ def test_chown_uid_gid_arguments_must_be_index(self):
+ stat = os.stat(support.TESTFN)
+ uid = stat.st_uid
+ gid = stat.st_gid
+ for value in (-1.0, -1j, decimal.Decimal(-1), fractions.Fraction(-2, 2)):
+ self.assertRaises(TypeError, os.chown, support.TESTFN, value, gid)
+ self.assertRaises(TypeError, os.chown, support.TESTFN, uid, value)
+ self.assertIsNone(os.chown(support.TESTFN, uid, gid))
+ self.assertIsNone(os.chown(support.TESTFN, -1, -1))
+
def test_exist_ok_s_isgid_directory(self):
path = os.path.join(support.TESTFN, 'dir1')
S_ISGID = stat.S_ISGID
@@ -1117,27 +1130,27 @@ class ExecTests(unittest.TestCase):
class Win32ErrorTests(unittest.TestCase):
def test_rename(self):
- self.assertRaises(WindowsError, os.rename, support.TESTFN, support.TESTFN+".bak")
+ self.assertRaises(OSError, os.rename, support.TESTFN, support.TESTFN+".bak")
def test_remove(self):
- self.assertRaises(WindowsError, os.remove, support.TESTFN)
+ self.assertRaises(OSError, os.remove, support.TESTFN)
def test_chdir(self):
- self.assertRaises(WindowsError, os.chdir, support.TESTFN)
+ self.assertRaises(OSError, os.chdir, support.TESTFN)
def test_mkdir(self):
f = open(support.TESTFN, "w")
try:
- self.assertRaises(WindowsError, os.mkdir, support.TESTFN)
+ self.assertRaises(OSError, os.mkdir, support.TESTFN)
finally:
f.close()
os.unlink(support.TESTFN)
def test_utime(self):
- self.assertRaises(WindowsError, os.utime, support.TESTFN, None)
+ self.assertRaises(OSError, os.utime, support.TESTFN, None)
def test_chmod(self):
- self.assertRaises(WindowsError, os.chmod, support.TESTFN, 0)
+ self.assertRaises(OSError, os.chmod, support.TESTFN, 0)
class TestInvalidFD(unittest.TestCase):
singles = ["fchdir", "dup", "fdopen", "fdatasync", "fstat",
@@ -1265,31 +1278,31 @@ if sys.platform != 'win32':
if hasattr(os, 'setuid'):
def test_setuid(self):
if os.getuid() != 0:
- self.assertRaises(os.error, os.setuid, 0)
+ self.assertRaises(OSError, os.setuid, 0)
self.assertRaises(OverflowError, os.setuid, 1<<32)
if hasattr(os, 'setgid'):
def test_setgid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(os.error, os.setgid, 0)
+ self.assertRaises(OSError, os.setgid, 0)
self.assertRaises(OverflowError, os.setgid, 1<<32)
if hasattr(os, 'seteuid'):
def test_seteuid(self):
if os.getuid() != 0:
- self.assertRaises(os.error, os.seteuid, 0)
+ self.assertRaises(OSError, os.seteuid, 0)
self.assertRaises(OverflowError, os.seteuid, 1<<32)
if hasattr(os, 'setegid'):
def test_setegid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(os.error, os.setegid, 0)
+ self.assertRaises(OSError, os.setegid, 0)
self.assertRaises(OverflowError, os.setegid, 1<<32)
if hasattr(os, 'setreuid'):
def test_setreuid(self):
if os.getuid() != 0:
- self.assertRaises(os.error, os.setreuid, 0, 0)
+ self.assertRaises(OSError, os.setreuid, 0, 0)
self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
@@ -1303,7 +1316,7 @@ if sys.platform != 'win32':
if hasattr(os, 'setregid'):
def test_setregid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(os.error, os.setregid, 0, 0)
+ self.assertRaises(OSError, os.setregid, 0, 0)
self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
@@ -2167,6 +2180,112 @@ class TermsizeTests(unittest.TestCase):
self.assertEqual(expected, actual)
+class OSErrorTests(unittest.TestCase):
+ def setUp(self):
+ class Str(str):
+ pass
+
+ self.bytes_filenames = []
+ self.unicode_filenames = []
+ if support.TESTFN_UNENCODABLE is not None:
+ decoded = support.TESTFN_UNENCODABLE
+ else:
+ decoded = support.TESTFN
+ self.unicode_filenames.append(decoded)
+ self.unicode_filenames.append(Str(decoded))
+ if support.TESTFN_UNDECODABLE is not None:
+ encoded = support.TESTFN_UNDECODABLE
+ else:
+ encoded = os.fsencode(support.TESTFN)
+ self.bytes_filenames.append(encoded)
+ self.bytes_filenames.append(memoryview(encoded))
+
+ self.filenames = self.bytes_filenames + self.unicode_filenames
+
+ def test_oserror_filename(self):
+ funcs = [
+ (self.filenames, os.chdir,),
+ (self.filenames, os.chmod, 0o777),
+ (self.filenames, os.lstat,),
+ (self.filenames, os.open, os.O_RDONLY),
+ (self.filenames, os.rmdir,),
+ (self.filenames, os.stat,),
+ (self.filenames, os.unlink,),
+ ]
+ if sys.platform == "win32":
+ funcs.extend((
+ (self.bytes_filenames, os.rename, b"dst"),
+ (self.bytes_filenames, os.replace, b"dst"),
+ (self.unicode_filenames, os.rename, "dst"),
+ (self.unicode_filenames, os.replace, "dst"),
+ # Issue #16414: Don't test undecodable names with listdir()
+ # because of a Windows bug.
+ #
+ # With the ANSI code page 932, os.listdir(b'\xe7') return an
+ # empty list (instead of failing), whereas os.listdir(b'\xff')
+ # raises a FileNotFoundError. It looks like a Windows bug:
+ # b'\xe7' directory does not exist, FindFirstFileA(b'\xe7')
+ # fails with ERROR_FILE_NOT_FOUND (2), instead of
+ # ERROR_PATH_NOT_FOUND (3).
+ (self.unicode_filenames, os.listdir,),
+ ))
+ else:
+ funcs.extend((
+ (self.filenames, os.listdir,),
+ (self.filenames, os.rename, "dst"),
+ (self.filenames, os.replace, "dst"),
+ ))
+ if hasattr(os, "chown"):
+ funcs.append((self.filenames, os.chown, 0, 0))
+ if hasattr(os, "lchown"):
+ funcs.append((self.filenames, os.lchown, 0, 0))
+ if hasattr(os, "truncate"):
+ funcs.append((self.filenames, os.truncate, 0))
+ if hasattr(os, "chflags"):
+ funcs.append((self.filenames, os.chflags, 0))
+ if hasattr(os, "lchflags"):
+ funcs.append((self.filenames, os.lchflags, 0))
+ if hasattr(os, "chroot"):
+ funcs.append((self.filenames, os.chroot,))
+ if hasattr(os, "link"):
+ if sys.platform == "win32":
+ funcs.append((self.bytes_filenames, os.link, b"dst"))
+ funcs.append((self.unicode_filenames, os.link, "dst"))
+ else:
+ funcs.append((self.filenames, os.link, "dst"))
+ if hasattr(os, "listxattr"):
+ funcs.extend((
+ (self.filenames, os.listxattr,),
+ (self.filenames, os.getxattr, "user.test"),
+ (self.filenames, os.setxattr, "user.test", b'user'),
+ (self.filenames, os.removexattr, "user.test"),
+ ))
+ if hasattr(os, "lchmod"):
+ funcs.append((self.filenames, os.lchmod, 0o777))
+ if hasattr(os, "readlink"):
+ if sys.platform == "win32":
+ funcs.append((self.unicode_filenames, os.readlink,))
+ else:
+ funcs.append((self.filenames, os.readlink,))
+
+ for filenames, func, *func_args in funcs:
+ for name in filenames:
+ try:
+ func(name, *func_args)
+ except OSError as err:
+ self.assertIs(err.filename, name)
+ else:
+ self.fail("No exception thrown by {}".format(func))
+
+class CPUCountTests(unittest.TestCase):
+ def test_cpu_count(self):
+ cpus = os.cpu_count()
+ if cpus is not None:
+ self.assertIsInstance(cpus, int)
+ self.assertGreater(cpus, 0)
+ else:
+ self.skipTest("Could not determine the number of CPUs")
+
@support.reap_threads
def test_main():
support.run_unittest(
@@ -2196,7 +2315,9 @@ def test_main():
ExtendedAttributeTests,
Win32DeprecatedBytesAPI,
TermsizeTests,
+ OSErrorTests,
RemoveDirsTests,
+ CPUCountTests,
)
if __name__ == "__main__":
diff --git a/Lib/test/test_ossaudiodev.py b/Lib/test/test_ossaudiodev.py
index 3908a05..c9e2a24 100644
--- a/Lib/test/test_ossaudiodev.py
+++ b/Lib/test/test_ossaudiodev.py
@@ -44,7 +44,7 @@ class OSSAudioDevTests(unittest.TestCase):
def play_sound_file(self, data, rate, ssize, nchannels):
try:
dsp = ossaudiodev.open('w')
- except IOError as msg:
+ except OSError as msg:
if msg.args[0] in (errno.EACCES, errno.ENOENT,
errno.ENODEV, errno.EBUSY):
raise unittest.SkipTest(msg)
@@ -190,7 +190,7 @@ class OSSAudioDevTests(unittest.TestCase):
def test_main():
try:
dsp = ossaudiodev.open('w')
- except (ossaudiodev.error, IOError) as msg:
+ except (ossaudiodev.error, OSError) as msg:
if msg.args[0] in (errno.EACCES, errno.ENOENT,
errno.ENODEV, errno.EBUSY):
raise unittest.SkipTest(msg)
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index 03084e4..0babaa0 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -1,9 +1,9 @@
# A test suite for pdb; not very comprehensive at the moment.
import doctest
-import imp
import pdb
import sys
+import types
import unittest
import subprocess
import textwrap
@@ -464,7 +464,7 @@ def test_pdb_skip_modules():
# Module for testing skipping of module that makes a callback
-mod = imp.new_module('module_to_skip')
+mod = types.ModuleType('module_to_skip')
exec('def foo_pony(callback): x = 1; callback(); return None', mod.__dict__)
diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py
index 1cacdea..5025792 100644
--- a/Lib/test/test_peepholer.py
+++ b/Lib/test/test_peepholer.py
@@ -5,44 +5,28 @@ from io import StringIO
import unittest
from math import copysign
-def disassemble(func):
- f = StringIO()
- tmp = sys.stdout
- sys.stdout = f
- try:
- dis.dis(func)
- finally:
- sys.stdout = tmp
- result = f.getvalue()
- f.close()
- return result
+from test.bytecode_helper import BytecodeTestCase
-def dis_single(line):
- return disassemble(compile(line, '', 'single'))
-
-
-class TestTranforms(unittest.TestCase):
+class TestTranforms(BytecodeTestCase):
def test_unot(self):
# UNARY_NOT POP_JUMP_IF_FALSE --> POP_JUMP_IF_TRUE'
def unot(x):
if not x == 2:
del x
- asm = disassemble(unot)
- for elem in ('UNARY_NOT', 'POP_JUMP_IF_FALSE'):
- self.assertNotIn(elem, asm)
- for elem in ('POP_JUMP_IF_TRUE',):
- self.assertIn(elem, asm)
+ self.assertNotInBytecode(unot, 'UNARY_NOT')
+ self.assertNotInBytecode(unot, 'POP_JUMP_IF_FALSE')
+ self.assertInBytecode(unot, 'POP_JUMP_IF_TRUE')
def test_elim_inversion_of_is_or_in(self):
- for line, elem in (
- ('not a is b', '(is not)',),
- ('not a in b', '(not in)',),
- ('not a is not b', '(is)',),
- ('not a not in b', '(in)',),
+ for line, cmp_op in (
+ ('not a is b', 'is not',),
+ ('not a in b', 'not in',),
+ ('not a is not b', 'is',),
+ ('not a not in b', 'in',),
):
- asm = dis_single(line)
- self.assertIn(elem, asm)
+ code = compile(line, '', 'single')
+ self.assertInBytecode(code, 'COMPARE_OP', cmp_op)
def test_global_as_constant(self):
# LOAD_GLOBAL None/True/False --> LOAD_CONST None/True/False
@@ -56,17 +40,14 @@ class TestTranforms(unittest.TestCase):
def h(x):
False
return x
- for func, name in ((f, 'None'), (g, 'True'), (h, 'False')):
- asm = disassemble(func)
- for elem in ('LOAD_GLOBAL',):
- self.assertNotIn(elem, asm)
- for elem in ('LOAD_CONST', '('+name+')'):
- self.assertIn(elem, asm)
+ for func, elem in ((f, None), (g, True), (h, False)):
+ self.assertNotInBytecode(func, 'LOAD_GLOBAL')
+ self.assertInBytecode(func, 'LOAD_CONST', elem)
def f():
'Adding a docstring made this test fail in Py2.5.0'
return None
- self.assertIn('LOAD_CONST', disassemble(f))
- self.assertNotIn('LOAD_GLOBAL', disassemble(f))
+ self.assertNotInBytecode(f, 'LOAD_GLOBAL')
+ self.assertInBytecode(f, 'LOAD_CONST', None)
def test_while_one(self):
# Skip over: LOAD_CONST trueconst POP_JUMP_IF_FALSE xx
@@ -74,11 +55,10 @@ class TestTranforms(unittest.TestCase):
while 1:
pass
return list
- asm = disassemble(f)
for elem in ('LOAD_CONST', 'POP_JUMP_IF_FALSE'):
- self.assertNotIn(elem, asm)
+ self.assertNotInBytecode(f, elem)
for elem in ('JUMP_ABSOLUTE',):
- self.assertIn(elem, asm)
+ self.assertInBytecode(f, elem)
def test_pack_unpack(self):
for line, elem in (
@@ -86,28 +66,30 @@ class TestTranforms(unittest.TestCase):
('a, b = a, b', 'ROT_TWO',),
('a, b, c = a, b, c', 'ROT_THREE',),
):
- asm = dis_single(line)
- self.assertIn(elem, asm)
- self.assertNotIn('BUILD_TUPLE', asm)
- self.assertNotIn('UNPACK_TUPLE', asm)
+ code = compile(line,'','single')
+ self.assertInBytecode(code, elem)
+ self.assertNotInBytecode(code, 'BUILD_TUPLE')
+ self.assertNotInBytecode(code, 'UNPACK_TUPLE')
def test_folding_of_tuples_of_constants(self):
for line, elem in (
- ('a = 1,2,3', '((1, 2, 3))'),
- ('("a","b","c")', "(('a', 'b', 'c'))"),
- ('a,b,c = 1,2,3', '((1, 2, 3))'),
- ('(None, 1, None)', '((None, 1, None))'),
- ('((1, 2), 3, 4)', '(((1, 2), 3, 4))'),
+ ('a = 1,2,3', (1, 2, 3)),
+ ('("a","b","c")', ('a', 'b', 'c')),
+ ('a,b,c = 1,2,3', (1, 2, 3)),
+ ('(None, 1, None)', (None, 1, None)),
+ ('((1, 2), 3, 4)', ((1, 2), 3, 4)),
):
- asm = dis_single(line)
- self.assertIn(elem, asm)
- self.assertNotIn('BUILD_TUPLE', asm)
+ code = compile(line,'','single')
+ self.assertInBytecode(code, 'LOAD_CONST', elem)
+ self.assertNotInBytecode(code, 'BUILD_TUPLE')
# Long tuples should be folded too.
- asm = dis_single(repr(tuple(range(10000))))
+ code = compile(repr(tuple(range(10000))),'','single')
+ self.assertNotInBytecode(code, 'BUILD_TUPLE')
# One LOAD_CONST for the tuple, one for the None return value
- self.assertEqual(asm.count('LOAD_CONST'), 2)
- self.assertNotIn('BUILD_TUPLE', asm)
+ load_consts = [instr for instr in dis.get_instructions(code)
+ if instr.opname == 'LOAD_CONST']
+ self.assertEqual(len(load_consts), 2)
# Bug 1053819: Tuple of constants misidentified when presented with:
# . . . opcode_with_arg 100 unary_opcode BUILD_TUPLE 1 . . .
@@ -129,14 +111,14 @@ class TestTranforms(unittest.TestCase):
def test_folding_of_lists_of_constants(self):
for line, elem in (
# in/not in constants with BUILD_LIST should be folded to a tuple:
- ('a in [1,2,3]', '(1, 2, 3)'),
- ('a not in ["a","b","c"]', "(('a', 'b', 'c'))"),
- ('a in [None, 1, None]', '((None, 1, None))'),
- ('a not in [(1, 2), 3, 4]', '(((1, 2), 3, 4))'),
+ ('a in [1,2,3]', (1, 2, 3)),
+ ('a not in ["a","b","c"]', ('a', 'b', 'c')),
+ ('a in [None, 1, None]', (None, 1, None)),
+ ('a not in [(1, 2), 3, 4]', ((1, 2), 3, 4)),
):
- asm = dis_single(line)
- self.assertIn(elem, asm)
- self.assertNotIn('BUILD_LIST', asm)
+ code = compile(line, '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', elem)
+ self.assertNotInBytecode(code, 'BUILD_LIST')
def test_folding_of_sets_of_constants(self):
for line, elem in (
@@ -147,18 +129,9 @@ class TestTranforms(unittest.TestCase):
('a not in {(1, 2), 3, 4}', frozenset({(1, 2), 3, 4})),
('a in {1, 2, 3, 3, 2, 1}', frozenset({1, 2, 3})),
):
- asm = dis_single(line)
- self.assertNotIn('BUILD_SET', asm)
-
- # Verify that the frozenset 'elem' is in the disassembly
- # The ordering of the elements in repr( frozenset ) isn't
- # guaranteed, so we jump through some hoops to ensure that we have
- # the frozenset we expect:
- self.assertIn('frozenset', asm)
- # Extract the frozenset literal from the disassembly:
- m = re.match(r'.*(frozenset\({.*}\)).*', asm, re.DOTALL)
- self.assertTrue(m)
- self.assertEqual(eval(m.group(1)), elem)
+ code = compile(line, '', 'single')
+ self.assertNotInBytecode(code, 'BUILD_SET')
+ self.assertInBytecode(code, 'LOAD_CONST', elem)
# Ensure that the resulting code actually works:
def f(a):
@@ -176,98 +149,103 @@ class TestTranforms(unittest.TestCase):
def test_folding_of_binops_on_constants(self):
for line, elem in (
- ('a = 2+3+4', '(9)'), # chained fold
- ('"@"*4', "('@@@@')"), # check string ops
- ('a="abc" + "def"', "('abcdef')"), # check string ops
- ('a = 3**4', '(81)'), # binary power
- ('a = 3*4', '(12)'), # binary multiply
- ('a = 13//4', '(3)'), # binary floor divide
- ('a = 14%4', '(2)'), # binary modulo
- ('a = 2+3', '(5)'), # binary add
- ('a = 13-4', '(9)'), # binary subtract
- ('a = (12,13)[1]', '(13)'), # binary subscr
- ('a = 13 << 2', '(52)'), # binary lshift
- ('a = 13 >> 2', '(3)'), # binary rshift
- ('a = 13 & 7', '(5)'), # binary and
- ('a = 13 ^ 7', '(10)'), # binary xor
- ('a = 13 | 7', '(15)'), # binary or
+ ('a = 2+3+4', 9), # chained fold
+ ('"@"*4', '@@@@'), # check string ops
+ ('a="abc" + "def"', 'abcdef'), # check string ops
+ ('a = 3**4', 81), # binary power
+ ('a = 3*4', 12), # binary multiply
+ ('a = 13//4', 3), # binary floor divide
+ ('a = 14%4', 2), # binary modulo
+ ('a = 2+3', 5), # binary add
+ ('a = 13-4', 9), # binary subtract
+ ('a = (12,13)[1]', 13), # binary subscr
+ ('a = 13 << 2', 52), # binary lshift
+ ('a = 13 >> 2', 3), # binary rshift
+ ('a = 13 & 7', 5), # binary and
+ ('a = 13 ^ 7', 10), # binary xor
+ ('a = 13 | 7', 15), # binary or
):
- asm = dis_single(line)
- self.assertIn(elem, asm, asm)
- self.assertNotIn('BINARY_', asm)
+ code = compile(line, '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', elem)
+ for instr in dis.get_instructions(code):
+ self.assertFalse(instr.opname.startswith('BINARY_'))
# Verify that unfoldables are skipped
- asm = dis_single('a=2+"b"')
- self.assertIn('(2)', asm)
- self.assertIn("('b')", asm)
+ code = compile('a=2+"b"', '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', 2)
+ self.assertInBytecode(code, 'LOAD_CONST', 'b')
# Verify that large sequences do not result from folding
- asm = dis_single('a="x"*1000')
- self.assertIn('(1000)', asm)
+ code = compile('a="x"*1000', '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', 1000)
def test_binary_subscr_on_unicode(self):
# valid code get optimized
- asm = dis_single('"foo"[0]')
- self.assertIn("('f')", asm)
- self.assertNotIn('BINARY_SUBSCR', asm)
- asm = dis_single('"\u0061\uffff"[1]')
- self.assertIn("('\\uffff')", asm)
- self.assertNotIn('BINARY_SUBSCR', asm)
- asm = dis_single('"\U00012345abcdef"[3]')
- self.assertIn("('c')", asm)
- self.assertNotIn('BINARY_SUBSCR', asm)
+ code = compile('"foo"[0]', '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', 'f')
+ self.assertNotInBytecode(code, 'BINARY_SUBSCR')
+ code = compile('"\u0061\uffff"[1]', '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', '\uffff')
+ self.assertNotInBytecode(code,'BINARY_SUBSCR')
+
+ # With PEP 393, non-BMP char get optimized
+ code = compile('"\U00012345"[0]', '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', '\U00012345')
+ self.assertNotInBytecode(code, 'BINARY_SUBSCR')
# invalid code doesn't get optimized
# out of range
- asm = dis_single('"fuu"[10]')
- self.assertIn('BINARY_SUBSCR', asm)
+ code = compile('"fuu"[10]', '', 'single')
+ self.assertInBytecode(code, 'BINARY_SUBSCR')
def test_folding_of_unaryops_on_constants(self):
for line, elem in (
- ('-0.5', '(-0.5)'), # unary negative
- ('-0.0', '(-0.0)'), # -0.0
- ('-(1.0-1.0)','(-0.0)'), # -0.0 after folding
- ('-0', '(0)'), # -0
- ('~-2', '(1)'), # unary invert
- ('+1', '(1)'), # unary positive
+ ('-0.5', -0.5), # unary negative
+ ('-0.0', -0.0), # -0.0
+ ('-(1.0-1.0)', -0.0), # -0.0 after folding
+ ('-0', 0), # -0
+ ('~-2', 1), # unary invert
+ ('+1', 1), # unary positive
):
- asm = dis_single(line)
- self.assertIn(elem, asm, asm)
- self.assertNotIn('UNARY_', asm)
+ code = compile(line, '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', elem)
+ for instr in dis.get_instructions(code):
+ self.assertFalse(instr.opname.startswith('UNARY_'))
# Check that -0.0 works after marshaling
def negzero():
return -(1.0-1.0)
- self.assertNotIn('UNARY_', disassemble(negzero))
- self.assertTrue(copysign(1.0, negzero()) < 0)
+ for instr in dis.get_instructions(code):
+ self.assertFalse(instr.opname.startswith('UNARY_'))
# Verify that unfoldables are skipped
- for line, elem in (
- ('-"abc"', "('abc')"), # unary negative
- ('~"abc"', "('abc')"), # unary invert
+ for line, elem, opname in (
+ ('-"abc"', 'abc', 'UNARY_NEGATIVE'),
+ ('~"abc"', 'abc', 'UNARY_INVERT'),
):
- asm = dis_single(line)
- self.assertIn(elem, asm, asm)
- self.assertIn('UNARY_', asm)
+ code = compile(line, '', 'single')
+ self.assertInBytecode(code, 'LOAD_CONST', elem)
+ self.assertInBytecode(code, opname)
def test_elim_extra_return(self):
# RETURN LOAD_CONST None RETURN --> RETURN
def f(x):
return x
- asm = disassemble(f)
- self.assertNotIn('LOAD_CONST', asm)
- self.assertNotIn('(None)', asm)
- self.assertEqual(asm.split().count('RETURN_VALUE'), 1)
+ self.assertNotInBytecode(f, 'LOAD_CONST', None)
+ returns = [instr for instr in dis.get_instructions(f)
+ if instr.opname == 'RETURN_VALUE']
+ self.assertEqual(len(returns), 1)
def test_elim_jump_to_return(self):
# JUMP_FORWARD to RETURN --> RETURN
def f(cond, true_value, false_value):
return true_value if cond else false_value
- asm = disassemble(f)
- self.assertNotIn('JUMP_FORWARD', asm)
- self.assertNotIn('JUMP_ABSOLUTE', asm)
- self.assertEqual(asm.split().count('RETURN_VALUE'), 2)
+ self.assertNotInBytecode(f, 'JUMP_FORWARD')
+ self.assertNotInBytecode(f, 'JUMP_ABSOLUTE')
+ returns = [instr for instr in dis.get_instructions(f)
+ if instr.opname == 'RETURN_VALUE']
+ self.assertEqual(len(returns), 2)
def test_elim_jump_after_return1(self):
# Eliminate dead code: jumps immediately after returns can't be reached
@@ -280,48 +258,53 @@ class TestTranforms(unittest.TestCase):
if cond1: return 4
return 5
return 6
- asm = disassemble(f)
- self.assertNotIn('JUMP_FORWARD', asm)
- self.assertNotIn('JUMP_ABSOLUTE', asm)
- self.assertEqual(asm.split().count('RETURN_VALUE'), 6)
+ self.assertNotInBytecode(f, 'JUMP_FORWARD')
+ self.assertNotInBytecode(f, 'JUMP_ABSOLUTE')
+ returns = [instr for instr in dis.get_instructions(f)
+ if instr.opname == 'RETURN_VALUE']
+ self.assertEqual(len(returns), 6)
def test_elim_jump_after_return2(self):
# Eliminate dead code: jumps immediately after returns can't be reached
def f(cond1, cond2):
while 1:
if cond1: return 4
- asm = disassemble(f)
- self.assertNotIn('JUMP_FORWARD', asm)
+ self.assertNotInBytecode(f, 'JUMP_FORWARD')
# There should be one jump for the while loop.
- self.assertEqual(asm.split().count('JUMP_ABSOLUTE'), 1)
- self.assertEqual(asm.split().count('RETURN_VALUE'), 2)
+ returns = [instr for instr in dis.get_instructions(f)
+ if instr.opname == 'JUMP_ABSOLUTE']
+ self.assertEqual(len(returns), 1)
+ returns = [instr for instr in dis.get_instructions(f)
+ if instr.opname == 'RETURN_VALUE']
+ self.assertEqual(len(returns), 2)
def test_make_function_doesnt_bail(self):
def f():
def g()->1+1:
pass
return g
- asm = disassemble(f)
- self.assertNotIn('BINARY_ADD', asm)
+ self.assertNotInBytecode(f, 'BINARY_ADD')
def test_constant_folding(self):
# Issue #11244: aggressive constant folding.
exprs = [
- "3 * -5",
- "-3 * 5",
- "2 * (3 * 4)",
- "(2 * 3) * 4",
- "(-1, 2, 3)",
- "(1, -2, 3)",
- "(1, 2, -3)",
- "(1, 2, -3) * 6",
- "lambda x: x in {(3 * -5) + (-1 - 6), (1, -2, 3) * 2, None}",
+ '3 * -5',
+ '-3 * 5',
+ '2 * (3 * 4)',
+ '(2 * 3) * 4',
+ '(-1, 2, 3)',
+ '(1, -2, 3)',
+ '(1, 2, -3)',
+ '(1, 2, -3) * 6',
+ 'lambda x: x in {(3 * -5) + (-1 - 6), (1, -2, 3) * 2, None}',
]
for e in exprs:
- asm = dis_single(e)
- self.assertNotIn('UNARY_', asm, e)
- self.assertNotIn('BINARY_', asm, e)
- self.assertNotIn('BUILD_', asm, e)
+ code = compile(e, '', 'single')
+ for instr in dis.get_instructions(code):
+ self.assertFalse(instr.opname.startswith('UNARY_'))
+ self.assertFalse(instr.opname.startswith('BINARY_'))
+ self.assertFalse(instr.opname.startswith('BUILD_'))
+
class TestBuglets(unittest.TestCase):
@@ -343,7 +326,7 @@ def test_main(verbose=None):
support.run_unittest(*test_classes)
# verify reference counting
- if verbose and hasattr(sys, "gettotalrefcount"):
+ if verbose and hasattr(sys, 'gettotalrefcount'):
import gc
counts = [None] * 5
for i in range(len(counts)):
diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py
index 4b16cbb..9bae6dc 100644
--- a/Lib/test/test_pep277.py
+++ b/Lib/test/test_pep277.py
@@ -99,10 +99,6 @@ class UnicodeFileTests(unittest.TestCase):
with self.assertRaises(expected_exception) as c:
fn(filename)
exc_filename = c.exception.filename
- # listdir may append a wildcard to the filename
- if fn is os.listdir and sys.platform == 'win32':
- exc_filename, _, wildcard = exc_filename.rpartition(os.sep)
- self.assertEqual(wildcard, '*.*')
if check_filename:
self.assertEqual(exc_filename, filename, "Function '%s(%a) failed "
"with bad filename in the exception: %a" %
diff --git a/Lib/test/test_pep352.py b/Lib/test/test_pep352.py
index 558cdb5..7c98c46 100644
--- a/Lib/test/test_pep352.py
+++ b/Lib/test/test_pep352.py
@@ -1,7 +1,6 @@
import unittest
import builtins
import warnings
-from test.support import run_unittest
import os
from platform import system as platform_system
@@ -180,8 +179,6 @@ class UsageTests(unittest.TestCase):
# Catching a string is bad.
self.catch_fails("spam")
-def test_main():
- run_unittest(ExceptionClassTests, UsageTests)
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_pkgimport.py b/Lib/test/test_pkgimport.py
index a8426b5..370b2aa 100644
--- a/Lib/test/test_pkgimport.py
+++ b/Lib/test/test_pkgimport.py
@@ -6,7 +6,7 @@ import random
import tempfile
import unittest
-from imp import cache_from_source
+from importlib.util import cache_from_source
from test.support import run_unittest, create_empty_file
class TestImport(unittest.TestCase):
diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py
index fd06614..1f48853 100644
--- a/Lib/test/test_pkgutil.py
+++ b/Lib/test/test_pkgutil.py
@@ -1,12 +1,12 @@
from test.support import run_unittest, unload, check_warnings
import unittest
import sys
-import imp
import importlib
import pkgutil
import os
import os.path
import tempfile
+import types
import shutil
import zipfile
@@ -105,7 +105,7 @@ class PkgutilPEP302Tests(unittest.TestCase):
class MyTestLoader(object):
def load_module(self, fullname):
# Create an empty module
- mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
+ mod = sys.modules.setdefault(fullname, types.ModuleType(fullname))
mod.__file__ = "<%s>" % self.__class__.__name__
mod.__loader__ = self
# Make it a package
diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py
index f98a280..a1e5c3d 100644
--- a/Lib/test/test_poll.py
+++ b/Lib/test/test_poll.py
@@ -1,6 +1,7 @@
# Test case for the os.poll() function
import os
+import subprocess
import random
import select
import _testcapi
@@ -15,7 +16,7 @@ from test.support import TESTFN, run_unittest, reap_threads
try:
select.poll
except AttributeError:
- raise unittest.SkipTest("select.poll not defined -- skipping test_poll")
+ raise unittest.SkipTest("select.poll not defined")
def find_ready_matching(ready, flag):
@@ -76,13 +77,11 @@ class PollTests(unittest.TestCase):
self.assertEqual(bufs, [MSG] * NUM_PIPES)
- def poll_unit_tests(self):
+ def test_poll_unit_tests(self):
# returns NVAL for invalid file descriptor
- FD = 42
- try:
- os.close(FD)
- except OSError:
- pass
+ FD, w = os.pipe()
+ os.close(FD)
+ os.close(w)
p = select.poll()
p.register(FD)
r = p.poll()
@@ -125,7 +124,9 @@ class PollTests(unittest.TestCase):
def test_poll2(self):
cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
- p = os.popen(cmd, 'r')
+ proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
+ bufsize=0)
+ p = proc.stdout
pollster = select.poll()
pollster.register( p, select.POLLIN )
for tout in (0, 1000, 2000, 4000, 8000, 16000) + (-1,)*10:
@@ -135,7 +136,7 @@ class PollTests(unittest.TestCase):
fd, flags = fdlist[0]
if flags & select.POLLHUP:
line = p.readline()
- if line != "":
+ if line != b"":
self.fail('error: pipe seems to be closed, but still returns data')
continue
@@ -143,6 +144,7 @@ class PollTests(unittest.TestCase):
line = p.readline()
if not line:
break
+ self.assertEqual(line, b'testing...\n')
continue
else:
self.fail('Unexpected return value from select.poll: %s' % fdlist)
diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
index c0929a0..935848b 100644
--- a/Lib/test/test_poplib.py
+++ b/Lib/test/test_poplib.py
@@ -18,6 +18,13 @@ threading = test_support.import_module('threading')
HOST = test_support.HOST
PORT = 0
+SUPPORTS_SSL = False
+if hasattr(poplib, 'POP3_SSL'):
+ import ssl
+
+ SUPPORTS_SSL = True
+ CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert.pem")
+
# the dummy data returned by server when LIST and RETR commands are issued
LIST_RESP = b'1 1\r\n2 2\r\n3 3\r\n4 4\r\n5 5\r\n.\r\n'
RETR_RESP = b"""From: postmaster@python.org\
@@ -33,11 +40,15 @@ line3\r\n\
class DummyPOP3Handler(asynchat.async_chat):
+ CAPAS = {'UIDL': [], 'IMPLEMENTATION': ['python-testlib-pop-server']}
+
def __init__(self, conn):
asynchat.async_chat.__init__(self, conn)
self.set_terminator(b"\r\n")
self.in_buffer = []
self.push('+OK dummy pop3 server ready. <timestamp>')
+ self.tls_active = False
+ self.tls_starting = False
def collect_incoming_data(self, data):
self.in_buffer.append(data)
@@ -112,6 +123,65 @@ class DummyPOP3Handler(asynchat.async_chat):
self.push('+OK closing.')
self.close_when_done()
+ def _get_capas(self):
+ _capas = dict(self.CAPAS)
+ if not self.tls_active and SUPPORTS_SSL:
+ _capas['STLS'] = []
+ return _capas
+
+ def cmd_capa(self, arg):
+ self.push('+OK Capability list follows')
+ if self._get_capas():
+ for cap, params in self._get_capas().items():
+ _ln = [cap]
+ if params:
+ _ln.extend(params)
+ self.push(' '.join(_ln))
+ self.push('.')
+
+ if SUPPORTS_SSL:
+
+ def cmd_stls(self, arg):
+ if self.tls_active is False:
+ self.push('+OK Begin TLS negotiation')
+ tls_sock = ssl.wrap_socket(self.socket, certfile=CERTFILE,
+ server_side=True,
+ do_handshake_on_connect=False,
+ suppress_ragged_eofs=False)
+ self.del_channel()
+ self.set_socket(tls_sock)
+ self.tls_active = True
+ self.tls_starting = True
+ self.in_buffer = []
+ self._do_tls_handshake()
+ else:
+ self.push('-ERR Command not permitted when TLS active')
+
+ def _do_tls_handshake(self):
+ try:
+ self.socket.do_handshake()
+ except ssl.SSLError as err:
+ if err.args[0] in (ssl.SSL_ERROR_WANT_READ,
+ ssl.SSL_ERROR_WANT_WRITE):
+ return
+ elif err.args[0] == ssl.SSL_ERROR_EOF:
+ return self.handle_close()
+ raise
+ except OSError as err:
+ if err.args[0] == errno.ECONNABORTED:
+ return self.handle_close()
+ else:
+ self.tls_active = True
+ self.tls_starting = False
+
+ def handle_read(self):
+ if self.tls_starting:
+ self._do_tls_handshake()
+ else:
+ try:
+ asynchat.async_chat.handle_read(self)
+ except ssl.SSLEOFError:
+ self.handle_close()
class DummyPOP3Server(asyncore.dispatcher, threading.Thread):
@@ -232,19 +302,35 @@ class TestPOP3Class(TestCase):
self.client.uidl()
self.client.uidl('foo')
+ def test_capa(self):
+ capa = self.client.capa()
+ self.assertTrue('IMPLEMENTATION' in capa.keys())
+
def test_quit(self):
resp = self.client.quit()
self.assertTrue(resp)
self.assertIsNone(self.client.sock)
self.assertIsNone(self.client.file)
+ if SUPPORTS_SSL:
-SUPPORTS_SSL = False
-if hasattr(poplib, 'POP3_SSL'):
- import ssl
+ def test_stls_capa(self):
+ capa = self.client.capa()
+ self.assertTrue('STLS' in capa.keys())
- SUPPORTS_SSL = True
- CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert.pem")
+ def test_stls(self):
+ expected = b'+OK Begin TLS negotiation'
+ resp = self.client.stls()
+ self.assertEqual(resp, expected)
+
+ def test_stls_context(self):
+ expected = b'+OK Begin TLS negotiation'
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ resp = self.client.stls(context=ctx)
+ self.assertEqual(resp, expected)
+
+
+if SUPPORTS_SSL:
class DummyPOP3_SSLHandler(DummyPOP3Handler):
@@ -256,34 +342,13 @@ if hasattr(poplib, 'POP3_SSL'):
self.del_channel()
self.set_socket(ssl_socket)
# Must try handshake before calling push()
- self._ssl_accepting = True
- self._do_ssl_handshake()
+ self.tls_active = True
+ self.tls_starting = True
+ self._do_tls_handshake()
self.set_terminator(b"\r\n")
self.in_buffer = []
self.push('+OK dummy pop3 server ready. <timestamp>')
- def _do_ssl_handshake(self):
- try:
- self.socket.do_handshake()
- except ssl.SSLError as err:
- if err.args[0] in (ssl.SSL_ERROR_WANT_READ,
- ssl.SSL_ERROR_WANT_WRITE):
- return
- elif err.args[0] == ssl.SSL_ERROR_EOF:
- return self.handle_close()
- raise
- except socket.error as err:
- if err.args[0] == errno.ECONNABORTED:
- return self.handle_close()
- else:
- self._ssl_accepting = False
-
- def handle_read(self):
- if self._ssl_accepting:
- self._do_ssl_handshake()
- else:
- DummyPOP3Handler.handle_read(self)
-
class TestPOP3_SSLClass(TestPOP3Class):
# repeat previous tests by using poplib.POP3_SSL
@@ -314,6 +379,39 @@ if hasattr(poplib, 'POP3_SSL'):
self.assertIs(self.client.sock.context, ctx)
self.assertTrue(self.client.noop().startswith(b'+OK'))
+ def test_stls(self):
+ self.assertRaises(poplib.error_proto, self.client.stls)
+
+ test_stls_context = test_stls
+
+ def test_stls_capa(self):
+ capa = self.client.capa()
+ self.assertFalse('STLS' in capa.keys())
+
+
+ class TestPOP3_TLSClass(TestPOP3Class):
+ # repeat previous tests by using poplib.POP3.stls()
+
+ def setUp(self):
+ self.server = DummyPOP3Server((HOST, PORT))
+ self.server.start()
+ self.client = poplib.POP3(self.server.host, self.server.port, timeout=3)
+ self.client.stls()
+
+ def tearDown(self):
+ if self.client.file is not None and self.client.sock is not None:
+ self.client.quit()
+ self.server.stop()
+
+ def test_stls(self):
+ self.assertRaises(poplib.error_proto, self.client.stls)
+
+ test_stls_context = test_stls
+
+ def test_stls_capa(self):
+ capa = self.client.capa()
+ self.assertFalse(b'STLS' in capa.keys())
+
class TestTimeouts(TestCase):
@@ -373,6 +471,7 @@ def test_main():
tests = [TestPOP3Class, TestTimeouts]
if SUPPORTS_SSL:
tests.append(TestPOP3_SSLClass)
+ tests.append(TestPOP3_TLSClass)
thread_info = test_support.threading_setup()
try:
test_support.run_unittest(*tests)
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 4d9e1f5..4856083 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -607,7 +607,7 @@ class PosixTester(unittest.TestCase):
self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
try:
fd = open(target_file, 'w+')
- except IOError as e:
+ except OSError as e:
self.assertEqual(e.errno, errno.EPERM)
finally:
posix.chflags(target_file, st.st_flags)
diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
index 0e7d866..412849c 100644
--- a/Lib/test/test_posixpath.py
+++ b/Lib/test/test_posixpath.py
@@ -186,63 +186,6 @@ class PosixPathTest(unittest.TestCase):
if not f.close():
f.close()
- @staticmethod
- def _create_file(filename):
- with open(filename, 'wb') as f:
- f.write(b'foo')
-
- def test_samefile(self):
- test_fn = support.TESTFN + "1"
- self._create_file(test_fn)
- self.assertTrue(posixpath.samefile(test_fn, test_fn))
- self.assertRaises(TypeError, posixpath.samefile)
-
- @unittest.skipIf(
- sys.platform.startswith('win'),
- "posixpath.samefile does not work on links in Windows")
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- def test_samefile_on_links(self):
- test_fn1 = support.TESTFN + "1"
- test_fn2 = support.TESTFN + "2"
- self._create_file(test_fn1)
-
- os.symlink(test_fn1, test_fn2)
- self.assertTrue(posixpath.samefile(test_fn1, test_fn2))
- os.remove(test_fn2)
-
- self._create_file(test_fn2)
- self.assertFalse(posixpath.samefile(test_fn1, test_fn2))
-
-
- def test_samestat(self):
- test_fn = support.TESTFN + "1"
- self._create_file(test_fn)
- test_fns = [test_fn]*2
- stats = map(os.stat, test_fns)
- self.assertTrue(posixpath.samestat(*stats))
-
- @unittest.skipIf(
- sys.platform.startswith('win'),
- "posixpath.samestat does not work on links in Windows")
- @unittest.skipUnless(hasattr(os, "symlink"),
- "Missing symlink implementation")
- def test_samestat_on_links(self):
- test_fn1 = support.TESTFN + "1"
- test_fn2 = support.TESTFN + "2"
- self._create_file(test_fn1)
- test_fns = (test_fn1, test_fn2)
- os.symlink(*test_fns)
- stats = map(os.stat, test_fns)
- self.assertTrue(posixpath.samestat(*stats))
- os.remove(test_fn2)
-
- self._create_file(test_fn2)
- stats = map(os.stat, test_fns)
- self.assertFalse(posixpath.samestat(*stats))
-
- self.assertRaises(TypeError, posixpath.samestat)
-
def test_ismount(self):
self.assertIs(posixpath.ismount("/"), True)
with warnings.catch_warnings():
@@ -595,11 +538,6 @@ class PosixPathTest(unittest.TestCase):
finally:
os.getcwdb = real_getcwdb
- def test_sameopenfile(self):
- fname = support.TESTFN + "1"
- with open(fname, "wb") as a, open(fname, "wb") as b:
- self.assertTrue(posixpath.sameopenfile(a.fileno(), b.fileno()))
-
class PosixCommonTest(test_genericpath.CommonTest, unittest.TestCase):
pathmodule = posixpath
diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py
index d492d75..bf136de 100644
--- a/Lib/test/test_pprint.py
+++ b/Lib/test/test_pprint.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
import pprint
import test.support
import unittest
@@ -475,6 +477,42 @@ class QueryTestCase(unittest.TestCase):
self.assertEqual(pprint.pformat(dict.fromkeys(keys, 0)),
'{%r: 0, %r: 0}' % tuple(sorted(keys, key=id)))
+ def test_str_wrap(self):
+ # pprint tries to wrap strings intelligently
+ fox = 'the quick brown fox jumped over a lazy dog'
+ self.assertEqual(pprint.pformat(fox, width=20), """\
+'the quick brown '
+'fox jumped over '
+'a lazy dog'""")
+ self.assertEqual(pprint.pformat({'a': 1, 'b': fox, 'c': 2},
+ width=26), """\
+{'a': 1,
+ 'b': 'the quick brown '
+ 'fox jumped over '
+ 'a lazy dog',
+ 'c': 2}""")
+ # With some special characters
+ # - \n always triggers a new line in the pprint
+ # - \t and \n are escaped
+ # - non-ASCII is allowed
+ # - an apostrophe doesn't disrupt the pprint
+ special = "Portons dix bons \"whiskys\"\nà l'avocat goujat\t qui fumait au zoo"
+ self.assertEqual(pprint.pformat(special, width=20), """\
+'Portons dix bons '
+'"whiskys"\\n'
+"à l'avocat "
+'goujat\\t qui '
+'fumait au zoo'""")
+ # An unwrappable string is formatted as its repr
+ unwrappable = "x" * 100
+ self.assertEqual(pprint.pformat(unwrappable, width=80), repr(unwrappable))
+ self.assertEqual(pprint.pformat(''), "''")
+ # Check that the pprint is a usable repr
+ special *= 10
+ for width in range(3, 40):
+ formatted = pprint.pformat(special, width=width)
+ self.assertEqual(eval("(" + formatted + ")"), special)
+
class DottedPrettyPrinter(pprint.PrettyPrinter):
diff --git a/Lib/test/test_print.py b/Lib/test/test_print.py
index 9d6dbea..7eea349 100644
--- a/Lib/test/test_print.py
+++ b/Lib/test/test_print.py
@@ -1,62 +1,55 @@
-"""Test correct operation of the print function.
-"""
-
-# In 2.6, this gives us the behavior we want. In 3.0, it has
-# no function, but it still must parse correctly.
-from __future__ import print_function
-
import unittest
-from test import support
+from io import StringIO
-try:
- # 3.x
- from io import StringIO
-except ImportError:
- # 2.x
- from StringIO import StringIO
+from test import support
NotDefined = object()
# A dispatch table all 8 combinations of providing
-# sep, end, and file
+# sep, end, and file.
# I use this machinery so that I'm not just passing default
-# values to print, I'm either passing or not passing in the
-# arguments
+# values to print, I'm either passing or not passing in the
+# arguments.
dispatch = {
(False, False, False):
- lambda args, sep, end, file: print(*args),
+ lambda args, sep, end, file: print(*args),
(False, False, True):
- lambda args, sep, end, file: print(file=file, *args),
+ lambda args, sep, end, file: print(file=file, *args),
(False, True, False):
- lambda args, sep, end, file: print(end=end, *args),
+ lambda args, sep, end, file: print(end=end, *args),
(False, True, True):
- lambda args, sep, end, file: print(end=end, file=file, *args),
+ lambda args, sep, end, file: print(end=end, file=file, *args),
(True, False, False):
- lambda args, sep, end, file: print(sep=sep, *args),
+ lambda args, sep, end, file: print(sep=sep, *args),
(True, False, True):
- lambda args, sep, end, file: print(sep=sep, file=file, *args),
+ lambda args, sep, end, file: print(sep=sep, file=file, *args),
(True, True, False):
- lambda args, sep, end, file: print(sep=sep, end=end, *args),
+ lambda args, sep, end, file: print(sep=sep, end=end, *args),
(True, True, True):
- lambda args, sep, end, file: print(sep=sep, end=end, file=file, *args),
- }
+ lambda args, sep, end, file: print(sep=sep, end=end, file=file, *args),
+}
+
# Class used to test __str__ and print
class ClassWith__str__:
def __init__(self, x):
self.x = x
+
def __str__(self):
return self.x
+
class TestPrint(unittest.TestCase):
+ """Test correct operation of the print function."""
+
def check(self, expected, args,
- sep=NotDefined, end=NotDefined, file=NotDefined):
+ sep=NotDefined, end=NotDefined, file=NotDefined):
# Capture sys.stdout in a StringIO. Call print with args,
- # and with sep, end, and file, if they're defined. Result
- # must match expected.
+ # and with sep, end, and file, if they're defined. Result
+ # must match expected.
- # Look up the actual function to call, based on if sep, end, and file
- # are defined
+ # Look up the actual function to call, based on if sep, end,
+ # and file are defined.
fn = dispatch[(sep is not NotDefined,
end is not NotDefined,
file is not NotDefined)]
@@ -69,7 +62,7 @@ class TestPrint(unittest.TestCase):
def test_print(self):
def x(expected, args, sep=NotDefined, end=NotDefined):
# Run the test 2 ways: not using file, and using
- # file directed to a StringIO
+ # file directed to a StringIO.
self.check(expected, args, sep=sep, end=end)
@@ -101,11 +94,6 @@ class TestPrint(unittest.TestCase):
x('*\n', (ClassWith__str__('*'),))
x('abc 1\n', (ClassWith__str__('abc'), 1))
-# # 2.x unicode tests
-# x(u'1 2\n', ('1', u'2'))
-# x(u'u\1234\n', (u'u\1234',))
-# x(u' abc 1\n', (' ', ClassWith__str__(u'abc'), 1))
-
# errors
self.assertRaises(TypeError, print, '', sep=3)
self.assertRaises(TypeError, print, '', end=3)
@@ -113,12 +101,14 @@ class TestPrint(unittest.TestCase):
def test_print_flush(self):
# operation of the flush flag
- class filelike():
+ class filelike:
def __init__(self):
self.written = ''
self.flushed = 0
+
def write(self, str):
self.written += str
+
def flush(self):
self.flushed += 1
@@ -130,15 +120,13 @@ class TestPrint(unittest.TestCase):
self.assertEqual(f.flushed, 2)
# ensure exceptions from flush are passed through
- class noflush():
+ class noflush:
def write(self, str):
pass
+
def flush(self):
raise RuntimeError
self.assertRaises(RuntimeError, print, 1, file=noflush(), flush=True)
-def test_main():
- support.run_unittest(TestPrint)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py
index cd7ec58..1fc3c42 100644
--- a/Lib/test/test_profile.py
+++ b/Lib/test/test_profile.py
@@ -3,9 +3,11 @@
import sys
import pstats
import unittest
+import os
from difflib import unified_diff
from io import StringIO
-from test.support import run_unittest
+from test.support import TESTFN, run_unittest, unlink
+from contextlib import contextmanager
import profile
from test.profilee import testfunc, timer
@@ -14,9 +16,13 @@ from test.profilee import testfunc, timer
class ProfileTest(unittest.TestCase):
profilerclass = profile.Profile
+ profilermodule = profile
methodnames = ['print_stats', 'print_callers', 'print_callees']
expected_max_output = ':0(max)'
+ def tearDown(self):
+ unlink(TESTFN)
+
def get_expected_output(self):
return _ProfileOutput
@@ -74,6 +80,19 @@ class ProfileTest(unittest.TestCase):
self.assertIn(self.expected_max_output, res,
"Profiling {0!r} didn't report max:\n{1}".format(stmt, res))
+ def test_run(self):
+ with silent():
+ self.profilermodule.run("int('1')")
+ self.profilermodule.run("int('1')", filename=TESTFN)
+ self.assertTrue(os.path.exists(TESTFN))
+
+ def test_runctx(self):
+ with silent():
+ self.profilermodule.runctx("testfunc()", globals(), locals())
+ self.profilermodule.runctx("testfunc()", globals(), locals(),
+ filename=TESTFN)
+ self.assertTrue(os.path.exists(TESTFN))
+
def regenerate_expected_output(filename, cls):
filename = filename.rstrip('co')
@@ -95,6 +114,14 @@ def regenerate_expected_output(filename, cls):
method, results[i+1]))
f.write('\nif __name__ == "__main__":\n main()\n')
+@contextmanager
+def silent():
+ stdout = sys.stdout
+ try:
+ sys.stdout = StringIO()
+ yield
+ finally:
+ sys.stdout = stdout
def test_main():
run_unittest(ProfileTest)
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index 29297f8..8916861 100644
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -187,7 +187,7 @@ class PtyTest(unittest.TestCase):
##debug("Reading from master_fd now that the child has exited")
##try:
## s1 = os.read(master_fd, 1024)
- ##except os.error:
+ ##except OSError:
## pass
##else:
## raise TestFailed("Read from master_fd did not raise exception")
diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
index f3c1a6a..2ad9c3a 100644
--- a/Lib/test/test_py_compile.py
+++ b/Lib/test/test_py_compile.py
@@ -1,7 +1,8 @@
-import imp
+import importlib.util
import os
import py_compile
import shutil
+import stat
import tempfile
import unittest
@@ -13,7 +14,7 @@ class PyCompileTests(unittest.TestCase):
self.directory = tempfile.mkdtemp()
self.source_path = os.path.join(self.directory, '_test.py')
self.pyc_path = self.source_path + 'c'
- self.cache_path = imp.cache_from_source(self.source_path)
+ self.cache_path = importlib.util.cache_from_source(self.source_path)
self.cwd_drive = os.path.splitdrive(os.getcwd())[0]
# In these tests we compute relative paths. When using Windows, the
# current working directory path and the 'self.source_path' might be
@@ -35,6 +36,26 @@ class PyCompileTests(unittest.TestCase):
self.assertTrue(os.path.exists(self.pyc_path))
self.assertFalse(os.path.exists(self.cache_path))
+ def test_do_not_overwrite_symlinks(self):
+ # In the face of a cfile argument being a symlink, bail out.
+ # Issue #17222
+ try:
+ os.symlink(self.pyc_path + '.actual', self.pyc_path)
+ except (NotImplementedError, OSError):
+ self.skipTest('need to be able to create a symlink for a file')
+ else:
+ assert os.path.islink(self.pyc_path)
+ with self.assertRaises(FileExistsError):
+ py_compile.compile(self.source_path, self.pyc_path)
+
+ @unittest.skipIf(not os.path.exists(os.devnull) or os.path.isfile(os.devnull),
+ 'requires os.devnull and for it to be a non-regular file')
+ def test_do_not_overwrite_nonregular_files(self):
+ # In the face of a cfile argument being a non-regular file, bail out.
+ # Issue #17222
+ with self.assertRaises(FileExistsError):
+ py_compile.compile(self.source_path, os.devnull)
+
def test_cache_path(self):
py_compile.compile(self.source_path)
self.assertTrue(os.path.exists(self.cache_path))
@@ -54,8 +75,20 @@ class PyCompileTests(unittest.TestCase):
self.assertTrue(os.path.exists(self.pyc_path))
self.assertFalse(os.path.exists(self.cache_path))
-def test_main():
- support.run_unittest(PyCompileTests)
+ @unittest.skipIf(os.name == 'nt',
+ 'cannot control directory permissions on Windows')
+ def test_exceptions_propagate(self):
+ # Make sure that exceptions raised thanks to issues with writing
+ # bytecode.
+ # http://bugs.python.org/issue17244
+ mode = os.stat(self.directory)
+ os.chmod(self.directory, stat.S_IREAD)
+ try:
+ with self.assertRaises(IOError):
+ py_compile.compile(self.source_path, self.pyc_path)
+ finally:
+ os.chmod(self.directory, mode.st_mode)
+
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index e83989e..c094455 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -158,7 +158,7 @@ class PyclbrTest(TestCase):
cm('random', ignore=('Random',)) # from _random import Random as CoreGenerator
cm('cgi', ignore=('log',)) # set with = in module
cm('pickle')
- cm('aifc', ignore=('openfp',)) # set with = in module
+ cm('aifc', ignore=('openfp', '_aifc_params')) # set with = in module
cm('sre_parse', ignore=('dump',)) # from sre_constants import *
cm('pdb')
cm('pydoc')
diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py
index cdcc707..399f818 100644
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -29,10 +29,6 @@ try:
except ImportError:
threading = None
-# Just in case sys.modules["test"] has the optional attribute __loader__.
-if hasattr(pydoc_mod, "__loader__"):
- del pydoc_mod.__loader__
-
if test.support.HAVE_DOCSTRINGS:
expected_data_docstrings = (
'dictionary for instance variables (if defined)',
@@ -421,6 +417,31 @@ class PydocDocTest(unittest.TestCase):
synopsis = pydoc.synopsis(TESTFN, {})
self.assertEqual(synopsis, 'line 1: h\xe9')
+ def test_splitdoc_with_description(self):
+ example_string = "I Am A Doc\n\n\nHere is my description"
+ self.assertEqual(pydoc.splitdoc(example_string),
+ ('I Am A Doc', '\nHere is my description'))
+
+ def test_is_object_or_method(self):
+ doc = pydoc.Doc()
+ # Bound Method
+ self.assertTrue(pydoc._is_some_method(doc.fail))
+ # Method Descriptor
+ self.assertTrue(pydoc._is_some_method(int.__add__))
+ # String
+ self.assertFalse(pydoc._is_some_method("I am not a method"))
+
+ def test_is_package_when_not_package(self):
+ with test.support.temp_cwd() as test_dir:
+ self.assertFalse(pydoc.ispackage(test_dir))
+
+ def test_is_package_when_is_package(self):
+ with test.support.temp_cwd() as test_dir:
+ init_path = os.path.join(test_dir, '__init__.py')
+ open(init_path, 'w').close()
+ self.assertTrue(pydoc.ispackage(test_dir))
+ os.remove(init_path)
+
def test_allmethods(self):
# issue 17476: allmethods was no longer returning unbound methods.
# This test is a bit fragile in the face of changes to object and type,
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index facddb1..49a3f7b 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -1,10 +1,12 @@
#!/usr/bin/env python3
import unittest
+import unittest.mock
import random
import time
import pickle
import warnings
+from functools import partial
from math import log, exp, pi, fsum, sin
from test import support
@@ -46,6 +48,48 @@ class TestBasicOps:
self.assertRaises(TypeError, self.gen.seed, 1, 2, 3, 4)
self.assertRaises(TypeError, type(self.gen), [])
+ @unittest.mock.patch('random._urandom') # os.urandom
+ def test_seed_when_randomness_source_not_found(self, urandom_mock):
+ # Random.seed() uses time.time() when an operating system specific
+ # randomness source is not found. To test this on machines were it
+ # exists, run the above test, test_seedargs(), again after mocking
+ # os.urandom() so that it raises the exception expected when the
+ # randomness source is not available.
+ urandom_mock.side_effect = NotImplementedError
+ self.test_seedargs()
+
+ def test_shuffle(self):
+ shuffle = self.gen.shuffle
+ lst = []
+ shuffle(lst)
+ self.assertEqual(lst, [])
+ lst = [37]
+ shuffle(lst)
+ self.assertEqual(lst, [37])
+ seqs = [list(range(n)) for n in range(10)]
+ shuffled_seqs = [list(range(n)) for n in range(10)]
+ for shuffled_seq in shuffled_seqs:
+ shuffle(shuffled_seq)
+ for (seq, shuffled_seq) in zip(seqs, shuffled_seqs):
+ self.assertEqual(len(seq), len(shuffled_seq))
+ self.assertEqual(set(seq), set(shuffled_seq))
+ # The above tests all would pass if the shuffle was a
+ # no-op. The following non-deterministic test covers that. It
+ # asserts that the shuffled sequence of 1000 distinct elements
+ # must be different from the original one. Although there is
+ # mathematically a non-zero probability that this could
+ # actually happen in a genuinely random shuffle, it is
+ # completely negligible, given that the number of possible
+ # permutations of 1000 objects is 1000! (factorial of 1000),
+ # which is considerably larger than the number of atoms in the
+ # universe...
+ lst = list(range(1000))
+ shuffled_lst = list(range(1000))
+ shuffle(shuffled_lst)
+ self.assertTrue(lst != shuffled_lst)
+ shuffle(lst)
+ self.assertTrue(lst != shuffled_lst)
+
def test_choice(self):
choice = self.gen.choice
with self.assertRaises(IndexError):
@@ -65,6 +109,8 @@ class TestBasicOps:
self.assertEqual(len(uniq), k)
self.assertTrue(uniq <= set(population))
self.assertEqual(self.gen.sample([], 0), []) # test edge case N==k==0
+ # Exception raised if size of sample exceeds that of population
+ self.assertRaises(ValueError, self.gen.sample, population, N+1)
def test_sample_distribution(self):
# For the entire allowable range of 0 <= k <= N, validate that
@@ -205,6 +251,25 @@ class SystemRandom_TestBasicOps(TestBasicOps, unittest.TestCase):
self.assertEqual(set(range(start,stop)),
set([self.gen.randrange(start,stop) for i in range(100)]))
+ def test_randrange_nonunit_step(self):
+ rint = self.gen.randrange(0, 10, 2)
+ self.assertIn(rint, (0, 2, 4, 6, 8))
+ rint = self.gen.randrange(0, 2, 2)
+ self.assertEqual(rint, 0)
+
+ def test_randrange_errors(self):
+ raises = partial(self.assertRaises, ValueError, self.gen.randrange)
+ # Empty range
+ raises(3, 3)
+ raises(-721)
+ raises(0, 100, -12)
+ # Non-integer start/stop
+ raises(3.14159)
+ raises(0, 2.71828)
+ # Zero and non-integer step
+ raises(0, 42, 0)
+ raises(0, 42, 3.14159)
+
def test_genrandbits(self):
# Verify ranges
for k in range(1, 1000):
@@ -274,6 +339,16 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase):
# Last element s/b an int also
self.assertRaises(TypeError, self.gen.setstate, (2, (0,)*624+('a',), None))
+ # Little trick to make "tuple(x % (2**32) for x in internalstate)"
+ # raise ValueError. I cannot think of a simple way to achieve this, so
+ # I am opting for using a generator as the middle argument of setstate
+ # which attempts to cast a NaN to integer.
+ state_values = self.gen.getstate()[1]
+ state_values = list(state_values)
+ state_values[-1] = float('nan')
+ state = (int(x) for x in state_values)
+ self.assertRaises(TypeError, self.gen.setstate, (2, state, None))
+
def test_referenceImplementation(self):
# Compare the python implementation with results from the original
# code. Create 2000 53-bit precision random floats. Compare only
@@ -413,6 +488,38 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase):
self.assertEqual(k, numbits) # note the stronger assertion
self.assertTrue(2**k > n > 2**(k-1)) # note the stronger assertion
+ @unittest.mock.patch('random.Random.random')
+ def test_randbelow_overriden_random(self, random_mock):
+ # Random._randbelow() can only use random() when the built-in one
+ # has been overridden but no new getrandbits() method was supplied.
+ random_mock.side_effect = random.SystemRandom().random
+ maxsize = 1<<random.BPF
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", UserWarning)
+ # Population range too large (n >= maxsize)
+ self.gen._randbelow(maxsize+1, maxsize = maxsize)
+ self.gen._randbelow(5640, maxsize = maxsize)
+
+ # This might be going too far to test a single line, but because of our
+ # noble aim of achieving 100% test coverage we need to write a case in
+ # which the following line in Random._randbelow() gets executed:
+ #
+ # rem = maxsize % n
+ # limit = (maxsize - rem) / maxsize
+ # r = random()
+ # while r >= limit:
+ # r = random() # <== *This line* <==<
+ #
+ # Therefore, to guarantee that the while loop is executed at least
+ # once, we need to mock random() so that it returns a number greater
+ # than 'limit' the first time it gets called.
+
+ n = 42
+ epsilon = 0.01
+ limit = (maxsize - (maxsize % n)) / maxsize
+ random_mock.side_effect = [limit + epsilon, limit - epsilon]
+ self.gen._randbelow(n, maxsize = maxsize)
+
def test_randrange_bug_1590891(self):
start = 1000000000000
stop = -100000000000000000000
@@ -530,6 +637,106 @@ class TestDistributions(unittest.TestCase):
random.vonmisesvariate(0, 1e15)
random.vonmisesvariate(0, 1e100)
+ def test_gammavariate_errors(self):
+ # Both alpha and beta must be > 0.0
+ self.assertRaises(ValueError, random.gammavariate, -1, 3)
+ self.assertRaises(ValueError, random.gammavariate, 0, 2)
+ self.assertRaises(ValueError, random.gammavariate, 2, 0)
+ self.assertRaises(ValueError, random.gammavariate, 1, -3)
+
+ @unittest.mock.patch('random.Random.random')
+ def test_gammavariate_full_code_coverage(self, random_mock):
+ # There are three different possibilities in the current implementation
+ # of random.gammavariate(), depending on the value of 'alpha'. What we
+ # are going to do here is to fix the values returned by random() to
+ # generate test cases that provide 100% line coverage of the method.
+
+ # #1: alpha > 1.0: we want the first random number to be outside the
+ # [1e-7, .9999999] range, so that the continue statement executes
+ # once. The values of u1 and u2 will be 0.5 and 0.3, respectively.
+ random_mock.side_effect = [1e-8, 0.5, 0.3]
+ returned_value = random.gammavariate(1.1, 2.3)
+ self.assertAlmostEqual(returned_value, 2.53)
+
+ # #2: alpha == 1: first random number less than 1e-7 to that the body
+ # of the while loop executes once. Then random.random() returns 0.45,
+ # which causes while to stop looping and the algorithm to terminate.
+ random_mock.side_effect = [1e-8, 0.45]
+ returned_value = random.gammavariate(1.0, 3.14)
+ self.assertAlmostEqual(returned_value, 2.507314166123803)
+
+ # #3: 0 < alpha < 1. This is the most complex region of code to cover,
+ # as there are multiple if-else statements. Let's take a look at the
+ # source code, and determine the values that we need accordingly:
+ #
+ # while 1:
+ # u = random()
+ # b = (_e + alpha)/_e
+ # p = b*u
+ # if p <= 1.0: # <=== (A)
+ # x = p ** (1.0/alpha)
+ # else: # <=== (B)
+ # x = -_log((b-p)/alpha)
+ # u1 = random()
+ # if p > 1.0: # <=== (C)
+ # if u1 <= x ** (alpha - 1.0): # <=== (D)
+ # break
+ # elif u1 <= _exp(-x): # <=== (E)
+ # break
+ # return x * beta
+ #
+ # First, we want (A) to be True. For that we need that:
+ # b*random() <= 1.0
+ # r1 = random() <= 1.0 / b
+ #
+ # We now get to the second if-else branch, and here, since p <= 1.0,
+ # (C) is False and we take the elif branch, (E). For it to be True,
+ # so that the break is executed, we need that:
+ # r2 = random() <= _exp(-x)
+ # r2 <= _exp(-(p ** (1.0/alpha)))
+ # r2 <= _exp(-((b*r1) ** (1.0/alpha)))
+
+ _e = random._e
+ _exp = random._exp
+ _log = random._log
+ alpha = 0.35
+ beta = 1.45
+ b = (_e + alpha)/_e
+ epsilon = 0.01
+
+ r1 = 0.8859296441566 # 1.0 / b
+ r2 = 0.3678794411714 # _exp(-((b*r1) ** (1.0/alpha)))
+
+ # These four "random" values result in the following trace:
+ # (A) True, (E) False --> [next iteration of while]
+ # (A) True, (E) True --> [while loop breaks]
+ random_mock.side_effect = [r1, r2 + epsilon, r1, r2]
+ returned_value = random.gammavariate(alpha, beta)
+ self.assertAlmostEqual(returned_value, 1.4499999999997544)
+
+ # Let's now make (A) be False. If this is the case, when we get to the
+ # second if-else 'p' is greater than 1, so (C) evaluates to True. We
+ # now encounter a second if statement, (D), which in order to execute
+ # must satisfy the following condition:
+ # r2 <= x ** (alpha - 1.0)
+ # r2 <= (-_log((b-p)/alpha)) ** (alpha - 1.0)
+ # r2 <= (-_log((b-(b*r1))/alpha)) ** (alpha - 1.0)
+ r1 = 0.8959296441566 # (1.0 / b) + epsilon -- so that (A) is False
+ r2 = 0.9445400408898141
+
+ # And these four values result in the following trace:
+ # (B) and (C) True, (D) False --> [next iteration of while]
+ # (B) and (C) True, (D) True [while loop breaks]
+ random_mock.side_effect = [r1, r2 + epsilon, r1, r2]
+ returned_value = random.gammavariate(alpha, beta)
+ self.assertAlmostEqual(returned_value, 1.5830349561760781)
+
+ @unittest.mock.patch('random.Random.gammavariate')
+ def test_betavariate_return_zero(self, gammavariate_mock):
+ # betavariate() returns zero when the Gamma distribution
+ # that it uses internally returns this same value.
+ gammavariate_mock.return_value = 0.0
+ self.assertEqual(0.0, random.betavariate(2.71828, 3.14159))
class TestModule(unittest.TestCase):
def testMagicConstants(self):
diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py
index 2a13bfe..f088387 100644
--- a/Lib/test/test_range.py
+++ b/Lib/test/test_range.py
@@ -313,7 +313,7 @@ class RangeTest(unittest.TestCase):
self.assertRaises(TypeError, range, IN())
# Test use of user-defined classes in slice indices.
- self.assertEqual(list(range(10)[:I(5)]), list(range(5)))
+ self.assertEqual(range(10)[:I(5)], range(5))
with self.assertRaises(RuntimeError):
range(0, 10)[:IX()]
diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
new file mode 100644
index 0000000..5b972ca
--- /dev/null
+++ b/Lib/test/test_regrtest.py
@@ -0,0 +1,100 @@
+"""
+Tests of regrtest.py.
+"""
+
+import argparse
+import getopt
+import unittest
+from test import regrtest, support
+
+def old_parse_args(args):
+ """Parse arguments as regrtest did strictly prior to 3.4.
+
+ Raises getopt.GetoptError on bad arguments.
+ """
+ return getopt.getopt(args, 'hvqxsoS:rf:lu:t:TD:NLR:FdwWM:nj:Gm:',
+ ['help', 'verbose', 'verbose2', 'verbose3', 'quiet',
+ 'exclude', 'single', 'slow', 'randomize', 'fromfile=', 'findleaks',
+ 'use=', 'threshold=', 'coverdir=', 'nocoverdir',
+ 'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
+ 'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug',
+ 'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait',
+ 'failfast', 'match='])
+
+class ParseArgsTestCase(unittest.TestCase):
+
+ """Test that regrtest's parsing code matches the prior getopt behavior."""
+
+ def _parse_args(self, args):
+ # This is the same logic as that used in regrtest.main()
+ parser = regrtest._create_parser()
+ ns = parser.parse_args(args=args)
+ opts = regrtest._convert_namespace_to_getopt(ns)
+ return opts, ns.args
+
+ def _check_args(self, args, expected=None):
+ """
+ The expected parameter is for cases when the behavior of the new
+ parse_args differs from the old (but deliberately so).
+ """
+ if expected is None:
+ try:
+ expected = old_parse_args(args)
+ except getopt.GetoptError:
+ # Suppress usage string output when an argparse.ArgumentError
+ # error is raised.
+ with support.captured_stderr():
+ self.assertRaises(SystemExit, self._parse_args, args)
+ return
+ # The new parse_args() sorts by long option string.
+ expected[0].sort()
+ actual = self._parse_args(args)
+ self.assertEqual(actual, expected)
+
+ def test_unrecognized_argument(self):
+ self._check_args(['--xxx'])
+
+ def test_value_not_provided(self):
+ self._check_args(['--start'])
+
+ def test_short_option(self):
+ # getopt returns the short option whereas argparse returns the long.
+ expected = ([('--quiet', '')], [])
+ self._check_args(['-q'], expected=expected)
+
+ def test_long_option(self):
+ self._check_args(['--quiet'])
+
+ def test_long_option__partial(self):
+ self._check_args(['--qui'])
+
+ def test_two_options(self):
+ self._check_args(['--quiet', '--exclude'])
+
+ def test_option_with_value(self):
+ self._check_args(['--start', 'foo'])
+
+ def test_option_with_empty_string_value(self):
+ self._check_args(['--start', ''])
+
+ def test_arg(self):
+ self._check_args(['foo'])
+
+ def test_option_and_arg(self):
+ self._check_args(['--quiet', 'foo'])
+
+ def test_fromfile(self):
+ self._check_args(['--fromfile', 'file'])
+
+ def test_match(self):
+ self._check_args(['--match', 'pattern'])
+
+ def test_randomize(self):
+ self._check_args(['--randomize'])
+
+
+def test_main():
+ support.run_unittest(__name__)
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py
index 589ecdd..104e3b5 100644
--- a/Lib/test/test_reprlib.py
+++ b/Lib/test/test_reprlib.py
@@ -3,11 +3,11 @@
Nick Mathewson
"""
-import imp
import sys
import os
import shutil
import importlib
+import importlib.util
import unittest
from test.support import run_unittest, create_empty_file, verbose
@@ -241,7 +241,8 @@ class LongReprTest(unittest.TestCase):
source_path_len += 2 * (len(self.longname) + 1)
# a path separator + `module_name` + ".py"
source_path_len += len(module_name) + 1 + len(".py")
- cached_path_len = source_path_len + len(imp.cache_from_source("x.py")) - len("x.py")
+ cached_path_len = (source_path_len +
+ len(importlib.util.cache_from_source("x.py")) - len("x.py"))
if os.name == 'nt' and cached_path_len >= 258:
# Under Windows, the max path len is 260 including C's terminating
# NUL character.
diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py
index 0cf61cb..1bf2a5a 100644
--- a/Lib/test/test_resource.py
+++ b/Lib/test/test_resource.py
@@ -61,7 +61,7 @@ class ResourceTest(unittest.TestCase):
for i in range(5):
time.sleep(.1)
f.flush()
- except IOError:
+ except OSError:
if not limit_set:
raise
if limit_set:
diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py
index 2ddba34..16e2e12 100644
--- a/Lib/test/test_runpy.py
+++ b/Lib/test/test_runpy.py
@@ -575,12 +575,5 @@ s = "non-ASCII: h\xe9"
self.assertEqual(result['s'], "non-ASCII: h\xe9")
-def test_main():
- run_unittest(
- ExecutionLayerTestCase,
- RunModuleTestCase,
- RunPathTestCase
- )
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py
index 070886d..c6abf3d 100644
--- a/Lib/test/test_sched.py
+++ b/Lib/test/test_sched.py
@@ -197,8 +197,5 @@ class TestCase(unittest.TestCase):
self.assertEqual(l, [])
-def test_main():
- support.run_unittest(TestCase)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py
index 26ce042..b325545 100644
--- a/Lib/test/test_scope.py
+++ b/Lib/test/test_scope.py
@@ -715,6 +715,19 @@ class ScopeTests(unittest.TestCase):
def b():
global a
+ def testClassNamespaceOverridesClosure(self):
+ # See #17853.
+ x = 42
+ class X:
+ locals()["x"] = 43
+ y = x
+ self.assertEqual(X.y, 43)
+ class X:
+ locals()["x"] = 43
+ del x
+ self.assertFalse(hasattr(X, "x"))
+ self.assertEqual(x, 42)
+
@cpython_only
def testCellLeak(self):
# Issue 17927.
@@ -743,10 +756,6 @@ class ScopeTests(unittest.TestCase):
del tester
self.assertIsNone(ref())
- def test__Class__Global(self):
- s = "class X:\n global __class__\n def f(self): super()"
- self.assertRaises(SyntaxError, exec, s)
-
def test_main():
run_unittest(ScopeTests)
diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py
index ddb9a0f..8f9a1c9 100644
--- a/Lib/test/test_select.py
+++ b/Lib/test/test_select.py
@@ -5,7 +5,7 @@ import sys
import unittest
from test import support
-@unittest.skipIf(sys.platform[:3] in ('win', 'os2', 'riscos'),
+@unittest.skipIf((sys.platform[:3]=='win'),
"can't easily test on this system")
class SelectTestCase(unittest.TestCase):
@@ -32,7 +32,7 @@ class SelectTestCase(unittest.TestCase):
fp.close()
try:
select.select([fd], [], [], 0)
- except select.error as err:
+ except OSError as err:
self.assertEqual(err.errno, errno.EBADF)
else:
self.fail("exception not raised")
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
index 8f86156..f8c7180 100644
--- a/Lib/test/test_set.py
+++ b/Lib/test/test_set.py
@@ -848,8 +848,6 @@ class TestBasicOps:
for v in self.set:
self.assertIn(v, self.values)
setiter = iter(self.set)
- # note: __length_hint__ is an internal undocumented API,
- # don't rely on it in your own programs
self.assertEqual(setiter.__length_hint__(), len(self.set))
def test_pickling(self):
diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py
index 13c1265..bd51d86 100644
--- a/Lib/test/test_shelve.py
+++ b/Lib/test/test_shelve.py
@@ -148,6 +148,19 @@ class TestCase(unittest.TestCase):
p2 = d[encodedkey]
self.assertNotEqual(p1, p2) # Write creates new object in store
+ def test_with(self):
+ d1 = {}
+ with shelve.Shelf(d1, protocol=2, writeback=False) as s:
+ s['key1'] = [1,2,3,4]
+ self.assertEqual(s['key1'], [1,2,3,4])
+ self.assertEqual(len(s), 1)
+ self.assertRaises(ValueError, len, s)
+ try:
+ s['key1']
+ except ValueError:
+ pass
+ else:
+ self.fail('Closed shelf should not find a key')
from test import mapping_tests
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index 9af7da7..0c24b7e 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -18,7 +18,8 @@ from shutil import (_make_tarball, _make_zipfile, make_archive,
register_archive_format, unregister_archive_format,
get_archive_formats, Error, unpack_archive,
register_unpack_format, RegistryError,
- unregister_unpack_format, get_unpack_formats)
+ unregister_unpack_format, get_unpack_formats,
+ SameFileError)
import tarfile
import warnings
@@ -765,7 +766,7 @@ class TestShutil(unittest.TestCase):
with open(src, 'w') as f:
f.write('cheddar')
os.link(src, dst)
- self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
+ self.assertRaises(shutil.SameFileError, shutil.copyfile, src, dst)
with open(src, 'r') as f:
self.assertEqual(f.read(), 'cheddar')
os.remove(dst)
@@ -785,7 +786,7 @@ class TestShutil(unittest.TestCase):
# to TESTFN/TESTFN/cheese, while it should point at
# TESTFN/cheese.
os.symlink('cheese', dst)
- self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
+ self.assertRaises(shutil.SameFileError, shutil.copyfile, src, dst)
with open(src, 'r') as f:
self.assertEqual(f.read(), 'cheddar')
os.remove(dst)
@@ -1292,6 +1293,16 @@ class TestShutil(unittest.TestCase):
self.assertTrue(os.path.exists(rv))
self.assertEqual(read_file(src_file), read_file(dst_file))
+ def test_copyfile_same_file(self):
+ # copyfile() should raise SameFileError if the source and destination
+ # are the same.
+ src_dir = self.mkdtemp()
+ src_file = os.path.join(src_dir, 'foo')
+ write_file(src_file, 'foo')
+ self.assertRaises(SameFileError, shutil.copyfile, src_file, src_file)
+ # But Error should work too, to stay backward compatible.
+ self.assertRaises(Error, shutil.copyfile, src_file, src_file)
+
def test_copytree_return_value(self):
# copytree returns its destination path.
src_dir = self.mkdtemp()
@@ -1587,7 +1598,7 @@ class TestCopyFile(unittest.TestCase):
self._exited_with = exc_type, exc_val, exc_tb
if self._raise_in_exit:
self._raised = True
- raise IOError("Cannot close")
+ raise OSError("Cannot close")
return self._suppress_at_exit
def tearDown(self):
@@ -1601,12 +1612,12 @@ class TestCopyFile(unittest.TestCase):
def test_w_source_open_fails(self):
def _open(filename, mode='r'):
if filename == 'srcfile':
- raise IOError('Cannot open "srcfile"')
+ raise OSError('Cannot open "srcfile"')
assert 0 # shouldn't reach here.
self._set_shutil_open(_open)
- self.assertRaises(IOError, shutil.copyfile, 'srcfile', 'destfile')
+ self.assertRaises(OSError, shutil.copyfile, 'srcfile', 'destfile')
def test_w_dest_open_fails(self):
@@ -1616,14 +1627,14 @@ class TestCopyFile(unittest.TestCase):
if filename == 'srcfile':
return srcfile
if filename == 'destfile':
- raise IOError('Cannot open "destfile"')
+ raise OSError('Cannot open "destfile"')
assert 0 # shouldn't reach here.
self._set_shutil_open(_open)
shutil.copyfile('srcfile', 'destfile')
self.assertTrue(srcfile._entered)
- self.assertTrue(srcfile._exited_with[0] is IOError)
+ self.assertTrue(srcfile._exited_with[0] is OSError)
self.assertEqual(srcfile._exited_with[1].args,
('Cannot open "destfile"',))
@@ -1645,7 +1656,7 @@ class TestCopyFile(unittest.TestCase):
self.assertTrue(srcfile._entered)
self.assertTrue(destfile._entered)
self.assertTrue(destfile._raised)
- self.assertTrue(srcfile._exited_with[0] is IOError)
+ self.assertTrue(srcfile._exited_with[0] is OSError)
self.assertEqual(srcfile._exited_with[1].args,
('Cannot close',))
@@ -1663,7 +1674,7 @@ class TestCopyFile(unittest.TestCase):
self._set_shutil_open(_open)
- self.assertRaises(IOError,
+ self.assertRaises(OSError,
shutil.copyfile, 'srcfile', 'destfile')
self.assertTrue(srcfile._entered)
self.assertTrue(destfile._entered)
@@ -1734,9 +1745,5 @@ class TermsizeTests(unittest.TestCase):
self.assertEqual(expected, actual)
-def test_main():
- support.run_unittest(TestShutil, TestMove, TestCopyFile,
- TermsizeTests, TestWhich)
-
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 9b4ba50..3530d8a 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -15,9 +15,6 @@ try:
except ImportError:
threading = None
-if sys.platform in ('os2', 'riscos'):
- raise unittest.SkipTest("Can't test signal on %s" % sys.platform)
-
class HandlerBCalled(Exception):
pass
@@ -36,7 +33,7 @@ def exit_subprocess():
def ignoring_eintr(__func, *args, **kwargs):
try:
return __func(*args, **kwargs)
- except EnvironmentError as e:
+ except OSError as e:
if e.errno != errno.EINTR:
raise
return None
@@ -278,6 +275,57 @@ class WakeupSignalTests(unittest.TestCase):
assert_python_ok('-c', code)
+ def test_wakeup_write_error(self):
+ # Issue #16105: write() errors in the C signal handler should not
+ # pass silently.
+ # Use a subprocess to have only one thread.
+ code = """if 1:
+ import errno
+ import fcntl
+ import os
+ import signal
+ import sys
+ import time
+ from test.support import captured_stderr
+
+ def handler(signum, frame):
+ 1/0
+
+ signal.signal(signal.SIGALRM, handler)
+ r, w = os.pipe()
+ flags = fcntl.fcntl(r, fcntl.F_GETFL, 0)
+ fcntl.fcntl(r, fcntl.F_SETFL, flags | os.O_NONBLOCK)
+
+ # Set wakeup_fd a read-only file descriptor to trigger the error
+ signal.set_wakeup_fd(r)
+ try:
+ with captured_stderr() as err:
+ signal.alarm(1)
+ time.sleep(5.0)
+ except ZeroDivisionError:
+ # An ignored exception should have been printed out on stderr
+ err = err.getvalue()
+ if ('Exception ignored when trying to write to the signal wakeup fd'
+ not in err):
+ raise AssertionError(err)
+ if ('OSError: [Errno %d]' % errno.EBADF) not in err:
+ raise AssertionError(err)
+ else:
+ raise AssertionError("ZeroDivisionError not raised")
+ """
+ r, w = os.pipe()
+ try:
+ os.write(r, b'x')
+ except OSError:
+ pass
+ else:
+ self.skipTest("OS doesn't report write() error on the read end of a pipe")
+ finally:
+ os.close(r)
+ os.close(w)
+
+ assert_python_ok('-c', code)
+
def test_wakeup_fd_early(self):
self.check_wakeup("""def test():
import select
@@ -315,10 +363,10 @@ class WakeupSignalTests(unittest.TestCase):
# We attempt to get a signal during the select call
try:
select.select([read], [], [], TIMEOUT_FULL)
- except select.error:
+ except OSError:
pass
else:
- raise Exception("select.error not raised")
+ raise Exception("OSError not raised")
after_time = time.time()
dt = after_time - before_time
if dt >= TIMEOUT_HALF:
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index 29286c7..4aff932 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -222,11 +222,7 @@ class HelperFunctionsTests(unittest.TestCase):
site.PREFIXES = ['xoxo']
dirs = site.getsitepackages()
- if sys.platform in ('os2emx', 'riscos'):
- self.assertEqual(len(dirs), 1)
- wanted = os.path.join('xoxo', 'Lib', 'site-packages')
- self.assertEqual(dirs[0], wanted)
- elif (sys.platform == "darwin" and
+ if (sys.platform == "darwin" and
sysconfig.get_config_var("PYTHONFRAMEWORK")):
# OS X framework builds
site.PREFIXES = ['Python.framework']
@@ -405,8 +401,6 @@ class ImportSideEffectTests(unittest.TestCase):
else:
self.fail("sitecustomize not imported automatically")
-def test_main():
- run_unittest(HelperFunctionsTests, ImportSideEffectTests)
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_slice.py b/Lib/test/test_slice.py
index 2df9271..9203d5e 100644
--- a/Lib/test/test_slice.py
+++ b/Lib/test/test_slice.py
@@ -4,8 +4,70 @@ import unittest
from test import support
from pickle import loads, dumps
+import itertools
+import operator
import sys
+
+def evaluate_slice_index(arg):
+ """
+ Helper function to convert a slice argument to an integer, and raise
+ TypeError with a suitable message on failure.
+
+ """
+ if hasattr(arg, '__index__'):
+ return operator.index(arg)
+ else:
+ raise TypeError(
+ "slice indices must be integers or "
+ "None or have an __index__ method")
+
+def slice_indices(slice, length):
+ """
+ Reference implementation for the slice.indices method.
+
+ """
+ # Compute step and length as integers.
+ length = operator.index(length)
+ step = 1 if slice.step is None else evaluate_slice_index(slice.step)
+
+ # Raise ValueError for negative length or zero step.
+ if length < 0:
+ raise ValueError("length should not be negative")
+ if step == 0:
+ raise ValueError("slice step cannot be zero")
+
+ # Find lower and upper bounds for start and stop.
+ lower = -1 if step < 0 else 0
+ upper = length - 1 if step < 0 else length
+
+ # Compute start.
+ if slice.start is None:
+ start = upper if step < 0 else lower
+ else:
+ start = evaluate_slice_index(slice.start)
+ start = max(start + length, lower) if start < 0 else min(start, upper)
+
+ # Compute stop.
+ if slice.stop is None:
+ stop = lower if step < 0 else upper
+ else:
+ stop = evaluate_slice_index(slice.stop)
+ stop = max(stop + length, lower) if stop < 0 else min(stop, upper)
+
+ return start, stop, step
+
+
+# Class providing an __index__ method. Used for testing slice.indices.
+
+class MyIndexable(object):
+ def __init__(self, value):
+ self.value = value
+
+ def __index__(self):
+ return self.value
+
+
class SliceTest(unittest.TestCase):
def test_constructor(self):
@@ -75,6 +137,22 @@ class SliceTest(unittest.TestCase):
s = slice(obj)
self.assertTrue(s.stop is obj)
+ def check_indices(self, slice, length):
+ try:
+ actual = slice.indices(length)
+ except ValueError:
+ actual = "valueerror"
+ try:
+ expected = slice_indices(slice, length)
+ except ValueError:
+ expected = "valueerror"
+ self.assertEqual(actual, expected)
+
+ if length >= 0 and slice.step != 0:
+ actual = range(*slice.indices(length))
+ expected = range(length)[slice]
+ self.assertEqual(actual, expected)
+
def test_indices(self):
self.assertEqual(slice(None ).indices(10), (0, 10, 1))
self.assertEqual(slice(None, None, 2).indices(10), (0, 10, 2))
@@ -108,7 +186,41 @@ class SliceTest(unittest.TestCase):
self.assertEqual(list(range(10))[::sys.maxsize - 1], [0])
- self.assertRaises(OverflowError, slice(None).indices, 1<<100)
+ # Check a variety of start, stop, step and length values, including
+ # values exceeding sys.maxsize (see issue #14794).
+ vals = [None, -2**100, -2**30, -53, -7, -1, 0, 1, 7, 53, 2**30, 2**100]
+ lengths = [0, 1, 7, 53, 2**30, 2**100]
+ for slice_args in itertools.product(vals, repeat=3):
+ s = slice(*slice_args)
+ for length in lengths:
+ self.check_indices(s, length)
+ self.check_indices(slice(0, 10, 1), -3)
+
+ # Negative length should raise ValueError
+ with self.assertRaises(ValueError):
+ slice(None).indices(-1)
+
+ # Zero step should raise ValueError
+ with self.assertRaises(ValueError):
+ slice(0, 10, 0).indices(5)
+
+ # Using a start, stop or step or length that can't be interpreted as an
+ # integer should give a TypeError ...
+ with self.assertRaises(TypeError):
+ slice(0.0, 10, 1).indices(5)
+ with self.assertRaises(TypeError):
+ slice(0, 10.0, 1).indices(5)
+ with self.assertRaises(TypeError):
+ slice(0, 10, 1.0).indices(5)
+ with self.assertRaises(TypeError):
+ slice(0, 10, 1).indices(5.0)
+
+ # ... but it should be fine to use a custom class that provides index.
+ self.assertEqual(slice(0, 10, 1).indices(5), (0, 5, 1))
+ self.assertEqual(slice(MyIndexable(0), 10, 1).indices(5), (0, 5, 1))
+ self.assertEqual(slice(0, MyIndexable(10), 1).indices(5), (0, 5, 1))
+ self.assertEqual(slice(0, 10, MyIndexable(1)).indices(5), (0, 5, 1))
+ self.assertEqual(slice(0, 10, 1).indices(MyIndexable(5)), (0, 5, 1))
def test_setslice_without_getslice(self):
tmp = []
diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py
index f93d355..8f64ec1 100644
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -222,7 +222,7 @@ class DebuggingServerTests(unittest.TestCase):
self.assertEqual(smtp.source_address, ('127.0.0.1', port))
self.assertEqual(smtp.local_hostname, 'localhost')
smtp.quit()
- except IOError as e:
+ except OSError as e:
if e.errno == errno.EADDRINUSE:
self.skipTest("couldn't bind to port %d" % port)
raise
@@ -524,12 +524,6 @@ class DebuggingServerTests(unittest.TestCase):
class NonConnectingTests(unittest.TestCase):
- def setUp(self):
- smtplib.socket = mock_socket
-
- def tearDown(self):
- smtplib.socket = socket
-
def testNotConnected(self):
# Test various operations on an unconnected SMTP object that
# should raise exceptions (at present the attempt in SMTP.send
@@ -541,10 +535,10 @@ class NonConnectingTests(unittest.TestCase):
smtp.send, 'test msg')
def testNonnumericPort(self):
- # check that non-numeric port raises socket.error
- self.assertRaises(mock_socket.error, smtplib.SMTP,
+ # check that non-numeric port raises OSError
+ self.assertRaises(OSError, smtplib.SMTP,
"localhost", "bogus")
- self.assertRaises(mock_socket.error, smtplib.SMTP,
+ self.assertRaises(OSError, smtplib.SMTP,
"localhost:bogus")
diff --git a/Lib/test/test_sndhdr.py b/Lib/test/test_sndhdr.py
index 1004688..5e0abe0 100644
--- a/Lib/test/test_sndhdr.py
+++ b/Lib/test/test_sndhdr.py
@@ -12,7 +12,7 @@ class TestFormats(unittest.TestCase):
('sndhdr.hcom', ('hcom', 22050.0, 1, -1, 8)),
('sndhdr.sndt', ('sndt', 44100, 1, 5, 8)),
('sndhdr.voc', ('voc', 0, 1, -1, 8)),
- ('sndhdr.wav', ('wav', 44100, 2, -1, 16)),
+ ('sndhdr.wav', ('wav', 44100, 2, 5, 16)),
):
filename = findfile(filename, subdir="sndhdrdata")
what = sndhdr.what(filename)
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index fa9a65f..54fb9a1 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -2,7 +2,6 @@
import unittest
from test import support
-from unittest.case import _ExpectedFailure
import errno
import io
@@ -46,7 +45,7 @@ def _have_socket_can():
"""Check whether CAN sockets are supported on this host."""
try:
s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
- except (AttributeError, socket.error, OSError):
+ except (AttributeError, OSError):
return False
else:
s.close()
@@ -121,12 +120,42 @@ class SocketCANTest(unittest.TestCase):
interface = 'vcan0'
bufsize = 128
+ """The CAN frame structure is defined in <linux/can.h>:
+
+ struct can_frame {
+ canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
+ __u8 can_dlc; /* data length code: 0 .. 8 */
+ __u8 data[8] __attribute__((aligned(8)));
+ };
+ """
+ can_frame_fmt = "=IB3x8s"
+ can_frame_size = struct.calcsize(can_frame_fmt)
+
+ """The Broadcast Management Command frame structure is defined
+ in <linux/can/bcm.h>:
+
+ struct bcm_msg_head {
+ __u32 opcode;
+ __u32 flags;
+ __u32 count;
+ struct timeval ival1, ival2;
+ canid_t can_id;
+ __u32 nframes;
+ struct can_frame frames[0];
+ }
+
+ `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
+ `struct can_frame` definition). Must use native not standard types for packing.
+ """
+ bcm_cmd_msg_fmt = "@3I4l2I"
+ bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
+
def setUp(self):
self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
self.addCleanup(self.s.close)
try:
self.s.bind((self.interface,))
- except socket.error:
+ except OSError:
self.skipTest('network interface `%s` does not exist' %
self.interface)
@@ -242,9 +271,6 @@ class ThreadableTest:
raise TypeError("test_func must be a callable function")
try:
test_func()
- except _ExpectedFailure:
- # We deliberately ignore expected failures
- pass
except BaseException as e:
self.queue.put(e)
finally:
@@ -295,7 +321,7 @@ class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
try:
self.cli.bind((self.interface,))
- except socket.error:
+ except OSError:
# skipTest should not be called here, and will be called in the
# server instead
pass
@@ -608,7 +634,7 @@ def requireSocket(*args):
for obj in args]
try:
s = socket.socket(*callargs)
- except socket.error as e:
+ except OSError as e:
# XXX: check errno?
err = str(e)
else:
@@ -626,8 +652,17 @@ class GeneralModuleTests(unittest.TestCase):
def test_repr(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.addCleanup(s.close)
- self.assertTrue(repr(s).startswith("<socket.socket object"))
+ with s:
+ self.assertIn('fd=%i' % s.fileno(), repr(s))
+ self.assertIn('family=%i' % socket.AF_INET, repr(s))
+ self.assertIn('type=%i' % socket.SOCK_STREAM, repr(s))
+ self.assertIn('proto=0', repr(s))
+ self.assertNotIn('raddr', repr(s))
+ s.bind(('127.0.0.1', 0))
+ self.assertIn('laddr', repr(s))
+ self.assertIn(str(s.getsockname()), repr(s))
+ self.assertIn('[closed]', repr(s))
+ self.assertNotIn('laddr', repr(s))
def test_weakref(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -645,11 +680,11 @@ class GeneralModuleTests(unittest.TestCase):
def testSocketError(self):
# Testing socket module exceptions
msg = "Error raising socket exception (%s)."
- with self.assertRaises(socket.error, msg=msg % 'socket.error'):
- raise socket.error
- with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
+ with self.assertRaises(OSError, msg=msg % 'OSError'):
+ raise OSError
+ with self.assertRaises(OSError, msg=msg % 'socket.herror'):
raise socket.herror
- with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
+ with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
raise socket.gaierror
def testSendtoErrors(self):
@@ -712,13 +747,13 @@ class GeneralModuleTests(unittest.TestCase):
hostname = socket.gethostname()
try:
ip = socket.gethostbyname(hostname)
- except socket.error:
+ except OSError:
# Probably name lookup wasn't set up right; skip this test
return
self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
try:
hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
- except socket.error:
+ except OSError:
# Probably a similar problem as above; skip this test
return
all_host_names = [hostname, hname] + aliases
@@ -732,7 +767,7 @@ class GeneralModuleTests(unittest.TestCase):
oldhn = socket.gethostname()
try:
socket.sethostname('new')
- except socket.error as e:
+ except OSError as e:
if e.errno == errno.EPERM:
self.skipTest("test should be run as root")
else:
@@ -766,8 +801,8 @@ class GeneralModuleTests(unittest.TestCase):
'socket.if_nameindex() not available.')
def testInvalidInterfaceNameIndex(self):
# test nonexistent interface index/name
- self.assertRaises(socket.error, socket.if_indextoname, 0)
- self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
+ self.assertRaises(OSError, socket.if_indextoname, 0)
+ self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
# test with invalid values
self.assertRaises(TypeError, socket.if_nametoindex, 0)
self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
@@ -788,7 +823,7 @@ class GeneralModuleTests(unittest.TestCase):
try:
# On some versions, this crashes the interpreter.
socket.getnameinfo(('x', 0, 0, 0), 0)
- except socket.error:
+ except OSError:
pass
def testNtoH(self):
@@ -835,17 +870,17 @@ class GeneralModuleTests(unittest.TestCase):
try:
port = socket.getservbyname(service, 'tcp')
break
- except socket.error:
+ except OSError:
pass
else:
- raise socket.error
+ raise OSError
# Try same call with optional protocol omitted
port2 = socket.getservbyname(service)
eq(port, port2)
# Try udp, but don't barf if it doesn't exist
try:
udpport = socket.getservbyname(service, 'udp')
- except socket.error:
+ except OSError:
udpport = None
else:
eq(udpport, port)
@@ -901,7 +936,7 @@ class GeneralModuleTests(unittest.TestCase):
g = lambda a: inet_pton(AF_INET, a)
assertInvalid = lambda func,a: self.assertRaises(
- (socket.error, ValueError), func, a
+ (OSError, ValueError), func, a
)
self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
@@ -936,7 +971,7 @@ class GeneralModuleTests(unittest.TestCase):
return
f = lambda a: inet_pton(AF_INET6, a)
assertInvalid = lambda a: self.assertRaises(
- (socket.error, ValueError), f, a
+ (OSError, ValueError), f, a
)
self.assertEqual(b'\x00' * 16, f('::'))
@@ -985,7 +1020,7 @@ class GeneralModuleTests(unittest.TestCase):
from socket import inet_ntoa as f, inet_ntop, AF_INET
g = lambda a: inet_ntop(AF_INET, a)
assertInvalid = lambda func,a: self.assertRaises(
- (socket.error, ValueError), func, a
+ (OSError, ValueError), func, a
)
self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
@@ -1014,7 +1049,7 @@ class GeneralModuleTests(unittest.TestCase):
return
f = lambda a: inet_ntop(AF_INET6, a)
assertInvalid = lambda a: self.assertRaises(
- (socket.error, ValueError), f, a
+ (OSError, ValueError), f, a
)
self.assertEqual('::', f(b'\x00' * 16))
@@ -1042,7 +1077,7 @@ class GeneralModuleTests(unittest.TestCase):
# At least for eCos. This is required for the S/390 to pass.
try:
my_ip_addr = socket.gethostbyname(socket.gethostname())
- except socket.error:
+ except OSError:
# Probably name lookup wasn't set up right; skip this test
return
self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
@@ -1069,7 +1104,7 @@ class GeneralModuleTests(unittest.TestCase):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
sock.close()
- self.assertRaises(socket.error, sock.send, b"spam")
+ self.assertRaises(OSError, sock.send, b"spam")
def testNewAttributes(self):
# testing .family, .type and .protocol
@@ -1172,7 +1207,7 @@ class GeneralModuleTests(unittest.TestCase):
def test_getnameinfo(self):
# only IP addresses are allowed
- self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
+ self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
@unittest.skipUnless(support.is_resource_enabled('network'),
'network is not enabled')
@@ -1295,10 +1330,35 @@ class BasicCANTest(unittest.TestCase):
socket.PF_CAN
socket.CAN_RAW
+ @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
+ 'socket.CAN_BCM required for this test.')
+ def testBCMConstants(self):
+ socket.CAN_BCM
+
+ # opcodes
+ socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
+ socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
+ socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
+ socket.CAN_BCM_TX_SEND # send one CAN frame
+ socket.CAN_BCM_RX_SETUP # create RX content filter subscription
+ socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
+ socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
+ socket.CAN_BCM_TX_STATUS # reply to TX_READ request
+ socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
+ socket.CAN_BCM_RX_STATUS # reply to RX_READ request
+ socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
+ socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
+
def testCreateSocket(self):
with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
pass
+ @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
+ 'socket.CAN_BCM required for this test.')
+ def testCreateBCMSocket(self):
+ with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
+ pass
+
def testBindAny(self):
with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
s.bind(('', ))
@@ -1306,7 +1366,7 @@ class BasicCANTest(unittest.TestCase):
def testTooLongInterfaceName(self):
# most systems limit IFNAMSIZ to 16, take 1024 to be sure
with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
- self.assertRaisesRegex(socket.error, 'interface name too long',
+ self.assertRaisesRegex(OSError, 'interface name too long',
s.bind, ('x' * 1024,))
@unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
@@ -1331,19 +1391,8 @@ class BasicCANTest(unittest.TestCase):
@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
-@unittest.skipUnless(thread, 'Threading required for this test.')
class CANTest(ThreadedCANSocketTest):
- """The CAN frame structure is defined in <linux/can.h>:
-
- struct can_frame {
- canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
- __u8 can_dlc; /* data length code: 0 .. 8 */
- __u8 data[8] __attribute__((aligned(8)));
- };
- """
- can_frame_fmt = "=IB3x8s"
-
def __init__(self, methodName='runTest'):
ThreadedCANSocketTest.__init__(self, methodName=methodName)
@@ -1392,6 +1441,46 @@ class CANTest(ThreadedCANSocketTest):
self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
self.cli.send(self.cf2)
+ @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
+ 'socket.CAN_BCM required for this test.')
+ def _testBCM(self):
+ cf, addr = self.cli.recvfrom(self.bufsize)
+ self.assertEqual(self.cf, cf)
+ can_id, can_dlc, data = self.dissect_can_frame(cf)
+ self.assertEqual(self.can_id, can_id)
+ self.assertEqual(self.data, data)
+
+ @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
+ 'socket.CAN_BCM required for this test.')
+ def testBCM(self):
+ bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
+ self.addCleanup(bcm.close)
+ bcm.connect((self.interface,))
+ self.can_id = 0x123
+ self.data = bytes([0xc0, 0xff, 0xee])
+ self.cf = self.build_can_frame(self.can_id, self.data)
+ opcode = socket.CAN_BCM_TX_SEND
+ flags = 0
+ count = 0
+ ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
+ bcm_can_id = 0x0222
+ nframes = 1
+ assert len(self.cf) == 16
+ header = struct.pack(self.bcm_cmd_msg_fmt,
+ opcode,
+ flags,
+ count,
+ ival1_seconds,
+ ival1_usec,
+ ival2_seconds,
+ ival2_usec,
+ bcm_can_id,
+ nframes,
+ )
+ header_plus_frame = header + self.cf
+ bytes_sent = bcm.send(header_plus_frame)
+ self.assertEqual(bytes_sent, len(header_plus_frame))
+
@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
class BasicRDSTest(unittest.TestCase):
@@ -1606,7 +1695,7 @@ class BasicTCPTest(SocketConnectedTest):
self.assertEqual(f, fileno)
# cli_conn cannot be used anymore...
self.assertTrue(self.cli_conn._closed)
- self.assertRaises(socket.error, self.cli_conn.recv, 1024)
+ self.assertRaises(OSError, self.cli_conn.recv, 1024)
self.cli_conn.close()
# ...but we can create another socket using the (still open)
# file descriptor
@@ -1975,7 +2064,7 @@ class SendmsgTests(SendrecvmsgServerTimeoutBase):
def _testSendmsgExcessCmsgReject(self):
if not hasattr(socket, "CMSG_SPACE"):
# Can only send one item
- with self.assertRaises(socket.error) as cm:
+ with self.assertRaises(OSError) as cm:
self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
self.assertIsNone(cm.exception.errno)
self.sendToServer(b"done")
@@ -1986,7 +2075,7 @@ class SendmsgTests(SendrecvmsgServerTimeoutBase):
def _testSendmsgAfterClose(self):
self.cli_sock.close()
- self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
+ self.assertRaises(OSError, self.sendmsgToServer, [MSG])
class SendmsgStreamTests(SendmsgTests):
@@ -2030,7 +2119,7 @@ class SendmsgStreamTests(SendmsgTests):
@testSendmsgDontWait.client_skip
def _testSendmsgDontWait(self):
try:
- with self.assertRaises(socket.error) as cm:
+ with self.assertRaises(OSError) as cm:
while True:
self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
self.assertIn(cm.exception.errno,
@@ -2050,9 +2139,9 @@ class SendmsgConnectionlessTests(SendmsgTests):
pass
def _testSendmsgNoDestAddr(self):
- self.assertRaises(socket.error, self.cli_sock.sendmsg,
+ self.assertRaises(OSError, self.cli_sock.sendmsg,
[MSG])
- self.assertRaises(socket.error, self.cli_sock.sendmsg,
+ self.assertRaises(OSError, self.cli_sock.sendmsg,
[MSG], [], 0, None)
@@ -2138,7 +2227,7 @@ class RecvmsgGenericTests(SendrecvmsgBase):
def testRecvmsgAfterClose(self):
# Check that recvmsg[_into]() fails on a closed socket.
self.serv_sock.close()
- self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
+ self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
def _testRecvmsgAfterClose(self):
pass
@@ -2584,7 +2673,7 @@ class SCMRightsTest(SendrecvmsgServerTimeoutBase):
# call fails, just send msg with no ancillary data.
try:
nbytes = self.sendmsgToServer([msg], ancdata)
- except socket.error as e:
+ except OSError as e:
# Check that it was the system call that failed
self.assertIsInstance(e.errno, int)
nbytes = self.sendmsgToServer([msg])
@@ -2962,7 +3051,7 @@ class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
array.array("i", [self.hop_limit]))])
- except socket.error as e:
+ except OSError as e:
self.assertIsInstance(e.errno, int)
nbytes = self.sendmsgToServer(
[MSG],
@@ -3420,10 +3509,10 @@ class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
self.serv.settimeout(self.timeout)
def checkInterruptedRecv(self, func, *args, **kwargs):
- # Check that func(*args, **kwargs) raises socket.error with an
+ # Check that func(*args, **kwargs) raises OSError with an
# errno of EINTR when interrupted by a signal.
self.setAlarm(self.alarm_time)
- with self.assertRaises(socket.error) as cm:
+ with self.assertRaises(OSError) as cm:
func(*args, **kwargs)
self.assertNotIsInstance(cm.exception, socket.timeout)
self.assertEqual(cm.exception.errno, errno.EINTR)
@@ -3480,9 +3569,9 @@ class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
def checkInterruptedSend(self, func, *args, **kwargs):
# Check that func(*args, **kwargs), run in a loop, raises
- # socket.error with an errno of EINTR when interrupted by a
+ # OSError with an errno of EINTR when interrupted by a
# signal.
- with self.assertRaises(socket.error) as cm:
+ with self.assertRaises(OSError) as cm:
while True:
self.setAlarm(self.alarm_time)
func(*args, **kwargs)
@@ -3579,7 +3668,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
start = time.time()
try:
self.serv.accept()
- except socket.error:
+ except OSError:
pass
end = time.time()
self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
@@ -3604,7 +3693,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
start = time.time()
try:
self.serv.accept()
- except socket.error:
+ except OSError:
pass
end = time.time()
self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
@@ -3634,7 +3723,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
self.serv.setblocking(0)
try:
conn, addr = self.serv.accept()
- except socket.error:
+ except OSError:
pass
else:
self.fail("Error trying to do non-blocking accept.")
@@ -3664,7 +3753,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
conn.setblocking(0)
try:
msg = conn.recv(len(MSG))
- except socket.error:
+ except OSError:
pass
else:
self.fail("Error trying to do non-blocking recv.")
@@ -3747,7 +3836,7 @@ class FileObjectClassTestCase(SocketConnectedTest):
# First read raises a timeout
self.assertRaises(socket.timeout, self.read_file.read, 1)
# Second read is disallowed
- with self.assertRaises(IOError) as ctx:
+ with self.assertRaises(OSError) as ctx:
self.read_file.read(1)
self.assertIn("cannot read from timed out object", str(ctx.exception))
@@ -3839,7 +3928,7 @@ class FileObjectClassTestCase(SocketConnectedTest):
self.read_file.close()
self.assertRaises(ValueError, self.read_file.fileno)
self.cli_conn.close()
- self.assertRaises(socket.error, self.cli_conn.getsockname)
+ self.assertRaises(OSError, self.cli_conn.getsockname)
def _testRealClose(self):
pass
@@ -3876,7 +3965,7 @@ class FileObjectInterruptedTestCase(unittest.TestCase):
@staticmethod
def _raise_eintr():
- raise socket.error(errno.EINTR, "interrupted")
+ raise OSError(errno.EINTR, "interrupted")
def _textiowrap_mock_socket(self, mock, buffering=-1):
raw = socket.SocketIO(mock, "r")
@@ -3988,7 +4077,7 @@ class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
self.assertEqual(msg, self.read_msg)
# ...until the file is itself closed
self.read_file.close()
- self.assertRaises(socket.error, self.cli_conn.recv, 1024)
+ self.assertRaises(OSError, self.cli_conn.recv, 1024)
def _testMakefileClose(self):
self.write_file.write(self.write_msg)
@@ -4137,7 +4226,7 @@ class NetworkConnectionNoServer(unittest.TestCase):
port = support.find_unused_port()
cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.addCleanup(cli.close)
- with self.assertRaises(socket.error) as cm:
+ with self.assertRaises(OSError) as cm:
cli.connect((HOST, port))
self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
@@ -4145,7 +4234,7 @@ class NetworkConnectionNoServer(unittest.TestCase):
# Issue #9792: errors raised by create_connection() should have
# a proper errno attribute.
port = support.find_unused_port()
- with self.assertRaises(socket.error) as cm:
+ with self.assertRaises(OSError) as cm:
socket.create_connection((HOST, port))
# Issue #16257: create_connection() calls getaddrinfo() against
@@ -4293,7 +4382,7 @@ class TCPTimeoutTest(SocketTCPTest):
foo = self.serv.accept()
except socket.timeout:
self.fail("caught timeout instead of error (TCP)")
- except socket.error:
+ except OSError:
ok = True
except:
self.fail("caught unexpected exception (TCP)")
@@ -4350,7 +4439,7 @@ class UDPTimeoutTest(SocketUDPTest):
foo = self.serv.recv(1024)
except socket.timeout:
self.fail("caught timeout instead of error (UDP)")
- except socket.error:
+ except OSError:
ok = True
except:
self.fail("caught unexpected exception (UDP)")
@@ -4360,10 +4449,10 @@ class UDPTimeoutTest(SocketUDPTest):
class TestExceptions(unittest.TestCase):
def testExceptionTree(self):
- self.assertTrue(issubclass(socket.error, Exception))
- self.assertTrue(issubclass(socket.herror, socket.error))
- self.assertTrue(issubclass(socket.gaierror, socket.error))
- self.assertTrue(issubclass(socket.timeout, socket.error))
+ self.assertTrue(issubclass(OSError, Exception))
+ self.assertTrue(issubclass(socket.herror, OSError))
+ self.assertTrue(issubclass(socket.gaierror, OSError))
+ self.assertTrue(issubclass(socket.timeout, OSError))
class TestLinuxAbstractNamespace(unittest.TestCase):
@@ -4389,7 +4478,7 @@ class TestLinuxAbstractNamespace(unittest.TestCase):
def testNameOverflow(self):
address = "\x00" + "h" * self.UNIX_PATH_MAX
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
- self.assertRaises(socket.error, s.bind, address)
+ self.assertRaises(OSError, s.bind, address)
def testStrName(self):
# Check that an abstract name can be passed as a string.
@@ -4628,7 +4717,7 @@ class ContextManagersTest(ThreadedTCPSocketTest):
self.assertTrue(sock._closed)
# exception inside with block
with socket.socket() as sock:
- self.assertRaises(socket.error, sock.sendall, b'foo')
+ self.assertRaises(OSError, sock.sendall, b'foo')
self.assertTrue(sock._closed)
def testCreateConnectionBase(self):
@@ -4656,7 +4745,7 @@ class ContextManagersTest(ThreadedTCPSocketTest):
with socket.create_connection(address) as sock:
sock.close()
self.assertTrue(sock._closed)
- self.assertRaises(socket.error, sock.sendall, b'foo')
+ self.assertRaises(OSError, sock.sendall, b'foo')
@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
index 464057e..02c6c1e 100644
--- a/Lib/test/test_socketserver.py
+++ b/Lib/test/test_socketserver.py
@@ -2,8 +2,8 @@
Test suite for socketserver.
"""
+import _imp as imp
import contextlib
-import imp
import os
import select
import signal
@@ -27,7 +27,7 @@ TEST_STR = b"hello world\n"
HOST = test.support.HOST
HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX")
-HAVE_FORKING = hasattr(os, "fork") and os.name != "os2"
+HAVE_FORKING = hasattr(os, "fork")
def signal_alarm(n):
"""Call signal.alarm when it exists (i.e. not on Windows)."""
@@ -82,7 +82,7 @@ class SocketServerTest(unittest.TestCase):
for fn in self.test_files:
try:
os.remove(fn)
- except os.error:
+ except OSError:
pass
self.test_files[:] = []
@@ -93,21 +93,7 @@ class SocketServerTest(unittest.TestCase):
# XXX: We need a way to tell AF_UNIX to pick its own name
# like AF_INET provides port==0.
dir = None
- if os.name == 'os2':
- dir = '\socket'
fn = tempfile.mktemp(prefix='unix_socket.', dir=dir)
- if os.name == 'os2':
- # AF_UNIX socket names on OS/2 require a specific prefix
- # which can't include a drive letter and must also use
- # backslashes as directory separators
- if fn[1] == ':':
- fn = fn[2:]
- if fn[0] in (os.sep, os.altsep):
- fn = fn[1:]
- if os.sep == '/':
- fn = fn.replace(os.sep, os.altsep)
- else:
- fn = fn.replace(os.altsep, os.sep)
self.test_files.append(fn)
return fn
diff --git a/Lib/test/test_pep263.py b/Lib/test/test_source_encoding.py
index 324ae386..cd9d2b3 100644
--- a/Lib/test/test_pep263.py
+++ b/Lib/test/test_source_encoding.py
@@ -1,9 +1,12 @@
# -*- coding: koi8-r -*-
import unittest
-from test import support
+from test.support import TESTFN, unlink, unload
+import importlib
+import os
+import sys
-class PEP263Test(unittest.TestCase):
+class SourceEncodingTest(unittest.TestCase):
def test_pep263(self):
self.assertEqual(
@@ -72,9 +75,61 @@ class PEP263Test(unittest.TestCase):
with self.assertRaisesRegex(SyntaxError, 'BOM'):
compile(b'\xef\xbb\xbf# -*- coding: fake -*-\n', 'dummy', 'exec')
+ def test_bad_coding(self):
+ module_name = 'bad_coding'
+ self.verify_bad_module(module_name)
-def test_main():
- support.run_unittest(PEP263Test)
+ def test_bad_coding2(self):
+ module_name = 'bad_coding2'
+ self.verify_bad_module(module_name)
-if __name__=="__main__":
- test_main()
+ def verify_bad_module(self, module_name):
+ self.assertRaises(SyntaxError, __import__, 'test.' + module_name)
+
+ path = os.path.dirname(__file__)
+ filename = os.path.join(path, module_name + '.py')
+ with open(filename, "rb") as fp:
+ bytes = fp.read()
+ self.assertRaises(SyntaxError, compile, bytes, filename, 'exec')
+
+ def test_exec_valid_coding(self):
+ d = {}
+ exec(b'# coding: cp949\na = "\xaa\xa7"\n', d)
+ self.assertEqual(d['a'], '\u3047')
+
+ def test_file_parse(self):
+ # issue1134: all encodings outside latin-1 and utf-8 fail on
+ # multiline strings and long lines (>512 columns)
+ unload(TESTFN)
+ filename = TESTFN + ".py"
+ f = open(filename, "w", encoding="cp1252")
+ sys.path.insert(0, os.curdir)
+ try:
+ with f:
+ f.write("# -*- coding: cp1252 -*-\n")
+ f.write("'''A short string\n")
+ f.write("'''\n")
+ f.write("'A very long string %s'\n" % ("X" * 1000))
+
+ importlib.invalidate_caches()
+ __import__(TESTFN)
+ finally:
+ del sys.path[0]
+ unlink(filename)
+ unlink(filename + "c")
+ unlink(filename + "o")
+ unload(TESTFN)
+
+ def test_error_from_string(self):
+ # See http://bugs.python.org/issue6289
+ input = "# coding: ascii\n\N{SNOWMAN}".encode('utf-8')
+ with self.assertRaises(SyntaxError) as c:
+ compile(input, "<string>", "exec")
+ expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \
+ "ordinal not in range(128)"
+ self.assertTrue(c.exception.args[0].startswith(expected),
+ msg=c.exception.args[0])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
index 9bebd1a..6a99ad0 100644
--- a/Lib/test/test_ssl.py
+++ b/Lib/test/test_ssl.py
@@ -6,6 +6,7 @@ from test import support
import socket
import select
import time
+import datetime
import gc
import os
import errno
@@ -17,16 +18,11 @@ import asyncore
import weakref
import platform
import functools
+from unittest import mock
ssl = support.import_module("ssl")
-PROTOCOLS = [
- ssl.PROTOCOL_SSLv3,
- ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1
-]
-if hasattr(ssl, 'PROTOCOL_SSLv2'):
- PROTOCOLS.append(ssl.PROTOCOL_SSLv2)
-
+PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
HOST = support.HOST
data_file = lambda name: os.path.join(os.path.dirname(__file__), name)
@@ -48,6 +44,11 @@ KEY_PASSWORD = "somepass"
CAPATH = data_file("capath")
BYTES_CAPATH = os.fsencode(CAPATH)
+# Two keys and certs signed by the same CA (for SNI tests)
+SIGNED_CERTFILE = data_file("keycert3.pem")
+SIGNED_CERTFILE2 = data_file("keycert4.pem")
+SIGNING_CA = data_file("pycacert.pem")
+
SVN_PYTHON_ORG_ROOT_CERT = data_file("https_svn_python_org_root.pem")
EMPTYCERT = data_file("nullcert.pem")
@@ -60,6 +61,7 @@ NULLBYTECERT = data_file("nullbytecert.pem")
DHFILE = data_file("dh512.pem")
BYTES_DHFILE = os.fsencode(DHFILE)
+
def handle_error(prefix):
exc_format = ' '.join(traceback.format_exception(*sys.exc_info()))
if support.verbose:
@@ -73,6 +75,19 @@ def no_sslv2_implies_sslv3_hello():
# 0.9.7h or higher
return ssl.OPENSSL_VERSION_INFO >= (0, 9, 7, 8, 15)
+def asn1time(cert_time):
+ # Some versions of OpenSSL ignore seconds, see #18207
+ # 0.9.8.i
+ if ssl._OPENSSL_API_VERSION == (0, 9, 8, 9, 15):
+ fmt = "%b %d %H:%M:%S %Y GMT"
+ dt = datetime.datetime.strptime(cert_time, fmt)
+ dt = dt.replace(second=0)
+ cert_time = dt.strftime(fmt)
+ # %d adds leading zero but ASN1_TIME_print() uses leading space
+ if cert_time[4] == "0":
+ cert_time = cert_time[:4] + " " + cert_time[5:]
+
+ return cert_time
# Issue #9415: Ubuntu hijacks their OpenSSL and forcefully disables SSLv2
def skip_if_broken_ubuntu_ssl(func):
@@ -90,14 +105,12 @@ def skip_if_broken_ubuntu_ssl(func):
else:
return func
+needs_sni = unittest.skipUnless(ssl.HAS_SNI, "SNI support needed for this test")
+
class BasicSocketTests(unittest.TestCase):
def test_constants(self):
- #ssl.PROTOCOL_SSLv2
- ssl.PROTOCOL_SSLv23
- ssl.PROTOCOL_SSLv3
- ssl.PROTOCOL_TLSv1
ssl.CERT_NONE
ssl.CERT_OPTIONAL
ssl.CERT_REQUIRED
@@ -175,8 +188,9 @@ class BasicSocketTests(unittest.TestCase):
(('organizationName', 'Python Software Foundation'),),
(('commonName', 'localhost'),))
)
- self.assertEqual(p['notAfter'], 'Oct 5 23:01:56 2020 GMT')
- self.assertEqual(p['notBefore'], 'Oct 8 23:01:56 2010 GMT')
+ # Note the next three asserts will fail if the keys are regenerated
+ self.assertEqual(p['notAfter'], asn1time('Oct 5 23:01:56 2020 GMT'))
+ self.assertEqual(p['notBefore'], asn1time('Oct 8 23:01:56 2010 GMT'))
self.assertEqual(p['serialNumber'], 'D7C7381919AFC24E')
self.assertEqual(p['subject'],
((('countryName', 'XY'),),
@@ -268,15 +282,15 @@ class BasicSocketTests(unittest.TestCase):
def test_wrapped_unconnected(self):
# Methods on an unconnected SSLSocket propagate the original
- # socket.error raise by the underlying socket object.
+ # OSError raise by the underlying socket object.
s = socket.socket(socket.AF_INET)
with ssl.wrap_socket(s) as ss:
- self.assertRaises(socket.error, ss.recv, 1)
- self.assertRaises(socket.error, ss.recv_into, bytearray(b'x'))
- self.assertRaises(socket.error, ss.recvfrom, 1)
- self.assertRaises(socket.error, ss.recvfrom_into, bytearray(b'x'), 1)
- self.assertRaises(socket.error, ss.send, b'x')
- self.assertRaises(socket.error, ss.sendto, b'x', ('0.0.0.0', 0))
+ self.assertRaises(OSError, ss.recv, 1)
+ self.assertRaises(OSError, ss.recv_into, bytearray(b'x'))
+ self.assertRaises(OSError, ss.recvfrom, 1)
+ self.assertRaises(OSError, ss.recvfrom_into, bytearray(b'x'), 1)
+ self.assertRaises(OSError, ss.send, b'x')
+ self.assertRaises(OSError, ss.sendto, b'x', ('0.0.0.0', 0))
def test_timeout(self):
# Issue #8524: when creating an SSL socket, the timeout of the
@@ -301,15 +315,15 @@ class BasicSocketTests(unittest.TestCase):
with ssl.wrap_socket(sock, server_side=True, certfile=CERTFILE) as s:
self.assertRaisesRegex(ValueError, "can't connect in server-side mode",
s.connect, (HOST, 8080))
- with self.assertRaises(IOError) as cm:
+ with self.assertRaises(OSError) as cm:
with socket.socket() as sock:
ssl.wrap_socket(sock, certfile=WRONGCERT)
self.assertEqual(cm.exception.errno, errno.ENOENT)
- with self.assertRaises(IOError) as cm:
+ with self.assertRaises(OSError) as cm:
with socket.socket() as sock:
ssl.wrap_socket(sock, certfile=CERTFILE, keyfile=WRONGCERT)
self.assertEqual(cm.exception.errno, errno.ENOENT)
- with self.assertRaises(IOError) as cm:
+ with self.assertRaises(OSError) as cm:
with socket.socket() as sock:
ssl.wrap_socket(sock, certfile=WRONGCERT, keyfile=WRONGCERT)
self.assertEqual(cm.exception.errno, errno.ENOENT)
@@ -455,15 +469,48 @@ class BasicSocketTests(unittest.TestCase):
support.gc_collect()
self.assertIn(r, str(cm.warning.args[0]))
+ def test_get_default_verify_paths(self):
+ paths = ssl.get_default_verify_paths()
+ self.assertEqual(len(paths), 6)
+ self.assertIsInstance(paths, ssl.DefaultVerifyPaths)
+
+ with support.EnvironmentVarGuard() as env:
+ env["SSL_CERT_DIR"] = CAPATH
+ env["SSL_CERT_FILE"] = CERTFILE
+ paths = ssl.get_default_verify_paths()
+ self.assertEqual(paths.cafile, CERTFILE)
+ self.assertEqual(paths.capath, CAPATH)
+
+
+ @unittest.skipUnless(sys.platform == "win32", "Windows specific")
+ def test_enum_cert_store(self):
+ self.assertEqual(ssl.X509_ASN_ENCODING, 1)
+ self.assertEqual(ssl.PKCS_7_ASN_ENCODING, 0x00010000)
+
+ self.assertEqual(ssl.enum_cert_store("CA"),
+ ssl.enum_cert_store("CA", "certificate"))
+ ssl.enum_cert_store("CA", "crl")
+ self.assertEqual(ssl.enum_cert_store("ROOT"),
+ ssl.enum_cert_store("ROOT", "certificate"))
+ ssl.enum_cert_store("ROOT", "crl")
+
+ self.assertRaises(TypeError, ssl.enum_cert_store)
+ self.assertRaises(WindowsError, ssl.enum_cert_store, "")
+ self.assertRaises(ValueError, ssl.enum_cert_store, "CA", "wrong")
+
+ ca = ssl.enum_cert_store("CA")
+ self.assertIsInstance(ca, list)
+ self.assertIsInstance(ca[0], tuple)
+ self.assertEqual(len(ca[0]), 2)
+ self.assertIsInstance(ca[0][0], bytes)
+ self.assertIsInstance(ca[0][1], int)
+
class ContextTests(unittest.TestCase):
@skip_if_broken_ubuntu_ssl
def test_constructor(self):
- if hasattr(ssl, 'PROTOCOL_SSLv2'):
- ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv2)
- ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
- ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ for protocol in PROTOCOLS:
+ ssl.SSLContext(protocol)
self.assertRaises(TypeError, ssl.SSLContext)
self.assertRaises(ValueError, ssl.SSLContext, -1)
self.assertRaises(ValueError, ssl.SSLContext, 42)
@@ -523,7 +570,7 @@ class ContextTests(unittest.TestCase):
ctx.load_cert_chain(CERTFILE)
ctx.load_cert_chain(CERTFILE, keyfile=CERTFILE)
self.assertRaises(TypeError, ctx.load_cert_chain, keyfile=CERTFILE)
- with self.assertRaises(IOError) as cm:
+ with self.assertRaises(OSError) as cm:
ctx.load_cert_chain(WRONGCERT)
self.assertEqual(cm.exception.errno, errno.ENOENT)
with self.assertRaisesRegex(ssl.SSLError, "PEM lib"):
@@ -608,7 +655,7 @@ class ContextTests(unittest.TestCase):
ctx.load_verify_locations(cafile=BYTES_CERTFILE, capath=None)
self.assertRaises(TypeError, ctx.load_verify_locations)
self.assertRaises(TypeError, ctx.load_verify_locations, None, None)
- with self.assertRaises(IOError) as cm:
+ with self.assertRaises(OSError) as cm:
ctx.load_verify_locations(WRONGCERT)
self.assertEqual(cm.exception.errno, errno.ENOENT)
with self.assertRaisesRegex(ssl.SSLError, "PEM lib"):
@@ -666,6 +713,75 @@ class ContextTests(unittest.TestCase):
self.assertRaises(ValueError, ctx.set_ecdh_curve, "foo")
self.assertRaises(ValueError, ctx.set_ecdh_curve, b"foo")
+ @needs_sni
+ def test_sni_callback(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+
+ # set_servername_callback expects a callable, or None
+ self.assertRaises(TypeError, ctx.set_servername_callback)
+ self.assertRaises(TypeError, ctx.set_servername_callback, 4)
+ self.assertRaises(TypeError, ctx.set_servername_callback, "")
+ self.assertRaises(TypeError, ctx.set_servername_callback, ctx)
+
+ def dummycallback(sock, servername, ctx):
+ pass
+ ctx.set_servername_callback(None)
+ ctx.set_servername_callback(dummycallback)
+
+ @needs_sni
+ def test_sni_callback_refcycle(self):
+ # Reference cycles through the servername callback are detected
+ # and cleared.
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ def dummycallback(sock, servername, ctx, cycle=ctx):
+ pass
+ ctx.set_servername_callback(dummycallback)
+ wr = weakref.ref(ctx)
+ del ctx, dummycallback
+ gc.collect()
+ self.assertIs(wr(), None)
+
+ def test_cert_store_stats(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ self.assertEqual(ctx.cert_store_stats(),
+ {'x509_ca': 0, 'crl': 0, 'x509': 0})
+ ctx.load_cert_chain(CERTFILE)
+ self.assertEqual(ctx.cert_store_stats(),
+ {'x509_ca': 0, 'crl': 0, 'x509': 0})
+ ctx.load_verify_locations(CERTFILE)
+ self.assertEqual(ctx.cert_store_stats(),
+ {'x509_ca': 0, 'crl': 0, 'x509': 1})
+ ctx.load_verify_locations(SVN_PYTHON_ORG_ROOT_CERT)
+ self.assertEqual(ctx.cert_store_stats(),
+ {'x509_ca': 1, 'crl': 0, 'x509': 2})
+
+ def test_get_ca_certs(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ self.assertEqual(ctx.get_ca_certs(), [])
+ # CERTFILE is not flagged as X509v3 Basic Constraints: CA:TRUE
+ ctx.load_verify_locations(CERTFILE)
+ self.assertEqual(ctx.get_ca_certs(), [])
+ # but SVN_PYTHON_ORG_ROOT_CERT is a CA cert
+ ctx.load_verify_locations(SVN_PYTHON_ORG_ROOT_CERT)
+ self.assertEqual(ctx.get_ca_certs(),
+ [{'issuer': ((('organizationName', 'Root CA'),),
+ (('organizationalUnitName', 'http://www.cacert.org'),),
+ (('commonName', 'CA Cert Signing Authority'),),
+ (('emailAddress', 'support@cacert.org'),)),
+ 'notAfter': asn1time('Mar 29 12:29:49 2033 GMT'),
+ 'notBefore': asn1time('Mar 30 12:29:49 2003 GMT'),
+ 'serialNumber': '00',
+ 'subject': ((('organizationName', 'Root CA'),),
+ (('organizationalUnitName', 'http://www.cacert.org'),),
+ (('commonName', 'CA Cert Signing Authority'),),
+ (('emailAddress', 'support@cacert.org'),)),
+ 'version': 3}])
+
+ with open(SVN_PYTHON_ORG_ROOT_CERT) as f:
+ pem = f.read()
+ der = ssl.PEM_cert_to_DER_cert(pem)
+ self.assertEqual(ctx.get_ca_certs(True), [der])
+
class SSLErrorTests(unittest.TestCase):
@@ -981,6 +1097,22 @@ class NetworkedTests(unittest.TestCase):
finally:
s.close()
+ def test_get_ca_certs_capath(self):
+ # capath certs are loaded on request
+ with support.transient_internet("svn.python.org"):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ ctx.verify_mode = ssl.CERT_REQUIRED
+ ctx.load_verify_locations(capath=CAPATH)
+ self.assertEqual(ctx.get_ca_certs(), [])
+ s = ctx.wrap_socket(socket.socket(socket.AF_INET))
+ s.connect(("svn.python.org", 443))
+ try:
+ cert = s.getpeercert()
+ self.assertTrue(cert)
+ finally:
+ s.close()
+ self.assertEqual(len(ctx.get_ca_certs()), 1)
+
try:
import threading
@@ -1108,7 +1240,7 @@ else:
sys.stdout.write(" server: read %r (%s), sending back %r (%s)...\n"
% (msg, ctype, msg.lower(), ctype))
self.write(msg.lower())
- except socket.error:
+ except OSError:
if self.server.chatty:
handle_error("Test server failure:\n")
self.close()
@@ -1218,7 +1350,7 @@ else:
return self.handle_close()
except ssl.SSLError:
raise
- except socket.error as err:
+ except OSError as err:
if err.args[0] == errno.ECONNABORTED:
return self.handle_close()
else:
@@ -1322,19 +1454,19 @@ else:
except ssl.SSLError as x:
if support.verbose:
sys.stdout.write("\nSSLError is %s\n" % x.args[1])
- except socket.error as x:
+ except OSError as x:
if support.verbose:
- sys.stdout.write("\nsocket.error is %s\n" % x.args[1])
- except IOError as x:
+ sys.stdout.write("\nOSError is %s\n" % x.args[1])
+ except OSError as x:
if x.errno != errno.ENOENT:
raise
if support.verbose:
- sys.stdout.write("\IOError is %s\n" % str(x))
+ sys.stdout.write("\OSError is %s\n" % str(x))
else:
raise AssertionError("Use of invalid cert should have failed!")
def server_params_test(client_context, server_context, indata=b"FOO\n",
- chatty=True, connectionchatty=False):
+ chatty=True, connectionchatty=False, sni_name=None):
"""
Launch a server, connect a client to it and try various reads
and writes.
@@ -1344,7 +1476,8 @@ else:
chatty=chatty,
connectionchatty=False)
with server:
- with client_context.wrap_socket(socket.socket()) as s:
+ with client_context.wrap_socket(socket.socket(),
+ server_hostname=sni_name) as s:
s.connect((HOST, server.port))
for arg in [indata, bytearray(indata), memoryview(indata)]:
if connectionchatty:
@@ -1368,6 +1501,7 @@ else:
stats.update({
'compression': s.compression(),
'cipher': s.cipher(),
+ 'peercert': s.getpeercert(),
'client_npn_protocol': s.selected_npn_protocol()
})
s.close()
@@ -1393,12 +1527,15 @@ else:
client_context.options = ssl.OP_ALL | client_options
server_context = ssl.SSLContext(server_protocol)
server_context.options = ssl.OP_ALL | server_options
+
+ # NOTE: we must enable "ALL" ciphers on the client, otherwise an
+ # SSLv23 client will send an SSLv3 hello (rather than SSLv2)
+ # starting from OpenSSL 1.0.0 (see issue #8322).
+ if client_context.protocol == ssl.PROTOCOL_SSLv23:
+ client_context.set_ciphers("ALL")
+
for ctx in (client_context, server_context):
ctx.verify_mode = certsreqs
- # NOTE: we must enable "ALL" ciphers, otherwise an SSLv23 client
- # will send an SSLv3 hello (rather than SSLv2) starting from
- # OpenSSL 1.0.0 (see issue #8322).
- ctx.set_ciphers("ALL")
ctx.load_cert_chain(CERTFILE)
ctx.load_verify_locations(CERTFILE)
try:
@@ -1409,7 +1546,7 @@ else:
except ssl.SSLError:
if expect_success:
raise
- except socket.error as e:
+ except OSError as e:
if expect_success or e.errno != errno.ECONNRESET:
raise
else:
@@ -1428,10 +1565,11 @@ else:
if support.verbose:
sys.stdout.write("\n")
for protocol in PROTOCOLS:
- context = ssl.SSLContext(protocol)
- context.load_cert_chain(CERTFILE)
- server_params_test(context, context,
- chatty=True, connectionchatty=True)
+ with self.subTest(protocol=ssl._PROTOCOL_NAMES[protocol]):
+ context = ssl.SSLContext(protocol)
+ context.load_cert_chain(CERTFILE)
+ server_params_test(context, context,
+ chatty=True, connectionchatty=True)
def test_getpeercert(self):
if support.verbose:
@@ -1483,7 +1621,7 @@ else:
"badkey.pem"))
def test_rude_shutdown(self):
- """A brutal shutdown of an SSL server should raise an IOError
+ """A brutal shutdown of an SSL server should raise an OSError
in the client when attempting handshake.
"""
listener_ready = threading.Event()
@@ -1511,7 +1649,7 @@ else:
listener_gone.wait()
try:
ssl_sock = ssl.wrap_socket(c)
- except IOError:
+ except OSError:
pass
else:
self.fail('connecting to closed SSL socket should have failed')
@@ -1554,7 +1692,7 @@ else:
if hasattr(ssl, 'PROTOCOL_SSLv2'):
try:
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv2, True)
- except (ssl.SSLError, socket.error) as x:
+ except OSError as x:
# this fails on some older versions of OpenSSL (0.9.7l, for instance)
if support.verbose:
sys.stdout.write(
@@ -1614,6 +1752,49 @@ else:
try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False,
client_options=ssl.OP_NO_TLSv1)
+ @skip_if_broken_ubuntu_ssl
+ @unittest.skipUnless(hasattr(ssl, "PROTOCOL_TLSv1_1"),
+ "TLS version 1.1 not supported.")
+ def test_protocol_tlsv1_1(self):
+ """Connecting to a TLSv1.1 server with various client options.
+ Testing against older TLS versions."""
+ if support.verbose:
+ sys.stdout.write("\n")
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_1, ssl.PROTOCOL_TLSv1_1, True)
+ if hasattr(ssl, 'PROTOCOL_SSLv2'):
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_1, ssl.PROTOCOL_SSLv2, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_1, ssl.PROTOCOL_SSLv3, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_1, ssl.PROTOCOL_SSLv23, False,
+ client_options=ssl.OP_NO_TLSv1_1)
+
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1_1, True)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_1, ssl.PROTOCOL_TLSv1, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_TLSv1_1, False)
+
+
+ @skip_if_broken_ubuntu_ssl
+ @unittest.skipUnless(hasattr(ssl, "PROTOCOL_TLSv1_2"),
+ "TLS version 1.2 not supported.")
+ def test_protocol_tlsv1_2(self):
+ """Connecting to a TLSv1.2 server with various client options.
+ Testing against older TLS versions."""
+ if support.verbose:
+ sys.stdout.write("\n")
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_2, ssl.PROTOCOL_TLSv1_2, True,
+ server_options=ssl.OP_NO_SSLv3|ssl.OP_NO_SSLv2,
+ client_options=ssl.OP_NO_SSLv3|ssl.OP_NO_SSLv2,)
+ if hasattr(ssl, 'PROTOCOL_SSLv2'):
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_2, ssl.PROTOCOL_SSLv2, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_2, ssl.PROTOCOL_SSLv3, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_2, ssl.PROTOCOL_SSLv23, False,
+ client_options=ssl.OP_NO_TLSv1_2)
+
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1_2, True)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_2, ssl.PROTOCOL_TLSv1, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_TLSv1_2, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_2, ssl.PROTOCOL_TLSv1_1, False)
+ try_protocol_combo(ssl.PROTOCOL_TLSv1_1, ssl.PROTOCOL_TLSv1_2, False)
+
def test_starttls(self):
"""Switching from clear text to encrypted and back again."""
msgs = (b"msg 1", b"MSG 2", b"STARTTLS", b"MSG 3", b"msg 4", b"ENDTLS", b"msg 5", b"msg 6")
@@ -1674,7 +1855,7 @@ else:
def test_socketserver(self):
"""Using a SocketServer to create and manage SSL connections."""
- server = make_https_server(self, CERTFILE)
+ server = make_https_server(self, certfile=CERTFILE)
# try to connect
if support.verbose:
sys.stdout.write('\n')
@@ -1930,6 +2111,20 @@ else:
self.assertIsInstance(remote, ssl.SSLSocket)
self.assertEqual(peer, client_addr)
+ def test_getpeercert_enotconn(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ with context.wrap_socket(socket.socket()) as sock:
+ with self.assertRaises(OSError) as cm:
+ sock.getpeercert()
+ self.assertEqual(cm.exception.errno, errno.ENOTCONN)
+
+ def test_do_handshake_enotconn(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ with context.wrap_socket(socket.socket()) as sock:
+ with self.assertRaises(OSError) as cm:
+ sock.do_handshake()
+ self.assertEqual(cm.exception.errno, errno.ENOTCONN)
+
def test_default_ciphers(self):
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
try:
@@ -1941,7 +2136,7 @@ else:
ssl_version=ssl.PROTOCOL_SSLv23,
chatty=False) as server:
with context.wrap_socket(socket.socket()) as s:
- with self.assertRaises((OSError, ssl.SSLError)):
+ with self.assertRaises(OSError):
s.connect((HOST, server.port))
self.assertIn("no shared cipher", str(server.conn_errors[0]))
@@ -2074,6 +2269,124 @@ else:
if len(stats['server_npn_protocols']) else 'nothing'
self.assertEqual(server_result, expected, msg % (server_result, "server"))
+ def sni_contexts(self):
+ server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ server_context.load_cert_chain(SIGNED_CERTFILE)
+ other_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ other_context.load_cert_chain(SIGNED_CERTFILE2)
+ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ client_context.verify_mode = ssl.CERT_REQUIRED
+ client_context.load_verify_locations(SIGNING_CA)
+ return server_context, other_context, client_context
+
+ def check_common_name(self, stats, name):
+ cert = stats['peercert']
+ self.assertIn((('commonName', name),), cert['subject'])
+
+ @needs_sni
+ def test_sni_callback(self):
+ calls = []
+ server_context, other_context, client_context = self.sni_contexts()
+
+ def servername_cb(ssl_sock, server_name, initial_context):
+ calls.append((server_name, initial_context))
+ if server_name is not None:
+ ssl_sock.context = other_context
+ server_context.set_servername_callback(servername_cb)
+
+ stats = server_params_test(client_context, server_context,
+ chatty=True,
+ sni_name='supermessage')
+ # The hostname was fetched properly, and the certificate was
+ # changed for the connection.
+ self.assertEqual(calls, [("supermessage", server_context)])
+ # CERTFILE4 was selected
+ self.check_common_name(stats, 'fakehostname')
+
+ calls = []
+ # The callback is called with server_name=None
+ stats = server_params_test(client_context, server_context,
+ chatty=True,
+ sni_name=None)
+ self.assertEqual(calls, [(None, server_context)])
+ self.check_common_name(stats, 'localhost')
+
+ # Check disabling the callback
+ calls = []
+ server_context.set_servername_callback(None)
+
+ stats = server_params_test(client_context, server_context,
+ chatty=True,
+ sni_name='notfunny')
+ # Certificate didn't change
+ self.check_common_name(stats, 'localhost')
+ self.assertEqual(calls, [])
+
+ @needs_sni
+ def test_sni_callback_alert(self):
+ # Returning a TLS alert is reflected to the connecting client
+ server_context, other_context, client_context = self.sni_contexts()
+
+ def cb_returning_alert(ssl_sock, server_name, initial_context):
+ return ssl.ALERT_DESCRIPTION_ACCESS_DENIED
+ server_context.set_servername_callback(cb_returning_alert)
+
+ with self.assertRaises(ssl.SSLError) as cm:
+ stats = server_params_test(client_context, server_context,
+ chatty=False,
+ sni_name='supermessage')
+ self.assertEqual(cm.exception.reason, 'TLSV1_ALERT_ACCESS_DENIED')
+
+ @needs_sni
+ def test_sni_callback_raising(self):
+ # Raising fails the connection with a TLS handshake failure alert.
+ server_context, other_context, client_context = self.sni_contexts()
+
+ def cb_raising(ssl_sock, server_name, initial_context):
+ 1/0
+ server_context.set_servername_callback(cb_raising)
+
+ with self.assertRaises(ssl.SSLError) as cm, \
+ support.captured_stderr() as stderr:
+ stats = server_params_test(client_context, server_context,
+ chatty=False,
+ sni_name='supermessage')
+ self.assertEqual(cm.exception.reason, 'SSLV3_ALERT_HANDSHAKE_FAILURE')
+ self.assertIn("ZeroDivisionError", stderr.getvalue())
+
+ @needs_sni
+ def test_sni_callback_wrong_return_type(self):
+ # Returning the wrong return type terminates the TLS connection
+ # with an internal error alert.
+ server_context, other_context, client_context = self.sni_contexts()
+
+ def cb_wrong_return_type(ssl_sock, server_name, initial_context):
+ return "foo"
+ server_context.set_servername_callback(cb_wrong_return_type)
+
+ with self.assertRaises(ssl.SSLError) as cm, \
+ support.captured_stderr() as stderr:
+ stats = server_params_test(client_context, server_context,
+ chatty=False,
+ sni_name='supermessage')
+ self.assertEqual(cm.exception.reason, 'TLSV1_ALERT_INTERNAL_ERROR')
+ self.assertIn("TypeError", stderr.getvalue())
+
+ def test_read_write_after_close_raises_valuerror(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ context.verify_mode = ssl.CERT_REQUIRED
+ context.load_verify_locations(CERTFILE)
+ context.load_cert_chain(CERTFILE)
+ server = ThreadedEchoServer(context=context, chatty=False)
+
+ with server:
+ s = context.wrap_socket(socket.socket())
+ s.connect((HOST, server.port))
+ s.close()
+
+ self.assertRaises(ValueError, s.read, 1024)
+ self.assertRaises(ValueError, s.write, b'hello')
+
def test_main(verbose=False):
if support.verbose:
@@ -2093,10 +2406,16 @@ def test_main(verbose=False):
(ssl.OPENSSL_VERSION, ssl.OPENSSL_VERSION_INFO))
print(" under %s" % plat)
print(" HAS_SNI = %r" % ssl.HAS_SNI)
+ print(" OP_ALL = 0x%8x" % ssl.OP_ALL)
+ try:
+ print(" OP_NO_TLSv1_1 = 0x%8x" % ssl.OP_NO_TLSv1_1)
+ except AttributeError:
+ pass
for filename in [
CERTFILE, SVN_PYTHON_ORG_ROOT_CERT, BYTES_CERTFILE,
ONLYCERT, ONLYKEY, BYTES_ONLYCERT, BYTES_ONLYKEY,
+ SIGNED_CERTFILE, SIGNED_CERTFILE2, SIGNING_CA,
BADCERT, BADKEY, EMPTYCERT]:
if not os.path.exists(filename):
raise support.TestFailed("Can't read certificate file %r" % filename)
diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py
index eb3f07a..af6ced4 100644
--- a/Lib/test/test_stat.py
+++ b/Lib/test/test_stat.py
@@ -1,9 +1,13 @@
import unittest
import os
-from test.support import TESTFN, run_unittest, import_fresh_module
-import stat
+from test.support import TESTFN, import_fresh_module
+
+c_stat = import_fresh_module('stat', fresh=['_stat'])
+py_stat = import_fresh_module('stat', blocked=['_stat'])
+
+class TestFilemode:
+ statmod = None
-class TestFilemode(unittest.TestCase):
file_flags = {'SF_APPEND', 'SF_ARCHIVED', 'SF_IMMUTABLE', 'SF_NOUNLINK',
'SF_SNAPSHOT', 'UF_APPEND', 'UF_COMPRESSED', 'UF_HIDDEN',
'UF_IMMUTABLE', 'UF_NODUMP', 'UF_NOUNLINK', 'UF_OPAQUE'}
@@ -63,17 +67,17 @@ class TestFilemode(unittest.TestCase):
st_mode = os.lstat(fname).st_mode
else:
st_mode = os.stat(fname).st_mode
- modestr = stat.filemode(st_mode)
+ modestr = self.statmod.filemode(st_mode)
return st_mode, modestr
def assertS_IS(self, name, mode):
# test format, lstrip is for S_IFIFO
- fmt = getattr(stat, "S_IF" + name.lstrip("F"))
- self.assertEqual(stat.S_IFMT(mode), fmt)
+ fmt = getattr(self.statmod, "S_IF" + name.lstrip("F"))
+ self.assertEqual(self.statmod.S_IFMT(mode), fmt)
# test that just one function returns true
testname = "S_IS" + name
for funcname in self.format_funcs:
- func = getattr(stat, funcname, None)
+ func = getattr(self.statmod, funcname, None)
if func is None:
if funcname == testname:
raise ValueError(funcname)
@@ -91,35 +95,35 @@ class TestFilemode(unittest.TestCase):
st_mode, modestr = self.get_mode()
self.assertEqual(modestr, '-rwx------')
self.assertS_IS("REG", st_mode)
- self.assertEqual(stat.S_IMODE(st_mode),
- stat.S_IRWXU)
+ self.assertEqual(self.statmod.S_IMODE(st_mode),
+ self.statmod.S_IRWXU)
os.chmod(TESTFN, 0o070)
st_mode, modestr = self.get_mode()
self.assertEqual(modestr, '----rwx---')
self.assertS_IS("REG", st_mode)
- self.assertEqual(stat.S_IMODE(st_mode),
- stat.S_IRWXG)
+ self.assertEqual(self.statmod.S_IMODE(st_mode),
+ self.statmod.S_IRWXG)
os.chmod(TESTFN, 0o007)
st_mode, modestr = self.get_mode()
self.assertEqual(modestr, '-------rwx')
self.assertS_IS("REG", st_mode)
- self.assertEqual(stat.S_IMODE(st_mode),
- stat.S_IRWXO)
+ self.assertEqual(self.statmod.S_IMODE(st_mode),
+ self.statmod.S_IRWXO)
os.chmod(TESTFN, 0o444)
st_mode, modestr = self.get_mode()
self.assertS_IS("REG", st_mode)
self.assertEqual(modestr, '-r--r--r--')
- self.assertEqual(stat.S_IMODE(st_mode), 0o444)
+ self.assertEqual(self.statmod.S_IMODE(st_mode), 0o444)
else:
os.chmod(TESTFN, 0o700)
st_mode, modestr = self.get_mode()
self.assertEqual(modestr[:3], '-rw')
self.assertS_IS("REG", st_mode)
- self.assertEqual(stat.S_IFMT(st_mode),
- stat.S_IFREG)
+ self.assertEqual(self.statmod.S_IFMT(st_mode),
+ self.statmod.S_IFREG)
def test_directory(self):
os.mkdir(TESTFN)
@@ -165,25 +169,34 @@ class TestFilemode(unittest.TestCase):
def test_module_attributes(self):
for key, value in self.stat_struct.items():
- modvalue = getattr(stat, key)
+ modvalue = getattr(self.statmod, key)
self.assertEqual(value, modvalue, key)
for key, value in self.permission_bits.items():
- modvalue = getattr(stat, key)
+ modvalue = getattr(self.statmod, key)
self.assertEqual(value, modvalue, key)
for key in self.file_flags:
- modvalue = getattr(stat, key)
+ modvalue = getattr(self.statmod, key)
self.assertIsInstance(modvalue, int)
for key in self.formats:
- modvalue = getattr(stat, key)
+ modvalue = getattr(self.statmod, key)
self.assertIsInstance(modvalue, int)
for key in self.format_funcs:
- func = getattr(stat, key)
+ func = getattr(self.statmod, key)
self.assertTrue(callable(func))
self.assertEqual(func(0), 0)
-def test_main():
- run_unittest(TestFilemode)
+class TestFilemodeCStat(TestFilemode, unittest.TestCase):
+ statmod = c_stat
+
+ formats = TestFilemode.formats | {'S_IFDOOR', 'S_IFPORT', 'S_IFWHT'}
+ format_funcs = TestFilemode.format_funcs | {'S_ISDOOR', 'S_ISPORT',
+ 'S_ISWHT'}
+
+
+class TestFilemodePyStat(TestFilemode, unittest.TestCase):
+ statmod = py_stat
+
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_strftime.py b/Lib/test/test_strftime.py
index 14057eb..6510c36 100644
--- a/Lib/test/test_strftime.py
+++ b/Lib/test/test_strftime.py
@@ -176,8 +176,6 @@ class StrftimeTest(unittest.TestCase):
(e[0], e[2]))
print(" Expected %s, but got %s" % (e[1], result))
-def test_main():
- support.run_unittest(StrftimeTest)
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 22374d2..fa569d4 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -1,4 +1,6 @@
+from collections import abc
import array
+import operator
import unittest
import struct
import sys
@@ -6,7 +8,6 @@ import sys
from test import support
ISBIGENDIAN = sys.byteorder == "big"
-IS32BIT = sys.maxsize == 0x7fffffff
integer_codes = 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'n', 'N'
byteorders = '', '@', '=', '<', '>', '!'
@@ -489,7 +490,7 @@ class StructTest(unittest.TestCase):
def test_bool(self):
class ExplodingBool(object):
def __bool__(self):
- raise IOError
+ raise OSError
for prefix in tuple("<>!=")+('',):
false = (), [], [], '', 0
true = [1], 'test', 5, -1, 0xffffffff+1, 0xffffffff/2
@@ -520,10 +521,10 @@ class StructTest(unittest.TestCase):
try:
struct.pack(prefix + '?', ExplodingBool())
- except IOError:
+ except OSError:
pass
else:
- self.fail("Expected IOError: struct.pack(%r, "
+ self.fail("Expected OSError: struct.pack(%r, "
"ExplodingBool())" % (prefix + '?'))
for c in [b'\x01', b'\x7f', b'\xff', b'\x0f', b'\xf0']:
@@ -536,10 +537,6 @@ class StructTest(unittest.TestCase):
hugecount2 = '{}b{}H'.format(sys.maxsize//2, sys.maxsize//2)
self.assertRaises(struct.error, struct.calcsize, hugecount2)
- if IS32BIT:
- def test_crasher(self):
- self.assertRaises(MemoryError, struct.pack, "357913941b", "a")
-
def test_trailing_counter(self):
store = array.array('b', b' '*100)
@@ -576,7 +573,7 @@ class StructTest(unittest.TestCase):
# The size of 'PyStructObject'
totalsize = support.calcobjsize('2n3P')
# The size taken up by the 'formatcode' dynamic array
- totalsize += struct.calcsize('P2n0P') * (number_of_codes + 1)
+ totalsize += struct.calcsize('P3n0P') * (number_of_codes + 1)
support.check_sizeof(self, struct.Struct(format_str), totalsize)
@support.cpython_only
@@ -587,14 +584,84 @@ class StructTest(unittest.TestCase):
self.check_sizeof('B' * 1234, 1234)
self.check_sizeof('fd', 2)
self.check_sizeof('xxxxxxxxxxxxxx', 0)
- self.check_sizeof('100H', 100)
+ self.check_sizeof('100H', 1)
self.check_sizeof('187s', 1)
self.check_sizeof('20p', 1)
self.check_sizeof('0s', 1)
self.check_sizeof('0c', 0)
+
+class UnpackIteratorTest(unittest.TestCase):
+ """
+ Tests for iterative unpacking (struct.Struct.iter_unpack).
+ """
+
+ def test_construct(self):
+ def _check_iterator(it):
+ self.assertIsInstance(it, abc.Iterator)
+ self.assertIsInstance(it, abc.Iterable)
+ s = struct.Struct('>ibcp')
+ it = s.iter_unpack(b"")
+ _check_iterator(it)
+ it = s.iter_unpack(b"1234567")
+ _check_iterator(it)
+ # Wrong bytes length
+ with self.assertRaises(struct.error):
+ s.iter_unpack(b"123456")
+ with self.assertRaises(struct.error):
+ s.iter_unpack(b"12345678")
+ # Zero-length struct
+ s = struct.Struct('>')
+ with self.assertRaises(struct.error):
+ s.iter_unpack(b"")
+ with self.assertRaises(struct.error):
+ s.iter_unpack(b"12")
+
+ def test_iterate(self):
+ s = struct.Struct('>IB')
+ b = bytes(range(1, 16))
+ it = s.iter_unpack(b)
+ self.assertEqual(next(it), (0x01020304, 5))
+ self.assertEqual(next(it), (0x06070809, 10))
+ self.assertEqual(next(it), (0x0b0c0d0e, 15))
+ self.assertRaises(StopIteration, next, it)
+ self.assertRaises(StopIteration, next, it)
+
+ def test_arbitrary_buffer(self):
+ s = struct.Struct('>IB')
+ b = bytes(range(1, 11))
+ it = s.iter_unpack(memoryview(b))
+ self.assertEqual(next(it), (0x01020304, 5))
+ self.assertEqual(next(it), (0x06070809, 10))
+ self.assertRaises(StopIteration, next, it)
+ self.assertRaises(StopIteration, next, it)
+
+ def test_length_hint(self):
+ lh = operator.length_hint
+ s = struct.Struct('>IB')
+ b = bytes(range(1, 16))
+ it = s.iter_unpack(b)
+ self.assertEqual(lh(it), 3)
+ next(it)
+ self.assertEqual(lh(it), 2)
+ next(it)
+ self.assertEqual(lh(it), 1)
+ next(it)
+ self.assertEqual(lh(it), 0)
+ self.assertRaises(StopIteration, next, it)
+ self.assertEqual(lh(it), 0)
+
+ def test_module_func(self):
+ # Sanity check for the global struct.iter_unpack()
+ it = struct.iter_unpack('>IB', bytes(range(1, 11)))
+ self.assertEqual(next(it), (0x01020304, 5))
+ self.assertEqual(next(it), (0x06070809, 10))
+ self.assertRaises(StopIteration, next, it)
+ self.assertRaises(StopIteration, next, it)
+
+
def test_main():
- support.run_unittest(StructTest)
+ support.run_unittest(__name__)
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 0aa4d21..470faff 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -158,8 +158,28 @@ class ProcessTestCase(BaseTestCase):
stderr=subprocess.STDOUT)
self.assertIn(b'BDFL', output)
+ def test_check_output_stdin_arg(self):
+ # check_output() can be called with stdin set to a file
+ tf = tempfile.TemporaryFile()
+ self.addCleanup(tf.close)
+ tf.write(b'pear')
+ tf.seek(0)
+ output = subprocess.check_output(
+ [sys.executable, "-c",
+ "import sys; sys.stdout.write(sys.stdin.read().upper())"],
+ stdin=tf)
+ self.assertIn(b'PEAR', output)
+
+ def test_check_output_input_arg(self):
+ # check_output() can be called with input set to a string
+ output = subprocess.check_output(
+ [sys.executable, "-c",
+ "import sys; sys.stdout.write(sys.stdin.read().upper())"],
+ input=b'pear')
+ self.assertIn(b'PEAR', output)
+
def test_check_output_stdout_arg(self):
- # check_output() function stderr redirected to stdout
+ # check_output() refuses to accept 'stdout' argument
with self.assertRaises(ValueError) as c:
output = subprocess.check_output(
[sys.executable, "-c", "print('will not be run')"],
@@ -167,6 +187,20 @@ class ProcessTestCase(BaseTestCase):
self.fail("Expected ValueError when stdout arg supplied.")
self.assertIn('stdout', c.exception.args[0])
+ def test_check_output_stdin_with_input_arg(self):
+ # check_output() refuses to accept 'stdin' with 'input'
+ tf = tempfile.TemporaryFile()
+ self.addCleanup(tf.close)
+ tf.write(b'pear')
+ tf.seek(0)
+ with self.assertRaises(ValueError) as c:
+ output = subprocess.check_output(
+ [sys.executable, "-c", "print('will not be run')"],
+ stdin=tf, input=b'hare')
+ self.fail("Expected ValueError when stdin and input args supplied.")
+ self.assertIn('stdin', c.exception.args[0])
+ self.assertIn('input', c.exception.args[0])
+
def test_check_output_timeout(self):
# check_output() function with timeout arg
with self.assertRaises(subprocess.TimeoutExpired) as c:
@@ -978,8 +1012,7 @@ class ProcessTestCase(BaseTestCase):
# value for that limit, but Windows has 2048, so we loop
# 1024 times (each call leaked two fds).
for i in range(1024):
- # Windows raises IOError. Others raise OSError.
- with self.assertRaises(EnvironmentError) as c:
+ with self.assertRaises(OSError) as c:
subprocess.Popen(['nonexisting_i_hope'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
@@ -1091,7 +1124,7 @@ class _SuppressCoreFiles(object):
if resource is not None:
try:
self.old_limit = resource.getrlimit(resource.RLIMIT_CORE)
- resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
+ resource.setrlimit(resource.RLIMIT_CORE, (0, self.old_limit[1]))
except (ValueError, resource.error):
pass
@@ -1232,7 +1265,7 @@ class POSIXProcessTestCase(BaseTestCase):
try:
p = subprocess.Popen([sys.executable, "-c", ""],
preexec_fn=raise_it)
- except RuntimeError as e:
+ except subprocess.SubprocessError as e:
self.assertTrue(
subprocess._posixsubprocess,
"Expected a ValueError from the preexec_fn")
@@ -1272,9 +1305,10 @@ class POSIXProcessTestCase(BaseTestCase):
"""Issue16140: Don't double close pipes on preexec error."""
def raise_it():
- raise RuntimeError("force the _execute_child() errpipe_data path.")
+ raise subprocess.SubprocessError(
+ "force the _execute_child() errpipe_data path.")
- with self.assertRaises(RuntimeError):
+ with self.assertRaises(subprocess.SubprocessError):
self._TestExecuteChildPopen(
self, [sys.executable, "-c", "pass"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
@@ -1637,12 +1671,12 @@ class POSIXProcessTestCase(BaseTestCase):
# Pure Python implementations keeps the message
self.assertIsNone(subprocess._posixsubprocess)
self.assertEqual(str(err), "surrogate:\uDCff")
- except RuntimeError as err:
+ except subprocess.SubprocessError as err:
# _posixsubprocess uses a default message
self.assertIsNotNone(subprocess._posixsubprocess)
self.assertEqual(str(err), "Exception occurred in preexec_fn.")
else:
- self.fail("Expected ValueError or RuntimeError")
+ self.fail("Expected ValueError or subprocess.SubprocessError")
def test_undecodable_env(self):
for key, value in (('test', 'abc\uDCFF'), ('test\uDCFF', '42')):
@@ -1929,7 +1963,7 @@ class POSIXProcessTestCase(BaseTestCase):
# let some time for the process to exit, and create a new Popen: this
# should trigger the wait() of p
time.sleep(0.2)
- with self.assertRaises(EnvironmentError) as c:
+ with self.assertRaises(OSError) as c:
with subprocess.Popen(['nonexisting_i_hope'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) as proc:
diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
index fcccdf7..77ec9f0 100644
--- a/Lib/test/test_sundry.py
+++ b/Lib/test/test_sundry.py
@@ -1,19 +1,26 @@
"""Do a minimal test of all the modules that aren't otherwise tested."""
-
-from test import support
+import importlib
import sys
+from test import support
import unittest
class TestUntestedModules(unittest.TestCase):
- def test_at_least_import_untested_modules(self):
+ def test_untested_modules_can_be_imported(self):
+ untested = ('bdb', 'encodings', 'formatter', 'imghdr',
+ 'macurl2path', 'nturl2path', 'tabnanny')
with support.check_warnings(quiet=True):
- import bdb
- import cgitb
+ for name in untested:
+ try:
+ support.import_module('test.test_{}'.format(name))
+ except unittest.SkipTest:
+ importlib.import_module(name)
+ else:
+ self.fail('{} has tests even though test_sundry claims '
+ 'otherwise'.format(name))
import distutils.bcppcompiler
import distutils.ccompiler
import distutils.cygwinccompiler
- import distutils.emxccompiler
import distutils.filelist
if sys.platform.startswith('win'):
import distutils.msvccompiler
@@ -39,29 +46,13 @@ class TestUntestedModules(unittest.TestCase):
import distutils.command.sdist
import distutils.command.upload
- import encodings
- import formatter
- import getpass
import html.entities
- import imghdr
- import keyword
- import macurl2path
- import mailcap
- import nturl2path
- import os2emxpath
- import pstats
- import py_compile
- import sndhdr
- import tabnanny
try:
- import tty # not available on Windows
+ import tty # Not available on Windows
except ImportError:
if support.verbose:
print("skipping tty")
-def test_main():
- support.run_unittest(TestUntestedModules)
-
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py
index 1e272ee..37fc2d9 100644
--- a/Lib/test/test_super.py
+++ b/Lib/test/test_super.py
@@ -44,6 +44,11 @@ class G(A):
class TestSuper(unittest.TestCase):
+ def tearDown(self):
+ # This fixes the damage that test_various___class___pathologies does.
+ nonlocal __class__
+ __class__ = TestSuper
+
def test_basics_working(self):
self.assertEqual(D().f(), 'ABCD')
@@ -81,8 +86,7 @@ class TestSuper(unittest.TestCase):
self.assertEqual(E().f(), 'AE')
- @unittest.expectedFailure
- def test___class___set(self):
+ def test_various___class___pathologies(self):
# See issue #12370
class X(A):
def f(self):
@@ -91,6 +95,31 @@ class TestSuper(unittest.TestCase):
x = X()
self.assertEqual(x.f(), 'A')
self.assertEqual(x.__class__, 413)
+ class X:
+ x = __class__
+ def f():
+ __class__
+ self.assertIs(X.x, type(self))
+ with self.assertRaises(NameError) as e:
+ exec("""class X:
+ __class__
+ def f():
+ __class__""", globals(), {})
+ self.assertIs(type(e.exception), NameError) # Not UnboundLocalError
+ class X:
+ global __class__
+ __class__ = 42
+ def f():
+ __class__
+ self.assertEqual(globals()["__class__"], 42)
+ del globals()["__class__"]
+ self.assertNotIn("__class__", X.__dict__)
+ class X:
+ nonlocal __class__
+ __class__ = 42
+ def f():
+ __class__
+ self.assertEqual(__class__, 42)
def test___class___instancemethod(self):
# See issue #14857
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index 5926b69..a9d3628 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -33,7 +33,7 @@ SyntaxError: invalid syntax
>>> None = 1
Traceback (most recent call last):
-SyntaxError: assignment to keyword
+SyntaxError: can't assign to keyword
It's a syntax error to assign to the empty tuple. Why isn't it an
error to assign to the empty list? It will always raise some error at
@@ -233,7 +233,7 @@ Traceback (most recent call last):
SyntaxError: can't assign to generator expression
>>> None += 1
Traceback (most recent call last):
-SyntaxError: assignment to keyword
+SyntaxError: can't assign to keyword
>>> f() += 1
Traceback (most recent call last):
SyntaxError: can't assign to function call
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index 9d97c8d..65cb8ef 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -6,6 +6,8 @@ import textwrap
import warnings
import operator
import codecs
+import gc
+import sysconfig
# count the number of test runs, used to create unique
# strings to intern in test_intern()
@@ -480,7 +482,7 @@ class SysModuleTest(unittest.TestCase):
def test_thread_info(self):
info = sys.thread_info
self.assertEqual(len(info), 3)
- self.assertIn(info.name, ('nt', 'os2', 'pthread', 'solaris', None))
+ self.assertIn(info.name, ('nt', 'pthread', 'solaris', None))
self.assertIn(info.lock, ('semaphore', 'mutex+cond', None))
def test_43581(self):
@@ -513,7 +515,7 @@ class SysModuleTest(unittest.TestCase):
attrs = ("debug",
"inspect", "interactive", "optimize", "dont_write_bytecode",
"no_user_site", "no_site", "ignore_environment", "verbose",
- "bytes_warning", "quiet", "hash_randomization")
+ "bytes_warning", "quiet", "hash_randomization", "isolated")
for attr in attrs:
self.assertTrue(hasattr(sys.flags, attr), attr)
self.assertEqual(type(getattr(sys.flags, attr)), int, attr)
@@ -609,6 +611,36 @@ class SysModuleTest(unittest.TestCase):
ret, out, err = assert_python_ok(*args)
self.assertIn(b"free PyDictObjects", err)
+ @unittest.skipUnless(hasattr(sys, "getallocatedblocks"),
+ "sys.getallocatedblocks unavailable on this build")
+ def test_getallocatedblocks(self):
+ # Some sanity checks
+ with_pymalloc = sysconfig.get_config_var('WITH_PYMALLOC')
+ a = sys.getallocatedblocks()
+ self.assertIs(type(a), int)
+ if with_pymalloc:
+ self.assertGreater(a, 0)
+ else:
+ # When WITH_PYMALLOC isn't available, we don't know anything
+ # about the underlying implementation: the function might
+ # return 0 or something greater.
+ self.assertGreaterEqual(a, 0)
+ try:
+ # While we could imagine a Python session where the number of
+ # multiple buffer objects would exceed the sharing of references,
+ # it is unlikely to happen in a normal test run.
+ self.assertLess(a, sys.gettotalrefcount())
+ except AttributeError:
+ # gettotalrefcount() not available
+ pass
+ gc.collect()
+ b = sys.getallocatedblocks()
+ self.assertLessEqual(b, a)
+ gc.collect()
+ c = sys.getallocatedblocks()
+ self.assertIn(c, range(b - 50, b + 50))
+
+
class SizeofTest(unittest.TestCase):
def setUp(self):
@@ -732,7 +764,7 @@ class SizeofTest(unittest.TestCase):
nfrees = len(x.f_code.co_freevars)
extras = x.f_code.co_stacksize + x.f_code.co_nlocals +\
ncells + nfrees - 1
- check(x, vsize('12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P'))
+ check(x, vsize('13P3ic' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P'))
# function
def func(): pass
check(func, size('12P'))
@@ -778,7 +810,7 @@ class SizeofTest(unittest.TestCase):
# memoryview
check(memoryview(b''), size('Pnin 2P2n2i5P 3cPn'))
# module
- check(unittest, size('PnP'))
+ check(unittest, size('PnPPP'))
# None
check(None, size(''))
# NotImplementedType
@@ -832,11 +864,11 @@ class SizeofTest(unittest.TestCase):
check((1,2,3), vsize('') + 3*self.P)
# type
# static type: PyTypeObject
- s = vsize('P2n15Pl4Pn9Pn11PI')
+ s = vsize('P2n15Pl4Pn9Pn11PIP')
check(int, s)
# (PyTypeObject + PyNumberMethods + PyMappingMethods +
# PySequenceMethods + PyBufferProcs + 4P)
- s = vsize('P2n15Pl4Pn9Pn11PI') + struct.calcsize('34P 3P 10P 2P 4P')
+ s = vsize('P2n15Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 10P 2P 4P')
# Separate block for PyDictKeysObject with 4 entries
s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
# class
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
index 9219360..5293649 100644
--- a/Lib/test/test_sysconfig.py
+++ b/Lib/test/test_sysconfig.py
@@ -234,7 +234,7 @@ class TestSysConfig(unittest.TestCase):
self.assertTrue(os.path.isfile(config_h), config_h)
def test_get_scheme_names(self):
- wanted = ('nt', 'nt_user', 'os2', 'os2_home', 'osx_framework_user',
+ wanted = ('nt', 'nt_user', 'osx_framework_user',
'posix_home', 'posix_prefix', 'posix_user')
self.assertEqual(get_scheme_names(), wanted)
@@ -305,14 +305,13 @@ class TestSysConfig(unittest.TestCase):
if 'MACOSX_DEPLOYMENT_TARGET' in env:
del env['MACOSX_DEPLOYMENT_TARGET']
- with open('/dev/null', 'w') as devnull_fp:
- p = subprocess.Popen([
- sys.executable, '-c',
- 'import sysconfig; print(sysconfig.get_platform())',
- ],
- stdout=subprocess.PIPE,
- stderr=devnull_fp,
- env=env)
+ p = subprocess.Popen([
+ sys.executable, '-c',
+ 'import sysconfig; print(sysconfig.get_platform())',
+ ],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL,
+ env=env)
test_platform = p.communicate()[0].strip()
test_platform = test_platform.decode('utf-8')
status = p.wait()
@@ -325,20 +324,19 @@ class TestSysConfig(unittest.TestCase):
env = os.environ.copy()
env['MACOSX_DEPLOYMENT_TARGET'] = '10.1'
- with open('/dev/null') as dev_null:
- p = subprocess.Popen([
- sys.executable, '-c',
- 'import sysconfig; print(sysconfig.get_platform())',
- ],
- stdout=subprocess.PIPE,
- stderr=dev_null,
- env=env)
- test_platform = p.communicate()[0].strip()
- test_platform = test_platform.decode('utf-8')
- status = p.wait()
-
- self.assertEqual(status, 0)
- self.assertEqual(my_platform, test_platform)
+ p = subprocess.Popen([
+ sys.executable, '-c',
+ 'import sysconfig; print(sysconfig.get_platform())',
+ ],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL,
+ env=env)
+ test_platform = p.communicate()[0].strip()
+ test_platform = test_platform.decode('utf-8')
+ status = p.wait()
+
+ self.assertEqual(status, 0)
+ self.assertEqual(my_platform, test_platform)
def test_srcdir(self):
# See Issues #15322, #15364.
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 238175f..2f2bf6b 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -1732,20 +1732,20 @@ class ContextManagerTest(unittest.TestCase):
self.assertTrue(tar.closed, "context manager failed")
def test_closed(self):
- # The __enter__() method is supposed to raise IOError
+ # The __enter__() method is supposed to raise OSError
# if the TarFile object is already closed.
tar = tarfile.open(tarname)
tar.close()
- with self.assertRaises(IOError):
+ with self.assertRaises(OSError):
with tar:
pass
def test_exception(self):
- # Test if the IOError exception is passed through properly.
+ # Test if the OSError exception is passed through properly.
with self.assertRaises(Exception) as exc:
with tarfile.open(tarname) as tar:
- raise IOError
- self.assertIsInstance(exc.exception, IOError,
+ raise OSError
+ self.assertIsInstance(exc.exception, OSError,
"wrong exception raised in context manager")
self.assertTrue(tar.closed, "context manager failed")
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 2962939..6b146d2 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -35,7 +35,7 @@ else:
# Common functionality.
class BaseTestCase(unittest.TestCase):
- str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")
+ str_check = re.compile(r"^[a-z0-9_-]{8}$")
def setUp(self):
self._warnings_manager = support.check_warnings()
@@ -62,7 +62,7 @@ class BaseTestCase(unittest.TestCase):
nbase = nbase[len(pre):len(nbase)-len(suf)]
self.assertTrue(self.str_check.match(nbase),
- "random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"
+ "random string '%s' does not match ^[a-z0-9_-]{8}$"
% nbase)
@@ -151,7 +151,7 @@ class TestRandomNameSequence(BaseTestCase):
# via any bugs above
try:
os.kill(pid, signal.SIGKILL)
- except EnvironmentError:
+ except OSError:
pass
os.close(read_fd)
os.close(write_fd)
@@ -190,7 +190,7 @@ class TestCandidateTempdirList(BaseTestCase):
try:
dirname = os.getcwd()
- except (AttributeError, os.error):
+ except (AttributeError, OSError):
dirname = os.curdir
self.assertIn(dirname, cand)
@@ -315,7 +315,7 @@ class TestMkstempInner(BaseTestCase):
file = self.do_create()
mode = stat.S_IMODE(os.stat(file.name).st_mode)
expected = 0o600
- if sys.platform in ('win32', 'os2emx'):
+ if sys.platform == 'win32':
# There's no distinction among 'user', 'group' and 'world';
# replicate the 'user' bits.
user = expected >> 6
@@ -349,7 +349,7 @@ class TestMkstempInner(BaseTestCase):
# On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,
# but an arg with embedded spaces should be decorated with double
# quotes on each end
- if sys.platform in ('win32',):
+ if sys.platform == 'win32':
decorated = '"%s"' % sys.executable
tester = '"%s"' % tester
else:
@@ -518,7 +518,7 @@ class TestMkdtemp(BaseTestCase):
mode = stat.S_IMODE(os.stat(dir).st_mode)
mode &= 0o777 # Mask off sticky bits inherited from /tmp
expected = 0o700
- if sys.platform in ('win32', 'os2emx'):
+ if sys.platform == 'win32':
# There's no distinction among 'user', 'group' and 'world';
# replicate the 'user' bits.
user = expected >> 6
diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py
index c86f5cf..36c15cc 100644
--- a/Lib/test/test_textwrap.py
+++ b/Lib/test/test_textwrap.py
@@ -9,9 +9,8 @@
#
import unittest
-from test import support
-from textwrap import TextWrapper, wrap, fill, dedent, indent
+from textwrap import TextWrapper, wrap, fill, dedent, indent, shorten
class BaseTestCase(unittest.TestCase):
@@ -43,6 +42,10 @@ class BaseTestCase(unittest.TestCase):
"\nexpected %r\n"
"but got %r" % (expect, result))
+ def check_shorten(self, text, width, expect, **kwargs):
+ result = shorten(text, width, **kwargs)
+ self.check(result, expect)
+
class WrapTestCase(BaseTestCase):
@@ -777,12 +780,59 @@ class IndentTestCase(unittest.TestCase):
self.assertEqual(indent(text, prefix, predicate), expect)
-def test_main():
- support.run_unittest(WrapTestCase,
- LongWordTestCase,
- IndentTestCases,
- DedentTestCase,
- IndentTestCase)
+class ShortenTestCase(BaseTestCase):
+
+ def test_simple(self):
+ # Simple case: just words, spaces, and a bit of punctuation
+ text = "Hello there, how are you this fine day? I'm glad to hear it!"
+
+ self.check_shorten(text, 18, "Hello there, [...]")
+ self.check_shorten(text, len(text), text)
+ self.check_shorten(text, len(text) - 1,
+ "Hello there, how are you this fine day? "
+ "I'm glad to [...]")
+
+ def test_placeholder(self):
+ text = "Hello there, how are you this fine day? I'm glad to hear it!"
+
+ self.check_shorten(text, 17, "Hello there,$$", placeholder='$$')
+ self.check_shorten(text, 18, "Hello there, how$$", placeholder='$$')
+ self.check_shorten(text, 18, "Hello there, $$", placeholder=' $$')
+ self.check_shorten(text, len(text), text, placeholder='$$')
+ self.check_shorten(text, len(text) - 1,
+ "Hello there, how are you this fine day? "
+ "I'm glad to hear$$", placeholder='$$')
+
+ def test_empty_string(self):
+ self.check_shorten("", 6, "")
+
+ def test_whitespace(self):
+ # Whitespace collapsing
+ text = """
+ This is a paragraph that already has
+ line breaks and \t tabs too."""
+ self.check_shorten(text, 62,
+ "This is a paragraph that already has line "
+ "breaks and tabs too.")
+ self.check_shorten(text, 61,
+ "This is a paragraph that already has line "
+ "breaks and [...]")
+
+ self.check_shorten("hello world! ", 12, "hello world!")
+ self.check_shorten("hello world! ", 11, "hello [...]")
+ # The leading space is trimmed from the placeholder
+ # (it would be ugly otherwise).
+ self.check_shorten("hello world! ", 10, "[...]")
+
+ def test_width_too_small_for_placeholder(self):
+ wrapper = TextWrapper(width=8)
+ wrapper.shorten("x" * 20, placeholder="(......)")
+ with self.assertRaises(ValueError):
+ wrapper.shorten("x" * 20, placeholder="(.......)")
+
+ def test_first_word_too_long_but_placeholder_fits(self):
+ self.check_shorten("Helloo", 5, "[...]")
+
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py
index a191e15..f9a721b 100644
--- a/Lib/test/test_thread.py
+++ b/Lib/test/test_thread.py
@@ -68,7 +68,7 @@ class ThreadRunningTests(BasicThreadTest):
thread.stack_size(0)
self.assertEqual(thread.stack_size(), 0, "stack_size not reset to default")
- if os.name not in ("nt", "os2", "posix"):
+ if os.name not in ("nt", "posix"):
return
tss_supported = True
diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py
index 6c2965b..3d961b5 100644
--- a/Lib/test/test_threaded_import.py
+++ b/Lib/test/test_threaded_import.py
@@ -5,8 +5,8 @@
# complains several times about module random having no attribute
# randrange, and then Python hangs.
+import _imp as imp
import os
-import imp
import importlib
import sys
import time
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 79967dc..ecf22fc 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -452,7 +452,7 @@ class ThreadJoinOnShutdown(BaseTestCase):
# problems with some operating systems (issue #3863): skip problematic tests
# on platforms known to behave badly.
platforms_to_skip = ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5',
- 'os2emx', 'hp-ux11')
+ 'hp-ux11')
def _run_and_join(self, script):
script = """if 1:
@@ -728,6 +728,31 @@ class ThreadJoinOnShutdown(BaseTestCase):
for t in threads:
t.join()
+ @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
+ def test_clear_threads_states_after_fork(self):
+ # Issue #17094: check that threads states are cleared after fork()
+
+ # start a bunch of threads
+ threads = []
+ for i in range(16):
+ t = threading.Thread(target=lambda : time.sleep(0.3))
+ threads.append(t)
+ t.start()
+
+ pid = os.fork()
+ if pid == 0:
+ # check that threads states have been cleared
+ if len(sys._current_frames()) == 1:
+ os._exit(0)
+ else:
+ os._exit(1)
+ else:
+ _, status = os.waitpid(pid, 0)
+ self.assertEqual(0, status)
+
+ for t in threads:
+ t.join()
+
class ThreadingExceptionTests(BaseTestCase):
# A RuntimeError should be raised if Thread.start() is called
diff --git a/Lib/test/test_threadsignals.py b/Lib/test/test_threadsignals.py
index f975a75..b1004e6 100644
--- a/Lib/test/test_threadsignals.py
+++ b/Lib/test/test_threadsignals.py
@@ -8,7 +8,7 @@ from test.support import run_unittest, import_module
thread = import_module('_thread')
import time
-if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos':
+if (sys.platform[:3] == 'win'):
raise unittest.SkipTest("Can't test signal on %s" % sys.platform)
process_pid = os.getpid()
diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py
index bfd2a5c..fe7b264 100644
--- a/Lib/test/test_timeout.py
+++ b/Lib/test/test_timeout.py
@@ -207,7 +207,7 @@ class TCPTimeoutTestCase(TimeoutTestCase):
sock.connect((whitehole))
except socket.timeout:
pass
- except IOError as err:
+ except OSError as err:
if err.errno == errno.ECONNREFUSED:
skip = False
finally:
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 5bce2af..66a12bf 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -150,30 +150,74 @@ class SyntaxTracebackCases(unittest.TestCase):
class TracebackFormatTests(unittest.TestCase):
- def test_traceback_format(self):
+ def some_exception(self):
+ raise KeyError('blah')
+
+ def check_traceback_format(self, cleanup_func=None):
try:
- raise KeyError('blah')
+ self.some_exception()
except KeyError:
type_, value, tb = sys.exc_info()
+ if cleanup_func is not None:
+ # Clear the inner frames, not this one
+ cleanup_func(tb.tb_next)
traceback_fmt = 'Traceback (most recent call last):\n' + \
''.join(traceback.format_tb(tb))
file_ = StringIO()
traceback_print(tb, file_)
python_fmt = file_.getvalue()
+ # Call all _tb and _exc functions
+ with captured_output("stderr") as tbstderr:
+ traceback.print_tb(tb)
+ tbfile = StringIO()
+ traceback.print_tb(tb, file=tbfile)
+ with captured_output("stderr") as excstderr:
+ traceback.print_exc()
+ excfmt = traceback.format_exc()
+ excfile = StringIO()
+ traceback.print_exc(file=excfile)
else:
raise Error("unable to create test traceback string")
# Make sure that Python and the traceback module format the same thing
self.assertEqual(traceback_fmt, python_fmt)
+ # Now verify the _tb func output
+ self.assertEqual(tbstderr.getvalue(), tbfile.getvalue())
+ # Now verify the _exc func output
+ self.assertEqual(excstderr.getvalue(), excfile.getvalue())
+ self.assertEqual(excfmt, excfile.getvalue())
# Make sure that the traceback is properly indented.
tb_lines = python_fmt.splitlines()
- self.assertEqual(len(tb_lines), 3)
- banner, location, source_line = tb_lines
+ self.assertEqual(len(tb_lines), 5)
+ banner = tb_lines[0]
+ location, source_line = tb_lines[-2:]
self.assertTrue(banner.startswith('Traceback'))
self.assertTrue(location.startswith(' File'))
self.assertTrue(source_line.startswith(' raise'))
+ def test_traceback_format(self):
+ self.check_traceback_format()
+
+ def test_traceback_format_with_cleared_frames(self):
+ # Check that traceback formatting also works with a clear()ed frame
+ def cleanup_tb(tb):
+ tb.tb_frame.clear()
+ self.check_traceback_format(cleanup_tb)
+
+ def test_stack_format(self):
+ # Verify _stack functions. Note we have to use _getframe(1) to
+ # compare them without this frame appearing in the output
+ with captured_output("stderr") as ststderr:
+ traceback.print_stack(sys._getframe(1))
+ stfile = StringIO()
+ traceback.print_stack(sys._getframe(1), file=stfile)
+ self.assertEqual(ststderr.getvalue(), stfile.getvalue())
+
+ stfmt = traceback.format_stack(sys._getframe(1))
+
+ self.assertEqual(ststderr.getvalue(), "".join(stfmt))
+
cause_message = (
"\nThe above exception was the direct cause "
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 3ee4c6b..ec10752 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -2,6 +2,7 @@
from test.support import run_unittest, run_with_locale
import collections
+import pickle
import locale
import sys
import types
@@ -1077,9 +1078,19 @@ class SimpleNamespaceTests(unittest.TestCase):
ns2 = types.SimpleNamespace()
ns2.x = "spam"
ns2._y = 5
+ name = "namespace"
- self.assertEqual(repr(ns1), "namespace(w=3, x=1, y=2)")
- self.assertEqual(repr(ns2), "namespace(_y=5, x='spam')")
+ self.assertEqual(repr(ns1), "{name}(w=3, x=1, y=2)".format(name=name))
+ self.assertEqual(repr(ns2), "{name}(_y=5, x='spam')".format(name=name))
+
+ def test_equal(self):
+ ns1 = types.SimpleNamespace(x=1)
+ ns2 = types.SimpleNamespace()
+ ns2.x = 1
+
+ self.assertEqual(types.SimpleNamespace(), types.SimpleNamespace())
+ self.assertEqual(ns1, ns2)
+ self.assertNotEqual(ns2, types.SimpleNamespace())
def test_nested(self):
ns1 = types.SimpleNamespace(a=1, b=2)
@@ -1117,11 +1128,12 @@ class SimpleNamespaceTests(unittest.TestCase):
ns1.spam = ns1
ns2.spam = ns3
ns3.spam = ns2
+ name = "namespace"
+ repr1 = "{name}(c='cookie', spam={name}(...))".format(name=name)
+ repr2 = "{name}(spam={name}(spam={name}(...), x=1))".format(name=name)
- self.assertEqual(repr(ns1),
- "namespace(c='cookie', spam=namespace(...))")
- self.assertEqual(repr(ns2),
- "namespace(spam=namespace(spam=namespace(...), x=1))")
+ self.assertEqual(repr(ns1), repr1)
+ self.assertEqual(repr(ns2), repr2)
def test_as_dict(self):
ns = types.SimpleNamespace(spam='spamspamspam')
@@ -1144,6 +1156,19 @@ class SimpleNamespaceTests(unittest.TestCase):
self.assertIs(type(spam), Spam)
self.assertEqual(vars(spam), {'ham': 8, 'eggs': 9})
+ def test_pickle(self):
+ ns = types.SimpleNamespace(breakfast="spam", lunch="spam")
+
+ for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
+ pname = "protocol {}".format(protocol)
+ try:
+ ns_pickled = pickle.dumps(ns, protocol)
+ except TypeError as e:
+ raise TypeError(pname) from e
+ ns_roundtrip = pickle.loads(ns_pickled)
+
+ self.assertEqual(ns, ns_roundtrip, pname)
+
def test_main():
run_unittest(TypesTests, MappingProxyTests, ClassCreationTests,
diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py
index 2e63745..59bde74 100644
--- a/Lib/test/test_ucn.py
+++ b/Lib/test/test_ucn.py
@@ -173,7 +173,7 @@ class UnicodeNamesTest(unittest.TestCase):
try:
testdata = support.open_urlresource(url, encoding="utf-8",
check=check_version)
- except (IOError, HTTPException):
+ except (OSError, HTTPException):
self.skipTest("Could not retrieve " + url)
self.addCleanup(testdata.close)
for line in testdata:
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index 9dc3438..9e53213 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -7,6 +7,7 @@ Written by Marc-Andre Lemburg (mal@lemburg.com).
"""#"
import _string
import codecs
+import itertools
import struct
import sys
import unittest
@@ -31,6 +32,16 @@ def search_function(encoding):
return None
codecs.register(search_function)
+def duplicate_string(text):
+ """
+ Try to get a fresh clone of the specified text:
+ new object with a reference count of 1.
+
+ This is a best-effort: latin1 single letters and the empty
+ string ('') are singletons and cannot be cloned.
+ """
+ return text.encode().decode()
+
class UnicodeTest(string_tests.CommonTest,
string_tests.MixinStrUnicodeUserStringTest,
string_tests.MixinStrUnicodeTest,
@@ -863,11 +874,9 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual('{0:d}'.format(G('data')), 'G(data)')
self.assertEqual('{0!s}'.format(G('data')), 'string is data')
- msg = 'object.__format__ with a non-empty format string is deprecated'
- with support.check_warnings((msg, DeprecationWarning)):
- self.assertEqual('{0:^10}'.format(E('data')), ' E(data) ')
- self.assertEqual('{0:^10s}'.format(E('data')), ' E(data) ')
- self.assertEqual('{0:>15s}'.format(G('data')), ' string is data')
+ self.assertRaises(TypeError, '{0:^10}'.format, E('data'))
+ self.assertRaises(TypeError, '{0:^10s}'.format, E('data'))
+ self.assertRaises(TypeError, '{0:>15s}'.format, G('data'))
self.assertEqual("{0:date: %Y-%m-%d}".format(I(year=2007,
month=8,
@@ -903,7 +912,7 @@ class UnicodeTest(string_tests.CommonTest,
self.assertRaises(ValueError, "{0".format)
self.assertRaises(IndexError, "{0.}".format)
self.assertRaises(ValueError, "{0.}".format, 0)
- self.assertRaises(IndexError, "{0[}".format)
+ self.assertRaises(ValueError, "{0[}".format)
self.assertRaises(ValueError, "{0[}".format, [])
self.assertRaises(KeyError, "{0]}".format)
self.assertRaises(ValueError, "{0.[]}".format, 0)
@@ -955,6 +964,14 @@ class UnicodeTest(string_tests.CommonTest,
'')
self.assertEqual("{[{}]}".format({"{}": 5}), "5")
+ self.assertEqual("{[{}]}".format({"{}" : "a"}), "a")
+ self.assertEqual("{[{]}".format({"{" : "a"}), "a")
+ self.assertEqual("{[}]}".format({"}" : "a"}), "a")
+ self.assertEqual("{[[]}".format({"[" : "a"}), "a")
+ self.assertEqual("{[!]}".format({"!" : "a"}), "a")
+ self.assertRaises(ValueError, "{a{}b}".format, 42)
+ self.assertRaises(ValueError, "{a{b}".format, 42)
+ self.assertRaises(ValueError, "{[}".format, 42)
def test_format_map(self):
self.assertEqual(''.format_map({}), '')
@@ -2004,9 +2021,10 @@ class UnicodeTest(string_tests.CommonTest,
# Test PyUnicode_FromFormat()
def test_from_format(self):
support.import_module('ctypes')
- from ctypes import (pythonapi, py_object,
+ from ctypes import (
+ pythonapi, py_object, sizeof,
c_int, c_long, c_longlong, c_ssize_t,
- c_uint, c_ulong, c_ulonglong, c_size_t)
+ c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p)
name = "PyUnicode_FromFormat"
_PyUnicode_FromFormat = getattr(pythonapi, name)
_PyUnicode_FromFormat.restype = py_object
@@ -2017,9 +2035,13 @@ class UnicodeTest(string_tests.CommonTest,
for arg in args)
return _PyUnicode_FromFormat(format, *cargs)
+ def check_format(expected, format, *args):
+ text = PyUnicode_FromFormat(format, *args)
+ self.assertEqual(expected, text)
+
# ascii format, non-ascii argument
- text = PyUnicode_FromFormat(b'ascii\x7f=%U', 'unicode\xe9')
- self.assertEqual(text, 'ascii\x7f=unicode\xe9')
+ check_format('ascii\x7f=unicode\xe9',
+ b'ascii\x7f=%U', 'unicode\xe9')
# non-ascii format, ascii argument: ensure that PyUnicode_FromFormatV()
# raises an error
@@ -2029,64 +2051,205 @@ class UnicodeTest(string_tests.CommonTest,
PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
# test "%c"
- self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0xabcd)), '\uabcd')
- self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0x10ffff)), '\U0010ffff')
+ check_format('\uabcd',
+ b'%c', c_int(0xabcd))
+ check_format('\U0010ffff',
+ b'%c', c_int(0x10ffff))
with self.assertRaises(OverflowError):
PyUnicode_FromFormat(b'%c', c_int(0x110000))
# Issue #18183
- self.assertEqual(
- PyUnicode_FromFormat(b'%c%c', c_int(0x10000), c_int(0x100000)),
- '\U00010000\U00100000')
+ check_format('\U00010000\U00100000',
+ b'%c%c', c_int(0x10000), c_int(0x100000))
# test "%"
- self.assertEqual(PyUnicode_FromFormat(b'%'), '%')
- self.assertEqual(PyUnicode_FromFormat(b'%%'), '%')
- self.assertEqual(PyUnicode_FromFormat(b'%%s'), '%s')
- self.assertEqual(PyUnicode_FromFormat(b'[%%]'), '[%]')
- self.assertEqual(PyUnicode_FromFormat(b'%%%s', b'abc'), '%abc')
+ check_format('%',
+ b'%')
+ check_format('%',
+ b'%%')
+ check_format('%s',
+ b'%%s')
+ check_format('[%]',
+ b'[%%]')
+ check_format('%abc',
+ b'%%%s', b'abc')
+
+ # truncated string
+ check_format('abc',
+ b'%.3s', b'abcdef')
+ check_format('abc[\ufffd',
+ b'%.5s', 'abc[\u20ac]'.encode('utf8'))
+ check_format("'\\u20acABC'",
+ b'%A', '\u20acABC')
+ check_format("'\\u20",
+ b'%.5A', '\u20acABCDEF')
+ check_format("'\u20acABC'",
+ b'%R', '\u20acABC')
+ check_format("'\u20acA",
+ b'%.3R', '\u20acABCDEF')
+ check_format('\u20acAB',
+ b'%.3S', '\u20acABCDEF')
+ check_format('\u20acAB',
+ b'%.3U', '\u20acABCDEF')
+ check_format('\u20acAB',
+ b'%.3V', '\u20acABCDEF', None)
+ check_format('abc[\ufffd',
+ b'%.5V', None, 'abc[\u20ac]'.encode('utf8'))
+
+ # following tests comes from #7330
+ # test width modifier and precision modifier with %S
+ check_format("repr= abc",
+ b'repr=%5S', 'abc')
+ check_format("repr=ab",
+ b'repr=%.2S', 'abc')
+ check_format("repr= ab",
+ b'repr=%5.2S', 'abc')
+
+ # test width modifier and precision modifier with %R
+ check_format("repr= 'abc'",
+ b'repr=%8R', 'abc')
+ check_format("repr='ab",
+ b'repr=%.3R', 'abc')
+ check_format("repr= 'ab",
+ b'repr=%5.3R', 'abc')
+
+ # test width modifier and precision modifier with %A
+ check_format("repr= 'abc'",
+ b'repr=%8A', 'abc')
+ check_format("repr='ab",
+ b'repr=%.3A', 'abc')
+ check_format("repr= 'ab",
+ b'repr=%5.3A', 'abc')
+
+ # test width modifier and precision modifier with %s
+ check_format("repr= abc",
+ b'repr=%5s', b'abc')
+ check_format("repr=ab",
+ b'repr=%.2s', b'abc')
+ check_format("repr= ab",
+ b'repr=%5.2s', b'abc')
+
+ # test width modifier and precision modifier with %U
+ check_format("repr= abc",
+ b'repr=%5U', 'abc')
+ check_format("repr=ab",
+ b'repr=%.2U', 'abc')
+ check_format("repr= ab",
+ b'repr=%5.2U', 'abc')
+
+ # test width modifier and precision modifier with %V
+ check_format("repr= abc",
+ b'repr=%5V', 'abc', b'123')
+ check_format("repr=ab",
+ b'repr=%.2V', 'abc', b'123')
+ check_format("repr= ab",
+ b'repr=%5.2V', 'abc', b'123')
+ check_format("repr= 123",
+ b'repr=%5V', None, b'123')
+ check_format("repr=12",
+ b'repr=%.2V', None, b'123')
+ check_format("repr= 12",
+ b'repr=%5.2V', None, b'123')
# test integer formats (%i, %d, %u)
- self.assertEqual(PyUnicode_FromFormat(b'%03i', c_int(10)), '010')
- self.assertEqual(PyUnicode_FromFormat(b'%0.4i', c_int(10)), '0010')
- self.assertEqual(PyUnicode_FromFormat(b'%i', c_int(-123)), '-123')
- self.assertEqual(PyUnicode_FromFormat(b'%li', c_long(-123)), '-123')
- self.assertEqual(PyUnicode_FromFormat(b'%lli', c_longlong(-123)), '-123')
- self.assertEqual(PyUnicode_FromFormat(b'%zi', c_ssize_t(-123)), '-123')
-
- self.assertEqual(PyUnicode_FromFormat(b'%d', c_int(-123)), '-123')
- self.assertEqual(PyUnicode_FromFormat(b'%ld', c_long(-123)), '-123')
- self.assertEqual(PyUnicode_FromFormat(b'%lld', c_longlong(-123)), '-123')
- self.assertEqual(PyUnicode_FromFormat(b'%zd', c_ssize_t(-123)), '-123')
-
- self.assertEqual(PyUnicode_FromFormat(b'%u', c_uint(123)), '123')
- self.assertEqual(PyUnicode_FromFormat(b'%lu', c_ulong(123)), '123')
- self.assertEqual(PyUnicode_FromFormat(b'%llu', c_ulonglong(123)), '123')
- self.assertEqual(PyUnicode_FromFormat(b'%zu', c_size_t(123)), '123')
+ check_format('010',
+ b'%03i', c_int(10))
+ check_format('0010',
+ b'%0.4i', c_int(10))
+ check_format('-123',
+ b'%i', c_int(-123))
+ check_format('-123',
+ b'%li', c_long(-123))
+ check_format('-123',
+ b'%lli', c_longlong(-123))
+ check_format('-123',
+ b'%zi', c_ssize_t(-123))
+
+ check_format('-123',
+ b'%d', c_int(-123))
+ check_format('-123',
+ b'%ld', c_long(-123))
+ check_format('-123',
+ b'%lld', c_longlong(-123))
+ check_format('-123',
+ b'%zd', c_ssize_t(-123))
+
+ check_format('123',
+ b'%u', c_uint(123))
+ check_format('123',
+ b'%lu', c_ulong(123))
+ check_format('123',
+ b'%llu', c_ulonglong(123))
+ check_format('123',
+ b'%zu', c_size_t(123))
+
+ # test long output
+ min_longlong = -(2 ** (8 * sizeof(c_longlong) - 1))
+ max_longlong = -min_longlong - 1
+ check_format(str(min_longlong),
+ b'%lld', c_longlong(min_longlong))
+ check_format(str(max_longlong),
+ b'%lld', c_longlong(max_longlong))
+ max_ulonglong = 2 ** (8 * sizeof(c_ulonglong)) - 1
+ check_format(str(max_ulonglong),
+ b'%llu', c_ulonglong(max_ulonglong))
+ PyUnicode_FromFormat(b'%p', c_void_p(-1))
+
+ # test padding (width and/or precision)
+ check_format('123'.rjust(10, '0'),
+ b'%010i', c_int(123))
+ check_format('123'.rjust(100),
+ b'%100i', c_int(123))
+ check_format('123'.rjust(100, '0'),
+ b'%.100i', c_int(123))
+ check_format('123'.rjust(80, '0').rjust(100),
+ b'%100.80i', c_int(123))
+
+ check_format('123'.rjust(10, '0'),
+ b'%010u', c_uint(123))
+ check_format('123'.rjust(100),
+ b'%100u', c_uint(123))
+ check_format('123'.rjust(100, '0'),
+ b'%.100u', c_uint(123))
+ check_format('123'.rjust(80, '0').rjust(100),
+ b'%100.80u', c_uint(123))
+
+ check_format('123'.rjust(10, '0'),
+ b'%010x', c_int(0x123))
+ check_format('123'.rjust(100),
+ b'%100x', c_int(0x123))
+ check_format('123'.rjust(100, '0'),
+ b'%.100x', c_int(0x123))
+ check_format('123'.rjust(80, '0').rjust(100),
+ b'%100.80x', c_int(0x123))
# test %A
- text = PyUnicode_FromFormat(b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
- self.assertEqual(text, r"%A:'abc\xe9\uabcd\U0010ffff'")
+ check_format(r"%A:'abc\xe9\uabcd\U0010ffff'",
+ b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
# test %V
- text = PyUnicode_FromFormat(b'repr=%V', 'abc', b'xyz')
- self.assertEqual(text, 'repr=abc')
+ check_format('repr=abc',
+ b'repr=%V', 'abc', b'xyz')
# Test string decode from parameter of %s using utf-8.
# b'\xe4\xba\xba\xe6\xb0\x91' is utf-8 encoded byte sequence of
# '\u4eba\u6c11'
- text = PyUnicode_FromFormat(b'repr=%V', None, b'\xe4\xba\xba\xe6\xb0\x91')
- self.assertEqual(text, 'repr=\u4eba\u6c11')
+ check_format('repr=\u4eba\u6c11',
+ b'repr=%V', None, b'\xe4\xba\xba\xe6\xb0\x91')
#Test replace error handler.
- text = PyUnicode_FromFormat(b'repr=%V', None, b'abc\xff')
- self.assertEqual(text, 'repr=abc\ufffd')
+ check_format('repr=abc\ufffd',
+ b'repr=%V', None, b'abc\xff')
# not supported: copy the raw format string. these tests are just here
# to check for crashs and should not be considered as specifications
- self.assertEqual(PyUnicode_FromFormat(b'%1%s', b'abc'), '%s')
- self.assertEqual(PyUnicode_FromFormat(b'%1abc'), '%1abc')
- self.assertEqual(PyUnicode_FromFormat(b'%+i', c_int(10)), '%+i')
- self.assertEqual(PyUnicode_FromFormat(b'%.%s', b'abc'), '%.%s')
+ check_format('%s',
+ b'%1%s', b'abc')
+ check_format('%1abc',
+ b'%1abc')
+ check_format('%+i',
+ b'%+i', c_int(10))
+ check_format('%.%s',
+ b'%.%s', b'abc')
# Test PyUnicode_AsWideChar()
def test_aswidechar(self):
@@ -2210,6 +2373,80 @@ class UnicodeTest(string_tests.CommonTest,
self.assertNotEqual(abc, abcdef)
self.assertEqual(abcdef.decode('unicode_internal'), text)
+ def test_compare(self):
+ # Issue #17615
+ N = 10
+ ascii = 'a' * N
+ ascii2 = 'z' * N
+ latin = '\x80' * N
+ latin2 = '\xff' * N
+ bmp = '\u0100' * N
+ bmp2 = '\uffff' * N
+ astral = '\U00100000' * N
+ astral2 = '\U0010ffff' * N
+ strings = (
+ ascii, ascii2,
+ latin, latin2,
+ bmp, bmp2,
+ astral, astral2)
+ for text1, text2 in itertools.combinations(strings, 2):
+ equal = (text1 is text2)
+ self.assertEqual(text1 == text2, equal)
+ self.assertEqual(text1 != text2, not equal)
+
+ if equal:
+ self.assertTrue(text1 <= text2)
+ self.assertTrue(text1 >= text2)
+
+ # text1 is text2: duplicate strings to skip the "str1 == str2"
+ # optimization in unicode_compare_eq() and really compare
+ # character per character
+ copy1 = duplicate_string(text1)
+ copy2 = duplicate_string(text2)
+ self.assertIsNot(copy1, copy2)
+
+ self.assertTrue(copy1 == copy2)
+ self.assertFalse(copy1 != copy2)
+
+ self.assertTrue(copy1 <= copy2)
+ self.assertTrue(copy2 >= copy2)
+
+ self.assertTrue(ascii < ascii2)
+ self.assertTrue(ascii < latin)
+ self.assertTrue(ascii < bmp)
+ self.assertTrue(ascii < astral)
+ self.assertFalse(ascii >= ascii2)
+ self.assertFalse(ascii >= latin)
+ self.assertFalse(ascii >= bmp)
+ self.assertFalse(ascii >= astral)
+
+ self.assertFalse(latin < ascii)
+ self.assertTrue(latin < latin2)
+ self.assertTrue(latin < bmp)
+ self.assertTrue(latin < astral)
+ self.assertTrue(latin >= ascii)
+ self.assertFalse(latin >= latin2)
+ self.assertFalse(latin >= bmp)
+ self.assertFalse(latin >= astral)
+
+ self.assertFalse(bmp < ascii)
+ self.assertFalse(bmp < latin)
+ self.assertTrue(bmp < bmp2)
+ self.assertTrue(bmp < astral)
+ self.assertTrue(bmp >= ascii)
+ self.assertTrue(bmp >= latin)
+ self.assertFalse(bmp >= bmp2)
+ self.assertFalse(bmp >= astral)
+
+ self.assertFalse(astral < ascii)
+ self.assertFalse(astral < latin)
+ self.assertFalse(astral < bmp2)
+ self.assertTrue(astral < astral2)
+ self.assertTrue(astral >= ascii)
+ self.assertTrue(astral >= latin)
+ self.assertTrue(astral >= bmp2)
+ self.assertFalse(astral >= astral2)
+
class StringModuleTest(unittest.TestCase):
def test_formatter_parser(self):
diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py
index 99aa003..677508b 100644
--- a/Lib/test/test_unicodedata.py
+++ b/Lib/test/test_unicodedata.py
@@ -80,7 +80,7 @@ class UnicodeDatabaseTest(unittest.TestCase):
class UnicodeFunctionsTest(UnicodeDatabaseTest):
# update this, if the database changes
- expectedchecksum = '17fe2f12b788e4fff5479b469c4404bb6ecf841f'
+ expectedchecksum = 'ebd64e81553c9cb37f424f5616254499fcd8849e'
def test_function_checksum(self):
data = []
h = hashlib.sha1()
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
index 7a34a05..94f640b 100644
--- a/Lib/test/test_urllib.py
+++ b/Lib/test/test_urllib.py
@@ -16,6 +16,7 @@ from nturl2path import url2pathname, pathname2url
from base64 import b64encode
import collections
+
def hexescape(char):
"""Escape char as RFC 2396 specifies"""
hex_repr = hex(ord(char))[2:].upper()
@@ -238,7 +239,7 @@ class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin):
self.check_read(b"1.1")
def test_read_bogus(self):
- # urlopen() should raise IOError for many error codes.
+ # urlopen() should raise OSError for many error codes.
self.fakehttp(b'''HTTP/1.1 401 Authentication Required
Date: Wed, 02 Jan 2008 03:03:54 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e
@@ -246,12 +247,12 @@ Connection: close
Content-Type: text/html; charset=iso-8859-1
''')
try:
- self.assertRaises(IOError, urlopen, "http://python.org/")
+ self.assertRaises(OSError, urlopen, "http://python.org/")
finally:
self.unfakehttp()
def test_invalid_redirect(self):
- # urlopen() should raise IOError for many error codes.
+ # urlopen() should raise OSError for many error codes.
self.fakehttp(b'''HTTP/1.1 302 Found
Date: Wed, 02 Jan 2008 03:03:54 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e
@@ -266,19 +267,20 @@ Content-Type: text/html; charset=iso-8859-1
self.unfakehttp()
def test_empty_socket(self):
- # urlopen() raises IOError if the underlying socket does not send any
+ # urlopen() raises OSError if the underlying socket does not send any
# data. (#1680230)
self.fakehttp(b'')
try:
- self.assertRaises(IOError, urlopen, "http://something")
+ self.assertRaises(OSError, urlopen, "http://something")
finally:
self.unfakehttp()
def test_missing_localfile(self):
# Test for #10836
- # 3.3 - URLError is not captured, explicit IOError is raised.
- with self.assertRaises(IOError):
+ with self.assertRaises(urllib.error.URLError) as e:
urlopen('file://localhost/a/file/which/doesnot/exists.py')
+ self.assertTrue(e.exception.filename)
+ self.assertTrue(e.exception.reason)
def test_file_notexists(self):
fd, tmp_file = tempfile.mkstemp()
@@ -291,20 +293,21 @@ Content-Type: text/html; charset=iso-8859-1
os.close(fd)
os.unlink(tmp_file)
self.assertFalse(os.path.exists(tmp_file))
- # 3.3 - IOError instead of URLError
- with self.assertRaises(IOError):
+ with self.assertRaises(urllib.error.URLError):
urlopen(tmp_fileurl)
def test_ftp_nohost(self):
test_ftp_url = 'ftp:///path'
- # 3.3 - IOError instead of URLError
- with self.assertRaises(IOError):
+ with self.assertRaises(urllib.error.URLError) as e:
urlopen(test_ftp_url)
+ self.assertFalse(e.exception.filename)
+ self.assertTrue(e.exception.reason)
def test_ftp_nonexisting(self):
- # 3.3 - IOError instead of URLError
- with self.assertRaises(IOError):
+ with self.assertRaises(urllib.error.URLError) as e:
urlopen('ftp://localhost/a/file/which/doesnot/exists.py')
+ self.assertFalse(e.exception.filename)
+ self.assertTrue(e.exception.reason)
def test_userpass_inurl(self):
@@ -341,6 +344,79 @@ Content-Type: text/html; charset=iso-8859-1
with support.check_warnings(('',DeprecationWarning)):
urllib.request.URLopener()
+class urlopen_DataTests(unittest.TestCase):
+ """Test urlopen() opening a data URL."""
+
+ def setUp(self):
+ # text containing URL special- and unicode-characters
+ self.text = "test data URLs :;,%=& \u00f6 \u00c4 "
+ # 2x1 pixel RGB PNG image with one black and one white pixel
+ self.image = (
+ b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x02\x00\x00\x00'
+ b'\x01\x08\x02\x00\x00\x00{@\xe8\xdd\x00\x00\x00\x01sRGB\x00\xae'
+ b'\xce\x1c\xe9\x00\x00\x00\x0fIDAT\x08\xd7c```\xf8\xff\xff?\x00'
+ b'\x06\x01\x02\xfe\no/\x1e\x00\x00\x00\x00IEND\xaeB`\x82')
+
+ self.text_url = (
+ "data:text/plain;charset=UTF-8,test%20data%20URLs%20%3A%3B%2C%25%3"
+ "D%26%20%C3%B6%20%C3%84%20")
+ self.text_url_base64 = (
+ "data:text/plain;charset=ISO-8859-1;base64,dGVzdCBkYXRhIFVSTHMgOjs"
+ "sJT0mIPYgxCA%3D")
+ # base64 encoded data URL that contains ignorable spaces,
+ # such as "\n", " ", "%0A", and "%20".
+ self.image_url = (
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAABCAIAAAB7\n"
+ "QOjdAAAAAXNSR0IArs4c6QAAAA9JREFUCNdj%0AYGBg%2BP//PwAGAQL%2BCm8 "
+ "vHgAAAABJRU5ErkJggg%3D%3D%0A%20")
+
+ self.text_url_resp = urllib.request.urlopen(self.text_url)
+ self.text_url_base64_resp = urllib.request.urlopen(
+ self.text_url_base64)
+ self.image_url_resp = urllib.request.urlopen(self.image_url)
+
+ def test_interface(self):
+ # Make sure object returned by urlopen() has the specified methods
+ for attr in ("read", "readline", "readlines",
+ "close", "info", "geturl", "getcode", "__iter__"):
+ self.assertTrue(hasattr(self.text_url_resp, attr),
+ "object returned by urlopen() lacks %s attribute" %
+ attr)
+
+ def test_info(self):
+ self.assertIsInstance(self.text_url_resp.info(), email.message.Message)
+ self.assertEqual(self.text_url_base64_resp.info().get_params(),
+ [('text/plain', ''), ('charset', 'ISO-8859-1')])
+ self.assertEqual(self.image_url_resp.info()['content-length'],
+ str(len(self.image)))
+ self.assertEqual(urllib.request.urlopen("data:,").info().get_params(),
+ [('text/plain', ''), ('charset', 'US-ASCII')])
+
+ def test_geturl(self):
+ self.assertEqual(self.text_url_resp.geturl(), self.text_url)
+ self.assertEqual(self.text_url_base64_resp.geturl(),
+ self.text_url_base64)
+ self.assertEqual(self.image_url_resp.geturl(), self.image_url)
+
+ def test_read_text(self):
+ self.assertEqual(self.text_url_resp.read().decode(
+ dict(self.text_url_resp.info().get_params())['charset']), self.text)
+
+ def test_read_text_base64(self):
+ self.assertEqual(self.text_url_base64_resp.read().decode(
+ dict(self.text_url_base64_resp.info().get_params())['charset']),
+ self.text)
+
+ def test_read_image(self):
+ self.assertEqual(self.image_url_resp.read(), self.image)
+
+ def test_missing_comma(self):
+ self.assertRaises(ValueError,urllib.request.urlopen,'data:text/plain')
+
+ def test_invalid_base64_data(self):
+ # missing padding character
+ self.assertRaises(ValueError,urllib.request.urlopen,'data:;base64,Cg=')
+
class urlretrieve_FileTests(unittest.TestCase):
"""Test urllib.urlretrieve() on local files"""
@@ -1291,6 +1367,7 @@ class URLopener_Tests(unittest.TestCase):
# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
# ftp.close()
+
class RequestTests(unittest.TestCase):
"""Unit tests for urllib.request.Request."""
diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index 33f90f4..b3659f4 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -11,6 +11,7 @@ import urllib.request
# The proxy bypass method imported below has logic specific to the OSX
# proxy config data structure but is testable on all platforms.
from urllib.request import Request, OpenerDirector, _proxy_bypass_macosx_sysconf
+from urllib.parse import urlparse
import urllib.error
# XXX
@@ -118,6 +119,15 @@ class RequestHdrsTests(unittest.TestCase):
self.assertIsNone(req.get_header("Not-there"))
self.assertEqual(req.get_header("Not-there", "default"), "default")
+ req.remove_header("Spam-eggs")
+ self.assertFalse(req.has_header("Spam-eggs"))
+
+ req.add_unredirected_header("Unredirected-spam", "Eggs")
+ self.assertTrue(req.has_header("Unredirected-spam"))
+
+ req.remove_header("Unredirected-spam")
+ self.assertFalse(req.has_header("Unredirected-spam"))
+
def test_password_manager(self):
mgr = urllib.request.HTTPPasswordMgr()
@@ -283,6 +293,7 @@ class MockHTTPClass:
self.req_headers = []
self.data = None
self.raise_on_endheaders = False
+ self.sock = None
self._tunnel_headers = {}
def __call__(self, host, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
@@ -310,8 +321,7 @@ class MockHTTPClass:
if body:
self.data = body
if self.raise_on_endheaders:
- import socket
- raise socket.error()
+ raise OSError()
def getresponse(self):
return MockHTTPResponse(MockFile(), {}, 200, "OK")
@@ -596,27 +606,6 @@ class OpenerDirectorTests(unittest.TestCase):
self.assertTrue(args[1] is None or
isinstance(args[1], MockResponse))
- def test_method_deprecations(self):
- req = Request("http://www.example.com")
-
- with self.assertWarns(DeprecationWarning):
- req.add_data("data")
- with self.assertWarns(DeprecationWarning):
- req.get_data()
- with self.assertWarns(DeprecationWarning):
- req.has_data()
- with self.assertWarns(DeprecationWarning):
- req.get_host()
- with self.assertWarns(DeprecationWarning):
- req.get_selector()
- with self.assertWarns(DeprecationWarning):
- req.is_unverifiable()
- with self.assertWarns(DeprecationWarning):
- req.get_origin_req_host()
- with self.assertWarns(DeprecationWarning):
- req.get_type()
-
-
def sanepathname2url(path):
try:
path.encode("utf-8")
@@ -811,7 +800,7 @@ class HandlerTests(unittest.TestCase):
("Foo", "bar"), ("Spam", "eggs")])
self.assertEqual(http.data, data)
- # check socket.error converted to URLError
+ # check OSError converted to URLError
http.raise_on_endheaders = True
self.assertRaises(urllib.error.URLError, h.do_open, http, req)
@@ -916,6 +905,36 @@ class HandlerTests(unittest.TestCase):
p_ds_req = h.do_request_(ds_req)
self.assertEqual(p_ds_req.unredirected_hdrs["Host"],"example.com")
+ def test_full_url_setter(self):
+ # Checks to ensure that components are set correctly after setting the
+ # full_url of a Request object
+
+ urls = [
+ 'http://example.com?foo=bar#baz',
+ 'http://example.com?foo=bar&spam=eggs#bash',
+ 'http://example.com',
+ ]
+
+ # testing a reusable request instance, but the url parameter is
+ # required, so just use a dummy one to instantiate
+ r = Request('http://example.com')
+ for url in urls:
+ r.full_url = url
+ parsed = urlparse(url)
+
+ self.assertEqual(r.get_full_url(), url)
+ # full_url setter uses splittag to split into components.
+ # splittag sets the fragment as None while urlparse sets it to ''
+ self.assertEqual(r.fragment or '', parsed.fragment)
+ self.assertEqual(urlparse(r.get_full_url()).query, parsed.query)
+
+ def test_full_url_deleter(self):
+ r = Request('http://www.example.com')
+ del r.full_url
+ self.assertIsNone(r.full_url)
+ self.assertIsNone(r.fragment)
+ self.assertEqual(r.selector, '')
+
def test_fixpath_in_weirdurls(self):
# Issue4493: urllib2 to supply '/' when to urls where path does not
# start with'/'
@@ -1415,6 +1434,21 @@ class MiscTests(unittest.TestCase):
self.opener_has_handler(o, MyHTTPHandler)
self.opener_has_handler(o, MyOtherHTTPHandler)
+ @unittest.skipUnless(support.is_resource_enabled('network'),
+ 'test requires network access')
+ def test_issue16464(self):
+ opener = urllib.request.build_opener()
+ request = urllib.request.Request("http://www.python.org/~jeremy/")
+ self.assertEqual(None, request.data)
+
+ opener.open(request, "1".encode("us-ascii"))
+ self.assertEqual(b"1", request.data)
+ self.assertEqual("1", request.get_header("Content-length"))
+
+ opener.open(request, "1234567890".encode("us-ascii"))
+ self.assertEqual(b"1234567890", request.data)
+ self.assertEqual("10", request.get_header("Content-length"))
+
def test_HTTPError_interface(self):
"""
Issue 13211 reveals that HTTPError didn't implement the URLError
@@ -1426,12 +1460,11 @@ class MiscTests(unittest.TestCase):
err = urllib.error.HTTPError(url, code, msg, hdrs, fp)
self.assertTrue(hasattr(err, 'reason'))
self.assertEqual(err.reason, 'something bad happened')
- self.assertTrue(hasattr(err, 'hdrs'))
- self.assertEqual(err.hdrs, 'Content-Length: 42')
+ self.assertTrue(hasattr(err, 'headers'))
+ self.assertEqual(err.headers, 'Content-Length: 42')
expected_errmsg = 'HTTP Error %s: %s' % (err.code, err.msg)
self.assertEqual(str(err), expected_errmsg)
-
class RequestTests(unittest.TestCase):
def setUp(self):
@@ -1451,6 +1484,25 @@ class RequestTests(unittest.TestCase):
self.assertTrue(self.get.data)
self.assertEqual("POST", self.get.get_method())
+ # issue 16464
+ # if we change data we need to remove content-length header
+ # (cause it's most probably calculated for previous value)
+ def test_setting_data_should_remove_content_length(self):
+ self.assertNotIn("Content-length", self.get.unredirected_hdrs)
+ self.get.add_unredirected_header("Content-length", 42)
+ self.assertEqual(42, self.get.unredirected_hdrs["Content-length"])
+ self.get.data = "spam"
+ self.assertNotIn("Content-length", self.get.unredirected_hdrs)
+
+ # issue 17485 same for deleting data.
+ def test_deleting_data_should_remove_content_length(self):
+ self.assertNotIn("Content-length", self.get.unredirected_hdrs)
+ self.get.data = 'foo'
+ self.get.add_unredirected_header("Content-length", 3)
+ self.assertEqual(3, self.get.unredirected_hdrs["Content-length"])
+ del self.get.data
+ self.assertNotIn("Content-length", self.get.unredirected_hdrs)
+
def test_get_full_url(self):
self.assertEqual("http://www.python.org/~jeremy/",
self.get.get_full_url())
@@ -1492,21 +1544,13 @@ class RequestTests(unittest.TestCase):
req = Request(url)
self.assertEqual(req.get_full_url(), url)
- def test_HTTPError_interface_call(self):
- """
- Issue 15701 - HTTPError interface has info method available from URLError
- """
- err = urllib.request.HTTPError(msg="something bad happened", url=None,
- code=None, hdrs='Content-Length:42', fp=None)
- self.assertTrue(hasattr(err, 'reason'))
- assert hasattr(err, 'reason')
- assert hasattr(err, 'info')
- assert callable(err.info)
- try:
- err.info()
- except AttributeError:
- self.fail('err.info call failed.')
- self.assertEqual(err.info(), "Content-Length:42")
+ def test_url_fullurl_get_full_url(self):
+ urls = ['http://docs.python.org',
+ 'http://docs.python.org/library/urllib2.html#OK',
+ 'http://www.python.org/?qs=query#fragment=true' ]
+ for url in urls:
+ req = Request(url)
+ self.assertEqual(req.get_full_url(), req.full_url)
def test_main(verbose=None):
from test import test_urllib2
diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py
index b1aa158..08250c3 100644
--- a/Lib/test/test_urllib2_localnet.py
+++ b/Lib/test/test_urllib2_localnet.py
@@ -9,7 +9,10 @@ import unittest
import hashlib
from test import support
threading = support.import_module('threading')
-
+try:
+ import ssl
+except ImportError:
+ ssl = None
here = os.path.dirname(__file__)
# Self-signed cert file for 'localhost'
@@ -17,6 +20,7 @@ CERT_localhost = os.path.join(here, 'keycert.pem')
# Self-signed cert file for 'fakehostname'
CERT_fakehostname = os.path.join(here, 'keycert2.pem')
+
# Loopback http server infrastructure
class LoopbackHttpServer(http.server.HTTPServer):
@@ -353,12 +357,15 @@ class TestUrlopen(unittest.TestCase):
def setUp(self):
super(TestUrlopen, self).setUp()
# Ignore proxies for localhost tests.
+ self.old_environ = os.environ.copy()
os.environ['NO_PROXY'] = '*'
self.server = None
def tearDown(self):
if self.server is not None:
self.server.stop()
+ os.environ.clear()
+ os.environ.update(self.old_environ)
super(TestUrlopen, self).tearDown()
def urlopen(self, url, data=None, **kwargs):
@@ -386,14 +393,14 @@ class TestUrlopen(unittest.TestCase):
handler.port = port
return handler
- def start_https_server(self, responses=None, certfile=CERT_localhost):
+ def start_https_server(self, responses=None, **kwargs):
if not hasattr(urllib.request, 'HTTPSHandler'):
self.skipTest('ssl support required')
from test.ssl_servers import make_https_server
if responses is None:
responses = [(200, [], b"we care a bit")]
handler = GetRequestHandler(responses)
- server = make_https_server(self, certfile=certfile, handler_class=handler)
+ server = make_https_server(self, handler_class=handler, **kwargs)
handler.port = server.port
return handler
@@ -483,6 +490,21 @@ class TestUrlopen(unittest.TestCase):
self.urlopen("https://localhost:%s/bizarre" % handler.port,
cadefault=True)
+ def test_https_sni(self):
+ if ssl is None:
+ self.skipTest("ssl module required")
+ if not ssl.HAS_SNI:
+ self.skipTest("SNI support required in OpenSSL")
+ sni_name = None
+ def cb_sni(ssl_sock, server_name, initial_context):
+ nonlocal sni_name
+ sni_name = server_name
+ context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ context.set_servername_callback(cb_sni)
+ handler = self.start_https_server(context=context, certfile=CERT_localhost)
+ self.urlopen("https://localhost:%s" % handler.port)
+ self.assertEqual(sni_name, "localhost")
+
def test_sending_headers(self):
handler = self.start_server()
req = urllib.request.Request("http://localhost:%s/" % handler.port,
@@ -529,7 +551,7 @@ class TestUrlopen(unittest.TestCase):
# so we run the test only when -unetwork/-uall is specified to
# mitigate the problem a bit (see #17564)
support.requires('network')
- self.assertRaises(IOError,
+ self.assertRaises(OSError,
# Given that both VeriSign and various ISPs have in
# the past or are presently hijacking various invalid
# domain name requests in an attempt to boost traffic
diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py
index 7f3c93a..fba3cea 100644
--- a/Lib/test/test_urllib2net.py
+++ b/Lib/test/test_urllib2net.py
@@ -164,6 +164,14 @@ class OtherNetworkTests(unittest.TestCase):
self.assertEqual(res.geturl(),
"http://docs.python.org/2/glossary.html#glossary")
+ def test_redirect_url_withfrag(self):
+ redirect_url_with_frag = "http://bitly.com/urllibredirecttest"
+ with support.transient_internet(redirect_url_with_frag):
+ req = urllib.request.Request(redirect_url_with_frag)
+ res = urllib.request.urlopen(req)
+ self.assertEqual(res.geturl(),
+ "http://docs.python.org/3.4/glossary.html#term-global-interpreter-lock")
+
def test_custom_headers(self):
url = "http://www.example.com"
with support.transient_internet(url):
@@ -216,7 +224,7 @@ class OtherNetworkTests(unittest.TestCase):
debug(url)
try:
f = urlopen(url, req, TIMEOUT)
- except EnvironmentError as err:
+ except OSError as err:
debug(err)
if expected_err:
msg = ("Didn't get expected error(s) %s for %s %s, got %s: %s" %
@@ -330,35 +338,6 @@ class TimeoutTest(unittest.TestCase):
self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)
-@unittest.skipUnless(ssl, "requires SSL support")
-class HTTPSTests(unittest.TestCase):
-
- def test_sni(self):
- self.skipTest("test disabled - test server needed")
- # Checks that Server Name Indication works, if supported by the
- # OpenSSL linked to.
- # The ssl module itself doesn't have server-side support for SNI,
- # so we rely on a third-party test site.
- expect_sni = ssl.HAS_SNI
- with support.transient_internet("XXX"):
- u = urllib.request.urlopen("XXX")
- contents = u.readall()
- if expect_sni:
- self.assertIn(b"Great", contents)
- self.assertNotIn(b"Unfortunately", contents)
- else:
- self.assertNotIn(b"Great", contents)
- self.assertIn(b"Unfortunately", contents)
-
-
-def test_main():
- support.requires("network")
- support.run_unittest(AuthTests,
- HTTPSTests,
- OtherNetworkTests,
- CloseSocketTest,
- TimeoutTest,
- )
-
if __name__ == "__main__":
- test_main()
+ support.requires("network")
+ unittest.main()
diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py
index 20efca6..b6888f3 100644
--- a/Lib/test/test_urllibnet.py
+++ b/Lib/test/test_urllibnet.py
@@ -124,16 +124,15 @@ class urlopenNetworkTests(unittest.TestCase):
else:
# This happens with some overzealous DNS providers such as OpenDNS
self.skipTest("%r should not resolve for test to work" % bogus_domain)
- self.assertRaises(IOError,
- # SF patch 809915: In Sep 2003, VeriSign started
- # highjacking invalid .com and .net addresses to
- # boost traffic to their own site. This test
- # started failing then. One hopes the .invalid
- # domain will be spared to serve its defined
- # purpose.
- # urllib.urlopen, "http://www.sadflkjsasadf.com/")
- urllib.request.urlopen,
- "http://sadflkjsasf.i.nvali.d/")
+ failure_explanation = ('opening an invalid URL did not raise OSError; '
+ 'can be caused by a broken DNS server '
+ '(e.g. returns 404 or hijacks page)')
+ with self.assertRaises(OSError, msg=failure_explanation):
+ # SF patch 809915: In Sep 2003, VeriSign started highjacking
+ # invalid .com and .net addresses to boost traffic to their own
+ # site. This test started failing then. One hopes the .invalid
+ # domain will be spared to serve its defined purpose.
+ urllib.request.urlopen("http://sadflkjsasf.i.nvali.d/")
class urlretrieveNetworkTests(unittest.TestCase):
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
index 378a427..c938f09 100755
--- a/Lib/test/test_urlparse.py
+++ b/Lib/test/test_urlparse.py
@@ -847,6 +847,14 @@ class UrlParseTestCase(unittest.TestCase):
self.assertEqual(p1.path, '863-1234')
self.assertEqual(p1.params, 'phone-context=+1-914-555')
+ def test_unwrap(self):
+ url = urllib.parse.unwrap('<URL:type://host/path>')
+ self.assertEqual(url, 'type://host/path')
+
+ def test_Quoter_repr(self):
+ quoter = urllib.parse.Quoter(urllib.parse._ALWAYS_SAFE)
+ self.assertIn('Quoter', repr(quoter))
+
def test_main():
support.run_unittest(UrlParseTestCase)
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 0fae88b..dbbe157 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -109,13 +109,68 @@ class BasicTest(BaseTest):
out, err = p.communicate()
self.assertEqual(out.strip(), expected.encode())
+ if sys.platform == 'win32':
+ ENV_SUBDIRS = (
+ ('Scripts',),
+ ('Include',),
+ ('Lib',),
+ ('Lib', 'site-packages'),
+ )
+ else:
+ ENV_SUBDIRS = (
+ ('bin',),
+ ('include',),
+ ('lib',),
+ ('lib', 'python%d.%d' % sys.version_info[:2]),
+ ('lib', 'python%d.%d' % sys.version_info[:2], 'site-packages'),
+ )
+
+ def create_contents(self, paths, filename):
+ """
+ Create some files in the environment which are unrelated
+ to the virtual environment.
+ """
+ for subdirs in paths:
+ d = os.path.join(self.env_dir, *subdirs)
+ os.mkdir(d)
+ fn = os.path.join(d, filename)
+ with open(fn, 'wb') as f:
+ f.write(b'Still here?')
+
def test_overwrite_existing(self):
"""
- Test control of overwriting an existing environment directory.
+ Test creating environment in an existing directory.
"""
- self.assertRaises(ValueError, venv.create, self.env_dir)
+ self.create_contents(self.ENV_SUBDIRS, 'foo')
+ venv.create(self.env_dir)
+ for subdirs in self.ENV_SUBDIRS:
+ fn = os.path.join(self.env_dir, *(subdirs + ('foo',)))
+ self.assertTrue(os.path.exists(fn))
+ with open(fn, 'rb') as f:
+ self.assertEqual(f.read(), b'Still here?')
+
builder = venv.EnvBuilder(clear=True)
builder.create(self.env_dir)
+ for subdirs in self.ENV_SUBDIRS:
+ fn = os.path.join(self.env_dir, *(subdirs + ('foo',)))
+ self.assertFalse(os.path.exists(fn))
+
+ def clear_directory(self, path):
+ for fn in os.listdir(path):
+ fn = os.path.join(path, fn)
+ if os.path.islink(fn) or os.path.isfile(fn):
+ os.remove(fn)
+ elif os.path.isdir(fn):
+ shutil.rmtree(fn)
+
+ def test_unoverwritable_fails(self):
+ #create a file clashing with directories in the env dir
+ for paths in self.ENV_SUBDIRS[:3]:
+ fn = os.path.join(self.env_dir, *paths)
+ with open(fn, 'wb') as f:
+ f.write(b'')
+ self.assertRaises((ValueError, OSError), venv.create, self.env_dir)
+ self.clear_directory(self.env_dir)
def test_upgrade(self):
"""
diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py
index bd06c8d..f6a065d 100644
--- a/Lib/test/test_wait3.py
+++ b/Lib/test/test_wait3.py
@@ -7,15 +7,11 @@ import unittest
from test.fork_wait import ForkWait
from test.support import run_unittest, reap_children
-try:
- os.fork
-except AttributeError:
- raise unittest.SkipTest("os.fork not defined -- skipping test_wait3")
+if not hasattr(os, 'fork'):
+ raise unittest.SkipTest("os.fork not defined")
-try:
- os.wait3
-except AttributeError:
- raise unittest.SkipTest("os.wait3 not defined -- skipping test_wait3")
+if not hasattr(os, 'wait3'):
+ raise unittest.SkipTest("os.wait3 not defined")
class Wait3Test(ForkWait):
def wait_impl(self, cpid):
diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py
index e0aace4..b70f917 100644
--- a/Lib/test/test_wave.py
+++ b/Lib/test/test_wave.py
@@ -1,7 +1,5 @@
-from test.support import TESTFN, run_unittest
-import os
+from test.support import TESTFN, unlink
import wave
-import struct
import unittest
nchannels = 2
@@ -17,10 +15,7 @@ class TestWave(unittest.TestCase):
def tearDown(self):
if self.f is not None:
self.f.close()
- try:
- os.remove(TESTFN)
- except OSError:
- pass
+ unlink(TESTFN)
def test_it(self, test_rounding=False):
self.f = wave.open(TESTFN, 'wb')
@@ -58,9 +53,65 @@ class TestWave(unittest.TestCase):
output = b'\0' * nframes * nchannels * sampwidth
self.f.writeframes(output)
+ def test_getparams(self):
+ self.f = wave.open(TESTFN, 'wb')
+ self.f.setnchannels(nchannels)
+ self.f.setsampwidth(sampwidth)
+ self.f.setframerate(framerate)
+ self.f.close()
+
+ self.f = wave.open(TESTFN, 'rb')
+ params = self.f.getparams()
+ self.assertEqual(params.nchannels, self.f.getnchannels())
+ self.assertEqual(params.nframes, self.f.getnframes())
+ self.assertEqual(params.sampwidth, self.f.getsampwidth())
+ self.assertEqual(params.framerate, self.f.getframerate())
+ self.assertEqual(params.comptype, self.f.getcomptype())
+ self.assertEqual(params.compname, self.f.getcompname())
+
+ def test_wave_write_context_manager_calls_close(self):
+ # Close checks for a minimum header and will raise an error
+ # if it is not set, so this proves that close is called.
+ with self.assertRaises(wave.Error):
+ with wave.open(TESTFN, 'wb') as f:
+ pass
+ with self.assertRaises(wave.Error):
+ with open(TESTFN, 'wb') as testfile:
+ with wave.open(testfile):
+ pass
+
+ def test_context_manager_with_open_file(self):
+ with open(TESTFN, 'wb') as testfile:
+ with wave.open(testfile) as f:
+ f.setnchannels(nchannels)
+ f.setsampwidth(sampwidth)
+ f.setframerate(framerate)
+ self.assertFalse(testfile.closed)
+ with open(TESTFN, 'rb') as testfile:
+ with wave.open(testfile) as f:
+ self.assertFalse(f.getfp().closed)
+ params = f.getparams()
+ self.assertEqual(params.nchannels, nchannels)
+ self.assertEqual(params.sampwidth, sampwidth)
+ self.assertEqual(params.framerate, framerate)
+ self.assertIsNone(f.getfp())
+ self.assertFalse(testfile.closed)
+
+ def test_context_manager_with_filename(self):
+ # If the file doesn't get closed, this test won't fail, but it will
+ # produce a resource leak warning.
+ with wave.open(TESTFN, 'wb') as f:
+ f.setnchannels(nchannels)
+ f.setsampwidth(sampwidth)
+ f.setframerate(framerate)
+ with wave.open(TESTFN) as f:
+ self.assertFalse(f.getfp().closed)
+ params = f.getparams()
+ self.assertEqual(params.nchannels, nchannels)
+ self.assertEqual(params.sampwidth, sampwidth)
+ self.assertEqual(params.framerate, framerate)
+ self.assertIsNone(f.getfp())
-def test_main():
- run_unittest(TestWave)
if __name__ == '__main__':
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py
index 571e33f..551d95c 100644
--- a/Lib/test/test_weakref.py
+++ b/Lib/test/test_weakref.py
@@ -7,11 +7,15 @@ import operator
import contextlib
import copy
-from test import support
+from test import support, script_helper
# Used in ReferencesTestCase.test_ref_created_during_del() .
ref_from_del = None
+# Used by FinalizeTestCase as a global that may be replaced by None
+# when the interpreter shuts down.
+_global_var = 'foobar'
+
class C:
def method(self):
pass
@@ -47,6 +51,11 @@ class Object:
return NotImplemented
def __hash__(self):
return hash(self.arg)
+ def some_method(self):
+ return 4
+ def other_method(self):
+ return 5
+
class RefCycle:
def __init__(self):
@@ -797,6 +806,30 @@ class ReferencesTestCase(TestBase):
del root
gc.collect()
+ def test_callback_attribute(self):
+ x = Object(1)
+ callback = lambda ref: None
+ ref1 = weakref.ref(x, callback)
+ self.assertIs(ref1.__callback__, callback)
+
+ ref2 = weakref.ref(x)
+ self.assertIsNone(ref2.__callback__)
+
+ def test_callback_attribute_after_deletion(self):
+ x = Object(1)
+ ref = weakref.ref(x, self.callback)
+ self.assertIsNotNone(ref.__callback__)
+ del x
+ support.gc_collect()
+ self.assertIsNone(ref.__callback__)
+
+ def test_set_callback_attribute(self):
+ x = Object(1)
+ callback = lambda ref: None
+ ref1 = weakref.ref(x, callback)
+ with self.assertRaises(AttributeError):
+ ref1.__callback__ = lambda ref: None
+
class SubclassableWeakrefTestCase(TestBase):
@@ -901,6 +934,140 @@ class SubclassableWeakrefTestCase(TestBase):
self.assertEqual(self.cbcalled, 0)
+class WeakMethodTestCase(unittest.TestCase):
+
+ def _subclass(self):
+ """Return a Object subclass overriding `some_method`."""
+ class C(Object):
+ def some_method(self):
+ return 6
+ return C
+
+ def test_alive(self):
+ o = Object(1)
+ r = weakref.WeakMethod(o.some_method)
+ self.assertIsInstance(r, weakref.ReferenceType)
+ self.assertIsInstance(r(), type(o.some_method))
+ self.assertIs(r().__self__, o)
+ self.assertIs(r().__func__, o.some_method.__func__)
+ self.assertEqual(r()(), 4)
+
+ def test_object_dead(self):
+ o = Object(1)
+ r = weakref.WeakMethod(o.some_method)
+ del o
+ gc.collect()
+ self.assertIs(r(), None)
+
+ def test_method_dead(self):
+ C = self._subclass()
+ o = C(1)
+ r = weakref.WeakMethod(o.some_method)
+ del C.some_method
+ gc.collect()
+ self.assertIs(r(), None)
+
+ def test_callback_when_object_dead(self):
+ # Test callback behaviour when object dies first.
+ C = self._subclass()
+ calls = []
+ def cb(arg):
+ calls.append(arg)
+ o = C(1)
+ r = weakref.WeakMethod(o.some_method, cb)
+ del o
+ gc.collect()
+ self.assertEqual(calls, [r])
+ # Callback is only called once.
+ C.some_method = Object.some_method
+ gc.collect()
+ self.assertEqual(calls, [r])
+
+ def test_callback_when_method_dead(self):
+ # Test callback behaviour when method dies first.
+ C = self._subclass()
+ calls = []
+ def cb(arg):
+ calls.append(arg)
+ o = C(1)
+ r = weakref.WeakMethod(o.some_method, cb)
+ del C.some_method
+ gc.collect()
+ self.assertEqual(calls, [r])
+ # Callback is only called once.
+ del o
+ gc.collect()
+ self.assertEqual(calls, [r])
+
+ @support.cpython_only
+ def test_no_cycles(self):
+ # A WeakMethod doesn't create any reference cycle to itself.
+ o = Object(1)
+ def cb(_):
+ pass
+ r = weakref.WeakMethod(o.some_method, cb)
+ wr = weakref.ref(r)
+ del r
+ self.assertIs(wr(), None)
+
+ def test_equality(self):
+ def _eq(a, b):
+ self.assertTrue(a == b)
+ self.assertFalse(a != b)
+ def _ne(a, b):
+ self.assertTrue(a != b)
+ self.assertFalse(a == b)
+ x = Object(1)
+ y = Object(1)
+ a = weakref.WeakMethod(x.some_method)
+ b = weakref.WeakMethod(y.some_method)
+ c = weakref.WeakMethod(x.other_method)
+ d = weakref.WeakMethod(y.other_method)
+ # Objects equal, same method
+ _eq(a, b)
+ _eq(c, d)
+ # Objects equal, different method
+ _ne(a, c)
+ _ne(a, d)
+ _ne(b, c)
+ _ne(b, d)
+ # Objects unequal, same or different method
+ z = Object(2)
+ e = weakref.WeakMethod(z.some_method)
+ f = weakref.WeakMethod(z.other_method)
+ _ne(a, e)
+ _ne(a, f)
+ _ne(b, e)
+ _ne(b, f)
+ del x, y, z
+ gc.collect()
+ # Dead WeakMethods compare by identity
+ refs = a, b, c, d, e, f
+ for q in refs:
+ for r in refs:
+ self.assertEqual(q == r, q is r)
+ self.assertEqual(q != r, q is not r)
+
+ def test_hashing(self):
+ # Alive WeakMethods are hashable if the underlying object is
+ # hashable.
+ x = Object(1)
+ y = Object(1)
+ a = weakref.WeakMethod(x.some_method)
+ b = weakref.WeakMethod(y.some_method)
+ c = weakref.WeakMethod(y.other_method)
+ # Since WeakMethod objects are equal, the hashes should be equal.
+ self.assertEqual(hash(a), hash(b))
+ ha = hash(a)
+ # Dead WeakMethods retain their old hash value
+ del x, y
+ gc.collect()
+ self.assertEqual(hash(a), ha)
+ self.assertEqual(hash(b), ha)
+ # If it wasn't hashed when alive, a dead WeakMethod cannot be hashed.
+ self.assertRaises(TypeError, hash, c)
+
+
class MappingTestCase(TestBase):
COUNT = 10
@@ -1388,6 +1555,151 @@ class WeakKeyDictionaryTestCase(mapping_tests.BasicTestMappingProtocol):
def _reference(self):
return self.__ref.copy()
+
+class FinalizeTestCase(unittest.TestCase):
+
+ class A:
+ pass
+
+ def _collect_if_necessary(self):
+ # we create no ref-cycles so in CPython no gc should be needed
+ if sys.implementation.name != 'cpython':
+ support.gc_collect()
+
+ def test_finalize(self):
+ def add(x,y,z):
+ res.append(x + y + z)
+ return x + y + z
+
+ a = self.A()
+
+ res = []
+ f = weakref.finalize(a, add, 67, 43, z=89)
+ self.assertEqual(f.alive, True)
+ self.assertEqual(f.peek(), (a, add, (67,43), {'z':89}))
+ self.assertEqual(f(), 199)
+ self.assertEqual(f(), None)
+ self.assertEqual(f(), None)
+ self.assertEqual(f.peek(), None)
+ self.assertEqual(f.detach(), None)
+ self.assertEqual(f.alive, False)
+ self.assertEqual(res, [199])
+
+ res = []
+ f = weakref.finalize(a, add, 67, 43, 89)
+ self.assertEqual(f.peek(), (a, add, (67,43,89), {}))
+ self.assertEqual(f.detach(), (a, add, (67,43,89), {}))
+ self.assertEqual(f(), None)
+ self.assertEqual(f(), None)
+ self.assertEqual(f.peek(), None)
+ self.assertEqual(f.detach(), None)
+ self.assertEqual(f.alive, False)
+ self.assertEqual(res, [])
+
+ res = []
+ f = weakref.finalize(a, add, x=67, y=43, z=89)
+ del a
+ self._collect_if_necessary()
+ self.assertEqual(f(), None)
+ self.assertEqual(f(), None)
+ self.assertEqual(f.peek(), None)
+ self.assertEqual(f.detach(), None)
+ self.assertEqual(f.alive, False)
+ self.assertEqual(res, [199])
+
+ def test_order(self):
+ a = self.A()
+ res = []
+
+ f1 = weakref.finalize(a, res.append, 'f1')
+ f2 = weakref.finalize(a, res.append, 'f2')
+ f3 = weakref.finalize(a, res.append, 'f3')
+ f4 = weakref.finalize(a, res.append, 'f4')
+ f5 = weakref.finalize(a, res.append, 'f5')
+
+ # make sure finalizers can keep themselves alive
+ del f1, f4
+
+ self.assertTrue(f2.alive)
+ self.assertTrue(f3.alive)
+ self.assertTrue(f5.alive)
+
+ self.assertTrue(f5.detach())
+ self.assertFalse(f5.alive)
+
+ f5() # nothing because previously unregistered
+ res.append('A')
+ f3() # => res.append('f3')
+ self.assertFalse(f3.alive)
+ res.append('B')
+ f3() # nothing because previously called
+ res.append('C')
+ del a
+ self._collect_if_necessary()
+ # => res.append('f4')
+ # => res.append('f2')
+ # => res.append('f1')
+ self.assertFalse(f2.alive)
+ res.append('D')
+ f2() # nothing because previously called by gc
+
+ expected = ['A', 'f3', 'B', 'C', 'f4', 'f2', 'f1', 'D']
+ self.assertEqual(res, expected)
+
+ def test_all_freed(self):
+ # we want a weakrefable subclass of weakref.finalize
+ class MyFinalizer(weakref.finalize):
+ pass
+
+ a = self.A()
+ res = []
+ def callback():
+ res.append(123)
+ f = MyFinalizer(a, callback)
+
+ wr_callback = weakref.ref(callback)
+ wr_f = weakref.ref(f)
+ del callback, f
+
+ self.assertIsNotNone(wr_callback())
+ self.assertIsNotNone(wr_f())
+
+ del a
+ self._collect_if_necessary()
+
+ self.assertIsNone(wr_callback())
+ self.assertIsNone(wr_f())
+ self.assertEqual(res, [123])
+
+ @classmethod
+ def run_in_child(cls):
+ def error():
+ # Create an atexit finalizer from inside a finalizer called
+ # at exit. This should be the next to be run.
+ g1 = weakref.finalize(cls, print, 'g1')
+ print('f3 error')
+ 1/0
+
+ # cls should stay alive till atexit callbacks run
+ f1 = weakref.finalize(cls, print, 'f1', _global_var)
+ f2 = weakref.finalize(cls, print, 'f2', _global_var)
+ f3 = weakref.finalize(cls, error)
+ f4 = weakref.finalize(cls, print, 'f4', _global_var)
+
+ assert f1.atexit == True
+ f2.atexit = False
+ assert f3.atexit == True
+ assert f4.atexit == True
+
+ def test_atexit(self):
+ prog = ('from test.test_weakref import FinalizeTestCase;'+
+ 'FinalizeTestCase.run_in_child()')
+ rc, out, err = script_helper.assert_python_ok('-c', prog)
+ out = out.decode('ascii').splitlines()
+ self.assertEqual(out, ['f4 foobar', 'f3 error', 'g1', 'f1 foobar'])
+ self.assertTrue(b'ZeroDivisionError' in err)
+
+
libreftest = """ Doctest for examples in the library reference: weakref.rst
>>> import weakref
@@ -1476,10 +1788,12 @@ __test__ = {'libreftest' : libreftest}
def test_main():
support.run_unittest(
ReferencesTestCase,
+ WeakMethodTestCase,
MappingTestCase,
WeakValueDictionaryTestCase,
WeakKeyDictionaryTestCase,
SubclassableWeakrefTestCase,
+ FinalizeTestCase,
)
support.run_doctest(sys.modules[__name__])
diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py
index cb4cde9..ef4ce55 100644
--- a/Lib/test/test_winreg.py
+++ b/Lib/test/test_winreg.py
@@ -8,7 +8,7 @@ threading = support.import_module("threading")
from platform import machine
# Do this first so test will be skipped if module doesn't exist
-support.import_module('winreg')
+support.import_module('winreg', required_on=['win'])
# Now import everything
from winreg import *
@@ -57,13 +57,13 @@ class BaseWinregTests(unittest.TestCase):
def delete_tree(self, root, subkey):
try:
hkey = OpenKey(root, subkey, KEY_ALL_ACCESS)
- except WindowsError:
+ except OSError:
# subkey does not exist
return
while True:
try:
subsubkey = EnumKey(hkey, 0)
- except WindowsError:
+ except OSError:
# no more subkeys
break
self.delete_tree(hkey, subsubkey)
@@ -100,7 +100,7 @@ class BaseWinregTests(unittest.TestCase):
QueryInfoKey(int_sub_key)
self.fail("It appears the CloseKey() function does "
"not close the actual key!")
- except EnvironmentError:
+ except OSError:
pass
# ... and close that key that way :-)
int_key = int(key)
@@ -109,7 +109,7 @@ class BaseWinregTests(unittest.TestCase):
QueryInfoKey(int_key)
self.fail("It appears the key.Close() function "
"does not close the actual key!")
- except EnvironmentError:
+ except OSError:
pass
def _read_test_data(self, root_key, subkeystr="sub_key", OpenKey=OpenKey):
@@ -126,7 +126,7 @@ class BaseWinregTests(unittest.TestCase):
while 1:
try:
data = EnumValue(sub_key, index)
- except EnvironmentError:
+ except OSError:
break
self.assertEqual(data in test_data, True,
"Didn't read back the correct test data")
@@ -147,7 +147,7 @@ class BaseWinregTests(unittest.TestCase):
try:
EnumKey(key, 1)
self.fail("Was able to get a second key when I only have one!")
- except EnvironmentError:
+ except OSError:
pass
key.Close()
@@ -171,7 +171,7 @@ class BaseWinregTests(unittest.TestCase):
# Shouldnt be able to delete it twice!
DeleteKey(key, subkeystr)
self.fail("Deleting the key twice succeeded")
- except EnvironmentError:
+ except OSError:
pass
key.Close()
DeleteKey(root_key, test_key_name)
@@ -179,7 +179,7 @@ class BaseWinregTests(unittest.TestCase):
try:
key = OpenKey(root_key, test_key_name)
self.fail("Could open the non-existent key")
- except WindowsError: # Use this error name this time
+ except OSError: # Use this error name this time
pass
def _test_all(self, root_key, subkeystr="sub_key"):
@@ -230,7 +230,7 @@ class LocalWinregTests(BaseWinregTests):
def test_inexistant_remote_registry(self):
connect = lambda: ConnectRegistry("abcdefghijkl", HKEY_CURRENT_USER)
- self.assertRaises(WindowsError, connect)
+ self.assertRaises(OSError, connect)
def testExpandEnvironmentStrings(self):
r = ExpandEnvironmentStrings("%windir%\\test")
@@ -242,8 +242,8 @@ class LocalWinregTests(BaseWinregTests):
try:
with ConnectRegistry(None, HKEY_LOCAL_MACHINE) as h:
self.assertNotEqual(h.handle, 0)
- raise WindowsError
- except WindowsError:
+ raise OSError
+ except OSError:
self.assertEqual(h.handle, 0)
def test_changing_value(self):
@@ -407,7 +407,7 @@ class Win64WinregTests(BaseWinregTests):
open_fail = lambda: OpenKey(HKEY_CURRENT_USER,
test_reflect_key_name, 0,
KEY_READ | KEY_WOW64_64KEY)
- self.assertRaises(WindowsError, open_fail)
+ self.assertRaises(OSError, open_fail)
# Now explicitly open the 64-bit version of the key
with OpenKey(HKEY_CURRENT_USER, test_reflect_key_name, 0,
@@ -447,7 +447,7 @@ class Win64WinregTests(BaseWinregTests):
open_fail = lambda: OpenKeyEx(HKEY_CURRENT_USER,
test_reflect_key_name, 0,
KEY_READ | KEY_WOW64_64KEY)
- self.assertRaises(WindowsError, open_fail)
+ self.assertRaises(OSError, open_fail)
# Make sure the 32-bit key is actually there
with OpenKeyEx(HKEY_CURRENT_USER, test_reflect_key_name, 0,
diff --git a/Lib/test/test_winsound.py b/Lib/test/test_winsound.py
index eb7f75f..61d864a 100644
--- a/Lib/test/test_winsound.py
+++ b/Lib/test/test_winsound.py
@@ -22,7 +22,7 @@ def has_sound(sound):
key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER,
"AppEvents\Schemes\Apps\.Default\{0}\.Default".format(sound))
return winreg.EnumValue(key, 0)[1] != ""
- except WindowsError:
+ except OSError:
return False
class BeepTest(unittest.TestCase):
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 402bc2d..dec25b5 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -10,6 +10,7 @@ import io
import operator
import pickle
import sys
+import types
import unittest
import weakref
@@ -240,7 +241,6 @@ class ElementTreeTest(unittest.TestCase):
self.assertEqual(ET.XML, ET.fromstring)
self.assertEqual(ET.PI, ET.ProcessingInstruction)
- self.assertEqual(ET.XMLParser, ET.XMLTreeBuilder)
def test_simpleops(self):
# Basic method sanity checks.
@@ -433,15 +433,6 @@ class ElementTreeTest(unittest.TestCase):
' <empty-element />\n'
'</root>')
- parser = ET.XMLTreeBuilder() # 1.2 compatibility
- parser.feed(data)
- self.serialize_check(parser.close(),
- '<root>\n'
- ' <element key="value">text</element>\n'
- ' <element>text</element>tail\n'
- ' <empty-element />\n'
- '</root>')
-
target = ET.TreeBuilder()
parser = ET.XMLParser(target=target)
parser.feed(data)
@@ -959,6 +950,169 @@ class ElementTreeTest(unittest.TestCase):
self.assertEqual(serialized, expected)
+class IncrementalParserTest(unittest.TestCase):
+
+ def _feed(self, parser, data, chunk_size=None):
+ if chunk_size is None:
+ parser.data_received(data)
+ else:
+ for i in range(0, len(data), chunk_size):
+ parser.data_received(data[i:i+chunk_size])
+
+ def assert_event_tags(self, parser, expected):
+ events = parser.events()
+ self.assertEqual([(action, elem.tag) for action, elem in events],
+ expected)
+
+ def test_simple_xml(self):
+ for chunk_size in (None, 1, 5):
+ with self.subTest(chunk_size=chunk_size):
+ parser = ET.IncrementalParser()
+ self.assert_event_tags(parser, [])
+ self._feed(parser, "<!-- comment -->\n", chunk_size)
+ self.assert_event_tags(parser, [])
+ self._feed(parser,
+ "<root>\n <element key='value'>text</element",
+ chunk_size)
+ self.assert_event_tags(parser, [])
+ self._feed(parser, ">\n", chunk_size)
+ self.assert_event_tags(parser, [('end', 'element')])
+ self._feed(parser, "<element>text</element>tail\n", chunk_size)
+ self._feed(parser, "<empty-element/>\n", chunk_size)
+ self.assert_event_tags(parser, [
+ ('end', 'element'),
+ ('end', 'empty-element'),
+ ])
+ self._feed(parser, "</root>\n", chunk_size)
+ self.assert_event_tags(parser, [('end', 'root')])
+ # Receiving EOF sets the `root` attribute
+ self.assertIs(parser.root, None)
+ parser.eof_received()
+ self.assertEqual(parser.root.tag, 'root')
+
+ def test_data_received_while_iterating(self):
+ parser = ET.IncrementalParser()
+ it = parser.events()
+ self._feed(parser, "<root>\n <element key='value'>text</element>\n")
+ action, elem = next(it)
+ self.assertEqual((action, elem.tag), ('end', 'element'))
+ self._feed(parser, "</root>\n")
+ action, elem = next(it)
+ self.assertEqual((action, elem.tag), ('end', 'root'))
+ with self.assertRaises(StopIteration):
+ next(it)
+
+ def test_simple_xml_with_ns(self):
+ parser = ET.IncrementalParser()
+ self.assert_event_tags(parser, [])
+ self._feed(parser, "<!-- comment -->\n")
+ self.assert_event_tags(parser, [])
+ self._feed(parser, "<root xmlns='namespace'>\n")
+ self.assert_event_tags(parser, [])
+ self._feed(parser, "<element key='value'>text</element")
+ self.assert_event_tags(parser, [])
+ self._feed(parser, ">\n")
+ self.assert_event_tags(parser, [('end', '{namespace}element')])
+ self._feed(parser, "<element>text</element>tail\n")
+ self._feed(parser, "<empty-element/>\n")
+ self.assert_event_tags(parser, [
+ ('end', '{namespace}element'),
+ ('end', '{namespace}empty-element'),
+ ])
+ self._feed(parser, "</root>\n")
+ self.assert_event_tags(parser, [('end', '{namespace}root')])
+ # Receiving EOF sets the `root` attribute
+ self.assertIs(parser.root, None)
+ parser.eof_received()
+ self.assertEqual(parser.root.tag, '{namespace}root')
+
+ def test_ns_events(self):
+ parser = ET.IncrementalParser(events=('start-ns', 'end-ns'))
+ self._feed(parser, "<!-- comment -->\n")
+ self._feed(parser, "<root xmlns='namespace'>\n")
+ self.assertEqual(
+ list(parser.events()),
+ [('start-ns', ('', 'namespace'))])
+ self._feed(parser, "<element key='value'>text</element")
+ self._feed(parser, ">\n")
+ self._feed(parser, "<element>text</element>tail\n")
+ self._feed(parser, "<empty-element/>\n")
+ self._feed(parser, "</root>\n")
+ self.assertEqual(list(parser.events()), [('end-ns', None)])
+ parser.eof_received()
+
+ def test_events(self):
+ parser = ET.IncrementalParser(events=())
+ self._feed(parser, "<root/>\n")
+ self.assert_event_tags(parser, [])
+
+ parser = ET.IncrementalParser(events=('start', 'end'))
+ self._feed(parser, "<!-- comment -->\n")
+ self.assert_event_tags(parser, [])
+ self._feed(parser, "<root>\n")
+ self.assert_event_tags(parser, [('start', 'root')])
+ self._feed(parser, "<element key='value'>text</element")
+ self.assert_event_tags(parser, [('start', 'element')])
+ self._feed(parser, ">\n")
+ self.assert_event_tags(parser, [('end', 'element')])
+ self._feed(parser,
+ "<element xmlns='foo'>text<empty-element/></element>tail\n")
+ self.assert_event_tags(parser, [
+ ('start', '{foo}element'),
+ ('start', '{foo}empty-element'),
+ ('end', '{foo}empty-element'),
+ ('end', '{foo}element'),
+ ])
+ self._feed(parser, "</root>")
+ parser.eof_received()
+ self.assertIs(parser.root, None)
+ self.assert_event_tags(parser, [('end', 'root')])
+ self.assertEqual(parser.root.tag, 'root')
+
+ parser = ET.IncrementalParser(events=('start',))
+ self._feed(parser, "<!-- comment -->\n")
+ self.assert_event_tags(parser, [])
+ self._feed(parser, "<root>\n")
+ self.assert_event_tags(parser, [('start', 'root')])
+ self._feed(parser, "<element key='value'>text</element")
+ self.assert_event_tags(parser, [('start', 'element')])
+ self._feed(parser, ">\n")
+ self.assert_event_tags(parser, [])
+ self._feed(parser,
+ "<element xmlns='foo'>text<empty-element/></element>tail\n")
+ self.assert_event_tags(parser, [
+ ('start', '{foo}element'),
+ ('start', '{foo}empty-element'),
+ ])
+ self._feed(parser, "</root>")
+ parser.eof_received()
+ self.assertEqual(parser.root.tag, 'root')
+
+ def test_events_sequence(self):
+ # Test that events can be some sequence that's not just a tuple or list
+ eventset = {'end', 'start'}
+ parser = ET.IncrementalParser(events=eventset)
+ self._feed(parser, "<foo>bar</foo>")
+ self.assert_event_tags(parser, [('start', 'foo'), ('end', 'foo')])
+
+ class DummyIter:
+ def __init__(self):
+ self.events = iter(['start', 'end', 'start-ns'])
+ def __iter__(self):
+ return self
+ def __next__(self):
+ return next(self.events)
+
+ parser = ET.IncrementalParser(events=DummyIter())
+ self._feed(parser, "<foo>bar</foo>")
+ self.assert_event_tags(parser, [('start', 'foo'), ('end', 'foo')])
+
+
+ def test_unknown_event(self):
+ with self.assertRaises(ValueError):
+ ET.IncrementalParser(events=('start', 'end', 'bogus'))
+
+
#
# xinclude tests (samples from appendix C of the xinclude specification)
@@ -1300,7 +1454,7 @@ class BugsTest(unittest.TestCase):
# Don't crash when using custom entities.
ENTITIES = {'rsquo': '\u2019', 'lsquo': '\u2018'}
- parser = ET.XMLTreeBuilder()
+ parser = ET.XMLParser()
parser.entity.update(ENTITIES)
parser.feed("""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE patent-application-publication SYSTEM "pap-v15-2001-01-31.dtd" []>
@@ -1462,6 +1616,7 @@ class BugsTest(unittest.TestCase):
ET.register_namespace('test10777', 'http://myuri/')
ET.register_namespace('test10777', 'http://myuri/')
+
# --------------------------------------------------------------------
@@ -1625,6 +1780,11 @@ class ElementFindTest(unittest.TestCase):
self.assertEqual(e.find('./tag[last()-1]').attrib['class'], 'c')
self.assertEqual(e.find('./tag[last()-2]').attrib['class'], 'b')
+ self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[0]')
+ self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[-1]')
+ self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()-0]')
+ self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()+1]')
+
def test_findall(self):
e = ET.XML(SAMPLE_XML)
e[2] = ET.XML(SAMPLE_SECTION)
@@ -1884,7 +2044,7 @@ class TreeBuilderTest(unittest.TestCase):
# Mimick SimpleTAL's behaviour (issue #16089): both versions of
# TreeBuilder should be able to cope with a subclass of the
# pure Python Element class.
- base = ET._Element
+ base = ET._Element_Py
# Not from a C extension
self.assertEqual(base.__module__, 'xml.etree.ElementTree')
# Force some multiple inheritance with a C class to make things
@@ -2243,6 +2403,18 @@ class IOTest(unittest.TestCase):
ET.tostring(root, 'utf-16'),
b''.join(ET.tostringlist(root, 'utf-16')))
+ def test_short_empty_elements(self):
+ root = ET.fromstring('<tag>a<x />b<y></y>c</tag>')
+ self.assertEqual(
+ ET.tostring(root, 'unicode'),
+ '<tag>a<x />b<y />c</tag>')
+ self.assertEqual(
+ ET.tostring(root, 'unicode', short_empty_elements=True),
+ '<tag>a<x />b<y />c</tag>')
+ self.assertEqual(
+ ET.tostring(root, 'unicode', short_empty_elements=False),
+ '<tag>a<x></x>b<y></y>c</tag>')
+
class ParseErrorTest(unittest.TestCase):
def test_subclass(self):
@@ -2308,8 +2480,11 @@ class NoAcceleratorTest(unittest.TestCase):
# Test that the C accelerator was not imported for pyET
def test_correct_import_pyET(self):
- self.assertEqual(pyET.Element.__module__, 'xml.etree.ElementTree')
- self.assertEqual(pyET.SubElement.__module__, 'xml.etree.ElementTree')
+ # The type of methods defined in Python code is types.FunctionType,
+ # while the type of methods defined inside _elementtree is
+ # <class 'wrapper_descriptor'>
+ self.assertIsInstance(pyET.Element.__init__, types.FunctionType)
+ self.assertIsInstance(pyET.XMLParser.__init__, types.FunctionType)
# --------------------------------------------------------------------
@@ -2371,6 +2546,7 @@ def test_main(module=None):
ElementSlicingTest,
BasicElementTest,
ElementTreeTest,
+ IncrementalParserTest,
IOTest,
ParseErrorTest,
XIncludeTest,
diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py
index bcaa724..b3ff7ae 100644
--- a/Lib/test/test_xml_etree_c.py
+++ b/Lib/test/test_xml_etree_c.py
@@ -2,6 +2,7 @@
import sys, struct
from test import support
from test.support import import_fresh_module
+import types
import unittest
cET = import_fresh_module('xml.etree.ElementTree',
@@ -33,14 +34,22 @@ class TestAliasWorking(unittest.TestCase):
@unittest.skipUnless(cET, 'requires _elementtree')
+@support.cpython_only
class TestAcceleratorImported(unittest.TestCase):
# Test that the C accelerator was imported, as expected
def test_correct_import_cET(self):
+ # SubElement is a function so it retains _elementtree as its module.
self.assertEqual(cET.SubElement.__module__, '_elementtree')
def test_correct_import_cET_alias(self):
self.assertEqual(cET_alias.SubElement.__module__, '_elementtree')
+ def test_parser_comes_from_C(self):
+ # The type of methods defined in Python code is types.FunctionType,
+ # while the type of methods defined inside _elementtree is
+ # <class 'wrapper_descriptor'>
+ self.assertNotIsInstance(cET.Element.__init__, types.FunctionType)
+
@unittest.skipUnless(cET, 'requires _elementtree')
@support.cpython_only
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index cc52259..7fc52e3 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -15,6 +15,10 @@ import contextlib
from test import support
try:
+ import gzip
+except ImportError:
+ gzip = None
+try:
import threading
except ImportError:
threading = None
@@ -216,7 +220,7 @@ class XMLRPCTestCase(unittest.TestCase):
xmlrpc.client.ServerProxy('https://localhost:9999').bad_function()
except NotImplementedError:
self.assertFalse(has_ssl, "xmlrpc client's error with SSL support")
- except socket.error:
+ except OSError:
self.assertTrue(has_ssl)
class HelperTestCase(unittest.TestCase):
@@ -500,7 +504,7 @@ def is_unavailable_exception(e):
return True
exc_mess = e.headers.get('X-exception')
except AttributeError:
- # Ignore socket.errors here.
+ # Ignore OSErrors here.
exc_mess = str(e)
if exc_mess and 'temporarily unavailable' in exc_mess.lower():
@@ -515,7 +519,7 @@ def make_request_and_skipIf(condition, reason):
def make_request_and_skip(self):
try:
xmlrpclib.ServerProxy(URL).my_function()
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
if not is_unavailable_exception(e):
raise
raise unittest.SkipTest(reason)
@@ -553,7 +557,7 @@ class SimpleServerTestCase(BaseServerTestCase):
try:
p = xmlrpclib.ServerProxy(URL)
self.assertEqual(p.pow(6,8), 6**8)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -566,7 +570,7 @@ class SimpleServerTestCase(BaseServerTestCase):
p = xmlrpclib.ServerProxy(URL)
self.assertEqual(p.add(start_string, end_string),
start_string + end_string)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -592,7 +596,7 @@ class SimpleServerTestCase(BaseServerTestCase):
p = xmlrpclib.ServerProxy(URL)
meth = p.system.listMethods()
self.assertEqual(set(meth), expected_methods)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -605,7 +609,7 @@ class SimpleServerTestCase(BaseServerTestCase):
p = xmlrpclib.ServerProxy(URL)
divhelp = p.system.methodHelp('div')
self.assertEqual(divhelp, 'This is the div function')
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -619,7 +623,7 @@ class SimpleServerTestCase(BaseServerTestCase):
p = xmlrpclib.ServerProxy(URL)
myfunction = p.system.methodHelp('my_function')
self.assertEqual(myfunction, 'This is my function')
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -632,7 +636,7 @@ class SimpleServerTestCase(BaseServerTestCase):
p = xmlrpclib.ServerProxy(URL)
divsig = p.system.methodSignature('div')
self.assertEqual(divsig, 'signatures not supported')
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -649,7 +653,7 @@ class SimpleServerTestCase(BaseServerTestCase):
self.assertEqual(add_result, 2+3)
self.assertEqual(pow_result, 6**8)
self.assertEqual(div_result, 127//42)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -670,7 +674,7 @@ class SimpleServerTestCase(BaseServerTestCase):
self.assertEqual(result.results[0]['faultString'],
'<class \'Exception\'>:method "this_is_not_exists" '
'is not supported')
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -793,6 +797,7 @@ class KeepaliveServerTestCase2(BaseKeepaliveServerTestCase):
#A test case that verifies that gzip encoding works in both directions
#(for a request and the response)
+@unittest.skipIf(gzip is None, 'requires gzip')
class GzipServerTestCase(BaseServerTestCase):
#a request handler that supports keep-alive and logs requests into a
#class variable
@@ -923,7 +928,7 @@ class FailingServerTestCase(unittest.TestCase):
try:
p = xmlrpclib.ServerProxy(URL)
self.assertEqual(p.pow(6,8), 6**8)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e):
# protocol error; provide additional information in test output
@@ -936,7 +941,7 @@ class FailingServerTestCase(unittest.TestCase):
try:
p = xmlrpclib.ServerProxy(URL)
p.pow(6,8)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e) and hasattr(e, "headers"):
# The two server-side error headers shouldn't be sent back in this case
@@ -956,7 +961,7 @@ class FailingServerTestCase(unittest.TestCase):
try:
p = xmlrpclib.ServerProxy(URL)
p.pow(6,8)
- except (xmlrpclib.ProtocolError, socket.error) as e:
+ except (xmlrpclib.ProtocolError, OSError) as e:
# ignore failures due to non-blocking socket 'unavailable' errors
if not is_unavailable_exception(e) and hasattr(e, "headers"):
# We should get error info in the response
@@ -1084,23 +1089,13 @@ class UseBuiltinTypesTestCase(unittest.TestCase):
@support.reap_threads
def test_main():
- xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
- BinaryTestCase, FaultTestCase]
- xmlrpc_tests.append(UseBuiltinTypesTestCase)
- xmlrpc_tests.append(SimpleServerTestCase)
- xmlrpc_tests.append(KeepaliveServerTestCase1)
- xmlrpc_tests.append(KeepaliveServerTestCase2)
- try:
- import gzip
- xmlrpc_tests.append(GzipServerTestCase)
- except ImportError:
- pass #gzip not supported in this build
- xmlrpc_tests.append(MultiPathServerTestCase)
- xmlrpc_tests.append(ServerProxyTestCase)
- xmlrpc_tests.append(FailingServerTestCase)
- xmlrpc_tests.append(CGIHandlerTestCase)
-
- support.run_unittest(*xmlrpc_tests)
+ support.run_unittest(XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
+ BinaryTestCase, FaultTestCase, UseBuiltinTypesTestCase,
+ SimpleServerTestCase, KeepaliveServerTestCase1,
+ KeepaliveServerTestCase2, GzipServerTestCase,
+ MultiPathServerTestCase, ServerProxyTestCase, FailingServerTestCase,
+ CGIHandlerTestCase)
+
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_xmlrpc_net.py b/Lib/test/test_xmlrpc_net.py
index dfb5f9a..457e3fb 100644
--- a/Lib/test/test_xmlrpc_net.py
+++ b/Lib/test/test_xmlrpc_net.py
@@ -18,7 +18,7 @@ class CurrentTimeTest(unittest.TestCase):
server = xmlrpclib.ServerProxy("http://time.xmlrpc.com/RPC2")
try:
t0 = server.currentTime.getCurrentTime()
- except socket.error as e:
+ except OSError as e:
self.skipTest("network error: %s" % e)
return
@@ -42,7 +42,7 @@ class CurrentTimeTest(unittest.TestCase):
server = xmlrpclib.ServerProxy("http://buildbot.python.org/all/xmlrpc/")
try:
builders = server.getAllBuilders()
- except socket.error as e:
+ except OSError as e:
self.skipTest("network error: %s" % e)
return
self.addCleanup(lambda: server('close')())
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index fb866d8..26dd09b 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -1,7 +1,7 @@
import io
import os
import sys
-import imp
+import importlib.util
import time
import shutil
import struct
@@ -518,7 +518,7 @@ class PyZipFileTests(unittest.TestCase):
if os.altsep is not None:
path_split.extend(fn.split(os.altsep))
if '__pycache__' in path_split:
- fn = imp.source_from_cache(fn)
+ fn = importlib.util.source_from_cache(fn)
else:
fn = fn[:-1]
@@ -874,7 +874,7 @@ class OtherTests(unittest.TestCase):
try:
with zipfile.ZipFile(TESTFN, 'a') as zf:
zf.writestr(filename, content)
- except IOError:
+ except OSError:
self.fail('Could not append data to a non-existent zip file.')
self.assertTrue(os.path.exists(TESTFN))
@@ -946,7 +946,7 @@ class OtherTests(unittest.TestCase):
fp.seek(0, 0)
self.assertTrue(zipfile.is_zipfile(fp))
- def test_non_existent_file_raises_IOError(self):
+ def test_non_existent_file_raises_OSError(self):
# make sure we don't raise an AttributeError when a partially-constructed
# ZipFile instance is finalized; this tests for regression on SF tracker
# bug #403871.
@@ -958,7 +958,7 @@ class OtherTests(unittest.TestCase):
# it is ignored, but the user should be sufficiently annoyed by
# the message on the output that regression will be noticed
# quickly.
- self.assertRaises(IOError, zipfile.ZipFile, TESTFN)
+ self.assertRaises(OSError, zipfile.ZipFile, TESTFN)
def test_empty_file_raises_BadZipFile(self):
f = open(TESTFN, 'w')
@@ -1145,7 +1145,7 @@ class OtherTests(unittest.TestCase):
def test_open_empty_file(self):
# Issue 1710703: Check that opening a file with less than 22 bytes
# raises a BadZipFile exception (rather than the previously unhelpful
- # IOError)
+ # OSError)
f = open(TESTFN, 'w')
f.close()
self.assertRaises(zipfile.BadZipFile, zipfile.ZipFile, TESTFN, 'r')
@@ -1629,6 +1629,5 @@ class LzmaUniversalNewlineTests(AbstractUniversalNewlineTests,
unittest.TestCase):
compression = zipfile.ZIP_LZMA
-
if __name__ == "__main__":
unittest.main()
diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py
index f7cb8b9..3f16041 100644
--- a/Lib/test/test_zipimport.py
+++ b/Lib/test/test_zipimport.py
@@ -1,13 +1,12 @@
import sys
import os
import marshal
-import imp
+import importlib.util
import struct
import time
import unittest
from test import support
-from test.test_importhooks import ImportHooksBaseTestCase, test_src, test_co
from zipfile import ZipFile, ZipInfo, ZIP_STORED, ZIP_DEFLATED
@@ -17,6 +16,14 @@ import doctest
import inspect
import io
from traceback import extract_tb, extract_stack, print_tb
+
+test_src = """\
+def get_name():
+ return __name__
+def get_file():
+ return __file__
+"""
+test_co = compile(test_src, "<???>", "exec")
raise_src = 'def do_raise(): raise TypeError\n'
def make_pyc(co, mtime, size):
@@ -27,7 +34,8 @@ def make_pyc(co, mtime, size):
mtime = int(mtime)
else:
mtime = int(-0x100000000 + int(mtime))
- pyc = imp.get_magic() + struct.pack("<ii", int(mtime), size & 0xFFFFFFFF) + data
+ pyc = (importlib.util.MAGIC_NUMBER +
+ struct.pack("<ii", int(mtime), size & 0xFFFFFFFF) + data)
return pyc
def module_path_to_dotted_name(path):
@@ -42,10 +50,27 @@ TESTPACK = "ziptestpackage"
TESTPACK2 = "ziptestpackage2"
TEMP_ZIP = os.path.abspath("junk95142.zip")
-pyc_file = imp.cache_from_source(TESTMOD + '.py')
+pyc_file = importlib.util.cache_from_source(TESTMOD + '.py')
pyc_ext = ('.pyc' if __debug__ else '.pyo')
+class ImportHooksBaseTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.path = sys.path[:]
+ self.meta_path = sys.meta_path[:]
+ self.path_hooks = sys.path_hooks[:]
+ sys.path_importer_cache.clear()
+ self.modules_before = support.modules_setup()
+
+ def tearDown(self):
+ sys.path[:] = self.path
+ sys.meta_path[:] = self.meta_path
+ sys.path_hooks[:] = self.path_hooks
+ sys.path_importer_cache.clear()
+ support.modules_cleanup(*self.modules_before)
+
+
class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
compression = ZIP_STORED
@@ -196,6 +221,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
for name, (mtime, data) in files.items():
zinfo = ZipInfo(name, time.localtime(mtime))
zinfo.compress_type = self.compression
+ zinfo.comment = b"spam"
z.writestr(zinfo, data)
z.close()
@@ -245,6 +271,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
for name, (mtime, data) in files.items():
zinfo = ZipInfo(name, time.localtime(mtime))
zinfo.compress_type = self.compression
+ zinfo.comment = b"eggs"
z.writestr(zinfo, data)
z.close()
@@ -459,7 +486,7 @@ class BadFileZipImportTestCase(unittest.TestCase):
self.assertRaises(error, z.load_module, 'abc')
self.assertRaises(error, z.get_code, 'abc')
- self.assertRaises(IOError, z.get_data, 'abc')
+ self.assertRaises(OSError, z.get_data, 'abc')
self.assertRaises(error, z.get_source, 'abc')
self.assertRaises(error, z.is_package, 'abc')
finally:
diff --git a/Lib/test/tf_inherit_check.py b/Lib/test/tf_inherit_check.py
index 92ebd95..afe50d2 100644
--- a/Lib/test/tf_inherit_check.py
+++ b/Lib/test/tf_inherit_check.py
@@ -11,7 +11,7 @@ try:
try:
os.write(fd, b"blat")
- except os.error:
+ except OSError:
# Success -- could not write to fd.
sys.exit(0)
else:
diff --git a/Lib/textwrap.py b/Lib/textwrap.py
index 7024d4d..27ebc16 100644
--- a/Lib/textwrap.py
+++ b/Lib/textwrap.py
@@ -19,6 +19,8 @@ __all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent']
# since 0xa0 is not in range(128).
_whitespace = '\t\n\x0b\x0c\r '
+_default_placeholder = ' [...]'
+
class TextWrapper:
"""
Object for wrapping/filling text. The public interface consists of
@@ -277,6 +279,9 @@ class TextWrapper:
return lines
+ def _split_chunks(self, text):
+ text = self._munge_whitespace(text)
+ return self._split(text)
# -- Public interface ----------------------------------------------
@@ -289,8 +294,7 @@ class TextWrapper:
and all other whitespace characters (including newline) are
converted to space.
"""
- text = self._munge_whitespace(text)
- chunks = self._split(text)
+ chunks = self._split_chunks(text)
if self.fix_sentence_endings:
self._fix_sentence_endings(chunks)
return self._wrap_chunks(chunks)
@@ -304,6 +308,36 @@ class TextWrapper:
"""
return "\n".join(self.wrap(text))
+ def shorten(self, text, *, placeholder=_default_placeholder):
+ """shorten(text: str) -> str
+
+ Collapse and truncate the given text to fit in 'self.width' columns.
+ """
+ max_length = self.width
+ if max_length < len(placeholder.strip()):
+ raise ValueError("placeholder too large for max width")
+ sep = ' '
+ sep_len = len(sep)
+ parts = []
+ cur_len = 0
+ chunks = self._split_chunks(text)
+ for chunk in chunks:
+ if not chunk.strip():
+ continue
+ chunk_len = len(chunk) + sep_len if parts else len(chunk)
+ if cur_len + chunk_len > max_length:
+ break
+ parts.append(chunk)
+ cur_len += chunk_len
+ else:
+ # No truncation necessary
+ return sep.join(parts)
+ max_truncated_length = max_length - len(placeholder)
+ while parts and cur_len > max_truncated_length:
+ last = parts.pop()
+ cur_len -= len(last) + sep_len
+ return (sep.join(parts) + placeholder).strip()
+
# -- Convenience interface ---------------------------------------------
@@ -332,6 +366,21 @@ def fill(text, width=70, **kwargs):
w = TextWrapper(width=width, **kwargs)
return w.fill(text)
+def shorten(text, width, *, placeholder=_default_placeholder, **kwargs):
+ """Collapse and truncate the given text to fit in the given width.
+
+ The text first has its whitespace collapsed. If it then fits in
+ the *width*, it is returned as is. Otherwise, as many words
+ as possible are joined and then the placeholder is appended::
+
+ >>> textwrap.shorten("Hello world!", width=12)
+ 'Hello world!'
+ >>> textwrap.shorten("Hello world!", width=11)
+ 'Hello [...]'
+ """
+ w = TextWrapper(width=width, **kwargs)
+ return w.shorten(text, placeholder=placeholder)
+
# -- Loosely related functionality -------------------------------------
diff --git a/Lib/threading.py b/Lib/threading.py
index aaece74..c7f919c 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -10,6 +10,11 @@ except ImportError:
from time import time as _time
from traceback import format_exc as _format_exc
from _weakrefset import WeakSet
+from itertools import islice as _islice
+try:
+ from _collections import deque as _deque
+except ImportError:
+ from collections import deque as _deque
# Note regarding PEP 8 compliant names
# This threading model was originally inspired by Java, and inherited
@@ -79,7 +84,7 @@ class _RLock:
def acquire(self, blocking=True, timeout=-1):
me = get_ident()
if self._owner == me:
- self._count = self._count + 1
+ self._count += 1
return 1
rc = self._block.acquire(blocking, timeout)
if rc:
@@ -146,7 +151,7 @@ class Condition:
self._is_owned = lock._is_owned
except AttributeError:
pass
- self._waiters = []
+ self._waiters = _deque()
def __enter__(self):
return self._lock.__enter__()
@@ -216,14 +221,14 @@ class Condition:
def notify(self, n=1):
if not self._is_owned():
raise RuntimeError("cannot notify on un-acquired lock")
- __waiters = self._waiters
- waiters = __waiters[:n]
- if not waiters:
+ all_waiters = self._waiters
+ waiters_to_notify = _deque(_islice(all_waiters, n))
+ if not waiters_to_notify:
return
- for waiter in waiters:
+ for waiter in waiters_to_notify:
waiter.release()
try:
- __waiters.remove(waiter)
+ all_waiters.remove(waiter)
except ValueError:
pass
@@ -261,7 +266,7 @@ class Semaphore:
break
self._cond.wait(timeout)
else:
- self._value = self._value - 1
+ self._value -= 1
rc = True
return rc
@@ -269,7 +274,7 @@ class Semaphore:
def release(self):
with self._cond:
- self._value = self._value + 1
+ self._value += 1
self._cond.notify()
def __exit__(self, t, v, tb):
@@ -504,7 +509,7 @@ class BrokenBarrierError(RuntimeError): pass
_counter = 0
def _newname(template="Thread-%d"):
global _counter
- _counter = _counter + 1
+ _counter += 1
return template % _counter
# Active thread administration
diff --git a/Lib/timeit.py b/Lib/timeit.py
index 4f7d28f..ead2030 100644
--- a/Lib/timeit.py
+++ b/Lib/timeit.py
@@ -31,38 +31,29 @@ treated similarly.
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
-The difference in default timer function is because on Windows,
-clock() has microsecond granularity but time()'s granularity is 1/60th
-of a second; on Unix, clock() has 1/100th of a second granularity and
-time() is much more precise. On either platform, the default timer
-functions measure wall clock time, not the CPU time. This means that
-other processes running on the same computer may interfere with the
-timing. The best thing to do when accurate timing is necessary is to
-repeat the timing a few times and use the best time. The -r option is
-good for this; the default of 3 repetitions is probably enough in most
-cases. On Unix, you can use clock() to measure CPU time.
-
Note: there is a certain baseline overhead associated with executing a
-pass statement. The code here doesn't try to hide it, but you should
-be aware of it. The baseline overhead can be measured by invoking the
-program without arguments.
-
-The baseline overhead differs between Python versions! Also, to
-fairly compare older Python versions to Python 2.3, you may want to
-use python -O for the older versions to avoid timing SET_LINENO
-instructions.
+pass statement. It differs between versions. The code here doesn't try
+to hide it, but you should be aware of it. The baseline overhead can be
+measured by invoking the program without arguments.
+
+Classes:
+
+ Timer
+
+Functions:
+
+ timeit(string, string) -> float
+ repeat(string, string) -> list
+ default_timer() -> float
+
"""
import gc
import sys
import time
-try:
- import itertools
-except ImportError:
- # Must be an older Python version (see timeit() below)
- itertools = None
+import itertools
-__all__ = ["Timer"]
+__all__ = ["Timer", "timeit", "repeat", "default_timer"]
dummy_src_name = "<timeit-src>"
default_number = 1000000
@@ -180,10 +171,7 @@ class Timer:
to one million. The main statement, the setup statement and
the timer function to be used are passed to the constructor.
"""
- if itertools:
- it = itertools.repeat(None, number)
- else:
- it = [None] * number
+ it = itertools.repeat(None, number)
gcold = gc.isenabled()
gc.disable()
try:
diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
index f619786..f78d24d 100644
--- a/Lib/tkinter/__init__.py
+++ b/Lib/tkinter/__init__.py
@@ -2181,45 +2181,6 @@ class Button(Widget):
"""
return self.tk.call(self._w, 'invoke')
-
-# Indices:
-# XXX I don't like these -- take them away
-def AtEnd():
- warnings.warn("tkinter.AtEnd will be removed in 3.4",
- DeprecationWarning, stacklevel=2)
- return 'end'
-
-
-def AtInsert(*args):
- warnings.warn("tkinter.AtInsert will be removed in 3.4",
- DeprecationWarning, stacklevel=2)
- s = 'insert'
- for a in args:
- if a: s = s + (' ' + a)
- return s
-
-
-def AtSelFirst():
- warnings.warn("tkinter.AtSelFirst will be removed in 3.4",
- DeprecationWarning, stacklevel=2)
- return 'sel.first'
-
-
-def AtSelLast():
- warnings.warn("tkinter.AtSelLast will be removed in 3.4",
- DeprecationWarning, stacklevel=2)
- return 'sel.last'
-
-
-def At(x, y=None):
- warnings.warn("tkinter.At will be removed in 3.4",
- DeprecationWarning, stacklevel=2)
- if y is None:
- return '@%r' % (x,)
- else:
- return '@%r,%r' % (x, y)
-
-
class Canvas(Widget, XView, YView):
"""Canvas widget to display graphical elements like lines or text."""
def __init__(self, master=None, cnf={}, **kw):
diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py
index 3ffb252..a71afb2 100644
--- a/Lib/tkinter/filedialog.py
+++ b/Lib/tkinter/filedialog.py
@@ -166,7 +166,7 @@ class FileDialog:
dir, pat = self.get_filter()
try:
names = os.listdir(dir)
- except os.error:
+ except OSError:
self.master.bell()
return
self.directory = dir
@@ -209,7 +209,7 @@ class FileDialog:
if not os.path.isabs(dir):
try:
pwd = os.getcwd()
- except os.error:
+ except OSError:
pwd = None
if pwd:
dir = os.path.join(pwd, dir)
diff --git a/Lib/token.py b/Lib/token.py
index 31fae0a..7470c8c 100755
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -93,7 +93,7 @@ def _main():
outFileName = args[1]
try:
fp = open(inFileName)
- except IOError as err:
+ except OSError as err:
sys.stdout.write("I/O error: %s\n" % str(err))
sys.exit(1)
lines = fp.read().split("\n")
@@ -112,7 +112,7 @@ def _main():
# load the output skeleton from the target:
try:
fp = open(outFileName)
- except IOError as err:
+ except OSError as err:
sys.stderr.write("I/O error: %s\n" % str(err))
sys.exit(2)
format = fp.read().split("\n")
@@ -129,7 +129,7 @@ def _main():
format[start:end] = lines
try:
fp = open(outFileName, 'w')
- except IOError as err:
+ except OSError as err:
sys.stderr.write("I/O error: %s\n" % str(err))
sys.exit(4)
fp.write("\n".join(format))
diff --git a/Lib/tokenize.py b/Lib/tokenize.py
index cbf91ef..2fbde0f 100644
--- a/Lib/tokenize.py
+++ b/Lib/tokenize.py
@@ -670,7 +670,7 @@ def main():
error(err.args[0], filename, (line, column))
except SyntaxError as err:
error(err, filename)
- except IOError as err:
+ except OSError as err:
error(err)
except KeyboardInterrupt:
print("interrupted\n")
diff --git a/Lib/trace.py b/Lib/trace.py
index c09b365..09fe9ee 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -238,7 +238,7 @@ class CoverageResults:
counts, calledfuncs, callers = \
pickle.load(open(self.infile, 'rb'))
self.update(self.__class__(counts, calledfuncs, callers))
- except (IOError, EOFError, ValueError) as err:
+ except (OSError, EOFError, ValueError) as err:
print(("Skipping counts file %r: %s"
% (self.infile, err)), file=sys.stderr)
@@ -348,7 +348,7 @@ class CoverageResults:
try:
pickle.dump((self.counts, self.calledfuncs, self.callers),
open(self.outfile, 'wb'), 1)
- except IOError as err:
+ except OSError as err:
print("Can't save counts files because %s" % err, file=sys.stderr)
def write_results_file(self, path, lines, lnotab, lines_hit, encoding=None):
@@ -356,7 +356,7 @@ class CoverageResults:
try:
outfile = open(path, "w", encoding=encoding)
- except IOError as err:
+ except OSError as err:
print(("trace: Could not open %r for writing: %s"
"- skipping" % (path, err)), file=sys.stderr)
return 0, 0
@@ -437,7 +437,7 @@ def _find_executable_linenos(filename):
with tokenize.open(filename) as f:
prog = f.read()
encoding = f.encoding
- except IOError as err:
+ except OSError as err:
print(("Not printing coverage data for %r: %s"
% (filename, err)), file=sys.stderr)
return {}
@@ -802,7 +802,7 @@ def main(argv=None):
'__cached__': None,
}
t.runctx(code, globs, globs)
- except IOError as err:
+ except OSError as err:
_err_exit("Cannot run file %r because: %s" % (sys.argv[0], err))
except SystemExit:
pass
diff --git a/Lib/traceback.py b/Lib/traceback.py
index eeb9e73..3aa1578 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -2,26 +2,31 @@
import linecache
import sys
+import operator
__all__ = ['extract_stack', 'extract_tb', 'format_exception',
'format_exception_only', 'format_list', 'format_stack',
'format_tb', 'print_exc', 'format_exc', 'print_exception',
'print_last', 'print_stack', 'print_tb']
-def _print(file, str='', terminator='\n'):
- file.write(str+terminator)
+#
+# Formatting and printing lists of traceback lines.
+#
+def _format_list_iter(extracted_list):
+ for filename, lineno, name, line in extracted_list:
+ item = ' File "{}", line {}, in {}\n'.format(filename, lineno, name)
+ if line:
+ item = item + ' {}\n'.format(line.strip())
+ yield item
def print_list(extracted_list, file=None):
"""Print the list of tuples as returned by extract_tb() or
extract_stack() as a formatted stack trace to the given file."""
if file is None:
file = sys.stderr
- for filename, lineno, name, line in extracted_list:
- _print(file,
- ' File "%s", line %d, in %s' % (filename,lineno,name))
- if line:
- _print(file, ' %s' % line.strip())
+ for item in _format_list_iter(extracted_list):
+ print(item, file=file, end="")
def format_list(extracted_list):
"""Format a list of traceback entry tuples for printing.
@@ -33,14 +38,44 @@ def format_list(extracted_list):
the strings may contain internal newlines as well, for those items
whose source text line is not None.
"""
- list = []
- for filename, lineno, name, line in extracted_list:
- item = ' File "%s", line %d, in %s\n' % (filename,lineno,name)
+ return list(_format_list_iter(extracted_list))
+
+#
+# Printing and Extracting Tracebacks.
+#
+
+# extractor takes curr and needs to return a tuple of:
+# - Frame object
+# - Line number
+# - Next item (same type as curr)
+# In practice, curr is either a traceback or a frame.
+def _extract_tb_or_stack_iter(curr, limit, extractor):
+ if limit is None:
+ limit = getattr(sys, 'tracebacklimit', None)
+
+ n = 0
+ while curr is not None and (limit is None or n < limit):
+ f, lineno, next_item = extractor(curr)
+ co = f.f_code
+ filename = co.co_filename
+ name = co.co_name
+
+ linecache.checkcache(filename)
+ line = linecache.getline(filename, lineno, f.f_globals)
+
if line:
- item = item + ' %s\n' % line.strip()
- list.append(item)
- return list
+ line = line.strip()
+ else:
+ line = None
+
+ yield (filename, lineno, name, line)
+ curr = next_item
+ n += 1
+def _extract_tb_iter(tb, limit):
+ return _extract_tb_or_stack_iter(
+ tb, limit,
+ operator.attrgetter("tb_frame", "tb_lineno", "tb_next"))
def print_tb(tb, limit=None, file=None):
"""Print up to 'limit' stack trace entries from the traceback 'tb'.
@@ -50,29 +85,11 @@ def print_tb(tb, limit=None, file=None):
'file' should be an open file or file-like object with a write()
method.
"""
- if file is None:
- file = sys.stderr
- if limit is None:
- if hasattr(sys, 'tracebacklimit'):
- limit = sys.tracebacklimit
- n = 0
- while tb is not None and (limit is None or n < limit):
- f = tb.tb_frame
- lineno = tb.tb_lineno
- co = f.f_code
- filename = co.co_filename
- name = co.co_name
- _print(file,
- ' File "%s", line %d, in %s' % (filename, lineno, name))
- linecache.checkcache(filename)
- line = linecache.getline(filename, lineno, f.f_globals)
- if line: _print(file, ' ' + line.strip())
- tb = tb.tb_next
- n = n+1
+ print_list(extract_tb(tb, limit=limit), file=file)
def format_tb(tb, limit=None):
- """A shorthand for 'format_list(extract_stack(f, limit))."""
- return format_list(extract_tb(tb, limit))
+ """A shorthand for 'format_list(extract_tb(tb, limit))."""
+ return format_list(extract_tb(tb, limit=limit))
def extract_tb(tb, limit=None):
"""Return list of up to limit pre-processed entries from traceback.
@@ -85,26 +102,11 @@ def extract_tb(tb, limit=None):
leading and trailing whitespace stripped; if the source is not
available it is None.
"""
- if limit is None:
- if hasattr(sys, 'tracebacklimit'):
- limit = sys.tracebacklimit
- list = []
- n = 0
- while tb is not None and (limit is None or n < limit):
- f = tb.tb_frame
- lineno = tb.tb_lineno
- co = f.f_code
- filename = co.co_filename
- name = co.co_name
- linecache.checkcache(filename)
- line = linecache.getline(filename, lineno, f.f_globals)
- if line: line = line.strip()
- else: line = None
- list.append((filename, lineno, name, line))
- tb = tb.tb_next
- n = n+1
- return list
+ return list(_extract_tb_iter(tb, limit=limit))
+#
+# Exception formatting and output.
+#
_cause_message = (
"\nThe above exception was the direct cause "
@@ -132,9 +134,23 @@ def _iter_chain(exc, custom_tb=None, seen=None):
its.append([(exc, custom_tb or exc.__traceback__)])
# itertools.chain is in an extension module and may be unavailable
for it in its:
- for x in it:
- yield x
+ yield from it
+
+def _format_exception_iter(etype, value, tb, limit, chain):
+ if chain:
+ values = _iter_chain(value, tb)
+ else:
+ values = [(value, tb)]
+ for value, tb in values:
+ if isinstance(value, str):
+ # This is a cause/context message line
+ yield value + '\n'
+ continue
+ if tb:
+ yield 'Traceback (most recent call last):\n'
+ yield from _format_list_iter(_extract_tb_iter(tb, limit=limit))
+ yield from _format_exception_only_iter(type(value), value)
def print_exception(etype, value, tb, limit=None, file=None, chain=True):
"""Print exception up to 'limit' stack trace entries from 'tb' to 'file'.
@@ -149,20 +165,8 @@ def print_exception(etype, value, tb, limit=None, file=None, chain=True):
"""
if file is None:
file = sys.stderr
- if chain:
- values = _iter_chain(value, tb)
- else:
- values = [(value, tb)]
- for value, tb in values:
- if isinstance(value, str):
- _print(file, value)
- continue
- if tb:
- _print(file, 'Traceback (most recent call last):')
- print_tb(tb, limit, file)
- lines = format_exception_only(type(value), value)
- for line in lines:
- _print(file, line, '')
+ for line in _format_exception_iter(etype, value, tb, limit, chain):
+ print(line, file=file, end="")
def format_exception(etype, value, tb, limit=None, chain=True):
"""Format a stack trace and the exception information.
@@ -173,20 +177,7 @@ def format_exception(etype, value, tb, limit=None, chain=True):
these lines are concatenated and printed, exactly the same text is
printed as does print_exception().
"""
- list = []
- if chain:
- values = _iter_chain(value, tb)
- else:
- values = [(value, tb)]
- for value, tb in values:
- if isinstance(value, str):
- list.append(value + '\n')
- continue
- if tb:
- list.append('Traceback (most recent call last):\n')
- list.extend(format_tb(tb, limit))
- list.extend(format_exception_only(type(value), value))
- return list
+ return list(_format_exception_iter(etype, value, tb, limit, chain))
def format_exception_only(etype, value):
"""Format the exception part of a traceback.
@@ -204,10 +195,14 @@ def format_exception_only(etype, value):
string in the list.
"""
+ return list(_format_exception_only_iter(etype, value))
+
+def _format_exception_only_iter(etype, value):
# Gracefully handle (the way Python 2.4 and earlier did) the case of
# being called with (None, None).
if etype is None:
- return [_format_final_exc_line(etype, value)]
+ yield _format_final_exc_line(etype, value)
+ return
stype = etype.__name__
smod = etype.__module__
@@ -215,26 +210,26 @@ def format_exception_only(etype, value):
stype = smod + '.' + stype
if not issubclass(etype, SyntaxError):
- return [_format_final_exc_line(stype, value)]
+ yield _format_final_exc_line(stype, value)
+ return
# It was a syntax error; show exactly where the problem was found.
- lines = []
filename = value.filename or "<string>"
lineno = str(value.lineno) or '?'
- lines.append(' File "%s", line %s\n' % (filename, lineno))
+ yield ' File "{}", line {}\n'.format(filename, lineno)
+
badline = value.text
offset = value.offset
if badline is not None:
- lines.append(' %s\n' % badline.strip())
+ yield ' {}\n'.format(badline.strip())
if offset is not None:
caretspace = badline.rstrip('\n')[:offset].lstrip()
# non-space whitespace (likes tabs) must be kept for alignment
caretspace = ((c.isspace() and c or ' ') for c in caretspace)
# only three spaces to account for offset1 == pos 0
- lines.append(' %s^\n' % ''.join(caretspace))
+ yield ' {}^\n'.format(''.join(caretspace))
msg = value.msg or "<no detail available>"
- lines.append("%s: %s\n" % (stype, msg))
- return lines
+ yield "{}: {}\n".format(stype, msg)
def _format_final_exc_line(etype, value):
valuestr = _some_str(value)
@@ -250,38 +245,34 @@ def _some_str(value):
except:
return '<unprintable %s object>' % type(value).__name__
-
def print_exc(limit=None, file=None, chain=True):
"""Shorthand for 'print_exception(*sys.exc_info(), limit, file)'."""
- if file is None:
- file = sys.stderr
- try:
- etype, value, tb = sys.exc_info()
- print_exception(etype, value, tb, limit, file, chain)
- finally:
- etype = value = tb = None
-
+ print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
def format_exc(limit=None, chain=True):
"""Like print_exc() but return a string."""
- try:
- etype, value, tb = sys.exc_info()
- return ''.join(
- format_exception(etype, value, tb, limit, chain))
- finally:
- etype = value = tb = None
-
+ return "".join(format_exception(*sys.exc_info(), limit=limit, chain=chain))
def print_last(limit=None, file=None, chain=True):
"""This is a shorthand for 'print_exception(sys.last_type,
sys.last_value, sys.last_traceback, limit, file)'."""
if not hasattr(sys, "last_type"):
raise ValueError("no last exception")
- if file is None:
- file = sys.stderr
print_exception(sys.last_type, sys.last_value, sys.last_traceback,
limit, file, chain)
+#
+# Printing and Extracting Stacks.
+#
+
+def _extract_stack_iter(f, limit=None):
+ return _extract_tb_or_stack_iter(
+ f, limit, lambda f: (f, f.f_lineno, f.f_back))
+
+def _get_stack(f):
+ if f is None:
+ f = sys._getframe().f_back.f_back
+ return f
def print_stack(f=None, limit=None, file=None):
"""Print a stack trace from its invocation point.
@@ -290,21 +281,11 @@ def print_stack(f=None, limit=None, file=None):
stack frame at which to start. The optional 'limit' and 'file'
arguments have the same meaning as for print_exception().
"""
- if f is None:
- try:
- raise ZeroDivisionError
- except ZeroDivisionError:
- f = sys.exc_info()[2].tb_frame.f_back
- print_list(extract_stack(f, limit), file)
+ print_list(extract_stack(_get_stack(f), limit=limit), file=file)
def format_stack(f=None, limit=None):
"""Shorthand for 'format_list(extract_stack(f, limit))'."""
- if f is None:
- try:
- raise ZeroDivisionError
- except ZeroDivisionError:
- f = sys.exc_info()[2].tb_frame.f_back
- return format_list(extract_stack(f, limit))
+ return format_list(extract_stack(_get_stack(f), limit=limit))
def extract_stack(f=None, limit=None):
"""Extract the raw traceback from the current stack frame.
@@ -315,27 +296,6 @@ def extract_stack(f=None, limit=None):
line number, function name, text), and the entries are in order
from oldest to newest stack frame.
"""
- if f is None:
- try:
- raise ZeroDivisionError
- except ZeroDivisionError:
- f = sys.exc_info()[2].tb_frame.f_back
- if limit is None:
- if hasattr(sys, 'tracebacklimit'):
- limit = sys.tracebacklimit
- list = []
- n = 0
- while f is not None and (limit is None or n < limit):
- lineno = f.f_lineno
- co = f.f_code
- filename = co.co_filename
- name = co.co_name
- linecache.checkcache(filename)
- line = linecache.getline(filename, lineno, f.f_globals)
- if line: line = line.strip()
- else: line = None
- list.append((filename, lineno, name, line))
- f = f.f_back
- n = n+1
- list.reverse()
- return list
+ stack = list(_extract_stack_iter(_get_stack(f), limit=limit))
+ stack.reverse()
+ return stack
diff --git a/Lib/turtle.py b/Lib/turtle.py
index c6ebfa5..ab7b6ba 100644
--- a/Lib/turtle.py
+++ b/Lib/turtle.py
@@ -3843,18 +3843,18 @@ def write_docstringdict(filename="turtle_docstringdict"):
key = "Turtle."+methodname
docsdict[key] = eval(key).__doc__
- f = open("%s.py" % filename,"w")
- keys = sorted([x for x in docsdict.keys()
- if x.split('.')[1] not in _alias_list])
- f.write('docsdict = {\n\n')
- for key in keys[:-1]:
+ with open("%s.py" % filename,"w") as f:
+ keys = sorted([x for x in docsdict.keys()
+ if x.split('.')[1] not in _alias_list])
+ f.write('docsdict = {\n\n')
+ for key in keys[:-1]:
+ f.write('%s :\n' % repr(key))
+ f.write(' """%s\n""",\n\n' % docsdict[key])
+ key = keys[-1]
f.write('%s :\n' % repr(key))
- f.write(' """%s\n""",\n\n' % docsdict[key])
- key = keys[-1]
- f.write('%s :\n' % repr(key))
- f.write(' """%s\n"""\n\n' % docsdict[key])
- f.write("}\n")
- f.close()
+ f.write(' """%s\n"""\n\n' % docsdict[key])
+ f.write("}\n")
+ f.close()
def read_docstrings(lang):
"""Read in docstrings from lang-specific docstring dictionary.
diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py
index cbf3aeb..a14684c 100755
--- a/Lib/turtledemo/__main__.py
+++ b/Lib/turtledemo/__main__.py
@@ -6,7 +6,7 @@ from tkinter import *
from idlelib.Percolator import Percolator
from idlelib.ColorDelegator import ColorDelegator
from idlelib.textView import view_file # TextViewer
-from imp import reload
+from importlib import reload
import turtle
import time
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index f56af55..d04ea61 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -7,6 +7,7 @@ import pprint
import re
import warnings
import collections
+import contextlib
from . import result
from .util import (strclass, safe_repr, _count_diff_all_purpose,
@@ -26,17 +27,11 @@ class SkipTest(Exception):
instead of raising this directly.
"""
-class _ExpectedFailure(Exception):
+class _ShouldStop(Exception):
"""
- Raise this when a test is expected to fail.
-
- This is an implementation detail.
+ The test should stop.
"""
- def __init__(self, exc_info):
- super(_ExpectedFailure, self).__init__()
- self.exc_info = exc_info
-
class _UnexpectedSuccess(Exception):
"""
The test was supposed to fail, but it didn't!
@@ -44,13 +39,40 @@ class _UnexpectedSuccess(Exception):
class _Outcome(object):
- def __init__(self):
+ def __init__(self, result=None):
+ self.expecting_failure = False
+ self.result = result
+ self.result_supports_subtests = hasattr(result, "addSubTest")
self.success = True
- self.skipped = None
- self.unexpectedSuccess = None
+ self.skipped = []
self.expectedFailure = None
self.errors = []
- self.failures = []
+
+ @contextlib.contextmanager
+ def testPartExecutor(self, test_case, isTest=False):
+ old_success = self.success
+ self.success = True
+ try:
+ yield
+ except KeyboardInterrupt:
+ raise
+ except SkipTest as e:
+ self.success = False
+ self.skipped.append((test_case, str(e)))
+ except _ShouldStop:
+ pass
+ except:
+ exc_info = sys.exc_info()
+ if self.expecting_failure:
+ self.expectedFailure = exc_info
+ else:
+ self.success = False
+ self.errors.append((test_case, exc_info))
+ else:
+ if self.result_supports_subtests and self.success:
+ self.errors.append((test_case, None))
+ finally:
+ self.success = self.success and old_success
def _id(obj):
@@ -88,16 +110,9 @@ def skipUnless(condition, reason):
return skip(reason)
return _id
-
-def expectedFailure(func):
- @functools.wraps(func)
- def wrapper(*args, **kwargs):
- try:
- func(*args, **kwargs)
- except Exception:
- raise _ExpectedFailure(sys.exc_info())
- raise _UnexpectedSuccess
- return wrapper
+def expectedFailure(test_item):
+ test_item.__unittest_expecting_failure__ = True
+ return test_item
class _AssertRaisesBaseContext(object):
@@ -270,7 +285,7 @@ class TestCase(object):
not have a method with the specified name.
"""
self._testMethodName = methodName
- self._outcomeForDoCleanups = None
+ self._outcome = None
self._testMethodDoc = 'No test'
try:
testMethod = getattr(self, methodName)
@@ -283,6 +298,7 @@ class TestCase(object):
else:
self._testMethodDoc = testMethod.__doc__
self._cleanups = []
+ self._subtest = None
# Map types to custom assertEqual functions that will compare
# instances of said type in more detail to generate a more useful
@@ -370,44 +386,80 @@ class TestCase(object):
return "<%s testMethod=%s>" % \
(strclass(self.__class__), self._testMethodName)
- def _addSkip(self, result, reason):
+ def _addSkip(self, result, test_case, reason):
addSkip = getattr(result, 'addSkip', None)
if addSkip is not None:
- addSkip(self, reason)
+ addSkip(test_case, reason)
else:
warnings.warn("TestResult has no addSkip method, skips not reported",
RuntimeWarning, 2)
+ result.addSuccess(test_case)
+
+ @contextlib.contextmanager
+ def subTest(self, msg=None, **params):
+ """Return a context manager that will return the enclosed block
+ of code in a subtest identified by the optional message and
+ keyword parameters. A failure in the subtest marks the test
+ case as failed but resumes execution at the end of the enclosed
+ block, allowing further test code to be executed.
+ """
+ if not self._outcome.result_supports_subtests:
+ yield
+ return
+ parent = self._subtest
+ if parent is None:
+ params_map = collections.ChainMap(params)
+ else:
+ params_map = parent.params.new_child(params)
+ self._subtest = _SubTest(self, msg, params_map)
+ try:
+ with self._outcome.testPartExecutor(self._subtest, isTest=True):
+ yield
+ if not self._outcome.success:
+ result = self._outcome.result
+ if result is not None and result.failfast:
+ raise _ShouldStop
+ elif self._outcome.expectedFailure:
+ # If the test is expecting a failure, we really want to
+ # stop now and register the expected failure.
+ raise _ShouldStop
+ finally:
+ self._subtest = parent
+
+ def _feedErrorsToResult(self, result, errors):
+ for test, exc_info in errors:
+ if isinstance(test, _SubTest):
+ result.addSubTest(test.test_case, test, exc_info)
+ elif exc_info is not None:
+ if issubclass(exc_info[0], self.failureException):
+ result.addFailure(test, exc_info)
+ else:
+ result.addError(test, exc_info)
+
+ def _addExpectedFailure(self, result, exc_info):
+ try:
+ addExpectedFailure = result.addExpectedFailure
+ except AttributeError:
+ warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
+ RuntimeWarning)
result.addSuccess(self)
+ else:
+ addExpectedFailure(self, exc_info)
- def _executeTestPart(self, function, outcome, isTest=False):
+ def _addUnexpectedSuccess(self, result):
try:
- function()
- except KeyboardInterrupt:
- raise
- except SkipTest as e:
- outcome.success = False
- outcome.skipped = str(e)
- except _UnexpectedSuccess:
- exc_info = sys.exc_info()
- outcome.success = False
- if isTest:
- outcome.unexpectedSuccess = exc_info
- else:
- outcome.errors.append(exc_info)
- except _ExpectedFailure:
- outcome.success = False
- exc_info = sys.exc_info()
- if isTest:
- outcome.expectedFailure = exc_info
- else:
- outcome.errors.append(exc_info)
- except self.failureException:
- outcome.success = False
- outcome.failures.append(sys.exc_info())
- exc_info = sys.exc_info()
- except:
- outcome.success = False
- outcome.errors.append(sys.exc_info())
+ addUnexpectedSuccess = result.addUnexpectedSuccess
+ except AttributeError:
+ warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failure",
+ RuntimeWarning)
+ # We need to pass an actual exception and traceback to addFailure,
+ # otherwise the legacy result can choke.
+ try:
+ raise _UnexpectedSuccess from None
+ except _UnexpectedSuccess:
+ result.addFailure(self, sys.exc_info())
+ else:
+ addUnexpectedSuccess(self)
def run(self, result=None):
orig_result = result
@@ -426,46 +478,38 @@ class TestCase(object):
try:
skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
or getattr(testMethod, '__unittest_skip_why__', ''))
- self._addSkip(result, skip_why)
+ self._addSkip(result, self, skip_why)
finally:
result.stopTest(self)
return
+ expecting_failure = getattr(testMethod,
+ "__unittest_expecting_failure__", False)
try:
- outcome = _Outcome()
- self._outcomeForDoCleanups = outcome
+ outcome = _Outcome(result)
+ self._outcome = outcome
- self._executeTestPart(self.setUp, outcome)
+ with outcome.testPartExecutor(self):
+ self.setUp()
if outcome.success:
- self._executeTestPart(testMethod, outcome, isTest=True)
- self._executeTestPart(self.tearDown, outcome)
+ outcome.expecting_failure = expecting_failure
+ with outcome.testPartExecutor(self, isTest=True):
+ testMethod()
+ outcome.expecting_failure = False
+ with outcome.testPartExecutor(self):
+ self.tearDown()
self.doCleanups()
+ for test, reason in outcome.skipped:
+ self._addSkip(result, test, reason)
+ self._feedErrorsToResult(result, outcome.errors)
if outcome.success:
- result.addSuccess(self)
- else:
- if outcome.skipped is not None:
- self._addSkip(result, outcome.skipped)
- for exc_info in outcome.errors:
- result.addError(self, exc_info)
- for exc_info in outcome.failures:
- result.addFailure(self, exc_info)
- if outcome.unexpectedSuccess is not None:
- addUnexpectedSuccess = getattr(result, 'addUnexpectedSuccess', None)
- if addUnexpectedSuccess is not None:
- addUnexpectedSuccess(self)
+ if expecting_failure:
+ if outcome.expectedFailure:
+ self._addExpectedFailure(result, outcome.expectedFailure)
else:
- warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failures",
- RuntimeWarning)
- result.addFailure(self, outcome.unexpectedSuccess)
-
- if outcome.expectedFailure is not None:
- addExpectedFailure = getattr(result, 'addExpectedFailure', None)
- if addExpectedFailure is not None:
- addExpectedFailure(self, outcome.expectedFailure)
- else:
- warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
- RuntimeWarning)
- result.addSuccess(self)
+ self._addUnexpectedSuccess(result)
+ else:
+ result.addSuccess(self)
return result
finally:
result.stopTest(self)
@@ -477,11 +521,11 @@ class TestCase(object):
def doCleanups(self):
"""Execute all cleanup functions. Normally called for you after
tearDown."""
- outcome = self._outcomeForDoCleanups or _Outcome()
+ outcome = self._outcome or _Outcome()
while self._cleanups:
function, args, kwargs = self._cleanups.pop()
- part = lambda: function(*args, **kwargs)
- self._executeTestPart(part, outcome)
+ with outcome.testPartExecutor(self):
+ function(*args, **kwargs)
# return this for backwards compatibility
# even though we no longer us it internally
@@ -1212,3 +1256,39 @@ class FunctionTestCase(TestCase):
return self._description
doc = self._testFunc.__doc__
return doc and doc.split("\n")[0].strip() or None
+
+
+class _SubTest(TestCase):
+
+ def __init__(self, test_case, message, params):
+ super().__init__()
+ self._message = message
+ self.test_case = test_case
+ self.params = params
+ self.failureException = test_case.failureException
+
+ def runTest(self):
+ raise NotImplementedError("subtests cannot be run directly")
+
+ def _subDescription(self):
+ parts = []
+ if self._message:
+ parts.append("[{}]".format(self._message))
+ if self.params:
+ params_desc = ', '.join(
+ "{}={!r}".format(k, v)
+ for (k, v) in sorted(self.params.items()))
+ parts.append("({})".format(params_desc))
+ return " ".join(parts) or '(<subtest>)'
+
+ def id(self):
+ return "{} {}".format(self.test_case.id(), self._subDescription())
+
+ def shortDescription(self):
+ """Returns a one-line description of the subtest, or None if no
+ description has been provided.
+ """
+ return self.test_case.shortDescription()
+
+ def __str__(self):
+ return "{} {}".format(self.test_case, self._subDescription())
diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py
index 2b92525..ad89cd0 100644
--- a/Lib/unittest/loader.py
+++ b/Lib/unittest/loader.py
@@ -34,6 +34,14 @@ def _make_failed_test(classname, methodname, exception, suiteClass):
TestClass = type(classname, (case.TestCase,), attrs)
return suiteClass((TestClass(methodname),))
+def _make_skipped_test(methodname, exception, suiteClass):
+ @case.skip(str(exception))
+ def testSkipped(self):
+ pass
+ attrs = {methodname: testSkipped}
+ TestClass = type("ModuleSkipped", (case.TestCase,), attrs)
+ return suiteClass((TestClass(methodname),))
+
def _jython_aware_splitext(path):
if path.lower().endswith('$py.class'):
return path[:-9]
@@ -169,6 +177,9 @@ class TestLoader(object):
The pattern is deliberately not stored as a loader attribute so that
packages can continue discovery themselves. top_level_dir is stored so
load_tests does not need to pass this argument in to loader.discover().
+
+ Paths are sorted before being imported to ensure reproducible execution
+ order even on filesystems with non-alphabetical ordering like ext3/4.
"""
set_implicit_top = False
if top_level_dir is None and self._top_level_dir is not None:
@@ -245,7 +256,7 @@ class TestLoader(object):
def _find_tests(self, start_dir, pattern):
"""Used by discovery. Yields test suites it loads."""
- paths = os.listdir(start_dir)
+ paths = sorted(os.listdir(start_dir))
for path in paths:
full_path = os.path.join(start_dir, path)
@@ -259,6 +270,8 @@ class TestLoader(object):
name = self._get_name_from_path(full_path)
try:
module = self._get_module_from_name(name)
+ except case.SkipTest as e:
+ yield _make_skipped_test(name, e, self.suiteClass)
except:
yield _make_failed_import_test(name, self.suiteClass)
else:
@@ -291,8 +304,7 @@ class TestLoader(object):
# tests loaded from package file
yield tests
# recurse into the package
- for test in self._find_tests(full_path, pattern):
- yield test
+ yield from self._find_tests(full_path, pattern)
else:
try:
yield load_tests(self, tests, pattern)
diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py
index ead6493..edb141a 100644
--- a/Lib/unittest/main.py
+++ b/Lib/unittest/main.py
@@ -164,7 +164,10 @@ class TestProgram(object):
# to support python -m unittest ...
self.module = None
else:
- self.testNames = (self.defaultTest,)
+ if isinstance(self.defaultTest, str):
+ self.testNames = (self.defaultTest,)
+ else:
+ self.testNames = list(self.defaultTest)
self.createTests()
def createTests(self):
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 073869a..dc5c033 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -27,7 +27,7 @@ __version__ = '1.0'
import inspect
import pprint
import sys
-from functools import wraps
+from functools import wraps, partial
BaseExceptions = (BaseException,)
@@ -66,55 +66,45 @@ DescriptorTypes = (
)
-def _getsignature(func, skipfirst, instance=False):
- if isinstance(func, type) and not instance:
+def _get_signature_object(func, as_instance, eat_self):
+ """
+ Given an arbitrary, possibly callable object, try to create a suitable
+ signature object.
+ Return a (reduced func, signature) tuple, or None.
+ """
+ if isinstance(func, type) and not as_instance:
+ # If it's a type and should be modelled as a type, use __init__.
try:
func = func.__init__
except AttributeError:
- return
- skipfirst = True
+ return None
+ # Skip the `self` argument in __init__
+ eat_self = True
elif not isinstance(func, FunctionTypes):
- # for classes where instance is True we end up here too
+ # If we really want to model an instance of the passed type,
+ # __call__ should be looked up, not __init__.
try:
func = func.__call__
except AttributeError:
- return
-
+ return None
+ if eat_self:
+ sig_func = partial(func, None)
+ else:
+ sig_func = func
try:
- argspec = inspect.getfullargspec(func)
- except TypeError:
- # C function / method, possibly inherited object().__init__
- return
-
- regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec
-
-
- # instance methods and classmethods need to lose the self argument
- if getattr(func, '__self__', None) is not None:
- regargs = regargs[1:]
- if skipfirst:
- # this condition and the above one are never both True - why?
- regargs = regargs[1:]
-
- signature = inspect.formatargspec(
- regargs, varargs, varkw, defaults,
- kwonly, kwonlydef, ann, formatvalue=lambda value: "")
- return signature[1:-1], func
+ return func, inspect.signature(sig_func)
+ except ValueError:
+ # Certain callable types are not supported by inspect.signature()
+ return None
def _check_signature(func, mock, skipfirst, instance=False):
- if not _callable(func):
+ sig = _get_signature_object(func, instance, skipfirst)
+ if sig is None:
return
-
- result = _getsignature(func, skipfirst, instance)
- if result is None:
- return
- signature, func = result
-
- # can't use self because "self" is common as an argument name
- # unfortunately even not in the first place
- src = "lambda _mock_self, %s: None" % signature
- checksig = eval(src, {})
+ func, sig = sig
+ def checksig(_mock_self, *args, **kwargs):
+ sig.bind(*args, **kwargs)
_copy_func_details(func, checksig)
type(mock)._mock_check_sig = checksig
@@ -166,15 +156,12 @@ def _set_signature(mock, original, instance=False):
return
skipfirst = isinstance(original, type)
- result = _getsignature(original, skipfirst, instance)
+ result = _get_signature_object(original, instance, skipfirst)
if result is None:
- # was a C function (e.g. object().__init__ ) that can't be mocked
return
-
- signature, func = result
-
- src = "lambda %s: None" % signature
- checksig = eval(src, {})
+ func, sig = result
+ def checksig(*args, **kwargs):
+ sig.bind(*args, **kwargs)
_copy_func_details(func, checksig)
name = original.__name__
@@ -368,7 +355,7 @@ class NonCallableMock(Base):
def __init__(
self, spec=None, wraps=None, name=None, spec_set=None,
parent=None, _spec_state=None, _new_name='', _new_parent=None,
- **kwargs
+ _spec_as_instance=False, _eat_self=None, **kwargs
):
if _new_parent is None:
_new_parent = parent
@@ -382,8 +369,10 @@ class NonCallableMock(Base):
if spec_set is not None:
spec = spec_set
spec_set = True
+ if _eat_self is None:
+ _eat_self = parent is not None
- self._mock_add_spec(spec, spec_set)
+ self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self)
__dict__['_mock_children'] = {}
__dict__['_mock_wraps'] = wraps
@@ -428,20 +417,26 @@ class NonCallableMock(Base):
self._mock_add_spec(spec, spec_set)
- def _mock_add_spec(self, spec, spec_set):
+ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False,
+ _eat_self=False):
_spec_class = None
+ _spec_signature = None
if spec is not None and not _is_list(spec):
if isinstance(spec, type):
_spec_class = spec
else:
_spec_class = _get_class(spec)
+ res = _get_signature_object(spec,
+ _spec_as_instance, _eat_self)
+ _spec_signature = res and res[1]
spec = dir(spec)
__dict__ = self.__dict__
__dict__['_spec_class'] = _spec_class
__dict__['_spec_set'] = spec_set
+ __dict__['_spec_signature'] = _spec_signature
__dict__['_mock_methods'] = spec
@@ -695,7 +690,6 @@ class NonCallableMock(Base):
self._mock_children[name] = _deleted
-
def _format_mock_call_signature(self, args, kwargs):
name = self._mock_name or 'mock'
return _format_call_signature(name, args, kwargs)
@@ -711,6 +705,28 @@ class NonCallableMock(Base):
return message % (expected_string, actual_string)
+ def _call_matcher(self, _call):
+ """
+ Given a call (or simply a (args, kwargs) tuple), return a
+ comparison key suitable for matching with other calls.
+ This is a best effort method which relies on the spec's signature,
+ if available, or falls back on the arguments themselves.
+ """
+ sig = self._spec_signature
+ if sig is not None:
+ if len(_call) == 2:
+ name = ''
+ args, kwargs = _call
+ else:
+ name, args, kwargs = _call
+ try:
+ return name, sig.bind(*args, **kwargs)
+ except TypeError as e:
+ return e.with_traceback(None)
+ else:
+ return _call
+
+
def assert_called_with(_mock_self, *args, **kwargs):
"""assert that the mock was called with the specified arguments.
@@ -721,9 +737,14 @@ class NonCallableMock(Base):
expected = self._format_mock_call_signature(args, kwargs)
raise AssertionError('Expected call: %s\nNot called' % (expected,))
- if self.call_args != (args, kwargs):
+ def _error_message():
msg = self._format_mock_failure_message(args, kwargs)
- raise AssertionError(msg)
+ return msg
+ expected = self._call_matcher((args, kwargs))
+ actual = self._call_matcher(self.call_args)
+ if expected != actual:
+ cause = expected if isinstance(expected, Exception) else None
+ raise AssertionError(_error_message()) from cause
def assert_called_once_with(_mock_self, *args, **kwargs):
@@ -747,18 +768,21 @@ class NonCallableMock(Base):
If `any_order` is True then the calls can be in any order, but
they must all appear in `mock_calls`."""
+ expected = [self._call_matcher(c) for c in calls]
+ cause = expected if isinstance(expected, Exception) else None
+ all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls)
if not any_order:
- if calls not in self.mock_calls:
+ if expected not in all_calls:
raise AssertionError(
'Calls not found.\nExpected: %r\n'
'Actual: %r' % (calls, self.mock_calls)
- )
+ ) from cause
return
- all_calls = list(self.mock_calls)
+ all_calls = list(all_calls)
not_found = []
- for kall in calls:
+ for kall in expected:
try:
all_calls.remove(kall)
except ValueError:
@@ -766,7 +790,7 @@ class NonCallableMock(Base):
if not_found:
raise AssertionError(
'%r not all found in call list' % (tuple(not_found),)
- )
+ ) from cause
def assert_any_call(self, *args, **kwargs):
@@ -775,12 +799,14 @@ class NonCallableMock(Base):
The assert passes if the mock has *ever* been called, unlike
`assert_called_with` and `assert_called_once_with` that only pass if
the call is the most recent one."""
- kall = call(*args, **kwargs)
- if kall not in self.call_args_list:
+ expected = self._call_matcher((args, kwargs))
+ actual = [self._call_matcher(c) for c in self.call_args_list]
+ if expected not in actual:
+ cause = expected if isinstance(expected, Exception) else None
expected_string = self._format_mock_call_signature(args, kwargs)
raise AssertionError(
'%s call not found' % expected_string
- )
+ ) from cause
def _get_child_mock(self, **kw):
@@ -850,11 +876,12 @@ class CallableMixin(Base):
self = _mock_self
self.called = True
self.call_count += 1
- self.call_args = _Call((args, kwargs), two=True)
- self.call_args_list.append(_Call((args, kwargs), two=True))
-
_new_name = self._mock_new_name
_new_parent = self._mock_new_parent
+
+ _call = _Call((args, kwargs), two=True)
+ self.call_args = _call
+ self.call_args_list.append(_call)
self.mock_calls.append(_Call(('', args, kwargs)))
seen = set()
@@ -909,8 +936,6 @@ class CallableMixin(Base):
return result
ret_val = effect(*args, **kwargs)
- if ret_val is DEFAULT:
- ret_val = self.return_value
if (self._mock_wraps is not None and
self._mock_return_value is DEFAULT):
@@ -2030,6 +2055,8 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None,
elif spec is None:
# None we mock with a normal mock without a spec
_kwargs = {}
+ if _kwargs and instance:
+ _kwargs['_spec_as_instance'] = True
_kwargs.update(kwargs)
@@ -2096,10 +2123,12 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None,
if isinstance(spec, FunctionTypes):
parent = mock.mock
+ skipfirst = _must_skip(spec, entry, is_type)
+ kwargs['_eat_self'] = skipfirst
new = MagicMock(parent=parent, name=entry, _new_name=entry,
- _new_parent=parent, **kwargs)
+ _new_parent=parent,
+ **kwargs)
mock._mock_children[entry] = new
- skipfirst = _must_skip(spec, entry, is_type)
_check_signature(original, new, skipfirst=skipfirst)
# so functions created with _set_signature become instance attributes,
@@ -2113,6 +2142,10 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None,
def _must_skip(spec, entry, is_type):
+ """
+ Return whether we should skip the first argument on spec's `entry`
+ attribute.
+ """
if not isinstance(spec, type):
if entry in getattr(spec, '__dict__', {}):
# instance attribute - shouldn't skip
@@ -2125,7 +2158,12 @@ def _must_skip(spec, entry, is_type):
continue
if isinstance(result, (staticmethod, classmethod)):
return False
- return is_type
+ elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes):
+ # Normal method => skip if looked up on type
+ # (if looked up on instance, self is already skipped)
+ return is_type
+ else:
+ return False
# shouldn't get here unless function is a dynamically provided attribute
# XXXX untested behaviour
@@ -2159,9 +2197,31 @@ FunctionTypes = (
type(ANY.__eq__),
)
+MethodWrapperTypes = (
+ type(ANY.__eq__.__get__),
+)
+
file_spec = None
+def _iterate_read_data(read_data):
+ # Helper for mock_open:
+ # Retrieve lines from read_data via a generator so that separate calls to
+ # readline, read, and readlines are properly interleaved
+ data_as_list = ['{}\n'.format(l) for l in read_data.split('\n')]
+
+ if data_as_list[-1] == '\n':
+ # If the last line ended in a newline, the list comprehension will have an
+ # extra entry that's just a newline. Remove this.
+ data_as_list = data_as_list[:-1]
+ else:
+ # If there wasn't an extra newline by itself, then the file being
+ # emulated doesn't have a newline to end the last line remove the
+ # newline that our naive format() added
+ data_as_list[-1] = data_as_list[-1][:-1]
+
+ for line in data_as_list:
+ yield line
def mock_open(mock=None, read_data=''):
"""
@@ -2172,9 +2232,27 @@ def mock_open(mock=None, read_data=''):
default) then a `MagicMock` will be created for you, with the API limited
to methods or attributes available on standard file handles.
- `read_data` is a string for the `read` method of the file handle to return.
- This is an empty string by default.
+ `read_data` is a string for the `read` methoddline`, and `readlines` of the
+ file handle to return. This is an empty string by default.
"""
+ def _readlines_side_effect(*args, **kwargs):
+ if handle.readlines.return_value is not None:
+ return handle.readlines.return_value
+ return list(_data)
+
+ def _read_side_effect(*args, **kwargs):
+ if handle.read.return_value is not None:
+ return handle.read.return_value
+ return ''.join(_data)
+
+ def _readline_side_effect():
+ if handle.readline.return_value is not None:
+ while True:
+ yield handle.readline.return_value
+ for line in _data:
+ yield line
+
+
global file_spec
if file_spec is None:
import _io
@@ -2184,9 +2262,18 @@ def mock_open(mock=None, read_data=''):
mock = MagicMock(name='open', spec=open)
handle = MagicMock(spec=file_spec)
- handle.write.return_value = None
handle.__enter__.return_value = handle
- handle.read.return_value = read_data
+
+ _data = _iterate_read_data(read_data)
+
+ handle.write.return_value = None
+ handle.read.return_value = None
+ handle.readline.return_value = None
+ handle.readlines.return_value = None
+
+ handle.read.side_effect = _read_side_effect
+ handle.readline.side_effect = _readline_side_effect()
+ handle.readlines.side_effect = _readlines_side_effect
mock.return_value = handle
return mock
diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py
index 97e5426..f3f4b67 100644
--- a/Lib/unittest/result.py
+++ b/Lib/unittest/result.py
@@ -121,6 +121,22 @@ class TestResult(object):
self.failures.append((test, self._exc_info_to_string(err, test)))
self._mirrorOutput = True
+ @failfast
+ def addSubTest(self, test, subtest, err):
+ """Called at the end of a subtest.
+ 'err' is None if the subtest ended successfully, otherwise it's a
+ tuple of values as returned by sys.exc_info().
+ """
+ # By default, we don't do anything with successful subtests, but
+ # more sophisticated test results might want to record them.
+ if err is not None:
+ if issubclass(err[0], test.failureException):
+ errors = self.failures
+ else:
+ errors = self.errors
+ errors.append((subtest, self._exc_info_to_string(err, test)))
+ self._mirrorOutput = True
+
def addSuccess(self, test):
"Called when a test has completed successfully"
pass
diff --git a/Lib/unittest/test/support.py b/Lib/unittest/test/support.py
index dbe4ddc..02e8f3a 100644
--- a/Lib/unittest/test/support.py
+++ b/Lib/unittest/test/support.py
@@ -41,7 +41,7 @@ class TestHashing(object):
self.fail("Problem hashing %s and %s: %s" % (obj_1, obj_2, e))
-class LoggingResult(unittest.TestResult):
+class _BaseLoggingResult(unittest.TestResult):
def __init__(self, log):
self._events = log
super().__init__()
@@ -52,7 +52,7 @@ class LoggingResult(unittest.TestResult):
def startTestRun(self):
self._events.append('startTestRun')
- super(LoggingResult, self).startTestRun()
+ super().startTestRun()
def stopTest(self, test):
self._events.append('stopTest')
@@ -60,7 +60,7 @@ class LoggingResult(unittest.TestResult):
def stopTestRun(self):
self._events.append('stopTestRun')
- super(LoggingResult, self).stopTestRun()
+ super().stopTestRun()
def addFailure(self, *args):
self._events.append('addFailure')
@@ -68,7 +68,7 @@ class LoggingResult(unittest.TestResult):
def addSuccess(self, *args):
self._events.append('addSuccess')
- super(LoggingResult, self).addSuccess(*args)
+ super().addSuccess(*args)
def addError(self, *args):
self._events.append('addError')
@@ -76,15 +76,39 @@ class LoggingResult(unittest.TestResult):
def addSkip(self, *args):
self._events.append('addSkip')
- super(LoggingResult, self).addSkip(*args)
+ super().addSkip(*args)
def addExpectedFailure(self, *args):
self._events.append('addExpectedFailure')
- super(LoggingResult, self).addExpectedFailure(*args)
+ super().addExpectedFailure(*args)
def addUnexpectedSuccess(self, *args):
self._events.append('addUnexpectedSuccess')
- super(LoggingResult, self).addUnexpectedSuccess(*args)
+ super().addUnexpectedSuccess(*args)
+
+
+class LegacyLoggingResult(_BaseLoggingResult):
+ """
+ A legacy TestResult implementation, without an addSubTest method,
+ which records its method calls.
+ """
+
+ @property
+ def addSubTest(self):
+ raise AttributeError
+
+
+class LoggingResult(_BaseLoggingResult):
+ """
+ A TestResult implementation which records its method calls.
+ """
+
+ def addSubTest(self, test, subtest, err):
+ if err is None:
+ self._events.append('addSubTestSuccess')
+ else:
+ self._events.append('addSubTestFailure')
+ super().addSubTest(test, subtest, err)
class ResultWithNoStartTestRunStopTestRun(object):
diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py
index d171451..4987250 100644
--- a/Lib/unittest/test/test_case.py
+++ b/Lib/unittest/test/test_case.py
@@ -13,7 +13,7 @@ from test import support
import unittest
from .support import (
- TestEquality, TestHashing, LoggingResult,
+ TestEquality, TestHashing, LoggingResult, LegacyLoggingResult,
ResultWithNoStartTestRunStopTestRun
)
@@ -297,6 +297,98 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
Foo('test').run()
+ def _check_call_order__subtests(self, result, events, expected_events):
+ class Foo(Test.LoggingTestCase):
+ def test(self):
+ super(Foo, self).test()
+ for i in [1, 2, 3]:
+ with self.subTest(i=i):
+ if i == 1:
+ self.fail('failure')
+ for j in [2, 3]:
+ with self.subTest(j=j):
+ if i * j == 6:
+ raise RuntimeError('raised by Foo.test')
+ 1 / 0
+
+ # Order is the following:
+ # i=1 => subtest failure
+ # i=2, j=2 => subtest success
+ # i=2, j=3 => subtest error
+ # i=3, j=2 => subtest error
+ # i=3, j=3 => subtest success
+ # toplevel => error
+ Foo(events).run(result)
+ self.assertEqual(events, expected_events)
+
+ def test_run_call_order__subtests(self):
+ events = []
+ result = LoggingResult(events)
+ expected = ['startTest', 'setUp', 'test', 'tearDown',
+ 'addSubTestFailure', 'addSubTestSuccess',
+ 'addSubTestFailure', 'addSubTestFailure',
+ 'addSubTestSuccess', 'addError', 'stopTest']
+ self._check_call_order__subtests(result, events, expected)
+
+ def test_run_call_order__subtests_legacy(self):
+ # With a legacy result object (without a addSubTest method),
+ # text execution stops after the first subtest failure.
+ events = []
+ result = LegacyLoggingResult(events)
+ expected = ['startTest', 'setUp', 'test', 'tearDown',
+ 'addFailure', 'stopTest']
+ self._check_call_order__subtests(result, events, expected)
+
+ def _check_call_order__subtests_success(self, result, events, expected_events):
+ class Foo(Test.LoggingTestCase):
+ def test(self):
+ super(Foo, self).test()
+ for i in [1, 2]:
+ with self.subTest(i=i):
+ for j in [2, 3]:
+ with self.subTest(j=j):
+ pass
+
+ Foo(events).run(result)
+ self.assertEqual(events, expected_events)
+
+ def test_run_call_order__subtests_success(self):
+ events = []
+ result = LoggingResult(events)
+ # The 6 subtest successes are individually recorded, in addition
+ # to the whole test success.
+ expected = (['startTest', 'setUp', 'test', 'tearDown']
+ + 6 * ['addSubTestSuccess']
+ + ['addSuccess', 'stopTest'])
+ self._check_call_order__subtests_success(result, events, expected)
+
+ def test_run_call_order__subtests_success_legacy(self):
+ # With a legacy result, only the whole test success is recorded.
+ events = []
+ result = LegacyLoggingResult(events)
+ expected = ['startTest', 'setUp', 'test', 'tearDown',
+ 'addSuccess', 'stopTest']
+ self._check_call_order__subtests_success(result, events, expected)
+
+ def test_run_call_order__subtests_failfast(self):
+ events = []
+ result = LoggingResult(events)
+ result.failfast = True
+
+ class Foo(Test.LoggingTestCase):
+ def test(self):
+ super(Foo, self).test()
+ with self.subTest(i=1):
+ self.fail('failure')
+ with self.subTest(i=2):
+ self.fail('failure')
+ self.fail('failure')
+
+ expected = ['startTest', 'setUp', 'test', 'tearDown',
+ 'addSubTestFailure', 'stopTest']
+ Foo(events).run(result)
+ self.assertEqual(events, expected)
+
# "This class attribute gives the exception raised by the test() method.
# If a test framework needs to use a specialized exception, possibly to
# carry additional information, it must subclass this exception in
diff --git a/Lib/unittest/test/test_discovery.py b/Lib/unittest/test/test_discovery.py
index 1fdf991..eca348e 100644
--- a/Lib/unittest/test/test_discovery.py
+++ b/Lib/unittest/test/test_discovery.py
@@ -46,9 +46,9 @@ class TestDiscovery(unittest.TestCase):
def restore_isdir():
os.path.isdir = original_isdir
- path_lists = [['test1.py', 'test2.py', 'not_a_test.py', 'test_dir',
+ path_lists = [['test2.py', 'test1.py', 'not_a_test.py', 'test_dir',
'test.foo', 'test-not-a-module.py', 'another_dir'],
- ['test3.py', 'test4.py', ]]
+ ['test4.py', 'test3.py', ]]
os.listdir = lambda path: path_lists.pop(0)
self.addCleanup(restore_listdir)
@@ -70,6 +70,8 @@ class TestDiscovery(unittest.TestCase):
loader._top_level_dir = top_level
suite = list(loader._find_tests(top_level, 'test*.py'))
+ # The test suites found should be sorted alphabetically for reliable
+ # execution order.
expected = [name + ' module tests' for name in
('test1', 'test2')]
expected.extend([('test_dir.%s' % name) + ' module tests' for name in
@@ -132,6 +134,7 @@ class TestDiscovery(unittest.TestCase):
# and directly from the test_directory2 package
self.assertEqual(suite,
['load_tests', 'test_directory2' + ' module tests'])
+ # The test module paths should be sorted for reliable execution order
self.assertEqual(Module.paths, ['test_directory', 'test_directory2'])
# load_tests should have been called once with loader, tests and pattern
@@ -184,11 +187,9 @@ class TestDiscovery(unittest.TestCase):
self.assertEqual(_find_tests_args, [(start_dir, 'pattern')])
self.assertIn(top_level_dir, sys.path)
- def test_discover_with_modules_that_fail_to_import(self):
- loader = unittest.TestLoader()
-
+ def setup_import_issue_tests(self, fakefile):
listdir = os.listdir
- os.listdir = lambda _: ['test_this_does_not_exist.py']
+ os.listdir = lambda _: [fakefile]
isfile = os.path.isfile
os.path.isfile = lambda _: True
orig_sys_path = sys.path[:]
@@ -198,6 +199,11 @@ class TestDiscovery(unittest.TestCase):
sys.path[:] = orig_sys_path
self.addCleanup(restore)
+ def test_discover_with_modules_that_fail_to_import(self):
+ loader = unittest.TestLoader()
+
+ self.setup_import_issue_tests('test_this_does_not_exist.py')
+
suite = loader.discover('.')
self.assertIn(os.getcwd(), sys.path)
self.assertEqual(suite.countTestCases(), 1)
@@ -206,6 +212,22 @@ class TestDiscovery(unittest.TestCase):
with self.assertRaises(ImportError):
test.test_this_does_not_exist()
+ def test_discover_with_module_that_raises_SkipTest_on_import(self):
+ loader = unittest.TestLoader()
+
+ def _get_module_from_name(name):
+ raise unittest.SkipTest('skipperoo')
+ loader._get_module_from_name = _get_module_from_name
+
+ self.setup_import_issue_tests('test_skip_dummy.py')
+
+ suite = loader.discover('.')
+ self.assertEqual(suite.countTestCases(), 1)
+
+ result = unittest.TestResult()
+ suite.run(result)
+ self.assertEqual(len(result.skipped), 1)
+
def test_command_line_handling_parseArgs(self):
program = TestableTestProgram()
diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py
index 8a4b3fa..151f71e 100644
--- a/Lib/unittest/test/test_program.py
+++ b/Lib/unittest/test/test_program.py
@@ -64,6 +64,41 @@ class Test_TestProgram(unittest.TestCase):
return self.suiteClass(
[self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
+ def loadTestsFromNames(self, names, module):
+ return self.suiteClass(
+ [self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
+
+ def test_defaultTest_with_string(self):
+ class FakeRunner(object):
+ def run(self, test):
+ self.test = test
+ return True
+
+ old_argv = sys.argv
+ sys.argv = ['faketest']
+ runner = FakeRunner()
+ program = unittest.TestProgram(testRunner=runner, exit=False,
+ defaultTest='unittest.test',
+ testLoader=self.FooBarLoader())
+ sys.argv = old_argv
+ self.assertEqual(('unittest.test',), program.testNames)
+
+ def test_defaultTest_with_iterable(self):
+ class FakeRunner(object):
+ def run(self, test):
+ self.test = test
+ return True
+
+ old_argv = sys.argv
+ sys.argv = ['faketest']
+ runner = FakeRunner()
+ program = unittest.TestProgram(
+ testRunner=runner, exit=False,
+ defaultTest=['unittest.test', 'unittest.test2'],
+ testLoader=self.FooBarLoader())
+ sys.argv = old_argv
+ self.assertEqual(['unittest.test', 'unittest.test2'],
+ program.testNames)
def test_NonExit(self):
program = unittest.main(exit=False,
diff --git a/Lib/unittest/test/test_result.py b/Lib/unittest/test/test_result.py
index 1c58e61..6dd9bb0 100644
--- a/Lib/unittest/test/test_result.py
+++ b/Lib/unittest/test/test_result.py
@@ -227,6 +227,40 @@ class Test_TestResult(unittest.TestCase):
self.assertTrue(test_case is test)
self.assertIsInstance(formatted_exc, str)
+ def test_addSubTest(self):
+ class Foo(unittest.TestCase):
+ def test_1(self):
+ nonlocal subtest
+ with self.subTest(foo=1):
+ subtest = self._subtest
+ try:
+ 1/0
+ except ZeroDivisionError:
+ exc_info_tuple = sys.exc_info()
+ # Register an error by hand (to check the API)
+ result.addSubTest(test, subtest, exc_info_tuple)
+ # Now trigger a failure
+ self.fail("some recognizable failure")
+
+ subtest = None
+ test = Foo('test_1')
+ result = unittest.TestResult()
+
+ test.run(result)
+
+ self.assertFalse(result.wasSuccessful())
+ self.assertEqual(len(result.errors), 1)
+ self.assertEqual(len(result.failures), 1)
+ self.assertEqual(result.testsRun, 1)
+ self.assertEqual(result.shouldStop, False)
+
+ test_case, formatted_exc = result.errors[0]
+ self.assertIs(test_case, subtest)
+ self.assertIn("ZeroDivisionError", formatted_exc)
+ test_case, formatted_exc = result.failures[0]
+ self.assertIs(test_case, subtest)
+ self.assertIn("some recognizable failure", formatted_exc)
+
def testGetDescriptionWithoutDocstring(self):
result = unittest.TextTestResult(None, True, 1)
self.assertEqual(
@@ -234,6 +268,37 @@ class Test_TestResult(unittest.TestCase):
'testGetDescriptionWithoutDocstring (' + __name__ +
'.Test_TestResult)')
+ def testGetSubTestDescriptionWithoutDocstring(self):
+ with self.subTest(foo=1, bar=2):
+ result = unittest.TextTestResult(None, True, 1)
+ self.assertEqual(
+ result.getDescription(self._subtest),
+ 'testGetSubTestDescriptionWithoutDocstring (' + __name__ +
+ '.Test_TestResult) (bar=2, foo=1)')
+ with self.subTest('some message'):
+ result = unittest.TextTestResult(None, True, 1)
+ self.assertEqual(
+ result.getDescription(self._subtest),
+ 'testGetSubTestDescriptionWithoutDocstring (' + __name__ +
+ '.Test_TestResult) [some message]')
+
+ def testGetSubTestDescriptionWithoutDocstringAndParams(self):
+ with self.subTest():
+ result = unittest.TextTestResult(None, True, 1)
+ self.assertEqual(
+ result.getDescription(self._subtest),
+ 'testGetSubTestDescriptionWithoutDocstringAndParams '
+ '(' + __name__ + '.Test_TestResult) (<subtest>)')
+
+ def testGetNestedSubTestDescriptionWithoutDocstring(self):
+ with self.subTest(foo=1):
+ with self.subTest(bar=2):
+ result = unittest.TextTestResult(None, True, 1)
+ self.assertEqual(
+ result.getDescription(self._subtest),
+ 'testGetNestedSubTestDescriptionWithoutDocstring '
+ '(' + __name__ + '.Test_TestResult) (bar=2, foo=1)')
+
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def testGetDescriptionWithOneLineDocstring(self):
@@ -247,6 +312,18 @@ class Test_TestResult(unittest.TestCase):
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
+ def testGetSubTestDescriptionWithOneLineDocstring(self):
+ """Tests getDescription() for a method with a docstring."""
+ result = unittest.TextTestResult(None, True, 1)
+ with self.subTest(foo=1, bar=2):
+ self.assertEqual(
+ result.getDescription(self._subtest),
+ ('testGetSubTestDescriptionWithOneLineDocstring '
+ '(' + __name__ + '.Test_TestResult) (bar=2, foo=1)\n'
+ 'Tests getDescription() for a method with a docstring.'))
+
+ @unittest.skipIf(sys.flags.optimize >= 2,
+ "Docstrings are omitted with -O2 and above")
def testGetDescriptionWithMultiLineDocstring(self):
"""Tests getDescription() for a method with a longer docstring.
The second line of the docstring.
@@ -259,6 +336,21 @@ class Test_TestResult(unittest.TestCase):
'Tests getDescription() for a method with a longer '
'docstring.'))
+ @unittest.skipIf(sys.flags.optimize >= 2,
+ "Docstrings are omitted with -O2 and above")
+ def testGetSubTestDescriptionWithMultiLineDocstring(self):
+ """Tests getDescription() for a method with a longer docstring.
+ The second line of the docstring.
+ """
+ result = unittest.TextTestResult(None, True, 1)
+ with self.subTest(foo=1, bar=2):
+ self.assertEqual(
+ result.getDescription(self._subtest),
+ ('testGetSubTestDescriptionWithMultiLineDocstring '
+ '(' + __name__ + '.Test_TestResult) (bar=2, foo=1)\n'
+ 'Tests getDescription() for a method with a longer '
+ 'docstring.'))
+
def testStackFrameTrimming(self):
class Frame(object):
class tb_frame(object):
diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py
index e22e6bc..5a91f1b 100644
--- a/Lib/unittest/test/test_runner.py
+++ b/Lib/unittest/test/test_runner.py
@@ -5,6 +5,7 @@ import pickle
import subprocess
import unittest
+from unittest.case import _Outcome
from .support import LoggingResult, ResultWithNoStartTestRunStopTestRun
@@ -42,12 +43,8 @@ class TestCleanUp(unittest.TestCase):
def testNothing(self):
pass
- class MockOutcome(object):
- success = True
- errors = []
-
test = TestableTest('testNothing')
- test._outcomeForDoCleanups = MockOutcome
+ outcome = test._outcome = _Outcome()
exc1 = Exception('foo')
exc2 = Exception('bar')
@@ -61,9 +58,10 @@ class TestCleanUp(unittest.TestCase):
test.addCleanup(cleanup2)
self.assertFalse(test.doCleanups())
- self.assertFalse(MockOutcome.success)
+ self.assertFalse(outcome.success)
- (Type1, instance1, _), (Type2, instance2, _) = reversed(MockOutcome.errors)
+ ((_, (Type1, instance1, _)),
+ (_, (Type2, instance2, _))) = reversed(outcome.errors)
self.assertEqual((Type1, instance1), (Exception, exc1))
self.assertEqual((Type2, instance2), (Exception, exc2))
diff --git a/Lib/unittest/test/test_skipping.py b/Lib/unittest/test/test_skipping.py
index 952240e..3556932 100644
--- a/Lib/unittest/test/test_skipping.py
+++ b/Lib/unittest/test/test_skipping.py
@@ -29,6 +29,31 @@ class Test_TestSkipping(unittest.TestCase):
self.assertEqual(result.skipped, [(test, "testing")])
self.assertEqual(result.testsRun, 1)
+ def test_skipping_subtests(self):
+ class Foo(unittest.TestCase):
+ def test_skip_me(self):
+ with self.subTest(a=1):
+ with self.subTest(b=2):
+ self.skipTest("skip 1")
+ self.skipTest("skip 2")
+ self.skipTest("skip 3")
+ events = []
+ result = LoggingResult(events)
+ test = Foo("test_skip_me")
+ test.run(result)
+ self.assertEqual(events, ['startTest', 'addSkip', 'addSkip',
+ 'addSkip', 'stopTest'])
+ self.assertEqual(len(result.skipped), 3)
+ subtest, msg = result.skipped[0]
+ self.assertEqual(msg, "skip 1")
+ self.assertIsInstance(subtest, unittest.TestCase)
+ self.assertIsNot(subtest, test)
+ subtest, msg = result.skipped[1]
+ self.assertEqual(msg, "skip 2")
+ self.assertIsInstance(subtest, unittest.TestCase)
+ self.assertIsNot(subtest, test)
+ self.assertEqual(result.skipped[2], (test, "skip 3"))
+
def test_skipping_decorators(self):
op_table = ((unittest.skipUnless, False, True),
(unittest.skipIf, True, False))
@@ -95,6 +120,31 @@ class Test_TestSkipping(unittest.TestCase):
self.assertEqual(result.expectedFailures[0][0], test)
self.assertTrue(result.wasSuccessful())
+ def test_expected_failure_subtests(self):
+ # A failure in any subtest counts as the expected failure of the
+ # whole test.
+ class Foo(unittest.TestCase):
+ @unittest.expectedFailure
+ def test_die(self):
+ with self.subTest():
+ # This one succeeds
+ pass
+ with self.subTest():
+ self.fail("help me!")
+ with self.subTest():
+ # This one doesn't get executed
+ self.fail("shouldn't come here")
+ events = []
+ result = LoggingResult(events)
+ test = Foo("test_die")
+ test.run(result)
+ self.assertEqual(events,
+ ['startTest', 'addSubTestSuccess',
+ 'addExpectedFailure', 'stopTest'])
+ self.assertEqual(len(result.expectedFailures), 1)
+ self.assertIs(result.expectedFailures[0][0], test)
+ self.assertTrue(result.wasSuccessful())
+
def test_unexpected_success(self):
class Foo(unittest.TestCase):
@unittest.expectedFailure
@@ -110,6 +160,30 @@ class Test_TestSkipping(unittest.TestCase):
self.assertEqual(result.unexpectedSuccesses, [test])
self.assertTrue(result.wasSuccessful())
+ def test_unexpected_success_subtests(self):
+ # Success in all subtests counts as the unexpected success of
+ # the whole test.
+ class Foo(unittest.TestCase):
+ @unittest.expectedFailure
+ def test_die(self):
+ with self.subTest():
+ # This one succeeds
+ pass
+ with self.subTest():
+ # So does this one
+ pass
+ events = []
+ result = LoggingResult(events)
+ test = Foo("test_die")
+ test.run(result)
+ self.assertEqual(events,
+ ['startTest',
+ 'addSubTestSuccess', 'addSubTestSuccess',
+ 'addUnexpectedSuccess', 'stopTest'])
+ self.assertFalse(result.failures)
+ self.assertEqual(result.unexpectedSuccesses, [test])
+ self.assertTrue(result.wasSuccessful())
+
def test_skip_doesnt_run_setup(self):
class Foo(unittest.TestCase):
wasSetUp = False
diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py
index 8bfb293..8b2e96d 100644
--- a/Lib/unittest/test/testmock/testhelpers.py
+++ b/Lib/unittest/test/testmock/testhelpers.py
@@ -337,9 +337,10 @@ class SpecSignatureTest(unittest.TestCase):
def test_basic(self):
- for spec in (SomeClass, SomeClass()):
- mock = create_autospec(spec)
- self._check_someclass_mock(mock)
+ mock = create_autospec(SomeClass)
+ self._check_someclass_mock(mock)
+ mock = create_autospec(SomeClass())
+ self._check_someclass_mock(mock)
def test_create_autospec_return_value(self):
@@ -576,10 +577,10 @@ class SpecSignatureTest(unittest.TestCase):
def test_spec_inheritance_for_classes(self):
class Foo(object):
- def a(self):
+ def a(self, x):
pass
class Bar(object):
- def f(self):
+ def f(self, y):
pass
class_mock = create_autospec(Foo)
@@ -587,26 +588,30 @@ class SpecSignatureTest(unittest.TestCase):
self.assertIsNot(class_mock, class_mock())
for this_mock in class_mock, class_mock():
- this_mock.a()
- this_mock.a.assert_called_with()
- self.assertRaises(TypeError, this_mock.a, 'foo')
+ this_mock.a(x=5)
+ this_mock.a.assert_called_with(x=5)
+ this_mock.a.assert_called_with(5)
+ self.assertRaises(TypeError, this_mock.a, 'foo', 'bar')
self.assertRaises(AttributeError, getattr, this_mock, 'b')
instance_mock = create_autospec(Foo())
- instance_mock.a()
- instance_mock.a.assert_called_with()
- self.assertRaises(TypeError, instance_mock.a, 'foo')
+ instance_mock.a(5)
+ instance_mock.a.assert_called_with(5)
+ instance_mock.a.assert_called_with(x=5)
+ self.assertRaises(TypeError, instance_mock.a, 'foo', 'bar')
self.assertRaises(AttributeError, getattr, instance_mock, 'b')
# The return value isn't isn't callable
self.assertRaises(TypeError, instance_mock)
- instance_mock.Bar.f()
- instance_mock.Bar.f.assert_called_with()
+ instance_mock.Bar.f(6)
+ instance_mock.Bar.f.assert_called_with(6)
+ instance_mock.Bar.f.assert_called_with(y=6)
self.assertRaises(AttributeError, getattr, instance_mock.Bar, 'g')
- instance_mock.Bar().f()
- instance_mock.Bar().f.assert_called_with()
+ instance_mock.Bar().f(6)
+ instance_mock.Bar().f.assert_called_with(6)
+ instance_mock.Bar().f.assert_called_with(y=6)
self.assertRaises(AttributeError, getattr, instance_mock.Bar(), 'g')
@@ -663,12 +668,15 @@ class SpecSignatureTest(unittest.TestCase):
self.assertRaises(TypeError, mock)
mock(1, 2)
mock.assert_called_with(1, 2)
+ mock.assert_called_with(1, b=2)
+ mock.assert_called_with(a=1, b=2)
f.f = f
mock = create_autospec(f)
self.assertRaises(TypeError, mock.f)
mock.f(3, 4)
mock.f.assert_called_with(3, 4)
+ mock.f.assert_called_with(a=3, b=4)
def test_skip_attributeerrors(self):
@@ -704,9 +712,13 @@ class SpecSignatureTest(unittest.TestCase):
self.assertRaises(TypeError, mock)
mock(1)
mock.assert_called_once_with(1)
+ mock.assert_called_once_with(a=1)
+ self.assertRaises(AssertionError, mock.assert_called_once_with, 2)
mock(4, 5)
mock.assert_called_with(4, 5)
+ mock.assert_called_with(a=4, b=5)
+ self.assertRaises(AssertionError, mock.assert_called_with, a=5, b=4)
def test_class_with_no_init(self):
@@ -719,24 +731,27 @@ class SpecSignatureTest(unittest.TestCase):
def test_signature_callable(self):
class Callable(object):
- def __init__(self):
+ def __init__(self, x, y):
pass
def __call__(self, a):
pass
mock = create_autospec(Callable)
- mock()
- mock.assert_called_once_with()
+ mock(1, 2)
+ mock.assert_called_once_with(1, 2)
+ mock.assert_called_once_with(x=1, y=2)
self.assertRaises(TypeError, mock, 'a')
- instance = mock()
+ instance = mock(1, 2)
self.assertRaises(TypeError, instance)
instance(a='a')
+ instance.assert_called_once_with('a')
instance.assert_called_once_with(a='a')
instance('a')
instance.assert_called_with('a')
+ instance.assert_called_with(a='a')
- mock = create_autospec(Callable())
+ mock = create_autospec(Callable(1, 2))
mock(a='a')
mock.assert_called_once_with(a='a')
self.assertRaises(TypeError, mock)
@@ -779,7 +794,11 @@ class SpecSignatureTest(unittest.TestCase):
pass
a = create_autospec(Foo)
+ a.f(10)
+ a.f.assert_called_with(10)
+ a.f.assert_called_with(self=10)
a.f(self=10)
+ a.f.assert_called_with(10)
a.f.assert_called_with(self=10)
diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py
index 3d0776c..127786c 100644
--- a/Lib/unittest/test/testmock/testmock.py
+++ b/Lib/unittest/test/testmock/testmock.py
@@ -25,6 +25,18 @@ class Iter(object):
__next__ = next
+class Something(object):
+ def meth(self, a, b, c, d=None):
+ pass
+
+ @classmethod
+ def cmeth(cls, a, b, c, d=None):
+ pass
+
+ @staticmethod
+ def smeth(a, b, c, d=None):
+ pass
+
class MockTest(unittest.TestCase):
@@ -273,6 +285,43 @@ class MockTest(unittest.TestCase):
mock.assert_called_with(1, 2, 3, a='fish', b='nothing')
+ def test_assert_called_with_function_spec(self):
+ def f(a, b, c, d=None):
+ pass
+
+ mock = Mock(spec=f)
+
+ mock(1, b=2, c=3)
+ mock.assert_called_with(1, 2, 3)
+ mock.assert_called_with(a=1, b=2, c=3)
+ self.assertRaises(AssertionError, mock.assert_called_with,
+ 1, b=3, c=2)
+ # Expected call doesn't match the spec's signature
+ with self.assertRaises(AssertionError) as cm:
+ mock.assert_called_with(e=8)
+ self.assertIsInstance(cm.exception.__cause__, TypeError)
+
+
+ def test_assert_called_with_method_spec(self):
+ def _check(mock):
+ mock(1, b=2, c=3)
+ mock.assert_called_with(1, 2, 3)
+ mock.assert_called_with(a=1, b=2, c=3)
+ self.assertRaises(AssertionError, mock.assert_called_with,
+ 1, b=3, c=2)
+
+ mock = Mock(spec=Something().meth)
+ _check(mock)
+ mock = Mock(spec=Something.cmeth)
+ _check(mock)
+ mock = Mock(spec=Something().cmeth)
+ _check(mock)
+ mock = Mock(spec=Something.smeth)
+ _check(mock)
+ mock = Mock(spec=Something().smeth)
+ _check(mock)
+
+
def test_assert_called_once_with(self):
mock = Mock()
mock()
@@ -297,6 +346,29 @@ class MockTest(unittest.TestCase):
)
+ def test_assert_called_once_with_function_spec(self):
+ def f(a, b, c, d=None):
+ pass
+
+ mock = Mock(spec=f)
+
+ mock(1, b=2, c=3)
+ mock.assert_called_once_with(1, 2, 3)
+ mock.assert_called_once_with(a=1, b=2, c=3)
+ self.assertRaises(AssertionError, mock.assert_called_once_with,
+ 1, b=3, c=2)
+ # Expected call doesn't match the spec's signature
+ with self.assertRaises(AssertionError) as cm:
+ mock.assert_called_once_with(e=8)
+ self.assertIsInstance(cm.exception.__cause__, TypeError)
+ # Mock called more than once => always fails
+ mock(4, 5, 6)
+ self.assertRaises(AssertionError, mock.assert_called_once_with,
+ 1, 2, 3)
+ self.assertRaises(AssertionError, mock.assert_called_once_with,
+ 4, 5, 6)
+
+
def test_attribute_access_returns_mocks(self):
mock = Mock()
something = mock.something
@@ -995,6 +1067,39 @@ class MockTest(unittest.TestCase):
)
+ def test_assert_has_calls_with_function_spec(self):
+ def f(a, b, c, d=None):
+ pass
+
+ mock = Mock(spec=f)
+
+ mock(1, b=2, c=3)
+ mock(4, 5, c=6, d=7)
+ mock(10, 11, c=12)
+ calls = [
+ ('', (1, 2, 3), {}),
+ ('', (4, 5, 6), {'d': 7}),
+ ((10, 11, 12), {}),
+ ]
+ mock.assert_has_calls(calls)
+ mock.assert_has_calls(calls, any_order=True)
+ mock.assert_has_calls(calls[1:])
+ mock.assert_has_calls(calls[1:], any_order=True)
+ mock.assert_has_calls(calls[:-1])
+ mock.assert_has_calls(calls[:-1], any_order=True)
+ # Reversed order
+ calls = list(reversed(calls))
+ with self.assertRaises(AssertionError):
+ mock.assert_has_calls(calls)
+ mock.assert_has_calls(calls, any_order=True)
+ with self.assertRaises(AssertionError):
+ mock.assert_has_calls(calls[1:])
+ mock.assert_has_calls(calls[1:], any_order=True)
+ with self.assertRaises(AssertionError):
+ mock.assert_has_calls(calls[:-1])
+ mock.assert_has_calls(calls[:-1], any_order=True)
+
+
def test_assert_any_call(self):
mock = Mock()
mock(1, 2)
@@ -1021,6 +1126,26 @@ class MockTest(unittest.TestCase):
)
+ def test_assert_any_call_with_function_spec(self):
+ def f(a, b, c, d=None):
+ pass
+
+ mock = Mock(spec=f)
+
+ mock(1, b=2, c=3)
+ mock(4, 5, c=6, d=7)
+ mock.assert_any_call(1, 2, 3)
+ mock.assert_any_call(a=1, b=2, c=3)
+ mock.assert_any_call(4, 5, 6, 7)
+ mock.assert_any_call(a=4, b=5, c=6, d=7)
+ self.assertRaises(AssertionError, mock.assert_any_call,
+ 1, b=3, c=2)
+ # Expected call doesn't match the spec's signature
+ with self.assertRaises(AssertionError) as cm:
+ mock.assert_any_call(e=8)
+ self.assertIsInstance(cm.exception.__cause__, TypeError)
+
+
def test_mock_calls_create_autospec(self):
def f(a, b):
pass
diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py
index 0a0cfad..f54e051 100644
--- a/Lib/unittest/test/testmock/testwith.py
+++ b/Lib/unittest/test/testmock/testwith.py
@@ -172,5 +172,88 @@ class TestMockOpen(unittest.TestCase):
self.assertEqual(result, 'foo')
+ def test_readline_data(self):
+ # Check that readline will return all the lines from the fake file
+ mock = mock_open(read_data='foo\nbar\nbaz\n')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ line1 = h.readline()
+ line2 = h.readline()
+ line3 = h.readline()
+ self.assertEqual(line1, 'foo\n')
+ self.assertEqual(line2, 'bar\n')
+ self.assertEqual(line3, 'baz\n')
+
+ # Check that we properly emulate a file that doesn't end in a newline
+ mock = mock_open(read_data='foo')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ result = h.readline()
+ self.assertEqual(result, 'foo')
+
+
+ def test_readlines_data(self):
+ # Test that emulating a file that ends in a newline character works
+ mock = mock_open(read_data='foo\nbar\nbaz\n')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ result = h.readlines()
+ self.assertEqual(result, ['foo\n', 'bar\n', 'baz\n'])
+
+ # Test that files without a final newline will also be correctly
+ # emulated
+ mock = mock_open(read_data='foo\nbar\nbaz')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ result = h.readlines()
+
+ self.assertEqual(result, ['foo\n', 'bar\n', 'baz'])
+
+
+ def test_mock_open_read_with_argument(self):
+ # At one point calling read with an argument was broken
+ # for mocks returned by mock_open
+ some_data = 'foo\nbar\nbaz'
+ mock = mock_open(read_data=some_data)
+ self.assertEqual(mock().read(10), some_data)
+
+
+ def test_interleaved_reads(self):
+ # Test that calling read, readline, and readlines pulls data
+ # sequentially from the data we preload with
+ mock = mock_open(read_data='foo\nbar\nbaz\n')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ line1 = h.readline()
+ rest = h.readlines()
+ self.assertEqual(line1, 'foo\n')
+ self.assertEqual(rest, ['bar\n', 'baz\n'])
+
+ mock = mock_open(read_data='foo\nbar\nbaz\n')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ line1 = h.readline()
+ rest = h.read()
+ self.assertEqual(line1, 'foo\n')
+ self.assertEqual(rest, 'bar\nbaz\n')
+
+
+ def test_overriding_return_values(self):
+ mock = mock_open(read_data='foo')
+ handle = mock()
+
+ handle.read.return_value = 'bar'
+ handle.readline.return_value = 'bar'
+ handle.readlines.return_value = ['bar']
+
+ self.assertEqual(handle.read(), 'bar')
+ self.assertEqual(handle.readline(), 'bar')
+ self.assertEqual(handle.readlines(), ['bar'])
+
+ # call repeatedly to check that a StopIteration is not propagated
+ self.assertEqual(handle.readline(), 'bar')
+ self.assertEqual(handle.readline(), 'bar')
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/Lib/urllib/error.py b/Lib/urllib/error.py
index b712ebb..45b7169 100644
--- a/Lib/urllib/error.py
+++ b/Lib/urllib/error.py
@@ -1,6 +1,6 @@
"""Exception classes raised by urllib.
-The base exception class is URLError, which inherits from IOError. It
+The base exception class is URLError, which inherits from OSError. It
doesn't define any behavior of its own, but is the base class for all
exceptions defined in this package.
@@ -17,11 +17,11 @@ __all__ = ['URLError', 'HTTPError', 'ContentTooShortError']
# do these error classes make sense?
-# make sure all of the IOError stuff is overridden. we just want to be
+# make sure all of the OSError stuff is overridden. we just want to be
# subtypes.
-class URLError(IOError):
- # URLError is a sub-type of IOError, but it doesn't share any of
+class URLError(OSError):
+ # URLError is a sub-type of OSError, but it doesn't share any of
# the implementation. need to override __init__ and __str__.
# It sets self.args for compatibility with other EnvironmentError
# subclasses, but args doesn't have the typical format with errno in
@@ -61,9 +61,13 @@ class HTTPError(URLError, urllib.response.addinfourl):
def reason(self):
return self.msg
- def info(self):
+ @property
+ def headers(self):
return self.hdrs
+ @headers.setter
+ def headers(self, headers):
+ self.hdrs = headers
# exception raised when downloaded size does not match content-length
class ContentTooShortError(URLError):
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index abe5d0d..b49b7a1 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -846,7 +846,6 @@ def splittype(url):
"""splittype('type:opaquestring') --> 'type', 'opaquestring'."""
global _typeprog
if _typeprog is None:
- import re
_typeprog = re.compile('^([^/:]+):')
match = _typeprog.match(url)
@@ -860,7 +859,6 @@ def splithost(url):
"""splithost('//host[:port]/path') --> 'host[:port]', '/path'."""
global _hostprog
if _hostprog is None:
- import re
_hostprog = re.compile('^//([^/?]*)(.*)$')
match = _hostprog.match(url)
@@ -877,7 +875,6 @@ def splituser(host):
"""splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
global _userprog
if _userprog is None:
- import re
_userprog = re.compile('^(.*)@(.*)$')
match = _userprog.match(host)
@@ -889,7 +886,6 @@ def splitpasswd(user):
"""splitpasswd('user:passwd') -> 'user', 'passwd'."""
global _passwdprog
if _passwdprog is None:
- import re
_passwdprog = re.compile('^([^:]*):(.*)$',re.S)
match = _passwdprog.match(user)
@@ -902,7 +898,6 @@ def splitport(host):
"""splitport('host:port') --> 'host', 'port'."""
global _portprog
if _portprog is None:
- import re
_portprog = re.compile('^(.*):([0-9]+)$')
match = _portprog.match(host)
@@ -917,7 +912,6 @@ def splitnport(host, defport=-1):
Return None if ':' but not a valid number."""
global _nportprog
if _nportprog is None:
- import re
_nportprog = re.compile('^(.*):(.*)$')
match = _nportprog.match(host)
@@ -936,7 +930,6 @@ def splitquery(url):
"""splitquery('/path?query') --> '/path', 'query'."""
global _queryprog
if _queryprog is None:
- import re
_queryprog = re.compile('^(.*)\?([^?]*)$')
match = _queryprog.match(url)
@@ -948,7 +941,6 @@ def splittag(url):
"""splittag('/path#tag') --> '/path', 'tag'."""
global _tagprog
if _tagprog is None:
- import re
_tagprog = re.compile('^(.*)#([^#]*)$')
match = _tagprog.match(url)
@@ -966,7 +958,6 @@ def splitvalue(attr):
"""splitvalue('attr=value') --> 'attr', 'value'."""
global _valueprog
if _valueprog is None:
- import re
_valueprog = re.compile('^([^=]*)=(.*)$')
match = _valueprog.match(attr)
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index a7445d1..4765a94 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -18,7 +18,7 @@ urlopen(url, data=None) -- Basic usage is the same as original
urllib. pass the url and optionally data to post to an HTTP URL, and
get a file-like object back. One difference is that you can also pass
a Request instance instead of URL. Raises a URLError (subclass of
-IOError); for HTTP errors, raises an HTTPError, which can also be
+OSError); for HTTP errors, raises an HTTPError, which can also be
treated as a valid response.
build_opener -- Function that creates a new OpenerDirector instance.
@@ -103,7 +103,8 @@ from urllib.error import URLError, HTTPError, ContentTooShortError
from urllib.parse import (
urlparse, urlsplit, urljoin, unwrap, quote, unquote,
splittype, splithost, splitport, splituser, splitpasswd,
- splitattr, splitquery, splitvalue, splittag, to_bytes, urlunparse)
+ splitattr, splitquery, splitvalue, splittag, to_bytes,
+ unquote_to_bytes, urlunparse)
from urllib.response import addinfourl, addclosehook
# check for SSL
@@ -121,7 +122,7 @@ __all__ = [
'HTTPPasswordMgr', 'HTTPPasswordMgrWithDefaultRealm',
'AbstractBasicAuthHandler', 'HTTPBasicAuthHandler', 'ProxyBasicAuthHandler',
'AbstractDigestAuthHandler', 'HTTPDigestAuthHandler', 'ProxyDigestAuthHandler',
- 'HTTPHandler', 'FileHandler', 'FTPHandler', 'CacheFTPHandler',
+ 'HTTPHandler', 'FileHandler', 'FTPHandler', 'CacheFTPHandler', 'DataHandler',
'UnknownHandler', 'HTTPErrorProcessor',
# Functions
'urlopen', 'install_opener', 'build_opener',
@@ -227,7 +228,7 @@ def urlcleanup():
for temp_file in _url_tempfiles:
try:
os.unlink(temp_file)
- except EnvironmentError:
+ except OSError:
pass
del _url_tempfiles[:]
@@ -258,24 +259,59 @@ class Request:
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
- # unwrap('<URL:type://host/path>') --> 'type://host/path'
- self.full_url = unwrap(url)
- self.full_url, self.fragment = splittag(self.full_url)
- self.data = data
+ self.full_url = url
self.headers = {}
+ self.unredirected_hdrs = {}
+ self._data = None
+ self.data = data
self._tunnel_host = None
for key, value in headers.items():
self.add_header(key, value)
- self.unredirected_hdrs = {}
if origin_req_host is None:
origin_req_host = request_host(self)
self.origin_req_host = origin_req_host
self.unverifiable = unverifiable
self.method = method
+
+ @property
+ def full_url(self):
+ if self.fragment:
+ return '{}#{}'.format(self._full_url, self.fragment)
+ return self._full_url
+
+ @full_url.setter
+ def full_url(self, url):
+ # unwrap('<URL:type://host/path>') --> 'type://host/path'
+ self._full_url = unwrap(url)
+ self._full_url, self.fragment = splittag(self._full_url)
self._parse()
+ @full_url.deleter
+ def full_url(self):
+ self._full_url = None
+ self.fragment = None
+ self.selector = ''
+
+ @property
+ def data(self):
+ return self._data
+
+ @data.setter
+ def data(self, data):
+ if data != self._data:
+ self._data = data
+ # issue 16464
+ # if we change data we need to remove content-length header
+ # (cause it's most probably calculated for previous value)
+ if self.has_header("Content-length"):
+ self.remove_header("Content-length")
+
+ @data.deleter
+ def data(self):
+ self.data = None
+
def _parse(self):
- self.type, rest = splittype(self.full_url)
+ self.type, rest = splittype(self._full_url)
if self.type is None:
raise ValueError("unknown url type: %r" % self.full_url)
self.host, self.selector = splithost(rest)
@@ -292,54 +328,7 @@ class Request:
return "GET"
def get_full_url(self):
- if self.fragment:
- return '%s#%s' % (self.full_url, self.fragment)
- else:
- return self.full_url
-
- # Begin deprecated methods
-
- def add_data(self, data):
- msg = "Request.add_data method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- self.data = data
-
- def has_data(self):
- msg = "Request.has_data method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.data is not None
-
- def get_data(self):
- msg = "Request.get_data method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.data
-
- def get_type(self):
- msg = "Request.get_type method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.type
-
- def get_host(self):
- msg = "Request.get_host method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.host
-
- def get_selector(self):
- msg = "Request.get_selector method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.selector
-
- def is_unverifiable(self):
- msg = "Request.is_unverifiable method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.unverifiable
-
- def get_origin_req_host(self):
- msg = "Request.get_origin_req_host method is deprecated."
- warnings.warn(msg, DeprecationWarning, stacklevel=1)
- return self.origin_req_host
-
- # End deprecated methods
+ return self.full_url
def set_proxy(self, host, type):
if self.type == 'https' and not self._tunnel_host:
@@ -369,6 +358,10 @@ class Request:
header_name,
self.unredirected_hdrs.get(header_name, default))
+ def remove_header(self, header_name):
+ self.headers.pop(header_name, None)
+ self.unredirected_hdrs.pop(header_name, None)
+
def header_items(self):
hdrs = self.unredirected_hdrs.copy()
hdrs.update(self.headers)
@@ -531,7 +524,8 @@ def build_opener(*handlers):
opener = OpenerDirector()
default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
- FTPHandler, FileHandler, HTTPErrorProcessor]
+ FTPHandler, FileHandler, HTTPErrorProcessor,
+ DataHandler]
if hasattr(http.client, "HTTPSConnection"):
default_classes.append(HTTPSHandler)
skip = set()
@@ -1246,11 +1240,17 @@ class AbstractHTTPHandler(BaseHandler):
try:
h.request(req.get_method(), req.selector, req.data, headers)
- except socket.error as err: # timeout error
+ except OSError as err: # timeout error
h.close()
raise URLError(err)
else:
r = h.getresponse()
+ # If the server does not send us a 'Connection: close' header,
+ # HTTPConnection assumes the socket should be left open. Manually
+ # mark the socket to be closed when this response object goes away.
+ if h.sock:
+ h.sock.close()
+ h.sock = None
r.url = req.get_full_url()
# This line replaces the .msg attribute of the HTTPResponse
@@ -1445,7 +1445,7 @@ class FTPHandler(BaseHandler):
try:
host = socket.gethostbyname(host)
- except socket.error as msg:
+ except OSError as msg:
raise URLError(msg)
path, attrs = splitattr(req.selector)
dirs = path.split('/')
@@ -1531,6 +1531,36 @@ class CacheFTPHandler(FTPHandler):
self.cache.clear()
self.timeout.clear()
+class DataHandler(BaseHandler):
+ def data_open(self, req):
+ # data URLs as specified in RFC 2397.
+ #
+ # ignores POSTed data
+ #
+ # syntax:
+ # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
+ # mediatype := [ type "/" subtype ] *( ";" parameter )
+ # data := *urlchar
+ # parameter := attribute "=" value
+ url = req.full_url
+
+ scheme, data = url.split(":",1)
+ mediatype, data = data.split(",",1)
+
+ # even base64 encoded data URLs might be quoted so unquote in any case:
+ data = unquote_to_bytes(data)
+ if mediatype.endswith(";base64"):
+ data = base64.decodebytes(data)
+ mediatype = mediatype[:-7]
+
+ if not mediatype:
+ mediatype = "text/plain;charset=US-ASCII"
+
+ headers = email.message_from_string("Content-type: %s\nContent-length: %d\n" %
+ (mediatype, len(data)))
+
+ return addinfourl(io.BytesIO(data), headers, url)
+
# Code move from the old urllib module
@@ -1654,20 +1684,20 @@ class URLopener:
return getattr(self, name)(url)
else:
return getattr(self, name)(url, data)
- except HTTPError:
+ except (HTTPError, URLError):
raise
- except socket.error as msg:
- raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
+ except OSError as msg:
+ raise OSError('socket error', msg).with_traceback(sys.exc_info()[2])
def open_unknown(self, fullurl, data=None):
"""Overridable interface to open unknown URL type."""
type, url = splittype(fullurl)
- raise IOError('url error', 'unknown url type', type)
+ raise OSError('url error', 'unknown url type', type)
def open_unknown_proxy(self, proxy, fullurl, data=None):
"""Overridable interface to open unknown URL type."""
type, url = splittype(fullurl)
- raise IOError('url error', 'invalid proxy for %s' % type, proxy)
+ raise OSError('url error', 'invalid proxy for %s' % type, proxy)
# External interface
def retrieve(self, url, filename=None, reporthook=None, data=None):
@@ -1683,7 +1713,7 @@ class URLopener:
hdrs = fp.info()
fp.close()
return url2pathname(splithost(url1)[1]), hdrs
- except IOError as msg:
+ except OSError as msg:
pass
fp = self.open(url, data)
try:
@@ -1776,7 +1806,7 @@ class URLopener:
if proxy_bypass(realhost):
host = realhost
- if not host: raise IOError('http error', 'no host given')
+ if not host: raise OSError('http error', 'no host given')
if proxy_passwd:
proxy_passwd = unquote(proxy_passwd)
@@ -1849,7 +1879,7 @@ class URLopener:
return self.http_error_default(url, fp, errcode, errmsg, headers)
def http_error_default(self, url, fp, errcode, errmsg, headers):
- """Default error handler: close the connection and raise IOError."""
+ """Default error handler: close the connection and raise OSError."""
fp.close()
raise HTTPError(url, errcode, errmsg, headers, None)
@@ -1976,7 +2006,7 @@ class URLopener:
try:
[type, data] = url.split(',', 1)
except ValueError:
- raise IOError('data error', 'bad data URL')
+ raise OSError('data error', 'bad data URL')
if not type:
type = 'text/plain;charset=US-ASCII'
semi = type.rfind(';')
@@ -2425,7 +2455,7 @@ def _proxy_bypass_macosx_sysconf(host, proxy_settings):
try:
hostIP = socket.gethostbyname(hostonly)
hostIP = ip2num(hostIP)
- except socket.error:
+ except OSError:
continue
base = ip2num(m.group(1))
@@ -2511,7 +2541,7 @@ elif os.name == 'nt':
proxies['https'] = 'https://%s' % proxyServer
proxies['ftp'] = 'ftp://%s' % proxyServer
internetSettings.Close()
- except (WindowsError, ValueError, TypeError):
+ except (OSError, ValueError, TypeError):
# Either registry key not found etc, or the value in an
# unexpected format.
# proxies already set up to be empty so nothing to do
@@ -2541,7 +2571,7 @@ elif os.name == 'nt':
proxyOverride = str(winreg.QueryValueEx(internetSettings,
'ProxyOverride')[0])
# ^^^^ Returned as Unicode but problems if not converted to ASCII
- except WindowsError:
+ except OSError:
return 0
if not proxyEnable or not proxyOverride:
return 0
@@ -2552,13 +2582,13 @@ elif os.name == 'nt':
addr = socket.gethostbyname(rawHost)
if addr != rawHost:
host.append(addr)
- except socket.error:
+ except OSError:
pass
try:
fqdn = socket.getfqdn(rawHost)
if fqdn != rawHost:
host.append(fqdn)
- except socket.error:
+ except OSError:
pass
# make a check value list from the registry entry: replace the
# '<local>' string by the localhost entry and the corresponding
diff --git a/Lib/uuid.py b/Lib/uuid.py
index 049b46c..0cdcd38 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -329,7 +329,7 @@ def _find_mac(command, args, hw_identifiers, get_index):
if words[i] in hw_identifiers:
return int(
words[get_index(i)].replace(':', ''), 16)
- except IOError:
+ except OSError:
continue
return None
@@ -371,7 +371,7 @@ def _ipconfig_getnode():
for dir in dirs:
try:
pipe = os.popen(os.path.join(dir, 'ipconfig') + ' /all')
- except IOError:
+ except OSError:
continue
else:
for line in pipe:
diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
index 272a887..4adde5f 100644
--- a/Lib/venv/__init__.py
+++ b/Lib/venv/__init__.py
@@ -87,6 +87,14 @@ class EnvBuilder:
self.setup_scripts(context)
self.post_setup(context)
+ def clear_directory(self, path):
+ for fn in os.listdir(path):
+ fn = os.path.join(path, fn)
+ if os.path.islink(fn) or os.path.isfile(fn):
+ os.remove(fn)
+ elif os.path.isdir(fn):
+ shutil.rmtree(fn)
+
def ensure_directories(self, env_dir):
"""
Create the directories for the environment.
@@ -98,11 +106,11 @@ class EnvBuilder:
def create_if_needed(d):
if not os.path.exists(d):
os.makedirs(d)
+ elif os.path.islink(d) or os.path.isfile(d):
+ raise ValueError('Unable to create directory %r' % d)
- if os.path.exists(env_dir) and not (self.clear or self.upgrade):
- raise ValueError('Directory exists: %s' % env_dir)
if os.path.exists(env_dir) and self.clear:
- shutil.rmtree(env_dir)
+ self.clear_directory(env_dir)
context = types.SimpleNamespace()
context.env_dir = env_dir
context.env_name = os.path.split(env_dir)[1]
@@ -373,11 +381,10 @@ def main(args=None):
'when symlinks are not the default for '
'the platform.')
parser.add_argument('--clear', default=False, action='store_true',
- dest='clear', help='Delete the environment '
- 'directory if it already '
- 'exists. If not specified and '
- 'the directory exists, an error'
- ' is raised.')
+ dest='clear', help='Delete the contents of the '
+ 'environment directory if it '
+ 'already exists, before '
+ 'environment creation.')
parser.add_argument('--upgrade', default=False, action='store_true',
dest='upgrade', help='Upgrade the environment '
'directory to use this version '
diff --git a/Lib/venv/scripts/nt/Activate.ps1 b/Lib/venv/scripts/nt/Activate.ps1
index 1c5ef98..df78963 100644
--- a/Lib/venv/scripts/nt/Activate.ps1
+++ b/Lib/venv/scripts/nt/Activate.ps1
@@ -1,25 +1,40 @@
-$env:VIRTUAL_ENV="__VENV_DIR__"
+function global:deactivate ([switch]$NonDestructive) {
+ # Revert to original values
+ if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
+ copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
+ remove-item function:_OLD_VIRTUAL_PROMPT
+ }
-# Revert to original values
-if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
- copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
- remove-item function:_OLD_VIRTUAL_PROMPT
-}
+ if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
+ copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
+ remove-item env:_OLD_VIRTUAL_PYTHONHOME
+ }
-if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
- copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
- remove-item env:_OLD_VIRTUAL_PYTHONHOME
-}
+ if (Test-Path env:_OLD_VIRTUAL_PATH) {
+ copy-item env:_OLD_VIRTUAL_PATH env:PATH
+ remove-item env:_OLD_VIRTUAL_PATH
+ }
-if (Test-Path env:_OLD_VIRTUAL_PATH) {
- copy-item env:_OLD_VIRTUAL_PATH env:PATH
- remove-item env:_OLD_VIRTUAL_PATH
+ if (Test-Path env:VIRTUAL_ENV) {
+ remove-item env:VIRTUAL_ENV
+ }
+
+ if (!$NonDestructive) {
+ # Self destruct!
+ remove-item function:deactivate
+ }
}
+deactivate -nondestructive
+
+$env:VIRTUAL_ENV="__VENV_DIR__"
+
# Set the prompt to include the env name
+# Make sure _OLD_VIRTUAL_PROMPT is global
+function global:_OLD_VIRTUAL_PROMPT {""}
copy-item function:prompt function:_OLD_VIRTUAL_PROMPT
-function prompt {
- Write-Host -NoNewline -ForegroundColor Green '[__VENV_NAME__]'
+function global:prompt {
+ Write-Host -NoNewline -ForegroundColor Green '__VENV_NAME__'
_OLD_VIRTUAL_PROMPT
}
diff --git a/Lib/venv/scripts/nt/Deactivate.ps1 b/Lib/venv/scripts/nt/Deactivate.ps1
deleted file mode 100644
index 3d1e96b..0000000
--- a/Lib/venv/scripts/nt/Deactivate.ps1
+++ /dev/null
@@ -1,19 +0,0 @@
-# Revert to original values
-if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
- copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
- remove-item function:_OLD_VIRTUAL_PROMPT
-}
-
-if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
- copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
- remove-item env:_OLD_VIRTUAL_PYTHONHOME
-}
-
-if (Test-Path env:_OLD_VIRTUAL_PATH) {
- copy-item env:_OLD_VIRTUAL_PATH env:PATH
- remove-item env:_OLD_VIRTUAL_PATH
-}
-
-if (Test-Path env:VIRTUAL_ENV) {
- remove-item env:VIRTUAL_ENV
-}
diff --git a/Lib/venv/scripts/posix/activate.csh b/Lib/venv/scripts/posix/activate.csh
new file mode 100644
index 0000000..99d79e0
--- /dev/null
+++ b/Lib/venv/scripts/posix/activate.csh
@@ -0,0 +1,37 @@
+# This file must be used with "source bin/activate.csh" *from csh*.
+# You cannot run it directly.
+# Created by Davide Di Blasi <davidedb@gmail.com>.
+# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
+
+alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
+
+# Unset irrelavent variables.
+deactivate nondestructive
+
+setenv VIRTUAL_ENV "__VENV_DIR__"
+
+set _OLD_VIRTUAL_PATH="$PATH"
+setenv PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH"
+
+
+set _OLD_VIRTUAL_PROMPT="$prompt"
+
+if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
+ if ("__VENV_NAME__" != "") then
+ set env_name = "__VENV_NAME__"
+ else
+ if (`basename "VIRTUAL_ENV"` == "__") then
+ # special case for Aspen magic directories
+ # see http://www.zetadev.com/software/aspen/
+ set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
+ else
+ set env_name = `basename "$VIRTUAL_ENV"`
+ endif
+ endif
+ set prompt = "[$env_name] $prompt"
+ unset env_name
+endif
+
+alias pydoc python -m pydoc
+
+rehash
diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish
new file mode 100644
index 0000000..5ac1638
--- /dev/null
+++ b/Lib/venv/scripts/posix/activate.fish
@@ -0,0 +1,74 @@
+# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
+# you cannot run it directly
+
+function deactivate -d "Exit virtualenv and return to normal shell environment"
+ # reset old environment variables
+ if test -n "$_OLD_VIRTUAL_PATH"
+ set -gx PATH $_OLD_VIRTUAL_PATH
+ set -e _OLD_VIRTUAL_PATH
+ end
+ if test -n "$_OLD_VIRTUAL_PYTHONHOME"
+ set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
+ set -e _OLD_VIRTUAL_PYTHONHOME
+ end
+
+ if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
+ functions -e fish_prompt
+ set -e _OLD_FISH_PROMPT_OVERRIDE
+ . ( begin
+ printf "function fish_prompt\n\t#"
+ functions _old_fish_prompt
+ end | psub )
+ functions -e _old_fish_prompt
+ end
+
+ set -e VIRTUAL_ENV
+ if test "$argv[1]" != "nondestructive"
+ # Self destruct!
+ functions -e deactivate
+ end
+end
+
+# unset irrelavent variables
+deactivate nondestructive
+
+set -gx VIRTUAL_ENV "__VENV_DIR__"
+
+set -gx _OLD_VIRTUAL_PATH $PATH
+set -gx PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__" $PATH
+
+# unset PYTHONHOME if set
+if set -q PYTHONHOME
+ set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
+ set -e PYTHONHOME
+end
+
+if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
+ # fish uses a function instead of an env var to generate the prompt.
+
+ # save the current fish_prompt function as the function _old_fish_prompt
+ . ( begin
+ printf "function _old_fish_prompt\n\t#"
+ functions fish_prompt
+ end | psub )
+
+ # with the original prompt function renamed, we can override with our own.
+ function fish_prompt
+ # Prompt override?
+ if test -n "__VENV_NAME__"
+ printf "%s%s%s" "__VENV_NAME__" (set_color normal) (_old_fish_prompt)
+ return
+ end
+ # ...Otherwise, prepend env
+ set -l _checkbase (basename "$VIRTUAL_ENV")
+ if test $_checkbase = "__"
+ # special case for Aspen magic directories
+ # see http://www.zetadev.com/software/aspen/
+ printf "%s[%s]%s %s" (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) (_old_fish_prompt)
+ else
+ printf "%s(%s)%s%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) (_old_fish_prompt)
+ end
+ end
+
+ set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
+end
diff --git a/Lib/warnings.py b/Lib/warnings.py
index edbbb5e..b05a08e 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -16,7 +16,7 @@ def showwarning(message, category, filename, lineno, file=None, line=None):
file = sys.stderr
try:
file.write(formatwarning(message, category, filename, lineno, line))
- except IOError:
+ except OSError:
pass # the file (probably stderr) is invalid - this warning gets lost.
def formatwarning(message, category, filename, lineno, line=None):
diff --git a/Lib/wave.py b/Lib/wave.py
index 54f0302..f43569e 100644
--- a/Lib/wave.py
+++ b/Lib/wave.py
@@ -18,7 +18,7 @@ This returns an instance of a class with the following public methods:
getcomptype() -- returns compression type ('NONE' for linear samples)
getcompname() -- returns human-readable version of
compression type ('not compressed' linear samples)
- getparams() -- returns a tuple consisting of all of the
+ getparams() -- returns a namedtuple consisting of all of the
above in the above order
getmarkers() -- returns None (for compatibility with the
aifc module)
@@ -82,14 +82,13 @@ WAVE_FORMAT_PCM = 0x0001
_array_fmts = None, 'b', 'h', None, 'l'
-# Determine endian-ness
import struct
-if struct.pack("h", 1) == b"\000\001":
- big_endian = 1
-else:
- big_endian = 0
-
+import sys
from chunk import Chunk
+from collections import namedtuple
+
+_result = namedtuple('params',
+ 'nchannels sampwidth framerate nframes comptype compname')
class Wave_read:
"""Variables used in this class:
@@ -168,6 +167,13 @@ class Wave_read:
def __del__(self):
self.close()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
#
# User visible methods.
#
@@ -206,9 +212,9 @@ class Wave_read:
return self._compname
def getparams(self):
- return self.getnchannels(), self.getsampwidth(), \
- self.getframerate(), self.getnframes(), \
- self.getcomptype(), self.getcompname()
+ return _result(self.getnchannels(), self.getsampwidth(),
+ self.getframerate(), self.getnframes(),
+ self.getcomptype(), self.getcompname())
def getmarkers(self):
return None
@@ -231,7 +237,7 @@ class Wave_read:
self._data_seek_needed = 0
if nframes == 0:
return b''
- if self._sampwidth > 1 and big_endian:
+ if self._sampwidth > 1 and sys.byteorder == 'big':
# unfortunately the fromfile() method does not take
# something that only looks like a file object, so
# we have to reach into the innards of the chunk object
@@ -324,6 +330,12 @@ class Wave_write:
def __del__(self):
self.close()
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
#
# User visible methods.
#
@@ -398,8 +410,8 @@ class Wave_write:
def getparams(self):
if not self._nchannels or not self._sampwidth or not self._framerate:
raise Error('not all parameters set')
- return self._nchannels, self._sampwidth, self._framerate, \
- self._nframes, self._comptype, self._compname
+ return _result(self._nchannels, self._sampwidth, self._framerate,
+ self._nframes, self._comptype, self._compname)
def setmark(self, id, pos, name):
raise Error('setmark() not supported')
@@ -418,7 +430,7 @@ class Wave_write:
nframes = len(data) // (self._sampwidth * self._nchannels)
if self._convert:
data = self._convert(data)
- if self._sampwidth > 1 and big_endian:
+ if self._sampwidth > 1 and sys.byteorder == 'big':
import array
data = array.array(_array_fmts[self._sampwidth], data)
data.byteswap()
@@ -436,11 +448,13 @@ class Wave_write:
def close(self):
if self._file:
- self._ensure_header_written(0)
- if self._datalength != self._datawritten:
- self._patchheader()
- self._file.flush()
- self._file = None
+ try:
+ self._ensure_header_written(0)
+ if self._datalength != self._datawritten:
+ self._patchheader()
+ self._file.flush()
+ finally:
+ self._file = None
if self._i_opened_the_file:
self._i_opened_the_file.close()
self._i_opened_the_file = None
diff --git a/Lib/weakref.py b/Lib/weakref.py
index fcb6b74..f6a40ca 100644
--- a/Lib/weakref.py
+++ b/Lib/weakref.py
@@ -21,13 +21,69 @@ from _weakref import (
from _weakrefset import WeakSet, _IterationGuard
import collections # Import after _weakref to avoid circular import.
+import sys
+import itertools
ProxyTypes = (ProxyType, CallableProxyType)
__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs",
"WeakKeyDictionary", "ReferenceType", "ProxyType",
"CallableProxyType", "ProxyTypes", "WeakValueDictionary",
- "WeakSet"]
+ "WeakSet", "WeakMethod", "finalize"]
+
+
+class WeakMethod(ref):
+ """
+ A custom `weakref.ref` subclass which simulates a weak reference to
+ a bound method, working around the lifetime problem of bound methods.
+ """
+
+ __slots__ = "_func_ref", "_meth_type", "_alive", "__weakref__"
+
+ def __new__(cls, meth, callback=None):
+ try:
+ obj = meth.__self__
+ func = meth.__func__
+ except AttributeError:
+ raise TypeError("argument should be a bound method, not {}"
+ .format(type(meth))) from None
+ def _cb(arg):
+ # The self-weakref trick is needed to avoid creating a reference
+ # cycle.
+ self = self_wr()
+ if self._alive:
+ self._alive = False
+ if callback is not None:
+ callback(self)
+ self = ref.__new__(cls, obj, _cb)
+ self._func_ref = ref(func, _cb)
+ self._meth_type = type(meth)
+ self._alive = True
+ self_wr = ref(self)
+ return self
+
+ def __call__(self):
+ obj = super().__call__()
+ func = self._func_ref()
+ if obj is None or func is None:
+ return None
+ return self._meth_type(func, obj)
+
+ def __eq__(self, other):
+ if isinstance(other, WeakMethod):
+ if not self._alive or not other._alive:
+ return self is other
+ return ref.__eq__(self, other) and self._func_ref == other._func_ref
+ return False
+
+ def __ne__(self, other):
+ if isinstance(other, WeakMethod):
+ if not self._alive or not other._alive:
+ return self is not other
+ return ref.__ne__(self, other) or self._func_ref != other._func_ref
+ return True
+
+ __hash__ = ref.__hash__
class WeakValueDictionary(collections.MutableMapping):
@@ -153,8 +209,7 @@ class WeakValueDictionary(collections.MutableMapping):
"""
with _IterationGuard(self):
- for wr in self.data.values():
- yield wr
+ yield from self.data.values()
def values(self):
with _IterationGuard(self):
@@ -383,3 +438,140 @@ class WeakKeyDictionary(collections.MutableMapping):
d[ref(key, self._remove)] = value
if len(kwargs):
self.update(kwargs)
+
+
+class finalize:
+ """Class for finalization of weakrefable objects
+
+ finalize(obj, func, *args, **kwargs) returns a callable finalizer
+ object which will be called when obj is garbage collected. The
+ first time the finalizer is called it evaluates func(*arg, **kwargs)
+ and returns the result. After this the finalizer is dead, and
+ calling it just returns None.
+
+ When the program exits any remaining finalizers for which the
+ atexit attribute is true will be run in reverse order of creation.
+ By default atexit is true.
+ """
+
+ # Finalizer objects don't have any state of their own. They are
+ # just used as keys to lookup _Info objects in the registry. This
+ # ensures that they cannot be part of a ref-cycle.
+
+ __slots__ = ()
+ _registry = {}
+ _shutdown = False
+ _index_iter = itertools.count()
+ _dirty = False
+ _registered_with_atexit = False
+
+ class _Info:
+ __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index")
+
+ def __init__(self, obj, func, *args, **kwargs):
+ if not self._registered_with_atexit:
+ # We may register the exit function more than once because
+ # of a thread race, but that is harmless
+ import atexit
+ atexit.register(self._exitfunc)
+ finalize._registered_with_atexit = True
+ info = self._Info()
+ info.weakref = ref(obj, self)
+ info.func = func
+ info.args = args
+ info.kwargs = kwargs or None
+ info.atexit = True
+ info.index = next(self._index_iter)
+ self._registry[self] = info
+ finalize._dirty = True
+
+ def __call__(self, _=None):
+ """If alive then mark as dead and return func(*args, **kwargs);
+ otherwise return None"""
+ info = self._registry.pop(self, None)
+ if info and not self._shutdown:
+ return info.func(*info.args, **(info.kwargs or {}))
+
+ def detach(self):
+ """If alive then mark as dead and return (obj, func, args, kwargs);
+ otherwise return None"""
+ info = self._registry.get(self)
+ obj = info and info.weakref()
+ if obj is not None and self._registry.pop(self, None):
+ return (obj, info.func, info.args, info.kwargs or {})
+
+ def peek(self):
+ """If alive then return (obj, func, args, kwargs);
+ otherwise return None"""
+ info = self._registry.get(self)
+ obj = info and info.weakref()
+ if obj is not None:
+ return (obj, info.func, info.args, info.kwargs or {})
+
+ @property
+ def alive(self):
+ """Whether finalizer is alive"""
+ return self in self._registry
+
+ @property
+ def atexit(self):
+ """Whether finalizer should be called at exit"""
+ info = self._registry.get(self)
+ return bool(info) and info.atexit
+
+ @atexit.setter
+ def atexit(self, value):
+ info = self._registry.get(self)
+ if info:
+ info.atexit = bool(value)
+
+ def __repr__(self):
+ info = self._registry.get(self)
+ obj = info and info.weakref()
+ if obj is None:
+ return '<%s object at %#x; dead>' % (type(self).__name__, id(self))
+ else:
+ return '<%s object at %#x; for %r at %#x>' % \
+ (type(self).__name__, id(self), type(obj).__name__, id(obj))
+
+ @classmethod
+ def _select_for_exit(cls):
+ # Return live finalizers marked for exit, oldest first
+ L = [(f,i) for (f,i) in cls._registry.items() if i.atexit]
+ L.sort(key=lambda item:item[1].index)
+ return [f for (f,i) in L]
+
+ @classmethod
+ def _exitfunc(cls):
+ # At shutdown invoke finalizers for which atexit is true.
+ # This is called once all other non-daemonic threads have been
+ # joined.
+ reenable_gc = False
+ try:
+ if cls._registry:
+ import gc
+ if gc.isenabled():
+ reenable_gc = True
+ gc.disable()
+ pending = None
+ while True:
+ if pending is None or finalize._dirty:
+ pending = cls._select_for_exit()
+ finalize._dirty = False
+ if not pending:
+ break
+ f = pending.pop()
+ try:
+ # gc is disabled, so (assuming no daemonic
+ # threads) the following is the only line in
+ # this function which might trigger creation
+ # of a new finalizer
+ f()
+ except Exception:
+ sys.excepthook(*sys.exc_info())
+ assert f not in cls._registry
+ finally:
+ # prevent any more finalizers from executing during shutdown
+ finalize._shutdown = True
+ if reenable_gc:
+ gc.enable()
diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
index 945eda4..2714bd1 100644
--- a/Lib/webbrowser.py
+++ b/Lib/webbrowser.py
@@ -5,6 +5,7 @@
import io
import os
import shlex
+import shutil
import sys
import stat
import subprocess
@@ -83,7 +84,7 @@ def _synthesize(browser, update_tryorder=1):
"""
cmd = browser.split()[0]
- if not _iscommand(cmd):
+ if not shutil.which(cmd):
return [None, None]
name = os.path.basename(cmd)
try:
@@ -102,38 +103,6 @@ def _synthesize(browser, update_tryorder=1):
return [None, None]
-if sys.platform[:3] == "win":
- def _isexecutable(cmd):
- cmd = cmd.lower()
- if os.path.isfile(cmd) and cmd.endswith((".exe", ".bat")):
- return True
- for ext in ".exe", ".bat":
- if os.path.isfile(cmd + ext):
- return True
- return False
-else:
- def _isexecutable(cmd):
- if os.path.isfile(cmd):
- mode = os.stat(cmd)[stat.ST_MODE]
- if mode & stat.S_IXUSR or mode & stat.S_IXGRP or mode & stat.S_IXOTH:
- return True
- return False
-
-def _iscommand(cmd):
- """Return True if cmd is executable or can be found on the executable
- search path."""
- if _isexecutable(cmd):
- return True
- path = os.environ.get("PATH")
- if not path:
- return False
- for d in path.split(os.pathsep):
- exe = os.path.join(d, cmd)
- if _isexecutable(exe):
- return True
- return False
-
-
# General parent classes
class BaseBrowser(object):
@@ -418,11 +387,11 @@ class Grail(BaseBrowser):
# need to PING each one until we find one that's live
try:
s.connect(fn)
- except socket.error:
+ except OSError:
# no good; attempt to clean it out, but don't fail:
try:
os.unlink(fn)
- except IOError:
+ except OSError:
pass
else:
return s
@@ -453,22 +422,22 @@ class Grail(BaseBrowser):
def register_X_browsers():
# use xdg-open if around
- if _iscommand("xdg-open"):
+ if shutil.which("xdg-open"):
register("xdg-open", None, BackgroundBrowser("xdg-open"))
# The default GNOME3 browser
- if "GNOME_DESKTOP_SESSION_ID" in os.environ and _iscommand("gvfs-open"):
+ if "GNOME_DESKTOP_SESSION_ID" in os.environ and shutil.which("gvfs-open"):
register("gvfs-open", None, BackgroundBrowser("gvfs-open"))
# The default GNOME browser
- if "GNOME_DESKTOP_SESSION_ID" in os.environ and _iscommand("gnome-open"):
+ if "GNOME_DESKTOP_SESSION_ID" in os.environ and shutil.which("gnome-open"):
register("gnome-open", None, BackgroundBrowser("gnome-open"))
# The default KDE browser
- if "KDE_FULL_SESSION" in os.environ and _iscommand("kfmclient"):
+ if "KDE_FULL_SESSION" in os.environ and shutil.which("kfmclient"):
register("kfmclient", Konqueror, Konqueror("kfmclient"))
- if _iscommand("x-www-browser"):
+ if shutil.which("x-www-browser"):
register("x-www-browser", None, BackgroundBrowser("x-www-browser"))
# The Mozilla/Netscape browsers
@@ -476,39 +445,39 @@ def register_X_browsers():
"mozilla-firebird", "firebird",
"iceweasel", "iceape",
"seamonkey", "mozilla", "netscape"):
- if _iscommand(browser):
+ if shutil.which(browser):
register(browser, None, Mozilla(browser))
# Konqueror/kfm, the KDE browser.
- if _iscommand("kfm"):
+ if shutil.which("kfm"):
register("kfm", Konqueror, Konqueror("kfm"))
- elif _iscommand("konqueror"):
+ elif shutil.which("konqueror"):
register("konqueror", Konqueror, Konqueror("konqueror"))
# Gnome's Galeon and Epiphany
for browser in ("galeon", "epiphany"):
- if _iscommand(browser):
+ if shutil.which(browser):
register(browser, None, Galeon(browser))
# Skipstone, another Gtk/Mozilla based browser
- if _iscommand("skipstone"):
+ if shutil.which("skipstone"):
register("skipstone", None, BackgroundBrowser("skipstone"))
# Google Chrome/Chromium browsers
for browser in ("google-chrome", "chrome", "chromium", "chromium-browser"):
- if _iscommand(browser):
+ if shutil.which(browser):
register(browser, None, Chrome(browser))
# Opera, quite popular
- if _iscommand("opera"):
+ if shutil.which("opera"):
register("opera", None, Opera("opera"))
# Next, Mosaic -- old but still in use.
- if _iscommand("mosaic"):
+ if shutil.which("mosaic"):
register("mosaic", None, BackgroundBrowser("mosaic"))
# Grail, the Python browser. Does anybody still use it?
- if _iscommand("grail"):
+ if shutil.which("grail"):
register("grail", Grail, None)
# Prefer X browsers if present
@@ -517,18 +486,18 @@ if os.environ.get("DISPLAY"):
# Also try console browsers
if os.environ.get("TERM"):
- if _iscommand("www-browser"):
+ if shutil.which("www-browser"):
register("www-browser", None, GenericBrowser("www-browser"))
# The Links/elinks browsers <http://artax.karlin.mff.cuni.cz/~mikulas/links/>
- if _iscommand("links"):
+ if shutil.which("links"):
register("links", None, GenericBrowser("links"))
- if _iscommand("elinks"):
+ if shutil.which("elinks"):
register("elinks", None, Elinks("elinks"))
# The Lynx browser <http://lynx.isc.org/>, <http://lynx.browser.org/>
- if _iscommand("lynx"):
+ if shutil.which("lynx"):
register("lynx", None, GenericBrowser("lynx"))
# The w3m browser <http://w3m.sourceforge.net/>
- if _iscommand("w3m"):
+ if shutil.which("w3m"):
register("w3m", None, GenericBrowser("w3m"))
#
@@ -540,7 +509,7 @@ if sys.platform[:3] == "win":
def open(self, url, new=0, autoraise=True):
try:
os.startfile(url)
- except WindowsError:
+ except OSError:
# [Error 22] No application is associated with the specified
# file for this operation: '<URL>'
return False
@@ -558,7 +527,7 @@ if sys.platform[:3] == "win":
"Internet Explorer\\IEXPLORE.EXE")
for browser in ("firefox", "firebird", "seamonkey", "mozilla",
"netscape", "opera", iexplore):
- if _iscommand(browser):
+ if shutil.which(browser):
register(browser, None, BackgroundBrowser(browser))
#
@@ -644,17 +613,6 @@ if sys.platform == 'darwin':
register("MacOSX", None, MacOSXOSAScript('default'), -1)
-#
-# Platform support for OS/2
-#
-
-if sys.platform[:3] == "os2" and _iscommand("netscape"):
- _tryorder = []
- _browsers = {}
- register("os2netscape", None,
- GenericBrowser(["start", "netscape", "%s"]), -1)
-
-
# OK, now that we know what the default preference orders for each
# platform are, allow user to override them with the BROWSER variable.
if "BROWSER" in os.environ:
diff --git a/Lib/xml/dom/expatbuilder.py b/Lib/xml/dom/expatbuilder.py
index f074ab9..81e2df7 100644
--- a/Lib/xml/dom/expatbuilder.py
+++ b/Lib/xml/dom/expatbuilder.py
@@ -905,11 +905,8 @@ def parse(file, namespaces=True):
builder = ExpatBuilder()
if isinstance(file, str):
- fp = open(file, 'rb')
- try:
+ with open(file, 'rb') as fp:
result = builder.parseFile(fp)
- finally:
- fp.close()
else:
result = builder.parseFile(file)
return result
@@ -939,11 +936,8 @@ def parseFragment(file, context, namespaces=True):
builder = FragmentBuilder(context)
if isinstance(file, str):
- fp = open(file, 'rb')
- try:
+ with open(file, 'rb') as fp:
result = builder.parseFile(fp)
- finally:
- fp.close()
else:
result = builder.parseFile(file)
return result
diff --git a/Lib/xml/etree/ElementInclude.py b/Lib/xml/etree/ElementInclude.py
index 6cc1b44..73e491e 100644
--- a/Lib/xml/etree/ElementInclude.py
+++ b/Lib/xml/etree/ElementInclude.py
@@ -71,8 +71,8 @@ class FatalIncludeError(SyntaxError):
# @return The expanded resource. If the parse mode is "xml", this
# is an ElementTree instance. If the parse mode is "text", this
# is a Unicode string. If the loader fails, it can return None
-# or raise an IOError exception.
-# @throws IOError If the loader fails to load the resource.
+# or raise an OSError exception.
+# @throws OSError If the loader fails to load the resource.
def default_loader(href, parse, encoding=None):
if parse == "xml":
@@ -95,7 +95,7 @@ def default_loader(href, parse, encoding=None):
# that implements the same interface as <b>default_loader</b>.
# @throws FatalIncludeError If the function fails to include a given
# resource, or if the tree contains malformed XInclude elements.
-# @throws IOError If the function fails to load a given resource.
+# @throws OSError If the function fails to load a given resource.
def include(elem, loader=None):
if loader is None:
diff --git a/Lib/xml/etree/ElementPath.py b/Lib/xml/etree/ElementPath.py
index e7015c7..d914ddb 100644
--- a/Lib/xml/etree/ElementPath.py
+++ b/Lib/xml/etree/ElementPath.py
@@ -105,14 +105,12 @@ def prepare_child(next, token):
def prepare_star(next, token):
def select(context, result):
for elem in result:
- for e in elem:
- yield e
+ yield from elem
return select
def prepare_self(next, token):
def select(context, result):
- for elem in result:
- yield elem
+ yield from result
return select
def prepare_descendant(next, token):
@@ -176,7 +174,7 @@ def prepare_predicate(next, token):
if elem.get(key) == value:
yield elem
return select
- if signature == "-" and not re.match("\d+$", predicate[0]):
+ if signature == "-" and not re.match("\-?\d+$", predicate[0]):
# [tag]
tag = predicate[0]
def select(context, result):
@@ -184,7 +182,7 @@ def prepare_predicate(next, token):
if elem.find(tag) is not None:
yield elem
return select
- if signature == "-='" and not re.match("\d+$", predicate[0]):
+ if signature == "-='" and not re.match("\-?\d+$", predicate[0]):
# [tag='value']
tag = predicate[0]
value = predicate[-1]
@@ -198,7 +196,10 @@ def prepare_predicate(next, token):
if signature == "-" or signature == "-()" or signature == "-()-":
# [index] or [last()] or [last()-index]
if signature == "-":
+ # [index]
index = int(predicate[0]) - 1
+ if index < 0:
+ raise SyntaxError("XPath position >= 1 expected")
else:
if predicate[0] != "last":
raise SyntaxError("unsupported function")
@@ -207,6 +208,8 @@ def prepare_predicate(next, token):
index = int(predicate[2]) - 1
except ValueError:
raise SyntaxError("unsupported expression")
+ if index > -2:
+ raise SyntaxError("XPath offset from last() must be negative")
else:
index = -1
def select(context, result):
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index a8e5729..bb34bb3 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -1,28 +1,47 @@
+"""Lightweight XML support for Python.
+
+ XML is an inherently hierarchical data format, and the most natural way to
+ represent it is with a tree. This module has two classes for this purpose:
+
+ 1. ElementTree represents the whole XML document as a tree and
+
+ 2. Element represents a single node in this tree.
+
+ Interactions with the whole document (reading and writing to/from files) are
+ usually done on the ElementTree level. Interactions with a single XML element
+ and its sub-elements are done on the Element level.
+
+ Element is a flexible container object designed to store hierarchical data
+ structures in memory. It can be described as a cross between a list and a
+ dictionary. Each Element has a number of properties associated with it:
+
+ 'tag' - a string containing the element's name.
+
+ 'attributes' - a Python dictionary storing the element's attributes.
+
+ 'text' - a string containing the element's text content.
+
+ 'tail' - an optional string containing text after the element's end tag.
+
+ And a number of child elements stored in a Python sequence.
+
+ To create an element instance, use the Element constructor,
+ or the SubElement factory function.
+
+ You can also use the ElementTree class to wrap an element structure
+ and convert it to and from XML.
+
+"""
+
+#---------------------------------------------------------------------
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/psf/license for licensing details.
#
# ElementTree
-# $Id: ElementTree.py 3440 2008-07-18 14:45:01Z fredrik $
-#
-# light-weight XML support for Python 2.3 and later.
-#
-# history (since 1.2.6):
-# 2005-11-12 fl added tostringlist/fromstringlist helpers
-# 2006-07-05 fl merged in selected changes from the 1.3 sandbox
-# 2006-07-05 fl removed support for 2.1 and earlier
-# 2007-06-21 fl added deprecation/future warnings
-# 2007-08-25 fl added doctype hook, added parser version attribute etc
-# 2007-08-26 fl added new serializer code (better namespace handling, etc)
-# 2007-08-27 fl warn for broken /tag searches on tree level
-# 2007-09-02 fl added html/text methods to serializer (experimental)
-# 2007-09-05 fl added method argument to tostring/tostringlist
-# 2007-09-06 fl improved error handling
-# 2007-09-13 fl added itertext, iterfind; assorted cleanups
-# 2007-12-15 fl added C14N hooks, copy method (experimental)
-#
# Copyright (c) 1999-2008 by Fredrik Lundh. All rights reserved.
#
# fredrik@pythonware.com
# http://www.pythonware.com
-#
# --------------------------------------------------------------------
# The ElementTree toolkit is
#
@@ -51,9 +70,6 @@
# OF THIS SOFTWARE.
# --------------------------------------------------------------------
-# Licensed to PSF under a Contributor Agreement.
-# See http://www.python.org/psf/license for licensing details.
-
__all__ = [
# public symbols
"Comment",
@@ -69,34 +85,12 @@ __all__ = [
"TreeBuilder",
"VERSION",
"XML", "XMLID",
- "XMLParser", "XMLTreeBuilder",
+ "XMLParser",
"register_namespace",
]
VERSION = "1.3.0"
-##
-# The <b>Element</b> type is a flexible container object, designed to
-# store hierarchical data structures in memory. The type can be
-# described as a cross between a list and a dictionary.
-# <p>
-# Each element has a number of properties associated with it:
-# <ul>
-# <li>a <i>tag</i>. This is a string identifying what kind of data
-# this element represents (the element type, in other words).</li>
-# <li>a number of <i>attributes</i>, stored in a Python dictionary.</li>
-# <li>a <i>text</i> string.</li>
-# <li>an optional <i>tail</i> string.</li>
-# <li>a number of <i>child elements</i>, stored in a Python sequence</li>
-# </ul>
-#
-# To create an element instance, use the {@link #Element} constructor
-# or the {@link #SubElement} factory function.
-# <p>
-# The {@link #ElementTree} class can be used to wrap an element
-# structure, and convert it from and to XML.
-##
-
import sys
import re
import warnings
@@ -106,81 +100,68 @@ import contextlib
from . import ElementPath
-##
-# Parser error. This is a subclass of <b>SyntaxError</b>.
-# <p>
-# In addition to the exception value, an exception instance contains a
-# specific exception code in the <b>code</b> attribute, and the line and
-# column of the error in the <b>position</b> attribute.
-
class ParseError(SyntaxError):
+ """An error when parsing an XML document.
+
+ In addition to its exception value, a ParseError contains
+ two extra attributes:
+ 'code' - the specific exception code
+ 'position' - the line and column of the error
+
+ """
pass
# --------------------------------------------------------------------
-##
-# Checks if an object appears to be a valid element object.
-#
-# @param An element instance.
-# @return A true value if this is an element object.
-# @defreturn flag
def iselement(element):
- # FIXME: not sure about this;
- # isinstance(element, Element) or look for tag/attrib/text attributes
+ """Return True if *element* appears to be an Element."""
return hasattr(element, 'tag')
-##
-# Element class. This class defines the Element interface, and
-# provides a reference implementation of this interface.
-# <p>
-# The element name, attribute names, and attribute values can be
-# either ASCII strings (ordinary Python strings containing only 7-bit
-# ASCII characters) or Unicode strings.
-#
-# @param tag The element name.
-# @param attrib An optional dictionary, containing element attributes.
-# @param **extra Additional attributes, given as keyword arguments.
-# @see Element
-# @see SubElement
-# @see Comment
-# @see ProcessingInstruction
class Element:
- # <tag attrib>text<child/>...</tag>tail
+ """An XML element.
- ##
- # (Attribute) Element tag.
+ This class is the reference implementation of the Element interface.
- tag = None
+ An element's length is its number of subelements. That means if you
+ you want to check if an element is truly empty, you should check BOTH
+ its length AND its text attribute.
- ##
- # (Attribute) Element attribute dictionary. Where possible, use
- # {@link #Element.get},
- # {@link #Element.set},
- # {@link #Element.keys}, and
- # {@link #Element.items} to access
- # element attributes.
+ The element tag, attribute names, and attribute values can be either
+ bytes or strings.
- attrib = None
+ *tag* is the element name. *attrib* is an optional dictionary containing
+ element attributes. *extra* are additional element attributes given as
+ keyword arguments.
+
+ Example form:
+ <tag attrib>text<child/>...</tag>tail
+
+ """
- ##
- # (Attribute) Text before first subelement. This is either a
- # string or the value None. Note that if there was no text, this
- # attribute may be either None or an empty string, depending on
- # the parser.
+ tag = None
+ """The element's name."""
+
+ attrib = None
+ """Dictionary of the element's attributes."""
text = None
+ """
+ Text before first subelement. This is either a string or the value None.
+ Note that if there is no text, this attribute may be either
+ None or the empty string, depending on the parser.
- ##
- # (Attribute) Text after this element's end tag, but before the
- # next sibling element's start tag. This is either a string or
- # the value None. Note that if there was no text, this attribute
- # may be either None or an empty string, depending on the parser.
+ """
- tail = None # text after end tag, if any
+ tail = None
+ """
+ Text after this element's end tag, but before the next sibling element's
+ start tag. This is either a string or the value None. Note that if there
+ was no text, this attribute may be either None or an empty string,
+ depending on the parser.
- # constructor
+ """
def __init__(self, tag, attrib={}, **extra):
if not isinstance(attrib, dict):
@@ -195,36 +176,30 @@ class Element:
def __repr__(self):
return "<Element %s at 0x%x>" % (repr(self.tag), id(self))
- ##
- # Creates a new element object of the same type as this element.
- #
- # @param tag Element tag.
- # @param attrib Element attributes, given as a dictionary.
- # @return A new element instance.
-
def makeelement(self, tag, attrib):
- return self.__class__(tag, attrib)
+ """Create a new element with the same type.
+
+ *tag* is a string containing the element name.
+ *attrib* is a dictionary containing the element attributes.
- ##
- # (Experimental) Copies the current element. This creates a
- # shallow copy; subelements will be shared with the original tree.
- #
- # @return A new element instance.
+ Do not call this method, use the SubElement factory function instead.
+
+ """
+ return self.__class__(tag, attrib)
def copy(self):
+ """Return copy of current element.
+
+ This creates a shallow copy. Subelements will be shared with the
+ original tree.
+
+ """
elem = self.makeelement(self.tag, self.attrib)
elem.text = self.text
elem.tail = self.tail
elem[:] = self
return elem
- ##
- # Returns the number of subelements. Note that this only counts
- # full elements; to check if there's any content in an element, you
- # have to check both the length and the <b>text</b> attribute.
- #
- # @return The number of subelements.
-
def __len__(self):
return len(self._children)
@@ -236,23 +211,9 @@ class Element:
)
return len(self._children) != 0 # emulate old behaviour, for now
- ##
- # Returns the given subelement, by index.
- #
- # @param index What subelement to return.
- # @return The given subelement.
- # @exception IndexError If the given element does not exist.
-
def __getitem__(self, index):
return self._children[index]
- ##
- # Replaces the given subelement, by index.
- #
- # @param index What subelement to replace.
- # @param element The new element value.
- # @exception IndexError If the given element does not exist.
-
def __setitem__(self, index, element):
# if isinstance(index, slice):
# for elt in element:
@@ -261,76 +222,62 @@ class Element:
# assert iselement(element)
self._children[index] = element
- ##
- # Deletes the given subelement, by index.
- #
- # @param index What subelement to delete.
- # @exception IndexError If the given element does not exist.
-
def __delitem__(self, index):
del self._children[index]
- ##
- # Adds a subelement to the end of this element. In document order,
- # the new element will appear after the last existing subelement (or
- # directly after the text, if it's the first subelement), but before
- # the end tag for this element.
- #
- # @param element The element to add.
+ def append(self, subelement):
+ """Add *subelement* to the end of this element.
- def append(self, element):
- self._assert_is_element(element)
- self._children.append(element)
+ The new element will appear in document order after the last existing
+ subelement (or directly after the text, if it's the first subelement),
+ but before the end tag for this element.
- ##
- # Appends subelements from a sequence.
- #
- # @param elements A sequence object with zero or more elements.
- # @since 1.3
+ """
+ self._assert_is_element(subelement)
+ self._children.append(subelement)
def extend(self, elements):
+ """Append subelements from a sequence.
+
+ *elements* is a sequence with zero or more elements.
+
+ """
for element in elements:
self._assert_is_element(element)
self._children.extend(elements)
- ##
- # Inserts a subelement at the given position in this element.
- #
- # @param index Where to insert the new subelement.
-
- def insert(self, index, element):
- self._assert_is_element(element)
- self._children.insert(index, element)
+ def insert(self, index, subelement):
+ """Insert *subelement* at position *index*."""
+ self._assert_is_element(subelement)
+ self._children.insert(index, subelement)
def _assert_is_element(self, e):
# Need to refer to the actual Python implementation, not the
# shadowing C implementation.
- if not isinstance(e, _Element):
+ if not isinstance(e, _Element_Py):
raise TypeError('expected an Element, not %s' % type(e).__name__)
- ##
- # Removes a matching subelement. Unlike the <b>find</b> methods,
- # this method compares elements based on identity, not on tag
- # value or contents. To remove subelements by other means, the
- # easiest way is often to use a list comprehension to select what
- # elements to keep, and use slice assignment to update the parent
- # element.
- #
- # @param element What element to remove.
- # @exception ValueError If a matching element could not be found.
-
- def remove(self, element):
- # assert iselement(element)
- self._children.remove(element)
+ def remove(self, subelement):
+ """Remove matching subelement.
- ##
- # (Deprecated) Returns all subelements. The elements are returned
- # in document order.
- #
- # @return A list of subelements.
- # @defreturn list of Element instances
+ Unlike the find methods, this method compares elements based on
+ identity, NOT ON tag value or contents. To remove subelements by
+ other means, the easiest way is to use a list comprehension to
+ select what elements to keep, and then use slice assignment to update
+ the parent element.
+
+ ValueError is raised if a matching element could not be found.
+
+ """
+ # assert iselement(element)
+ self._children.remove(subelement)
def getchildren(self):
+ """(Deprecated) Return all subelements.
+
+ Elements are returned in document order.
+
+ """
warnings.warn(
"This method will be removed in future versions. "
"Use 'list(elem)' or iteration over elem instead.",
@@ -338,131 +285,128 @@ class Element:
)
return self._children
- ##
- # Finds the first matching subelement, by tag name or path.
- #
- # @param path What element to look for.
- # @keyparam namespaces Optional namespace prefix map.
- # @return The first matching element, or None if no element was found.
- # @defreturn Element or None
-
def find(self, path, namespaces=None):
- return ElementPath.find(self, path, namespaces)
+ """Find first matching element by tag name or path.
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
- ##
- # Finds text for the first matching subelement, by tag name or path.
- #
- # @param path What element to look for.
- # @param default What to return if the element was not found.
- # @keyparam namespaces Optional namespace prefix map.
- # @return The text content of the first matching element, or the
- # default value no element was found. Note that if the element
- # is found, but has no text content, this method returns an
- # empty string.
- # @defreturn string
+ Return the first matching element, or None if no element was found.
+
+ """
+ return ElementPath.find(self, path, namespaces)
def findtext(self, path, default=None, namespaces=None):
- return ElementPath.findtext(self, path, default, namespaces)
+ """Find text for first matching element by tag name or path.
+
+ *path* is a string having either an element tag or an XPath,
+ *default* is the value to return if the element was not found,
+ *namespaces* is an optional mapping from namespace prefix to full name.
- ##
- # Finds all matching subelements, by tag name or path.
- #
- # @param path What element to look for.
- # @keyparam namespaces Optional namespace prefix map.
- # @return A list or other sequence containing all matching elements,
- # in document order.
- # @defreturn list of Element instances
+ Return text content of first matching element, or default value if
+ none was found. Note that if an element is found having no text
+ content, the empty string is returned.
+
+ """
+ return ElementPath.findtext(self, path, default, namespaces)
def findall(self, path, namespaces=None):
- return ElementPath.findall(self, path, namespaces)
+ """Find all matching subelements by tag name or path.
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
- ##
- # Finds all matching subelements, by tag name or path.
- #
- # @param path What element to look for.
- # @keyparam namespaces Optional namespace prefix map.
- # @return An iterator or sequence containing all matching elements,
- # in document order.
- # @defreturn a generated sequence of Element instances
+ Returns list containing all matching elements in document order.
+
+ """
+ return ElementPath.findall(self, path, namespaces)
def iterfind(self, path, namespaces=None):
- return ElementPath.iterfind(self, path, namespaces)
+ """Find all matching subelements by tag name or path.
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
- ##
- # Resets an element. This function removes all subelements, clears
- # all attributes, and sets the <b>text</b> and <b>tail</b> attributes
- # to None.
+ Return an iterable yielding all matching elements in document order.
+
+ """
+ return ElementPath.iterfind(self, path, namespaces)
def clear(self):
+ """Reset element.
+
+ This function removes all subelements, clears all attributes, and sets
+ the text and tail attributes to None.
+
+ """
self.attrib.clear()
self._children = []
self.text = self.tail = None
- ##
- # Gets an element attribute. Equivalent to <b>attrib.get</b>, but
- # some implementations may handle this a bit more efficiently.
- #
- # @param key What attribute to look for.
- # @param default What to return if the attribute was not found.
- # @return The attribute value, or the default value, if the
- # attribute was not found.
- # @defreturn string or None
-
def get(self, key, default=None):
- return self.attrib.get(key, default)
+ """Get element attribute.
+
+ Equivalent to attrib.get, but some implementations may handle this a
+ bit more efficiently. *key* is what attribute to look for, and
+ *default* is what to return if the attribute was not found.
- ##
- # Sets an element attribute. Equivalent to <b>attrib[key] = value</b>,
- # but some implementations may handle this a bit more efficiently.
- #
- # @param key What attribute to set.
- # @param value The attribute value.
+ Returns a string containing the attribute value, or the default if
+ attribute was not found.
+
+ """
+ return self.attrib.get(key, default)
def set(self, key, value):
- self.attrib[key] = value
+ """Set element attribute.
+
+ Equivalent to attrib[key] = value, but some implementations may handle
+ this a bit more efficiently. *key* is what attribute to set, and
+ *value* is the attribute value to set it to.
- ##
- # Gets a list of attribute names. The names are returned in an
- # arbitrary order (just like for an ordinary Python dictionary).
- # Equivalent to <b>attrib.keys()</b>.
- #
- # @return A list of element attribute names.
- # @defreturn list of strings
+ """
+ self.attrib[key] = value
def keys(self):
- return self.attrib.keys()
+ """Get list of attribute names.
- ##
- # Gets element attributes, as a sequence. The attributes are
- # returned in an arbitrary order. Equivalent to <b>attrib.items()</b>.
- #
- # @return A list of (name, value) tuples for all attributes.
- # @defreturn list of (string, string) tuples
+ Names are returned in an arbitrary order, just like an ordinary
+ Python dict. Equivalent to attrib.keys()
+
+ """
+ return self.attrib.keys()
def items(self):
- return self.attrib.items()
+ """Get element attributes as a sequence.
- ##
- # Creates a tree iterator. The iterator loops over this element
- # and all subelements, in document order, and returns all elements
- # with a matching tag.
- # <p>
- # If the tree structure is modified during iteration, new or removed
- # elements may or may not be included. To get a stable set, use the
- # list() function on the iterator, and loop over the resulting list.
- #
- # @param tag What tags to look for (default is to return all elements).
- # @return An iterator containing all the matching elements.
- # @defreturn iterator
+ The attributes are returned in arbitrary order. Equivalent to
+ attrib.items().
+
+ Return a list of (name, value) tuples.
+
+ """
+ return self.attrib.items()
def iter(self, tag=None):
+ """Create tree iterator.
+
+ The iterator loops over the element and all subelements in document
+ order, returning all elements with a matching tag.
+
+ If the tree structure is modified during iteration, new or removed
+ elements may or may not be included. To get a stable set, use the
+ list() function on the iterator, and loop over the resulting list.
+
+ *tag* is what tags to look for (default is to return all elements)
+
+ Return an iterator containing all the matching elements.
+
+ """
if tag == "*":
tag = None
if tag is None or self.tag == tag:
yield self
for e in self._children:
- for e in e.iter(tag):
- yield e
+ yield from e.iter(tag)
# compatibility
def getiterator(self, tag=None):
@@ -474,78 +418,67 @@ class Element:
)
return list(self.iter(tag))
- ##
- # Creates a text iterator. The iterator loops over this element
- # and all subelements, in document order, and returns all inner
- # text.
- #
- # @return An iterator containing all inner text.
- # @defreturn iterator
-
def itertext(self):
+ """Create text iterator.
+
+ The iterator loops over the element and all subelements in document
+ order, returning all inner text.
+
+ """
tag = self.tag
if not isinstance(tag, str) and tag is not None:
return
if self.text:
yield self.text
for e in self:
- for s in e.itertext():
- yield s
+ yield from e.itertext()
if e.tail:
yield e.tail
-# compatibility
-_Element = _ElementInterface = Element
-
-##
-# Subelement factory. This function creates an element instance, and
-# appends it to an existing element.
-# <p>
-# The element name, attribute names, and attribute values can be
-# either 8-bit ASCII strings or Unicode strings.
-#
-# @param parent The parent element.
-# @param tag The subelement name.
-# @param attrib An optional dictionary, containing element attributes.
-# @param **extra Additional attributes, given as keyword arguments.
-# @return An element instance.
-# @defreturn Element
def SubElement(parent, tag, attrib={}, **extra):
+ """Subelement factory which creates an element instance, and appends it
+ to an existing parent.
+
+ The element tag, attribute names, and attribute values can be either
+ bytes or Unicode strings.
+
+ *parent* is the parent element, *tag* is the subelements name, *attrib* is
+ an optional directory containing element attributes, *extra* are
+ additional attributes given as keyword arguments.
+
+ """
attrib = attrib.copy()
attrib.update(extra)
element = parent.makeelement(tag, attrib)
parent.append(element)
return element
-##
-# Comment element factory. This factory function creates a special
-# element that will be serialized as an XML comment by the standard
-# serializer.
-# <p>
-# The comment string can be either an 8-bit ASCII string or a Unicode
-# string.
-#
-# @param text A string containing the comment string.
-# @return An element instance, representing a comment.
-# @defreturn Element
def Comment(text=None):
+ """Comment element factory.
+
+ This function creates a special element which the standard serializer
+ serializes as an XML comment.
+
+ *text* is a string containing the comment string.
+
+ """
element = Element(Comment)
element.text = text
return element
-##
-# PI element factory. This factory function creates a special element
-# that will be serialized as an XML processing instruction by the standard
-# serializer.
-#
-# @param target A string containing the PI target.
-# @param text A string containing the PI contents, if any.
-# @return An element instance, representing a PI.
-# @defreturn Element
def ProcessingInstruction(target, text=None):
+ """Processing Instruction element factory.
+
+ This function creates a special element which the standard serializer
+ serializes as an XML comment.
+
+ *target* is a string containing the processing instruction, *text* is a
+ string containing the processing instruction contents, if any.
+
+ """
element = Element(ProcessingInstruction)
element.text = target
if text:
@@ -554,17 +487,21 @@ def ProcessingInstruction(target, text=None):
PI = ProcessingInstruction
-##
-# QName wrapper. This can be used to wrap a QName attribute value, in
-# order to get proper namespace handling on output.
-#
-# @param text A string containing the QName value, in the form {uri}local,
-# or, if the tag argument is given, the URI part of a QName.
-# @param tag Optional tag. If given, the first argument is interpreted as
-# an URI, and this argument is interpreted as a local name.
-# @return An opaque object, representing the QName.
class QName:
+ """Qualified name wrapper.
+
+ This class can be used to wrap a QName attribute value in order to get
+ proper namespace handing on output.
+
+ *text_or_uri* is a string containing the QName value either in the form
+ {uri}local, or if the tag argument is given, the URI part of a QName.
+
+ *tag* is an optional argument which if given, will make the first
+ argument (text_or_uri) be interpreted as a URI, and this argument (tag)
+ be interpreted as a local name.
+
+ """
def __init__(self, text_or_uri, tag=None):
if tag:
text_or_uri = "{%s}%s" % (text_or_uri, tag)
@@ -602,63 +539,65 @@ class QName:
# --------------------------------------------------------------------
-##
-# ElementTree wrapper class. This class represents an entire element
-# hierarchy, and adds some extra support for serialization to and from
-# standard XML.
-#
-# @param element Optional root element.
-# @keyparam file Optional file handle or file name. If given, the
-# tree is initialized with the contents of this XML file.
class ElementTree:
+ """An XML element hierarchy.
+
+ This class also provides support for serialization to and from
+ standard XML.
+ *element* is an optional root element node,
+ *file* is an optional file handle or file name of an XML file whose
+ contents will be used to initialize the tree with.
+
+ """
def __init__(self, element=None, file=None):
# assert element is None or iselement(element)
self._root = element # first node
if file:
self.parse(file)
- ##
- # Gets the root element for this tree.
- #
- # @return An element instance.
- # @defreturn Element
-
def getroot(self):
+ """Return root element of this tree."""
return self._root
- ##
- # Replaces the root element for this tree. This discards the
- # current contents of the tree, and replaces it with the given
- # element. Use with care.
- #
- # @param element An element instance.
-
def _setroot(self, element):
+ """Replace root element of this tree.
+
+ This will discard the current contents of the tree and replace it
+ with the given element. Use with care!
+
+ """
# assert iselement(element)
self._root = element
- ##
- # Loads an external XML document into this element tree.
- #
- # @param source A file name or file object. If a file object is
- # given, it only has to implement a <b>read(n)</b> method.
- # @keyparam parser An optional parser instance. If not given, the
- # standard {@link XMLParser} parser is used.
- # @return The document root element.
- # @defreturn Element
- # @exception ParseError If the parser fails to parse the document.
-
def parse(self, source, parser=None):
+ """Load external XML document into element tree.
+
+ *source* is a file name or file object, *parser* is an optional parser
+ instance that defaults to XMLParser.
+
+ ParseError is raised if the parser fails to parse the document.
+
+ Returns the root element of the given source document.
+
+ """
close_source = False
if not hasattr(source, "read"):
source = open(source, "rb")
close_source = True
try:
- if not parser:
- parser = XMLParser(target=TreeBuilder())
- while 1:
+ if parser is None:
+ # If no parser was specified, create a default XMLParser
+ parser = XMLParser()
+ if hasattr(parser, '_parse_whole'):
+ # The default XMLParser, when it comes from an accelerator,
+ # can define an internal _parse_whole API for efficiency.
+ # It can be used to parse the whole source without feeding
+ # it with chunks.
+ self._root = parser._parse_whole(source)
+ return self._root
+ while True:
data = source.read(65536)
if not data:
break
@@ -669,15 +608,15 @@ class ElementTree:
if close_source:
source.close()
- ##
- # Creates a tree iterator for the root element. The iterator loops
- # over all elements in this tree, in document order.
- #
- # @param tag What tags to look for (default is to return all elements)
- # @return An iterator.
- # @defreturn iterator
-
def iter(self, tag=None):
+ """Create and return tree iterator for the root element.
+
+ The iterator loops over all elements in this tree, in document order.
+
+ *tag* is a string with the tag name to iterate over
+ (default is to return all elements).
+
+ """
# assert self._root is not None
return self._root.iter(tag)
@@ -691,15 +630,17 @@ class ElementTree:
)
return list(self.iter(tag))
- ##
- # Same as getroot().find(path), starting at the root of the tree.
- #
- # @param path What element to look for.
- # @keyparam namespaces Optional namespace prefix map.
- # @return The first matching element, or None if no element was found.
- # @defreturn Element or None
-
def find(self, path, namespaces=None):
+ """Find first matching element by tag name or path.
+
+ Same as getroot().find(path), which is Element.find()
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
+
+ Return the first matching element, or None if no element was found.
+
+ """
# assert self._root is not None
if path[:1] == "/":
path = "." + path
@@ -711,19 +652,17 @@ class ElementTree:
)
return self._root.find(path, namespaces)
- ##
- # Same as getroot().findtext(path), starting at the root of the tree.
- #
- # @param path What element to look for.
- # @param default What to return if the element was not found.
- # @keyparam namespaces Optional namespace prefix map.
- # @return The text content of the first matching element, or the
- # default value no element was found. Note that if the element
- # is found, but has no text content, this method returns an
- # empty string.
- # @defreturn string
-
def findtext(self, path, default=None, namespaces=None):
+ """Find first matching element by tag name or path.
+
+ Same as getroot().findtext(path), which is Element.findtext()
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
+
+ Return the first matching element, or None if no element was found.
+
+ """
# assert self._root is not None
if path[:1] == "/":
path = "." + path
@@ -735,16 +674,17 @@ class ElementTree:
)
return self._root.findtext(path, default, namespaces)
- ##
- # Same as getroot().findall(path), starting at the root of the tree.
- #
- # @param path What element to look for.
- # @keyparam namespaces Optional namespace prefix map.
- # @return A list or iterator containing all matching elements,
- # in document order.
- # @defreturn list of Element instances
-
def findall(self, path, namespaces=None):
+ """Find all matching subelements by tag name or path.
+
+ Same as getroot().findall(path), which is Element.findall().
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
+
+ Return list containing all matching elements in document order.
+
+ """
# assert self._root is not None
if path[:1] == "/":
path = "." + path
@@ -756,17 +696,17 @@ class ElementTree:
)
return self._root.findall(path, namespaces)
- ##
- # Finds all matching subelements, by tag name or path.
- # Same as getroot().iterfind(path).
- #
- # @param path What element to look for.
- # @keyparam namespaces Optional namespace prefix map.
- # @return An iterator or sequence containing all matching elements,
- # in document order.
- # @defreturn a generated sequence of Element instances
-
def iterfind(self, path, namespaces=None):
+ """Find all matching subelements by tag name or path.
+
+ Same as getroot().iterfind(path), which is element.iterfind()
+
+ *path* is a string having either an element tag or an XPath,
+ *namespaces* is an optional mapping from namespace prefix to full name.
+
+ Return an iterable yielding all matching elements in document order.
+
+ """
# assert self._root is not None
if path[:1] == "/":
path = "." + path
@@ -778,26 +718,35 @@ class ElementTree:
)
return self._root.iterfind(path, namespaces)
- ##
- # Writes the element tree to a file, as XML.
- #
- # @def write(file, **options)
- # @param file A file name, or a file object opened for writing.
- # @param **options Options, given as keyword arguments.
- # @keyparam encoding Optional output encoding (default is US-ASCII).
- # Use "unicode" to return a Unicode string.
- # @keyparam xml_declaration Controls if an XML declaration should
- # be added to the file. Use False for never, True for always,
- # None for only if not US-ASCII or UTF-8 or Unicode. None is default.
- # @keyparam default_namespace Sets the default XML namespace (for "xmlns").
- # @keyparam method Optional output method ("xml", "html", "text" or
- # "c14n"; default is "xml").
-
def write(self, file_or_filename,
encoding=None,
xml_declaration=None,
default_namespace=None,
- method=None):
+ method=None, *,
+ short_empty_elements=True):
+ """Write element tree to a file as XML.
+
+ Arguments:
+ *file_or_filename* -- file name or a file object opened for writing
+
+ *encoding* -- the output encoding (default: US-ASCII)
+
+ *xml_declaration* -- bool indicating if an XML declaration should be
+ added to the output. If None, an XML declaration
+ is added if encoding IS NOT either of:
+ US-ASCII, UTF-8, or Unicode
+
+ *default_namespace* -- sets the default XML namespace (for "xmlns")
+
+ *method* -- either "xml" (default), "html, "text", or "c14n"
+
+ *short_empty_elements* -- controls the formatting of elements
+ that contain no content. If True (default)
+ they are emitted as a single self-closed
+ tag, otherwise they are emitted as a pair
+ of start/end tags
+
+ """
if not method:
method = "xml"
elif method not in _serialize:
@@ -825,7 +774,8 @@ class ElementTree:
else:
qnames, namespaces = _namespaces(self._root, default_namespace)
serialize = _serialize[method]
- serialize(write, self._root, qnames, namespaces)
+ serialize(write, self._root, qnames, namespaces,
+ short_empty_elements=short_empty_elements)
def write_c14n(self, file):
# lxml.etree compatibility. use output method instead
@@ -947,7 +897,8 @@ def _namespaces(elem, default_namespace=None):
add_qname(text.text)
return qnames, namespaces
-def _serialize_xml(write, elem, qnames, namespaces):
+def _serialize_xml(write, elem, qnames, namespaces,
+ short_empty_elements, **kwargs):
tag = elem.tag
text = elem.text
if tag is Comment:
@@ -960,7 +911,8 @@ def _serialize_xml(write, elem, qnames, namespaces):
if text:
write(_escape_cdata(text))
for e in elem:
- _serialize_xml(write, e, qnames, None)
+ _serialize_xml(write, e, qnames, None,
+ short_empty_elements=short_empty_elements)
else:
write("<" + tag)
items = list(elem.items())
@@ -982,12 +934,13 @@ def _serialize_xml(write, elem, qnames, namespaces):
else:
v = _escape_attrib(v)
write(" %s=\"%s\"" % (qnames[k], v))
- if text or len(elem):
+ if text or len(elem) or not short_empty_elements:
write(">")
if text:
write(_escape_cdata(text))
for e in elem:
- _serialize_xml(write, e, qnames, None)
+ _serialize_xml(write, e, qnames, None,
+ short_empty_elements=short_empty_elements)
write("</" + tag + ">")
else:
write(" />")
@@ -1002,7 +955,7 @@ try:
except NameError:
pass
-def _serialize_html(write, elem, qnames, namespaces):
+def _serialize_html(write, elem, qnames, namespaces, **kwargs):
tag = elem.tag
text = elem.text
if tag is Comment:
@@ -1066,18 +1019,19 @@ _serialize = {
# "c14n": _serialize_c14n,
}
-##
-# Registers a namespace prefix. The registry is global, and any
-# existing mapping for either the given prefix or the namespace URI
-# will be removed.
-#
-# @param prefix Namespace prefix.
-# @param uri Namespace uri. Tags and attributes in this namespace
-# will be serialized with the given prefix, if at all possible.
-# @exception ValueError If the prefix is reserved, or is otherwise
-# invalid.
def register_namespace(prefix, uri):
+ """Register a namespace prefix.
+
+ The registry is global, and any existing mapping for either the
+ given prefix or the namespace URI will be removed.
+
+ *prefix* is the namespace prefix, *uri* is a namespace uri. Tags and
+ attributes in this namespace will be serialized with prefix if possible.
+
+ ValueError is raised if prefix is reserved or is invalid.
+
+ """
if re.match("ns\d+$", prefix):
raise ValueError("Prefix format reserved for internal use")
for k, v in list(_namespace_map.items()):
@@ -1153,40 +1107,27 @@ def _escape_attrib_html(text):
# --------------------------------------------------------------------
-##
-# Generates a string representation of an XML element, including all
-# subelements. If encoding is "unicode", the return type is a string;
-# otherwise it is a bytes array.
-#
-# @param element An Element instance.
-# @keyparam encoding Optional output encoding (default is US-ASCII).
-# Use "unicode" to return a Unicode string.
-# @keyparam method Optional output method ("xml", "html", "text" or
-# "c14n"; default is "xml").
-# @return An (optionally) encoded string containing the XML data.
-# @defreturn string
-
-def tostring(element, encoding=None, method=None):
+def tostring(element, encoding=None, method=None, *,
+ short_empty_elements=True):
+ """Generate string representation of XML element.
+
+ All subelements are included. If encoding is "unicode", a string
+ is returned. Otherwise a bytestring is returned.
+
+ *element* is an Element instance, *encoding* is an optional output
+ encoding defaulting to US-ASCII, *method* is an optional output which can
+ be one of "xml" (default), "html", "text" or "c14n".
+
+ Returns an (optionally) encoded string containing the XML data.
+
+ """
stream = io.StringIO() if encoding == 'unicode' else io.BytesIO()
- ElementTree(element).write(stream, encoding, method=method)
+ ElementTree(element).write(stream, encoding, method=method,
+ short_empty_elements=short_empty_elements)
return stream.getvalue()
-##
-# Generates a string representation of an XML element, including all
-# subelements.
-#
-# @param element An Element instance.
-# @keyparam encoding Optional output encoding (default is US-ASCII).
-# Use "unicode" to return a Unicode string.
-# @keyparam method Optional output method ("xml", "html", "text" or
-# "c14n"; default is "xml").
-# @return A sequence object containing the XML data.
-# @defreturn sequence
-# @since 1.3
-
class _ListDataStream(io.BufferedIOBase):
- """ An auxiliary stream accumulating into a list reference
- """
+ """An auxiliary stream accumulating into a list reference."""
def __init__(self, lst):
self.lst = lst
@@ -1202,22 +1143,25 @@ class _ListDataStream(io.BufferedIOBase):
def tell(self):
return len(self.lst)
-def tostringlist(element, encoding=None, method=None):
+def tostringlist(element, encoding=None, method=None, *,
+ short_empty_elements=True):
lst = []
stream = _ListDataStream(lst)
- ElementTree(element).write(stream, encoding, method=method)
+ ElementTree(element).write(stream, encoding, method=method,
+ short_empty_elements=short_empty_elements)
return lst
-##
-# Writes an element tree or element structure to sys.stdout. This
-# function should be used for debugging only.
-# <p>
-# The exact output format is implementation dependent. In this
-# version, it's written as an ordinary XML file.
-#
-# @param elem An element tree or an individual element.
def dump(elem):
+ """Write element tree or element structure to sys.stdout.
+
+ This function should be used for debugging only.
+
+ *elem* is either an ElementTree, or a single Element. The exact output
+ format is implementation dependent. In this version, it's written as an
+ ordinary XML file.
+
+ """
# debugging
if not isinstance(elem, ElementTree):
elem = ElementTree(elem)
@@ -1229,144 +1173,151 @@ def dump(elem):
# --------------------------------------------------------------------
# parsing
-##
-# Parses an XML document into an element tree.
-#
-# @param source A filename or file object containing XML data.
-# @param parser An optional parser instance. If not given, the
-# standard {@link XMLParser} parser is used.
-# @return An ElementTree instance
def parse(source, parser=None):
+ """Parse XML document into element tree.
+
+ *source* is a filename or file object containing XML data,
+ *parser* is an optional parser instance defaulting to XMLParser.
+
+ Return an ElementTree instance.
+
+ """
tree = ElementTree()
tree.parse(source, parser)
return tree
-##
-# Parses an XML document into an element tree incrementally, and reports
-# what's going on to the user.
-#
-# @param source A filename or file object containing XML data.
-# @param events A list of events to report back. If omitted, only "end"
-# events are reported.
-# @param parser An optional parser instance. If not given, the
-# standard {@link XMLParser} parser is used.
-# @return A (event, elem) iterator.
def iterparse(source, events=None, parser=None):
+ """Incrementally parse XML document into ElementTree.
+
+ This class also reports what's going on to the user based on the
+ *events* it is initialized with. The supported events are the strings
+ "start", "end", "start-ns" and "end-ns" (the "ns" events are used to get
+ detailed namespace information). If *events* is omitted, only
+ "end" events are reported.
+
+ *source* is a filename or file object containing XML data, *events* is
+ a list of events to report back, *parser* is an optional parser instance.
+
+ Returns an iterator providing (event, elem) pairs.
+
+ """
close_source = False
if not hasattr(source, "read"):
source = open(source, "rb")
close_source = True
- if not parser:
- parser = XMLParser(target=TreeBuilder())
return _IterParseIterator(source, events, parser, close_source)
-class _IterParseIterator:
- def __init__(self, source, events, parser, close_source=False):
- self._file = source
- self._close_file = close_source
- self._events = []
+class IncrementalParser:
+
+ def __init__(self, events=None, parser=None):
+ # _elementtree.c expects a list, not a deque
+ self._events_queue = []
self._index = 0
- self._error = None
self.root = self._root = None
+ if not parser:
+ parser = XMLParser(target=TreeBuilder())
self._parser = parser
# wire up the parser for event reporting
- parser = self._parser._parser
- append = self._events.append
if events is None:
- events = ["end"]
- for event in events:
- if event == "start":
- try:
- parser.ordered_attributes = 1
- parser.specified_attributes = 1
- def handler(tag, attrib_in, event=event, append=append,
- start=self._parser._start_list):
- append((event, start(tag, attrib_in)))
- parser.StartElementHandler = handler
- except AttributeError:
- def handler(tag, attrib_in, event=event, append=append,
- start=self._parser._start):
- append((event, start(tag, attrib_in)))
- parser.StartElementHandler = handler
- elif event == "end":
- def handler(tag, event=event, append=append,
- end=self._parser._end):
- append((event, end(tag)))
- parser.EndElementHandler = handler
- elif event == "start-ns":
- def handler(prefix, uri, event=event, append=append):
- append((event, (prefix or "", uri or "")))
- parser.StartNamespaceDeclHandler = handler
- elif event == "end-ns":
- def handler(prefix, event=event, append=append):
- append((event, None))
- parser.EndNamespaceDeclHandler = handler
+ events = ("end",)
+ self._parser._setevents(self._events_queue, events)
+
+ def data_received(self, data):
+ if self._parser is None:
+ raise ValueError("data_received() called after end of stream")
+ if data:
+ try:
+ self._parser.feed(data)
+ except SyntaxError as exc:
+ self._events_queue.append(exc)
+
+ def eof_received(self):
+ self._root = self._parser.close()
+ self._parser = None
+ if self._index >= len(self._events_queue):
+ self.root = self._root
+
+ def events(self):
+ events = self._events_queue
+ while True:
+ index = self._index
+ try:
+ event = events[self._index]
+ # Avoid retaining references to past events
+ events[self._index] = None
+ except IndexError:
+ break
+ index += 1
+ # Compact the list in a O(1) amortized fashion
+ if index * 2 >= len(events):
+ events[:index] = []
+ self._index = 0
else:
- raise ValueError("unknown event %r" % event)
+ self._index = index
+ if isinstance(event, Exception):
+ raise event
+ else:
+ yield event
+ if self._parser is None:
+ self.root = self._root
+
+
+class _IterParseIterator(IncrementalParser):
+
+ def __init__(self, source, events, parser, close_source=False):
+ IncrementalParser.__init__(self, events, parser)
+ self._file = source
+ self._close_file = close_source
def __next__(self):
while 1:
- try:
- item = self._events[self._index]
- self._index += 1
- return item
- except IndexError:
- pass
- if self._error:
- e = self._error
- self._error = None
- raise e
+ for event in self.events():
+ return event
if self._parser is None:
- self.root = self._root
if self._close_file:
self._file.close()
raise StopIteration
# load event buffer
- del self._events[:]
- self._index = 0
data = self._file.read(16384)
if data:
- try:
- self._parser.feed(data)
- except SyntaxError as exc:
- self._error = exc
+ self.data_received(data)
else:
- self._root = self._parser.close()
- self._parser = None
+ self.eof_received()
def __iter__(self):
return self
-##
-# Parses an XML document from a string constant. This function can
-# be used to embed "XML literals" in Python code.
-#
-# @param source A string containing XML data.
-# @param parser An optional parser instance. If not given, the
-# standard {@link XMLParser} parser is used.
-# @return An Element instance.
-# @defreturn Element
def XML(text, parser=None):
+ """Parse XML document from string constant.
+
+ This function can be used to embed "XML Literals" in Python code.
+
+ *text* is a string containing XML data, *parser* is an
+ optional parser instance, defaulting to the standard XMLParser.
+
+ Returns an Element instance.
+
+ """
if not parser:
parser = XMLParser(target=TreeBuilder())
parser.feed(text)
return parser.close()
-##
-# Parses an XML document from a string constant, and also returns
-# a dictionary which maps from element id:s to elements.
-#
-# @param source A string containing XML data.
-# @param parser An optional parser instance. If not given, the
-# standard {@link XMLParser} parser is used.
-# @return A tuple containing an Element instance and a dictionary.
-# @defreturn (Element, dictionary)
def XMLID(text, parser=None):
+ """Parse XML document from string constant for its IDs.
+
+ *text* is a string containing XML data, *parser* is an
+ optional parser instance, defaulting to the standard XMLParser.
+
+ Returns an (Element, dict) tuple, in which the
+ dict maps element id:s to elements.
+
+ """
if not parser:
parser = XMLParser(target=TreeBuilder())
parser.feed(text)
@@ -1378,27 +1329,18 @@ def XMLID(text, parser=None):
ids[id] = elem
return tree, ids
-##
-# Parses an XML document from a string constant. Same as {@link #XML}.
-#
-# @def fromstring(text)
-# @param source A string containing XML data.
-# @return An Element instance.
-# @defreturn Element
-
+# Parse XML document from string constant. Alias for XML().
fromstring = XML
-##
-# Parses an XML document from a sequence of string fragments.
-#
-# @param sequence A list or other sequence containing XML data fragments.
-# @param parser An optional parser instance. If not given, the
-# standard {@link XMLParser} parser is used.
-# @return An Element instance.
-# @defreturn Element
-# @since 1.3
-
def fromstringlist(sequence, parser=None):
+ """Parse XML document from sequence of string fragments.
+
+ *sequence* is a list of other sequence, *parser* is an optional parser
+ instance, defaulting to the standard XMLParser.
+
+ Returns an Element instance.
+
+ """
if not parser:
parser = XMLParser(target=TreeBuilder())
for text in sequence:
@@ -1407,19 +1349,20 @@ def fromstringlist(sequence, parser=None):
# --------------------------------------------------------------------
-##
-# Generic element structure builder. This builder converts a sequence
-# of {@link #TreeBuilder.start}, {@link #TreeBuilder.data}, and {@link
-# #TreeBuilder.end} method calls to a well-formed element structure.
-# <p>
-# You can use this class to build an element structure using a custom XML
-# parser, or a parser for some other XML-like format.
-#
-# @param element_factory Optional element factory. This factory
-# is called to create new Element instances, as necessary.
class TreeBuilder:
+ """Generic element structure builder.
+
+ This builder converts a sequence of start, data, and end method
+ calls to a well-formed element structure.
+
+ You can use this class to build an element structure using a custom XML
+ parser, or a parser for some other XML-like format.
+ *element_factory* is an optional element factory which is called
+ to create new Element instances, as necessary.
+
+ """
def __init__(self, element_factory=None):
self._data = [] # data collector
self._elem = [] # element stack
@@ -1429,14 +1372,8 @@ class TreeBuilder:
element_factory = Element
self._factory = element_factory
- ##
- # Flushes the builder buffers, and returns the toplevel document
- # element.
- #
- # @return An Element instance.
- # @defreturn Element
-
def close(self):
+ """Flush builder buffers and return toplevel document Element."""
assert len(self._elem) == 0, "missing end tags"
assert self._last is not None, "missing toplevel element"
return self._last
@@ -1453,24 +1390,17 @@ class TreeBuilder:
self._last.text = text
self._data = []
- ##
- # Adds text to the current element.
- #
- # @param data A string. This should be either an 8-bit string
- # containing ASCII text, or a Unicode string.
-
def data(self, data):
+ """Add text to current element."""
self._data.append(data)
- ##
- # Opens a new element.
- #
- # @param tag The element name.
- # @param attrib A dictionary containing element attributes.
- # @return The opened element.
- # @defreturn Element
-
def start(self, tag, attrs):
+ """Open new element and return it.
+
+ *tag* is the element name, *attrs* is a dict containing element
+ attributes.
+
+ """
self._flush()
self._last = elem = self._factory(tag, attrs)
if self._elem:
@@ -1479,14 +1409,12 @@ class TreeBuilder:
self._tail = 0
return elem
- ##
- # Closes the current element.
- #
- # @param tag The element name.
- # @return The closed element.
- # @defreturn Element
-
def end(self, tag):
+ """Close and return current Element.
+
+ *tag* is the element name.
+
+ """
self._flush()
self._last = self._elem.pop()
assert self._last.tag == tag,\
@@ -1495,20 +1423,18 @@ class TreeBuilder:
self._tail = 1
return self._last
-##
-# Element structure builder for XML source data, based on the
-# <b>expat</b> parser.
-#
-# @keyparam target Target object. If omitted, the builder uses an
-# instance of the standard {@link #TreeBuilder} class.
-# @keyparam html Predefine HTML entities. This flag is not supported
-# by the current implementation.
-# @keyparam encoding Optional encoding. If given, the value overrides
-# the encoding specified in the XML file.
-# @see #ElementTree
-# @see #TreeBuilder
+# also see ElementTree and TreeBuilder
class XMLParser:
+ """Element structure builder for XML source data based on the expat parser.
+
+ *html* are predefined HTML entities (not supported currently),
+ *target* is an optional target object which defaults to an instance of the
+ standard TreeBuilder class, *encoding* is an optional encoding string
+ which if given, overrides the encoding specified in the XML file:
+ http://www.iana.org/assignments/character-sets
+
+ """
def __init__(self, html=0, target=None, encoding=None):
try:
@@ -1561,6 +1487,39 @@ class XMLParser:
except AttributeError:
pass # unknown
+ def _setevents(self, events_queue, events_to_report):
+ # Internal API for IncrementalParser
+ # events_to_report: a list of events to report during parsing (same as
+ # the *events* of IncrementalParser's constructor.
+ # events_queue: a list of actual parsing events that will be populated
+ # by the underlying parser.
+ #
+ parser = self._parser
+ append = events_queue.append
+ for event_name in events_to_report:
+ if event_name == "start":
+ parser.ordered_attributes = 1
+ parser.specified_attributes = 1
+ def handler(tag, attrib_in, event=event_name, append=append,
+ start=self._start_list):
+ append((event, start(tag, attrib_in)))
+ parser.StartElementHandler = handler
+ elif event_name == "end":
+ def handler(tag, event=event_name, append=append,
+ end=self._end):
+ append((event, end(tag)))
+ parser.EndElementHandler = handler
+ elif event_name == "start-ns":
+ def handler(prefix, uri, event=event_name, append=append):
+ append((event, (prefix or "", uri or "")))
+ parser.StartNamespaceDeclHandler = handler
+ elif event_name == "end-ns":
+ def handler(prefix, event=event_name, append=append):
+ append((event, None))
+ parser.EndNamespaceDeclHandler = handler
+ else:
+ raise ValueError("unknown event %r" % event_name)
+
def _raiseerror(self, value):
err = ParseError(value)
err.code = value.code
@@ -1650,15 +1609,13 @@ class XMLParser:
self.doctype(name, pubid, system[1:-1])
self._doctype = None
- ##
- # (Deprecated) Handles a doctype declaration.
- #
- # @param name Doctype name.
- # @param pubid Public identifier.
- # @param system System identifier.
-
def doctype(self, name, pubid, system):
- """This method of XMLParser is deprecated."""
+ """(Deprecated) Handle doctype declaration
+
+ *name* is the Doctype name, *pubid* is the public identifier,
+ and *system* is the system identifier.
+
+ """
warnings.warn(
"This method of XMLParser is deprecated. Define doctype() "
"method on the TreeBuilder target.",
@@ -1668,24 +1625,15 @@ class XMLParser:
# sentinel, if doctype is redefined in a subclass
__doctype = doctype
- ##
- # Feeds data to the parser.
- #
- # @param data Encoded data.
-
def feed(self, data):
+ """Feed encoded data to parser."""
try:
self.parser.Parse(data, 0)
except self._error as v:
self._raiseerror(v)
- ##
- # Finishes feeding data to the parser.
- #
- # @return An element structure.
- # @defreturn Element
-
def close(self):
+ """Finish feeding data to parser and return element structure."""
try:
self.parser.Parse("", 1) # end of data
except self._error as v:
@@ -1704,103 +1652,12 @@ class XMLParser:
# Import the C accelerators
try:
+ # Element is going to be shadowed by the C implementation. We need to keep
+ # the Python version of it accessible for some "creative" by external code
+ # (see tests)
+ _Element_Py = Element
+
# Element, SubElement, ParseError, TreeBuilder, XMLParser
from _elementtree import *
except ImportError:
pass
-else:
- # Overwrite 'ElementTree.parse' and 'iterparse' to use the C XMLParser
-
- class ElementTree(ElementTree):
- def parse(self, source, parser=None):
- close_source = False
- if not hasattr(source, 'read'):
- source = open(source, 'rb')
- close_source = True
- try:
- if parser is not None:
- while True:
- data = source.read(65536)
- if not data:
- break
- parser.feed(data)
- self._root = parser.close()
- else:
- parser = XMLParser()
- self._root = parser._parse(source)
- return self._root
- finally:
- if close_source:
- source.close()
-
- class iterparse:
- """Parses an XML section into an element tree incrementally.
-
- Reports what’s going on to the user. 'source' is a filename or file
- object containing XML data. 'events' is a list of events to report back.
- The supported events are the strings "start", "end", "start-ns" and
- "end-ns" (the "ns" events are used to get detailed namespace
- information). If 'events' is omitted, only "end" events are reported.
- 'parser' is an optional parser instance. If not given, the standard
- XMLParser parser is used. Returns an iterator providing
- (event, elem) pairs.
- """
-
- root = None
- def __init__(self, file, events=None, parser=None):
- self._close_file = False
- if not hasattr(file, 'read'):
- file = open(file, 'rb')
- self._close_file = True
- self._file = file
- self._events = []
- self._index = 0
- self._error = None
- self.root = self._root = None
- if parser is None:
- parser = XMLParser(target=TreeBuilder())
- self._parser = parser
- self._parser._setevents(self._events, events)
-
- def __next__(self):
- while True:
- try:
- item = self._events[self._index]
- self._index += 1
- return item
- except IndexError:
- pass
- if self._error:
- e = self._error
- self._error = None
- raise e
- if self._parser is None:
- self.root = self._root
- if self._close_file:
- self._file.close()
- raise StopIteration
- # load event buffer
- del self._events[:]
- self._index = 0
- data = self._file.read(16384)
- if data:
- try:
- self._parser.feed(data)
- except SyntaxError as exc:
- self._error = exc
- else:
- self._root = self._parser.close()
- self._parser = None
-
- def __iter__(self):
- return self
-
-# compatibility
-XMLTreeBuilder = XMLParser
-
-# workaround circular import.
-try:
- from ElementC14N import _serialize_c14n
- _serialize["c14n"] = _serialize_c14n
-except ImportError:
- pass
diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py
index d7b2db3..ff42265 100644
--- a/Lib/xmlrpc/client.py
+++ b/Lib/xmlrpc/client.py
@@ -1045,7 +1045,7 @@ def gzip_decode(data):
gzf = gzip.GzipFile(mode="rb", fileobj=f)
try:
decoded = gzf.read()
- except IOError:
+ except OSError:
raise ValueError("invalid data")
f.close()
gzf.close()
@@ -1130,8 +1130,9 @@ class Transport:
for i in (0, 1):
try:
return self.single_request(host, handler, request_body, verbose)
- except socket.error as e:
- if i or e.errno not in (errno.ECONNRESET, errno.ECONNABORTED, errno.EPIPE):
+ except OSError as e:
+ if i or e.errno not in (errno.ECONNRESET, errno.ECONNABORTED,
+ errno.EPIPE):
raise
except http.client.BadStatusLine: #close after we sent request
if i:
@@ -1385,7 +1386,7 @@ class ServerProxy:
# get the url
type, uri = urllib.parse.splittype(uri)
if type not in ("http", "https"):
- raise IOError("unsupported XML-RPC protocol")
+ raise OSError("unsupported XML-RPC protocol")
self.__host, self.__handler = urllib.parse.splithost(uri)
if not self.__handler:
self.__handler = "/RPC2"
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 3448c61..7d6591f 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -6,7 +6,7 @@ XXX references to utf-8 need further investigation.
import io
import os
import re
-import imp
+import importlib.util
import sys
import time
import stat
@@ -164,7 +164,7 @@ def _check_zipfile(fp):
try:
if _EndRecData(fp):
return True # file has correct magic number
- except IOError:
+ except OSError:
pass
return False
@@ -180,7 +180,7 @@ def is_zipfile(filename):
else:
with open(filename, "rb") as fp:
result = _check_zipfile(fp)
- except IOError:
+ except OSError:
pass
return result
@@ -190,7 +190,7 @@ def _EndRecData64(fpin, offset, endrec):
"""
try:
fpin.seek(offset - sizeEndCentDir64Locator, 2)
- except IOError:
+ except OSError:
# If the seek fails, the file is not large enough to contain a ZIP64
# end-of-archive record, so just return the end record we were given.
return endrec
@@ -242,7 +242,7 @@ def _EndRecData(fpin):
# file if this is the case).
try:
fpin.seek(-sizeEndCentDir, 2)
- except IOError:
+ except OSError:
return None
data = fpin.read()
if (len(data) == sizeEndCentDir and
@@ -910,7 +910,7 @@ class ZipFile:
modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
try:
self.fp = io.open(file, modeDict[mode])
- except IOError:
+ except OSError:
if mode == 'a':
mode = key = 'w'
self.fp = io.open(file, modeDict[mode])
@@ -961,7 +961,7 @@ class ZipFile:
fp = self.fp
try:
endrec = _EndRecData(fp)
- except IOError:
+ except OSError:
raise BadZipFile("File is not a zip file")
if not endrec:
raise BadZipFile("File is not a zip file")
@@ -1645,8 +1645,8 @@ class PyZipFile(ZipFile):
file_py = pathname + ".py"
file_pyc = pathname + ".pyc"
file_pyo = pathname + ".pyo"
- pycache_pyc = imp.cache_from_source(file_py, True)
- pycache_pyo = imp.cache_from_source(file_py, False)
+ pycache_pyc = importlib.util.cache_from_source(file_py, True)
+ pycache_pyo = importlib.util.cache_from_source(file_py, False)
if self._optimize == -1:
# legacy mode: use whatever file is present
if (os.path.isfile(file_pyo) and
diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
index 004765a..64c6171 100755
--- a/Mac/BuildScript/build-installer.py
+++ b/Mac/BuildScript/build-installer.py
@@ -982,22 +982,62 @@ def buildPython():
# the end-users system. Also remove the directories from _sysconfigdata.py
# (added in 3.3) if it exists.
+ include_path = '-I%s/libraries/usr/local/include' % (WORKDIR,)
+ lib_path = '-L%s/libraries/usr/local/lib' % (WORKDIR,)
+
path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
'Python.framework', 'Versions',
version, 'lib', 'python%s'%(version,))
- paths = [os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile'),
- os.path.join(path_to_lib, '_sysconfigdata.py')]
- for path in paths:
- if not os.path.exists(path):
- continue
+
+ # fix Makefile
+ path = os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile')
+ fp = open(path, 'r')
+ data = fp.read()
+ fp.close()
+
+ for p in (include_path, lib_path):
+ data = data.replace(" " + p, '')
+ data = data.replace(p + " ", '')
+
+ fp = open(path, 'w')
+ fp.write(data)
+ fp.close()
+
+ # fix _sysconfigdata if it exists
+ #
+ # TODO: make this more robust! test_sysconfig_module of
+ # distutils.tests.test_sysconfig.SysconfigTestCase tests that
+ # the output from get_config_var in both sysconfig and
+ # distutils.sysconfig is exactly the same for both CFLAGS and
+ # LDFLAGS. The fixing up is now complicated by the pretty
+ # printing in _sysconfigdata.py. Also, we are using the
+ # pprint from the Python running the installer build which
+ # may not cosmetically format the same as the pprint in the Python
+ # being built (and which is used to originally generate
+ # _sysconfigdata.py).
+
+ import pprint
+ path = os.path.join(path_to_lib, '_sysconfigdata.py')
+ if os.path.exists(path):
fp = open(path, 'r')
data = fp.read()
fp.close()
+ # create build_time_vars dict
+ exec(data)
+ vars = {}
+ for k, v in build_time_vars.items():
+ if type(v) == type(''):
+ for p in (include_path, lib_path):
+ v = v.replace(' ' + p, '')
+ v = v.replace(p + ' ', '')
+ vars[k] = v
- data = data.replace(' -L%s/libraries/usr/local/lib'%(WORKDIR,), '')
- data = data.replace(' -I%s/libraries/usr/local/include'%(WORKDIR,), '')
fp = open(path, 'w')
- fp.write(data)
+ # duplicated from sysconfig._generate_posix_vars()
+ fp.write('# system configuration generated and used by'
+ ' the sysconfig module\n')
+ fp.write('build_time_vars = ')
+ pprint.pprint(vars, stream=fp)
fp.close()
# Add symlinks in /usr/local/bin, using relative links
diff --git a/Mac/Tools/bundlebuilder.py b/Mac/Tools/bundlebuilder.py
index 6cc130f..f5679d3 100644
--- a/Mac/Tools/bundlebuilder.py
+++ b/Mac/Tools/bundlebuilder.py
@@ -270,7 +270,7 @@ __load()
del __load
"""
-MAYMISS_MODULES = ['mac', 'os2', 'nt', 'ntpath', 'dos', 'dospath',
+MAYMISS_MODULES = ['mac', 'nt', 'ntpath', 'dos', 'dospath',
'win32api', 'ce', '_winreg', 'nturl2path', 'sitecustomize',
'org.python.core', 'riscos', 'riscosenviron', 'riscospath'
]
diff --git a/Makefile.pre.in b/Makefile.pre.in
index dc895c0..ca404cd 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -127,7 +127,6 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION)
# Symbols used for using shared libraries
SHLIB_SUFFIX= @SHLIB_SUFFIX@
EXT_SUFFIX= @EXT_SUFFIX@
-SO= $(SHLIB_SUFFIX)
LDSHARED= @LDSHARED@ $(PY_LDFLAGS)
BLDSHARED= @BLDSHARED@ $(PY_LDFLAGS)
LDCXXSHARED= @LDCXXSHARED@
@@ -212,6 +211,12 @@ HOST_GNU_TYPE= @host@
PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
#PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py
+# report files for gcov / lcov coverage report
+COVERAGE_INFO= $(abs_builddir)/coverage.info
+COVERAGE_REPORT=$(abs_builddir)/lcov-report
+COVERAGE_REPORT_OPTIONS=--no-branch-coverage --title "CPython lcov report"
+
+
# === Definitions added by makesetup ===
@@ -440,7 +445,7 @@ LIBRARY_OBJS= \
# Default target
all: build_all
-build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed
+build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed python-config
# Compile a binary with gcc profile guided optimization.
profile-opt:
@@ -464,11 +469,48 @@ run_profile_task:
build_all_use_profile:
$(MAKE) all CFLAGS="$(CFLAGS) -fprofile-use -fprofile-correction"
+# Compile and run with gcov
+.PHONY=coverage coverage-lcov coverage-report
coverage:
@echo "Building with support for coverage checking:"
- $(MAKE) clean
+ $(MAKE) clean profile-removal
$(MAKE) all CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov"
+coverage-lcov:
+ @echo "Creating Coverage HTML report with LCOV:"
+ @rm -f $(COVERAGE_INFO)
+ @rm -rf $(COVERAGE_REPORT)
+ @lcov --capture --directory $(abs_builddir) \
+ --base-directory $(realpath $(abs_builddir)) \
+ --path $(realpath $(abs_srcdir)) \
+ --output-file $(COVERAGE_INFO)
+ : # remove 3rd party modules and system headers
+ @lcov --remove $(COVERAGE_INFO) \
+ '*/Modules/_ctypes/libffi*/*' \
+ '*/Modules/_sha3/keccak/*' \
+ '*/Modules/_decimal/libmpdec/*' \
+ '*/Modules/expat/*' \
+ '*/Modules/zlib/*' \
+ '*/Include/*' \
+ '/usr/include/*' \
+ '/usr/local/include/*' \
+ --output-file $(COVERAGE_INFO)
+ @genhtml $(COVERAGE_INFO) --output-directory $(COVERAGE_REPORT) \
+ $(COVERAGE_REPORT_OPTIONS)
+ @echo
+ @echo "lcov report at $(COVERAGE_REPORT)/index.html"
+ @echo
+
+coverage-report:
+ : # force rebuilding of parser and importlib
+ @touch $(GRAMMAR_INPUT)
+ @touch $(srcdir)/Lib/importlib/_bootstrap.py
+ : # build with coverage info
+ $(MAKE) coverage
+ : # run tests, ignore failures
+ $(TESTRUNNER) $(TESTOPTS) || true
+ : # build lcov report
+ $(MAKE) coverage-lcov
# Build the interpreter
$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -708,27 +750,31 @@ Objects/unicodectype.o: $(srcdir)/Objects/unicodectype.c \
$(srcdir)/Objects/unicodetype_db.h
BYTESTR_DEPS = \
- $(srcdir)/Include/bytes_methods.h \
$(srcdir)/Objects/stringlib/count.h \
$(srcdir)/Objects/stringlib/ctype.h \
- $(srcdir)/Objects/stringlib/eq.h \
$(srcdir)/Objects/stringlib/fastsearch.h \
$(srcdir)/Objects/stringlib/find.h \
- $(srcdir)/Objects/stringlib/find_max_char.h \
+ $(srcdir)/Objects/stringlib/join.h \
$(srcdir)/Objects/stringlib/partition.h \
$(srcdir)/Objects/stringlib/split.h \
$(srcdir)/Objects/stringlib/stringdefs.h \
- $(srcdir)/Objects/stringlib/transmogrify.h \
- $(srcdir)/Objects/stringlib/unicodedefs.h \
- $(srcdir)/Objects/stringlib/localeutil.h \
- $(srcdir)/Objects/stringlib/undef.h
+ $(srcdir)/Objects/stringlib/transmogrify.h
-UNICODE_DEPS = $(BYTESTR_DEPS) \
+UNICODE_DEPS = \
$(srcdir)/Objects/stringlib/asciilib.h \
$(srcdir)/Objects/stringlib/codecs.h \
+ $(srcdir)/Objects/stringlib/count.h \
+ $(srcdir)/Objects/stringlib/fastsearch.h \
+ $(srcdir)/Objects/stringlib/find.h \
+ $(srcdir)/Objects/stringlib/find_max_char.h \
+ $(srcdir)/Objects/stringlib/localeutil.h \
+ $(srcdir)/Objects/stringlib/partition.h \
+ $(srcdir)/Objects/stringlib/replace.h \
+ $(srcdir)/Objects/stringlib/split.h \
$(srcdir)/Objects/stringlib/ucs1lib.h \
$(srcdir)/Objects/stringlib/ucs2lib.h \
$(srcdir)/Objects/stringlib/ucs4lib.h \
+ $(srcdir)/Objects/stringlib/undef.h \
$(srcdir)/Objects/stringlib/unicode_format.h \
$(srcdir)/Objects/stringlib/unicodedefs.h
@@ -746,9 +792,6 @@ $(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h
-Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
- $(BYTESTR_DEPS)
-
Python/frozen.o: Python/importlib.h
Objects/typeobject.o: Objects/typeslots.inc
@@ -895,7 +938,9 @@ buildbottest: all platform
QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \
test_multibytecodec test_urllib2_localnet test_itertools \
- test_multiprocessing test_mailbox test_socket test_poll \
+ test_multiprocessing_fork test_multiprocessing_spawn \
+ test_multiprocessing_forkserver \
+ test_mailbox test_socket test_poll \
test_select test_zipfile test_concurrent_futures
quicktest: all platform
$(TESTRUNNER) $(QUICKTESTOPTS)
@@ -945,7 +990,7 @@ altbininstall: $(BUILDPYTHON)
fi; \
(cd $(DESTDIR)$(BINDIR); $(LN) python$(LDVERSION)$(EXE) python$(VERSION)$(EXE)); \
fi
- if test -f $(LDLIBRARY); then \
+ if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \
if test -n "$(DLLLIBRARY)" ; then \
$(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \
else \
@@ -1152,10 +1197,19 @@ $(srcdir)/Lib/$(PLATDIR):
fi; \
cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen
-python-config: $(srcdir)/Misc/python-config.in
+python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh
# Substitution happens here, as the completely-expanded BINDIR
# is not available in configure
- sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config
+ sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config.py
+ # Replace makefile compat. variable references with shell script compat. ones; $(VAR) -> ${VAR}
+ sed -e 's,\$$(\([A-Za-z0-9_]*\)),\$$\{\1\},g' < Misc/python-config.sh >python-config
+ # On Darwin, always use the python version of the script, the shell
+ # version doesn't use the compiler customizations that are provided
+ # in python (_osx_support.py).
+ if test `uname -s` = Darwin; then \
+ cp python-config.py python-config; \
+ fi
+
# Install the include files
INCLDIRSTOMAKE=$(INCLUDEDIR) $(CONFINCLUDEDIR) $(INCLUDEPY) $(CONFINCLUDEPY)
@@ -1213,8 +1267,8 @@ libainstall: all python-config
$(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc
$(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup
$(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh
+ $(INSTALL_SCRIPT) python-config.py $(DESTDIR)$(LIBPL)/python-config.py
$(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(LDVERSION)-config
- rm python-config
@if [ -s Modules/python.exp -a \
"`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ]; then \
echo; echo "Installing support files for building shared extension modules on AIX:"; \
@@ -1394,6 +1448,8 @@ clean: pycremoval
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
+ rm -f $(COVERAGE_INFO)
+ rm -rf $(COVERAGE_REPORT)
clobber: clean profile-removal
-rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \
@@ -1401,6 +1457,7 @@ clobber: clean profile-removal
config.cache config.log pyconfig.h Modules/config.c
-rm -rf build platform
-rm -rf $(PYTHONFRAMEWORKDIR)
+ -rm -f python-config.py python-config
# Make things extra clean, before making a distribution:
# remove all generated files, even Makefile[.pre]
diff --git a/Misc/ACKS b/Misc/ACKS
index 78d3b47..a947e4b 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -56,6 +56,7 @@ John Aycock
Donovan Baarda
Arne Babenhauserheide
Attila Babo
+Matt Bachmann
Marcin Bachry
Alfonso Baciero
Dwayne Bailey
@@ -121,6 +122,7 @@ Philippe Biondi
Michael Birtwell
Stuart Bishop
Roy Bixler
+Daniel Black
Jonathan Black
Renaud Blanch
Mike Bland
@@ -137,6 +139,7 @@ Gawain Bolton
Forest Bond
Gregory Bond
Matias Bordese
+Jonas Borgström
Jurjen Bos
Peter Bosch
Dan Boswell
@@ -150,8 +153,10 @@ Monty Brandenberg
Georg Brandl
Christopher Brannon
Terrence Brannon
+Sven Brauch
Erik Bray
Brian Brazil
+Demian Brecht
Dave Brennan
Tom Bridgman
Anthony Briggs
@@ -168,9 +173,11 @@ Dave Brueck
Francisco Martín Brugué
Ian Bruntlett
Floris Bruynooghe
+Matt Bryant
Stan Bubrouski
Erik de Bueger
Jan-Hein Bührman
+Lars Buitinck
Dick Bulterman
Bill Bumgarner
Jimmy Burgett
@@ -190,6 +197,7 @@ Brett Cannon
Mike Carlton
Pierre Carrier
Terry Carroll
+Edward Catmur
Lorenzo M. Catucci
Donn Cave
Charles Cazabon
@@ -223,6 +231,7 @@ David Cinege
Craig Citro
Gilles Civario
Chris Clark
+Laurie Clark-Michalek
Mike Clarkson
Andrew Clegg
Brad Clements
@@ -319,6 +328,7 @@ Quinn Dunkan
Robin Dunn
Luke Dunstan
Virgil Dupras
+Bruno Dupuis
Andy Dustman
Gary Duzan
Eugene Dvurechenski
@@ -341,6 +351,7 @@ Phil Elson
David Ely
Jeff Epler
Tom Epperly
+Gökcen Eraslan
Stoffel Erasmus
Jürgen A. Erhard
Michael Ernst
@@ -451,6 +462,7 @@ Eric Groo
Dag Gruneau
Filip Gruszczyński
Thomas Guettler
+Anuj Gupta
Michael Guravage
Lars Gustäbel
Thomas Güttler
@@ -461,6 +473,7 @@ Paul ten Hagen
Rasmus Hahn
Peter Haight
Václav Haisman
+Zbigniew Halas
Walker Hale IV
Bob Halley
Jesse Hallio
@@ -590,6 +603,7 @@ Orjan Johansen
Fredrik Johansson
Gregory K. Johnson
Kent Johnson
+Michael Johnson
Simon Johnston
Matt Joiner
Thomas Jollans
@@ -608,6 +622,7 @@ Andreas Jung
Tattoo Mabonzo K.
Sarah K.
Bohuslav Kabrda
+Alexey Kachayev
Bob Kahn
Kurt B. Kaiser
Tamito Kajiyama
@@ -684,7 +699,9 @@ Vladimir Kushnir
Erno Kuusela
Ross Lagerwall
Cameron Laird
+David Lam
Thomas Lamb
+Valerie Lambert
Jean-Baptiste "Jiba" Lamy
Ronan Lamy
Torsten Landschoff
@@ -721,9 +738,11 @@ Marc-André Lemburg
Mateusz Lenik
John Lenton
Kostyantyn Leschenko
+Benno Leslie
Christopher Tur Lesniewski-Laas
Alain Leufroy
Mark Levinson
+Mark Levitt
William Lewis
Akira Li
Xuanji Li
@@ -747,6 +766,7 @@ Hugo Lopes Tavares
Anne Lord
Tom Loredo
Justin Love
+Ned Jackson Lovely
Jason Lowe
Tony Lownds
Ray Loyzaga
@@ -755,6 +775,7 @@ Loren Luke
Fredrik Lundh
Zhongyue Luo
Mark Lutz
+Taras Lyapun
Jim Lynch
Mikael Lyngvig
Martin von Löwis
@@ -765,9 +786,11 @@ Andrew I MacIntyre
Tim MacKenzie
Nick Maclaren
Don MacMillen
+Tomasz Maćkowiak
Steve Majewski
Grzegorz Makarewicz
David Malcolm
+Greg Malcolm
Ken Manheimer
Vladimir Marangozov
Colin Marc
@@ -789,6 +812,7 @@ Graham Matthews
Dieter Maurer
Daniel May
Madison May
+Lucas Maystre
Arnaud Mazin
Rebecca McCreary
Kirk McDonald
@@ -845,6 +869,7 @@ Ross Moore
Ben Morgan
Derek Morr
James A Morrison
+Martin Morrison
Derek McTavish Mounce
Alessandro Moura
Pablo Mouzo
@@ -859,6 +884,7 @@ Neil Muller
Louis Munro
R. David Murray
Matti Mäki
+Jörg Müller
Dale Nagata
John Nagle
Takahiro Nakayama
@@ -921,6 +947,7 @@ Mike Pall
Todd R. Palmer
Juan David Ibáñez Palomar
Jan Palus
+Mathias Panzenböck
M. Papillon
Peter Parente
Alexandre Parenteau
@@ -929,6 +956,7 @@ William Park
Heikki Partanen
Harri Pasanen
Gaël Pasgrimaud
+Ashish Nitin Patil
Randy Pausch
Samuele Pedroni
Justin Peel
@@ -947,6 +975,7 @@ Tim Peters
Benjamin Peterson
Joe Peterson
Chris Petrilli
+Roumen Petrov
Bjorn Pettersen
Justin D. Pettit
Ronny Pfannschmidt
@@ -967,7 +996,9 @@ Antoine Pitrou
Jean-François Piéronne
Oleg Plakhotnyuk
Remi Pointel
+Ariel Poliak
Guilherme Polo
+Illia Polosukhin
Michael Pomraning
Iustin Pop
Claudiu Popa
@@ -977,6 +1008,7 @@ Amrit Prem
Paul Prescod
Donovan Preston
Paul Price
+Iuliia Proskurnia
Jyrki Pulliainen
Steve Purcell
Eduardo Pérez
@@ -985,10 +1017,12 @@ Pierre Quentel
Brian Quinlan
Anders Qvist
Thomas Rachel
+Ram Rachum
Jérôme Radix
Burton Radons
Jeff Ramnani
Brodie Rao
+Senko Rasic
Antti Rasinen
Sridhar Ratnakumar
Ysj Ray
@@ -1020,7 +1054,7 @@ Nicholas Riley
Jean-Claude Rimbault
Vlad Riscutia
Wes Rishel
-Dan Riti
+Daniel Riti
Juan M. Bello Rivas
Davide Rizzo
Anthony Roach
@@ -1149,6 +1183,7 @@ J. Sipprell
Kragen Sitaker
Michael Sloan
Nick Sloan
+Václav Šmilauer
Christopher Smith
Eric V. Smith
Gregory P. Smith
@@ -1202,6 +1237,7 @@ Thenault Sylvain
Péter Szabó
Amir Szekely
Arfrever Frehtes Taifersar Arahesis
+Hideaki Takahashi
Indra Talip
Neil Tallim
Geoff Talvola
@@ -1213,6 +1249,7 @@ Amy Taylor
Monty Taylor
Anatoly Techtonik
Mikhail Terekhov
+Victor Terrón
Richard M. Tew
Tobias Thelen
Févry Thibault
@@ -1220,6 +1257,7 @@ Lowe Thiderman
Nicolas M. Thiéry
James Thomas
Robin Thomas
+Brian Thorne
Stephen Thorne
Jeremy Thurgood
Eric Tiedemann
@@ -1354,6 +1392,7 @@ Steven Work
Gordon Worley
Darren Worrall
Thomas Wouters
+Daniel Wozniak
Heiko Wundram
Doug Wyatt
Robert Xiao
@@ -1366,6 +1405,7 @@ Bob Yodlowski
Danny Yoo
Rory Yorke
George Yoshida
+Kazuhiro Yoshida
Masazumi Yoshikawa
Arnaud Ysmal
Bernard Yue
diff --git a/Misc/HISTORY b/Misc/HISTORY
index 01c635b..4280764 100644
--- a/Misc/HISTORY
+++ b/Misc/HISTORY
@@ -3,13 +3,4110 @@ Python History
This file contains the release messages for previous Python releases.
As you read on you go back to the dark ages of Python's history.
-(Note: news about 2.5c2 and later 2.5 releases is in the Misc/NEWS
-file of the release25-maint branch.)
======================================================================
+What's New in Python 3.3.0?
+===========================
+
+*Release date: 29-Sep-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #16046: Fix loading sourceless legacy .pyo files.
+
+- Issue #16060: Fix refcounting bug when __trunc__ returns an object
+ whose __int__ gives a non-integer. Patch by Serhiy Storchaka.
+
+Extension Modules
+-----------------
+
+- Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD()
+ method doesn't require an argument again.
+
+
+What's New in Python 3.3.0 Release Candidate 3?
+===============================================
+
+*Release date: 23-Sep-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #15900: Fix reference leak in PyUnicode_TranslateCharmap().
+
+- Issue #15926: Fix crash after multiple reinitializations of the interpreter.
+
+- Issue #15895: Fix FILE pointer leak in one error branch of
+ PyRun_SimpleFileExFlags() when filename points to a pyc/pyo file, closeit
+ is false an and set_main_loader() fails.
+
+- Fixes for a few crash and memory leak regressions found by Coverity.
+
+Library
+-------
+
+- Issue #15882: Change _decimal to accept any coefficient tuple when
+ constructing infinities. This is done for backwards compatibility
+ with decimal.py: Infinity coefficients are undefined in _decimal
+ (in accordance with the specification).
+
+- Issue #15925: Fix a regression in email.util where the parsedate() and
+ parsedate_tz() functions did not return None anymore when the argument could
+ not be parsed.
+
+Extension Modules
+-----------------
+
+- Issue #15973: Fix a segmentation fault when comparing datetime timezone
+ objects.
+
+- Issue #15977: Fix memory leak in Modules/_ssl.c when the function
+ _set_npn_protocols() is called multiple times, thanks to Daniel Sommermann.
+
+- Issue #15969: faulthandler module: rename dump_tracebacks_later() to
+ dump_traceback_later() and cancel_dump_tracebacks_later() to
+ cancel_dump_traceback_later().
+
+- _decimal module: use only C 89 style comments.
+
+
+What's New in Python 3.3.0 Release Candidate 2?
+===============================================
+
+*Release date: 09-Sep-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
+ sporadic crashes in multi-thread programs when several long deallocator
+ chains ran concurrently and involved subclasses of built-in container
+ types.
+
+- Issue #15784: Modify OSError.__str__() to better distinguish between
+ errno error numbers and Windows error numbers.
+
+- Issue #15781: Fix two small race conditions in import's module locking.
+
+Library
+-------
+
+- Issue #15847: Fix a regression in argparse, which did not accept tuples
+ as argument lists anymore.
+
+- Issue #15828: Restore support for C extensions in imp.load_module().
+
+- Issue #15340: Fix importing the random module when /dev/urandom cannot
+ be opened. This was a regression caused by the hash randomization patch.
+
+- Issue #10650: Deprecate the watchexp parameter of the Decimal.quantize()
+ method.
+
+- Issue #15785: Modify window.get_wch() API of the curses module: return
+ a character for most keys, and an integer for special keys, instead of
+ always returning an integer. So it is now possible to distinguish special
+ keys like keypad keys.
+
+- Issue #14223: Fix window.addch() of the curses module for special characters
+ like curses.ACS_HLINE: the Python function addch(int) and addch(bytes) is now
+ calling the C function waddch()/mvwaddch() (as it was done in Python 3.2),
+ instead of wadd_wch()/mvwadd_wch(). The Python function addch(str) is still
+ calling the C function wadd_wch()/mvwadd_wch() if the Python curses is linked
+ to libncursesw.
+
+Build
+-----
+
+- Issue #15822: Really ensure 2to3 grammar pickles are properly installed
+ (replaces fixes for Issue #15645).
+
+Documentation
+-------------
+
+- Issue #15814: The memoryview enhancements in 3.3.0 accidentally permitted
+ the hashing of multi-dimensional memorviews and memoryviews with multi-byte
+ item formats. The intended restrictions have now been documented - they
+ will be correctly enforced in 3.3.1
+
+
+What's New in Python 3.3.0 Release Candidate 1?
+===============================================
+
+*Release date: 25-Aug-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #15573: memoryview comparisons are now performed by value with full
+ support for any valid struct module format definition.
+
+- Issue #15316: When an item in the fromlist for __import__ doesn't exist,
+ don't raise an error, but if an exception is raised as part of an import do
+ let that propagate.
+
+- Issue #15778: ensure that str(ImportError(msg)) returns a str
+ even when msg isn't a str.
+
+- Issue #2051: Source file permission bits are once again correctly
+ copied to the cached bytecode file. (The migration to importlib
+ reintroduced this problem because these was no regression test. A test
+ has been added as part of this patch)
+
+- Issue #15761: Fix crash when PYTHONEXECUTABLE is set on Mac OS X.
+
+- Issue #15726: Fix incorrect bounds checking in PyState_FindModule.
+ Patch by Robin Schreiber.
+
+- Issue #15604: Update uses of PyObject_IsTrue() to check for and handle
+ errors correctly. Patch by Serhiy Storchaka.
+
+- Issue #14846: importlib.FileFinder now handles the case where the
+ directory being searched is removed after a previous import attempt
+
+Library
+-------
+
+- Issue #13370: Ensure that ctypes works on Mac OS X when Python is
+ compiled using the clang compiler
+
+- Issue #13072: The array module's 'u' format code is now deprecated and
+ will be removed in Python 4.0.
+
+- Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
+
+- Issue #15249: BytesGenerator now correctly mangles From lines (when
+ requested) even if the body contains undecodable bytes.
+
+- Issue #15777: Fix a refleak in _posixsubprocess.
+
+- Issue ##665194: Update email.utils.localtime to use datetime.astimezone and
+ correctly handle historic changes in UTC offsets.
+
+- Issue #15199: Fix JavaScript's default MIME type to application/javascript.
+ Patch by Bohuslav Kabrda.
+
+- Issue #12643: code.InteractiveConsole now respects sys.excepthook when
+ displaying exceptions (Patch by Aaron Iles)
+
+- Issue #13579: string.Formatter now understands the 'a' conversion specifier.
+
+- Issue #15793: Stack corruption in ssl.RAND_egd().
+ Patch by Serhiy Storchaka.
+
+- Issue #15595: Fix subprocess.Popen(universal_newlines=True)
+ for certain locales (utf-16 and utf-32 family). Patch by Chris Jerdonek.
+
+- Issue #15477: In cmath and math modules, add workaround for platforms whose
+ system-supplied log1p function doesn't respect signs of zeros.
+
+- Issue #15715: importlib.__import__() will silence an ImportError when the use
+ of fromlist leads to a failed import.
+
+- Issue #14669: Fix pickling of connections and sockets on MacOSX
+ by sending/receiving an acknowledgment after file descriptor transfer.
+ TestPicklingConnection has been reenabled for MacOSX.
+
+- Issue #11062: Fix adding a message from file to Babyl mailbox.
+
+- Issue #15646: Prevent equivalent of a fork bomb when using
+ multiprocessing on Windows without the "if __name__ == '__main__'"
+ idiom.
+
+- Issue #15678: Fix IDLE menus when started from OS X command line
+ (3.3.0b2 regression).
+
+C API
+-----
+
+Extension Modules
+-----------------
+
+Tools/Demos
+-----------
+
+Documentation
+-------------
+
+- Issue #14674: Add a discussion of the json module's standard compliance.
+ Patch by Chris Rebert.
+
+- Create a 'Concurrent Execution' section in the docs, and split up the
+ 'Optional Operating System Services' section to use a more user-centric
+ classification scheme (splitting them across the new CE section, IPC and
+ text processing). Operating system limitatons can be reflected with
+ the Sphinx ``:platform:`` tag, it doesn't make sense as part of the Table of
+ Contents.
+
+- Issue #4966: Bring the sequence docs up to date for the Py3k transition
+ and the many language enhancements since they were original written
+
+- The "path importer" misnomer has been replaced with Eric Snow's
+ more-awkward-but-at-least-not-wrong suggestion of "path based finder" in
+ the import system reference docs
+
+- Issue #15640: Document importlib.abc.Finder as deprecated.
+
+- Issue #15630: Add an example for "continue" stmt in the tutorial. Patch by
+ Daniel Ellis.
+
+Tests
+-----
+
+- Issue #15747: ZFS always returns EOPNOTSUPP when attempting to set the
+ UF_IMMUTABLE flag (via either chflags or lchflags); refactor affected
+ tests in test_posix.py to account for this.
+
+- Issue #15285: Refactor the approach for testing connect timeouts using
+ two external hosts that have been configured specifically for this type
+ of test.
+
+- Issue #15743: Remove the deprecated method usage in urllib tests. Patch by
+ Jeff Knupp.
+
+- Issue #15615: Add some tests for the json module's handling of invalid
+ input data. Patch by Kushal Das.
+
+Build
+-----
+
+- Output lib files for PGO build into PGO directory.
+
+- Pick up 32-bit launcher from PGO directory on 64-bit PGO build.
+
+- Drop PC\python_nt.h as it's not used. Add input dependency on custom
+ build step.
+
+- Issue #15511: Drop explicit dependency on pythonxy.lib from _decimal
+ amd64 configuration.
+
+- Add missing PGI/PGO configurations for pywlauncher.
+
+- Issue #15645: Ensure 2to3 grammar pickles are properly installed.
+
+
+What's New in Python 3.3.0 Beta 2?
+==================================
+
+*Release date: 12-Aug-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #15568: Fix the return value of "yield from" when StopIteration is
+ raised by a custom iterator.
+
+- Issue #13119: sys.stdout and sys.stderr are now using "\r\n" newline on
+ Windows, as Python 2.
+
+- Issue #15534: Fix the fast-search function for non-ASCII Unicode strings.
+
+- Issue #15508: Fix the docstring for __import__ to have the proper default
+ value of 0 for 'level' and to not mention negative levels since they are not
+ supported.
+
+- Issue #15425: Eliminated traceback noise from more situations involving
+ importlib.
+
+- Issue #14578: Support modules registered in the Windows registry again.
+
+- Issue #15466: Stop using TYPE_INT64 in marshal, to make importlib.h (and other
+ byte code files) equal between 32-bit and 64-bit systems.
+
+- Issue #1692335: Move initial exception args assignment to
+ "BaseException.__new__" to help pickling of naive subclasses.
+
+- Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
+
+- Issue #15456: Fix code __sizeof__ after #12399 change. Patch by Serhiy
+ Storchaka.
+
+- Issue #15404: Refleak in PyMethodObject repr.
+
+- Issue #15394: An issue in PyModule_Create that caused references to be leaked
+ on some error paths has been fixed. Patch by Julia Lawall.
+
+- Issue #15368: An issue that caused bytecode generation to be non-deterministic
+ has been fixed.
+
+- Issue #15202: Consistently use the name "follow_symlinks" for new parameters
+ in os and shutil functions.
+
+- Issue #15314: __main__.__loader__ is now set correctly during interpreter
+ startup.
+
+- Issue #15111: When a module imported using 'from import' has an ImportError
+ inside itself, don't mask that fact behind a generic ImportError for the
+ module itself.
+
+- Issue #15293: Add GC support to the AST base node type.
+
+- Issue #15291: Fix a memory leak where AST nodes where not properly
+ deallocated.
+
+- Issue #15110: Fix the tracebacks generated by "import xxx" to not show the
+ importlib stack frames.
+
+- Issue #15020: The program name used to search for Python's path is now
+ "python3" under Unix, not "python".
+
+- Issue #15033: Fix the exit status bug when modules invoked using -m swith,
+ return the proper failure return value (1). Patch contributed by Jeff Knupp.
+
+- Issue #15229: An OSError subclass whose __init__ doesn't call back
+ OSError.__init__ could produce incomplete instances, leading to crashes when
+ calling str() on them.
+
+- Issue 15307: Virtual environments now use symlinks with framework builds on
+ Mac OS X, like other POSIX builds.
+
+Library
+-------
+
+- Issue #15424: Add a __sizeof__ implementation for array objects. Patch by
+ Ludwig Hähne.
+
+- Issue #15576: Allow extension modules to act as a package's __init__ module.
+
+- Issue #15502: Have importlib.invalidate_caches() work on sys.meta_path instead
+ of sys.path_importer_cache.
+
+- Issue #15163: Pydoc shouldn't list __loader__ as module data.
+
+- Issue #15471: Do not use mutable objects as defaults for
+ importlib.__import__().
+
+- Issue #15559: To avoid a problematic failure mode when passed to the bytes
+ constructor, objects in the ipaddress module no longer implement __index__
+ (they still implement __int__ as appropriate)
+
+- Issue #15546: Fix handling of pathological input data in the peek() and
+ read1() methods of the BZ2File, GzipFile and LZMAFile classes.
+
+- Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog
+ ended with '\'. Patch by Roger Serwy.
+
+- Issue #12655: Instead of requiring a custom type, os.sched_getaffinity and
+ os.sched_setaffinity now use regular sets of integers to represent the CPUs a
+ process is restricted to.
+
+- Issue #15538: Fix compilation of the getnameinfo() / getaddrinfo() emulation
+ code. Patch by Philipp Hagemeister.
+
+- Issue #15519: Properly expose WindowsRegistryFinder in importlib (and use the
+ correct term for it). Original patch by Eric Snow.
+
+- Issue #15502: Bring the importlib ABCs into line with the current state of the
+ import protocols given PEP 420. Original patch by Eric Snow.
+
+- Issue #15499: Launching a webbrowser in Unix used to sleep for a few seconds.
+ Original patch by Anton Barkovsky.
+
+- Issue #15463: The faulthandler module truncates strings to 500 characters,
+ instead of 100, to be able to display long file paths.
+
+- Issue #6056: Make multiprocessing use setblocking(True) on the sockets it
+ uses. Original patch by J Derek Wilson.
+
+- Issue #15364: Fix sysconfig.get_config_var('srcdir') to be an absolute path.
+
+- Issue #15041: Update "see also" list in tkinter documentation.
+
+- Issue #15413: os.times() had disappeared under Windows.
+
+- Issue #15402: An issue in the struct module that caused sys.getsizeof to
+ return incorrect results for struct.Struct instances has been fixed. Initial
+ patch by Serhiy Storchaka.
+
+- Issue #15232: When mangle_from is True, email.Generator now correctly mangles
+ lines that start with 'From ' that occur in a MIME preamble or epilogue.
+
+- Issue #15094: Incorrectly placed #endif in _tkinter.c. Patch by Serhiy
+ Storchaka.
+
+- Issue #13922: argparse no longer incorrectly strips '--'s that appear after
+ the first one.
+
+- Issue #12353: argparse now correctly handles null argument values.
+
+- Issue #10017, issue #14998: Fix TypeError using pprint on dictionaries with
+ user-defined types as keys or other unorderable keys.
+
+- Issue #15397: inspect.getmodulename() is now based directly on importlib via a
+ new importlib.machinery.all_suffixes() API.
+
+- Issue #14635: telnetlib will use poll() rather than select() when possible to
+ avoid failing due to the select() file descriptor limit.
+
+- Issue #15180: Clarify posixpath.join() error message when mixing str & bytes.
+
+- Issue #15343: pkgutil now includes an iter_importer_modules implementation for
+ importlib.machinery.FileFinder (similar to the way it already handled
+ zipimport.zipimporter).
+
+- Issue #15314: runpy now sets __main__.__loader__ correctly.
+
+- Issue #15357: The import emulation in pkgutil is now deprecated. pkgutil uses
+ importlib internally rather than the emulation.
+
+- Issue #15233: Python now guarantees that callables registered with the atexit
+ module will be called in a deterministic order.
+
+- Issue #15238: shutil.copystat now copies Linux "extended attributes".
+
+- Issue #15230: runpy.run_path now correctly sets __package__ as described in
+ the documentation.
+
+- Issue #15315: Support VS 2010 in distutils cygwincompiler.
+
+- Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested
+ namespace packages.
+
+- Issue #15056: imp.cache_from_source() and source_from_cache() raise
+ NotImplementedError when sys.implementation.cache_tag is set to None.
+
+- Issue #15256: Grammatical mistake in exception raised by imp.find_module().
+
+- Issue #5931: wsgiref environ variable SERVER_SOFTWARE will specify an
+ implementation specific term like CPython, Jython instead of generic "Python".
+
+- Issue #13248: Remove obsolete argument "max_buffer_size" of BufferedWriter and
+ BufferedRWPair, from the io module.
+
+- Issue #13248: Remove obsolete argument "version" of argparse.ArgumentParser.
+
+- Issue #14814: Implement more consistent ordering and sorting behaviour for
+ ipaddress objects.
+
+- Issue #14814: ipaddress network objects correctly return NotImplemented when
+ compared to arbitrary objects instead of raising TypeError.
+
+- Issue #14990: Correctly fail with SyntaxError on invalid encoding declaration.
+
+- Issue #14814: ipaddress now provides more informative error messages when
+ constructing instances directly (changes permitted during beta due to
+ provisional API status).
+
+- Issue #15247: FileIO now raises an error when given a file descriptor pointing
+ to a directory.
+
+- Issue #15261: Stop os.stat(fd) crashing on Windows when fd not open.
+
+- Issue #15166: Implement imp.get_tag() using sys.implementation.cache_tag.
+
+- Issue #15210: Catch KeyError when importlib.__init__ can't find
+ _frozen_importlib in sys.modules, not ImportError.
+
+- Issue #15030: importlib.abc.PyPycLoader now supports the new source size
+ header field in .pyc files.
+
+- Issue #5346: Preserve permissions of mbox, MMDF and Babyl mailbox files on
+ flush().
+
+- Issue #10571: Fix the "--sign" option of distutils' upload command. Patch by
+ Jakub Wilk.
+
+- Issue #9559: If messages were only added, a new file is no longer created and
+ renamed over the old file when flush() is called on an mbox, MMDF or Babyl
+ mailbox.
+
+- Issue 10924: Fixed crypt.mksalt() to use a RNG that is suitable for
+ cryptographic purpose.
+
+- Issue #15184: Ensure consistent results of OS X configuration tailoring for
+ universal builds by factoring out common OS X-specific customizations from
+ sysconfig, distutils.sysconfig, distutils.util, and distutils.unixccompiler
+ into a new module _osx_support.
+
+C API
+-----
+
+- Issue #15610: PyImport_ImportModuleEx() now uses a 'level' of 0 instead of -1.
+
+- Issues #15169, #14599: Strip out the C implementation of
+ imp.source_from_cache() used by PyImport_ExecCodeModuleWithPathnames() and
+ used the Python code instead. Leads to PyImport_ExecCodeModuleObject() to not
+ try to infer the source path from the bytecode path as
+ PyImport_ExecCodeModuleWithPathnames() does.
+
+Extension Modules
+-----------------
+
+- Issue #15676: Now "mmap" check for empty files before doing the
+ offset check. Patch by Steven Willis.
+
+- Issue #6493: An issue in ctypes on Windows that caused structure bitfields
+ of type ctypes.c_uint32 and width 32 to incorrectly be set has been fixed.
+
+- Issue #15194: Update libffi to the 3.0.11 release.
+
+Tools/Demos
+-----------
+
+- Issue #15458: python-config gets a new option --configdir to print the $LIBPL
+ value.
+
+- Move importlib.test.benchmark to Tools/importbench.
+
+- Issue #12605: The gdb hooks for debugging CPython (within Tools/gdb) have been
+ enhanced to show information on more C frames relevant to CPython within the
+ "py-bt" and "py-bt-full" commands:
+
+ * C frames that are waiting on the GIL
+ * C frames that are garbage-collecting
+ * C frames that are due to the invocation of a PyCFunction
+
+Documentation
+-------------
+
+- Issue #15444: Use proper spelling for non-ASCII contributor names. Patch
+ by Serhiy Storchaka.
+
+- Issue #15295: Reorganize and rewrite the documentation on the import system.
+
+- Issue #15230: Clearly document some of the limitations of the runpy module and
+ nudge readers towards importlib when appropriate.
+
+- Issue #15053: Copy Python 3.3 import lock change notice to all relevant
+ functions in imp instead of just at the top of the relevant section.
+
+- Issue #15288: Link to the term "loader" in notes in pkgutil about how things
+ won't work as expected in Python 3.3 and mark the requisite functions as
+ "changed" since they will no longer work with modules directly imported by
+ import itself.
+
+- Issue #13557: Clarify effect of giving two different namespaces to exec or
+ execfile().
+
+- Issue #15250: Document that filecmp.dircmp compares files shallowly. Patch
+ contributed by Chris Jerdonek.
+
+Tests
+-----
+
+- Issue #15467: Move helpers for __sizeof__ tests into test_support. Patch by
+ Serhiy Storchaka.
+
+- Issue #15320: Make iterating the list of tests thread-safe when running tests
+ in multiprocess mode. Patch by Chris Jerdonek.
+
+- Issue #15168: Move importlib.test to test.test_importlib.
+
+- Issue #15091: Reactivate a test on UNIX which was failing thanks to a
+ forgotten importlib.invalidate_caches() call.
+
+- Issue #15230: Adopted a more systematic approach in the runpy tests.
+
+- Issue #15300: Ensure the temporary test working directories are in the same
+ parent folder when running tests in multiprocess mode from a Python build.
+ Patch by Chris Jerdonek.
+
+- Issue #15284: Skip {send,recv}msg tests in test_socket when IPv6 is not
+ enabled. Patch by Brian Brazil.
+
+- Issue #15277: Fix a resource leak in support.py when IPv6 is disabled. Patch
+ by Brian Brazil.
+
+Build
+-----
+
+- Issue #11715: Fix multiarch detection without having Debian development tools
+ (dpkg-dev) installed.
+
+- Issue #15037: Build OS X installers with local copy of ncurses 5.9 libraries
+ to avoid curses.unget_wch bug present in older versions of ncurses such as
+ those shipped with OS X.
+
+- Issue #15560: Fix building _sqlite3 extension on OS X with an SDK. Also, for
+ OS X installers, ensure consistent sqlite3 behavior and feature availability
+ by building a local copy of libsqlite3 rather than depending on the wide range
+ of versions supplied with various OS X releases.
+
+- Issue #8847: Disable COMDAT folding in Windows PGO builds.
+
+- Issue #14018: Fix OS X Tcl/Tk framework checking when using OS X SDKs.
+
+- Issue #15431: Add _freeze_importlib project to regenerate importlib.h on
+ Windows. Patch by Kristján Valur Jónsson.
+
+- Issue #14197: For OS X framework builds, ensure links to the shared library
+ are created with the proper ABI suffix.
+
+- Issue #14330: For cross builds, don't use host python, use host search paths
+ for host compiler.
+
+- Issue #15235: Allow Berkley DB versions up to 5.3 to build the dbm module.
+
+- Issue #15268: Search curses.h in /usr/include/ncursesw.
+
+
+What's New in Python 3.3.0 Beta 1?
+==================================
+
+*Release date: 27-Jun-2012*
+
+Core and Builtins
+-----------------
+
+- Fix a (most likely) very rare memory leak when calling main() and not being
+ able to decode a command-line argument.
+
+- Issue #14815: Use Py_ssize_t instead of long for the object hash, to
+ preserve all 64 bits of hash on Win64.
+
+- Issue #12268: File readline, readlines and read() or readall() methods
+ no longer lose data when an underlying read system call is interrupted.
+ IOError is no longer raised due to a read system call returning EINTR
+ from within these methods.
+
+- Issue #11626: Add _SizeT functions to stable ABI.
+
+- Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
+
+- Issue #15142: Fix reference leak when deallocating instances of types
+ created using PyType_FromSpec().
+
+- Issue #15042: Add PyState_AddModule and PyState_RemoveModule. Add version
+ guard for Py_LIMITED_API additions. Patch by Robin Schreiber.
+
+- Issue #10053: Don't close FDs when FileIO.__init__ fails. Loosely based on
+ the work by Hirokazu Yamamoto.
+
+- Issue #15096: Removed support for ur'' as the raw notation isn't
+ compatible with Python 2.x's raw unicode strings.
+
+- Issue #13783: Generator objects now use the identifier APIs internally
+
+- Issue #14874: Restore charmap decoding speed to pre-PEP 393 levels.
+ Patch by Serhiy Storchaka.
+
+- Issue #15026: utf-16 encoding is now significantly faster (up to 10x).
+ Patch by Serhiy Storchaka.
+
+- Issue #11022: open() and io.TextIOWrapper are now calling
+ locale.getpreferredencoding(False) instead of locale.getpreferredencoding()
+ in text mode if the encoding is not specified. Don't change temporary the
+ locale encoding using locale.setlocale(), use the current locale encoding
+ instead of the user preferred encoding.
+
+- Issue #14673: Add Eric Snow's sys.implementation implementation.
+
+- Issue #15038: Optimize python Locks on Windows.
+
+Library
+-------
+
+- Issue #9803: Don't close IDLE on saving if breakpoint is open.
+ Patch by Roger Serwy.
+
+- Issue #12288: Consider '0' and '0.0' as valid initialvalue
+ for tkinter SimpleDialog.
+
+- Issue #15512: Add a __sizeof__ implementation for parser.
+ Patch by Serhiy Storchaka.
+
+- Issue #15469: Add a __sizeof__ implementation for deque objects.
+ Patch by Serhiy Storchaka.
+
+- Issue #15489: Add a __sizeof__ implementation for BytesIO objects.
+ Patch by Serhiy Storchaka.
+
+- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
+ Patch by Serhiy Storchaka.
+
+- Issue #15514: Correct __sizeof__ support for cpu_set.
+ Patch by Serhiy Storchaka.
+
+- Issue #15187: Bugfix: remove temporary directories test_shutil was leaving
+ behind.
+
+- Issue #15177: Added dir_fd parameter to os.fwalk().
+
+- Issue #15176: Clarified behavior, documentation, and implementation
+ of os.listdir().
+
+- Issue #15061: Re-implemented hmac.compare_digest() in C to prevent further
+ timing analysis and to support all buffer protocol aware objects as well as
+ ASCII only str instances safely.
+
+- Issue #15164: Change return value of platform.uname() from a
+ plain tuple to a collections.namedtuple.
+
+- Support Mageia Linux in the platform module.
+
+- Issue #11678: Support Arch linux in the platform module.
+
+- Issue #15118: Change return value of os.uname() and os.times() from
+ plain tuples to immutable iterable objects with named attributes
+ (structseq objects).
+
+- Speed up _decimal by another 10-15% by caching the thread local context
+ that was last accessed. In the pi benchmark (64-bit platform, prec=9),
+ _decimal is now only 1.5x slower than float.
+
+- Remove the packaging module, which is not ready for prime time.
+
+- Issue #15154: Add "dir_fd" parameter to os.rmdir, remove "rmdir"
+ parameter from os.remove / os.unlink.
+
+- Issue #4489: Add a shutil.rmtree that isn't susceptible to symlink attacks.
+ It is used automatically on platforms supporting the necessary os.openat()
+ and os.unlinkat() functions. Main code by Martin von Löwis.
+
+- Issue #15156: HTMLParser now uses the new "html.entities.html5" dictionary.
+
+- Issue #11113: add a new "html5" dictionary containing the named character
+ references defined by the HTML5 standard and the equivalent Unicode
+ character(s) to the html.entities module.
+
+- Issue #15114: the strict mode of HTMLParser and the HTMLParseError exception
+ are deprecated now that the parser is able to parse invalid markup.
+
+- Issue #3665: \u and \U escapes are now supported in unicode regular
+ expressions. Patch by Serhiy Storchaka.
+
+- Issue #15153: Added inspect.getgeneratorlocals to simplify white box
+ testing of generator state updates
+
+- Issue #13062: Added inspect.getclosurevars to simplify testing stateful
+ closures
+
+- Issue #11024: Fixes and additional tests for Time2Internaldate.
+
+- Issue #14626: Large refactoring of functions / parameters in the os module.
+ Many functions now support "dir_fd" and "follow_symlinks" parameters;
+ some also support accepting an open file descriptor in place of a path
+ string. Added os.support_* collections as LBYL helpers. Removed many
+ functions only previously seen in 3.3 alpha releases (often starting with
+ "f" or "l", or ending with "at"). Originally suggested by Serhiy Storchaka;
+ implemented by Larry Hastings.
+
+- Issue #15008: Implement PEP 362 "Signature Objects".
+ Patch by Yury Selivanov.
+
+- Issue: #15138: base64.urlsafe_{en,de}code() are now 3-4x faster.
+
+- Issue #444582: Add shutil.which, for finding programs on the system path.
+ Original patch by Erik Demaine, with later iterations by Jan Killian
+ and Brian Curtin.
+
+- Issue #14837: SSL errors now have ``library`` and ``reason`` attributes
+ describing precisely what happened and in which OpenSSL submodule. The
+ str() of a SSLError is also enhanced accordingly.
+
+- Issue #9527: datetime.astimezone() method will now supply a class
+ timezone instance corresponding to the system local timezone when
+ called with no arguments.
+
+- Issue #14653: email.utils.mktime_tz() no longer relies on system
+ mktime() when timezone offest is supplied.
+
+- Issue #14684: zlib.compressobj() and zlib.decompressobj() now support the use
+ of predefined compression dictionaries. Original patch by Sam Rushing.
+
+- Fix GzipFile's handling of filenames given as bytes objects.
+
+- Issue #14772: Return destination values from some shutil functions.
+
+- Issue #15064: Implement context manager protocol for multiprocessing types
+
+- Issue #15101: Make pool finalizer avoid joining current thread.
+
+- Issue #14657: The frozen instance of importlib used for bootstrap is now
+ also the module imported as importlib._bootstrap.
+
+- Issue #14055: Add __sizeof__ support to _elementtree.
+
+- Issue #15054: A bug in tokenize.tokenize that caused string literals
+ with 'b' prefixes to be incorrectly tokenized has been fixed.
+ Patch by Serhiy Storchaka.
+
+- Issue #15006: Allow equality comparison between naive and aware
+ time or datetime objects.
+
+- Issue #14982: Document that pkgutil's iteration functions require the
+ non-standard iter_modules() method to be defined by an importer (something
+ the importlib importers do not define).
+
+- Issue #15036: Mailbox no longer throws an error if a flush is done
+ between operations when removing or changing multiple items in mbox,
+ MMDF, or Babyl mailboxes.
+
+- Issue #14059: Implement multiprocessing.Barrier.
+
+- Issue #15061: The inappropriately named hmac.secure_compare has been
+ renamed to hmac.compare_digest, restricted to operating on bytes inputs
+ only and had its documentation updated to more accurately reflect both its
+ intent and its limitations
+
+- Issue #13841: Make child processes exit using sys.exit() on Windows.
+
+- Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.
+ Patch by Robin Schreiber.
+
+- Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
+ in struct tm, time.struct_time objects returned by time.gmtime(),
+ time.localtime() and time.strptime() functions now have tm_zone and
+ tm_gmtoff attributes. Original patch by Paul Boddie.
+
+- Rename adjusted attribute to adjustable in time.get_clock_info() result.
+
+- Issue #3518: Remove references to non-existent BaseManager.from_address()
+ method.
+
+- Issue #13857: Added textwrap.indent() function (initial patch by Ezra
+ Berch)
+
+- Issue #2736: Added datetime.timestamp() method.
+
+- Issue #13854: Make multiprocessing properly handle non-integer
+ non-string argument to SystemExit.
+
+- Issue #12157: Make pool.map() empty iterables correctly. Initial
+ patch by mouad.
+
+- Issue #11823: disassembly now shows argument counts on calls with keyword args.
+
+- Issue #14711: os.stat_float_times() has been deprecated.
+
+- LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a".
+
+- The bz2 and lzma modules now each contain an open() function, allowing
+ compressed files to readily be opened in text mode as well as binary mode.
+
+- BZ2File.__init__() and LZMAFile.__init__() now accept a file object as their
+ first argument, rather than requiring a separate "fileobj" argument.
+
+- gzip.open() now accepts file objects as well as filenames.
+
+- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
+ when the path existed and had the S_ISGID mode bit set when it was
+ not explicitly asked for. This is no longer an exception as mkdir
+ cannot control if the OS sets that bit for it or not.
+
+- Issue #14989: Make the CGI enable option to http.server available via command
+ line.
+
+- Issue #14987: Add a missing import statement to inspect.
+
+- Issue #1079: email.header.decode_header now correctly parses all the examples
+ in RFC2047. There is a necessary visible behavior change: the leading and/or
+ trailing whitespace on ASCII parts is now preserved.
+
+- Issue #14969: Better handling of exception chaining in contextlib.ExitStack
+
+- Issue #14962: Update text coloring in IDLE shell window after changing
+ options. Patch by Roger Serwy.
+
+- Issue #14963: Convert contextlib.ExitStack.__exit__ to use an iterative
+ algorithm (Patch by Alon Horev)
+
+- Issue #14785: Add sys._debugmallocstats() to help debug low-level memory
+ allocation issues
+
+- Issue #14443: Ensure that .py files are byte-compiled with the correct Python
+ executable within bdist_rpm even on older versions of RPM
+
+C-API
+-----
+
+- Issue #13783: Inadvertent additions to the public C API in the PEP 380
+ implementation have either been removed or marked as private interfaces.
+
+Extension Modules
+-----------------
+
+- Issue #15000: Support the "unique" x32 architecture in _posixsubprocess.c.
+
+Documentation
+-------------
+
+- Issue #15081: Document PyState_FindModule.
+ Patch by Robin Schreiber.
+
+- Issue #14814: Added first draft of ipaddress module API reference
+
+Tests
+-----
+
+- Issue #14769: test_capi now has SkipitemTest, which cleverly checks
+ for "parity" between PyArg_ParseTuple() and the Python/getargs.c static
+ function skipitem() for all possible "format units".
+
+- test_nntplib now tolerates being run from behind NNTP gateways that add
+ "X-Antivirus" headers to articles
+
+- Issue #15043: test_gdb is now skipped entirely if gdb security settings
+ block loading of the gdb hooks
+
+- Issue #14963: Add test cases for exception handling behaviour
+ in contextlib.ExitStack (Initial patch by Alon Horev)
+
+Build
+-----
+
+- Issue #13590: Improve support for OS X Xcode 4:
+ * Try to avoid building Python or extension modules with problematic
+ llvm-gcc compiler.
+ * Since Xcode 4 removes ppc support, extension module builds now
+ check for ppc compiler support and automatically remove ppc and
+ ppc64 archs when not available.
+ * Since Xcode 4 no longer install SDKs in default locations,
+ extension module builds now revert to using installed headers
+ and libs if the SDK used to build the interpreter is not
+ available.
+ * Update ./configure to use better defaults for universal builds;
+ in particular, --enable-universalsdk=yes uses the Xcode default
+ SDK and --with-universal-archs now defaults to "intel" if ppc
+ not available.
+
+- Issue #14225: Fix Unicode support for curses (#12567) on OS X
+
+- Issue #14928: Fix importlib bootstrap issues by using a custom executable
+ (Modules/_freeze_importlib) to build Python/importlib.h.
+
+
+What's New in Python 3.3.0 Alpha 4?
+===================================
+
+*Release date: 31-May-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #14835: Make plistlib output empty arrays & dicts like OS X.
+ Patch by Sidney San Martín.
+
+- Issue #14744: Use the new _PyUnicodeWriter internal API to speed up
+ str%args and str.format(args).
+
+- Issue #14930: Make memoryview objects weakrefable.
+
+- Issue #14775: Fix a potential quadratic dict build-up due to the garbage
+ collector repeatedly trying to untrack dicts.
+
+- Issue #14857: fix regression in references to PEP 3135 implicit __class__
+ closure variable (Reopens issue #12370)
+
+- Issue #14712 (PEP 405): Virtual environments. Implemented by Vinay Sajip.
+
+- Issue #14660 (PEP 420): Namespace packages. Implemented by Eric Smith.
+
+- Issue #14494: Fix __future__.py and its documentation to note that
+ absolute imports are the default behavior in 3.0 instead of 2.7.
+ Patch by Sven Marnach.
+
+- Issue #9260: A finer-grained import lock. Most of the import sequence
+ now uses per-module locks rather than the global import lock, eliminating
+ well-known issues with threads and imports.
+
+- Issue #14624: UTF-16 decoding is now 3x to 4x faster on various inputs.
+ Patch by Serhiy Storchaka.
+
+- asdl_seq and asdl_int_seq are now Py_ssize_t sized.
+
+- Issue #14133 (PEP 415): Implement suppression of __context__ display with an
+ attribute on BaseException. This replaces the original mechanism of PEP 409.
+
+- Issue #14417: Mutating a dict during lookup now restarts the lookup instead
+ of raising a RuntimeError (undoes issue #14205).
+
+- Issue #14738: Speed-up UTF-8 decoding on non-ASCII data. Patch by Serhiy
+ Storchaka.
+
+- Issue #14700: Fix two broken and undefined-behaviour-inducing overflow checks
+ in old-style string formatting.
+
+- Issue #14705: The PyArg_Parse() family of functions now support the 'p' format
+ unit, which accepts a "boolean predicate" argument. It converts any Python
+ value into an integer--0 if it is "false", and 1 otherwise.
+
+Library
+-------
+
+- Issue #14690: Use monotonic clock instead of system clock in the sched,
+ subprocess and trace modules.
+
+- Issue #14958: Change IDLE systax highlighting to recognize all string and
+ byte literals supported in Python 3.3.
+
+- Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu.
+
+- Issue #14443: Tell rpmbuild to use the correct version of Python in
+ bdist_rpm. Initial patch by Ross Lagerwall.
+
+- Issue #14929: Stop Idle 3.x from closing on Unicode decode errors when
+ grepping. Patch by Roger Serwy.
+
+- Issue #12515: email now registers a defect if it gets to EOF while parsing
+ a MIME part without seeing the closing MIME boundary.
+
+- Issue #12510: Attempting to get invalid tooltip no longer closes Idle.
+ Other tooltipss have been corrected or improved and the number of tests
+ has been tripled. Original patch by Roger Serwy.
+
+- Issue #1672568: email now always decodes base64 payloads, adding padding and
+ ignoring non-base64-alphabet characters if needed, and registering defects
+ for any such problems.
+
+- Issue #14925: email now registers a defect when the parser decides that there
+ is a missing header/body separator line. MalformedHeaderDefect, which the
+ existing code would never actually generate, is deprecated.
+
+- Issue #10365: File open dialog now works instead of crashing even when
+ the parent window is closed before the dialog. Patch by Roger Serwy.
+
+- Issue #8739: Updated smtpd to support RFC 5321, and added support for the
+ RFC 1870 SIZE extension.
+
+- Issue #665194: Added a localtime function to email.utils to provide an
+ aware local datetime for use in setting Date headers.
+
+- Issue #12586: Added new provisional policies that implement convenient
+ unicode support for email headers. See What's New for details.
+
+- Issue #14731: Refactored email Policy framework to support full backward
+ compatibility with Python 3.2 by default yet allow for the introduction of
+ new features through new policies. Note that Policy.must_be_7bit is renamed
+ to cte_type.
+
+- Issue #14876: Use user-selected font for highlight configuration.
+
+- Issue #14920: Fix the help(urllib.parse) failure on locale C on terminals.
+ Have ascii characters in help.
+
+- Issue #14548: Make multiprocessing finalizers check pid before
+ running to cope with possibility of gc running just after fork.
+
+- Issue #14863: Update the documentation of os.fdopen() to reflect the
+ fact that it's only a thin wrapper around open() anymore.
+
+- Issue #14036: Add an additional check to validate that port in urlparse does
+ not go in illegal range and returns None.
+
+- Issue #14862: Add missing names to os.__all__
+
+- Issue #14875: Use float('inf') instead of float('1e66666') in the json module.
+
+- Issue #13585: Added contextlib.ExitStack
+
+- PEP 3144, Issue #14814: Added the ipaddress module
+
+- Issue #14426: Correct the Date format in Expires attribute of Set-Cookie
+ Header in Cookie.py.
+
+- Issue #14588: The types module now provide new_class() and prepare_class()
+ functions to support PEP 3115 compliant dynamic class creation. Patch by
+ Daniel Urban and Nick Coghlan.
+
+- Issue #13152: Allow to specify a custom tabsize for expanding tabs in
+ textwrap. Patch by John Feuerstein.
+
+- Issue #14721: Send the correct 'Content-length: 0' header when the body is an
+ empty string ''. Initial Patch contributed by Arve Knudsen.
+
+- Issue #14072: Fix parsing of 'tel' URIs in urlparse by making the check for
+ ports stricter.
+
+- Issue #9374: Generic parsing of query and fragment portions of url for any
+ scheme. Supported both by RFC3986 and RFC2396.
+
+- Issue #14798: Fix the functions in pyclbr to raise an ImportError
+ when the first part of a dotted name is not a package. Patch by
+ Xavier de Gaye.
+
+- Issue #12098: multiprocessing on Windows now starts child processes
+ using the same sys.flags as the current process. Initial patch by
+ Sergey Mezentsev.
+
+- Issue #13031: Small speed-up for tarfile when unzipping tarfiles.
+ Patch by Justin Peel.
+
+- Issue #14780: urllib.request.urlopen() now has a ``cadefault`` argument
+ to use the default certificate store. Initial patch by James Oakley.
+
+- Issue #14829: Fix bisect and range() indexing with large indices
+ (>= 2 ** 32) under 64-bit Windows.
+
+- Issue #14732: The _csv module now uses PEP 3121 module initialization.
+ Patch by Robin Schreiber.
+
+- Issue #14809: Add HTTP status codes introduced by RFC 6585 to http.server
+ and http.client. Patch by EungJun Yi.
+
+- Issue #14777: tkinter may return undecoded UTF-8 bytes as a string when
+ accessing the Tk clipboard. Modify clipboad_get() to first request type
+ UTF8_STRING when no specific type is requested in an X11 windowing
+ environment, falling back to the current default type STRING if that fails.
+ Original patch by Thomas Kluyver.
+
+- Issue #14773: Fix os.fwalk() failing on dangling symlinks.
+
+- Issue #12541: Be lenient with quotes around Realm field of HTTP Basic
+ Authentation in urllib2.
+
+- Issue #14807: move undocumented tarfile.filemode() to stat.filemode() and add
+ doc entry. Add tarfile.filemode alias with deprecation warning.
+
+- Issue #13815: TarFile.extractfile() now returns io.BufferedReader objects.
+
+- Issue #14532: Add a secure_compare() helper to the hmac module, to mitigate
+ timing attacks. Patch by Jon Oberheide.
+
+- Add importlib.util.resolve_name().
+
+- Issue #14366: Support lzma compression in zip files.
+ Patch by Serhiy Storchaka.
+
+- Issue #13959: Introduce importlib.find_loader() and document
+ imp.find_module/load_module as deprecated.
+
+- Issue #14082: shutil.copy2() now copies extended attributes, if possible.
+ Patch by Hynek Schlawack.
+
+- Issue #13959: Make importlib.abc.FileLoader.load_module()/get_filename() and
+ importlib.machinery.ExtensionFileLoader.load_module() have their single
+ argument be optional. Allows for the replacement (and thus deprecation) of
+ imp.load_source()/load_package()/load_compiled().
+
+- Issue #13959: imp.get_suffixes() has been deprecated in favour of the new
+ attributes on importlib.machinery: SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES,
+ OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES, and EXTENSION_SUFFIXES. This
+ led to an indirect deprecation of inspect.getmoduleinfo().
+
+- Issue #14662: Prevent shutil failures on OS X when destination does not
+ support chflag operations. Patch by Hynek Schlawack.
+
+- Issue #14157: Fix time.strptime failing without a year on February 29th.
+ Patch by Hynek Schlawack.
+
+- Issue #14753: Make multiprocessing's handling of negative timeouts
+ the same as it was in Python 3.2.
+
+- Issue #14583: Fix importlib bug when a package's __init__.py would first
+ import one of its modules then raise an error.
+
+- Issue #14741: Fix missing support for Ellipsis ('...') in parser module.
+
+- Issue #14697: Fix missing support for set displays and set comprehensions in
+ parser module.
+
+- Issue #14701: Fix missing support for 'raise ... from' in parser module.
+
+- Add support for timeouts to the acquire() methods of
+ multiprocessing's lock/semaphore/condition proxies.
+
+- Issue #13989: Add support for text mode to gzip.open().
+
+- Issue #14127: The os.stat() result object now provides three additional
+ fields: st_ctime_ns, st_mtime_ns, and st_atime_ns, providing those times as an
+ integer with nanosecond resolution. The functions os.utime(), os.lutimes(),
+ and os.futimes() now accept a new parameter, ns, which accepts mtime and atime
+ as integers with nanosecond resolution.
+
+- Issue #14127 and #10148: shutil.copystat now preserves exact mtime and atime
+ on filesystems providing nanosecond resolution.
+
+Tools/Demos
+-----------
+
+- Issue #14695: Bring Tools/parser/unparse.py support up to date with
+ the Python 3.3 Grammar.
+
+Build
+-----
+
+- Issue #14472: Update .gitignore. Patch by Matej Cepl.
+
+- Upgrade Windows library versions: bzip 1.0.6, OpenSSL 1.0.1c.
+
+- Issue #14693: Under non-Windows platforms, hashlib's fallback modules are
+ always compiled, even if OpenSSL is present at build time.
+
+- Issue #13210: Windows build now uses VS2010, ported from VS2008.
+
+Documentation
+-------------
+
+- Issue #14588: The language reference now accurately documents the Python 3
+ class definition process. Patch by Nick Coghlan.
+
+- Issue #14943: Correct a default argument value for winreg.OpenKey
+ and correctly list the argument names in the function's explanation.
+
+
+What's New in Python 3.3.0 Alpha 3?
+===================================
+
+*Release date: 01-May-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #14699: Fix calling the classmethod descriptor directly.
+
+- Issue #14433: Prevent msvcrt crash in interactive prompt when stdin is closed.
+
+- Issue #14521: Make result of float('nan') and float('-nan') more consistent
+ across platforms.
+
+- Issue #14646: __import__() sets __loader__ if the loader did not.
+
+- Issue #14605: No longer have implicit entries in sys.meta_path. If
+ sys.meta_path is found to be empty, raise ImportWarning.
+
+- Issue #14605: No longer have implicit entries in sys.path_hooks. If
+ sys.path_hooks is found to be empty, a warning will be raised. None is now
+ inserted into sys.path_importer_cache if no finder was discovered. This also
+ means imp.NullImporter is no longer implicitly used.
+
+- Issue #13903: Implement PEP 412. Individual dictionary instances can now share
+ their keys with other dictionaries. Classes take advantage of this to share
+ their instance dictionary keys for improved memory and performance.
+
+- Issue #11603 (again): Setting __repr__ to __str__ now raises a RuntimeError
+ when repr() or str() is called on such an object.
+
+- Issue #14658: Fix binding a special method to a builtin implementation of a
+ special method with a different name.
+
+- Issue #14630: Fix a memory access bug for instances of a subclass of int
+ with value 0.
+
+- Issue #14339: Speed improvements to bin, oct and hex functions. Patch by
+ Serhiy Storchaka.
+
+- Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
+ Patch by Stefan Behnel.
+
+- Issue #14385: It is now possible to use a custom type for the __builtins__
+ namespace, instead of a dict. It can be used for sandboxing for example.
+ Raise also a NameError instead of ImportError if __build_class__ name if not
+ found in __builtins__.
+
+- Issue #12599: Be more strict in accepting None compared to a false-like
+ object for importlib.util.module_for_loader and
+ importlib.machinery.PathFinder.
+
+- Issue #14612: Fix jumping around with blocks by setting f_lineno.
+
+- Issue #14592: Attempting a relative import w/o __package__ or __name__ set in
+ globals raises a KeyError.
+
+- Issue #14607: Fix keyword-only arguments which started with ``__``.
+
+- Issue #10854: The ImportError raised when an extension module on Windows
+ fails to import now uses the new path and name attributes from
+ Issue #1559549.
+
+- Issue #13889: Check and (if necessary) set FPU control word before calling
+ any of the dtoa.c string <-> float conversion functions, on MSVC builds of
+ Python. This fixes issues when embedding Python in a Delphi app.
+
+- __import__() now matches PEP 328 and documentation by defaulting 'index' to 0
+ instead of -1 and removing support for negative values.
+
+- Issue #2377: Make importlib the implementation of __import__().
+
+- Issue #1559549: ImportError now has 'name' and 'path' attributes that are set
+ using keyword arguments to its constructor. They are currently not set by
+ import as they are meant for use by importlib.
+
+- Issue #14474: Save and restore exception state in thread.start_new_thread()
+ while writing error message if the thread leaves a unhandled exception.
+
+- Issue #13019: Fix potential reference leaks in bytearray.extend(). Patch
+ by Suman Saha.
+
+Library
+-------
+
+- Issue #14768: os.path.expanduser('~/a') doesn't works correctly when HOME is '/'.
+
+- Issue #14371: Support bzip2 in zipfile module. Patch by Serhiy Storchaka.
+
+- Issue #13183: Fix pdb skipping frames after hitting a breakpoint and running
+ step. Patch by Xavier de Gaye.
+
+- Issue #14696: Fix parser module to understand 'nonlocal' declarations.
+
+- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
+ the DST transition. Patch by Joe Peterson.
+
+- Issue #9154: Fix parser module to understand function annotations.
+
+- Issue #6085: In http.server.py SimpleHTTPServer.address_string returns the
+ client ip address instead client hostname. Patch by Charles-François Natali.
+
+- Issue #14309: Deprecate time.clock(), use time.perf_counter() or
+ time.process_time() instead.
+
+- Issue #14428: Implement the PEP 418. Add time.get_clock_info(),
+ time.perf_counter() and time.process_time() functions, and rename
+ time.steady() to time.monotonic().
+
+- Issue #14646: importlib.util.module_for_loader() now sets __loader__ and
+ __package__ (when possible).
+
+- Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a
+ test class that doesn't inherit from TestCase (i.e. a mixin).
+
+- Issue #4892: multiprocessing Connections can now be transferred over
+ multiprocessing Connections. Patch by Richard Oudkerk (sbt).
+
+- Issue #14160: TarFile.extractfile() failed to resolve symbolic links when
+ the links were not located in an archive subdirectory.
+
+- Issue #14638: pydoc now treats non-string __name__ values as if they
+ were missing, instead of raising an error.
+
+- Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites
+ which send EOF without trailing \r\n.
+
+- Issue #14605: Add importlib.abc.FileLoader, importlib.machinery.(FileFinder,
+ SourceFileLoader, SourcelessFileLoader, ExtensionFileLoader).
+
+- Issue #13959: imp.cache_from_source()/source_from_cache() now follow
+ os.path.join()/split() semantics for path manipulation instead of its prior,
+ custom semantics of caring the right-most path separator forward in path
+ joining.
+
+- Issue #2193: Allow ":" character in Cookie NAME values.
+
+- Issue #14629: tokenizer.detect_encoding will specify the filename in the
+ SyntaxError exception if found at readline.__self__.name.
+
+- Issue #14629: Raise SyntaxError in tokenizer.detect_encoding if the
+ first two lines have non-UTF-8 characters without an encoding declaration.
+
+- Issue #14308: Fix an exception when a "dummy" thread is in the threading
+ module's active list after a fork().
+
+- Issue #11750: The Windows API functions scattered in the _subprocess and
+ _multiprocessing.win32 modules now live in a single module "_winapi".
+ Patch by sbt.
+
+- Issue #14087: multiprocessing: add Condition.wait_for(). Patch by sbt.
+
+- Issue #14538: HTMLParser can now parse correctly start tags that contain
+ a bare '/'.
+
+- Issue #14452: SysLogHandler no longer inserts a UTF-8 BOM into the message.
+
+- Issue #14386: Expose the dict_proxy internal type as types.MappingProxyType.
+
+- Issue #13959: Make imp.reload() always use a module's __loader__ to perform
+ the reload.
+
+- Issue #13959: Add imp.py and rename the built-in module to _imp, allowing for
+ re-implementing parts of the module in pure Python.
+
+- Issue #13496: Fix potential overflow in bisect.bisect algorithm when applied
+ to a collection of size > sys.maxsize / 2.
+
+- Have importlib take advantage of ImportError's new 'name' and 'path'
+ attributes.
+
+- Issue #14399: zipfile now recognizes that the archive has been modified even
+ if only the comment is changed. In addition, the TypeError that results from
+ trying to set a non-binary value as a comment is now raised at the time
+ the comment is set rather than at the time the zipfile is written.
+
+- trace.CoverageResults.is_ignored_filename() now ignores any name that starts
+ with "<" and ends with ">" instead of special-casing "<string>" and
+ "<doctest ".
+
+- Issue #12537: The mailbox module no longer depends on knowledge of internal
+ implementation details of the email package Message object.
+
+- Issue #7978: socketserver now restarts the select() call when EINTR is
+ returned. This avoids crashing the server loop when a signal is received.
+ Patch by Jerzy Kozera.
+
+- Issue #14522: Avoid duplicating socket handles in multiprocessing.connection.
+ Patch by sbt.
+
+- Don't Py_DECREF NULL variable in io.IncrementalNewlineDecoder.
+
+- Issue #8515: Set __file__ when run file in IDLE.
+ Initial patch by Bruce Frederiksen.
+
+- Issue #14496: Fix wrong name in idlelib/tabbedpages.py.
+ Patch by Popa Claudiu.
+
+- Issue #3033: Add displayof parameter to tkinter font. Patch by Guilherme Polo.
+
+- Issue #14482: Raise a ValueError, not a NameError, when trying to create
+ a multiprocessing Client or Listener with an AF_UNIX type address under
+ Windows. Patch by Popa Claudiu.
+
+- Issue #802310: Generate always unique tkinter font names if not directly passed.
+
+- Issue #14151: Raise a ValueError, not a NameError, when trying to create
+ a multiprocessing Client or Listener with an AF_PIPE type address under
+ non-Windows platforms. Patch by Popa Claudiu.
+
+- Issue #14493: Use gvfs-open or xdg-open in webbrowser.
+
+Build
+-----
+
+- "make touch" will now touch generated files that are checked into Mercurial,
+ after a "hg update" which failed to bring the timestamps into the right order.
+
+Tests
+-----
+
+- Issue #14026: In test_cmd_line_script, check that sys.argv is populated
+ correctly for the various invocation approaches (Patch by Jason Yeo)
+
+- Issue #14032: Fix incorrect variable name in test_cmd_line_script debugging
+ message (Patch by Jason Yeo)
+
+- Issue #14589: Update certificate chain for sha256.tbs-internet.com, fixing
+ a test failure in test_ssl.
+
+- Issue #14355: Regrtest now supports the standard unittest test loading, and
+ will use it if a test file contains no `test_main` method.
+
+Tools / Demos
+-------------
+
+- Issue #3561: The Windows installer now has an option, off by default, for
+ placing the Python installation into the system "Path" environment variable.
+
+- Issue #13165: stringbench is now available in the Tools/stringbench folder.
+ It used to live in its own SVN project.
+
+
+What's New in Python 3.3.0 Alpha 2?
+===================================
+
+*Release date: 01-Apr-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
+ are passed arguments and their complementary method is not overridden.
+
+- Issue #14378: Fix compiling ast.ImportFrom nodes with a "__future__" string as
+ the module name that was not interned.
+
+- Issue #14331: Use significantly less stack space when importing modules by
+ allocating path buffers on the heap instead of the stack.
+
+- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
+ passed strings.
+
+- Issue #1469629: Allow cycles through an object's __dict__ slot to be
+ collected. (For example if ``x.__dict__ is x``).
+
+- Issue #14205: dict lookup raises a RuntimeError if the dict is modified
+ during a lookup.
+
+- Issue #14220: When a generator is delegating to another iterator with the
+ yield from syntax, it needs to have its ``gi_running`` flag set to True.
+
+- Issue #14435: Remove dedicated block allocator from floatobject.c and rely
+ on the PyObject_Malloc() api like all other objects.
+
+- Issue #14471: Fix a possible buffer overrun in the winreg module.
+
+- Issue #14288: Allow the serialization of builtin iterators
+
+Library
+-------
+
+- Issue #14300: Under Windows, sockets created using socket.dup() now allow
+ overlapped I/O. Patch by sbt.
+
+- Issue #13872: socket.detach() now marks the socket closed (as mirrored
+ in the socket repr()). Patch by Matt Joiner.
+
+- Issue #14406: Fix a race condition when using ``concurrent.futures.wait(
+ return_when=ALL_COMPLETED)``. Patch by Matt Joiner.
+
+- Issue #5136: deprecate old, unused functions from tkinter.
+
+- Issue #14409: IDLE now properly executes commands in the Shell window
+ when it cannot read the normal config files on startup and
+ has to use the built-in default key bindings.
+ There was previously a bug in one of the defaults.
+
+- Issue #14416: syslog now defines the LOG_ODELAY and LOG_AUTHPRIV constants
+ if they are defined in <syslog.h>.
+
+- IDLE can be launched as python -m idlelib
+
+- Issue #14295: Add unittest.mock
+
+- Issue #7652: Add --with-system-libmpdec option to configure for linking
+ the _decimal module against an installed libmpdec.
+
+- Issue #14380: MIMEText now defaults to utf-8 when passed non-ASCII unicode
+ with no charset specified.
+
+- Issue #10340: asyncore - properly handle EINVAL in dispatcher constructor on
+ OSX; avoid to call handle_connect in case of a disconnected socket which
+ was not meant to connect.
+
+- Issue #14204: The ssl module now has support for the Next Protocol
+ Negotiation extension, if available in the underlying OpenSSL library.
+ Patch by Colin Marc.
+
+- Issue #3035: Unused functions from tkinter are marked as pending deprecated.
+
+- Issue #12757: Fix the skipping of doctests when python is run with -OO so
+ that it works in unittest's verbose mode as well as non-verbose mode.
+
+- Issue #7652: Integrate the decimal floating point libmpdec library to speed
+ up the decimal module. Performance gains of the new C implementation are
+ between 10x and 100x, depending on the application.
+
+- Issue #3573: IDLE hangs when passing invalid command line args
+ (directory(ies) instead of file(s)) (Patch by Guilherme Polo)
+
+- Issue #14269: SMTPD now conforms to the RFC and requires a HELO command
+ before MAIL, RCPT, or DATA.
+
+- Issue #13694: asynchronous connect in asyncore.dispatcher does not set addr
+ attribute.
+
+- Issue #14344: fixed the repr of email.policy objects.
+
+- Issue #11686: Added missing entries to email package __all__ lists
+ (mostly the new Bytes classes).
+
+- Issue #14335: multiprocessing's custom Pickler subclass now inherits from
+ the C-accelerated implementation. Patch by sbt.
+
+- Issue #10484: Fix the CGIHTTPServer's PATH_INFO handling problem.
+
+- Issue #11199: Fix the with urllib which hangs on particular ftp urls.
+
+- Improve the memory utilization and speed of functools.lru_cache.
+
+- Issue #14222: Use the new time.steady() function instead of time.time() for
+ timeout in queue and threading modules to not be affected of system time
+ update.
+
+- Issue #13248: Remove lib2to3.pytree.Base.get_prefix/set_prefix.
+
+- Issue #14234: CVE-2012-0876: Randomize hashes of xml attributes in the hash
+ table internal to the pyexpat module's copy of the expat library to avoid a
+ denial of service due to hash collisions. Patch by David Malcolm with some
+ modifications by the expat project.
+
+- Issue #14200: Idle shell crash on printing non-BMP unicode character.
+
+- Issue #12818: format address no longer needlessly \ escapes ()s in names when
+ the name ends up being quoted.
+
+- Issue #14062: BytesGenerator now correctly folds Header objects,
+ including using linesep when folding.
+
+- Issue #13839: When invoked on the command-line, the pstats module now
+ accepts several filenames of profile stat files and merges them all.
+ Patch by Matt Joiner.
+
+- Issue #14291: Email now defaults to utf-8 for non-ASCII unicode headers
+ instead of raising an error. This fixes a regression relative to 2.7.
+
+- Issue #989712: Support using Tk without a mainloop.
+
+- Issue #5219: Prevent event handler cascade in IDLE.
+
+- Issue #3835: Refuse to use unthreaded Tcl in threaded Python.
+
+- Issue #2843: Add new Tk API to Tkinter.
+
+- Issue #14184: Increase the default stack size for secondary threads on
+ Mac OS X to avoid interpreter crashes when using threads on 10.7.
+
+- Issue #14180: datetime.date.fromtimestamp(),
+ datetime.datetime.fromtimestamp() and datetime.datetime.utcfromtimestamp()
+ now raise an OSError instead of ValueError if localtime() or gmtime() failed.
+
+- Issue #14180: time.ctime(), gmtime(), time.localtime(),
+ datetime.date.fromtimestamp(), datetime.datetime.fromtimestamp() and
+ datetime.datetime.utcfromtimestamp() now raises an OverflowError, instead of
+ a ValueError, if the timestamp does not fit in time_t.
+
+- Issue #14180: datetime.datetime.fromtimestamp() and
+ datetime.datetime.utcfromtimestamp() now round microseconds towards zero
+ instead of rounding to nearest with ties going away from zero.
+
+- Issue #10543: Fix unittest test discovery with Jython bytecode files.
+
+- Issue #1178863: Separate initialisation from setting when initializing
+ Tkinter.Variables; harmonize exceptions to ValueError; only delete variables
+ that have not been deleted; assert that variable names are strings.
+
+- Issue #14104: Implement time.monotonic() on Mac OS X, patch written by
+ Nicholas Riley.
+
+- Issue #13394: the aifc module now uses warnings.warn() to signal warnings.
+
+- Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under
+ Windows when the child process has already exited.
+
+- Issue #14223: curses.addch() is no more limited to the range 0-255 when the
+ Python curses is not linked to libncursesw. It was a regression introduced
+ in Python 3.3a1.
+
+- Issue #14168: Check for presence of Element._attrs in minidom before
+ accessing it.
+
+- Issue #12328: Fix multiprocessing's use of overlapped I/O on Windows.
+ Also, add a multiprocessing.connection.wait(rlist, timeout=None) function
+ for polling multiple objects at once. Patch by sbt.
+
+- Issue #14007: Accept incomplete TreeBuilder objects (missing start, end,
+ data or close method) for the Python implementation as well.
+ Drop the no-op TreeBuilder().xml() method from the C implementation.
+
+- Issue #14210: pdb now has tab-completion not only for command names, but
+ also for their arguments, wherever possible.
+
+- Issue #14310: Sockets can now be with other processes on Windows using
+ the api socket.socket.share() and socket.fromshare().
+
+- Issue #10576: The gc module now has a 'callbacks' member that will get
+ called when garbage collection takes place.
+
+Build
+-----
+
+- Issue #14557: Fix extensions build on HP-UX. Patch by Adi Roiban.
+
+- Issue #14387: Do not include accu.h from Python.h.
+
+- Issue #14359: Only use O_CLOEXEC in _posixmodule.c if it is defined.
+ Based on patch from Hervé Coatanhay.
+
+- Issue #14321: Do not run pgen during the build if files are up to date.
+
+Documentation
+-------------
+
+- Issue #14034: added the argparse tutorial.
+
+- Issue #14324: Fix configure tests for cross builds.
+
+- Issue #14327: Call AC_CANONICAL_HOST in configure.ac and check in
+ config.{guess,sub}. Don't use uname calls for cross builds.
+
+Extension Modules
+-----------------
+
+- Issue #9041: An issue in ctypes.c_longdouble, ctypes.c_double, and
+ ctypes.c_float that caused an incorrect exception to be returned in the
+ case of overflow has been fixed.
+
+- Issue #14212: The re module didn't retain a reference to buffers it was
+ scanning, resulting in segfaults.
+
+- Issue #14259: The finditer() method of re objects did not take any
+ keyword arguments, contrary to the documentation.
+
+- Issue #10142: Support for SEEK_HOLE/SEEK_DATA (for example, under ZFS).
+
+Tests
+-----
+
+- Issue #14442: Add missing errno import in test_smtplib.
+
+- Issue #8315: (partial fix) python -m unittest test.test_email now works.
+
+
+What's New in Python 3.3.0 Alpha 1?
+===================================
+
+*Release date: 05-Mar-2012*
+
+Core and Builtins
+-----------------
+
+- Issue #14172: Fix reference leak when marshalling a buffer-like object
+ (other than a bytes object).
+
+- Issue #13521: dict.setdefault() now does only one lookup for the given key,
+ making it "atomic" for many purposes. Patch by Filip Gruszczyński.
+
+- PEP 409, Issue #6210: "raise X from None" is now supported as a means of
+ suppressing the display of the chained exception context. The chained
+ context still remains available as the __context__ attribute.
+
+- Issue #10181: New memoryview implementation fixes multiple ownership
+ and lifetime issues of dynamically allocated Py_buffer members (#9990)
+ as well as crashes (#8305, #7433). Many new features have been added
+ (See whatsnew/3.3), and the documentation has been updated extensively.
+ The ndarray test object from _testbuffer.c implements all aspects of
+ PEP-3118, so further development towards the complete implementation
+ of the PEP can proceed in a test-driven manner.
+
+ Thanks to Nick Coghlan, Antoine Pitrou and Pauli Virtanen for review
+ and many ideas.
+
+- Issue #12834: Fix incorrect results of memoryview.tobytes() for
+ non-contiguous arrays.
+
+- Issue #5231: Introduce memoryview.cast() method that allows changing
+ format and shape without making a copy of the underlying memory.
+
+- Issue #14084: Fix a file descriptor leak when importing a module with a
+ bad encoding.
+
+- Upgrade Unicode data to Unicode 6.1.
+
+- Issue #14040: Remove rarely used file name suffixes for C extensions
+ (under POSIX mainly).
+
+- Issue #14051: Allow arbitrary attributes to be set of classmethod and
+ staticmethod.
+
+- Issue #13703: oCERT-2011-003: Randomize hashes of str and bytes to protect
+ against denial of service attacks due to hash collisions within the dict and
+ set types. Patch by David Malcolm, based on work by Victor Stinner.
+
+- Issue #13020: Fix a reference leak when allocating a structsequence object
+ fails. Patch by Suman Saha.
+
+- Issue #13908: Ready types returned from PyType_FromSpec.
+
+- Issue #11235: Fix OverflowError when trying to import a source file whose
+ modification time doesn't fit in a 32-bit timestamp.
+
+- Issue #12705: A SyntaxError exception is now raised when attempting to
+ compile multiple statements as a single interactive statement.
+
+- Fix the builtin module initialization code to store the init function for
+ future reinitialization.
+
+- Issue #8052: The posix subprocess module would take a long time closing
+ all possible file descriptors in the child process rather than just open
+ file descriptors. It now closes only the open fds if possible for the
+ default close_fds=True behavior.
+
+- Issue #13629: Renumber the tokens in token.h so that they match the indexes
+ into _PyParser_TokenNames.
+
+- Issue #13752: Add a casefold() method to str.
+
+- Issue #13761: Add a "flush" keyword argument to the print() function,
+ used to ensure flushing the output stream.
+
+- Issue #13645: pyc files now contain the size of the corresponding source
+ code, to avoid timestamp collisions (especially on filesystems with a low
+ timestamp resolution) when checking for freshness of the bytecode.
+
+- PEP 380, Issue #11682: Add "yield from <x>" to support easy delegation to
+ subgenerators (initial patch by Greg Ewing, integration into 3.3 by
+ Renaud Blanch, Ryan Kelly, Zbigniew Jędrzejewski-Szmek and Nick Coghlan)
+
+- Issue #13748: Raw bytes literals can now be written with the ``rb`` prefix
+ as well as ``br``.
+
+- Issue #12736: Use full unicode case mappings for upper, lower, and title case.
+
+- Issue #12760: Add a create mode to open(). Patch by David Townshend.
+
+- Issue #13738: Simplify implementation of bytes.lower() and bytes.upper().
+
+- Issue #13577: Built-in methods and functions now have a __qualname__.
+ Patch by sbt.
+
+- Issue #6695: Full garbage collection runs now clear the freelist of set
+ objects. Initial patch by Matthias Troffaes.
+
+- Fix OSError.__init__ and OSError.__new__ so that each of them can be
+ overriden and take additional arguments (followup to issue #12555).
+
+- Fix the fix for issue #12149: it was incorrect, although it had the side
+ effect of appearing to resolve the issue. Thanks to Mark Shannon for
+ noticing.
+
+- Issue #13505: Pickle bytes objects in a way that is compatible with
+ Python 2 when using protocols <= 2.
+
+- Issue #11147: Fix an unused argument in _Py_ANNOTATE_MEMORY_ORDER. (Fix
+ given by Campbell Barton).
+
+- Issue #13503: Use a more efficient reduction format for bytearrays with
+ pickle protocol >= 3. The old reduction format is kept with older protocols
+ in order to allow unpickling under Python 2. Patch by Irmen de Jong.
+
+- Issue #7111: Python can now be run without a stdin, stdout or stderr
+ stream. It was already the case with Python 2. However, the corresponding
+ sys module entries are now set to None (instead of an unusable file object).
+
+- Issue #11849: Ensure that free()d memory arenas are really released
+ on POSIX systems supporting anonymous memory mappings. Patch by
+ Charles-François Natali.
+
+- Issue #13452: PyUnicode_EncodeDecimal() doesn't support error handlers
+ different than "strict" anymore. The caller was unable to compute the
+ size of the output buffer: it depends on the error handler.
+
+- PEP 3155 / issue #13448: Qualified name for classes and functions.
+
+- Issue #13436: Fix a bogus error message when an AST object was passed
+ an invalid integer value.
+
+- Issue #13411: memoryview objects are now hashable when the underlying
+ object is hashable.
+
+- Issue #13338: Handle all enumerations in _Py_ANNOTATE_MEMORY_ORDER
+ to allow compiling extension modules with -Wswitch-enum on gcc.
+ Initial patch by Floris Bruynooghe.
+
+- Issue #10227: Add an allocation cache for a single slice object. Patch by
+ Stefan Behnel.
+
+- Issue #13393: BufferedReader.read1() now asks the full requested size to
+ the raw stream instead of limiting itself to the buffer size.
+
+- Issue #13392: Writing a pyc file should now be atomic under Windows as well.
+
+- Issue #13333: The UTF-7 decoder now accepts lone surrogates (the encoder
+ already accepts them).
+
+- Issue #13389: Full garbage collection passes now clear the freelists for
+ list and dict objects. They already cleared other freelists in the
+ interpreter.
+
+- Issue #13327: Remove the need for an explicit None as the second argument
+ to os.utime, os.lutimes, os.futimes, os.futimens, os.futimesat, in
+ order to update to the current time. Also added keyword argument
+ handling to os.utimensat in order to remove the need for explicit None.
+
+- Issue #13350: Simplify some C code by replacing most usages of
+ PyUnicode_Format by PyUnicode_FromFormat.
+
+- Issue #13342: input() used to ignore sys.stdin's and sys.stdout's unicode
+ error handler in interactive mode (when calling into PyOS_Readline()).
+
+- Issue #9896: Add start, stop, and step attributes to range objects.
+
+- Issue #13343: Fix a SystemError when a lambda expression uses a global
+ variable in the default value of a keyword-only argument: ``lambda *,
+ arg=GLOBAL_NAME: None``
+
+- Issue #12797: Added custom opener parameter to builtin open() and
+ FileIO.open().
+
+- Issue #10519: Avoid unnecessary recursive function calls in
+ setobject.c.
+
+- Issue #10363: Deallocate global locks in Py_Finalize().
+
+- Issue #13018: Fix reference leaks in error paths in dictobject.c.
+ Patch by Suman Saha.
+
+- Issue #13201: Define '==' and '!=' to compare range objects based on
+ the sequence of values they define (instead of comparing based on
+ object identity).
+
+- Issue #1294232: In a few cases involving metaclass inheritance, the
+ interpreter would sometimes invoke the wrong metaclass when building a new
+ class object. These cases now behave correctly. Patch by Daniel Urban.
+
+- Issue #12753: Add support for Unicode name aliases and named sequences.
+ Both ``unicodedata.lookup()`` and '\N{...}' now resolve aliases,
+ and ``unicodedata.lookup()`` resolves named sequences too.
+
+- Issue #12170: The count(), find(), rfind(), index() and rindex() methods
+ of bytes and bytearray objects now accept an integer between 0 and 255
+ as their first argument. Patch by Petri Lehtinen.
+
+- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler
+ warnings. Patch by Josh Triplett and Petri Lehtinen.
+
+- Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore
+ error handlers on all Windows versions. The MBCS codec is now supporting all
+ error handlers, instead of only replace to encode and ignore to decode.
+
+- Issue #13188: When called without an explicit traceback argument,
+ generator.throw() now gets the traceback from the passed exception's
+ ``__traceback__`` attribute. Patch by Petri Lehtinen.
+
+- Issue #13146: Writing a pyc file is now atomic under POSIX.
+
+- Issue #7833: Extension modules built using distutils on Windows will no
+ longer include a "manifest" to prevent them failing at import time in some
+ embedded situations.
+
+- PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.
+
+- Issue #13560: Add PyUnicode_DecodeLocale(), PyUnicode_DecodeLocaleAndSize()
+ and PyUnicode_EncodeLocale() functions to the C API to decode/encode from/to
+ the current locale encoding.
+
+- Add internal API for static strings (_Py_identifier et al.).
+
+- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described
+ as "The pipe is being closed") is now mapped to POSIX errno EPIPE
+ (previously EINVAL).
+
+- Issue #12911: Fix memory consumption when calculating the repr() of huge
+ tuples or lists.
+
+- PEP 393: flexible string representation. Thanks to Torsten Becker for the
+ initial implementation, and Victor Stinner for various bug fixes.
+
+- Issue #14081: The 'sep' and 'maxsplit' parameter to str.split, bytes.split,
+ and bytearray.split may now be passed as keyword arguments.
+
+- Issue #13012: The 'keepends' parameter to str.splitlines may now be passed
+ as a keyword argument: "my_string.splitlines(keepends=True)". The same
+ change also applies to bytes.splitlines and bytearray.splitlines.
+
+- Issue #7732: Don't open a directory as a file anymore while importing a
+ module. Ignore the direcotry if its name matchs the module name (e.g.
+ "__init__.py") and raise a ImportError instead.
+
+- Issue #13021: Missing decref on an error path. Thanks to Suman Saha for
+ finding the bug and providing a patch.
+
+- Issue #12973: Fix overflow checks that relied on undefined behaviour in
+ list_repeat (listobject.c) and islice_next (itertoolsmodule.c). These bugs
+ caused test failures with recent versions of Clang.
+
+- Issue #12904: os.utime, os.futimes, os.lutimes, and os.futimesat now write
+ atime and mtime with nanosecond precision on modern POSIX platforms.
+
+- Issue #12802: the Windows error ERROR_DIRECTORY (numbered 267) is now
+ mapped to POSIX errno ENOTDIR (previously EINVAL).
+
+- Issue #9200: The str.is* methods now work with strings that contain non-BMP
+ characters even in narrow Unicode builds.
+
+- Issue #12791: Break reference cycles early when a generator exits with
+ an exception.
+
+- Issue #12773: Make __doc__ mutable on user-defined classes.
+
+- Issue #12766: Raise a ValueError when creating a class with a class variable
+ that conflicts with a name in __slots__.
+
+- Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase
+ titlecased and cased non-letter characters.
+
+- Issue #12732: In narrow unicode builds, allow Unicode identifiers which fall
+ outside the BMP.
+
+- Issue #12575: Validate user-generated AST before it is compiled.
+
+- Make type(None), type(Ellipsis), and type(NotImplemented) callable. They
+ return the respective singleton instances.
+
+- Forbid summing bytes with sum().
+
+- Verify the types of AST strings and identifiers provided by the user before
+ compiling them.
+
+- Issue #12647: The None object now has a __bool__() method that returns False.
+ Formerly, bool(None) returned False only because of special case logic
+ in PyObject_IsTrue().
+
+- Issue #12579: str.format_map() now raises a ValueError if used on a
+ format string that contains positional fields. Initial patch by
+ Julian Berman.
+
+- Issue #10271: Allow warnings.showwarning() be any callable.
+
+- Issue #11627: Fix segfault when __new__ on a exception returns a
+ non-exception class.
+
+- Issue #12149: Update the method cache after a type's dictionary gets
+ cleared by the garbage collector. This fixes a segfault when an instance
+ and its type get caught in a reference cycle, and the instance's
+ deallocator calls one of the methods on the type (e.g. when subclassing
+ IOBase). Diagnosis and patch by Davide Rizzo.
+
+- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows.
+
+- Issue #9642: Uniformize the tests on the availability of the mbcs codec, add
+ a new HAVE_MBCS define.
+
+- Issue #9642: Fix filesystem encoding initialization: use the ANSI code page
+ on Windows if the mbcs codec is not available, and fail with a fatal error if
+ we cannot get the locale encoding (if nl_langinfo(CODESET) is not available)
+ instead of using UTF-8.
+
+- When a generator yields, do not retain the caller's exception state on the
+ generator.
+
+- Issue #12475: Prevent generators from leaking their exception state into the
+ caller's frame as they return for the last time.
+
+- Issue #12291: You can now load multiple marshalled objects from a stream,
+ with other data interleaved between marshalled objects.
+
+- Issue #12356: When required positional or keyword-only arguments are not
+ given, produce a informative error message which includes the name(s) of the
+ missing arguments.
+
+- Issue #12370: Fix super with no arguments when __class__ is overriden in the
+ class body.
+
+- Issue #12084: os.stat on Windows now works properly with relative symbolic
+ links when called from any directory.
+
+- Loosen type restrictions on the __dir__ method. __dir__ can now return any
+ sequence, which will be converted to a list and sorted by dir().
+
+- Issue #12265: Make error messages produced by passing an invalid set of
+ arguments to a function more informative.
+
+- Issue #12225: Still allow Python to build if Python is not in its hg repo or
+ mercurial is not installed.
+
+- Issue #1195: my_fgets() now always clears errors before calling fgets(). Fix
+ the following case: sys.stdin.read() stopped with CTRL+d (end of file),
+ raw_input() interrupted by CTRL+c.
+
+- Issue #12216: Allow unexpected EOF errors to happen on any line of the file.
+
+- Issue #12199: The TryExcept and TryFinally and AST nodes have been unified
+ into a Try node.
+
+- Issue #9670: Increase the default stack size for secondary threads on
+ Mac OS X and FreeBSD to reduce the chances of a crash instead of a
+ "maximum recursion depth" RuntimeError exception.
+ (patch by Ronald Oussoren)
+
+- Issue #12106: The use of the multiple-with shorthand syntax is now reflected
+ in the AST.
+
+- Issue #12190: Try to use the same filename object when compiling unmarshalling
+ a code objects in the same file.
+
+- Issue #12166: Move implementations of dir() specialized for various types into
+ the __dir__() methods of those types.
+
+- Issue #5715: In socketserver, close the server socket in the child process.
+
+- Correct lookup of __dir__ on objects. Among other things, this causes errors
+ besides AttributeError found on lookup to be propagated.
+
+- Issue #12060: Use sig_atomic_t type and volatile keyword in the signal
+ module. Patch written by Charles-François Natali.
+
+- Issue #1746656: Added the if_nameindex, if_indextoname, if_nametoindex
+ methods to the socket module.
+
+- Issue #12044: Fixed subprocess.Popen when used as a context manager to
+ wait for the process to end when exiting the context to avoid unintentionally
+ leaving zombie processes around.
+
+- Issue #1195: Fix input() if it is interrupted by CTRL+d and then CTRL+c,
+ clear the end-of-file indicator after CTRL+d.
+
+- Issue #1856: Avoid crashes and lockups when daemon threads run while the
+ interpreter is shutting down; instead, these threads are now killed when
+ they try to take the GIL.
+
+- Issue #9756: When calling a method descriptor or a slot wrapper descriptor,
+ the check of the object type doesn't read the __class__ attribute anymore.
+ Fix a crash if a class override its __class__ attribute (e.g. a proxy of the
+ str type). Patch written by Andreas Stührk.
+
+- Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
+ APIs, to avoid a crash with the pthread implementation in RHEL 5. Patch
+ by Charles-François Natali.
+
+- Issue #10914: Initialize correctly the filesystem codec when creating a new
+ subinterpreter to fix a bootstrap issue with codecs implemented in Python, as
+ the ISO-8859-15 codec.
+
+- Issue #11918: OS/2 and VMS are no more supported because of the lack of
+ maintainer.
+
+- Issue #6780: fix starts/endswith error message to mention that tuples are
+ accepted too.
+
+- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
+ between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP
+ chars (e.g. "\U00012345"[0]).
+
+- Issue #11845: Fix typo in rangeobject.c that caused a crash in
+ compute_slice_indices. Patch by Daniel Urban.
+
+- Issue #5673: Added a `timeout` keyword argument to subprocess.Popen.wait,
+ subprocess.Popen.communicated, subprocess.call, subprocess.check_call, and
+ subprocess.check_output. If the blocking operation takes more than `timeout`
+ seconds, the `subprocess.TimeoutExpired` exception is raised.
+
+- Issue #11650: PyOS_StdioReadline() retries fgets() if it was interrupted
+ (EINTR), for example if the program is stopped with CTRL+z on Mac OS X. Patch
+ written by Charles-Francois Natali.
+
+- Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
+
+- Issue #10785: Store the filename as Unicode in the Python parser.
+
+- Issue #11619: _PyImport_LoadDynamicModule() doesn't encode the path to bytes
+ on Windows.
+
+- Issue #10998: Remove mentions of -Q, sys.flags.division_warning and
+ Py_DivisionWarningFlag left over from Python 2.
+
+- Issue #11244: Remove an unnecessary peepholer check that was preventing
+ negative zeros from being constant-folded properly.
+
+- Issue #11395: io.FileIO().write() clamps the data length to 32,767 bytes on
+ Windows if the file is a TTY to workaround a Windows bug. The Windows console
+ returns an error (12: not enough space error) on writing into stdout if
+ stdout mode is binary and the length is greater than 66,000 bytes (or less,
+ depending on heap usage).
+
+- Issue #11320: fix bogus memory management in Modules/getpath.c, leading to
+ a possible crash when calling Py_SetPath().
+
+- Issue #11432: A bug was introduced in subprocess.Popen on posix systems with
+ 3.2.0 where the stdout or stderr file descriptor being the same as the stdin
+ file descriptor would raise an exception. webbrowser.open would fail. fixed.
+
+- Issue #9856: Change object.__format__ with a non-empty format string
+ to be a DeprecationWarning. In 3.2 it was a PendingDeprecationWarning.
+ In 3.4 it will be a TypeError.
+
+- Issue #11244: The peephole optimizer is now able to constant-fold
+ arbitrarily complex expressions. This also fixes a 3.2 regression where
+ operations involving negative numbers were not constant-folded.
+
+- Issue #11450: Don't truncate hg version info in Py_GetBuildInfo() when
+ there are many tags (e.g. when using mq). Patch by Nadeem Vawda.
+
+- Issue #11335: Fixed a memory leak in list.sort when the key function
+ throws an exception.
+
+- Issue #8923: When a string is encoded to UTF-8 in strict mode, the result is
+ cached into the object. Examples: str.encode(), str.encode('utf-8'),
+ PyUnicode_AsUTF8String() and PyUnicode_AsEncodedString(unicode, "utf-8",
+ NULL).
+
+- Issue #10831: PyUnicode_FromFormat() supports %li, %lli and %zi formats.
+
+- Issue #10829: Refactor PyUnicode_FromFormat(), use the same function to parse
+ the format string in the 3 steps, fix crashs on invalid format strings.
+
+- Issue #13007: whichdb should recognize gdbm 1.9 magic numbers.
+
+- Issue #11246: Fix PyUnicode_FromFormat("%V") to decode the byte string from
+ UTF-8 (with replace error handler) instead of ISO-8859-1 (in strict mode).
+ Patch written by Ray Allen.
+
+- Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
+ a buffer struct having a NULL data pointer.
+
+- Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
+ sys.stdin uses universal newline (replace '\r\n' by '\n').
+
+- Issue #11828: startswith and endswith now accept None as slice index.
+ Patch by Torsten Becker.
+
+- Issue #10830: Fix PyUnicode_FromFormatV("%c") for non-BMP characters on
+ narrow build.
+
+- Issue #11168: Remove filename debug variable from PyEval_EvalFrameEx().
+ It encoded the Unicode filename to UTF-8, but the encoding fails on
+ undecodable filename (on surrogate characters) which raises an unexpected
+ UnicodeEncodeError on recursion limit.
+
+- Issue #11187: Remove bootstrap code (use ASCII) of
+ PyUnicode_AsEncodedString(), it was replaced by a better fallback (use the
+ locale encoding) in PyUnicode_EncodeFSDefault().
+
+- Check for NULL result in PyType_FromSpec.
+
+- Issue #10516: New copy() and clear() methods for lists and bytearrays.
+
+- Issue #11386: bytearray.pop() now throws IndexError when the bytearray is
+ empty, instead of OverflowError.
+
+- Issue #12380: The rjust, ljust and center methods of bytes and bytearray
+ now accept a bytearray argument.
+
+Library
+-------
+
+- Issue #14195: An issue that caused weakref.WeakSet instances to incorrectly
+ return True for a WeakSet instance 'a' in both 'a < a' and 'a > a' has been
+ fixed.
+
+- Issue #14166: Pickler objects now have an optional ``dispatch_table``
+ attribute which allows to set custom per-pickler reduction functions.
+ Patch by sbt.
+
+- Issue #14177: marshal.loads() now raises TypeError when given an unicode
+ string. Patch by Guilherme Gonçalves.
+
+- Issue #13550: Remove the debug machinery from the threading module: remove
+ verbose arguments from all threading classes and functions.
+
+- Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary,
+ WeakValueDictionary) to return a better approximation when some objects
+ are dead or dying. Moreover, the implementation is now O(1) rather than
+ O(n).
+
+- Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode.
+ Patch by Mikhail Novikov.
+
+- Issue #11841: Fix comparison bug with 'rc' versions in packaging.version.
+ Patch by Filip Gruszczyński.
+
+- Issue #13447: Add a test file to host regression tests for bugs in the
+ scripts found in the Tools directory.
+
+- Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils
+ on Windows. Also fixed in packaging.
+
+- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions
+ on 32-bit architectures. Initial patch by Philippe Devalkeneer.
+
+- HTMLParser is now able to handle slashes in the start tag.
+
+- Issue #13641: Decoding functions in the base64 module now accept ASCII-only
+ unicode strings. Patch by Catalin Iacob.
+
+- Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a
+ new importlib.invalidate_caches() function.
+
+- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in
+ SimpleXMLRPCServer upon malformed POST request.
+
+- Issue #13961: Move importlib over to using os.replace() for atomic renaming.
+
+- Do away with ambiguous level values (as suggested by PEP 328) in
+ importlib.__import__() by raising ValueError when level < 0.
+
+- Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF.
+
+- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert().
+
+- Issue #13777: Add PF_SYSTEM sockets on OS X.
+ Patch by Michael Goderbauer.
+
+- Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
+ Patch by Suman Saha.
+
+- Issue #1326113: distutils' and packaging's build_ext commands option now
+ correctly parses multiple values (separated by whitespace or commas) given
+ to their --libraries option.
+
+- Issue #10287: nntplib now queries the server's CAPABILITIES first before
+ sending MODE READER, and only sends it if not already in READER mode.
+ Patch by Hynek Schlawack.
+
+- Issue #13993: HTMLParser is now able to handle broken end tags when
+ strict=False.
+
+- Issue #13930: lib2to3 now supports writing converted output files to another
+ directory tree as well as copying unchanged files and altering the file
+ suffix.
+
+- Issue #9750: Fix sqlite3.Connection.iterdump on tables and fields
+ with a name that is a keyword or contains quotes. Patch by Marko
+ Kohtala.
+
+- Issue #10287: nntplib now queries the server's CAPABILITIES again after
+ authenticating (since the result may change, according to RFC 4643).
+ Patch by Hynek Schlawack.
+
+- Issue #13989: Document that GzipFile does not support text mode, and give a
+ more helpful error message when opened with an invalid mode string.
+
+- Issue #13590: On OS X 10.7 and 10.6 with Xcode 4.2, building
+ Distutils-based packages with C extension modules may fail because
+ Apple has removed gcc-4.2, the version used to build python.org
+ 64-bit/32-bit Pythons. If the user does not explicitly override
+ the default C compiler by setting the CC environment variable,
+ Distutils will now attempt to compile extension modules with clang
+ if gcc-4.2 is required but not found. Also as a convenience, if
+ the user does explicitly set CC, substitute its value as the default
+ compiler in the Distutils LDSHARED configuration variable for OS X.
+ (Note, the python.org 32-bit-only Pythons use gcc-4.0 and the 10.4u
+ SDK, neither of which are available in Xcode 4. This change does not
+ attempt to override settings to support their use with Xcode 4.)
+
+- Issue #13960: HTMLParser is now able to handle broken comments when
+ strict=False.
+
+- Issue #13921: Undocument and clean up sqlite3.OptimizedUnicode,
+ which is obsolete in Python 3.x. It's now aliased to str for
+ backwards compatibility.
+
+- When '' is a path (e.g. in sys.path), make sure __file__ uses the current
+ working directory instead of '' in importlib.
+
+- Issue #13609: Add two functions to query the terminal size:
+ os.get_terminal_size (low level) and shutil.get_terminal_size (high level).
+ Patch by Zbigniew Jędrzejewski-Szmek.
+
+- Issue #13845: On Windows, time.time() now uses GetSystemTimeAsFileTime()
+ instead of ftime() to have a resolution of 100 ns instead of 1 ms (the clock
+ accuracy is between 0.5 ms and 15 ms).
+
+- Issue #13846: Add time.monotonic(), monotonic clock.
+
+- Issue #8184: multiprocessing: On Windows, don't set SO_REUSEADDR on
+ Connection sockets, and set FILE_FLAG_FIRST_PIPE_INSTANCE on named pipes, to
+ make sure two listeners can't bind to the same socket/pipe (or any existing
+ socket/pipe).
+
+- Issue #10811: Fix recursive usage of cursors. Instead of crashing,
+ raise a ProgrammingError now.
+
+- Issue #10881: Fix test_site failure with OS X framework builds.
+
+- Issue #964437: Make IDLE help window non-modal.
+ Patch by Guilherme Polo and Roger Serwy.
+
+- Issue #13734: Add os.fwalk(), a directory walking function yielding file
+ descriptors.
+
+- Issue #2945: Make the distutils upload command aware of bdist_rpm products.
+
+- Issue #13712: pysetup create should not convert package_data to extra_files.
+
+- Issue #11805: package_data in setup.cfg should allow more than one value.
+
+- Issue #13933: IDLE auto-complete did not work with some imported
+ module, like hashlib. (Patch by Roger Serwy)
+
+- Issue #13901: Prevent test_distutils failures on OS X with --enable-shared.
+
+- Issue #13676: Handle strings with embedded zeros correctly in sqlite3.
+
+- Issue #13506: Add '' to path for IDLE Shell when started and restarted with Restart Shell.
+ Original patches by Marco Scataglini and Roger Serwy.
+
+- Issue #8828: Add new function os.replace(), for cross-platform renaming
+ with overwriting.
+
+- Issue #13848: open() and the FileIO constructor now check for NUL
+ characters in the file name. Patch by Hynek Schlawack.
+
+- Issue #13806: The size check in audioop decompression functions was too
+ strict and could reject valid compressed data. Patch by Oleg Plakhotnyuk.
+
+- Issue #13812: When a multiprocessing Process child raises an exception,
+ flush stderr after printing the exception traceback.
+
+- Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC
+ IV attack countermeasure.
+
+- Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead
+ of ValueError on failure. time.ctime() and time.asctime() now raises an
+ OSError if localtime() failed. time.clock() now raises a RuntimeError if the
+ processor time used is not available or its value cannot be represented
+
+- Issue #13862: Fix spurious failure in test_zlib due to runtime/compile time
+ minor versions not matching.
+
+- Issue #12804: Fix test_socket and test_urllib2net failures when running tests
+ on a system without internet access.
+
+- Issue #13772: In os.symlink() under Windows, do not try to guess the link
+ target's type (file or directory). The detection was buggy and made the
+ call non-atomic (therefore prone to race conditions).
+
+- Issue #6631: Disallow relative file paths in urllib urlopen methods.
+
+- Issue #13722: Avoid silencing ImportErrors when initializing the codecs
+ registry.
+
+- Issue #13781: Fix GzipFile bug that caused an exception to be raised when
+ opening for writing using a fileobj returned by os.fdopen().
+
+- Issue #13803: Under Solaris, distutils doesn't include bitness
+ in the directory name.
+
+- Issue #10278: Add time.wallclock() function, monotonic clock.
+
+- Issue #13809: Fix regression where bz2 module wouldn't work when threads are
+ disabled. Original patch by Amaury Forgeot d'Arc.
+
+- Issue #13589: Fix some serialization primitives in the aifc module.
+ Patch by Oleg Plakhotnyuk.
+
+- Issue #13642: Unquote before b64encoding user:password during Basic
+ Authentication. Patch contributed by Joonas Kuorilehto.
+
+- Issue #13726: Fix the ambiguous -S flag in regrtest. It is -o/--slow for slow
+ tests.
+
+- Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor.
+ The hang would occur when retrieving the result of a scheduled future after
+ the executor had been shut down.
+
+- Issue #13502: threading: Fix a race condition in Event.wait() that made it
+ return False when the event was set and cleared right after.
+
+- Issue #9993: When the source and destination are on different filesystems,
+ and the source is a symlink, shutil.move() now recreates a symlink on the
+ destination instead of copying the file contents. Patch by Jonathan Niehof
+ and Hynek Schlawack.
+
+- Issue #12926: Fix a bug in tarfile's link extraction.
+
+- Issue #13696: Fix the 302 Relative URL Redirection problem.
+
+- Issue #13636: Weak ciphers are now disabled by default in the ssl module
+ (except when SSLv2 is explicitly asked for).
+
+- Issue #12715: Add an optional symlinks argument to shutil functions
+ (copyfile, copymode, copystat, copy, copy2). When that parameter is
+ true, symlinks aren't dereferenced and the operation instead acts on the
+ symlink itself (or creates one, if relevant). Patch by Hynek Schlawack.
+
+- Add a flags parameter to select.epoll.
+
+- Issue #13626: Add support for SSL Diffie-Hellman key exchange, through the
+ SSLContext.load_dh_params() method and the ssl.OP_SINGLE_DH_USE option.
+
+- Issue #11006: Don't issue low level warning in subprocess when pipe2() fails.
+
+- Issue #13620: Support for Chrome browser in webbrowser. Patch contributed
+ by Arnaud Calmettes.
+
+- Issue #11829: Fix code execution holes in inspect.getattr_static for
+ metaclasses with metaclasses. Patch by Andreas Stührk.
+
+- Issue #12708: Add starmap() and starmap_async() methods (similar to
+ itertools.starmap()) to multiprocessing.Pool. Patch by Hynek Schlawack.
+
+- Issue #1785: Fix inspect and pydoc with misbehaving descriptors.
+
+- Issue #13637: "a2b" functions in the binascii module now accept ASCII-only
+ unicode strings.
+
+- Issue #13634: Add support for querying and disabling SSL compression.
+
+- Issue #13627: Add support for SSL Elliptic Curve-based Diffie-Hellman
+ key exchange, through the SSLContext.set_ecdh_curve() method and the
+ ssl.OP_SINGLE_ECDH_USE option.
+
+- Issue #13635: Add ssl.OP_CIPHER_SERVER_PREFERENCE, so that SSL servers
+ choose the cipher based on their own preferences, rather than on the
+ client's.
+
+- Issue #11813: Fix inspect.getattr_static for modules. Patch by Andreas
+ Stührk.
+
+- Issue #7502: Fix equality comparison for DocTestCase instances. Patch by
+ Cédric Krier.
+
+- Issue #11870: threading: Properly reinitialize threads internal locks and
+ condition variables to avoid deadlocks in child processes.
+
+- Issue #8035: urllib: Fix a bug where the client could remain stuck after a
+ redirection or an error.
+
+- Issue #13560: os.strerror() now uses the current locale encoding instead of
+ UTF-8.
+
+- Issue #8373: The filesystem path of AF_UNIX sockets now uses the filesystem
+ encoding and the surrogateescape error handler, rather than UTF-8. Patch
+ by David Watson.
+
+- Issue #10350: Read and save errno before calling a function which might
+ overwrite it. Original patch by Hallvard B Furuseth.
+
+- Issue #11610: Introduce a more general way to declare abstract properties.
+
+- Issue #13591: A bug in importlib has been fixed that caused import_module
+ to load a module twice.
+
+- Issue #4625: If IDLE cannot write to its recent file or breakpoint files,
+ display a message popup and continue rather than crash. Original patch by
+ Roger Serwy.
+
+- Issue #13449 sched.scheduler.run() method has a new "blocking" parameter which
+ when set to False makes run() execute the scheduled events due to expire
+ soonest (if any) and then return. Patch by Giampaolo Rodolà.
+
+- Issue #8684 sched.scheduler class can be safely used in multi-threaded
+ environments. Patch by Josiah Carlson and Giampaolo Rodolà.
+
+- Alias resource.error to OSError ala PEP 3151.
+
+- Issue #5689: Add support for lzma compression to the tarfile module.
+
+- Issue #13248: Turn 3.2's PendingDeprecationWarning into 3.3's
+ DeprecationWarning. It covers 'cgi.escape', 'importlib.abc.PyLoader',
+ 'importlib.abc.PyPycLoader', 'nntplib.NNTP.xgtitle', 'nntplib.NNTP.xpath',
+ and private attributes of 'smtpd.SMTPChannel'.
+
+- Issue #5905, #13560: time.strftime() is now using the current locale
+ encoding, instead of UTF-8, if the wcsftime() function is not available.
+
+- Issue #8641: Update IDLE 3 syntax coloring to recognize b".." and not u"..".
+ Patch by Tal Einat.
+
+- Issue #13464: Add a readinto() method to http.client.HTTPResponse. Patch
+ by Jon Kuhn.
+
+- tarfile.py: Correctly detect bzip2 compressed streams with blocksizes
+ other than 900k.
+
+- Issue #13439: Fix many errors in turtle docstrings.
+
+- Issue #6715: Add a module 'lzma' for compression using the LZMA algorithm.
+ Thanks to Per Øyvind Karlsen for the initial implementation.
+
+- Issue #13487: Make inspect.getmodule robust against changes done to
+ sys.modules while it is iterating over it.
+
+- Issue #12618: Fix a bug that prevented py_compile from creating byte
+ compiled files in the current directory. Initial patch by Sjoerd de Vries.
+
+- Issue #13444: When stdout has been closed explicitly, we should not attempt
+ to flush it at shutdown and print an error.
+
+- Issue #12567: The curses module uses Unicode functions for Unicode arguments
+ when it is linked to the ncurses library. It encodes also Unicode strings to
+ the locale encoding instead of UTF-8.
+
+- Issue #12856: Ensure child processes do not inherit the parent's random
+ seed for filename generation in the tempfile module. Patch by Brian
+ Harring.
+
+- Issue #9957: SpooledTemporaryFile.truncate() now accepts an optional size
+ parameter, as other file-like objects. Patch by Ryan Kelly.
+
+- Issue #13458: Fix a memory leak in the ssl module when decoding a
+ certificate with a subjectAltName. Patch by Robert Xiao.
+
+- Issue #13415: os.unsetenv() doesn't ignore errors anymore.
+
+- Issue #13245: sched.scheduler class constructor's timefunc and
+ delayfunct parameters are now optional.
+ scheduler.enter and scheduler.enterabs methods gained a new kwargs parameter.
+ Patch contributed by Chris Clark.
+
+- Issue #12328: Under Windows, refactor handling of Ctrl-C events and
+ make _multiprocessing.win32.WaitForMultipleObjects interruptible when
+ the wait_flag parameter is false. Patch by sbt.
+
+- Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
+ raised when the wrapped raw file is non-blocking and the write would block.
+ Previous code assumed that the raw write() would raise BlockingIOError, but
+ RawIOBase.write() is defined to returned None when the call would block.
+ Patch by sbt.
+
+- Issue #13358: HTMLParser now calls handle_data only once for each CDATA.
+
+- Issue #4147: minidom's toprettyxml no longer adds whitespace around a text
+ node when it is the only child of an element. Initial patch by Dan
+ Kenigsberg.
+
+- Issue #13374: The Windows bytes API has been deprecated in the os module. Use
+ Unicode filenames instead of bytes filenames to not depend on the ANSI code
+ page anymore and to support any filename.
+
+- Issue #13297: Use bytes type to send and receive binary data through XMLRPC.
+
+- Issue #6397: Support "/dev/poll" polling objects in select module,
+ under Solaris & derivatives.
+
+- Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly
+ handles non-valid attributes, including adjacent and unquoted attributes.
+
+- Issue #13193: Fix distutils.filelist.FileList and packaging.manifest.Manifest
+ under Windows.
+
+- Issue #13384: Remove unnecessary __future__ import in Lib/random.py
+
+- Issue #13149: Speed up append-only StringIO objects.
+
+- Issue #13373: multiprocessing.Queue.get() could sometimes block indefinitely
+ when called with a timeout. Patch by Arnaud Ysmal.
+
+- Issue #13254: Fix Maildir initialization so that maildir contents
+ are read correctly.
+
+- Issue #3067: locale.setlocale() now raises TypeError if the second
+ argument is an invalid iterable. Its documentation and docstring
+ were also updated. Initial patch by Jyrki Pulliainen.
+
+- Issue #13140: Fix the daemon_threads attribute of ThreadingMixIn.
+
+- Issue #13339: Fix compile error in posixmodule.c due to missing semicolon.
+ Thanks to Robert Xiao.
+
+- Byte compilation in packaging is now isolated from the calling Python -B or
+ -O options, instead of being disallowed under -B or buggy under -O.
+
+- Issue #10570: curses.putp() and curses.tparm() are now expecting a byte
+ string, instead of a Unicode string.
+
+- Issue #13295: http.server now produces valid HTML 4.01 strict.
+
+- Issue #2892: preserve iterparse events in case of SyntaxError.
+
+- Issue #13287: urllib.request and urllib.error now contains an __all__
+ attribute to expose only relevant classes and functions. Patch by Florent
+ Xicluna.
+
+- Issue #670664: Fix HTMLParser to correctly handle the content of
+ ``<script>...</script>`` and ``<style>...</style>``.
+
+- Issue #10817: Fix urlretrieve function to raise ContentTooShortError even
+ when reporthook is None. Patch by Jyrki Pulliainen.
+
+- Issue #13296: Fix IDLE to clear compile __future__ flags on shell restart.
+ (Patch by Roger Serwy)
+
+- Fix the xmlrpc.client user agent to return something similar to
+ urllib.request user agent: "Python-xmlrpc/3.3".
+
+- Issue #13293: Better error message when trying to marshal bytes using
+ xmlrpc.client.
+
+- Issue #13291: NameError in xmlrpc package.
+
+- Issue #13258: Use callable() built-in in the standard library.
+
+- Issue #13273: fix a bug that prevented HTMLParser to properly detect some
+ tags when strict=False.
+
+- Issue #11183: Add finer-grained exceptions to the ssl module, so that
+ you don't have to inspect the exception's attributes in the common case.
+
+- Issue #13216: Add cp65001 codec, the Windows UTF-8 (CP_UTF8).
+
+- Issue #13226: Add RTLD_xxx constants to the os module. These constants can be
+ used with sys.setdlopenflags().
+
+- Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to
+ the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a
+ monotonic clock
+
+- Issue #10332: multiprocessing: fix a race condition when a Pool is closed
+ before all tasks have completed.
+
+- Issue #13255: wrong docstrings in array module.
+
+- Issue #8540: Remove deprecated Context._clamp attribute in Decimal module.
+
+- Issue #13235: Added DeprecationWarning to logging.warn() method and function.
+
+- Issue #9168: now smtpd is able to bind privileged port.
+
+- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
+ semicolons together. Patch by Ben Darnell and Petri Lehtinen.
+
+- Issue #13227: functools.lru_cache() now has a option to distinguish
+ calls with different argument types.
+
+- Issue #6090: zipfile raises a ValueError when a document with a timestamp
+ earlier than 1980 is provided. Patch contributed by Petri Lehtinen.
+
+- Issue #13150: sysconfig no longer parses the Makefile and config.h files
+ when imported, instead doing it at build time. This makes importing
+ sysconfig faster and reduces Python startup time by 20%.
+
+- Issue #12448: smtplib now flushes stdout while running ``python -m smtplib``
+ in order to display the prompt correctly.
+
+- Issue #12454: The mailbox module is now using ASCII, instead of the locale
+ encoding, to read and write .mh_sequences files.
+
+- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are
+ now available on Windows.
+
+- Issue #1673007: urllib.request now supports HEAD request via new method argument.
+ Patch contributions by David Stanek, Patrick Westerhoff and Ezio Melotti.
+
+- Issue #12386: packaging does not fail anymore when writing the RESOURCES
+ file.
+
+- Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number
+ fields in tarfile.
+
+- Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding,
+ instead of the locale encoding.
+
+- Issue #10653: On Windows, use strftime() instead of wcsftime() because
+ wcsftime() doesn't format time zone correctly.
+
+- Issue #13150: The tokenize module doesn't compile large regular expressions
+ at startup anymore.
+
+- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was
+ configured with different prefix and exec-prefix.
+
+- Issue #11254: Teach distutils and packaging to compile .pyc and .pyo files in
+ PEP 3147-compliant __pycache__ directories.
+
+- Issue #7367: Fix pkgutil.walk_paths to skip directories whose
+ contents cannot be read.
+
+- Issue #3163: The struct module gets new format characters 'n' and 'N'
+ supporting C integer types ``ssize_t`` and ``size_t``, respectively.
+
+- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale.
+ Reported and diagnosed by Thomas Kluyver.
+
+- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation
+ if the underlying raw stream is unseekable, even if the seek could be
+ satisfied using the internal buffer. Patch by John O'Connor.
+
+- Issue #7689: Allow pickling of dynamically created classes when their
+ metaclass is registered with copyreg. Patch by Nicolas M. Thiéry and Craig
+ Citro.
+
+- Issue #13034: When decoding some SSL certificates, the subjectAltName
+ extension could be unreported.
+
+- Issue #9871: Prevent IDLE 3 crash when given byte stings
+ with invalid hex escape sequences, like b'\x0'.
+ (Original patch by Claudiu Popa.)
+
+- Issue #12306: Expose the runtime version of the zlib C library as a constant,
+ ZLIB_RUNTIME_VERSION, in the zlib module. Patch by Torsten Landschoff.
+
+- Issue #12959: Add collections.ChainMap to collections.__all__.
+
+- Issue #8933: distutils' PKG-INFO files and packaging's METADATA files will
+ now correctly report Metadata-Version: 1.1 instead of 1.0 if a Classifier or
+ Download-URL field is present.
+
+- Issue #12567: Add curses.unget_wch() function. Push a character so the next
+ get_wch() will return it.
+
+- Issue #9561: distutils and packaging now writes egg-info files using UTF-8,
+ instead of the locale encoding.
+
+- Issue #8286: The distutils command sdist will print a warning message instead
+ of crashing when an invalid path is given in the manifest template.
+
+- Issue #12841: tarfile unnecessarily checked the existence of numerical user
+ and group ids on extraction. If one of them did not exist the respective id
+ of the current user (i.e. root) was used for the file and ownership
+ information was lost.
+
+- Issue #12888: Fix a bug in HTMLParser.unescape that prevented it to escape
+ more than 128 entities. Patch by Peter Otten.
+
+- Issue #12878: Expose a __dict__ attribute on io.IOBase and its subclasses.
+
+- Issue #12636: IDLE reads the coding cookie when executing a Python script.
+
+- Issue #12494: On error, call(), check_call(), check_output() and
+ getstatusoutput() functions of the subprocess module now kill the process,
+ read its status (to avoid zombis) and close pipes.
+
+- Issue #12720: Expose low-level Linux extended file attribute functions in os.
+
+- Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi
+ now respect a --skip-build option given to bdist. The packaging commands
+ were fixed too.
+
+- Issue #12847: Fix a crash with negative PUT and LONG_BINPUT arguments in
+ the C pickle implementation.
+
+- Issue #11564: Avoid crashes when trying to pickle huge objects or containers
+ (more than 2**31 items). Instead, in most cases, an OverflowError is raised.
+
+- Issue #12287: Fix a stack corruption in ossaudiodev module when the FD is
+ greater than FD_SETSIZE.
+
+- Issue #12839: Fix crash in zlib module due to version mismatch.
+ Fix by Richard M. Tew.
+
+- Issue #9923: The mailcap module now correctly uses the platform path
+ separator for the MAILCAP environment variable on non-POSIX platforms.
+
+- Issue #12835: Follow up to #6560 that unconditionally prevents use of the
+ unencrypted sendmsg/recvmsg APIs on SSL wrapped sockets. Patch by David
+ Watson.
+
+- Issue #12803: SSLContext.load_cert_chain() now accepts a password argument
+ to be used if the private key is encrypted. Patch by Adam Simpkins.
+
+- Issue #11657: Fix sending file descriptors over 255 over a multiprocessing
+ Pipe.
+
+- Issue #12811: tabnanny.check() now promptly closes checked files. Patch by
+ Anthony Briggs.
+
+- Issue #6560: The sendmsg/recvmsg API is now exposed by the socket module
+ when provided by the underlying platform, supporting processing of
+ ancillary data in pure Python code. Patch by David Watson and Heiko Wundram.
+
+- Issue #12326: On Linux, sys.platform doesn't contain the major version
+ anymore. It is now always 'linux', instead of 'linux2' or 'linux3' depending
+ on the Linux version used to build Python.
+
+- Issue #12213: Fix a buffering bug with interleaved reads and writes that
+ could appear on BufferedRandom streams.
+
+- Issue #12778: Reduce memory consumption when JSON-encoding a large
+ container of many small objects.
+
+- Issue #12650: Fix a race condition where a subprocess.Popen could leak
+ resources (FD/zombie) when killed at the wrong time.
+
+- Issue #12744: Fix inefficient representation of integers between 2**31 and
+ 2**63 on systems with a 64-bit C "long".
+
+- Issue #12646: Add an 'eof' attribute to zlib.Decompress, to make it easier to
+ detect truncated input streams.
+
+- Issue #11513: Fix exception handling ``tarfile.TarFile.gzopen()`` when
+ the file cannot be opened.
+
+- Issue #12687: Fix a possible buffering bug when unpickling text mode
+ (protocol 0, mostly) pickles.
+
+- Issue #10087: Fix the html output format of the calendar module.
+
+- Issue #12540: Prevent zombie IDLE processes on Windows due to changes
+ in os.kill().
+
+- Issue #13121: add support for inplace math operators to collections.Counter.
+
+- Add support for unary plus and unary minus to collections.Counter.
+
+- Issue #12683: urlparse updated to include svn as schemes that uses relative
+ paths. (svn from 1.5 onwards support relative path).
+
+- Issue #12655: Expose functions from sched.h in the os module: sched_yield(),
+ sched_setscheduler(), sched_getscheduler(), sched_setparam(),
+ sched_get_min_priority(), sched_get_max_priority(), sched_rr_get_interval(),
+ sched_getaffinity(), sched_setaffinity().
+
+- Add ThreadError to threading.__all__.
+
+- Issues #11104, #8688: Fix the behavior of distutils' sdist command with
+ manually-maintained MANIFEST files.
+
+- Issue #11281: smtplib.STMP gets source_address parameter, which adds the
+ ability to bind to specific source address on a machine with multiple
+ interfaces. Patch by Paulo Scardine.
+
+- Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow
+ symlinks: fix it. Patch by Petri Lehtinen.
+
+- Issue #8887: "pydoc somebuiltin.somemethod" (or help('somebuiltin.somemethod')
+ in Python code) now finds the doc of the method.
+
+- Issue #10968: Remove indirection in threading. The public names (Event,
+ Condition, etc.) used to be factory functions returning instances of hidden
+ classes (_Event, _Condition, etc.), because (if Guido recalls correctly) this
+ code pre-dates the ability to subclass extension types. It is now possible
+ to inherit from these classes without having to import the private
+ underscored names like multiprocessing did.
+
+- Issue #9723: Add shlex.quote functions, to escape filenames and command
+ lines.
+
+- Issue #12603: Fix pydoc.synopsis() on files with non-negative st_mtime.
+
+- Issue #12514: Use try/finally to assure the timeit module restores garbage
+ collections when it is done.
+
+- Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
+ given as a low fd, it gets overwritten.
+
+- Issue #12590: IDLE editor window now always displays the first line
+ when opening a long file. With Tk 8.5, the first line was hidden.
+
+- Issue #12576: Fix urlopen behavior on sites which do not send (or obfuscates)
+ Connection:close header.
+
+- Issue #12102: Document that buffered files must be flushed before being used
+ with mmap. Patch by Steffen Daode Nurpmeso.
+
+- Issue #12560: Build libpython.so on OpenBSD. Patch by Stefan Sperling.
+
+- Issue #1813: Fix codec lookup under Turkish locales.
+
+- Issue #12591: Improve support of "universal newlines" in the subprocess
+ module: the piped streams can now be properly read from or written to.
+
+- Issue #12591: Allow io.TextIOWrapper to work with raw IO objects (without
+ a read1() method), and add a *write_through* parameter to mandate
+ unbuffered writes.
+
+- Issue #10883: Fix socket leaks in urllib.request when using FTP.
+
+- Issue #12592: Make Python build on OpenBSD 5 (and future major releases).
+
+- Issue #12372: POSIX semaphores are broken on AIX: don't use them.
+
+- Issue #12551: Provide a get_channel_binding() method on SSL sockets so as
+ to get channel binding data for the current SSL session (only the
+ "tls-unique" channel binding is implemented). This allows the implementation
+ of certain authentication mechanisms such as SCRAM-SHA-1-PLUS. Patch by
+ Jacek Konieczny.
+
+- Issue #665194: email.utils now has format_datetime and parsedate_to_datetime
+ functions, allowing for round tripping of RFC2822 format dates.
+
+- Issue #12571: Add a plat-linux3 directory mirroring the plat-linux2
+ directory, so that "import DLFCN" and other similar imports work on
+ Linux 3.0.
+
+- Issue #7484: smtplib no longer puts <> around addresses in VRFY and EXPN
+ commands; they aren't required and in fact postfix doesn't support that form.
+
+- Issue #12273: Remove ast.__version__. AST changes can be accounted for by
+ checking sys.version_info or sys._mercurial.
+
+- Silence spurious "broken pipe" tracebacks when shutting down a
+ ProcessPoolExecutor.
+
+- Fix potential resource leaks in concurrent.futures.ProcessPoolExecutor
+ by joining all queues and processes when shutdown() is called.
+
+- Issue #11603: Fix a crash when __str__ is rebound as __repr__. Patch by
+ Andreas Stührk.
+
+- Issue #11321: Fix a crash with multiple imports of the _pickle module when
+ embedding Python. Patch by Andreas Stührk.
+
+- Issue #6755: Add get_wch() method to curses.window class. Patch by Iñigo
+ Serna.
+
+- Add cgi.closelog() function to close the log file.
+
+- Issue #12502: asyncore: fix polling loop with AF_UNIX sockets.
+
+- Issue #4376: ctypes now supports nested structures in a endian different than
+ the parent structure. Patch by Vlad Riscutia.
+
+- Raise ValueError when attempting to set the _CHUNK_SIZE attribute of a
+ TextIOWrapper to a huge value, not TypeError.
+
+- Issue #12504: Close file handles in a timely manner in packaging.database.
+ This fixes a bug with the remove (uninstall) feature on Windows.
+
+- Issues #12169 and #10510: Factor out code used by various packaging commands
+ to make HTTP POST requests, and make sure it uses CRLF.
+
+- Issue #12016: Multibyte CJK decoders now resynchronize faster. They only
+ ignore the first byte of an invalid byte sequence. For example,
+ b'\xff\n'.decode('gb2312', 'replace') gives '\ufffd\n' instead of '\ufffd'.
+
+- Issue #12459: time.sleep() now raises a ValueError if the sleep length is
+ negative, instead of an infinite sleep on Windows or raising an IOError on
+ Linux for example, to have the same behaviour on all platforms.
+
+- Issue #12451: pydoc: html_getfile() now uses tokenize.open() to support
+ Python scripts using a encoding different than UTF-8 (read the coding cookie
+ of the script).
+
+- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors
+ if the process has only one pipe.
+
+- Issue #12467: warnings: fix a race condition if a warning is emitted at
+ shutdown, if globals()['__file__'] is None.
+
+- Issue #12451: pydoc: importfile() now opens the Python script in binary mode,
+ instead of text mode using the locale encoding, to avoid encoding issues.
+
+- Issue #12451: runpy: run_path() now opens the Python script in binary mode,
+ instead of text mode using the locale encoding, to support other encodings
+ than UTF-8 (scripts using the coding cookie).
+
+- Issue #12451: xml.dom.pulldom: parse() now opens files in binary mode instead
+ of the text mode (using the locale encoding) to avoid encoding issues.
+
+- Issue #12147: Adjust the new-in-3.2 smtplib.send_message method for better
+ conformance to the RFCs: correctly handle Sender and Resent- headers.
+
+- Issue #12352: Fix a deadlock in multiprocessing.Heap when a block is freed by
+ the garbage collector while the Heap lock is held.
+
+- Issue #12462: time.sleep() now immediately calls the (Python) signal handler
+ if it is interrupted by a signal, instead of having to wait until the next
+ instruction.
+
+- Issue #12442: new shutil.disk_usage function, providing total, used and free
+ disk space statistics.
+
+- Issue #12451: The XInclude default loader of xml.etree now decodes files from
+ UTF-8 instead of the locale encoding if the encoding is not specified. It now
+ also opens XML files for the parser in binary mode instead of the text mode
+ to avoid encoding issues.
+
+- Issue #12451: doctest.debug_script() doesn't create a temporary file
+ anymore to avoid encoding issues.
+
+- Issue #12451: pydoc.synopsis() now reads the encoding cookie if available,
+ to read the Python script from the right encoding.
+
+- Issue #12451: distutils now opens the setup script in binary mode to read the
+ encoding cookie, instead of opening it in UTF-8.
+
+- Issue #9516: On Mac OS X, change Distutils to no longer globally attempt to
+ check or set the MACOSX_DEPLOYMENT_TARGET environment variable for the
+ interpreter process. This could cause failures in non-Distutils subprocesses
+ and was unreliable since tests or user programs could modify the interpreter
+ environment after Distutils set it. Instead, have Distutils set the
+ deployment target only in the environment of each build subprocess. It is
+ still possible to globally override the default by setting
+ MACOSX_DEPLOYMENT_TARGET before launching the interpreter; its value must be
+ greater or equal to the default value, the value with which the interpreter
+ was built. Also, implement the same handling in packaging.
+
+- Issue #12422: In the copy module, don't store objects that are their own copy
+ in the memo dict.
+
+- Issue #12303: Add sigwaitinfo() and sigtimedwait() to the signal module.
+
+- Issue #12404: Remove C89 incompatible code from mmap module. Patch by Akira
+ Kitada.
+
+- Issue #1874: email now detects and reports as a defect the presence of
+ any CTE other than 7bit, 8bit, or binary on a multipart.
+
+- Issue #12383: Fix subprocess module with env={}: don't copy the environment
+ variables, start with an empty environment.
+
+- Issue #11637: Fix support for importing packaging setup hooks from the
+ project directory.
+
+- Issue #6771: Moved the curses.wrapper function from the single-function
+ wrapper module into __init__, eliminating the module. Since __init__ was
+ already importing the function to curses.wrapper, there is no API change.
+
+- Issue #11584: email.header.decode_header no longer fails if the header
+ passed to it is a Header object, and Header/make_header no longer fail
+ if given binary unknown-8bit input.
+
+- Issue #11700: mailbox proxy object close methods can now be called multiple
+ times without error.
+
+- Issue #11767: Correct file descriptor leak in mailbox's __getitem__ method.
+
+- Issue #12133: AbstractHTTPHandler.do_open() of urllib.request closes the HTTP
+ connection if its getresponse() method fails with a socket error. Patch
+ written by Ezio Melotti.
+
+- Issue #12240: Allow multiple setup hooks in packaging's setup.cfg files.
+ Original patch by Erik Bray.
+
+- Issue #9284: Allow inspect.findsource() to find the source of doctest
+ functions.
+
+- Issue #11595: Fix assorted bugs in packaging.util.cfg_to_args, a
+ compatibility helper for the distutils-packaging transition. Original patch
+ by Erik Bray.
+
+- Issue #12287: In ossaudiodev, check that the device isn't closed in several
+ methods.
+
+- Issue #12009: Fixed regression in netrc file comment handling.
+
+- Issue #12246: Warn and fail when trying to install a third-party project from
+ an uninstalled Python (built in a source checkout). Original patch by
+ Tshepang Lekhonkhobe.
+
+- Issue #10694: zipfile now ignores garbage at the end of a zipfile.
+
+- Issue #12283: Fixed regression in smtplib quoting of leading dots in DATA.
+
+- Issue #10424: Argparse now includes the names of the missing required
+ arguments in the missing arguments error message.
+
+- Issue #12168: SysLogHandler now allows NUL termination to be controlled using
+ a new 'append_nul' attribute on the handler.
+
+- Issue #11583: Speed up os.path.isdir on Windows by using GetFileAttributes
+ instead of os.stat.
+
+- Issue #12021: Make mmap's read() method argument optional. Patch by Petri
+ Lehtinen.
+
+- Issue #9205: concurrent.futures.ProcessPoolExecutor now detects killed
+ children and raises BrokenProcessPool in such a situation. Previously it
+ would reliably freeze/deadlock.
+
+- Issue #12040: Expose a new attribute ``sentinel`` on instances of
+ ``multiprocessing.Process``. Also, fix Process.join() to not use polling
+ anymore, when given a timeout.
+
+- Issue #11893: Remove obsolete internal wrapper class ``SSLFakeFile`` in the
+ smtplib module. Patch by Catalin Iacob.
+
+- Issue #12080: Fix a Decimal.power() case that took an unreasonably long time
+ to compute.
+
+- Issue #12221: Remove __version__ attributes from pyexpat, pickle, tarfile,
+ pydoc, tkinter, and xml.parsers.expat. This were useless version constants
+ left over from the Mercurial transition
+
+- Named tuples now work correctly with vars().
+
+- Issue #12085: Fix an attribute error in subprocess.Popen destructor if the
+ constructor has failed, e.g. because of an undeclared keyword argument. Patch
+ written by Oleg Oshmyan.
+
+- Issue #12028: Make threading._get_ident() public, rename it to
+ threading.get_ident() and document it. This function was already used using
+ _thread.get_ident().
+
+- Issue #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
+ encreset() instead of decreset().
+
+- Issue #12218: Removed wsgiref.egg-info.
+
+- Issue #12196: Add pipe2() to the os module.
+
+- Issue #985064: Make plistlib more resilient to faulty input plists.
+ Patch by Mher Movsisyan.
+
+- Issue #1625: BZ2File and bz2.decompress() now support multi-stream files.
+ Initial patch by Nir Aides.
+
+- Issue #12175: BufferedReader.read(-1) now calls raw.readall() if available.
+
+- Issue #12175: FileIO.readall() now only reads the file position and size
+ once.
+
+- Issue #12175: RawIOBase.readall() now returns None if read() returns None.
+
+- Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError
+ if the file is closed.
+
+- Issue #11109: New service_action method for BaseServer, used by ForkingMixIn
+ class for cleanup. Initial Patch by Justin Warkentin.
+
+- Issue #12045: Avoid duplicate execution of command in
+ ctypes.util._get_soname(). Patch by Sijin Joseph.
+
+- Issue #10818: Remove the Tk GUI and the serve() function of the pydoc module,
+ pydoc -g has been deprecated in Python 3.2 and it has a new enhanced web
+ server.
+
+- Issue #1441530: In imaplib, read the data in one chunk to speed up large
+ reads and simplify code.
+
+- Issue #12070: Fix the Makefile parser of the sysconfig module to handle
+ correctly references to "bogus variable" (e.g. "prefix=$/opt/python").
+
+- Issue #12100: Don't reset incremental encoders of CJK codecs at each call to
+ their encode() method anymore, but continue to call the reset() method if the
+ final argument is True.
+
+- Issue #12049: Add RAND_bytes() and RAND_pseudo_bytes() functions to the ssl
+ module.
+
+- Issue #6501: os.device_encoding() returns None on Windows if the application
+ has no console.
+
+- Issue #12105: Add O_CLOEXEC to the os module.
+
+- Issue #12079: Decimal('Infinity').fma(Decimal('0'), (3.91224318126786e+19+0j))
+ now raises TypeError (reflecting the invalid type of the 3rd argument) rather
+ than Decimal.InvalidOperation.
+
+- Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
+ to be able to unload the module.
+
+- Add the packaging module, an improved fork of distutils (also known as
+ distutils2).
+
+- Issue #12065: connect_ex() on an SSL socket now returns the original errno
+ when the socket's timeout expires (it used to return None).
+
+- Issue #8809: The SMTP_SSL constructor and SMTP.starttls() now support
+ passing a ``context`` argument pointing to an ssl.SSLContext instance.
+ Patch by Kasun Herath.
+
+- Issue #11088: don't crash when using F5 to run a script in IDLE on MacOSX
+ with Tk 8.5.
+
+- Issue #9516: Issue #9516: avoid errors in sysconfig when MACOSX_DEPLOYMENT_TARGET
+ is set in shell.
+
+- Issue #8650: Make zlib module 64-bit clean. compress(), decompress() and
+ their incremental counterparts now raise OverflowError if given an input
+ larger than 4GB, instead of silently truncating the input and returning
+ an incorrect result.
+
+- Issue #12050: zlib.decompressobj().decompress() now clears the unconsumed_tail
+ attribute when called without a max_length argument.
+
+- Issue #12062: Fix a flushing bug when doing a certain type of I/O sequence
+ on a file opened in read+write mode (namely: reading, seeking a bit forward,
+ writing, then seeking before the previous write but still within buffered
+ data, and writing again).
+
+- Issue #9971: Write an optimized implementation of BufferedReader.readinto().
+ Patch by John O'Connor.
+
+- Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
+ With Tk < 8.5 _tkinter.c:PythonCmd() raised UnicodeDecodeError, caused
+ IDLE to exit. Converted to valid Unicode null in PythonCmd().
+
+- Issue #11799: urllib.request Authentication Handlers will raise a ValueError
+ when presented with an unsupported Authentication Scheme. Patch contributed
+ by Yuval Greenfield.
+
+- Issue #10419, #6011: build_scripts command of distutils handles correctly
+ non-ASCII path (path to the Python executable). Open and write the script in
+ binary mode, but ensure that the shebang is decodable from UTF-8 and from the
+ encoding of the script.
+
+- Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in
+ order to accept exactly one connection. Patch by Daniel Evers.
+
+- Issue #12011: signal.signal() and signal.siginterrupt() raise an OSError,
+ instead of a RuntimeError: OSError has an errno attribute.
+
+- Issue #3709: add a flush_headers method to BaseHTTPRequestHandler, which
+ manages the sending of headers to output stream and flushing the internal
+ headers buffer. Patch contribution by Andrew Schaaf
+
+- Issue #11743: Rewrite multiprocessing connection classes in pure Python.
+
+- Issue #11164: Stop trying to use _xmlplus in the xml module.
+
+- Issue #11888: Add log2 function to math module. Patch written by Mark
+ Dickinson.
+
+- Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional.
+
+- Issue #8407: The signal handler writes the signal number as a single byte
+ instead of a nul byte into the wakeup file descriptor. So it is possible to
+ wait more than one signal and know which signals were raised.
+
+- Issue #8407: Add pthread_kill(), sigpending() and sigwait() functions to the
+ signal module.
+
+- Issue #11927: SMTP_SSL now uses port 465 by default as documented. Patch
+ by Kasun Herath.
+
+- Issue #12002: ftplib's abort() method raises TypeError.
+
+- Issue #11916: Add a number of MacOSX specific definitions to the errno module.
+ Patch by Pierre Carrier.
+
+- Issue #11999: fixed sporadic sync failure mailbox.Maildir due to its trying to
+ detect mtime changes by comparing to the system clock instead of to the
+ previous value of the mtime.
+
+- Issue #11072: added MLSD command (RFC-3659) support to ftplib.
+
+- Issue #8808: The IMAP4_SSL constructor now allows passing an SSLContext
+ parameter to control parameters of the secure channel. Patch by Sijin
+ Joseph.
+
+- ntpath.samefile failed to notice that "a.txt" and "A.TXT" refer to the same
+ file on Windows XP. As noticed in issue #10684.
+
+- Issue #12000: When a SSL certificate has a subjectAltName without any
+ dNSName entry, ssl.match_hostname() should use the subject's commonName.
+ Patch by Nicolas Bareil.
+
+- Issue #10775: assertRaises, assertRaisesRegex, assertWarns, and
+ assertWarnsRegex now accept a keyword argument 'msg' when used as context
+ managers. Initial patch by Winston Ewert.
+
+- Issue #10684: shutil.move used to delete a folder on case insensitive
+ filesystems when the source and destination name where the same except
+ for the case.
+
+- Issue #11647: objects created using contextlib.contextmanager now support
+ more than one call to the function when used as a decorator. Initial patch
+ by Ysj Ray.
+
+- Issue #11930: Removed deprecated time.accept2dyear variable.
+ Removed year >= 1000 restriction from datetime.strftime.
+
+- logging: don't define QueueListener if Python has no thread support.
+
+- functools.cmp_to_key() now works with collections.Hashable().
+
+- Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get
+ around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso.
+
+- Issue #8407: Add signal.pthread_sigmask() function to fetch and/or change the
+ signal mask of the calling thread.
+
+- Issue #11858: configparser.ExtendedInterpolation expected lower-case section
+ names.
+
+- Issue #11324: ConfigParser(interpolation=None) now works correctly.
+
+- Issue #11811: ssl.get_server_certificate() is now IPv6-compatible. Patch
+ by Charles-François Natali.
+
+- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
+ strings are too long.
+
+- Issue #11236: getpass.getpass responds to ctrl-c or ctrl-z on terminal.
+
+- Issue #11856: Speed up parsing of JSON numbers.
+
+- Issue #11005: threading.RLock()._release_save() raises a RuntimeError if the
+ lock was not acquired.
+
+- Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor
+ of 5 to 10. Initial patch by Jonas H.
+
+- Issue #11382: Trivial system calls, such as dup() or pipe(), needn't
+ release the GIL. Patch by Charles-François Natali.
+
+- Issue #11223: Add threading._info() function providing informations about
+ the thread implementation.
+
+- Issue #11731: simplify/enhance email parser/generator API by introducing
+ policy objects.
+
+- Issue #11768: The signal handler of the signal module only calls
+ Py_AddPendingCall() for the first signal to fix a deadlock on reentrant or
+ parallel calls. PyErr_SetInterrupt() writes also into the wake up file.
+
+- Issue #11492: fix several issues with header folding in the email package.
+
+- Issue #11852: Add missing imports and update tests.
+
+- Issue #11875: collections.OrderedDict's __reduce__ was temporarily
+ mutating the object instead of just working on a copy.
+
+- Issue #11467: Fix urlparse behavior when handling urls which contains scheme
+ specific part only digits. Patch by Santoso Wijaya.
+
+- collections.Counter().copy() now works correctly for subclasses.
+
+- Issue #11474: Fix the bug with url2pathname() handling of '/C|/' on Windows.
+ Patch by Santoso Wijaya.
+
+- Issue #11684: complete email.parser bytes API by adding BytesHeaderParser.
+
+- The bz2 module now handles 4GiB+ input buffers correctly.
+
+- Issue #9233: Fix json.loads('{}') to return a dict (instead of a list), when
+ _json is not available.
+
+- Issue #11830: Remove unnecessary introspection code in the decimal module.
+
+- Issue #11703: urllib2.geturl() does not return correct url when the original
+ url contains #fragment.
+
+- Issue #10019: Fixed regression in json module where an indent of 0 stopped
+ adding newlines and acted instead like 'None'.
+
+- Issue #11186: pydoc ignores a module if its name contains a surrogate
+ character in the index of modules.
+
+- Issue #11815: Use a light-weight SimpleQueue for the result queue in
+ concurrent.futures.ProcessPoolExecutor.
+
+- Issue #5162: Treat services like frozen executables to allow child spawning
+ from multiprocessing.forking on Windows.
+
+- logging.basicConfig now supports an optional 'handlers' argument taking an
+ iterable of handlers to be added to the root logger. Additional parameter
+ checks were also added to basicConfig.
+
+- Issue #11814: Fix likely typo in multiprocessing.Pool._terminate().
+
+- Issue #11747: Fix range formatting in difflib.context_diff() and
+ difflib.unified_diff().
+
+- Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
+ worker processes: new processes would be spawned while the pool is being
+ shut down. Patch by Charles-François Natali.
+
+- Issue #2650: re.escape() no longer escapes the '_'.
+
+- Issue #11757: select.select() now raises ValueError when a negative timeout
+ is passed (previously, a select.error with EINVAL would be raised). Patch
+ by Charles-François Natali.
+
+- Issue #7311: fix html.parser to accept non-ASCII attribute values.
+
+- Issue #11605: email.parser.BytesFeedParser was incorrectly converting
+ multipart subparts with an 8-bit CTE into unicode instead of preserving the
+ bytes.
+
+- Issue #1690608: email.util.formataddr is now RFC 2047 aware: it now has a
+ charset parameter that defaults to utf-8 and is used as the charset for RFC
+ 2047 encoding when the realname contains non-ASCII characters.
+
+- Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
+
+- Issue #10791: Implement missing method GzipFile.read1(), allowing GzipFile
+ to be wrapped in a TextIOWrapper. Patch by Nadeem Vawda.
+
+- Issue #11707: Added a fast C version of functools.cmp_to_key().
+ Patch by Filip Gruszczyński.
+
+- Issue #11688: Add sqlite3.Connection.set_trace_callback(). Patch by
+ Torsten Landschoff.
+
+- Issue #11746: Fix SSLContext.load_cert_chain() to accept elliptic curve
+ private keys.
+
+- Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
+ file-like objects using a new ``fileobj`` constructor argument. Patch by
+ Nadeem Vawda.
+
+- unittest.TestCase.assertSameElements has been removed.
+
+- sys.getfilesystemencoding() raises a RuntimeError if initfsencoding() was not
+ called yet: detect bootstrap (startup) issues earlier.
+
+- Issue #11393: Add the new faulthandler module.
+
+- Issue #11618: Fix the timeout logic in threading.Lock.acquire() under Windows.
+
+- Removed the 'strict' argument to email.parser.Parser, which has been
+ deprecated since Python 2.4.
+
+- Issue #11256: Fix inspect.getcallargs on functions that take only keyword
+ arguments.
+
+- Issue #11696: Fix ID generation in msilib.
+
+- itertools.accumulate now supports an optional *func* argument for
+ a user-supplied binary function.
+
+- Issue #11692: Remove unnecessary demo functions in subprocess module.
+
+- Issue #9696: Fix exception incorrectly raised by xdrlib.Packer.pack_int when
+ trying to pack a negative (in-range) integer.
+
+- Issue #11675: multiprocessing.[Raw]Array objects created from an integer size
+ are now zeroed on creation. This matches the behaviour specified by the
+ documentation.
+
+- Issue #7639: Fix short file name generation in bdist_msi
+
+- Issue #11659: Fix ResourceWarning in test_subprocess introduced by #11459.
+ Patch by Ben Hayden.
+
+- Issue #11635: Don't use polling in worker threads and processes launched by
+ concurrent.futures.
+
+- Issue #6811: Allow importlib to change a code object's co_filename attribute
+ to match the path to where the source code currently is, not where the code
+ object originally came from.
+
+- Issue #8754: Have importlib use the repr of a module name in error messages.
+
+- Issue #11591: Prevent "import site" from modifying sys.path when python
+ was started with -S.
+
+- collections.namedtuple() now adds a _source attribute to the generated
+ class. This make the source more accessible than the outdated
+ "verbose" option which prints to stdout but doesn't make the source
+ string available.
+
+- Issue #11371: Mark getopt error messages as localizable. Patch by Filip
+ Gruszczyński.
+
+- Issue #11333: Add __slots__ to collections ABCs.
+
+- Issue #11628: cmp_to_key generated class should use __slots__.
+
+- Issue #11666: let help() display named tuple attributes and methods
+ that start with a leading underscore.
+
+- Issue #11662: Make urllib and urllib2 ignore redirections if the
+ scheme is not HTTP, HTTPS or FTP (CVE-2011-1521).
+
+- Issue #5537: Fix time2isoz() and time2netscape() functions of
+ httplib.cookiejar for expiration year greater than 2038 on 32-bit systems.
+
+- Issue #4391: Use proper gettext plural forms in optparse.
+
+- Issue #11127: Raise a TypeError when trying to pickle a socket object.
+
+- Issue #11563: Connection:close header is sent by requests using URLOpener
+ class which helps in closing of sockets after connection is over. Patch
+ contributions by Jeff McNeil and Nadeem Vawda.
+
+- Issue #11459: A ``bufsize`` value of 0 in subprocess.Popen() really creates
+ unbuffered pipes, such that select() works properly on them.
+
+- Issue #5421: Fix misleading error message when one of socket.sendto()'s
+ arguments has the wrong type. Patch by Nikita Vetoshkin.
+
+- Issue #10812: Add some extra posix functions to the os module.
+
+- Issue #10979: unittest stdout buffering now works with class and module
+ setup and teardown.
+
+- Issue #11577: fix ResourceWarning triggered by improved binhex test coverage
+
+- Issue #11243: fix the parameter querying methods of Message to work if
+ the headers contain un-encoded non-ASCII data.
+
+- Issue #11401: fix handling of headers with no value; this fixes a regression
+ relative to Python2 and the result is now the same as it was in Python2.
+
+- Issue #9298: base64 bodies weren't being folded to line lengths less than 78,
+ which was a regression relative to Python2. Unlike Python2, the last line
+ of the folded body now ends with a carriage return.
+
+- Issue #11560: shutil.unpack_archive now correctly handles the format
+ parameter. Patch by Evan Dandrea.
+
+- Issue #5870: Add `subprocess.DEVNULL` constant.
+
+- Issue #11133: fix two cases where inspect.getattr_static can trigger code
+ execution. Patch by Andreas Stührk.
+
+- Issue #11569: use absolute path to the sysctl command in multiprocessing to
+ ensure that it will be found regardless of the shell PATH. This ensures
+ that multiprocessing.cpu_count works on default installs of MacOSX.
+
+- Issue #11501: disutils.archive_utils.make_zipfile no longer fails if zlib is
+ not installed. Instead, the zipfile.ZIP_STORED compression is used to create
+ the ZipFile. Patch by Natalia B. Bidart.
+
+- Issue #11289: `smtp.SMTP` class is now a context manager so it can be used
+ in a `with` statement. Contributed by Giampaolo Rodola.
+
+- Issue #11554: Fixed support for Japanese codecs; previously the body output
+ encoding was not done if euc-jp or shift-jis was specified as the charset.
+
+- Issue #11509: Significantly increase test coverage of fileinput.
+ Patch by Denver Coneybeare at PyCon 2011 Sprints.
+
+- Issue #11407: `TestCase.run` returns the result object used or created.
+ Contributed by Janathan Hartley.
+
+- Issue #11500: Fixed a bug in the OS X proxy bypass code for fully qualified
+ IP addresses in the proxy exception list.
+
+- Issue #11491: dbm.error is no longer raised when dbm.open is called with
+ the "n" as the flag argument and the file exists. The behavior matches
+ the documentation and general logic.
+
+- Issue #1162477: Postel Principle adjustment to email date parsing: handle the
+ fact that some non-compliant MUAs use '.' instead of ':' in time specs.
+
+- Issue #11131: Fix sign of zero in decimal.Decimal plus and minus
+ operations when the rounding mode is ROUND_FLOOR.
+
+- Issue #9935: Speed up pickling of instances of user-defined classes.
+
+- Issue #5622: Fix curses.wrapper to raise correct exception if curses
+ initialization fails.
+
+- Issue #11408: In threading.Lock.acquire(), only call gettimeofday() when
+ really necessary. Patch by Charles-François Natali.
+
+- Issue #11391: Writing to a mmap object created with
+ ``mmap.PROT_READ|mmap.PROT_EXEC`` would segfault instead of raising a
+ TypeError. Patch by Charles-François Natali.
+
+- Issue #9795: add context manager protocol support for nntplib.NNTP class.
+
+- Issue #11306: mailbox in certain cases adapts to an inability to open
+ certain files in read-write mode. Previously it detected this by
+ checking for EACCES, now it also checks for EROFS.
+
+- Issue #11265: asyncore now correctly handles EPIPE, EBADF and EAGAIN errors
+ on accept(), send() and recv().
+
+- Issue #11377: Deprecate platform.popen() and reimplement it with os.popen().
+
+- Issue #8513: On UNIX, subprocess supports bytes command string.
+
+- Issue #10866: Add socket.sethostname(). Initial patch by Ross Lagerwall.
+
+- Issue #11140: Lock.release() now raises a RuntimeError when attempting
+ to release an unacquired lock, as claimed in the threading documentation.
+ The _thread.error exception is now an alias of RuntimeError. Patch by
+ Filip Gruszczyński. Patch for _dummy_thread by Aymeric Augustin.
+
+- Issue #8594: ftplib now provides a source_address parameter to specify which
+ (address, port) to bind to before connecting.
+
+- Issue #11326: Add the missing connect_ex() implementation for SSL sockets,
+ and make it work for non-blocking connects.
+
+- Issue #11297: Add collections.ChainMap().
+
+- Issue #10755: Add the posix.flistdir() function. Patch by Ross Lagerwall.
+
+- Issue #4761: Add the ``*at()`` family of functions (openat(), etc.) to the
+ posix module. Patch by Ross Lagerwall.
+
+- Issue #7322: Trying to read from a socket's file-like object after a timeout
+ occurred now raises an error instead of silently losing data.
+
+- Issue #11291: poplib.POP no longer suppresses errors on quit().
+
+- Issue #11177: asyncore's create_socket() arguments can now be omitted.
+
+- Issue #6064: Add a ``daemon`` keyword argument to the threading.Thread
+ and multiprocessing.Process constructors in order to override the
+ default behaviour of inheriting the daemonic property from the current
+ thread/process.
+
+- Issue #10956: Buffered I/O classes retry reading or writing after a signal
+ has arrived and the handler returned successfully.
+
+- Issue #10784: New os.getpriority() and os.setpriority() functions.
+
+- Issue #11114: Fix catastrophic performance of tell() on text files (up
+ to 1000x faster in some cases). It is still one to two order of magnitudes
+ slower than binary tell().
+
+- Issue #10882: Add os.sendfile function.
+
+- Issue #10868: Allow usage of the register method of an ABC as a class
+ decorator.
+
+- Issue #11224: Fixed a regression in tarfile that affected the file-like
+ objects returned by TarFile.extractfile() regarding performance, memory
+ consumption and failures with the stream interface.
+
+- Issue #10924: Adding salt and Modular Crypt Format to crypt library.
+ Moved old C wrapper to _crypt, and added a Python wrapper with
+ enhanced salt generation and simpler API for password generation.
+
+- Issue #11074: Make 'tokenize' so it can be reloaded.
+
+- Issue #11085: Moved collections abstract base classes into a separate
+ module called collections.abc, following the pattern used by importlib.abc.
+ For backwards compatibility, the names are imported into the collections
+ module.
+
+- Issue #4681: Allow mmap() to work on file sizes and offsets larger than
+ 4GB, even on 32-bit builds. Initial patch by Ross Lagerwall, adapted for
+ 32-bit Windows.
+
+- Issue #11169: compileall module uses repr() to format filenames and paths to
+ escape surrogate characters and show spaces.
+
+- Issue #11089: Fix performance issue limiting the use of ConfigParser()
+ with large config files.
+
+- Issue #10276: Fix the results of zlib.crc32() and zlib.adler32() on buffers
+ larger than 4GB. Patch by Nadeem Vawda.
+
+- Issue #11388: Added a clear() method to MutableSequence
+
+- Issue #11174: Add argparse.MetavarTypeHelpFormatter, which uses type names
+ for the names of optional and positional arguments in help messages.
+
+- Issue #9348: Raise an early error if argparse nargs and metavar don't match.
+
+- Issue #8982: Improve the documentation for the argparse Namespace object.
+
+- Issue #9343: Document that argparse parent parsers must be configured before
+ their children.
+
+- Issue #9026: Fix order of argparse sub-commands in help messages.
+
+- Issue #9347: Fix formatting for tuples in argparse type= error messages.
+
+- Issue #12191: Added shutil.chown() to change user and/or group owner of a
+ given path also specifying their names.
+
+- Issue #13988: The _elementtree accelerator is used whenever available.
+ Now xml.etree.cElementTree becomes a deprecated alias to ElementTree.
+
+Build
+-----
+
+- Issue #6807: Run msisupport.mak earlier.
+
+- Issue #10580: Minor grammar change in Windows installer.
+
+- Issue #13326: Clean __pycache__ directories correctly on OpenBSD.
+
+- PEP 393: the configure option --with-wide-unicode is removed.
+
+- Issue #12852: Set _XOPEN_SOURCE to 700, instead of 600, to get POSIX 2008
+ functions on OpenBSD (e.g. fdopendir).
+
+- Issue #11863: Remove support for legacy systems deprecated in Python 3.2
+ (following PEP 11). These systems are systems using Mach C Threads,
+ SunOS lightweight processes, GNU pth threads and IRIX threads.
+
+- Issue #8746: Correct faulty configure checks so that os.chflags() and
+ os.lchflags() are once again built on systems that support these
+ functions (BSD and OS X). Also add new stat file flags for OS X
+ (UF_HIDDEN and UF_COMPRESSED).
+
+- Issue #10645: Installing Python no longer creates a
+ Python-X.Y.Z-pyX.Y.egg-info file in the lib-dynload directory.
+
+- Do not accidentally include the directory containing sqlite.h twice when
+ building sqlite3.
+
+- Issue #11217: For 64-bit/32-bit Mac OS X universal framework builds,
+ ensure "make install" creates symlinks in --prefix bin for the "-32"
+ files in the framework bin directory like the installer does.
+
+- Issue #11347: Use --no-as-needed when linking libpython3.so.
+
+- Issue #11411: Fix 'make DESTDIR=' with a relative destination.
+
+- Issue #11268: Prevent Mac OS X Installer failure if Documentation
+ package had previously been installed.
+
+- Issue #11495: OSF support is eliminated. It was deprecated in Python 3.2.
+
+
+IDLE
+----
+
+- Issue #11718: IDLE's open module dialog couldn't find the __init__.py
+ file in a package.
+
+Tools/Demos
+-----------
+
+- Issue #14053: patchcheck.py ("make patchcheck") now works with MQ patches.
+ Patch by Francisco Martín Brugué.
+
+- Issue #13930: 2to3 is now able to write its converted output files to another
+ directory tree as well as copying unchanged files and altering the file
+ suffix. See its new -o, -W and --add-suffix options. This makes it more
+ useful in many automated code translation workflows.
+
+- Issue #13628: python-gdb.py is now able to retrieve more frames in the Python
+ traceback if Python is optimized.
+
+- Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and
+ add a smarter "py-bt" command printing a classic Python traceback.
+
+- Issue #11179: Make ccbench work under Python 3.1 and 2.7 again.
+
+- Issue #10639: reindent.py no longer converts newlines and will raise
+ an error if attempting to convert a file with mixed newlines.
+ "--newline" option added to specify new line character.
+
+Extension Modules
+-----------------
+
+- Issue #13840: The error message produced by ctypes.create_string_buffer
+ when given a Unicode string has been fixed.
+
+- Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
+ Vilmos Nebehaj.
+
+- Issue #7777: socket: Add Reliable Datagram Sockets (PF_RDS) support.
+
+- Issue #13159: FileIO and BZ2Compressor/BZ2Decompressor now use a linear-time
+ buffer growth strategy instead of a quadratic-time one.
+
+- Issue #10141: socket: Add SocketCAN (PF_CAN) support. Initial patch by
+ Matthias Fuchs, updated by Tiago Gonçalves.
+
+- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
+ would be finalized after the reference to its underlying BufferedRWPair's
+ writer got cleared by the GC.
+
+- Issue #12881: ctypes: Fix segfault with large structure field names.
+
+- Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by
+ Thomas Jarosch.
+
+- Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype.
+ Thanks to Suman Saha for finding the bug and providing a patch.
+
+- Issue #13022: Fix: _multiprocessing.recvfd() doesn't check that
+ file descriptor was actually received.
+
+- Issue #1172711: Add 'long long' support to the array module.
+ Initial patch by Oren Tirosh and Hirokazu Yamamoto.
+
+- Issue #12483: ctypes: Fix a crash when the destruction of a callback
+ object triggers the garbage collector.
+
+- Issue #12950: Fix passing file descriptors in multiprocessing, under
+ OpenIndiana/Illumos.
+
+- Issue #12764: Fix a crash in ctypes when the name of a Structure field is not
+ a string.
+
+- Issue #11241: subclasses of ctypes.Array can now be subclassed.
+
+- Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
+ some functions like file.write().
+
+- Issue #10309: Define _GNU_SOURCE so that mremap() gets the proper
+ signature. Without this, architectures where sizeof void* != sizeof int are
+ broken. Patch given by Hallvard B Furuseth.
+
+- Issue #12051: Fix segfault in json.dumps() while encoding highly-nested
+ objects using the C accelerations.
+
+- Issue #12017: Fix segfault in json.loads() while decoding highly-nested
+ objects using the C accelerations.
+
+- Issue #1838: Prevent segfault in ctypes, when _as_parameter_ on a class is set
+ to an instance of the class.
+
+Tests
+-----
+
+- Issue #11689: Fix a variable scoping error in an sqlite3 test
+
+- Issue #13786: Remove unimplemented 'trace' long option from regrtest.py.
+
+- Issue #13725: Fix regrtest to recognize the documented -d flag.
+ Patch by Erno Tukia.
+
+- Issue #13304: Skip test case if user site-packages disabled (-s or
+ PYTHONNOUSERSITE). (Patch by Carl Meyer)
+
+- Issue #5661: Add a test for ECONNRESET/EPIPE handling to test_asyncore. Patch
+ by Xavier de Gaye.
+
+- Issue #13218: Fix test_ssl failures on Debian/Ubuntu.
+
+- Re-enable lib2to3's test_parser.py tests, though with an expected failure
+ (see issue 13125).
+
+- Issue #12656: Add tests for IPv6 and Unix sockets to test_asyncore.
+
+- Issue #6484: Add unit tests for mailcap module (patch by Gregory Nofi)
+
+- Issue #11651: Improve the Makefile test targets to run more of the test suite
+ more quickly. The --multiprocess option is now enabled by default, reducing
+ the amount of time needed to run the tests. "make test" and "make quicktest"
+ now include some resource-intensive tests, but no longer run the test suite
+ twice to check for bugs in .pyc generation. Tools/scripts/run_test.py provides
+ an easy platform-independent way to run test suite with sensible defaults.
+
+- Issue #12331: The test suite for the packaging module can now run from an
+ installed Python.
+
+- Issue #12331: The test suite for lib2to3 can now run from an installed
+ Python.
+
+- Issue #12626: In regrtest, allow to filter tests using a glob filter
+ with the ``-m`` (or ``--match``) option. This works with all test cases
+ using the unittest module. This is useful with long test suites
+ such as test_io or test_subprocess.
+
+- Issue #12624: It is now possible to fail after the first failure when
+ running in verbose mode (``-v`` or ``-W``), by using the ``--failfast``
+ (or ``-G``) option to regrtest. This is useful with long test suites
+ such as test_io or test_subprocess.
+
+- Issue #12587: Correct faulty test file and reference in test_tokenize.
+ (Patch by Robert Xiao)
+
+- Issue #12573: Add resource checks for dangling Thread and Process objects.
+
+- Issue #12549: Correct test_platform to not fail when OS X returns 'x86_64'
+ as the processor type on some Mac systems.
+
+- Skip network tests when getaddrinfo() returns EAI_AGAIN, meaning a temporary
+ failure in name resolution.
+
+- Issue #11812: Solve transient socket failure to connect to 'localhost'
+ in test_telnetlib.py.
+
+- Solved a potential deadlock in test_telnetlib.py. Related to issue #11812.
+
+- Avoid failing in test_robotparser when mueblesmoraleda.com is flaky and
+ an overzealous DNS service (e.g. OpenDNS) redirects to a placeholder
+ Web site.
+
+- Avoid failing in test_urllibnet.test_bad_address when some overzealous
+ DNS service (e.g. OpenDNS) resolves a non-existent domain name. The test
+ is now skipped instead.
+
+- Issue #12440: When testing whether some bits in SSLContext.options can be
+ reset, check the version of the OpenSSL headers Python was compiled against,
+ rather than the runtime version of the OpenSSL library.
+
+- Issue #11512: Add a test suite for the cgitb module. Patch by Robbie Clemons.
+
+- Issue #12497: Install test/data to prevent failures of the various codecmaps
+ tests.
+
+- Issue #12496: Install test/capath directory to prevent test_connect_capath
+ testcase failure in test_ssl.
+
+- Issue #12469: Run wakeup and pending signal tests in a subprocess to run the
+ test in a fresh process with only one thread and to not change signal
+ handling of the parent process.
+
+- Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
+ test_tk or test_ttk_guionly under a username that is not currently logged
+ in to the console windowserver (as may be the case under buildbot or ssh).
+
+- Issue #12407: Explicitly skip test_capi.EmbeddingTest under Windows.
+
+- Issue #12400: regrtest -W doesn't rerun the tests twice anymore, but captures
+ the output and displays it on failure instead. regrtest -v doesn't print the
+ error twice anymore if there is only one error.
+
+- Issue #12141: Install copies of template C module file so that
+ test_build_ext of test_distutils and test_command_build_ext of
+ test_packaging are no longer silently skipped when
+ run outside of a build directory.
+
+- Issue #8746: Add additional tests for os.chflags() and os.lchflags().
+ Patch by Garrett Cooper.
+
+- Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9
+ 2.8 + on Mac OS X. (Patch by Ronald Oussoren)
+
+- Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2,
+ iso2022_kr).
+
+- Issue #12096: Fix a race condition in test_threading.test_waitfor(). Patch
+ written by Charles-François Natali.
+
+- Issue #11614: import __hello__ prints "Hello World!". Patch written by
+ Andreas Stührk.
+
+- Issue #5723: Improve json tests to be executed with and without accelerations.
+
+- Issue #12041: Make test_wait3 more robust.
+
+- Issue #11873: Change regex in test_compileall to fix occasional failures when
+ when the randomly generated temporary path happened to match the regex.
+
+- Issue #11958: Fix FTP tests for IPv6, bind to "::1" instead of "localhost".
+ Patch written by Charles-Francois Natali.
+
+- Issue #8407, #11859: Fix tests of test_io using threads and an alarm: use
+ pthread_sigmask() to ensure that the SIGALRM signal is received by the main
+ thread.
+
+- Issue #11811: Factor out detection of IPv6 support on the current host
+ and make it available as ``test.support.IPV6_ENABLED``. Patch by
+ Charles-François Natali.
+
+- Issue #10914: Add a minimal embedding test to test_capi.
+
+- Issue #11223: Skip test_lock_acquire_interruption() and
+ test_rlock_acquire_interruption() of test_threadsignals if a thread lock is
+ implemented using a POSIX mutex and a POSIX condition variable. A POSIX
+ condition variable cannot be interrupted by a signal (e.g. on Linux, the
+ futex system call is restarted).
+
+- Issue #11790: Fix sporadic failures in test_multiprocessing.WithProcessesTestCondition.
+
+- Fix possible "file already exists" error when running the tests in parallel.
+
+- Issue #11719: Fix message about unexpected test_msilib skip on non-Windows
+ platforms. Patch by Nadeem Vawda.
+
+- Issue #11727: Add a --timeout option to regrtest: if a test takes more than
+ TIMEOUT seconds, dumps the traceback of all threads and exits.
+
+- Issue #11653: fix -W with -j in regrtest.
+
+- The email test suite now lives in the Lib/test/test_email package. The test
+ harness code has also been modernized to allow use of new unittest features.
+
+- regrtest now discovers test packages as well as test modules.
+
+- Issue #11577: improve test coverage of binhex.py. Patch by Arkady Koplyarov.
+
+- New test_crashers added to exercise the scripts in the Lib/test/crashers
+ directory and confirm they fail as expected
+
+- Issue #11578: added test for the timeit module. Patch by Michael Henry.
+
+- Issue #11503: improve test coverage of posixpath.py. Patch by Evan Dandrea.
+
+- Issue #11505: improves test coverage of string.py, increases granularity of
+ string.Formatter tests. Initial patch by Alicia Arlen.
+
+- Issue #11548: Improve test coverage of the shutil module. Patch by
+ Evan Dandrea.
+
+- Issue #11554: Reactivated test_email_codecs.
+
+- Issue #11505: improves test coverage of string.py. Patch by Alicia
+ Arlen
+
+- Issue #11490: test_subprocess:test_leaking_fds_on_error no longer gives a
+ false positive if the last directory in the path is inaccessible.
+
+- Issue #11223: Fix test_threadsignals to fail, not hang, when the
+ non-semaphore implementation of locks is used under POSIX.
+
+- Issue #10911: Add tests on CGI with non-ASCII characters. Patch written by
+ Pierre Quentel.
+
+- Issue #9931: Fix hangs in GUI tests under Windows in certain conditions.
+ Patch by Hirokazu Yamamoto.
+
+- Issue #10512: Properly close sockets under test.test_cgi.
+
+- Issue #10992: Make tests pass under coverage.
+
+- Issue #10826: Prevent sporadic failure in test_subprocess on Solaris due
+ to open door files.
+
+- Issue #10990: Prevent tests from clobbering a set trace function.
+
+C-API
+-----
+
+- Add PyObject_GenericGetDict and PyObject_GeneriSetDict. They are generic
+ implementations for the getter and setter of a ``__dict__`` descriptor of C
+ types.
+
+- Issue #13727: Add 3 macros to access PyDateTime_Delta members:
+ PyDateTime_DELTA_GET_DAYS, PyDateTime_DELTA_GET_SECONDS,
+ PyDateTime_DELTA_GET_MICROSECONDS.
+
+- Issue #10542: Add 4 macros to work with surrogates: Py_UNICODE_IS_SURROGATE,
+ Py_UNICODE_IS_HIGH_SURROGATE, Py_UNICODE_IS_LOW_SURROGATE,
+ Py_UNICODE_JOIN_SURROGATES.
+
+- Issue #12724: Add Py_RETURN_NOTIMPLEMENTED macro for returning NotImplemented.
+
+- PY_PATCHLEVEL_REVISION has been removed, since it's meaningless with
+ Mercurial.
+
+- Issue #12173: The first argument of PyImport_ImportModuleLevel is now `const
+ char *` instead of `char *`.
+
+- Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format.
+
+Documentation
+-------------
+
+- Issues #13491 and #13995: Fix many errors in sqlite3 documentation.
+ Initial patch for #13491 by Johannes Vogel.
+
+- Issue #13402: Document absoluteness of sys.executable.
+
+- Issue #13883: PYTHONCASEOK also works on OS X.
+
+- Issue #9021: Add an introduction to the copy module documentation.
+
+- Issue #6005: Examples in the socket library documentation use sendall, where
+ relevant, instead send method.
+
+- Issue #12798: Updated the mimetypes documentation.
+
+- Issue #12949: Document the kwonlyargcount argument for the PyCode_New
+ C API function.
+
+- Issue #13513: Fix io.IOBase documentation to correctly link to the
+ io.IOBase.readline method instead of the readline module.
+
+- Issue #13237: Reorganise subprocess documentation to emphasise convenience
+ functions and the most commonly needed arguments to Popen.
+
+- Issue #13141: Demonstrate recommended style for socketserver examples.
+
+- Issue #11818: Fix tempfile examples for Python 3.
+
+
What's New in Python 3.2?
=========================
diff --git a/Misc/NEWS b/Misc/NEWS
index f02c18e..b95ce2d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -2,47 +2,180 @@
Python News
+++++++++++
-What's New in Python 3.3.3 release candidate 1?
-===============================================
-
-*Not yet released, see sections below for changes released in 3.3.2*
+What's New in Python 3.4.0 Alpha 2?
+===================================
-.. *Release date: TBD*
+Projected Release date: 2013-09-08
Core and Builtins
-----------------
+- Issue #18774: Remove last bits of GNU PTH thread code and thread_pth.h.
+
+- Issue #18771: Add optimization to set object lookups to reduce the cost
+ of hash collisions. The core idea is to inspect a second key/hash pair
+ for each cache line retrieved.
+
+- Issue #16105: When a signal handler fails to write to the file descriptor
+ registered with ``signal.set_wakeup_fd()``, report an exception instead
+ of ignoring the error.
+
+- Issue #18722: Remove uses of the "register" keyword in C code.
+
- Issue #18667: Add missing "HAVE_FCHOWNAT" symbol to posix._have_functions.
+- Issue #16499: Add command line option for isolated mode.
+
+- Issue #15301: Parsing fd, uid, and gid parameters for builtins
+ in Modules/posixmodule.c is now far more robust.
+
- Issue #18368: PyOS_StdioReadline() no longer leaks memory when realloc()
- fails.
+ fail.
+
+- Issue #17934: Add a clear() method to frame objects, to help clean up
+ expensive details (local variables) and break reference cycles.
+
+Library
+-------
+
+- Issue #18747: Re-seed OpenSSL's pseudo-random number generator after fork.
+ A pthread_atfork() child handler is used to seeded the PRNG with pid, time
+ and some stack data.
+
+- Issue #8865: Concurrent invocation of select.poll.poll() now raises a
+ RuntimeError exception. Patch by Christian Schubert.
+
+- Issue #18777: The ssl module now uses the new CRYPTO_THREADID API of
+ OpenSSL 1.0.0+ instead of the deprecated CRYPTO id callback function.
+
+- Issue #18768: Correct doc string of RAND_edg(). Patch by Vajrasky Kok.
+
+- Issue #18178: Fix ctypes on BSD. dlmalloc.c was compiled twice which broke
+ malloc weak symbols.
+
+- Issue #18709: Fix CVE-2013-4238. The SSL module now handles NULL bytes
+ inside subjectAltName correctly. Formerly the module has used OpenSSL's
+ GENERAL_NAME_print() function to get the string represention of ASN.1
+ strings for ``rfc822Name`` (email), ``dNSName`` (DNS) and
+ ``uniformResourceIdentifier`` (URI).
+
+- Issue #18701: Remove support of old CPython versions (<3.0) from C code.
+
+- Issue #18756: Improve error reporting in os.urandom() when the failure
+ is due to something else than /dev/urandom not existing (for example,
+ exhausting the file descriptor limit).
+
+- Issue #18673: Add O_TMPFILE to os module. O_TMPFILE requires Linux kernel
+ 3.11 or newer. It's only defined on system with 3.11 uapi headers, too.
+
+- Issue #18532: Change the builtin hash algorithms' names to lower case names
+ as promised by hashlib's documentation.
+
+- Issue #18405: Improve the entropy of crypt.mksalt().
+
+- Issue #12015: The tempfile module now uses a suffix of 8 random characters
+ instead of 6, to reduce the risk of filename collision. The entropy was
+ reduced when uppercase letters were removed from the charset used to generate
+ random characters.
+
+- Issue #18585: Add :func:`textwrap.shorten` to collapse and truncate a
+ piece of text to a given length.
+
+- Issue #18598: Tweak exception message for importlib.import_module() to
+ include the module name when a key argument is missing.
+
+- Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get
+ docstrings and ValueError messages. Patch by Zhongyue Luo
+
+- Fix refcounting issue with extension types in tkinter.
+
+- Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error
+ if methods have annotations; it now correctly displays the annotations.
+
+- Issue #18600: Added policy argument to email.message.Message.as_string,
+ and as_bytes and __bytes__ methods to Message.
+
+- Issue #18671: Output more information when logging exceptions occur.
+
+- Issue #18621: Prevent the site module's patched builtins from keeping
+ too many references alive for too long.
+
+- Issue #4885: Add weakref support to mmap objects. Patch by Valerie Lambert.
+
+- Issue #8860: Fixed rounding in timedelta constructor.
+
+
+What's New in Python 3.4.0 Alpha 1?
+===================================
+
+Release date: 2013-08-03
+
+Core and Builtins
+-----------------
- Issue #16741: Fix an error reporting in int().
- Issue #17899: Fix rare file descriptor leak in os.listdir().
+- Issue #10241: Clear extension module dict copies at interpreter shutdown.
+ Patch by Neil Schemenauer, minimally modified.
+
+- Issue #9035: ismount now recognises volumes mounted below a drive root
+ on Windows. Original patch by Atsuo Ishimoto.
+
+- Issue #18214: Improve finalization of Python modules to avoid setting
+ their globals to None, in most cases.
+
+- Issue #18112: PEP 442 implementation (safe object finalization).
+
- Issue #18552: Check return value of PyArena_AddPyObject() in
obj2ast_object().
- Issue #18560: Fix potential NULL pointer dereference in sum().
+- Issue #18520: Add a new PyStructSequence_InitType2() function, same than
+ PyStructSequence_InitType() except that it has a return value (0 on success,
+ -1 on error).
+
- Issue #15905: Fix theoretical buffer overflow in handling of sys.argv[0],
prefix and exec_prefix if the operation system does not obey MAXPATHLEN.
+- Issue #18408: Fix many various bugs in code handling errors, especially
+ on memory allocation failure (MemoryError).
+
- Issue #18344: Fix potential ref-leaks in _bufferedreader_read_all().
+- Issue #18342: Use the repr of a module name when an import fails when using
+ ``from ... import ...``.
+
- Issue #17872: Fix a segfault in marshal.load() when input stream returns
more bytes than requested.
+- Issue #18338: `python --version` now prints version string to stdout, and
+ not to stderr. Patch by Berker Peksag and Michael Dickens.
+
- Issue #18426: Fix NULL pointer dereference in C extension import when
PyModule_GetDef() returns an error.
+- Issue #17206: On Windows, increase the stack size from 2 MB to 4.2 MB to fix
+ a stack overflow in the marshal module (fix a crash in test_marshal).
+ Patch written by Jeremy Kloth.
+
+- Issue #3329: Implement the PEP 445: Add new APIs to customize Python memory
+ allocators.
+
- Issue #18328: Reorder ops in PyThreadState_Delete*() functions. Now the
tstate is first removed from TLS and then deallocated.
+- Issue #13483: Use VirtualAlloc in obmalloc on Windows.
+
- Issue #18184: PyUnicode_FromFormat() and PyUnicode_FromFormatV() now raise
OverflowError when an argument of %c format is out of range.
+- Issue #18111: The min() and max() functions now support a default argument
+ to be returned instead of raising a ValueError on an empty sequence.
+ (Contributed by Julian Berman.)
+
- Issue #18137: Detect integer overflow on precision in float.__format__()
and complex.__format__().
@@ -54,83 +187,180 @@ Core and Builtins
- Issue #18038: SyntaxError raised during compilation sources with illegal
encoding now always contains an encoding name.
+- Issue #17931: Resolve confusion on Windows between pids and process
+ handles.
+
+- Tweak the exception message when the magic number or size value in a bytecode
+ file is truncated.
+
+- Issue #17932: Fix an integer overflow issue on Windows 64-bit in iterators:
+ change the C type of seqiterobject.it_index from long to Py_ssize_t.
+
+- Issue #18065: Don't set __path__ to the package name for frozen packages.
+
+- Issue #18088: When reloading a module, unconditionally reset all relevant
+ attributes on the module (e.g. __name__, __loader__, __package__, __file__,
+ __cached__).
+
+- Issue #17937: Try harder to collect cyclic garbage at shutdown.
+
+- Issue #12370: Prevent class bodies from interfering with the __class__
+ closure.
+
- Issue #17644: Fix a crash in str.format when curly braces are used in square
brackets.
-- Issue #17983: Raise a SyntaxError for a ``global __class__`` statement in a
- class body.
+- Issue #17237: Fix crash in the ASCII decoder on m68k.
-- Issue #17927: Frame objects kept arguments alive if they had been copied into
- a cell, even if the cell was cleared.
+- Issue #17927: Frame objects kept arguments alive if they had been
+ copied into a cell, even if the cell was cleared.
-Library
--------
+- Issue #1545463: At shutdown, defer finalization of codec modules so
+ that stderr remains usable.
-- Issue #18747: Re-seed OpenSSL's pseudo-random number generator after fork.
- A pthread_atfork() child handler is used to seeded the PRNG with pid, time
- and some stack data.
+- Issue #7330: Implement width and precision (ex: "%5.3s") for the format
+ string of PyUnicode_FromFormat() function, original patch written by Ysj Ray.
-- Issue #8865: Concurrent invocation of select.poll.poll() now raises a
- RuntimeError exception. Patch by Christian Schubert.
+- Issue #1545463: Global variables caught in reference cycles are now
+ garbage-collected at shutdown.
-- Issue #13461: Fix a crash in the TextIOWrapper.tell method on 64-bit
- platforms. Patch by Yogesh Chaudhari.
+- Issue #17094: Clear stale thread states after fork(). Note that this
+ is a potentially disruptive change since it may release some system
+ resources which would otherwise remain perpetually alive (e.g. database
+ connections kept in thread-local storage).
-- Issue #18777: The ssl module now uses the new CRYPTO_THREADID API of
- OpenSSL 1.0.0+ instead of the deprecated CRYPTO id callback function.
+- Issue #17408: Avoid using an obsolete instance of the copyreg module when
+ the interpreter is shutdown and then started again.
-- Issue #18768: Correct doc string of RAND_edg(). Patch by Vajrasky Kok.
+- Issue #5845: Enable tab-completion in the interactive interpreter by
+ default, thanks to a new sys.__interactivehook__.
-- Issue #18178: Fix ctypes on BSD. dlmalloc.c was compiled twice which broke
- malloc weak symbols.
+- Issue #17115,17116: Module initialization now includes setting __package__ and
+ __loader__ attributes to None.
-- Issue #18709: Fix CVE-2013-4238. The SSL module now handles NULL bytes
- inside subjectAltName correctly. Formerly the module has used OpenSSL's
- GENERAL_NAME_print() function to get the string represention of ASN.1
- strings for ``rfc822Name`` (email), ``dNSName`` (DNS) and
- ``uniformResourceIdentifier`` (URI).
+- Issue #17853: Ensure locals of a class that shadow free variables always win
+ over the closures.
-- Issue #18756: Improve error reporting in os.urandom() when the failure
- is due to something else than /dev/urandom not existing (for example,
- exhausting the file descriptor limit).
+- Issue #17863: In the interactive console, don't loop forever if the encoding
+ can't be fetched from stdin.
-- Issue #18405: Improve the entropy of crypt.mksalt().
+- Issue #17867: Raise an ImportError if __import__ is not found in __builtins__.
-- Issue #18676: Change 'positive' to 'non-negative' in queue.py put and get
- docstrings and ValueError messages. Patch by Zhongyue Luo
+- Issue #18698: Ensure importlib.reload() returns the module out of sys.modules.
-- Issue #18681: Fix a NameError in imp.reload() (noticed by Weizhao Li).
+- Issue #17857: Prevent build failures with pre-3.5.0 versions of sqlite3,
+ such as was shipped with Centos 5 and Mac OS X 10.4.
-- Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error
- if methods have annotations; it now correctly displays the annotations.
+- Issue #17413: sys.settrace callbacks were being passed a string instead of an
+ exception instance for the 'value' element of the arg tuple if the exception
+ originated from C code; now an exception instance is always provided.
+
+- Issue #17782: Fix undefined behaviour on platforms where
+ ``struct timespec``'s "tv_nsec" member is not a C long.
+
+- Issue #17722: When looking up __round__, resolve descriptors.
+
+- Issue #16061: Speed up str.replace() for replacing 1-character strings.
+
+- Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
+ method.
+
+- Issue #17643: Add __callback__ attribute to weakref.ref.
+
+- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
+ class.
+
+- Issue #17669: Fix crash involving finalization of generators using yield from.
+
+- Issue #14439: Python now prints the traceback on runpy failure at startup.
+
+
+- Issue #17469: Fix _Py_GetAllocatedBlocks() and sys.getallocatedblocks()
+ when running on valgrind.
+
+- Issue #17619: Make input() check for Ctrl-C correctly on Windows.
+
+- Issue #17357: Add missing verbosity messages for -v/-vv that were lost during
+ the importlib transition.
+
+- Issue #17610: Don't rely on non-standard behavior of the C qsort() function.
+
+- Issue #17323: The "[X refs, Y blocks]" printed by debug builds has been
+ disabled by default. It can be re-enabled with the `-X showrefcount` option.
+
+Library
+-------
+
+- Issue #13461: Fix a crash in the TextIOWrapper.tell method on 64-bit
+ platforms. Patch by Yogesh Chaudhari.
+
+- Issue #18681: Fix a NameError in importlib.reload() (noticed by Weizhao Li).
+
+- Issue #14323: Expanded the number of digits in the coefficients for the
+ RGB -- YIQ conversions so that they match the FCC NTSC versions.
- Issue #17998: Fix an internal error in regular expression engine.
- Issue #17557: Fix os.getgroups() to work with the modified behavior of
getgroups(2) on OS X 10.8. Original patch by Mateusz Lenik.
+- Issue #18608: Avoid keeping a strong reference to the locale module
+ inside the _io module.
+
+- Issue #18619: Fix atexit leaking callbacks registered from sub-interpreters,
+ and make it GC-aware.
+
+- Issue #15699: The readline module now uses PEP 3121-style module
+ initialization, so as to reclaim allocated resources (Python callbacks)
+ at shutdown. Original patch by Robin Schreiber.
+
+- Issue #17616: wave.open now supports the context manager protocol.
+
- Issue #18599: Fix name attribute of _sha1.sha1() object. It now returns
'SHA1' instead of 'SHA'.
+- Issue #13266: Added inspect.unwrap to easily unravel __wrapped__ chains
+ (initial patch by Daniel Urban and Aaron Iles)
+
- Issue #18561: Skip name in ctypes' _build_callargs() if name is NULL.
- Issue #18559: Fix NULL pointer dereference error in _pickle module
-- Issue #18556: Check the return value of a PyUnicode_AsWideChar() call in
- ctypes' U_set().
+- Issue #18556: Check the return type of PyUnicode_AsWideChar() in ctype's
+ U_set().
+
+- Issue #17818: aifc.getparams now returns a namedtuple.
- Issue #18549: Eliminate dead code in socket_ntohl()
+- Issue #18530: Remove additional stat call from posixpath.ismount.
+ Patch by Alex Gaynor.
+
- Issue #18514: Fix unreachable Py_DECREF() call in PyCData_FromBaseObj()
+- Issue #9177: Calling read() or write() now raises ValueError, not
+ AttributeError, on a closed SSL socket. Patch by Senko Rasic.
+
- Issue #18513: Fix behaviour of cmath.rect w.r.t. signed zeros on OS X 10.8 +
gcc.
+- Issue #18479: Changed venv Activate.ps1 to make deactivate a function, and
+ removed Deactivate.ps1.
+
- Issue #18480: Add missing call to PyType_Ready to the _elementtree extension.
- Issue #17778: Fix test discovery for test_multiprocessing. (Patch by
Zachary Ware.)
+- Issue #18393: The private module _gestalt and private functions
+ platform._mac_ver_gestalt, platform._mac_ver_lookup and
+ platform._bcd2str have been removed. This does not affect the public
+ interface of the platform module.
+
+- Issue #17482: functools.update_wrapper (and functools.wraps) now set the
+ __wrapped__ attribute correctly even if the underlying function has a
+ __wrapped__ attribute set.
+
- Issue #18431: The new email header parser now decodes RFC2047 encoded words
in structured headers.
@@ -144,11 +374,18 @@ Library
- Issue #18101: Tcl.split() now process strings nested in a tuple as it
do with byte strings.
+- Issue #18116: getpass was always getting an error when testing /dev/tty,
+ and thus was always falling back to stdin. It also leaked an open file
+ when it did so. Both of these issues are now fixed.
+
- Issue #17198: Fix a NameError in the dbm module. Patch by Valentina
Mukhamedzhanova.
- Issue #18013: Fix cgi.FieldStorage to parse the W3C sample form.
+- Issue #18020: improve html.escape speed by an order of magnitude.
+ Patch by Matt Bryant.
+
- Issue #18347: ElementTree's html serializer now preserves the case of
closing tags.
@@ -163,6 +400,9 @@ Library
- Issue #18339: Negative ints keys in unpickler.memo dict no longer cause a
segfault inside the _pickle C extension.
+- Issue 18240: The HMAC module is no longer restricted to bytes and accepts
+ any bytes-like object, e.g. memoryview. Original patch by Jonas Borgström.
+
- Issue #18224: Removed pydoc script from created venv, as it causes problems
on Windows and adds no value over and above python -m pydoc ...
@@ -173,254 +413,141 @@ Library
- Issue #14360: encode_quopri can now be successfully used as an encoder
when constructing a MIMEApplication object.
+- Issue #11390: Add -o and -f command line options to the doctest CLI to
+ specify doctest options (and convert it to using argparse).
+
- Issue #18135: ssl.SSLSocket.write() now raises an OverflowError if the input
string in longer than 2 gigabytes, and ssl.SSLContext.load_cert_chain()
raises a ValueError if the password is longer than 2 gigabytes. The ssl
module does not support partial write.
+- Issue #11016: Add C implementation of the stat module as _stat.
+
- Issue #18248: Fix libffi build on AIX.
- Issue #18259: Declare sethostname in socketmodule.c for AIX
+- Issue #18147: Add diagnostic functions to ssl.SSLContext(). get_ca_list()
+ lists all loaded CA certificates and cert_store_stats() returns amount of
+ loaded X.509 certs, X.509 CA certs and CRLs.
+
- Issue #18167: cgi.FieldStorage no longer fails to handle multipart/form-data
when \r\n appears at end of 65535 bytes without other newlines.
-- subprocess: Prevent a possible double close of parent pipe fds when the
- subprocess exec runs into an error. Prevent a regular multi-close of the
- /dev/null fd when any of stdin, stdout and stderr was set to DEVNULL.
-
-- Issue #16102: Make uuid._netbios_getnode() work again on Python 3.
-
-- Issue #18109: os.uname() now decodes fields from the locale encoding, and
- socket.gethostname() now decodes the hostname from the locale encoding,
- instead of using the UTF-8 encoding in strict mode.
-
-- Issue #17403: urllib.parse.robotparser normalizes the urls before adding to
- ruleline. This helps in handling certain types invalid urls in a conservative
- manner.
-
-- Issue #18025: Fixed a segfault in io.BufferedIOBase.readinto() when raw
- stream's read() returns more bytes than requested.
-
-- Issue #18011: base64.b32decode() now raises a binascii.Error if there are
- non-alphabet characters present in the input string to conform a docstring.
- Updated the module documentation.
-
-- Issue #13772: Restored directory detection of targets in ``os.symlink`` on
- Windows, which was temporarily removed in Python 3.2.3 due to an incomplete
- implementation. The implementation now works even if the symlink is created
- in a location other than the current directory.
-
-- Issue #16986: ElementTree now correctly parses a string input not only when
- an internal XML encoding is UTF-8 or US-ASCII.
-
-- Issue #17812: Fixed quadratic complexity of base64.b32encode().
-
-- Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of
- service using certificates with many wildcards (CVE-2013-2099).
-
-- Issue #17981: Closed socket on error in SysLogHandler.
-
-- Fix typos in the multiprocessing module.
-
-- Issue #17754: Make ctypes.util.find_library() independent of the locale.
-
-- Issue #17968: Fix memory leak in os.listxattr().
-
-- Issue #17269: Workaround for socket.getaddrinfo crash on MacOS X
- with port None or "0" and flags AI_NUMERICSERV.
-
-- Issue #18698: Ensure imp.reload() returns the module out of sys.modules.
-
-- Issue #18080: When building a C extension module on OS X, if the compiler
- is overriden with the CC environment variable, use the new compiler as
- the default for linking if LDSHARED is not also overriden. This restores
- Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0.
-
-- Issue #18113: Fixed a refcount leak in the curses.panel module's
- set_userptr() method. Reported by Atsuo Ishimoto.
-
-C API
------
-
-- Issue #18351: Fix various issues with a helper function in importlib used
- by PyImport_ExecCodeModuleWithPathnames() (and thus by extension PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()).
-
-IDLE
-----
-
-- Issue #18429: Format / Format Paragraph, now works when comment blocks
- are selected. As with text blocks, this works best when the selection
- only includes complete lines.
-
-- Issue #18226: Add docstrings and unittests for FormatParagraph.py.
- Original patches by Todd Rovito and Phil Webster.
-
-- Issue #18279: Format - Strip trailing whitespace no longer marks a file as
- changed when it has not been changed. This fix followed the addition of a
- test file originally written by Phil Webster (the issue's main goal).
-
-- Issue #7136: In the Idle File menu, "New Window" is renamed "New File".
- Patch by Tal Einat, Roget Serwy, and Todd Rovito.
-
-- Remove dead imports of imp.
-
-- Issue #18196: Avoid displaying spurious SystemExit tracebacks.
-
-- Issue #5492: Avoid traceback when exiting IDLE caused by a race condition.
-
-- Issue #17511: Keep IDLE find dialog open after clicking "Find Next".
- Original patch by Sarah K.
-
-- Issue #18055: Move IDLE off of imp and on to importlib.
-
-- Issue #15392: Create a unittest framework for IDLE.
- Initial patch by Rajagopalasarma Jayakrishnan.
- See Lib/idlelib/idle_test/README.txt for how to run Idle tests.
-
-- Issue #14146: Highlight source line while debugging on Windows.
-
-- Issue #17532: Always include Options menu for IDLE on OS X.
- Patch by Guilherme Simões.
-
-Tests
------
-
-- Issue #1666318: Add a test that shutil.copytree() retains directory
- permissions. Patch by Catherine Devlin.
-
+- Issue #18076: Introduce importlib.util.decode_source().
- Issue #18357: add tests for dictview set difference.
Patch by Fraser Tweedale.
-- Issue #18273: move the tests in Lib/test/json_tests to Lib/test/test_json
- and make them discoverable by unittest. Patch by Zachary Ware.
-- Fix a fcntl test case on KFreeBSD, Debian #708653 (Petr Salinger).
-
-- Issue #18396: Fix spurious test failure in test_signal on Windows when
- faulthandler is enabled (Patch by Jeremy Kloth)
-
-- Issue #17046: Fix broken test_executable_without_cwd in test_subprocess.
-
-- Issue #15415: Add new temp_dir() and change_cwd() context managers to
- test.support, and refactor temp_cwd() to use them. Patch by Chris Jerdonek.
-
-- Issue #15494: test.support is now a package rather than a module (Initial
- patch by Indra Talip)
+- importlib.abc.SourceLoader.get_source() no longer changes SyntaxError or
+ UnicodeDecodeError into ImportError.
-- Issue #17944: test_zipfile now discoverable and uses subclassing to
- generate tests for different compression types. Fixed a bug with skipping
- some tests due to use of exhausted iterators.
-
-- Issue #18266: test_largefile now works with unittest test discovery and
- supports running only selected tests. Patch by Zachary Ware.
+- Issue #18058, 18057: Make the namespace package loader meet the
+ importlib.abc.InspectLoader ABC, allowing for namespace packages to work with
+ runpy.
-- Issue #17767: test_locale now works with unittest test discovery.
- Original patch by Zachary Ware.
-
-- Issue #18375: Assume --randomize when --randseed is used for running the
- testsuite.
+- Issue #17177: The imp module is pending deprecation.
-- Issue #11185: Fix test_wait4 under AIX. Patch by Sébastien Sablé.
+- subprocess: Prevent a possible double close of parent pipe fds when the
+ subprocess exec runs into an error. Prevent a regular multi-close of the
+ /dev/null fd when any of stdin, stdout and stderr was set to DEVNULL.
-- Issue #17691: test_univnewlines now works with unittest test discovery.
- Patch by Zachary Ware.
+- Issue #18194: Introduce importlib.util.cache_from_source() and
+ source_from_cache() while documenting the equivalent functions in imp as
+ deprecated.
-- Issue #18094: test_uuid no more reports skipped tests as passed.
+- Issue #17907: Document imp.new_module() as deprecated in favour of
+ types.ModuleType.
-- Issue #11995: test_pydoc doesn't import all sys.path modules anymore.
+- Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document as deprecated
+ imp.get_magic().
-Documentation
--------------
-
-- Issue #17701: Improving strftime documentation.
+- Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
+ Patch by Mark Levitt
-- Issue #18440: Clarify that `hash()` can truncate the value returned from an
- object's custom `__hash__()` method.
+- Issue #18193: Add importlib.reload().
-- Issue #17953: Mention that you shouldn't replace sys.modules and deleting key
- items will cause Python to not be happy.
+- Issue #18157: Stop using imp.load_module() in pydoc.
-- Issue #17844: Add links to encoders and decoders for bytes-to-bytes codecs.
-
-- Issue #14097: improve the "introduction" page of the tutorial.
+- Issue #16102: Make uuid._netbios_getnode() work again on Python 3.
-- Issue #17977: The documentation for the cadefault argument's default value
- in urllib.request.urlopen() is fixed to match the code.
+- Issue #17134: Add ssl.enum_cert_store() as interface to Windows' cert store.
-Tools/Demos
------------
+- Issue #18143: Implement ssl.get_default_verify_paths() in order to debug
+ the default locations for cafile and capath.
-- Issue #18439: Make patchcheck work on Windows for ACKS, NEWS.
+- Issue #17314: Move multiprocessing.forking over to importlib.
-- Issue #18448: Fix a typo in Tools/demo/eiffel.py.
+- Issue #11959: SMTPServer and SMTPChannel now take an optional map, use of
+ which avoids affecting global state.
-- Issue #18457: Fixed saving of formulas and complex numbers in
- Tools/demo/ss1.py.
+- Issue #18109: os.uname() now decodes fields from the locale encoding, and
+ socket.gethostname() now decodes the hostname from the locale encoding,
+ instead of using the UTF-8 encoding in strict mode.
-- Issue #18449: Make Tools/demo/ss1.py work again on Python 3. Patch by
- Févry Thibault.
+- Issue #18089: Implement importlib.abc.InspectLoader.load_module.
-- Issue #15239: Make mkstringprep.py work again on Python 3.
+- Issue #18088: Introduce importlib.abc.Loader.init_module_attrs for setting
+ module attributes. Leads to the pending deprecation of
+ importlib.util.module_for_loader.
-- Issue #12990: The "Python Launcher" on OSX could not launch python scripts
- that have paths that include wide characters.
+- Issue #17403: urllib.parse.robotparser normalizes the urls before adding to
+ ruleline. This helps in handling certain types invalid urls in a conservative
+ manner. Patch contributed by Mher Movsisyan.
-Build
------
+- Issue #18070: Have importlib.util.module_for_loader() set attributes
+ unconditionally in order to properly support reloading.
-- Issue #16067: Add description into MSI file to replace installer's temporary name.
+- Added importlib.util.module_to_load to return a context manager to provide the
+ proper module object to load.
-- Issue #18256: Compilation fix for recent AIX releases. Patch by
- David Edelsohn.
+- Issue #18025: Fixed a segfault in io.BufferedIOBase.readinto() when raw
+ stream's read() returns more bytes than requested.
-- Issue #15172: Document NASM 2.10+ as requirement for building OpenSSL 1.0.1
- on Windows.
+- Issue #18011: base64.b32decode() now raises a binascii.Error if there are
+ non-alphabet characters present in the input string to conform a docstring.
+ Updated the module documentation.
-What's New in Python 3.3.2?
-===========================
+- Issue #18072: Implement importlib.abc.InspectLoader.get_code() and
+ importlib.abc.ExecutionLoader.get_code().
-*Release date: 13-May-2013*
+- Issue #8240: Set the SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER flag on SSL
+ sockets.
-Core and Builtins
------------------
-
-- Issue #17237: Fix crash in the ASCII decoder on m68k.
+- Issue #17269: Workaround for socket.getaddrinfo crash on MacOS X
+ with port None or "0" and flags AI_NUMERICSERV.
-- Issue #17408: Avoid using an obsolete instance of the copyreg module when
- the interpreter is shutdown and then started again.
+- Issue #16986: ElementTree now correctly parses a string input not only when
+ an internal XML encoding is UTF-8 or US-ASCII.
-- Issue #17863: In the interactive console, don't loop forever if the encoding
- can't be fetched from stdin.
+- Issue #17996: socket module now exposes AF_LINK constant on BSD and OSX.
-- Issue #17867: Raise an ImportError if __import__ is not found in __builtins__.
+- Issue #17900: Allowed pickling of recursive OrderedDicts. Decreased pickled
+ size and pickling time.
-- Issue #17857: Prevent build failures with pre-3.5.0 versions of sqlite3,
- such as was shipped with Centos 5 and Mac OS X 10.4.
+- Issue #17914: Add os.cpu_count(). Patch by Yogesh Chaudhari, based on an
+ initial patch by Trent Nelson.
-- Issue #17413: sys.settrace callbacks were being passed a string instead of an
- exception instance for the 'value' element of the arg tuple if the exception
- originated from C code; now an exception instance is always provided.
+- Issue #17812: Fixed quadratic complexity of base64.b32encode().
+ Optimize base64.b32encode() and base64.b32decode() (speed up to 3x).
-- Issue #17782: Fix undefined behaviour on platforms where
- ``struct timespec``'s "tv_nsec" member is not a C long.
+- Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of
+ service using certificates with many wildcards (CVE-2013-2099).
-- Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
- method.
+- Issue #15758: Fix FileIO.readall() so it no longer has O(n**2) complexity.
-- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
- class.
+- Issue #14596: The struct.Struct() objects now use more compact implementation.
-- Issue #17669: Fix crash involving finalization of generators using yield from.
+- Issue #17981: Closed socket on error in SysLogHandler.
-- Issue #17619: Make input() check for Ctrl-C correctly on Windows.
+- Issue #17964: Fix os.sysconf(): the return type of the C sysconf() function
+ is long, not int.
-- Issue #17610: Don't rely on non-standard behavior of the C qsort() function.
+- Fix typos in the multiprocessing module.
-- Issue #17357: Add missing verbosity output when using -v/-vv.
+- Issue #17754: Make ctypes.util.find_library() independent of the locale.
-Library
--------
+- Issue #17968: Fix memory leak in os.listxattr().
- Issue #17606: Fixed support of encoded byte strings in the XMLGenerator
characters() and ignorableWhitespace() methods. Original patch by Sebastian
@@ -429,9 +556,6 @@ Library
- Issue #17732: Ignore distutils.cfg options pertaining to install paths if a
virtual environment is active.
-- Issue #1159051: Back out a fix for handling corrupted gzip files that
- broke backwards compatibility.
-
- Issue #17915: Fix interoperability of xml.sax with file objects returned by
codecs.open().
@@ -445,35 +569,64 @@ Library
- Issue #12181: select module: Fix struct kevent definition on OpenBSD 64-bit
platforms. Patch by Federico Schwindt.
+- Issue #11816: multiple improvements to the dis module: get_instructions
+ generator, ability to redirect output to a file, Bytecode and Instruction
+ abstractions. Patch by Nick Coghlan, Ryan Kelly and Thomas Kluyver.
+
+- Issue #13831: Embed stringification of remote traceback in local
+ traceback raised when pool task raises an exception.
+
+- Issue #15528: Add weakref.finalize to support finalization using
+ weakref callbacks.
+
- Issue #14173: Avoid crashing when reading a signal handler during
interpreter shutdown.
-- Issue #16316: mimetypes now recognizes the .xz and .txz (.tar.xz) extensions.
-
- Issue #15902: Fix imp.load_module() accepting None as a file when loading an
extension module.
-- Issue #17802: Fix an UnboundLocalError in html.parser. Initial tests by
- Thomas Barlow.
+- Issue #13721: SSLSocket.getpeercert() and SSLSocket.do_handshake() now
+ raise an OSError with ENOTCONN, instead of an AttributeError, when the
+ SSLSocket is not connected.
-- Issue #15535: Fix namedtuple pickles which were picking up the OrderedDict
- instead of just the underlying tuple.
+- Issue #14679: add an __all__ (that contains only HTMLParser) to html.parser.
-- Issue #17192: Restore the patch for Issue #11729 which was ommitted in
- 3.3.1 when updating the bundled version of libffi used by ctypes. Update
- many libffi files that were missed in 3.3.1's update to libffi-3.0.13.
+- Issue #17802: Fix an UnboundLocalError in html.parser. Initial tests by
+ Thomas Barlow.
- Issue #17358: Modules loaded by imp.load_source() and load_compiled() (and by
extention load_module()) now have a better chance of working when reloaded.
+- Issue #17804: New function ``struct.iter_unpack`` allows for streaming
+ struct unpacking.
+
+- Issue #17830: When keyword.py is used to update a keyword file, it now
+ preserves the line endings of the original file.
+
+- Issue #17272: Making the urllib.request's Request.full_url a descriptor.
+ Fixes bugs with assignment to full_url. Patch by Demian Brecht.
+
- Issue #17353: Plistlib emitted empty data tags with deeply nested datastructures
- Issue #11714: Use 'with' statements to assure a Semaphore releases a
condition variable. Original patch by Thomas Rachel.
+- Issue #16624: `subprocess.check_output` now accepts an `input` argument,
+ allowing the subprocess's stdin to be provided as a (byte) string.
+ Patch by Zack Weinberg.
+
- Issue #17795: Reverted backwards-incompatible change in SysLogHandler with
Unix domain sockets.
+- Issue #16694: Add a pure Python implementation of the operator module.
+ Patch by Zachary Ware.
+
+- Issue #11182: remove the unused and undocumented pydoc.Scanner class.
+ Patch by Martin Morrison.
+
+- Issue #17741: Add ElementTree.IncrementalParser, an event-driven parser
+ for non-blocking applications.
+
- Issue #17555: Fix ForkAwareThreadLock so that size of after fork
registry does not grow exponentially with generation of process.
@@ -501,72 +654,115 @@ Library
- Issue #16804: Fix a bug in the 'site' module that caused running
'python -S -m site' to incorrectly throw an exception.
+- Issue #15480: Remove the deprecated and unused TYPE_INT64 code from marshal.
+ Initial patch by Daniel Riti.
+
+- Issue #2118: SMTPException is now a subclass of IOError.
+
- Issue #17016: Get rid of possible pointer wraparounds and integer overflows
in the re module. Patch by Nickolai Zeldovich.
- Issue #16658: add missing return to HTTPConnection.send()
Patch by Jeff Knupp.
+- Issue #9556: Allowed specifying a time-of-day for a TimedRotatingFileHandler
+ to rotate.
+
- Issue #14971: unittest test discovery no longer gets confused when a function
has a different __name__ than its name in the TestCase class dictionary.
-- Issue #17678: Fix DeprecationWarning in the http/cookiejar.py by changing the
- usage of get_origin_req_host() to origin_req_host.
+- Issue #17487: The wave getparams method now returns a namedtuple rather than
+ a plain tuple.
+
+- Issue #17675: socket repr() provides local and remote addresses (if any).
+ Patch by Giampaolo Rodola'
+
+- Issue #17093: Make the ABCs in importlib.abc provide default values or raise
+ reasonable exceptions for their methods to make them more amenable to super()
+ calls.
+
+- Issue #17566: Make importlib.abc.Loader.module_repr() optional instead of an
+ abstractmethod and raising NotImplementedError so as to be ignored by default.
+
+- Issue #17678: Remove the use of deprecated method in http/cookiejar.py.
+ Changing the usage of get_origin_req_host() to origin_req_host.
- Issue #17666: Fix reading gzip files with an extra field.
+- Issue #16475: Support object instancing, recursion and interned strings
+ in marshal
+
- Issue #17502: Process DEFAULT values in mock side_effect that returns iterator.
- Patch by Michael Foord.
-- Issue #17572: Avoid chained exceptions while passing bad directives to
- time.strptime(). Initial patch by Claudiu Popa.
+- Issue #16795: On the ast.arguments object, unify vararg with varargannotation
+ and kwarg and kwargannotation. Change the column offset of ast.Attribute to be
+ at the attribute name.
-- Issue #17435: threading.Timer's __init__ method no longer uses mutable
- default values for the args and kwargs parameters.
+- Issue #17434: Properly raise a SyntaxError when a string occurs between future
+ imports.
-- Issue #17526: fix an IndexError raised while passing code without filename to
- inspect.findsource(). Initial patch by Tyler Doyle.
+- Issue #17117: Import and @importlib.util.set_loader now set __loader__ when
+ it has a value of None or the attribute doesn't exist.
-- Issue #16550: Update the opcode descriptions of pickletools to use unsigned
- integers where appropriate. Initial patch by Serhiy Storchaka.
+- Issue #17032: The "global" in the "NameError: global name 'x' is not defined"
+ error message has been removed. Patch by Ram Rachum.
-IDLE
-----
+- Issue #18080: When building a C extension module on OS X, if the compiler
+ is overriden with the CC environment variable, use the new compiler as
+ the default for linking if LDSHARED is not also overriden. This restores
+ Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0.
-- Issue #17838: Allow sys.stdin to be reassigned.
+- Issue #18113: Fixed a refcount leak in the curses.panel module's
+ set_userptr() method. Reported by Atsuo Ishimoto.
-- Issue #13495: Avoid loading the color delegator twice in IDLE.
+- Implement PEP 443 "Single-dispatch generic functions".
-- Issue #17798: Allow IDLE to edit new files when specified on command line.
+- Implement PEP 435 "Adding an Enum type to the Python standard library".
-- Issue #14735: Update IDLE docs to omit "Control-z on Windows".
+Tests
+-----
-- Issue #17585: Fixed IDLE regression. Now closes when using exit() or quit().
+- Issue #1666318: Add a test that shutil.copytree() retains directory
+ permissions. Patch by Catherine Devlin.
-- Issue #17657: Show full Tk version in IDLE's about dialog.
- Patch by Todd Rovito.
+- Issue #18273: move the tests in Lib/test/json_tests to Lib/test/test_json
+ and make them discoverable by unittest. Patch by Zachary Ware.
-- Issue #17613: Prevent traceback when removing syntax colorizer in IDLE.
+- Fix a fcntl test case on KFreeBSD, Debian #708653 (Petr Salinger).
-- Issue #1207589: Backwards-compatibility patch for right-click menu in IDLE.
+- Issue #18396: Fix spurious test failure in test_signal on Windows when
+ faulthandler is enabled (Patch by Jeremy Kloth)
-- Issue #16887: IDLE now accepts Cancel in tabify/untabify dialog box.
+- Issue #17046: Fix broken test_executable_without_cwd in test_subprocess.
-- Issue #17625: In IDLE, close the replace dialog after it is used.
+- Issue #15415: Add new temp_dir() and change_cwd() context managers to
+ test.support, and refactor temp_cwd() to use them. Patch by Chris Jerdonek.
-- Issue #14254: IDLE now handles readline correctly across shell restarts.
+- Issue #15494: test.support is now a package rather than a module (Initial
+ patch by Indra Talip)
-- Issue #17614: IDLE no longer raises exception when quickly closing a file.
+- Issue #17944: test_zipfile now discoverable and uses subclassing to
+ generate tests for different compression types. Fixed a bug with skipping
+ some tests due to use of exhausted iterators.
-- Issue #6698: IDLE now opens just an editor window when configured to do so.
+- Issue #18266: test_largefile now works with unittest test discovery and
+ supports running only selected tests. Patch by Zachary Ware.
-- Issue #8900: Using keyboard shortcuts in IDLE to open a file no longer
- raises an exception.
+- Issue #17767: test_locale now works with unittest test discovery.
+ Original patch by Zachary Ware.
-- Issue #6649: Fixed missing exit status in IDLE. Patch by Guilherme Polo.
+- Issue #18375: Assume --randomize when --randseed is used for running the
+ testsuite.
-Tests
------
+- Issue #11185: Fix test_wait4 under AIX. Patch by Sébastien Sablé.
+
+- Issue #18207: Fix test_ssl for some versions of OpenSSL that ignore seconds
+ in ASN1_TIME fields.
+
+- Issue #18094: test_uuid no more reports skipped tests as passed.
+
+- Issue #17992: Add timeouts to asyncore and asynchat tests so that they won't
+ accidentally hang.
- Issue #17833: Fix test_gdb failures seen on machines where debug symbols
for glibc are available (seen on PPC64 Linux).
@@ -574,6 +770,9 @@ Tests
- Issue #7855: Add tests for ctypes/winreg for issues found in IronPython.
Initial patch by Dino Viehland.
+- Issue #11078: test___all__ now checks for duplicates in __all__.
+ Initial patch by R. David Murray.
+
- Issue #17712: Fix test_gdb failures on Ubuntu 13.04.
- Issue #17835: Fix test_io when the default OS pipe buffer size is larger
@@ -585,6 +784,9 @@ Tests
- Issue #12820: add tests for the xml.dom.minicompat module.
Patch by John Chandler and Phil Connell.
+- Issue #17691: test_univnewlines now works with unittest test discovery.
+ Patch by Zachary Ware.
+
- Issue #17790: test_set now works with unittest test discovery.
Patch by Zachary Ware.
@@ -603,44 +805,136 @@ Tests
- Issue #17692: test_sqlite now works with unittest test discovery.
Patch by Zachary Ware.
-- Issue #17843: Removed bz2 test data file that was triggering false-positive
- virus warnings with certain antivirus software.
+- Issue #11995: test_pydoc doesn't import all sys.path modules anymore.
Documentation
-------------
+- Issue #17701: Improving strftime documentation.
+
+- Issue #18440: Clarify that `hash()` can truncate the value returned from an
+ object's custom `__hash__()` method.
+
+- Issue #17844: Add links to encoders and decoders for bytes-to-bytes codecs.
+
+- Issue #14097: improve the "introduction" page of the tutorial.
+
+- Issue #17977: The documentation for the cadefault argument's default value
+ in urllib.request.urlopen() is fixed to match the code.
+
- Issue #15940: Specify effect of locale on time functions.
- Issue #6696: add documentation for the Profile objects, and improve
profile/cProfile docs. Patch by Tom Pinckney.
-- Issue #17915: Fix interoperability of xml.sax with file objects returned by
- codecs.open().
-
-Build
+C-API
-----
-- Issue #17547: In configure, explicitly pass -Wformat for the benefit for GCC
- 4.8.
+- Issue #18351: Fix various issues in a function in importlib provided to help
+ PyImport_ExecCodeModuleWithPathnames() (and thus by extension PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx()).
-- Issue #17962: Build with OpenSSL 1.0.1e on Windows.
+- Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and
+ PyObject_CallMethod() now changed to `const char*`. Based on patches by
+ Jörg Müller and Lars Buitinck.
+- Issue #17206: Py_CLEAR(), Py_DECREF(), Py_XINCREF() and Py_XDECREF() now
+ expand their arguments once instead of multiple times. Patch written by Illia
+ Polosukhin.
-What's New in Python 3.3.1?
-===========================
+- Issue #17522: Add the PyGILState_Check() API.
-*Release date: 07-Apr-2013*
+- Issue #17327: Add PyDict_SetDefault.
+
+IDLE
+----
+
+- Issue #18429: Format / Format Paragraph, now works when comment blocks
+ are selected. As with text blocks, this works best when the selection
+ only includes complete lines.
+
+- Issue #18226: Add docstrings and unittests for FormatParagraph.py.
+ Original patches by Todd Rovito and Phil Webster.
+
+- Issue #18279: Format - Strip trailing whitespace no longer marks a file as
+ changed when it has not been changed. This fix followed the addition of a
+ test file originally written by Phil Webster (the issue's main goal).
+
+- Issue #7136: In the Idle File menu, "New Window" is renamed "New File".
+ Patch by Tal Einat, Roget Serwy, and Todd Rovito.
+
+- Remove dead imports of imp.
+
+- Issue #18196: Avoid displaying spurious SystemExit tracebacks.
+
+- Issue #5492: Avoid traceback when exiting IDLE caused by a race condition.
+
+- Issue #17511: Keep IDLE find dialog open after clicking "Find Next".
+ Original patch by Sarah K.
+
+- Issue #18055: Move IDLE off of imp and on to importlib.
+
+- Issue #15392: Create a unittest framework for IDLE.
+ Initial patch by Rajagopalasarma Jayakrishnan.
+ See Lib/idlelib/idle_test/README.txt for how to run Idle tests.
+
+- Issue #14146: Highlight source line while debugging on Windows.
+
+- Issue #17838: Allow sys.stdin to be reassigned.
+
+- Issue #13495: Avoid loading the color delegator twice in IDLE.
+
+- Issue #17798: Allow IDLE to edit new files when specified on command line.
+
+- Issue #14735: Update IDLE docs to omit "Control-z on Windows".
+
+- Issue #17532: Always include Options menu for IDLE on OS X.
+ Patch by Guilherme Simões.
+
+Windows
+-------
+
+- Issue #18569: The installer now adds .py to the PATHEXT variable when extensions
+ are registered. Patch by Paul Moore.
Build
-----
-- Issue #17550: Fix the --enable-profiling configure switch.
+- Issue #16067: Add description into MSI file to replace installer's
+ temporary name.
-IDLE
--------
+- Issue #18257: Fix readlink usage in python-config. Install the python
+ version again on Darwin.
-- Issue #17625: In IDLE, close the replace dialog after it is used.
+- Issue #18481: Add C coverage reporting with gcov and lcov. A new make target
+ "coverage-report" creates an instrumented Python build, runs unit tests
+ and creates a HTML. The report can be updated with "make coverage-lcov".
+
+- Issue #17845: Clarified the message printed when some module are not built.
+
+- Issue #18256: Compilation fix for recent AIX releases. Patch by
+ David Edelsohn.
+
+- Issue #17547: In configure, explicitly pass -Wformat for the benefit for GCC
+ 4.8.
+
+- Issue #15172: Document NASM 2.10+ as requirement for building OpenSSL 1.0.1
+ on Windows.
+
+Tools/Demos
+-----------
+
+- Issue #18439: Make patchcheck work on Windows for ACKS, NEWS.
+
+- Issue #18448: Fix a typo in Tools/demo/eiffel.py.
+
+- Issue #18457: Fixed saving of formulas and complex numbers in
+ Tools/demo/ss1.py.
+
+- Issue #18449: Make Tools/demo/ss1.py work again on Python 3. Patch by
+ Févry Thibault.
+- Issue #12990: The "Python Launcher" on OSX could not launch python scripts
+ that have paths that include wide characters.
What's New in Python 3.3.1 release candidate 1?
===============================================
@@ -652,24 +946,23 @@ Core and Builtins
- Issue #17328: Fix possible refleak in dict.setdefault.
-- Issue #17223: Fix PyUnicode_FromUnicode() for string of 1 character outside
- the range U+0000-U+10ffff.
-
-- Issue #1692335: Move initial args assignment to
- BaseException.__new__ to help pickling of naive subclasses.
-
- Issue #17275: Corrected class name in init error messages of the C version of
BufferedWriter and BufferedRandom.
- Issue #7963: Fixed misleading error message that issued when object is
called without arguments.
+- Issue #8745: Small speed up zipimport on Windows. Patch by Catalin Iacob.
+
- Issue #5308: Raise ValueError when marshalling too large object (a sequence
with size >= 2**31), instead of producing illegal marshal data.
- Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError
and a full traceback including line number.
+- Issue #16967: In function definition, evaluate positional defaults before
+ keyword-only defaults.
+
- Issue #17173: Remove uses of locale-dependent C functions (isalpha() etc.)
in the interpreter.
@@ -684,6 +977,10 @@ Core and Builtins
- Issue #16979: Fix error handling bugs in the unicode-escape-decode decoder.
+- Issue #16772: The base argument to the int constructor no longer accepts
+ floats, or other non-integer objects with an __int__ method. Objects
+ with an __index__ method are now accepted.
+
- Issue #10156: In the interpreter's initialization phase, unicode globals
are now initialized dynamically as needed.
@@ -711,12 +1008,6 @@ Core and Builtins
- Issue #16367: Fix FileIO.readall() on Windows for files larger than 2 GB.
-- Issue #16455: On FreeBSD and Solaris, if the locale is C, the
- ASCII/surrogateescape codec is now used, instead of the locale encoding, to
- decode the command line arguments. This change fixes inconsistencies with
- os.fsencode() and os.fsdecode() because these operating systems announces an
- ASCII locale encoding, whereas the ISO-8859-1 encoding is used in practice.
-
- Issue #16761: Calling int() with base argument only now raises TypeError.
- Issue #16759: Support the full DWORD (unsigned long) range in Reg2Py
@@ -726,24 +1017,51 @@ Core and Builtins
- Issue #14420: Support the full DWORD (unsigned long) range in Py2Reg
when passed a REG_DWORD value. Fixes OverflowError in winreg.SetValueEx.
+- Issue #11939: Set the st_dev attribute of stat_result to allow Windows to
+ take advantage of the os.path.samefile/sameopenfile/samestat implementations
+ used by other platforms.
+
+- Issue #16772: The int() constructor's second argument (base) no longer
+ accepts non integer values. Consistent with the behavior in Python 2.
+
+- Issue #14470: Remove w9xpopen support per PEP 11.
+
+- Issue #9856: Replace deprecation warning with raising TypeError
+ in object.__format__. Patch by Florent Xicluna.
+
- Issue #16597: In buffered and text IO, call close() on the underlying stream
if invoking flush() fails.
- Issue #16722: In the bytes() constructor, try to call __bytes__ on the
argument before __index__.
+- Issue #16421: loading multiple modules from one shared object is now
+ handled correctly (previously, the first module loaded from that file
+ was silently returned). Patch by Václav Šmilauer.
+
- Issue #16602: When a weakref's target was part of a long deallocation
chain, the object could remain reachable through its weakref even though
its refcount had dropped to zero.
-- Issue #16416: On Mac OS X, operating system data are now always
- encoded/decoded to/from UTF-8/surrogateescape, instead of the locale encoding
- (which may be ASCII if no locale environment variable is set), to avoid
- inconsistencies with os.fsencode() and os.fsdecode() functions which are
- already using UTF-8/surrogateescape.
+- Issue #16495: Remove extraneous NULL encoding check from bytes_decode().
+
+- Issue #16619: Create NameConstant AST class to represent None, True, and False
+ literals. As a result, these constants are never loaded at runtime from
+ builtins.
+
+- Issue #16455: On FreeBSD and Solaris, if the locale is C, the
+ ASCII/surrogateescape codec is now used, instead of the locale encoding, to
+ decode the command line arguments. This change fixes inconsistencies with
+ os.fsencode() and os.fsdecode() because these operating systems announces an
+ ASCII locale encoding, whereas the ISO-8859-1 encoding is used in practice.
+
+- Issue #16562: Optimize dict equality testing. Patch by Serhiy Storchaka.
- Issue #16588: Silence unused-but-set warnings in Python/thread_pthread
+- Issue #16592: stringlib_bytes_join doesn't raise MemoryError on allocation
+ failure.
+
- Issue #16546: Fix: ast.YieldFrom argument is now mandatory.
- Issue #16514: Fix regression causing a traceback when sys.path[0] is None
@@ -755,11 +1073,23 @@ Core and Builtins
- Issue #16215: Fix potential double memory free in str.replace(). Patch
by Serhiy Storchaka.
+- Issue #16290: A float return value from the __complex__ special method is no
+ longer accepted in the complex() constructor.
+
+- Issue #16416: On Mac OS X, operating system data are now always
+ encoded/decoded to/from UTF-8/surrogateescape, instead of the locale encoding
+ (which may be ASCII if no locale environment variable is set), to avoid
+ inconsistencies with os.fsencode() and os.fsdecode() functions which are
+ already using UTF-8/surrogateescape.
+
- Issue #16453: Fix equality testing of dead weakref objects.
- Issue #9535: Fix pending signals that have been received but not yet
handled by Python to not persist after os.fork() in the child process.
+- Issue #14794: Fix slice.indices to return correct results for huge values,
+ rather than raising OverflowError.
+
- Issue #15001: fix segfault on "del sys.modules['__main__']". Patch by Victor
Stinner.
@@ -779,23 +1109,43 @@ Core and Builtins
- Issue #8401: assigning an int to a bytearray slice (e.g. b[3:4] = 5) now
raises an error.
+- Issue #7317: Display full tracebacks when an error occurs asynchronously.
+ Patch by Alon Horev with update by Alexey Kachayev.
+
+- Issue #16309: Make PYTHONPATH="" behavior the same as if PYTHONPATH
+ not set at all.
+
+- Issue #10189: Improve the error reporting of SyntaxErrors related to global
+ and nonlocal statements.
+
- Fix segfaults on setting __qualname__ on builtin types and attempting to
delete it on any type.
+- Issue #14625: Rewrite the UTF-32 decoder. It is now 3x to 4x faster. Patch
+ written by Serhiy Storchaka.
+
- Issue #16345: Fix an infinite loop when ``fromkeys`` on a dict subclass
received a nonempty dict from the constructor.
- Issue #16271: Fix strange bugs that resulted from __qualname__ appearing in a
class's __dict__ and on type.
+- Issue #12805: Make bytes.join and bytearray.join faster when the separator
+ is empty. Patch by Serhiy Storchaka.
+
- Issue #6074: Ensure cached bytecode files can always be updated by the
user that created them, even when the source file is read-only.
+- Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer
+ objects.
+
- Issue #14783: Improve int() docstring and switch docstrings for str(),
range(), and slice() to use multi-line signatures.
- Issue #16160: Subclass support now works for types.SimpleNamespace.
+- Upgrade Unicode data (UCD) to version 6.2.
+
- Issue #15379: Fix passing of non-BMP characters as integers for the charmap
decoder (already working as unicode strings). Patch by Serhiy Storchaka.
@@ -808,25 +1158,50 @@ Core and Builtins
- Issue #15839: Convert SystemErrors in `super()` to RuntimeErrors.
+- Issue #15448: Buffered IO now frees the buffer when closed, instead
+ of when deallocating.
+
- Issue #15846: Fix SystemError which happened when using `ast.parse()` in an
exception handler on code with syntax errors.
+- Issue #15897: zipimport.c doesn't check return value of fseek().
+ Patch by Felipe Cruz.
+
- Issue #15801: Make sure mappings passed to '%' formatting are actually
subscriptable.
-- Issue #15111: __import__ should let ImportError propagate when a module that
- is imported as a side-effect of using fromlist tries to import a module
- that cannot be found.
+- Issue #15111: __import__ should propagate ImportError when raised as a
+ side-effect of a module triggered from using fromlist.
+- Issue #15022: Add pickle and comparison support to types.SimpleNamespace.
Library
-------
+- Issue #15596: Faster pickling of unicode strings.
+
+- Issue #17572: Avoid chained exceptions while passing bad directives to
+ time.strptime(). Initial patch by Claudiu Popa.
+
+- Issue #17435: threading.Timer's __init__ method no longer uses mutable
+ default values for the args and kwargs parameters.
+
+- Issue #17526: fix an IndexError raised while passing code without filename to
+ inspect.findsource(). Initial patch by Tyler Doyle.
+
- Issue #17540: Added style to formatter configuration by dict.
+- Issue #16692: The ssl module now supports TLS 1.1 and TLS 1.2. Initial
+ patch by Michele Orrù.
+
+- Issue #17025: multiprocessing: Reduce Queue and SimpleQueue contention.
+
- Issue #17536: Add to webbrowser's browser list: www-browser, x-www-browser,
iceweasel, iceape.
+- Issue #17150: pprint now uses line continuations to wrap long string
+ literals.
+
- Issue #17488: Change the subprocess.Popen bufsize parameter default value
from unbuffered (0) to buffering (-1) to match the behavior existing code
expects and match the behavior of the subprocess module in Python 2 to avoid
@@ -845,6 +1220,18 @@ Library
sending mail by closing the socket and reporting the 421 error code via the
exception appropriate to the command that received the error response.
+- Issue #16997: unittest.TestCase now provides a subTest() context manager
+ to procedurally generate, in an easy way, small test instances.
+
+- Issue #17485: Also delete the Request Content-Length header if the data
+ attribute is deleted. (Follow on to issue 16464).
+
+- Issue #15927: CVS now correctly parses escaped newlines and carriage
+ when parsing with quoting turned off.
+
+- Issue #17467: add readline and readlines support to mock_open in
+ unittest.mock.
+
- Issue #17192: Update the ctypes module's libffi to v3.0.13. This
specifically addresses a stack misalignment issue on x86 and issues on
some more recent platforms.
@@ -858,20 +1245,51 @@ Library
- Issue #17476: Fixed regression relative to Python2 in undocumented pydoc
'allmethods'; it was missing unbound methods on the class.
+- Issue #17474: Remove the deprecated methods of Request class.
+
+- Issue #16709: unittest discover order is no-longer filesystem specific. Patch
+ by Jeff Ramnani.
+
+- Use the HTTPS PyPI url for upload, overriding any plain HTTP URL in pypirc.
+
+- Issue #5024: sndhdr.whichhdr now returns the frame count for WAV files
+ rather than -1.
+
+- Issue #17460: Remove the strict argument of HTTPConnection and removing the
+ DeprecationWarning being issued from 3.2 onwards.
+
- Issue #16880: Do not assume _imp.load_dynamic() is defined in the imp module.
- Issue #16389: Fixed a performance regression relative to Python 3.1 in the
caching of compiled regular expressions.
+- Added missing FeedParser and BytesFeedParser to email.parser.__all__.
+
- Issue #17431: Fix missing import of BytesFeedParser in email.parser.
+- Issue #12921: http.server's send_error takes an explain argument to send more
+ information in response. Patch contributed by Karl.
+
+- Issue #17414: Add timeit, repeat, and default_timer to timeit.__all__.
+
- Issue #1285086: Get rid of the refcounting hack and speed up
urllib.parse.unquote() and urllib.parse.unquote_to_bytes().
+- Issue #17099: Have importlib.find_loader() raise ValueError when __loader__
+ is not set, harmonizing with what happens when the attribute is set to None.
+
+- Expose the O_PATH constant in the os module if it is available.
+
- Issue #17368: Fix an off-by-one error in the Python JSON decoder that caused
a failure while decoding empty object literals when object_pairs_hook was
specified.
+- Issue #17385: Fix quadratic behavior in threading.Condition. The FIFO
+ queue now uses a deque instead of a list.
+
+- Issue #15806: Add contextlib.ignored(). This creates a context manager
+ to ignore specified exceptions, replacing the "except Exc: pass" idiom.
+
- Issue #14645: The email generator classes now produce output using the
specified linesep throughout. Previously if the prolog, epilog, or
body were stored with a different linesep, that linesep was used. This
@@ -883,18 +1301,30 @@ Library
- Issue #16962: Use getdents64 instead of the obsolete getdents syscall
in the subprocess module on Linux.
+- Issue #16935: unittest now counts the module as skipped if it raises SkipTest,
+ instead of counting it as an error. Patch by Zachary Ware.
+
- Issue #17018: Make Process.join() retry if os.waitpid() fails with EINTR.
- Issue #17223: array module: Fix a crasher when converting an array containing
invalid characters (outside range [U+0000; U+10ffff]) to Unicode:
repr(array), str(array) and array.tounicode(). Patch written by Manuel Jacob.
+- Issue #17197: profile/cProfile modules refactored so that code of run() and
+ runctx() utility functions is not duplicated in both modules.
+
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
Patch by Lowe Thiderman.
+- Issue #15132: Allow a list for the defaultTest argument of
+ unittest.TestProgram. Patch by Jyrki Pulliainen.
+
- Issue #17225: JSON decoder now counts columns in the first line starting
with 1, as in other lines.
+- Issue #6623: Added explicit DeprecationWarning for ftplib.netrc, which has
+ been deprecated and undocumented for a long time.
+
- Issue #13700: Fix byte/string handling in imaplib authentication when an
authobject is specified.
@@ -911,11 +1341,19 @@ Library
- Issue #17143: Fix a missing import in the trace module. Initial patch by
Berker Peksag.
+- Issue #15220: email.feedparser's line splitting algorithm is now simpler and
+ faster.
+
- Issue #16743: Fix mmap overflow check on 32 bit Windows.
+- Issue #16996: webbrowser module now uses shutil.which() to find a
+ web-browser on the executable search path.
+
- Issue #16800: tempfile.gettempdir() no longer left temporary files when
the disk is full. Original patch by Amir Szekely.
+- Issue #17192: Import libffi-3.0.12.
+
- Issue #16564: Fixed regression relative to Python2 in the operation of
email.encoders.encode_7or8bit when used with binary data.
@@ -933,6 +1371,9 @@ Library
- Issue #6975: os.path.realpath() now correctly resolves multiple nested
symlinks on POSIX platforms.
+- Issue #13773: sqlite3.connect() gets a new `uri` parameter to pass the
+ filename as a URI, allowing to pass custom options.
+
- Issue #16564: Fixed regression relative to Python2 in the operation of
email.encoders.encode_noop when used with binary data.
@@ -951,6 +1392,9 @@ Library
- Issue #16723: httplib.HTTPResponse no longer marked closed when the connection
is automatically closed.
+- Issue #15359: Add CAN_BCM protocol support to the socket module. Patch by
+ Brian Thorne.
+
- Issue #16948: Fix quoted printable body encoding for non-latin1 character
sets in the email package.
@@ -975,6 +1419,10 @@ Library
stream or a decoder produces data of an unexpected type (i.e. when
io.TextIOWrapper initialized with text stream or use bytes-to-bytes codec).
+- Issue #17015: When it has a spec, a Mock object now inspects its signature
+ when matching calls, so that arguments can be matched positionally or
+ by name.
+
- Issue #15633: httplib.HTTPResponse is now mark closed when the server
sends less than the advertised Content-Length.
@@ -994,6 +1442,14 @@ Library
- Issue #12004: Fix an internal error in PyZipFile when writing an invalid
Python file. Patch by Ben Morgan.
+- Have py_compile use importlib as much as possible to avoid code duplication.
+ Code now raises FileExistsError if the file path to be used for the
+ byte-compiled file is a symlink or non-regular file as a warning that import
+ will not keep the file path type if it writes to that path.
+
+- Issue #180022: Have site.addpackage() consider already known paths even when
+ none are explicitly passed in. Bug report and fix by Kirill.
+
- Issue #1602133: on Mac OS X a shared library build (``--enable-shared``)
now fills the ``os.environ`` variable correctly.
@@ -1010,6 +1466,9 @@ Library
current directory on Unix and no longer searches a relative file path with
a directory part in PATH directories. Patch by Thomas Kluyver.
+- Issue #1159051: GzipFile now raises EOFError when reading a corrupted file
+ with truncated header or footer.
+
- Issue #16993: shutil.which() now preserves the case of the path and extension
on Windows.
@@ -1022,8 +1481,6 @@ Library
- Issue #15861: tkinter now correctly works with lists and tuples containing
strings with whitespaces, backslashes or unbalanced braces.
-- Issue #10527: Use poll() instead of select() for multiprocessing pipes.
-
- Issue #9720: zipfile now writes correct local headers for files larger than
4 GiB.
@@ -1032,6 +1489,13 @@ Library
- SSLContext.load_dh_params() now properly closes the input file.
+- Issue #15031: Refactor some .pyc management code to cut down on code
+ duplication. Thanks to Ronan Lamy for the report and taking an initial stab
+ at the problem.
+
+- Issue #16398: Optimize deque.rotate() so that it only moves pointers
+ and doesn't touch the underlying data with increfs and decrefs.
+
- Issue #16900: Issue a ResourceWarning when an ssl socket is left unclosed.
- Issue #13899: \A, \Z, and \B now correctly match the A, Z, and B literals
@@ -1041,12 +1505,29 @@ Library
failing if the connection used a row factory (such as sqlite3.Row) that
produced unsortable objects. (Regression was introduced by fix for 9750).
+- fcntl: add F_DUPFD_CLOEXEC constant, available on Linux 2.6.24+.
+
- Issue #15972: Fix error messages when os functions expecting a file name or
file descriptor receive the incorrect type.
+- Issue #8109: The ssl module now has support for server-side SNI, thanks
+ to a :meth:`SSLContext.set_servername_callback` method. Patch by Daniel
+ Black.
+
+- Issue #16860: In tempfile, use O_CLOEXEC when available to set the
+ close-on-exec flag atomically.
+
+- Issue #16674: random.getrandbits() is now 20-40% faster for small integers.
+
+- Issue #16009: JSON error messages now provide more information.
+
- Issue #16828: Fix error incorrectly raised by bz2.compress(b'') and
bz2.BZ2Compressor.compress(b''). Initial patch by Martin Packman.
+- Issue #16833: In http.client.HTTPConnection, do not concatenate the request
+ headers and body when the payload exceeds 16 KB, since it can consume more
+ memory for no benefit. Patch by Benno Leslie.
+
- Issue #16541: tk_setPalette() now works with keyword arguments.
- Issue #16820: In configparser, `parser.popitem()` no longer raises ValueError.
@@ -1062,14 +1543,21 @@ Library
- Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
+- Issue #16787: Increase asyncore and asynchat default output buffers size, to
+ decrease CPU usage and increase throughput.
+
- Issue #10527: make multiprocessing use poll() instead of select() if available.
- Issue #16688: Now regexes contained backreferences correctly work with
non-ASCII strings. Patch by Matthew Barnett.
+- Issue #16486: Make aifc files act as context managers.
+
- Issue #16485: Now file descriptors are closed if file header patching failed
on closing an aifc file.
+- Issue #16640: Run less code under a lock in sched module.
+
- Issue #16165: sched.scheduler.run() no longer blocks a scheduler for other
threads.
@@ -1079,6 +1567,8 @@ Library
- Issue #16618: Make glob.glob match consistently across strings and bytes
regarding leading dots. Patch by Serhiy Storchaka.
+- Issue #16788: Add samestat to Lib/ntpath.py
+
- Issue #16713: Parsing of 'tel' urls using urlparse separates params from
path.
@@ -1100,10 +1590,25 @@ Library
supports all None default values present in decimal.py. These values were
largely undocumented.
+- Issue #11175: argparse.FileType now accepts encoding and errors
+ arguments. Patch by Lucas Maystre.
+
+- Issue #16488: epoll() objects now support the `with` statement. Patch
+ by Serhiy Storchaka.
+
- Issue #16298: In HTTPResponse.read(), close the socket when there is no
Content-Length and the incoming stream is finished. Patch by Eran
Rundstein.
+- Add abc.ABC class to use inheritance rather than a direct invocation of
+ ABCMeta metaclass. Patch by Bruno Dupuis.
+
+- Expose the TCP_FASTOPEN and MSG_FASTOPEN flags in socket when they're
+ available.
+
+- Issue #15701: Add a .headers attribute to urllib.error.HTTPError. Patch
+ contributed by Berker Peksag.
+
- Issue #15872: Fix 3.3 regression introduced by the new fd-based shutil.rmtree
that caused it to not ignore certain errors when ignore_errors was set.
Patch by Alessandro Moura and Serhiy Storchaka.
@@ -1111,6 +1616,9 @@ Library
- Issue #16248: Disable code execution from the user's home directory by
tkinter when the -E flag is passed to Python. Patch by Zachary Ware.
+- Issue #13390: New function :func:`sys.getallocatedblocks()` returns the
+ number of memory blocks currently allocated.
+
- Issue #16628: Fix a memory leak in ctypes.resize().
- Issue #13614: Fix setup.py register failure with invalid rst in description.
@@ -1131,6 +1639,9 @@ Library
- Issue #10182: The re module doesn't truncate indices to 32 bits anymore.
Patch by Serhiy Storchaka.
+- Issue #16333: use (",", ": ") as default separator when indent is specified
+ to avoid trailing whitespace. Patch by Serhiy Storchaka.
+
- Issue #16573: In 2to3, treat enumerate() like a consuming call, so superfluous
list() calls aren't added to filter(), map(), and zip() which are directly
passed enumerate().
@@ -1139,17 +1650,46 @@ Library
lengths as unsigned 32-bit integers, like the C implementation does.
Patch by Serhiy Storchaka.
+- Issue #16423: urllib.request now has support for ``data:`` URLs. Patch by
+ Mathias Panzenböck.
+
+- Issue #4473: Add a POP3.stls() to switch a clear-text POP3 session into
+ an encrypted POP3 session, on supported servers. Patch by Lorenzo Catucci.
+
+- Issue #4473: Add a POP3.capa() method to query the capabilities advertised
+ by the POP3 server. Patch by Lorenzo Catucci.
+
+- Issue #4473: Ensure the socket is shutdown cleanly in POP3.close().
+ Patch by Lorenzo Catucci.
+
+- Issue #16522: added FAIL_FAST flag to doctest.
+
+- Issue #15627: Add the importlib.abc.InspectLoader.source_to_code() method.
+
- Issue #16408: Fix file descriptors not being closed in error conditions
in the zipfile module. Patch by Serhiy Storchaka.
+- Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak
+ references to bound methods.
+
+- Issue #16469: Fix exceptions from float -> Fraction and Decimal -> Fraction
+ conversions for special values to be consistent with those for float -> int
+ and Decimal -> int. Patch by Alexey Kachayev.
+
- Issue #16481: multiprocessing no longer leaks process handles on Windows.
+- Issue #12428: Add a pure Python implementation of functools.partial().
+ Patch by Brian Thorne.
+
- Issue #16140: The subprocess module no longer double closes its child
subprocess.PIPE parent file descriptors on child error prior to exec().
- Remove a bare print to stdout from the subprocess module that could have
happened if the child process wrote garbage to its pre-exec error pipe.
+- The subprocess module now raises its own SubprocessError instead of a
+ RuntimeError in various error situations which should not normally happen.
+
- Issue #16327: The subprocess module no longer leaks file descriptors
used for stdin/stdout/stderr pipes to the child when fork() fails.
@@ -1170,6 +1710,9 @@ Library
- Issue #16431: Use the type information when constructing a Decimal subtype
from a Decimal argument.
+- Issue #15641: Clean up deprecated classes from importlib
+ Patch by Taras Lyapun.
+
- Issue #16350: zlib.decompressobj().decompress() now accumulates data from
successive calls after EOF in unused_data, instead of only saving the argument
to the last call. decompressobj().flush() now correctly sets unused_data and
@@ -1182,30 +1725,57 @@ Library
- Issue #16152: fix tokenize to ignore whitespace at the end of the code when
no newline is found. Patch by Ned Batchelder.
+- Issue #16284: Prevent keeping unnecessary references to worker functions
+ in concurrent.futures ThreadPoolExecutor.
+
- Issue #16230: Fix a crash in select.select() when one the lists changes
size while iterated on. Patch by Serhiy Storchaka.
- Issue #16228: Fix a crash in the json module where a list changes size
while it is being encoded. Patch by Serhiy Storchaka.
+- Issue #16351: New function gc.get_stats() returns per-generation collection
+ statistics.
+
- Issue #14897: Enhance error messages of struct.pack and
struct.pack_into. Patch by Matti Mäki.
+- Issue #16316: mimetypes now recognizes the .xz and .txz (.tar.xz) extensions.
+ Patch by Serhiy Storchaka.
+
- Issue #12890: cgitb no longer prints spurious <p> tags in text
mode when the logdir option is specified.
- Issue #16307: Fix multiprocessing.Pool.map_async not calling its callbacks.
Patch by Janne Karila.
-- Issue #16250: Fix URLError invocation with proper args.
+- Issue #16305: Fix a segmentation fault occurring when interrupting
+ math.factorial.
- Issue #16116: Fix include and library paths to be correct when building C
extensions in venvs.
- Issue #16245: Fix the value of a few entities in html.entities.html5.
+- Issue #16301: Fix the localhost verification in urllib/request.py for file://
+ urls.
+
+- Issue #16250: Fix the invocations of URLError which had misplaced filename
+ attribute for exception.
+
+- Issue #10836: Fix exception raised when file not found in urlretrieve
+ Initial patch by Ezio Melotti.
+
- Issue #14398: Fix size truncation and overflow bugs in the bz2 module.
+- Issue #12692: Fix resource leak in urllib.request when talking to an HTTP
+ server that does not include a "Connection: close" header in its responses.
+
+- Issue #12034: Fix bogus caching of result in check_GetFinalPathNameByHandle.
+ Patch by Atsuo Ishimoto.
+
+- Improve performance of `lzma.LZMAFile`.
+
- Issue #16220: wsgiref now always calls close() on an iterable response.
Patch by Brent Tubbs.
@@ -1217,27 +1787,37 @@ Library
- Issue #16176: Properly identify Windows 8 via platform.platform()
+- Issue #16088: BaseHTTPRequestHandler's send_error method includes a
+ Content-Length header in it's response now. Patch by Antoine Pitrou.
+
- Issue #16114: The subprocess module no longer provides a misleading error
message stating that args[0] did not exist when either the cwd or executable
keyword arguments specified a path that did not exist.
- Issue #16169: Fix ctypes.WinError()'s confusion between errno and winerror.
-- Issue #16076: Made _elementtree.Element pickleable in a way that is compatible
- with the Python Element. Pickling/unpickling of xml.etree.ElementTree.Element
- works again - this was a temporary regression from 3.2 where the by-default
- imported _elementtree had no pickling capability.
+- Issue #1492704: shutil.copyfile() raises a distinct SameFileError now if
+ source and destination are the same file. Patch by Atsuo Ishimoto.
+
+- Issue #13896: Make shelf instances work with 'with' as context managers.
+ Original patch by Filip Gruszczyński.
+
+- Issue #15417: Add support for csh and fish in venv activation scripts.
+
+- Issue #14377: ElementTree.write and some of the module-level functions have
+ a new parameter - *short_empty_elements*. It controls how elements with no
+ contents are emitted.
- Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element
element_factory (fixes a regression in SimpleTAL).
-- Issue #16913: Fix Element.itertext()'s handling of text with XML entities.,
+- Issue #9650: List commonly used format codes in time.strftime and
+ time.strptime docsttings. Original patch by Mike Hoy.
- Issue #16034: Fix performance regressions in the new `bz2.BZ2File`
implementation. Initial patch by Serhiy Storchaka.
-- Issue #16112: platform.architecture does not correctly escape argument to
- /usr/bin/file. Patch by David Benjamin.
+- `pty.spawn()` now returns the child process status returned by `os.waitpid()`.
- Issue #15756: `subprocess.poll()` now properly handles `errno.ECHILD` to
return a returncode of 0 when the child has already exited or cannot be waited
@@ -1257,6 +1837,9 @@ Library
- Issue #15421: Fix an OverflowError in `Calendar.itermonthdates()` after
`datetime.MAXYEAR`. Patch by Cédric Krier.
+- Issue #16112: platform.architecture does not correctly escape argument to
+ /usr/bin/file. Patch by David Benjamin.
+
- Issue #15970: `xml.etree.ElementTree` now serializes correctly the empty HTML
elements 'meta' and 'param'.
@@ -1279,22 +1862,61 @@ Library
Popen when ``%action`` substitutions produce empty strings.
- Issue #12776, issue #11839: Call `argparse` type function (specified by
- add_argument) only once. Before, the type function was called twice in the
+ add_argument) only once. Before, the type function was called twice in the
case where the default was specified and the argument was given as well. This
was especially problematic for the FileType type, as a default file would
always be opened, even if a file argument was specified on the command line.
-- Issue #15906: Fix a regression in `argparse` caused by the preceding change,
+- Issue #15906: Fix a regression in argparse caused by the preceding change,
when ``action='append'``, ``type='str'`` and ``default=[]``.
+- Issue #16113: Added sha3 module based on the Keccak reference implementation
+ 3.2. The `hashlib` module has four additional hash algorithms: `sha3_224`,
+ `sha3_256`, `sha3_384` and `sha3_512`. As part of the patch some common
+ code was moved from _hashopenssl.c to hashlib.h.
+
+- ctypes.call_commethod was removed, since its only usage was in the defunct
+ samples directory.
+
+- Issue #16692: Added TLSv1.1 and TLSv1.2 support for the ssl modules.
+
+- Issue #16832: add abc.get_cache_token() to expose cache validity checking
+ support in ABCMeta.
+
IDLE
----
+- Issue #17585: Fixed IDLE regression. Now closes when using exit() or quit().
+
+- Issue #17657: Show full Tk version in IDLE's about dialog.
+ Patch by Todd Rovito.
+
+- Issue #17613: Prevent traceback when removing syntax colorizer in IDLE.
+
+- Issue #1207589: Backwards-compatibility patch for right-click menu in IDLE.
+
+- Issue #16887: IDLE now accepts Cancel in tabify/untabify dialog box.
+
+- Issue #17625: In IDLE, close the replace dialog after it is used.
+
+- Issue #14254: IDLE now handles readline correctly across shell restarts.
+
+- Issue #17614: IDLE no longer raises exception when quickly closing a file.
+
+- Issue #6698: IDLE now opens just an editor window when configured to do so.
+
+- Issue #8900: Using keyboard shortcuts in IDLE to open a file no longer
+ raises an exception.
+
+- Issue #6649: Fixed missing exit status in IDLE. Patch by Guilherme Polo.
+
- Issue #17114: IDLE now uses non-strict config parser.
- Issue #9290: In IDLE the sys.std* streams now implement io.TextIOBase
interface and support all mandatory methods and properties.
+- Issue #5066: Update IDLE docs. Patch by Todd Rovito.
+
- Issue #16829: IDLE printing no longer fails if there are spaces or other
special characters in the file path.
@@ -1311,6 +1933,9 @@ IDLE
- Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Patch by Todd Rovito.
+- Issue #16123: IDLE - deprecate running without a subprocess.
+ Patch by Roger Serwy.
+
Tests
-----
@@ -1331,8 +1956,15 @@ Tests
- Issue #13898: test_ssl no longer prints a spurious stack trace on Ubuntu.
+- Issue #17283: Share code between `__main__.py` and `regrtest.py` in
+ `Lib/test`.
+
- Issue #17249: convert a test in test_capi to use unittest and reap threads.
+- Issue #17107: Test client-side SNI support in urllib.request thanks to
+ the new server-side SNI support in the ssl module. Initial patch by
+ Daniel Black.
+
- Issue #17041: Fix testing when Python is configured with the
--without-doc-strings.
@@ -1340,6 +1972,8 @@ Tests
- Issue #15539: Added regression tests for Tools/scripts/pindent.py.
+- Issue #16836: Enable IPv6 support even if IPv6 is disabled on the build host.
+
- Issue #17479: test_io now works with unittest test discovery.
Patch by Zachary Ware.
@@ -1399,6 +2033,11 @@ Tests
- Issue #16748: test_heapq now works with unittest test discovery.
+- Issue #10646: Tests rearranged for os.samefile/samestat to check for not
+ just symlinks but also hard links.
+
+- Issue #15302: Switch regrtest from using getopt to using argparse.
+
- Issue #15324: Fix regrtest parsing of --fromfile, --match, and --randomize
options.
@@ -1408,6 +2047,9 @@ Tests
- Issue #16664: Add regression tests for glob's behaviour concerning entries
starting with a ".". Patch by Sebastian Kreft.
+- Issue #13390: The ``-R`` option to regrtest now also checks for memory
+ allocation leaks, using :func:`sys.getallocatedblocks()`.
+
- Issue #16559: Add more tests for the json module, including some from the
official test suite at json.org. Patch by Serhiy Storchaka.
@@ -1426,7 +2068,7 @@ Tests
- Issue #15802: Fix test logic in `TestMaildir.test_create_tmp()`. Patch by
Serhiy Storchaka.
-- Issue #15557: Add a test suite for the `webbrowser` module, thanks to Anton
+- Issue #15557: Added a test suite for the webbrowser module, thanks to Anton
Barkovsky.
- Issue #16698: Skip posix test_getgroups when built with OS X
@@ -1435,6 +2077,9 @@ Tests
Build
-----
+- Issue #17591: Use lowercase filenames when including Windows header files.
+ Patch by Roumen Petrov.
+
- Issue #17550: Fix the --enable-profiling configure switch.
- Issue #17425: Build with openssl 1.0.1d on Windows.
@@ -1450,6 +2095,10 @@ Build
- Issue #3718: Use AC_ARG_VAR to set MACHDEP in configure.ac.
+- Issue #16235: Implement python-config as a shell script.
+
+- Issue #16769: Remove outdated Visual Studio projects.
+
- Issue #17031: Fix running regen in cross builds.
- Issue #3754: fix typo in pthread AC_CACHE_VAL.
@@ -1457,12 +2106,14 @@ Build
- Issue #15484: Fix _PYTHON_PROJECT_BASE for srcdir != builddir builds;
use _PYTHON_PROJECT_BASE in distutils/sysconfig.py.
+- Drop support for Windows 2000.
+
- Issue #17029: Let h2py search the multiarch system include directory.
- Issue #16953: Fix socket module compilation on platforms with
HAVE_BROKEN_POLL. Patch by Jeffrey Armstrong.
-- Issue #16836: Enable IPv6 support even if IPv6 is disabled on the build host.
+- Issue #16320: Remove redundant Makefile dependencies for strings and bytes.
- Cross compiling needs host and build settings. configure no longer
creates a broken PYTHON_FOR_BUILD variable when --build is missing.
@@ -1484,6 +2135,8 @@ Build
- Issue #15923: Fix a mistake in ``asdl_c.py`` that resulted in a TypeError
after 2801bf875a24 (see #15801).
+- Issue #16135: Remove OS/2 support.
+
- Issue #15819: Make sure we can build Python out-of-tree from a read-only
source directory. (Somewhat related to issue #9860.)
@@ -1498,9 +2151,24 @@ C-API
- Issue #16881: Fix Py_ARRAY_LENGTH macro for GCC < 3.1.
+- Issue #15422: Get rid of PyCFunction_New macro. Use PyCFunction_NewEx
+ function (PyCFunction_New func is still present for backward compatibility).
+
+- Issue #16505: Remove unused Py_TPFLAGS_INT_SUBCLASS.
+
+- Issue #16086: PyTypeObject.tp_flags and PyType_Spec.flags are now unsigned
+ (unsigned long and unsigned int) to avoid an undefined behaviour with
+ Py_TPFLAGS_TYPE_SUBCLASS ((1 << 31). PyType_GetFlags() result type is
+ now unsigned too (unsigned long, instead of long).
+
+- Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
+ endianness detection and handling.
+
Documentation
-------------
+- Issue #15940: Specify effect of locale on time functions.
+
- Issue 17538: Document XML vulnerabilties
- Issue #16642: sched.scheduler timefunc initial default is time.monotonic.
@@ -1545,8 +2213,8 @@ Documentation
- Issue #13538: Improve str() and object.__str__() documentation.
-- Issue #16489: Make it clearer that importlib.find_loader() requires any and
- all packages to be separately imported.
+- Issue #16489: Make it clearer that importlib.find_loader() needs parent
+ packages to be explicitly imported.
- Issue #16400: Update the description of which versions of a given package
PyPI displays.
@@ -1569,6 +2237,9 @@ Documentation
- Issue #16115: Improve subprocess.Popen() documentation around args, shell,
and executable arguments.
+- Issue #13498: Clarify docs of os.makedirs()'s exist_ok argument. Done with
+ great native-speaker help from R. David Murray.
+
- Issue #15533: Clarify docs and add tests for `subprocess.Popen()`'s cwd
argument.
@@ -1589,6 +2260,11 @@ Documentation
Tools/Demos
-----------
+- Issue #15239: Make mkstringprep.py work again on Python 3.
+
+- Issue #17028: Allowed Python arguments to be supplied to the Windows
+ launcher.
+
- Issue #17156: pygettext.py now uses an encoding of source file and correctly
writes and escapes non-ascii characters.
@@ -1597,9 +2273,18 @@ Tools/Demos
improper indentation. pindent.py now works with continued lines broken after
"class" or "def" keywords and with continuations at the start of line.
-- Issue #15378: Fix Tools/unicode/comparecodecs.py. Patch by Serhiy Storchaka.
+- Issue #11797: Add a 2to3 fixer that maps reload() to imp.reload().
-- Issue #16476: Fix json.tool to avoid including trailing whitespace.
+- Issue #10966: Remove the concept of unexpected skipped tests.
+
+- Issue #9893: Removed the Misc/Vim directory.
+
+- Removed the Misc/TextMate directory.
+
+- Issue #16245: Add the Tools/scripts/parse_html5_entities.py script to parse
+ the list of HTML5 entities and update the html.entities.html5 dictionary.
+
+- Issue #15378: Fix Tools/unicode/comparecodecs.py. Patch by Serhiy Storchaka.
- Issue #16549: Make json.tool work again on Python 3 and add tests.
Initial patch by Berker Peksag and Serhiy Storchaka.
@@ -1694,6 +2379,9 @@ Core and Builtins
Library
-------
+- Issue #17158: Add 'symbols' to help() welcome message; clarify
+ 'modules spam' messages.
+
- Issue #15847: Fix a regression in argparse, which did not accept tuples as
argument lists anymore.
@@ -1769,6 +2457,8 @@ Core and Builtins
Library
-------
+- Issue #13248: removed deprecated and undocumented difflib.isbjunk, isbpopular.
+
- Issue #13370: Ensure that ctypes works on Mac OS X when Python is compiled
using the clang compiler.
@@ -2184,6 +2874,10 @@ Documentation
- Issue #15250: Document that `filecmp.dircmp()` compares files shallowly. Patch
contributed by Chris Jerdonek.
+- Issue #15442: Expose the default list of directories ignored by
+ `filecmp.dircmp()` as a module attribute, and expand the list to more modern
+ values.
+
Tests
-----
@@ -2296,9 +2990,6 @@ Core and Builtins
Library
-------
-- Issue #16305: Fix a segmentation fault occurring when interrupting
- math.factorial.
-
- Issue #12288: Consider '0' and '0.0' as valid initialvalue
for tkinter SimpleDialog.
@@ -3993,7 +4684,7 @@ Library
- Issue #13589: Fix some serialization primitives in the aifc module.
Patch by Oleg Plakhotnyuk.
-- Issue #13642: Unquote before b64encoding ``user:password`` during Basic
+- Issue #13642: Unquote before b64encoding user:password during Basic
Authentication. Patch contributed by Joonas Kuorilehto.
- Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor.
@@ -4452,8 +5143,8 @@ Library
- Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
given as a low fd, it gets overwritten.
-- Issue #12576: Fix urlopen behavior on sites which do not send (or obfuscate)
- a ``Connection: close`` header.
+- Issue #12576: Fix urlopen behavior on sites which do not send (or obfuscates)
+ Connection:close header.
- Issue #12560: Build libpython.so on OpenBSD. Patch by Stefan Sperling.
@@ -5011,6 +5702,9 @@ Library
- Issue #11635: Don't use polling in worker threads and processes launched by
concurrent.futures.
+- Issue #5845: Automatically read readline configuration to enable completion
+ in interactive mode.
+
- Issue #6811: Allow importlib to change a code object's co_filename attribute
to match the path to where the source code currently is, not where the code
object originally came from.
@@ -5045,7 +5739,7 @@ Library
- Issue #11127: Raise a TypeError when trying to pickle a socket object.
-- Issue #11563: ``Connection: close`` header is sent by requests using URLOpener
+- Issue #11563: Connection:close header is sent by requests using URLOpener
class which helps in closing of sockets after connection is over. Patch
contributions by Jeff McNeil and Nadeem Vawda.
@@ -5621,7 +6315,7 @@ Tests
- Issue #11505: improves test coverage of string.py. Patch by Alicia
Arlen
-- Issue #11490: test_subprocess.test_leaking_fds_on_error no longer gives a
+- Issue #11490: test_subprocess:test_leaking_fds_on_error no longer gives a
false positive if the last directory in the path is inaccessible.
- Issue #11223: Fix test_threadsignals to fail, not hang, when the
diff --git a/Misc/README b/Misc/README
index 118f6c7..e7780a2 100644
--- a/Misc/README
+++ b/Misc/README
@@ -22,9 +22,7 @@ README.AIX Information about using Python on AIX
README.coverity Information about running Coverity's Prevent on Python
README.valgrind Information for Valgrind users, see valgrind-python.supp
RPM (Old) tools to build RPMs
-svnmap.txt Map of old SVN revs and branches to hg changeset ids
SpecialBuilds.txt Describes extra symbols you can set for debug builds
-TextMate A TextMate bundle for Python development
+svnmap.txt Map of old SVN revs and branches to hg changeset ids
valgrind-python.supp Valgrind suppression file, see README.valgrind
vgrindefs Python configuration for vgrind (a generic pretty printer)
-Vim Python development utilities for the Vim editor
diff --git a/Misc/RPM/python-3.3.spec b/Misc/RPM/python-3.4.spec
index a9b489b..526998c 100644
--- a/Misc/RPM/python-3.3.spec
+++ b/Misc/RPM/python-3.4.spec
@@ -39,8 +39,8 @@
%define name python
#--start constants--
-%define version 3.3.2
-%define libvers 3.3
+%define version 3.4.0a1
+%define libvers 3.4
#--end constants--
%define release 1pydotorg
%define __prefix /usr
@@ -83,8 +83,7 @@ with very clear syntax. It has interfaces to many system calls and
libraries, as well as to various window systems, and is extensible in C or
C++. It is also usable as an extension language for applications that need
a programmable interface. Finally, Python is portable: it runs on many
-brands of UNIX, on PCs under Windows, MS-DOS, and OS/2, and on the
-Mac.
+brands of UNIX, on PCs under Windows, MS-DOS, and on the Mac.
%package devel
Summary: The libraries and header files needed for Python extension development.
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Commands/2 to 3 - Module Deletion.tmCommand b/Misc/TextMate/Python-Dev.tmbundle/Commands/2 to 3 - Module Deletion.tmCommand
deleted file mode 100644
index 3cfada8..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Commands/2 to 3 - Module Deletion.tmCommand
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string>#!/usr/bin/python
-"""Generate code to warn about a module's removal in Python 3.0.
-
-XXX Not supported:
-- Module's in a package do not have their full name generated.
-- Package's __init__ module; should detect and use the package's name instead.
-
-"""
-py_template = """from warnings import warnpy3k
-warnpy3k("the ${1:%s} module has been removed in Python 3.0", stacklevel=2)
-del warnpy3k$0"""
-
-c_template = """
-if (PyErr_WarnPy3k("the ${1:%s} module has been removed in "
- "Python 3.0", 2) &lt; 0)
- return;$0"""
-
-
-import imp
-import os
-
-file_name = os.path.split(os.environ['TM_FILEPATH'])[1]
-
-py_suffixes = reversed(sorted((suffix[0] for suffix in imp.get_suffixes() if suffix[2] == imp.PY_SOURCE), key=len))
-c_suffixes = reversed(sorted((os.path.splitext(suffix[0])[0] + '.c'
- for suffix in imp.get_suffixes() if suffix[2] == imp.C_EXTENSION), key=len))
-
-pairings = ((py_suffixes, py_template), (c_suffixes, c_template))
-
-def create_template(suffixes, template):
- for suffix in suffixes:
- if not file_name.endswith(suffix):
- continue
- module_name = file_name[:-len(suffix)]
- return template % module_name
- else:
- return None
-
-for template in (create_template(*pair) for pair in pairings):
- if not template:
- continue
- print template,
- break
-else:
- print 'XXX Could not generate code.'</string>
- <key>input</key>
- <string>none</string>
- <key>name</key>
- <string>2 to 3 - Module Deletion</string>
- <key>output</key>
- <string>insertAsSnippet</string>
- <key>tabTrigger</key>
- <string>2to3moddel</string>
- <key>uuid</key>
- <string>9519C22B-6AB8-41A1-94F6-079E0B45C147</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Commands/Build Docs.tmCommand b/Misc/TextMate/Python-Dev.tmbundle/Commands/Build Docs.tmCommand
deleted file mode 100644
index 7e4d53b..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Commands/Build Docs.tmCommand
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string># XXX Leopard-specific unless have easy way to specific alternative Python executable.
-
-cd $TM_PROJECT_DIRECTORY/Doc
-make html 2&gt;&amp;1 | pre
-
-rescan_project</string>
- <key>input</key>
- <string>none</string>
- <key>name</key>
- <string>Build Docs</string>
- <key>output</key>
- <string>showAsHTML</string>
- <key>uuid</key>
- <string>6EF151E5-7149-4F82-8796-0CC40FE589FA</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Commands/Build.tmCommand b/Misc/TextMate/Python-Dev.tmbundle/Commands/Build.tmCommand
deleted file mode 100644
index 6ffda5c..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Commands/Build.tmCommand
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string># XXX TODO
-# - Highlight any compiler warnings for Python code.
-# - Point out if compile failed.
-
-cd $TM_PROJECT_DIRECTORY
-make -s -j2 2&gt;&amp;1 | pre
-
-rescan_project</string>
- <key>input</key>
- <string>none</string>
- <key>name</key>
- <string>Build Python</string>
- <key>output</key>
- <string>showAsHTML</string>
- <key>uuid</key>
- <string>B545BB1B-A8E1-426C-B50A-426E78B96D38</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Commands/Go to Issue.tmCommand b/Misc/TextMate/Python-Dev.tmbundle/Commands/Go to Issue.tmCommand
deleted file mode 100644
index 65d30bc..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Commands/Go to Issue.tmCommand
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string>open "http://bugs.python.org/issue$(cat)"</string>
- <key>fallbackInput</key>
- <string>word</string>
- <key>input</key>
- <string>selection</string>
- <key>name</key>
- <string>Go to Issue</string>
- <key>output</key>
- <string>discard</string>
- <key>uuid</key>
- <string>FD25A8DC-22DC-4ED4-B222-B943C8A9117D</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Commands/Open Docs.tmCommand b/Misc/TextMate/Python-Dev.tmbundle/Commands/Open Docs.tmCommand
deleted file mode 100644
index 501be43..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Commands/Open Docs.tmCommand
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string># Search order:
-# - Current project.
-# - TM_PYTHONDEV_DOCS.
-# - Online docs in development.
-
-html_index=$TM_PROJECT_DIRECTORY/Doc/build/html/index.html
-if [[ -f $html_index ]]; then
- open $html_index
-elif [[ $TM_PYTHONDEV_DOCS ]]; then
- open $TM_PYTHONDEV_DOCS
-else
- open http://docs.python.org/dev/
-fi</string>
- <key>input</key>
- <string>none</string>
- <key>keyEquivalent</key>
- <string>@H</string>
- <key>name</key>
- <string>Open Docs</string>
- <key>output</key>
- <string>discard</string>
- <key>uuid</key>
- <string>BF336FFF-E14D-4BF1-A156-71CF768AC034</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Commands/Open PEP.tmCommand b/Misc/TextMate/Python-Dev.tmbundle/Commands/Open PEP.tmCommand
deleted file mode 100644
index af5533a..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Commands/Open PEP.tmCommand
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string># XXX Worth supporting using a local copy?
-
-# Dumb luck that an unrecognized number leads to a 0 being used.
-open `printf "http://www.python.org/dev/peps/pep-%04d" $(cat)`</string>
- <key>fallbackInput</key>
- <string>word</string>
- <key>input</key>
- <string>selection</string>
- <key>name</key>
- <string>Open PEP</string>
- <key>output</key>
- <string>discard</string>
- <key>uuid</key>
- <string>EDBB037F-AAE3-4512-863F-D9AA82C9E51E</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet b/Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet
deleted file mode 100644
index 5de8bae..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>content</key>
- <string>.. deprecated:: 2.6
- The :mod:\`${1}\` module has been deprecated for removal in Python 3.0.
-${0}</string>
- <key>name</key>
- <string>2 to 3 - Module Deletion (docs)</string>
- <key>tabTrigger</key>
- <string>2to3docdel</string>
- <key>uuid</key>
- <string>0568410D-EAF1-4AF3-B6DE-8AF133A91821</string>
-</dict>
-</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/info.plist b/Misc/TextMate/Python-Dev.tmbundle/info.plist
deleted file mode 100644
index 0510d5d..0000000
--- a/Misc/TextMate/Python-Dev.tmbundle/info.plist
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>mainMenu</key>
- <dict>
- <key>items</key>
- <array>
- <string>9519C22B-6AB8-41A1-94F6-079E0B45C147</string>
- <string>0568410D-EAF1-4AF3-B6DE-8AF133A91821</string>
- <string>------------------------------------</string>
- <string>B545BB1B-A8E1-426C-B50A-426E78B96D38</string>
- <string>6EF151E5-7149-4F82-8796-0CC40FE589FA</string>
- <string>------------------------------------</string>
- <string>BF336FFF-E14D-4BF1-A156-71CF768AC034</string>
- <string>FD25A8DC-22DC-4ED4-B222-B943C8A9117D</string>
- <string>EDBB037F-AAE3-4512-863F-D9AA82C9E51E</string>
- </array>
- <key>submenus</key>
- <dict/>
- </dict>
- <key>name</key>
- <string>Python-Dev</string>
- <key>ordering</key>
- <array>
- <string>9519C22B-6AB8-41A1-94F6-079E0B45C147</string>
- <string>0568410D-EAF1-4AF3-B6DE-8AF133A91821</string>
- <string>B545BB1B-A8E1-426C-B50A-426E78B96D38</string>
- <string>6EF151E5-7149-4F82-8796-0CC40FE589FA</string>
- <string>FD25A8DC-22DC-4ED4-B222-B943C8A9117D</string>
- <string>BF336FFF-E14D-4BF1-A156-71CF768AC034</string>
- <string>EDBB037F-AAE3-4512-863F-D9AA82C9E51E</string>
- </array>
- <key>uuid</key>
- <string>A932ECD1-D43A-4F57-B7FB-A1CEC3B65D20</string>
-</dict>
-</plist>
diff --git a/Misc/Vim/python.vim b/Misc/Vim/python.vim
deleted file mode 100644
index 11ee7eb..0000000
--- a/Misc/Vim/python.vim
+++ /dev/null
@@ -1,148 +0,0 @@
-" Auto-generated Vim syntax file for Python (trunk: r60376M).
-"
-" To use: copy or symlink to ~/.vim/syntax/python.vim
-
-
-if exists("b:current_syntax")
- finish
-endif
-
-if exists("python_highlight_all")
- let python_highlight_numbers = 1
- let python_highlight_builtins = 1
- let python_highlight_exceptions = 1
- let python_highlight_space_errors = 1
-endif
-
-syn keyword pythonStatement as assert break continue del except exec finally
-syn keyword pythonStatement global lambda pass print raise return try with
-syn keyword pythonStatement yield
-
-syn keyword pythonStatement def class nextgroup=pythonFunction skipwhite
-
-syn match pythonFunction "[a-zA-Z_][a-zA-Z0-9_]*" contained
-
-syn keyword pythonRepeat for while
-
-syn keyword pythonConditional if elif else
-
-syn keyword pythonOperator and in is not or
-
-syn keyword pythonPreCondit import from
-
-syn match pythonComment "#.*$" contains=pythonTodo
-
-syn keyword pythonTodo TODO FIXME XXX contained
-
-syn region pythonString matchgroup=Normal start=+[uU]\='+ end=+'+ skip=+\\\\\|\\'+ contains=pythonEscape
-syn region pythonString matchgroup=Normal start=+[uU]\="+ end=+"+ skip=+\\\\\|\\"+ contains=pythonEscape
-syn region pythonString matchgroup=Normal start=+[uU]\="""+ end=+"""+ contains=pythonEscape
-syn region pythonString matchgroup=Normal start=+[uU]\='''+ end=+'''+ contains=pythonEscape
-syn region pythonString matchgroup=Normal start=+[uU]\=[rR]'+ end=+'+ skip=+\\\\\|\\'+
-syn region pythonString matchgroup=Normal start=+[uU]\=[rR]"+ end=+"+ skip=+\\\\\|\\"+
-syn region pythonString matchgroup=Normal start=+[uU]\=[rR]"""+ end=+"""+
-syn region pythonString matchgroup=Normal start=+[uU]\=[rR]'''+ end=+'''+
-
-syn match pythonEscape +\\[abfnrtv\'"\\]+ contained
-syn match pythonEscape "\\\o\{1,3}" contained
-syn match pythonEscape "\\x\x\{2}" contained
-syn match pythonEscape "\(\\u\x\{4}\|\\U\x\{8}\)" contained
-
-syn match pythonEscape "\\$"
-
-
-if exists("python_highlight_numbers")
- syn match pythonNumber "\<0x\x\+[Ll]\=\>"
- syn match pythonNumber "\<\d\+[LljJ]\=\>"
- syn match pythonNumber "\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>"
- syn match pythonNumber "\<\d\+\.\([eE][+-]\=\d\+\)\=[jJ]\=\>"
- syn match pythonNumber "\<\d\+\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>"
-
-endif
-
-
-if exists("python_highlight_builtins")
- syn keyword pythonBuiltin Ellipsis False None NotImplemented True __debug__
- syn keyword pythonBuiltin __import__ abs all any bool
- syn keyword pythonBuiltin buffer callable chr classmethod cmp
- syn keyword pythonBuiltin complex copyright credits delattr dict
- syn keyword pythonBuiltin dir divmod enumerate eval exec exit
- syn keyword pythonBuiltin filter float frozenset getattr globals hasattr
- syn keyword pythonBuiltin hash help hex id int isinstance
- syn keyword pythonBuiltin issubclass iter len license list locals map
- syn keyword pythonBuiltin max min object oct open ord pow property quit
- syn keyword pythonBuiltin range reload repr reversed round
- syn keyword pythonBuiltin set setattr slice sorted staticmethod str sum
- syn keyword pythonBuiltin super trunc tuple type unicode vars
- syn keyword pythonBuiltin zip
-
-endif
-
-
-if exists("python_highlight_exceptions")
- syn keyword pythonException ArithmeticError AssertionError AttributeError
- syn keyword pythonException BaseException DeprecationWarning EOFError
- syn keyword pythonException EnvironmentError Exception FloatingPointError
- syn keyword pythonException FutureWarning GeneratorExit IOError ImportError
- syn keyword pythonException ImportWarning IndentationError IndexError
- syn keyword pythonException KeyError KeyboardInterrupt LookupError
- syn keyword pythonException MemoryError NameError NotImplementedError
- syn keyword pythonException OSError OverflowError PendingDeprecationWarning
- syn keyword pythonException ReferenceError RuntimeError RuntimeWarning
- syn keyword pythonException StopIteration SyntaxError
- syn keyword pythonException SyntaxWarning SystemError SystemExit TabError
- syn keyword pythonException TypeError UnboundLocalError UnicodeDecodeError
- syn keyword pythonException UnicodeEncodeError UnicodeError
- syn keyword pythonException UnicodeTranslateError UnicodeWarning
- syn keyword pythonException UserWarning ValueError Warning
- syn keyword pythonException ZeroDivisionError
-
-endif
-
-
-if exists("python_highlight_space_errors")
- syn match pythonSpaceError display excludenl "\S\s\+$"ms=s+1
- syn match pythonSpaceError display " \+\t"
- syn match pythonSpaceError display "\t\+ "
-
-endif
-
-
- hi def link pythonStatement Statement
- hi def link pythonStatement Statement
- hi def link pythonFunction Function
- hi def link pythonRepeat Repeat
- hi def link pythonConditional Conditional
- hi def link pythonOperator Operator
- hi def link pythonPreCondit PreCondit
- hi def link pythonComment Comment
- hi def link pythonTodo Todo
- hi def link pythonString String
- hi def link pythonEscape Special
- hi def link pythonEscape Special
-
- if exists("python_highlight_numbers")
- hi def link pythonNumber Number
- endif
-
- if exists("python_highlight_builtins")
- hi def link pythonBuiltin Function
- endif
-
- if exists("python_highlight_exceptions")
- hi def link pythonException Exception
- endif
-
- if exists("python_highlight_space_errors")
- hi def link pythonSpaceError Error
- endif
-
-
-" Uncomment the 'minlines' statement line and comment out the 'maxlines'
-" statement line; changes behaviour to look at least 2000 lines previously for
-" syntax matches instead of at most 200 lines
-syn sync match pythonSync grouphere NONE "):$"
-syn sync maxlines=200
-"syn sync minlines=2000
-
-let b:current_syntax = "python"
diff --git a/Misc/Vim/syntax_test.py b/Misc/Vim/syntax_test.py
deleted file mode 100644
index 1d20866..0000000
--- a/Misc/Vim/syntax_test.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""Test file for syntax highlighting of editors.
-
-Meant to cover a wide range of different types of statements and expressions.
-Not necessarily sensical or comprehensive (assume that if one exception is
-highlighted that all are, for instance).
-
-Extraneous trailing whitespace can't be tested because of svn pre-commit hook
-checks for such things.
-
-"""
-# Comment
-# OPTIONAL: XXX catch your attention
-
-# Statements
-from __future__ import with_statement # Import
-from sys import path as thing
-assert True # keyword
-def foo(): # function definition
- return []
-class Bar(object): # Class definition
- def __enter__(self):
- pass
- def __exit__(self, *args):
- pass
-foo() # UNCOLOURED: function call
-while False: # 'while'
- continue
-for x in foo(): # 'for'
- break
-with Bar() as stuff:
- pass
-if False: pass # 'if'
-elif False: pass
-else: pass
-
-# Constants
-'single-quote', u'unicode' # Strings of all kinds; prefixes not highlighted
-"double-quote"
-"""triple double-quote"""
-'''triple single-quote'''
-r'raw'
-ur'unicode raw'
-'escape\n'
-'\04' # octal
-'\xFF' # hex
-'\u1111' # unicode character
-1 # Integral
-1L
-1.0 # Float
-.1
-1+2j # Complex
-
-# Expressions
-1 and 2 or 3 # Boolean operators
-2 < 3 # UNCOLOURED: comparison operators
-spam = 42 # UNCOLOURED: assignment
-2 + 3 # UNCOLOURED: number operators
-[] # UNCOLOURED: list
-{} # UNCOLOURED: dict
-(1,) # UNCOLOURED: tuple
-all # Built-in functions
-GeneratorExit # Exceptions
diff --git a/Misc/Vim/vim_syntax.py b/Misc/Vim/vim_syntax.py
deleted file mode 100644
index 172b350..0000000
--- a/Misc/Vim/vim_syntax.py
+++ /dev/null
@@ -1,229 +0,0 @@
-from __future__ import with_statement
-# XXX(nnorwitz): what versions of python is this file supposed to work with?
-# It uses the old print statement not in py3k.
-
-import keyword
-import exceptions
-import builtins
-from string import Template
-from sys import subversion
-
-comment_header = '''" Auto-generated Vim syntax file for Python (%s: r%s).
-"
-" To use: copy or symlink to ~/.vim/syntax/python.vim'''
-
-statement_header = """
-if exists("b:current_syntax")
- finish
-endif"""
-
-statement_footer = '''
-" Uncomment the 'minlines' statement line and comment out the 'maxlines'
-" statement line; changes behaviour to look at least 2000 lines previously for
-" syntax matches instead of at most 200 lines
-syn sync match pythonSync grouphere NONE "):$"
-syn sync maxlines=200
-"syn sync minlines=2000
-
-let b:current_syntax = "python"'''
-
-looping = ('for', 'while')
-conditionals = ('if', 'elif', 'else')
-boolean_ops = ('and', 'in', 'is', 'not', 'or')
-import_stmts = ('import', 'from')
-object_defs = ('def', 'class')
-
-exception_names = sorted(exc for exc in dir(exceptions)
- if not exc.startswith('__'))
-
-# Need to include functions that start with '__' (e.g., __import__), but
-# nothing that comes with modules (e.g., __name__), so just exclude anything in
-# the 'exceptions' module since we want to ignore exceptions *and* what any
-# module would have
-builtin_names = sorted(builtin for builtin in dir(builtins)
- if builtin not in dir(exceptions))
-
-escapes = (r'+\\[abfnrtv\'"\\]+', r'"\\\o\{1,3}"', r'"\\x\x\{2}"',
- r'"\(\\u\x\{4}\|\\U\x\{8}\)"', r'"\\$"')
-
-todos = ("TODO", "FIXME", "XXX")
-
-# XXX codify?
-numbers = (r'"\<0x\x\+[Ll]\=\>"', r'"\<\d\+[LljJ]\=\>"',
- '"\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>"',
- '"\<\d\+\.\([eE][+-]\=\d\+\)\=[jJ]\=\>"',
- '"\<\d\+\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>"')
-
-contained = lambda x: "%s contained" % x
-
-def str_regexes():
- """Generator to yield various combinations of strings regexes"""
- regex_template = Template('matchgroup=Normal ' +
- 'start=+[uU]\=${raw}${sep}+ ' +
- 'end=+${sep}+ ' +
- '${skip} ' +
- '${contains}')
- skip_regex = Template(r'skip=+\\\\\|\\${sep}+')
- for raw in ('', '[rR]'):
- for separator in ("'", '"', '"""', "'''"):
- if len(separator) == 1:
- skip = skip_regex.substitute(sep=separator)
- else:
- skip = ''
- contains = 'contains=pythonEscape' if not raw else ''
- yield regex_template.substitute(raw=raw, sep=separator, skip=skip,
- contains = contains)
-
-space_errors = (r'excludenl "\S\s\+$"ms=s+1', r'" \+\t"', r'"\t\+ "')
-
-statements = (
- ('',
- # XXX Might need to change pythonStatement since have
- # specific Repeat, Conditional, Operator, etc. for 'while',
- # etc.
- [("Statement", "pythonStatement", "keyword",
- (kw for kw in keyword.kwlist
- if kw not in (looping + conditionals + boolean_ops +
- import_stmts + object_defs))
- ),
- ("Statement", "pythonStatement", "keyword",
- (' '.join(object_defs) +
- ' nextgroup=pythonFunction skipwhite')),
- ("Function","pythonFunction", "match",
- contained('"[a-zA-Z_][a-zA-Z0-9_]*"')),
- ("Repeat", "pythonRepeat", "keyword", looping),
- ("Conditional", "pythonConditional", "keyword",
- conditionals),
- ("Operator", "pythonOperator", "keyword", boolean_ops),
- ("PreCondit", "pythonPreCondit", "keyword", import_stmts),
- ("Comment", "pythonComment", "match",
- '"#.*$" contains=pythonTodo'),
- ("Todo", "pythonTodo", "keyword",
- contained(' '.join(todos))),
- ("String", "pythonString", "region", str_regexes()),
- ("Special", "pythonEscape", "match",
- (contained(esc) for esc in escapes
- if not '$' in esc)),
- ("Special", "pythonEscape", "match", r'"\\$"'),
- ]
- ),
- ("python_highlight_numbers",
- [("Number", "pythonNumber", "match", numbers)]
- ),
- ("python_highlight_builtins",
- [("Function", "pythonBuiltin", "keyword", builtin_names)]
- ),
- ("python_highlight_exceptions",
- [("Exception", "pythonException", "keyword",
- exception_names)]
- ),
- ("python_highlight_space_errors",
- [("Error", "pythonSpaceError", "match",
- ("display " + err for err in space_errors))]
- )
- )
-
-def syn_prefix(type_, kind):
- return 'syn %s %s ' % (type_, kind)
-
-def fill_stmt(iterable, fill_len):
- """Yield a string that fills at most fill_len characters with strings
- returned by 'iterable' and separated by a space"""
- # Deal with trailing char to handle ' '.join() calculation
- fill_len += 1
- overflow = None
- it = iter(iterable)
- while True:
- buffer_ = []
- total_len = 0
- if overflow:
- buffer_.append(overflow)
- total_len += len(overflow) + 1
- overflow = None
- while total_len < fill_len:
- try:
- new_item = next(it)
- buffer_.append(new_item)
- total_len += len(new_item) + 1
- except StopIteration:
- if buffer_:
- break
- if overflow:
- yield overflow
- return
- if total_len > fill_len:
- overflow = buffer_.pop()
- total_len -= len(overflow) - 1
- ret = ' '.join(buffer_)
- assert len(ret) <= fill_len
- yield ret
-
-FILL = 80
-
-def main(file_path):
- with open(file_path, 'w') as FILE:
- # Comment for file
- print>>FILE, comment_header % subversion[1:]
- print>>FILE, ''
- # Statements at start of file
- print>>FILE, statement_header
- print>>FILE, ''
- # Generate case for python_highlight_all
- print>>FILE, 'if exists("python_highlight_all")'
- for statement_var, statement_parts in statements:
- if statement_var:
- print>>FILE, ' let %s = 1' % statement_var
- else:
- print>>FILE, 'endif'
- print>>FILE, ''
- # Generate Python groups
- for statement_var, statement_parts in statements:
- if statement_var:
- print>>FILE, 'if exists("%s")' % statement_var
- indent = ' '
- else:
- indent = ''
- for colour_group, group, type_, arguments in statement_parts:
- if not isinstance(arguments, basestring):
- prefix = syn_prefix(type_, group)
- if type_ == 'keyword':
- stmt_iter = fill_stmt(arguments,
- FILL - len(prefix) - len(indent))
- try:
- while True:
- print>>FILE, indent + prefix + next(stmt_iter)
- except StopIteration:
- print>>FILE, ''
- else:
- for argument in arguments:
- print>>FILE, indent + prefix + argument
- else:
- print>>FILE, ''
-
- else:
- print>>FILE, indent + syn_prefix(type_, group) + arguments
- print>>FILE, ''
- else:
- if statement_var:
- print>>FILE, 'endif'
- print>>FILE, ''
- print>>FILE, ''
- # Associating Python group with Vim colour group
- for statement_var, statement_parts in statements:
- if statement_var:
- print>>FILE, ' if exists("%s")' % statement_var
- indent = ' '
- else:
- indent = ' '
- for colour_group, group, type_, arguments in statement_parts:
- print>>FILE, (indent + "hi def link %s %s" %
- (group, colour_group))
- else:
- if statement_var:
- print>>FILE, ' endif'
- print>>FILE, ''
- # Statements at the end of the file
- print>>FILE, statement_footer
-
-if __name__ == '__main__':
- main("python.vim")
diff --git a/Misc/Vim/vimrc b/Misc/Vim/vimrc
deleted file mode 100644
index c398cca..0000000
--- a/Misc/Vim/vimrc
+++ /dev/null
@@ -1,87 +0,0 @@
-" vimrc file for following the coding standards specified in PEP 7 & 8.
-"
-" To use this file, source it in your own personal .vimrc file (``source
-" <filename>``) or, if you don't have a .vimrc file, you can just symlink to it
-" (``ln -s <this file> ~/.vimrc``). All options are protected by autocmds
-" (read below for an explanation of the command) so blind sourcing of this file
-" is safe and will not affect your settings for non-Python or non-C files.
-"
-"
-" All setting are protected by 'au' ('autocmd') statements. Only files ending
-" in .py or .pyw will trigger the Python settings while files ending in *.c or
-" *.h will trigger the C settings. This makes the file "safe" in terms of only
-" adjusting settings for Python and C files.
-"
-" Only basic settings needed to enforce the style guidelines are set.
-" Some suggested options are listed but commented out at the end of this file.
-
-" Number of spaces that a pre-existing tab is equal to.
-" For the amount of space used for a new tab use shiftwidth.
-au BufRead,BufNewFile *py,*pyw,*.c,*.h set tabstop=8
-
-" What to use for an indent.
-" This will affect Ctrl-T and 'autoindent'.
-" Python: 4 spaces
-" C: tabs (pre-existing files) or 4 spaces (new files)
-au BufRead,BufNewFile *.py,*pyw set shiftwidth=4
-au BufRead,BufNewFile *.py,*.pyw set expandtab
-fu Select_c_style()
- if search('^\t', 'n', 150)
- set shiftwidth=8
- set noexpandtab
- el
- set shiftwidth=4
- set expandtab
- en
-endf
-au BufRead,BufNewFile *.c,*.h call Select_c_style()
-au BufRead,BufNewFile Makefile* set noexpandtab
-
-" Use the below highlight group when displaying bad whitespace is desired.
-highlight BadWhitespace ctermbg=red guibg=red
-
-" Display tabs at the beginning of a line in Python mode as bad.
-au BufRead,BufNewFile *.py,*.pyw match BadWhitespace /^\t\+/
-" Make trailing whitespace be flagged as bad.
-au BufRead,BufNewFile *.py,*.pyw,*.c,*.h,*.rst match BadWhitespace /\s\+$/
-
-" Wrap text after a certain number of characters
-" Python: 79
-" C: 79
-au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set textwidth=79
-
-" Turn off settings in 'formatoptions' relating to comment formatting.
-" - c : do not automatically insert the comment leader when wrapping based on
-" 'textwidth'
-" - o : do not insert the comment leader when using 'o' or 'O' from command mode
-" - r : do not insert the comment leader when hitting <Enter> in insert mode
-" Python: not needed
-" C: prevents insertion of '*' at the beginning of every line in a comment
-au BufRead,BufNewFile *.c,*.h set formatoptions-=c formatoptions-=o formatoptions-=r
-
-" Use UNIX (\n) line endings.
-" Only used for new files so as to not force existing files to change their
-" line endings.
-" Python: yes
-" C: yes
-au BufNewFile *.py,*.pyw,*.c,*.h set fileformat=unix
-
-
-" ----------------------------------------------------------------------------
-" The following section contains suggested settings. While in no way required
-" to meet coding standards, they are helpful.
-
-" Set the default file encoding to UTF-8: ``set encoding=utf-8``
-
-" Puts a marker at the beginning of the file to differentiate between UTF and
-" UCS encoding (WARNING: can trick shells into thinking a text file is actually
-" a binary file when executing the text file): ``set bomb``
-
-" For full syntax highlighting:
-"``let python_highlight_all=1``
-"``syntax on``
-
-" Automatically indent based on file type: ``filetype indent on``
-" Keep indentation level from previous line: ``set autoindent``
-
-" Folding based on indentation: ``set foldmethod=indent``
diff --git a/Misc/coverity_model.c b/Misc/coverity_model.c
new file mode 100644
index 0000000..57f3aeb
--- /dev/null
+++ b/Misc/coverity_model.c
@@ -0,0 +1,132 @@
+/* Coverity Scan model
+ *
+ * This is a modeling file for Coverity Scan. Modeling helps to avoid false
+ * positives.
+ *
+ * - A model file can't import any header files.
+ * - Therefore only some built-in primitives like int, char and void are
+ * available but not wchar_t, NULL etc.
+ * - Modeling doesn't need full structs and typedefs. Rudimentary structs
+ * and similar types are sufficient.
+ * - An uninitialized local pointer is not an error. It signifies that the
+ * variable could be either NULL or have some data.
+ *
+ * Coverity Scan doesn't pick up modifications automatically. The model file
+ * must be uploaded by an admin in the analysis settings of
+ * http://scan.coverity.com/projects/200
+ */
+
+/* dummy definitions, in most cases struct fields aren't required. */
+
+#define NULL (void *)0
+#define assert(op) /* empty */
+typedef int sdigit;
+typedef long Py_ssize_t;
+typedef long long PY_LONG_LONG;
+typedef unsigned short wchar_t;
+typedef struct {} PyObject;
+typedef struct {} grammar;
+typedef struct {} DIR;
+typedef struct {} RFILE;
+
+/* Python/pythonrun.c
+ * resourece leak false positive */
+
+void Py_FatalError(const char *msg) {
+ __coverity_panic__();
+}
+
+/* Objects/longobject.c
+ * NEGATIVE_RETURNS false positive */
+
+static PyObject *get_small_int(sdigit ival)
+{
+ /* Never returns NULL */
+ PyObject *p;
+ assert(p != NULL);
+ return p;
+}
+
+PyObject *PyLong_FromLong(long ival)
+{
+ PyObject *p;
+ int maybe;
+
+ if ((ival >= -5) && (ival < 257 + 5)) {
+ p = get_small_int(ival);
+ assert(p != NULL);
+ return p;
+ }
+ if (maybe)
+ return p;
+ else
+ return NULL;
+}
+
+PyObject *PyLong_FromLongLong(PY_LONG_LONG ival)
+{
+ return PyLong_FromLong((long)ival);
+}
+
+PyObject *PyLong_FromSsize_t(Py_ssize_t ival)
+{
+ return PyLong_FromLong((long)ival);
+}
+
+/* tainted sinks
+ *
+ * Coverity considers argv, environ, read() data etc as tained.
+ */
+
+PyObject *PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
+{
+ __coverity_tainted_data_sink__(filename);
+ return NULL;
+}
+
+/* Python/fileutils.c */
+wchar_t *_Py_char2wchar(const char* arg, size_t *size)
+{
+ wchar_t *w;
+ __coverity_tainted_data_sink__(arg);
+ __coverity_tainted_data_sink__(size);
+ return w;
+}
+
+/* Parser/pgenmain.c */
+grammar *getgrammar(char *filename)
+{
+ grammar *g;
+ __coverity_tainted_data_sink__(filename);
+ return g;
+}
+
+/* Python/marshal.c */
+
+static Py_ssize_t r_string(char *s, Py_ssize_t n, RFILE *p)
+{
+ __coverity_tainted_string_argument__(s);
+ return 0;
+}
+
+static long r_long(RFILE *p)
+{
+ long l;
+ unsigned char buffer[4];
+
+ r_string((char *)buffer, 4, p);
+ __coverity_tainted_string_sanitize_content__(buffer);
+ l = (long)buffer;
+ return l;
+}
+
+/* Coverity doesn't understand that fdopendir() may take ownership of fd. */
+
+DIR *fdopendir(int fd) {
+ DIR *d;
+ if (d) {
+ __coverity_close__(fd);
+ }
+ return d;
+}
+
diff --git a/Misc/python-config.in b/Misc/python-config.in
index ac3a2c7..0b9b5dc 100644
--- a/Misc/python-config.in
+++ b/Misc/python-config.in
@@ -1,6 +1,8 @@
#!@EXENAME@
# -*- python -*-
+# Keep this script in sync with python-config.sh.in
+
import getopt
import os
import sys
diff --git a/Misc/python-config.sh.in b/Misc/python-config.sh.in
new file mode 100644
index 0000000..f5a3dbe
--- /dev/null
+++ b/Misc/python-config.sh.in
@@ -0,0 +1,111 @@
+#!/bin/sh
+
+# Keep this script in sync with python-config.in
+
+exit_with_usage ()
+{
+ echo "Usage: $0 --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--help|--abiflags|--configdir"
+ exit $1
+}
+
+if [ "$1" = "" ] ; then
+ exit_with_usage 1
+fi
+
+# Returns the actual prefix where this script was installed to.
+installed_prefix ()
+{
+ RESULT=$(dirname $(cd $(dirname "$1") && pwd -P))
+ if which readlink >/dev/null 2>&1 ; then
+ if readlink -f "$RESULT" >/dev/null 2>&1; then
+ RESULT=$(readlink -f "$RESULT")
+ fi
+ fi
+ echo $RESULT
+}
+
+prefix_build="@prefix@"
+prefix_real=$(installed_prefix "$0")
+
+# Use sed to fix paths from their built-to locations to their installed-to
+# locations.
+prefix=$(echo "$prefix_build" | sed "s#$prefix_build#$prefix_real#")
+exec_prefix_build="@exec_prefix@"
+exec_prefix=$(echo "$exec_prefix_build" | sed "s#$exec_prefix_build#$prefix_real#")
+includedir=$(echo "@includedir@" | sed "s#$prefix_build#$prefix_real#")
+libdir=$(echo "@libdir@" | sed "s#$prefix_build#$prefix_real#")
+CFLAGS=$(echo "@CFLAGS@" | sed "s#$prefix_build#$prefix_real#")
+VERSION="@VERSION@"
+LIBM="@LIBM@"
+LIBC="@LIBC@"
+SYSLIBS="$LIBM $LIBC"
+ABIFLAGS="@ABIFLAGS@"
+LIBS="@LIBS@ $SYSLIBS -lpython${VERSION}${ABIFLAGS}"
+BASECFLAGS="@BASECFLAGS@"
+LDLIBRARY="@LDLIBRARY@"
+LINKFORSHARED="@LINKFORSHARED@"
+OPT="@OPT@"
+PY_ENABLE_SHARED="@PY_ENABLE_SHARED@"
+LDVERSION="@LDVERSION@"
+LIBDEST=${prefix}/lib/python${VERSION}
+LIBPL=$(echo "@LIBPL@" | sed "s#$prefix_build#$prefix_real#")
+SO="@SO@"
+PYTHONFRAMEWORK="@PYTHONFRAMEWORK@"
+INCDIR="-I$includedir/python${VERSION}${ABIFLAGS}"
+PLATINCDIR="-I$includedir/python${VERSION}${ABIFLAGS}"
+
+# Scan for --help or unknown argument.
+for ARG in $*
+do
+ case $ARG in
+ --help)
+ exit_with_usage 0
+ ;;
+ --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--abiflags|--configdir)
+ ;;
+ *)
+ exit_with_usage 1
+ ;;
+ esac
+done
+
+for ARG in "$@"
+do
+ case "$ARG" in
+ --prefix)
+ echo "$prefix"
+ ;;
+ --exec-prefix)
+ echo "$exec_prefix"
+ ;;
+ --includes)
+ echo "$INCDIR $PLATINCDIR"
+ ;;
+ --cflags)
+ echo "$INCDIR $PLATINCDIR $BASECFLAGS $CFLAGS $OPT"
+ ;;
+ --libs)
+ echo "$LIBS"
+ ;;
+ --ldflags)
+ LINKFORSHAREDUSED=
+ if [ -z "$PYTHONFRAMEWORK" ] ; then
+ LINKFORSHAREDUSED=$LINKFORSHARED
+ fi
+ LIBPLUSED=
+ if [ "$PY_ENABLE_SHARED" = "0" ] ; then
+ LIBPLUSED="-L$LIBPL"
+ fi
+ echo "$LIBPLUSED -L$libdir $LIBS $LINKFORSHAREDUSED"
+ ;;
+ --extension-suffix)
+ echo "$SO"
+ ;;
+ --abiflags)
+ echo "$ABIFLAGS"
+ ;;
+ --configdir)
+ echo "$LIBPL"
+ ;;
+esac
+done
diff --git a/Misc/python.man b/Misc/python.man
index bcb3ec8..52aedee 100644
--- a/Misc/python.man
+++ b/Misc/python.man
@@ -26,11 +26,14 @@ python \- an interpreted, interactive, object-oriented programming language
.B \-i
]
[
-.B \-m
-.I module-name
+.B \-I
]
.br
[
+.B \-m
+.I module-name
+]
+[
.B \-q
]
[
@@ -139,6 +142,13 @@ command. It does not read the $PYTHONSTARTUP file. This can be
useful to inspect global variables or a stack trace when a script
raises an exception.
.TP
+.B \-I
+Run Python in isolated mode. This also implies \fB\-E\fP and \fB\-S\fP. In
+isolated mode sys.path contains neither the script’s directory nor the user’s
+site-packages directory. All PYTHON* environment variables are ignored, too.
+Further restrictions may be imposed to prevent the user from injecting
+malicious code.
+.TP
.BI "\-m " module-name
Searches
.I sys.path
diff --git a/Modules/Setup.dist b/Modules/Setup.dist
index f45de5c..ebf8172 100644
--- a/Modules/Setup.dist
+++ b/Modules/Setup.dist
@@ -113,9 +113,11 @@ _sre _sre.c # Fredrik Lundh's new regular expressions
_codecs _codecsmodule.c # access to the builtin codecs and codec registry
_weakref _weakref.c # weak references
_functools _functoolsmodule.c # Tools for working with functions and callable objects
-operator operator.c # operator.add() and similar goodies
+_operator _operator.c # operator.add() and similar goodies
_collections _collectionsmodule.c # Container types
itertools itertoolsmodule.c # Functions creating iterators for efficient looping
+atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
+_stat _stat.c # stat.h interface
# access to ISO C locale support
_locale _localemodule.c # -lintl
@@ -170,7 +172,6 @@ _symtable symtablemodule.c
#_weakref _weakref.c # basic weak reference support
#_testcapi _testcapimodule.c # Python C API test module
#_random _randommodule.c # Random number generator
-#atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
#_pickle _pickle.c # pickle accelerator
#_datetime _datetimemodule.c # datetime accelerator
diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
index 4eee5a2..abc4d5d 100644
--- a/Modules/_bz2module.c
+++ b/Modules/_bz2module.c
@@ -36,8 +36,6 @@
#define RELEASE_LOCK(obj)
#endif
-#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
-
typedef struct {
PyObject_HEAD
@@ -149,7 +147,7 @@ compress(BZ2Compressor *c, char *data, size_t len, int action)
c->bzs.next_in = data;
c->bzs.avail_in = 0;
c->bzs.next_out = PyBytes_AS_STRING(result);
- c->bzs.avail_out = PyBytes_GET_SIZE(result);
+ c->bzs.avail_out = SMALLCHUNK;
for (;;) {
char *this_out;
int bzerror;
@@ -157,7 +155,7 @@ compress(BZ2Compressor *c, char *data, size_t len, int action)
/* On a 64-bit system, len might not fit in avail_in (an unsigned int).
Do compression in chunks of no more than UINT_MAX bytes each. */
if (c->bzs.avail_in == 0 && len > 0) {
- c->bzs.avail_in = MIN(len, UINT_MAX);
+ c->bzs.avail_in = (unsigned int)Py_MIN(len, UINT_MAX);
len -= c->bzs.avail_in;
}
@@ -173,7 +171,7 @@ compress(BZ2Compressor *c, char *data, size_t len, int action)
c->bzs.next_out = PyBytes_AS_STRING(result) + data_size;
buffer_left = PyBytes_GET_SIZE(result) - data_size;
}
- c->bzs.avail_out = MIN(buffer_left, UINT_MAX);
+ c->bzs.avail_out = (unsigned int)Py_MIN(buffer_left, UINT_MAX);
}
Py_BEGIN_ALLOW_THREADS
@@ -250,6 +248,24 @@ BZ2Compressor_flush(BZ2Compressor *self, PyObject *noargs)
return result;
}
+static void*
+BZ2_Malloc(void* ctx, int items, int size)
+{
+ if (items < 0 || size < 0)
+ return NULL;
+ if ((size_t)items > (size_t)PY_SSIZE_T_MAX / (size_t)size)
+ return NULL;
+ /* PyMem_Malloc() cannot be used: compress() and decompress()
+ release the GIL */
+ return PyMem_RawMalloc(items * size);
+}
+
+static void
+BZ2_Free(void* ctx, void *ptr)
+{
+ PyMem_RawFree(ptr);
+}
+
static int
BZ2Compressor_init(BZ2Compressor *self, PyObject *args, PyObject *kwargs)
{
@@ -272,6 +288,9 @@ BZ2Compressor_init(BZ2Compressor *self, PyObject *args, PyObject *kwargs)
}
#endif
+ self->bzs.opaque = NULL;
+ self->bzs.bzalloc = BZ2_Malloc;
+ self->bzs.bzfree = BZ2_Free;
bzerror = BZ2_bzCompressInit(&self->bzs, compresslevel, 0, 0);
if (catch_bz2_error(bzerror))
goto error;
@@ -370,10 +389,10 @@ decompress(BZ2Decompressor *d, char *data, size_t len)
d->bzs.next_in = data;
/* On a 64-bit system, len might not fit in avail_in (an unsigned int).
Do decompression in chunks of no more than UINT_MAX bytes each. */
- d->bzs.avail_in = MIN(len, UINT_MAX);
+ d->bzs.avail_in = (unsigned int)Py_MIN(len, UINT_MAX);
len -= d->bzs.avail_in;
d->bzs.next_out = PyBytes_AS_STRING(result);
- d->bzs.avail_out = PyBytes_GET_SIZE(result);
+ d->bzs.avail_out = SMALLCHUNK;
for (;;) {
char *this_out;
int bzerror;
@@ -399,7 +418,7 @@ decompress(BZ2Decompressor *d, char *data, size_t len)
if (d->bzs.avail_in == 0) {
if (len == 0)
break;
- d->bzs.avail_in = MIN(len, UINT_MAX);
+ d->bzs.avail_in = (unsigned int)Py_MIN(len, UINT_MAX);
len -= d->bzs.avail_in;
}
if (d->bzs.avail_out == 0) {
@@ -410,7 +429,7 @@ decompress(BZ2Decompressor *d, char *data, size_t len)
d->bzs.next_out = PyBytes_AS_STRING(result) + data_size;
buffer_left = PyBytes_GET_SIZE(result) - data_size;
}
- d->bzs.avail_out = MIN(buffer_left, UINT_MAX);
+ d->bzs.avail_out = (unsigned int)Py_MIN(buffer_left, UINT_MAX);
}
}
if (data_size != PyBytes_GET_SIZE(result))
diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c
index 40037b1..0b093ab 100644
--- a/Modules/_codecsmodule.c
+++ b/Modules/_codecsmodule.c
@@ -189,9 +189,9 @@ escape_encode(PyObject *self,
return NULL;
}
else {
- register Py_ssize_t i;
- register char c;
- register char *p = PyBytes_AS_STRING(v);
+ Py_ssize_t i;
+ char c;
+ char *p = PyBytes_AS_STRING(v);
for (i = 0; i < size; i++) {
/* There's at least enough room for a hex escape */
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 34a1a90..e5dfdb4 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -3,30 +3,32 @@
/* collections module implementation of a deque() datatype
Written and maintained by Raymond D. Hettinger <python@rcn.com>
- Copyright (c) 2004 Python Software Foundation.
+ Copyright (c) 2004-2013 Python Software Foundation.
All rights reserved.
*/
/* The block length may be set to any number over 1. Larger numbers
- * reduce the number of calls to the memory allocator but take more
- * memory. Ideally, BLOCKLEN should be set with an eye to the
- * length of a cache line.
+ * reduce the number of calls to the memory allocator, give faster
+ * indexing and rotation, and reduce the link::data overhead ratio.
+ *
+ * Ideally, the block length will be set to two less than some
+ * multiple of the cache-line length (so that the full block
+ * including the leftlink and rightlink will fit neatly into
+ * cache lines).
*/
#define BLOCKLEN 62
#define CENTER ((BLOCKLEN - 1) / 2)
/* A `dequeobject` is composed of a doubly-linked list of `block` nodes.
- * This list is not circular (the leftmost block has leftlink==NULL,
- * and the rightmost block has rightlink==NULL). A deque d's first
- * element is at d.leftblock[leftindex] and its last element is at
- * d.rightblock[rightindex]; note that, unlike as for Python slice
- * indices, these indices are inclusive on both ends. By being inclusive
- * on both ends, algorithms for left and right operations become
- * symmetrical which simplifies the design.
- *
* The list of blocks is never empty, so d.leftblock and d.rightblock
- * are never equal to NULL.
+ * are never equal to NULL. The list is not circular.
+ *
+ * A deque d's first element is at d.leftblock[leftindex]
+ * and its last element is at d.rightblock[rightindex].
+ * Unlike Python slice indices, these indices are inclusive
+ * on both ends. This makes the algorithms for left and
+ * right operations more symmetrical and simplifies the design.
*
* The indices, d.leftindex and d.rightindex are always in the range
* 0 <= index < BLOCKLEN.
@@ -47,42 +49,60 @@
typedef struct BLOCK {
struct BLOCK *leftlink;
- struct BLOCK *rightlink;
PyObject *data[BLOCKLEN];
+ struct BLOCK *rightlink;
} block;
+/* For debug builds, add error checking to track the endpoints
+ * in the chain of links. The goal is to make sure that link
+ * assignments only take place at endpoints so that links already
+ * in use do not get overwritten.
+ *
+ * CHECK_END should happen before each assignment to a block's link field.
+ * MARK_END should happen whenever a link field becomes a new endpoint.
+ * This happens when new blocks are added or whenever an existing
+ * block is freed leaving another existing block as the new endpoint.
+ */
+
+#ifndef NDEBUG
+#define MARK_END(link) link = NULL;
+#define CHECK_END(link) assert(link == NULL);
+#define CHECK_NOT_END(link) assert(link != NULL);
+#else
+#define MARK_END(link)
+#define CHECK_END(link)
+#define CHECK_NOT_END(link)
+#endif
+
+/* A simple freelisting scheme is used to minimize calls to the memory
+ allocator. It accomodates common use cases where new blocks are being
+ added at about the same rate as old blocks are being freed.
+ */
+
#define MAXFREEBLOCKS 10
static Py_ssize_t numfreeblocks = 0;
static block *freeblocks[MAXFREEBLOCKS];
static block *
-newblock(block *leftlink, block *rightlink, Py_ssize_t len) {
+newblock(Py_ssize_t len) {
block *b;
- /* To prevent len from overflowing PY_SSIZE_T_MAX on 64-bit machines, we
- * refuse to allocate new blocks if the current len is dangerously
- * close. There is some extra margin to prevent spurious arithmetic
- * overflows at various places. The following check ensures that
- * the blocks allocated to the deque, in the worst case, can only
- * have PY_SSIZE_T_MAX-2 entries in total.
- */
+ /* To prevent len from overflowing PY_SSIZE_T_MAX, we refuse to
+ * allocate new blocks if the current len is nearing overflow. */
if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) {
PyErr_SetString(PyExc_OverflowError,
"cannot add more blocks to the deque");
return NULL;
}
if (numfreeblocks) {
- numfreeblocks -= 1;
- b = freeblocks[numfreeblocks];
- } else {
- b = PyMem_Malloc(sizeof(block));
- if (b == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
+ numfreeblocks--;
+ return freeblocks[numfreeblocks];
}
- b->leftlink = leftlink;
- b->rightlink = rightlink;
- return b;
+ b = PyMem_Malloc(sizeof(block));
+ if (b != NULL) {
+ return b;
+ }
+ PyErr_NoMemory();
+ return NULL;
}
static void
@@ -97,14 +117,13 @@ freeblock(block *b)
}
typedef struct {
- PyObject_HEAD
+ PyObject_VAR_HEAD
block *leftblock;
block *rightblock;
Py_ssize_t leftindex; /* in range(BLOCKLEN) */
Py_ssize_t rightindex; /* in range(BLOCKLEN) */
- Py_ssize_t len;
+ long state; /* incremented whenever the indices move */
Py_ssize_t maxlen;
- long state; /* incremented whenever the indices move */
PyObject *weakreflist; /* List of weak references */
} dequeobject;
@@ -118,9 +137,9 @@ typedef struct {
*/
#define TRIM(d, popfunction) \
- if (d->maxlen != -1 && d->len > d->maxlen) { \
+ if (d->maxlen != -1 && Py_SIZE(d) > d->maxlen) { \
PyObject *rv = popfunction(d, NULL); \
- assert(rv != NULL && d->len <= d->maxlen); \
+ assert(rv != NULL && Py_SIZE(d) <= d->maxlen); \
Py_DECREF(rv); \
}
@@ -137,18 +156,20 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (deque == NULL)
return NULL;
- b = newblock(NULL, NULL, 0);
+ b = newblock(0);
if (b == NULL) {
Py_DECREF(deque);
return NULL;
}
+ MARK_END(b->leftlink);
+ MARK_END(b->rightlink);
assert(BLOCKLEN >= 2);
deque->leftblock = b;
deque->rightblock = b;
deque->leftindex = CENTER + 1;
deque->rightindex = CENTER;
- deque->len = 0;
+ Py_SIZE(deque) = 0;
deque->state = 0;
deque->weakreflist = NULL;
deque->maxlen = -1;
@@ -162,17 +183,17 @@ deque_pop(dequeobject *deque, PyObject *unused)
PyObject *item;
block *prevblock;
- if (deque->len == 0) {
+ if (Py_SIZE(deque) == 0) {
PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
return NULL;
}
item = deque->rightblock->data[deque->rightindex];
deque->rightindex--;
- deque->len--;
+ Py_SIZE(deque)--;
deque->state++;
if (deque->rightindex == -1) {
- if (deque->len == 0) {
+ if (Py_SIZE(deque) == 0) {
assert(deque->leftblock == deque->rightblock);
assert(deque->leftindex == deque->rightindex+1);
/* re-center instead of freeing a block */
@@ -182,7 +203,8 @@ deque_pop(dequeobject *deque, PyObject *unused)
prevblock = deque->rightblock->leftlink;
assert(deque->leftblock != deque->rightblock);
freeblock(deque->rightblock);
- prevblock->rightlink = NULL;
+ CHECK_NOT_END(prevblock);
+ MARK_END(prevblock->rightlink);
deque->rightblock = prevblock;
deque->rightindex = BLOCKLEN - 1;
}
@@ -198,18 +220,18 @@ deque_popleft(dequeobject *deque, PyObject *unused)
PyObject *item;
block *prevblock;
- if (deque->len == 0) {
+ if (Py_SIZE(deque) == 0) {
PyErr_SetString(PyExc_IndexError, "pop from an empty deque");
return NULL;
}
assert(deque->leftblock != NULL);
item = deque->leftblock->data[deque->leftindex];
deque->leftindex++;
- deque->len--;
+ Py_SIZE(deque)--;
deque->state++;
if (deque->leftindex == BLOCKLEN) {
- if (deque->len == 0) {
+ if (Py_SIZE(deque) == 0) {
assert(deque->leftblock == deque->rightblock);
assert(deque->leftindex == deque->rightindex+1);
/* re-center instead of freeing a block */
@@ -219,8 +241,8 @@ deque_popleft(dequeobject *deque, PyObject *unused)
assert(deque->leftblock != deque->rightblock);
prevblock = deque->leftblock->rightlink;
freeblock(deque->leftblock);
- assert(prevblock != NULL);
- prevblock->leftlink = NULL;
+ CHECK_NOT_END(prevblock);
+ MARK_END(prevblock->leftlink);
deque->leftblock = prevblock;
deque->leftindex = 0;
}
@@ -235,16 +257,18 @@ deque_append(dequeobject *deque, PyObject *item)
{
deque->state++;
if (deque->rightindex == BLOCKLEN-1) {
- block *b = newblock(deque->rightblock, NULL, deque->len);
+ block *b = newblock(Py_SIZE(deque));
if (b == NULL)
return NULL;
- assert(deque->rightblock->rightlink == NULL);
+ b->leftlink = deque->rightblock;
+ CHECK_END(deque->rightblock->rightlink);
deque->rightblock->rightlink = b;
deque->rightblock = b;
+ MARK_END(b->rightlink);
deque->rightindex = -1;
}
Py_INCREF(item);
- deque->len++;
+ Py_SIZE(deque)++;
deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item;
TRIM(deque, deque_popleft);
@@ -258,16 +282,18 @@ deque_appendleft(dequeobject *deque, PyObject *item)
{
deque->state++;
if (deque->leftindex == 0) {
- block *b = newblock(NULL, deque->leftblock, deque->len);
+ block *b = newblock(Py_SIZE(deque));
if (b == NULL)
return NULL;
- assert(deque->leftblock->leftlink == NULL);
+ b->rightlink = deque->leftblock;
+ CHECK_END(deque->leftblock->leftlink);
deque->leftblock->leftlink = b;
deque->leftblock = b;
+ MARK_END(b->leftlink);
deque->leftindex = BLOCKLEN;
}
Py_INCREF(item);
- deque->len++;
+ Py_SIZE(deque)++;
deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item;
TRIM(deque, deque_pop);
@@ -309,6 +335,14 @@ deque_extend(dequeobject *deque, PyObject *iterable)
return result;
}
+ /* Space saving heuristic. Start filling from the left */
+ if (Py_SIZE(deque) == 0) {
+ assert(deque->leftblock == deque->rightblock);
+ assert(deque->leftindex == deque->rightindex+1);
+ deque->leftindex = 1;
+ deque->rightindex = 0;
+ }
+
it = PyObject_GetIter(iterable);
if (it == NULL)
return NULL;
@@ -319,19 +353,20 @@ deque_extend(dequeobject *deque, PyObject *iterable)
while ((item = PyIter_Next(it)) != NULL) {
deque->state++;
if (deque->rightindex == BLOCKLEN-1) {
- block *b = newblock(deque->rightblock, NULL,
- deque->len);
+ block *b = newblock(Py_SIZE(deque));
if (b == NULL) {
Py_DECREF(item);
Py_DECREF(it);
return NULL;
}
- assert(deque->rightblock->rightlink == NULL);
+ b->leftlink = deque->rightblock;
+ CHECK_END(deque->rightblock->rightlink);
deque->rightblock->rightlink = b;
deque->rightblock = b;
+ MARK_END(b->rightlink);
deque->rightindex = -1;
}
- deque->len++;
+ Py_SIZE(deque)++;
deque->rightindex++;
deque->rightblock->data[deque->rightindex] = item;
TRIM(deque, deque_popleft);
@@ -361,6 +396,14 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
return result;
}
+ /* Space saving heuristic. Start filling from the right */
+ if (Py_SIZE(deque) == 0) {
+ assert(deque->leftblock == deque->rightblock);
+ assert(deque->leftindex == deque->rightindex+1);
+ deque->leftindex = BLOCKLEN - 1;
+ deque->rightindex = BLOCKLEN - 2;
+ }
+
it = PyObject_GetIter(iterable);
if (it == NULL)
return NULL;
@@ -371,19 +414,20 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
while ((item = PyIter_Next(it)) != NULL) {
deque->state++;
if (deque->leftindex == 0) {
- block *b = newblock(NULL, deque->leftblock,
- deque->len);
+ block *b = newblock(Py_SIZE(deque));
if (b == NULL) {
Py_DECREF(item);
Py_DECREF(it);
return NULL;
}
- assert(deque->leftblock->leftlink == NULL);
+ b->rightlink = deque->leftblock;
+ CHECK_END(deque->leftblock->leftlink);
deque->leftblock->leftlink = b;
deque->leftblock = b;
+ MARK_END(b->leftlink);
deque->leftindex = BLOCKLEN;
}
- deque->len++;
+ Py_SIZE(deque)++;
deque->leftindex--;
deque->leftblock->data[deque->leftindex] = item;
TRIM(deque, deque_pop);
@@ -413,7 +457,13 @@ deque_inplace_concat(dequeobject *deque, PyObject *other)
static int
_deque_rotate(dequeobject *deque, Py_ssize_t n)
{
- Py_ssize_t m, len=deque->len, halflen=len>>1;
+ block *b = NULL;
+ block *leftblock = deque->leftblock;
+ block *rightblock = deque->rightblock;
+ Py_ssize_t leftindex = deque->leftindex;
+ Py_ssize_t rightindex = deque->rightindex;
+ Py_ssize_t len=Py_SIZE(deque), halflen=len>>1;
+ int rv = -1;
if (len <= 1)
return 0;
@@ -429,76 +479,103 @@ _deque_rotate(dequeobject *deque, Py_ssize_t n)
deque->state++;
while (n > 0) {
- if (deque->leftindex == 0) {
- block *b = newblock(NULL, deque->leftblock, len);
- if (b == NULL)
- return -1;
- assert(deque->leftblock->leftlink == NULL);
- deque->leftblock->leftlink = b;
- deque->leftblock = b;
- deque->leftindex = BLOCKLEN;
+ if (leftindex == 0) {
+ if (b == NULL) {
+ b = newblock(len);
+ if (b == NULL)
+ goto done;
+ }
+ b->rightlink = leftblock;
+ CHECK_END(leftblock->leftlink);
+ leftblock->leftlink = b;
+ leftblock = b;
+ MARK_END(b->leftlink);
+ leftindex = BLOCKLEN;
+ b = NULL;
}
- assert(deque->leftindex > 0);
-
- m = n;
- if (m > deque->rightindex + 1)
- m = deque->rightindex + 1;
- if (m > deque->leftindex)
- m = deque->leftindex;
- assert (m > 0 && m <= len);
- memcpy(&deque->leftblock->data[deque->leftindex - m],
- &deque->rightblock->data[deque->rightindex + 1 - m],
- m * sizeof(PyObject *));
- deque->rightindex -= m;
- deque->leftindex -= m;
- n -= m;
-
- if (deque->rightindex == -1) {
- block *prevblock = deque->rightblock->leftlink;
- assert(deque->rightblock != NULL);
- assert(deque->leftblock != deque->rightblock);
- freeblock(deque->rightblock);
- prevblock->rightlink = NULL;
- deque->rightblock = prevblock;
- deque->rightindex = BLOCKLEN - 1;
+ assert(leftindex > 0);
+ {
+ PyObject **src, **dest;
+ Py_ssize_t m = n;
+
+ if (m > rightindex + 1)
+ m = rightindex + 1;
+ if (m > leftindex)
+ m = leftindex;
+ assert (m > 0 && m <= len);
+ src = &rightblock->data[rightindex];
+ dest = &leftblock->data[leftindex - 1];
+ rightindex -= m;
+ leftindex -= m;
+ n -= m;
+ do {
+ *(dest--) = *(src--);
+ } while (--m);
+ }
+ if (rightindex == -1) {
+ assert(leftblock != rightblock);
+ assert(b == NULL);
+ b = rightblock;
+ CHECK_NOT_END(rightblock->leftlink);
+ rightblock = rightblock->leftlink;
+ MARK_END(rightblock->rightlink);
+ rightindex = BLOCKLEN - 1;
}
}
while (n < 0) {
- if (deque->rightindex == BLOCKLEN - 1) {
- block *b = newblock(deque->rightblock, NULL, len);
- if (b == NULL)
- return -1;
- assert(deque->rightblock->rightlink == NULL);
- deque->rightblock->rightlink = b;
- deque->rightblock = b;
- deque->rightindex = -1;
+ if (rightindex == BLOCKLEN - 1) {
+ if (b == NULL) {
+ b = newblock(len);
+ if (b == NULL)
+ goto done;
+ }
+ b->leftlink = rightblock;
+ CHECK_END(rightblock->rightlink);
+ rightblock->rightlink = b;
+ rightblock = b;
+ MARK_END(b->rightlink);
+ rightindex = -1;
+ b = NULL;
}
- assert (deque->rightindex < BLOCKLEN - 1);
-
- m = -n;
- if (m > BLOCKLEN - deque->leftindex)
- m = BLOCKLEN - deque->leftindex;
- if (m > BLOCKLEN - 1 - deque->rightindex)
- m = BLOCKLEN - 1 - deque->rightindex;
- assert (m > 0 && m <= len);
- memcpy(&deque->rightblock->data[deque->rightindex + 1],
- &deque->leftblock->data[deque->leftindex],
- m * sizeof(PyObject *));
- deque->leftindex += m;
- deque->rightindex += m;
- n += m;
-
- if (deque->leftindex == BLOCKLEN) {
- block *nextblock = deque->leftblock->rightlink;
- assert(deque->leftblock != deque->rightblock);
- freeblock(deque->leftblock);
- assert(nextblock != NULL);
- nextblock->leftlink = NULL;
- deque->leftblock = nextblock;
- deque->leftindex = 0;
+ assert (rightindex < BLOCKLEN - 1);
+ {
+ PyObject **src, **dest;
+ Py_ssize_t m = -n;
+
+ if (m > BLOCKLEN - leftindex)
+ m = BLOCKLEN - leftindex;
+ if (m > BLOCKLEN - 1 - rightindex)
+ m = BLOCKLEN - 1 - rightindex;
+ assert (m > 0 && m <= len);
+ src = &leftblock->data[leftindex];
+ dest = &rightblock->data[rightindex + 1];
+ leftindex += m;
+ rightindex += m;
+ n += m;
+ do {
+ *(dest++) = *(src++);
+ } while (--m);
+ }
+ if (leftindex == BLOCKLEN) {
+ assert(leftblock != rightblock);
+ assert(b == NULL);
+ b = leftblock;
+ CHECK_NOT_END(leftblock->rightlink);
+ leftblock = leftblock->rightlink;
+ MARK_END(leftblock->leftlink);
+ leftindex = 0;
}
}
- return 0;
+ rv = 0;
+done:
+ if (b != NULL)
+ freeblock(b);
+ deque->leftblock = leftblock;
+ deque->rightblock = rightblock;
+ deque->leftindex = leftindex;
+ deque->rightindex = rightindex;
+
+ return rv;
}
static PyObject *
@@ -523,13 +600,15 @@ deque_reverse(dequeobject *deque, PyObject *unused)
block *rightblock = deque->rightblock;
Py_ssize_t leftindex = deque->leftindex;
Py_ssize_t rightindex = deque->rightindex;
- Py_ssize_t n = (deque->len)/2;
+ Py_ssize_t n = (Py_SIZE(deque))/2;
Py_ssize_t i;
PyObject *tmp;
for (i=0 ; i<n ; i++) {
/* Validate that pointers haven't met in the middle */
assert(leftblock != rightblock || leftindex < rightindex);
+ CHECK_NOT_END(leftblock);
+ CHECK_NOT_END(rightblock);
/* Swap */
tmp = leftblock->data[leftindex];
@@ -539,8 +618,6 @@ deque_reverse(dequeobject *deque, PyObject *unused)
/* Advance left block/index pair */
leftindex++;
if (leftindex == BLOCKLEN) {
- if (leftblock->rightlink == NULL)
- break;
leftblock = leftblock->rightlink;
leftindex = 0;
}
@@ -548,8 +625,6 @@ deque_reverse(dequeobject *deque, PyObject *unused)
/* Step backwards with the right block/index pair */
rightindex--;
if (rightindex == -1) {
- if (rightblock->leftlink == NULL)
- break;
rightblock = rightblock->leftlink;
rightindex = BLOCKLEN - 1;
}
@@ -563,9 +638,9 @@ PyDoc_STRVAR(reverse_doc,
static PyObject *
deque_count(dequeobject *deque, PyObject *v)
{
- block *leftblock = deque->leftblock;
- Py_ssize_t leftindex = deque->leftindex;
- Py_ssize_t n = deque->len;
+ block *b = deque->leftblock;
+ Py_ssize_t index = deque->leftindex;
+ Py_ssize_t n = Py_SIZE(deque);
Py_ssize_t i;
Py_ssize_t count = 0;
PyObject *item;
@@ -573,7 +648,8 @@ deque_count(dequeobject *deque, PyObject *v)
int cmp;
for (i=0 ; i<n ; i++) {
- item = leftblock->data[leftindex];
+ CHECK_NOT_END(b);
+ item = b->data[index];
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
if (cmp > 0)
count++;
@@ -587,12 +663,10 @@ deque_count(dequeobject *deque, PyObject *v)
}
/* Advance left block/index pair */
- leftindex++;
- if (leftindex == BLOCKLEN) {
- if (leftblock->rightlink == NULL) /* can occur when i==n-1 */
- break;
- leftblock = leftblock->rightlink;
- leftindex = 0;
+ index++;
+ if (index == BLOCKLEN) {
+ b = b->rightlink;
+ index = 0;
}
}
return PyLong_FromSsize_t(count);
@@ -604,19 +678,19 @@ PyDoc_STRVAR(count_doc,
static Py_ssize_t
deque_len(dequeobject *deque)
{
- return deque->len;
+ return Py_SIZE(deque);
}
static PyObject *
deque_remove(dequeobject *deque, PyObject *value)
{
- Py_ssize_t i, n=deque->len;
+ Py_ssize_t i, n=Py_SIZE(deque);
for (i=0 ; i<n ; i++) {
PyObject *item = deque->leftblock->data[deque->leftindex];
int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
- if (deque->len != n) {
+ if (Py_SIZE(deque) != n) {
PyErr_SetString(PyExc_IndexError,
"deque mutated during remove().");
return NULL;
@@ -647,14 +721,14 @@ deque_clear(dequeobject *deque)
{
PyObject *item;
- while (deque->len) {
+ while (Py_SIZE(deque)) {
item = deque_pop(deque, NULL);
assert (item != NULL);
Py_DECREF(item);
}
assert(deque->leftblock == deque->rightblock &&
deque->leftindex - 1 == deque->rightindex &&
- deque->len == 0);
+ Py_SIZE(deque) == 0);
}
static PyObject *
@@ -664,7 +738,7 @@ deque_item(dequeobject *deque, Py_ssize_t i)
PyObject *item;
Py_ssize_t n, index=i;
- if (i < 0 || i >= deque->len) {
+ if (i < 0 || i >= Py_SIZE(deque)) {
PyErr_SetString(PyExc_IndexError,
"deque index out of range");
return NULL;
@@ -673,19 +747,19 @@ deque_item(dequeobject *deque, Py_ssize_t i)
if (i == 0) {
i = deque->leftindex;
b = deque->leftblock;
- } else if (i == deque->len - 1) {
+ } else if (i == Py_SIZE(deque) - 1) {
i = deque->rightindex;
b = deque->rightblock;
} else {
i += deque->leftindex;
n = i / BLOCKLEN;
i %= BLOCKLEN;
- if (index < (deque->len >> 1)) {
+ if (index < (Py_SIZE(deque) >> 1)) {
b = deque->leftblock;
while (n--)
b = b->rightlink;
} else {
- n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
+ n = (deque->leftindex + Py_SIZE(deque) - 1) / BLOCKLEN - n;
b = deque->rightblock;
while (n--)
b = b->leftlink;
@@ -708,7 +782,7 @@ deque_del_item(dequeobject *deque, Py_ssize_t i)
{
PyObject *item;
- assert (i >= 0 && i < deque->len);
+ assert (i >= 0 && i < Py_SIZE(deque));
if (_deque_rotate(deque, -i) == -1)
return -1;
@@ -724,7 +798,7 @@ deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
{
PyObject *old_value;
block *b;
- Py_ssize_t n, len=deque->len, halflen=(len+1)>>1, index=i;
+ Py_ssize_t n, len=Py_SIZE(deque), halflen=(len+1)>>1, index=i;
if (i < 0 || i >= len) {
PyErr_SetString(PyExc_IndexError,
@@ -787,17 +861,17 @@ deque_traverse(dequeobject *deque, visitproc visit, void *arg)
Py_ssize_t index;
Py_ssize_t indexlo = deque->leftindex;
- for (b = deque->leftblock; b != NULL; b = b->rightlink) {
- const Py_ssize_t indexhi = b == deque->rightblock ?
- deque->rightindex :
- BLOCKLEN - 1;
-
- for (index = indexlo; index <= indexhi; ++index) {
+ for (b = deque->leftblock; b != deque->rightblock; b = b->rightlink) {
+ for (index = indexlo; index < BLOCKLEN ; index++) {
item = b->data[index];
Py_VISIT(item);
}
indexlo = 0;
}
+ for (index = indexlo; index <= deque->rightindex; index++) {
+ item = b->data[index];
+ Py_VISIT(item);
+ }
return 0;
}
@@ -887,8 +961,8 @@ deque_richcompare(PyObject *v, PyObject *w, int op)
}
/* Shortcuts */
- vs = ((dequeobject *)v)->len;
- ws = ((dequeobject *)w)->len;
+ vs = Py_SIZE((dequeobject *)v);
+ ws = Py_SIZE((dequeobject *)w);
if (op == Py_EQ) {
if (v == w)
Py_RETURN_TRUE;
@@ -989,8 +1063,8 @@ deque_sizeof(dequeobject *deque, void *unused)
Py_ssize_t blocks;
res = sizeof(dequeobject);
- blocks = (deque->leftindex + deque->len + BLOCKLEN - 1) / BLOCKLEN;
- assert(deque->leftindex + deque->len - 1 ==
+ blocks = (deque->leftindex + Py_SIZE(deque) + BLOCKLEN - 1) / BLOCKLEN;
+ assert(deque->leftindex + Py_SIZE(deque) - 1 ==
(blocks - 1) * BLOCKLEN + deque->rightindex);
res += blocks * sizeof(block);
return PyLong_FromSsize_t(res);
@@ -1143,7 +1217,7 @@ deque_iter(dequeobject *deque)
Py_INCREF(deque);
it->deque = deque;
it->state = deque->state;
- it->counter = deque->len;
+ it->counter = Py_SIZE(deque);
PyObject_GC_Track(it);
return (PyObject *)it;
}
@@ -1182,7 +1256,7 @@ dequeiter_next(dequeiterobject *it)
it->index++;
it->counter--;
if (it->index == BLOCKLEN && it->counter > 0) {
- assert (it->b->rightlink != NULL);
+ CHECK_NOT_END(it->b->rightlink);
it->b = it->b->rightlink;
it->index = 0;
}
@@ -1230,7 +1304,7 @@ PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(
static PyObject *
dequeiter_reduce(dequeiterobject *it)
{
- return Py_BuildValue("O(On)", Py_TYPE(it), it->deque, it->deque->len - it->counter);
+ return Py_BuildValue("O(On)", Py_TYPE(it), it->deque, Py_SIZE(it->deque) - it->counter);
}
static PyMethodDef dequeiter_methods[] = {
@@ -1299,7 +1373,7 @@ deque_reviter(dequeobject *deque)
Py_INCREF(deque);
it->deque = deque;
it->state = deque->state;
- it->counter = deque->len;
+ it->counter = Py_SIZE(deque);
PyObject_GC_Track(it);
return (PyObject *)it;
}
@@ -1324,7 +1398,7 @@ dequereviter_next(dequeiterobject *it)
it->index--;
it->counter--;
if (it->index == -1 && it->counter > 0) {
- assert (it->b->leftlink != NULL);
+ CHECK_NOT_END(it->b->leftlink);
it->b = it->b->leftlink;
it->index = BLOCKLEN - 1;
}
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 48a5cf8..22ac266 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -51,7 +51,7 @@ static struct PyModuleDef _csvmodule;
typedef enum {
START_RECORD, START_FIELD, ESCAPED_CHAR, IN_FIELD,
IN_QUOTED_FIELD, ESCAPE_IN_QUOTED_FIELD, QUOTE_IN_QUOTED_FIELD,
- EAT_CRNL
+ EAT_CRNL,AFTER_ESCAPED_CRNL
} ParserState;
typedef enum {
@@ -644,6 +644,12 @@ parse_process_char(ReaderObj *self, Py_UCS4 c)
break;
case ESCAPED_CHAR:
+ if (c == '\n' || c=='\r') {
+ if (parse_add_char(self, c) < 0)
+ return -1;
+ self->state = AFTER_ESCAPED_CRNL;
+ break;
+ }
if (c == '\0')
c = '\n';
if (parse_add_char(self, c) < 0)
@@ -651,6 +657,11 @@ parse_process_char(ReaderObj *self, Py_UCS4 c)
self->state = IN_FIELD;
break;
+ case AFTER_ESCAPED_CRNL:
+ if (c == '\0')
+ break;
+ /*fallthru*/
+
case IN_FIELD:
/* in unquoted field */
if (c == '\n' || c == '\r' || c == '\0') {
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 9a37aac..a93290e 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -428,13 +428,7 @@ CDataType_from_buffer(PyObject *type, PyObject *args)
StgDictObject *dict = PyType_stgdict(type);
assert (dict);
- if (!PyArg_ParseTuple(args,
-#if (PY_VERSION_HEX < 0x02050000)
- "O|i:from_buffer",
-#else
- "O|n:from_buffer",
-#endif
- &obj, &offset))
+ if (!PyArg_ParseTuple(args, "O|n:from_buffer", &obj, &offset))
return NULL;
if (-1 == PyObject_AsWriteBuffer(obj, &buffer, &buffer_len))
@@ -447,11 +441,7 @@ CDataType_from_buffer(PyObject *type, PyObject *args)
}
if (dict->size > buffer_len - offset) {
PyErr_Format(PyExc_ValueError,
-#if (PY_VERSION_HEX < 0x02050000)
- "Buffer size too small (%d instead of at least %d bytes)",
-#else
"Buffer size too small (%zd instead of at least %zd bytes)",
-#endif
buffer_len, dict->size + offset);
return NULL;
}
@@ -484,13 +474,7 @@ CDataType_from_buffer_copy(PyObject *type, PyObject *args)
StgDictObject *dict = PyType_stgdict(type);
assert (dict);
- if (!PyArg_ParseTuple(args,
-#if (PY_VERSION_HEX < 0x02050000)
- "O|i:from_buffer",
-#else
- "O|n:from_buffer",
-#endif
- &obj, &offset))
+ if (!PyArg_ParseTuple(args, "O|n:from_buffer", &obj, &offset))
return NULL;
if (-1 == PyObject_AsReadBuffer(obj, (const void**)&buffer, &buffer_len))
@@ -504,11 +488,7 @@ CDataType_from_buffer_copy(PyObject *type, PyObject *args)
if (dict->size > buffer_len - offset) {
PyErr_Format(PyExc_ValueError,
-#if (PY_VERSION_HEX < 0x02050000)
- "Buffer size too small (%d instead of at least %d bytes)",
-#else
"Buffer size too small (%zd instead of at least %zd bytes)",
-#endif
buffer_len, dict->size + offset);
return NULL;
}
@@ -1326,7 +1306,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (stgdict->format == NULL)
goto error;
stgdict->ndim = itemdict->ndim + 1;
- stgdict->shape = PyMem_Malloc(sizeof(Py_ssize_t *) * stgdict->ndim);
+ stgdict->shape = PyMem_Malloc(sizeof(Py_ssize_t) * stgdict->ndim);
if (stgdict->shape == NULL)
goto error;
stgdict->shape[0] = length;
diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c
index 34c46ad..8623239 100644
--- a/Modules/_ctypes/callbacks.c
+++ b/Modules/_ctypes/callbacks.c
@@ -98,20 +98,37 @@ void _ctypes_add_traceback(char *funcname, char *filename, int lineno)
PyObject *py_globals = 0;
PyCodeObject *py_code = 0;
PyFrameObject *py_frame = 0;
+ PyObject *exception, *value, *tb;
+
+ /* (Save and) Clear the current exception. Python functions must not be
+ called with an exception set. Calling Python functions happens when
+ the codec of the filesystem encoding is implemented in pure Python. */
+ PyErr_Fetch(&exception, &value, &tb);
py_globals = PyDict_New();
- if (!py_globals) goto bad;
+ if (!py_globals)
+ goto bad;
py_code = PyCode_NewEmpty(filename, funcname, lineno);
- if (!py_code) goto bad;
+ if (!py_code)
+ goto bad;
py_frame = PyFrame_New(
PyThreadState_Get(), /*PyThreadState *tstate,*/
py_code, /*PyCodeObject *code,*/
py_globals, /*PyObject *globals,*/
0 /*PyObject *locals*/
);
- if (!py_frame) goto bad;
+ if (!py_frame)
+ goto bad;
py_frame->f_lineno = lineno;
+
+ PyErr_Restore(exception, value, tb);
PyTraceBack_Here(py_frame);
+
+ Py_DECREF(py_globals);
+ Py_DECREF(py_code);
+ Py_DECREF(py_frame);
+ return;
+
bad:
Py_XDECREF(py_globals);
Py_XDECREF(py_code);
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index ade52fd..ead1c6f 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -261,18 +261,18 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
to a virtual address for which it does not
have the appropriate access. */
if (pr->ExceptionInformation[0] == 0)
- PyErr_Format(PyExc_WindowsError,
+ PyErr_Format(PyExc_OSError,
"exception: access violation reading %p",
pr->ExceptionInformation[1]);
else
- PyErr_Format(PyExc_WindowsError,
+ PyErr_Format(PyExc_OSError,
"exception: access violation writing %p",
pr->ExceptionInformation[1]);
break;
case EXCEPTION_BREAKPOINT:
/* A breakpoint was encountered. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: breakpoint encountered");
break;
@@ -282,14 +282,14 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
alignment. For example, 16-bit values must be
aligned on 2-byte boundaries, 32-bit values on
4-byte boundaries, and so on. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: datatype misalignment");
break;
case EXCEPTION_SINGLE_STEP:
/* A trace trap or other single-instruction mechanism
signaled that one instruction has been executed. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: single step");
break;
@@ -297,7 +297,7 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
/* The thread attempted to access an array element
that is out of bounds, and the underlying hardware
supports bounds checking. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: array bounds exceeded");
break;
@@ -306,28 +306,28 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
is denormal. A denormal value is one that is too
small to represent as a standard floating-point
value. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: floating-point operand denormal");
break;
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
/* The thread attempted to divide a floating-point
value by a floating-point divisor of zero. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: float divide by zero");
break;
case EXCEPTION_FLT_INEXACT_RESULT:
/* The result of a floating-point operation cannot be
represented exactly as a decimal fraction. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: float inexact");
break;
case EXCEPTION_FLT_INVALID_OPERATION:
/* This exception represents any floating-point
exception not included in this list. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: float invalid operation");
break;
@@ -335,21 +335,21 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
/* The exponent of a floating-point operation is
greater than the magnitude allowed by the
corresponding type. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: float overflow");
break;
case EXCEPTION_FLT_STACK_CHECK:
/* The stack overflowed or underflowed as the result
of a floating-point operation. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: stack over/underflow");
break;
case EXCEPTION_STACK_OVERFLOW:
/* The stack overflowed or underflowed as the result
of a floating-point operation. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: stack overflow");
break;
@@ -357,21 +357,21 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
/* The exponent of a floating-point operation is less
than the magnitude allowed by the corresponding
type. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: float underflow");
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
/* The thread attempted to divide an integer value by
an integer divisor of zero. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: integer divide by zero");
break;
case EXCEPTION_INT_OVERFLOW:
/* The result of an integer operation caused a carry
out of the most significant bit of the result. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: integer overflow");
break;
@@ -379,14 +379,14 @@ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
/* The thread attempted to execute an instruction
whose operation is not allowed in the current
machine mode. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: priviledged instruction");
break;
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
/* The thread attempted to continue execution after a
noncontinuable exception occurred. */
- PyErr_SetString(PyExc_WindowsError,
+ PyErr_SetString(PyExc_OSError,
"exception: nocontinuable");
break;
@@ -620,6 +620,8 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa)
assert(dict->paramfunc);
/* If it has an stgdict, it is a CDataObject */
carg = dict->paramfunc((CDataObject *)obj);
+ if (carg == NULL)
+ return -1;
pa->ffi_type = carg->pffi_type;
memcpy(&pa->value, &carg->value, sizeof(pa->value));
pa->keep = (PyObject *)carg;
@@ -1105,9 +1107,7 @@ PyObject *_ctypes_callproc(PPROC pProc,
if (argtypes && argtype_count > i) {
PyObject *v;
converter = PyTuple_GET_ITEM(argtypes, i);
- v = PyObject_CallFunctionObjArgs(converter,
- arg,
- NULL);
+ v = PyObject_CallFunctionObjArgs(converter, arg, NULL);
if (v == NULL) {
_ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1);
goto cleanup;
@@ -1272,62 +1272,6 @@ static PyObject *free_library(PyObject *self, PyObject *args)
return Py_None;
}
-/* obsolete, should be removed */
-/* Only used by sample code (in samples\Windows\COM.py) */
-static PyObject *
-call_commethod(PyObject *self, PyObject *args)
-{
- IUnknown *pIunk;
- int index;
- PyObject *arguments;
- PPROC *lpVtbl;
- PyObject *result;
- CDataObject *pcom;
- PyObject *argtypes = NULL;
-
- if (!PyArg_ParseTuple(args,
- "OiO!|O!",
- &pcom, &index,
- &PyTuple_Type, &arguments,
- &PyTuple_Type, &argtypes))
- return NULL;
-
- if (argtypes && (PyTuple_GET_SIZE(arguments) != PyTuple_GET_SIZE(argtypes))) {
- PyErr_Format(PyExc_TypeError,
- "Method takes %d arguments (%d given)",
- PyTuple_GET_SIZE(argtypes), PyTuple_GET_SIZE(arguments));
- return NULL;
- }
-
- if (!CDataObject_Check(pcom) || (pcom->b_size != sizeof(void *))) {
- PyErr_Format(PyExc_TypeError,
- "COM Pointer expected instead of %s instance",
- Py_TYPE(pcom)->tp_name);
- return NULL;
- }
-
- if ((*(void **)(pcom->b_ptr)) == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "The COM 'this' pointer is NULL");
- return NULL;
- }
-
- pIunk = (IUnknown *)(*(void **)(pcom->b_ptr));
- lpVtbl = (PPROC *)(pIunk->lpVtbl);
-
- result = _ctypes_callproc(lpVtbl[index],
- arguments,
-#ifdef MS_WIN32
- pIunk,
- NULL,
-#endif
- FUNCFLAG_HRESULT, /* flags */
- argtypes, /* self->argtypes */
- NULL, /* self->restype */
- NULL); /* checker */
- return result;
-}
-
static char copy_com_pointer_doc[] =
"CopyComPointer(src, dst) -> HRESULT value\n";
@@ -1489,9 +1433,9 @@ call_cdeclfunction(PyObject *self, PyObject *args)
NULL,
#endif
FUNCFLAG_CDECL, /* flags */
- NULL, /* self->argtypes */
- NULL, /* self->restype */
- NULL); /* checker */
+ NULL, /* self->argtypes */
+ NULL, /* self->restype */
+ NULL); /* checker */
return result;
}
@@ -1822,7 +1766,6 @@ PyMethodDef _ctypes_module_methods[] = {
{"FormatError", format_error, METH_VARARGS, format_error_doc},
{"LoadLibrary", load_library, METH_VARARGS, load_library_doc},
{"FreeLibrary", free_library, METH_VARARGS, free_library_doc},
- {"call_commethod", call_commethod, METH_VARARGS },
{"_check_HRESULT", check_hresult, METH_VARARGS},
#else
{"dlopen", py_dl_open, METH_VARARGS,
diff --git a/Modules/_ctypes/libffi_osx/ffi.c b/Modules/_ctypes/libffi_osx/ffi.c
index bf42093..96826b5 100644
--- a/Modules/_ctypes/libffi_osx/ffi.c
+++ b/Modules/_ctypes/libffi_osx/ffi.c
@@ -38,12 +38,13 @@ initialize_aggregate(
/*@out@*/ ffi_type* arg)
{
/*@-usedef@*/
+ ffi_type** ptr;
if (arg == NULL || arg->elements == NULL ||
arg->size != 0 || arg->alignment != 0)
return FFI_BAD_TYPEDEF;
- ffi_type** ptr = &(arg->elements[0]);
+ ptr = &(arg->elements[0]);
while ((*ptr) != NULL)
{
@@ -135,16 +136,16 @@ ffi_prep_cif(
/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype,
/*@dependent@*/ ffi_type** atypes)
{
+ unsigned int bytes = 0;
+ unsigned int i;
+ ffi_type** ptr;
+
if (cif == NULL)
return FFI_BAD_TYPEDEF;
if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI)
return FFI_BAD_ABI;
- unsigned int bytes = 0;
- unsigned int i;
- ffi_type** ptr;
-
cif->abi = abi;
cif->arg_types = atypes;
cif->nargs = nargs;
diff --git a/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c b/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c
index 2affb14..f2610c1 100644
--- a/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c
+++ b/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c
@@ -225,14 +225,16 @@ classify_argument(
/* Merge the fields of structure. */
for (ptr = type->elements; *ptr != NULL; ptr++)
{
+ int num, pos;
+
byte_offset = ALIGN(byte_offset, (*ptr)->alignment);
- int num = classify_argument(*ptr, subclasses, byte_offset % 8);
+ num = classify_argument(*ptr, subclasses, byte_offset % 8);
if (num == 0)
return 0;
- int pos = byte_offset / 8;
+ pos = byte_offset / 8;
for (i = 0; i < num; i++)
{
@@ -589,11 +591,12 @@ ffi_prep_closure(
void (*fun)(ffi_cif*, void*, void**, void*),
void* user_data)
{
+ volatile unsigned short* tramp;
+
if (cif->abi != FFI_UNIX64)
return FFI_BAD_ABI;
- volatile unsigned short* tramp =
- (volatile unsigned short*)&closure->tramp[0];
+ tramp = (volatile unsigned short*)&closure->tramp[0];
tramp[0] = 0xbb49; /* mov <code>, %r11 */
*(void* volatile*)&tramp[1] = ffi_closure_unix64;
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
index f560702..87b9c05 100644
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -117,7 +117,7 @@ insert_lop(PyCursesPanelObject *po)
{
list_of_panels *new;
- if ((new = (list_of_panels *)malloc(sizeof(list_of_panels))) == NULL) {
+ if ((new = (list_of_panels *)PyMem_Malloc(sizeof(list_of_panels))) == NULL) {
PyErr_NoMemory();
return -1;
}
@@ -136,7 +136,7 @@ remove_lop(PyCursesPanelObject *po)
temp = lop;
if (temp->po == po) {
lop = temp->next;
- free(temp);
+ PyMem_Free(temp);
return;
}
while (temp->next == NULL || temp->next->po != po) {
@@ -148,7 +148,7 @@ remove_lop(PyCursesPanelObject *po)
temp = temp->next;
}
n = temp->next->next;
- free(temp->next);
+ PyMem_Free(temp->next);
temp->next = n;
return;
}
@@ -513,6 +513,8 @@ PyInit__curses_panel(void)
goto fail;
import_curses();
+ if (PyErr_Occurred())
+ goto fail;
/* For exception _curses_panel.error */
_curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index f5df80c..27e5579 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -168,10 +168,6 @@ static char *screen_encoding = NULL;
"must call start_color() first"); \
return 0; }
-#ifndef MIN
-#define MIN(x,y) ((x) < (y) ? (x) : (y))
-#endif
-
/* Utility Functions */
/*
@@ -533,7 +529,7 @@ PyCursesWindow_New(WINDOW *win, const char *encoding)
wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
if (wo == NULL) return NULL;
wo->win = win;
- wo->encoding = strdup(encoding);
+ wo->encoding = _PyMem_Strdup(encoding);
if (wo->encoding == NULL) {
Py_DECREF(wo);
PyErr_NoMemory();
@@ -547,7 +543,7 @@ PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
{
if (wo->win != stdscr) delwin(wo->win);
if (wo->encoding != NULL)
- free(wo->encoding);
+ PyMem_Free(wo->encoding);
PyObject_DEL(wo);
}
@@ -1212,7 +1208,7 @@ PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
if (!PyArg_ParseTuple(args,"i;n", &n))
return NULL;
Py_BEGIN_ALLOW_THREADS
- rtn2 = wgetnstr(self->win,rtn,MIN(n, 1023));
+ rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Py_END_ALLOW_THREADS
break;
case 2:
@@ -1232,11 +1228,11 @@ PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
#ifdef STRICT_SYSV_CURSES
Py_BEGIN_ALLOW_THREADS
rtn2 = wmove(self->win,y,x)==ERR ? ERR :
- wgetnstr(self->win, rtn, MIN(n, 1023));
+ wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Py_END_ALLOW_THREADS
#else
Py_BEGIN_ALLOW_THREADS
- rtn2 = mvwgetnstr(self->win, y, x, rtn, MIN(n, 1023));
+ rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Py_END_ALLOW_THREADS
#endif
break;
@@ -1374,7 +1370,7 @@ PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
case 1:
if (!PyArg_ParseTuple(args,"i;n", &n))
return NULL;
- rtn2 = winnstr(self->win,rtn,MIN(n,1023));
+ rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
break;
case 2:
if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
@@ -1384,7 +1380,7 @@ PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
case 3:
if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
return NULL;
- rtn2 = mvwinnstr(self->win, y, x, rtn, MIN(n,1023));
+ rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
break;
default:
PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
@@ -1942,13 +1938,13 @@ PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
ascii = PyUnicode_AsASCIIString(value);
if (ascii == NULL)
return -1;
- encoding = strdup(PyBytes_AS_STRING(ascii));
+ encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Py_DECREF(ascii);
if (encoding == NULL) {
PyErr_NoMemory();
return -1;
}
- free(self->encoding);
+ PyMem_Free(self->encoding);
self->encoding = encoding;
return 0;
}
@@ -3414,7 +3410,7 @@ PyInit__curses(void)
continue;
if (strncmp(key_n,"KEY_F(",6)==0) {
char *p1, *p2;
- key_n2 = malloc(strlen(key_n)+1);
+ key_n2 = PyMem_Malloc(strlen(key_n)+1);
if (!key_n2) {
PyErr_NoMemory();
break;
@@ -3433,7 +3429,7 @@ PyInit__curses(void)
key_n2 = key_n;
SetDictInt(key_n2,key);
if (key_n2 != key_n)
- free(key_n2);
+ PyMem_Free(key_n2);
}
#endif
SetDictInt("KEY_MIN", KEY_MIN);
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index 7c7170d..91d30a0 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -140,19 +140,6 @@ divmod(int x, int y, int *r)
return quo;
}
-/* Round a double to the nearest long. |x| must be small enough to fit
- * in a C long; this is not checked.
- */
-static long
-round_to_long(double x)
-{
- if (x >= 0.0)
- x = floor(x + 0.5);
- else
- x = ceil(x - 0.5);
- return (long)x;
-}
-
/* Nearest integer to m / n for integers m and n. Half-integer results
* are rounded to even.
*/
@@ -1397,7 +1384,7 @@ cmperror(PyObject *a, PyObject *b)
*/
/* Conversion factors. */
-static PyObject *us_per_us = NULL; /* 1 */
+static PyObject *one = NULL; /* 1 */
static PyObject *us_per_ms = NULL; /* 1000 */
static PyObject *us_per_second = NULL; /* 1000000 */
static PyObject *us_per_minute = NULL; /* 1e6 * 60 as Python int */
@@ -2119,7 +2106,7 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
goto Done
if (us) {
- y = accum("microseconds", x, us, us_per_us, &leftover_us);
+ y = accum("microseconds", x, us, one, &leftover_us);
CLEANUP;
}
if (ms) {
@@ -2148,7 +2135,33 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
}
if (leftover_us) {
/* Round to nearest whole # of us, and add into x. */
- PyObject *temp = PyLong_FromLong(round_to_long(leftover_us));
+ double whole_us = round(leftover_us);
+ int x_is_odd;
+ PyObject *temp;
+
+ whole_us = round(leftover_us);
+ if (fabs(whole_us - leftover_us) == 0.5) {
+ /* We're exactly halfway between two integers. In order
+ * to do round-half-to-even, we must determine whether x
+ * is odd. Note that x is odd when it's last bit is 1. The
+ * code below uses bitwise and operation to check the last
+ * bit. */
+ temp = PyNumber_And(x, one); /* temp <- x & 1 */
+ if (temp == NULL) {
+ Py_DECREF(x);
+ goto Done;
+ }
+ x_is_odd = PyObject_IsTrue(temp);
+ Py_DECREF(temp);
+ if (x_is_odd == -1) {
+ Py_DECREF(x);
+ goto Done;
+ }
+ whole_us = 2.0 * round((leftover_us + x_is_odd) * 0.5) - x_is_odd;
+ }
+
+ temp = PyLong_FromLong(whole_us);
+
if (temp == NULL) {
Py_DECREF(x);
goto Done;
@@ -2239,22 +2252,14 @@ delta_total_seconds(PyObject *self)
{
PyObject *total_seconds;
PyObject *total_microseconds;
- PyObject *one_million;
total_microseconds = delta_to_microseconds((PyDateTime_Delta *)self);
if (total_microseconds == NULL)
return NULL;
- one_million = PyLong_FromLong(1000000L);
- if (one_million == NULL) {
- Py_DECREF(total_microseconds);
- return NULL;
- }
-
- total_seconds = PyNumber_TrueDivide(total_microseconds, one_million);
+ total_seconds = PyNumber_TrueDivide(total_microseconds, us_per_second);
Py_DECREF(total_microseconds);
- Py_DECREF(one_million);
return total_seconds;
}
@@ -4749,7 +4754,7 @@ local_timezone(PyDateTime_DateTime *utc_time)
goto error;
}
result = new_timezone(delta, nameo);
- Py_DECREF(nameo);
+ Py_XDECREF(nameo);
error:
Py_DECREF(delta);
return result;
@@ -4873,9 +4878,16 @@ datetime_timestamp(PyDateTime_DateTime *self)
time.tm_wday = -1;
time.tm_isdst = -1;
timestamp = mktime(&time);
- /* Return value of -1 does not necessarily mean an error, but tm_wday
- * cannot remain set to -1 if mktime succeeded. */
- if (timestamp == (time_t)(-1) && time.tm_wday == -1) {
+ if (timestamp == (time_t)(-1)
+#ifndef _AIX
+ /* Return value of -1 does not necessarily mean an error,
+ * but tm_wday cannot remain set to -1 if mktime succeeded. */
+ && time.tm_wday == -1
+#else
+ /* on AIX, tm_wday is always sets, even on error */
+#endif
+ )
+ {
PyErr_SetString(PyExc_OverflowError,
"timestamp out of range");
return NULL;
@@ -5299,8 +5311,8 @@ PyInit__datetime(void)
return NULL;
/* module initialization */
- PyModule_AddIntConstant(m, "MINYEAR", MINYEAR);
- PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR);
+ PyModule_AddIntMacro(m, MINYEAR);
+ PyModule_AddIntMacro(m, MAXYEAR);
Py_INCREF(&PyDateTime_DateType);
PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType);
@@ -5344,12 +5356,12 @@ PyInit__datetime(void)
assert(DI100Y == 25 * DI4Y - 1);
assert(DI100Y == days_before_year(100+1));
- us_per_us = PyLong_FromLong(1);
+ one = PyLong_FromLong(1);
us_per_ms = PyLong_FromLong(1000);
us_per_second = PyLong_FromLong(1000000);
us_per_minute = PyLong_FromLong(60000000);
seconds_per_day = PyLong_FromLong(24 * 3600);
- if (us_per_us == NULL || us_per_ms == NULL || us_per_second == NULL ||
+ if (one == NULL || us_per_ms == NULL || us_per_second == NULL ||
us_per_minute == NULL || seconds_per_day == NULL)
return NULL;
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 327b873..d899480 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -14,11 +14,7 @@
*/
#if defined(HAVE_NDBM_H)
#include <ndbm.h>
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-static char *which_dbm = "ndbm";
-#else
static char *which_dbm = "GNU gdbm"; /* EMX port of GDBM */
-#endif
#elif defined(HAVE_GDBM_NDBM_H)
#include <gdbm/ndbm.h>
static char *which_dbm = "GNU gdbm";
@@ -67,7 +63,7 @@ newdbmobject(char *file, int flags, int mode)
/* Methods */
static void
-dbm_dealloc(register dbmobject *dp)
+dbm_dealloc(dbmobject *dp)
{
if ( dp->di_dbm )
dbm_close(dp->di_dbm);
@@ -95,7 +91,7 @@ dbm_length(dbmobject *dp)
}
static PyObject *
-dbm_subscript(dbmobject *dp, register PyObject *key)
+dbm_subscript(dbmobject *dp, PyObject *key)
{
datum drec, krec;
Py_ssize_t tmp_size;
@@ -170,7 +166,7 @@ static PyMappingMethods dbm_as_mapping = {
};
static PyObject *
-dbm__close(register dbmobject *dp, PyObject *unused)
+dbm__close(dbmobject *dp, PyObject *unused)
{
if (dp->di_dbm)
dbm_close(dp->di_dbm);
@@ -180,9 +176,9 @@ dbm__close(register dbmobject *dp, PyObject *unused)
}
static PyObject *
-dbm_keys(register dbmobject *dp, PyObject *unused)
+dbm_keys(dbmobject *dp, PyObject *unused)
{
- register PyObject *v, *item;
+ PyObject *v, *item;
datum key;
int err;
@@ -253,7 +249,7 @@ static PySequenceMethods dbm_as_sequence = {
};
static PyObject *
-dbm_get(register dbmobject *dp, PyObject *args)
+dbm_get(dbmobject *dp, PyObject *args)
{
datum key, val;
PyObject *defvalue = Py_None;
@@ -276,7 +272,7 @@ dbm_get(register dbmobject *dp, PyObject *args)
}
static PyObject *
-dbm_setdefault(register dbmobject *dp, PyObject *args)
+dbm_setdefault(dbmobject *dp, PyObject *args)
{
datum key, val;
PyObject *defvalue = NULL;
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index c179e96..3c1358c 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -1,63 +1,22 @@
-/*
- * ElementTree
- * $Id: _elementtree.c 3473 2009-01-11 22:53:55Z fredrik $
- *
- * elementtree accelerator
- *
- * History:
- * 1999-06-20 fl created (as part of sgmlop)
- * 2001-05-29 fl effdom edition
- * 2003-02-27 fl elementtree edition (alpha)
- * 2004-06-03 fl updates for elementtree 1.2
- * 2005-01-05 fl major optimization effort
- * 2005-01-11 fl first public release (cElementTree 0.8)
- * 2005-01-12 fl split element object into base and extras
- * 2005-01-13 fl use tagged pointers for tail/text (cElementTree 0.9)
- * 2005-01-17 fl added treebuilder close method
- * 2005-01-17 fl fixed crash in getchildren
- * 2005-01-18 fl removed observer api, added iterparse (cElementTree 0.9.3)
- * 2005-01-23 fl revised iterparse api; added namespace event support (0.9.8)
- * 2005-01-26 fl added VERSION module property (cElementTree 1.0)
- * 2005-01-28 fl added remove method (1.0.1)
- * 2005-03-01 fl added iselement function; fixed makeelement aliasing (1.0.2)
- * 2005-03-13 fl export Comment and ProcessingInstruction/PI helpers
- * 2005-03-26 fl added Comment and PI support to XMLParser
- * 2005-03-27 fl event optimizations; complain about bogus events
- * 2005-08-08 fl fixed read error handling in parse
- * 2005-08-11 fl added runtime test for copy workaround (1.0.3)
- * 2005-12-13 fl added expat_capi support (for xml.etree) (1.0.4)
- * 2005-12-16 fl added support for non-standard encodings
- * 2006-03-08 fl fixed a couple of potential null-refs and leaks
- * 2006-03-12 fl merge in 2.5 ssize_t changes
- * 2007-08-25 fl call custom builder's close method from XMLParser
- * 2007-08-31 fl added iter, extend from ET 1.3
- * 2007-09-01 fl fixed ParseError exception, setslice source type, etc
- * 2007-09-03 fl fixed handling of negative insert indexes
- * 2007-09-04 fl added itertext from ET 1.3
- * 2007-09-06 fl added position attribute to ParseError exception
- * 2008-06-06 fl delay error reporting in iterparse (from Hrvoje Niksic)
+/*--------------------------------------------------------------------
+ * Licensed to PSF under a Contributor Agreement.
+ * See http://www.python.org/psf/license for licensing details.
*
+ * _elementtree - C accelerator for xml.etree.ElementTree
* Copyright (c) 1999-2009 by Secret Labs AB. All rights reserved.
* Copyright (c) 1999-2009 by Fredrik Lundh.
*
* info@pythonware.com
* http://www.pythonware.com
+ *--------------------------------------------------------------------
*/
-/* Licensed to PSF under a Contributor Agreement. */
-/* See http://www.python.org/psf/license for licensing details. */
-
#include "Python.h"
#include "structmember.h"
-#define VERSION "1.0.6"
-
/* -------------------------------------------------------------------- */
/* configuration */
-/* Leave defined to include the expat-based XMLParser type */
-#define USE_EXPAT
-
/* An element can hold this many children without extra memory
allocations. */
#define STATIC_CHILDREN 4
@@ -107,10 +66,51 @@ static PyTypeObject TreeBuilder_Type;
static PyTypeObject XMLParser_Type;
-/* glue functions (see the init function for details) */
-static PyObject* elementtree_parseerror_obj;
-static PyObject* elementtree_deepcopy_obj;
-static PyObject* elementpath_obj;
+/* Per-module state; PEP 3121 */
+typedef struct {
+ PyObject *parseerror_obj;
+ PyObject *deepcopy_obj;
+ PyObject *elementpath_obj;
+} elementtreestate;
+
+static struct PyModuleDef elementtreemodule;
+
+/* Given a module object (assumed to be _elementtree), get its per-module
+ * state.
+ */
+#define ET_STATE(mod) ((elementtreestate *) PyModule_GetState(mod))
+
+/* Find the module instance imported in the currently running sub-interpreter
+ * and get its state.
+ */
+#define ET_STATE_GLOBAL \
+ ((elementtreestate *) PyModule_GetState(PyState_FindModule(&elementtreemodule)))
+
+static int
+elementtree_clear(PyObject *m)
+{
+ elementtreestate *st = ET_STATE(m);
+ Py_CLEAR(st->parseerror_obj);
+ Py_CLEAR(st->deepcopy_obj);
+ Py_CLEAR(st->elementpath_obj);
+ return 0;
+}
+
+static int
+elementtree_traverse(PyObject *m, visitproc visit, void *arg)
+{
+ elementtreestate *st = ET_STATE(m);
+ Py_VISIT(st->parseerror_obj);
+ Py_VISIT(st->deepcopy_obj);
+ Py_VISIT(st->elementpath_obj);
+ return 0;
+}
+
+static void
+elementtree_free(void *m)
+{
+ elementtree_clear((PyObject *)m);
+}
/* helpers */
@@ -118,11 +118,11 @@ LOCAL(PyObject*)
deepcopy(PyObject* object, PyObject* memo)
{
/* do a deep copy of the given object */
-
PyObject* args;
PyObject* result;
+ elementtreestate *st = ET_STATE_GLOBAL;
- if (!elementtree_deepcopy_obj) {
+ if (!st->deepcopy_obj) {
PyErr_SetString(
PyExc_RuntimeError,
"deepcopy helper not found"
@@ -133,7 +133,7 @@ deepcopy(PyObject* object, PyObject* memo)
args = PyTuple_Pack(2, object, memo);
if (!args)
return NULL;
- result = PyObject_CallObject(elementtree_deepcopy_obj, args);
+ result = PyObject_CallObject(st->deepcopy_obj, args);
Py_DECREF(args);
return result;
}
@@ -217,8 +217,10 @@ LOCAL(int)
create_extra(ElementObject* self, PyObject* attrib)
{
self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));
- if (!self->extra)
+ if (!self->extra) {
+ PyErr_NoMemory();
return -1;
+ }
if (!attrib)
attrib = Py_None;
@@ -271,13 +273,6 @@ create_new_element(PyObject* tag, PyObject* attrib)
return NULL;
self->extra = NULL;
- if (attrib != Py_None && !is_empty_dict(attrib)) {
- if (create_extra(self, attrib) < 0) {
- PyObject_Del(self);
- return NULL;
- }
- }
-
Py_INCREF(tag);
self->tag = tag;
@@ -291,6 +286,14 @@ create_new_element(PyObject* tag, PyObject* attrib)
ALLOC(sizeof(ElementObject), "create element");
PyObject_GC_Track(self);
+
+ if (attrib != Py_None && !is_empty_dict(attrib)) {
+ if (create_extra(self, attrib) < 0) {
+ Py_DECREF(self);
+ return NULL;
+ }
+ }
+
return (PyObject*) self;
}
@@ -346,6 +349,7 @@ get_attrib_from_keywords(PyObject *kwds)
Py_DECREF(attrib_str);
+ /* attrib can be NULL if PyDict_New failed */
if (attrib)
if (PyDict_Update(attrib, kwds) < 0)
return NULL;
@@ -421,8 +425,10 @@ element_resize(ElementObject* self, int extra)
/* make sure self->children can hold the given number of extra
elements. set an exception and return -1 if allocation failed */
- if (!self->extra)
- create_extra(self, NULL);
+ if (!self->extra) {
+ if (create_extra(self, NULL) < 0)
+ return -1;
+ }
size = self->extra->length + extra;
@@ -574,8 +580,9 @@ subelement(PyObject *self, PyObject *args, PyObject *kwds)
}
elem = create_new_element(tag, attrib);
-
Py_DECREF(attrib);
+ if (elem == NULL)
+ return NULL;
if (element_add_subelement(parent, elem) < 0) {
Py_DECREF(elem);
@@ -1081,6 +1088,7 @@ element_find(ElementObject *self, PyObject *args, PyObject *kwds)
PyObject* tag;
PyObject* namespaces = Py_None;
static char *kwlist[] = {"path", "namespaces", 0};
+ elementtreestate *st = ET_STATE_GLOBAL;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:find", kwlist,
&tag, &namespaces))
@@ -1089,7 +1097,7 @@ element_find(ElementObject *self, PyObject *args, PyObject *kwds)
if (checkpath(tag) || namespaces != Py_None) {
_Py_IDENTIFIER(find);
return _PyObject_CallMethodId(
- elementpath_obj, &PyId_find, "OOO", self, tag, namespaces
+ st->elementpath_obj, &PyId_find, "OOO", self, tag, namespaces
);
}
@@ -1117,6 +1125,7 @@ element_findtext(ElementObject *self, PyObject *args, PyObject *kwds)
PyObject* namespaces = Py_None;
_Py_IDENTIFIER(findtext);
static char *kwlist[] = {"path", "default", "namespaces", 0};
+ elementtreestate *st = ET_STATE_GLOBAL;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:findtext", kwlist,
&tag, &default_value, &namespaces))
@@ -1124,7 +1133,7 @@ element_findtext(ElementObject *self, PyObject *args, PyObject *kwds)
if (checkpath(tag) || namespaces != Py_None)
return _PyObject_CallMethodId(
- elementpath_obj, &PyId_findtext, "OOOO", self, tag, default_value, namespaces
+ st->elementpath_obj, &PyId_findtext, "OOOO", self, tag, default_value, namespaces
);
if (!self->extra) {
@@ -1156,6 +1165,7 @@ element_findall(ElementObject *self, PyObject *args, PyObject *kwds)
PyObject* tag;
PyObject* namespaces = Py_None;
static char *kwlist[] = {"path", "namespaces", 0};
+ elementtreestate *st = ET_STATE_GLOBAL;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:findall", kwlist,
&tag, &namespaces))
@@ -1164,7 +1174,7 @@ element_findall(ElementObject *self, PyObject *args, PyObject *kwds)
if (checkpath(tag) || namespaces != Py_None) {
_Py_IDENTIFIER(findall);
return _PyObject_CallMethodId(
- elementpath_obj, &PyId_findall, "OOO", self, tag, namespaces
+ st->elementpath_obj, &PyId_findall, "OOO", self, tag, namespaces
);
}
@@ -1196,13 +1206,14 @@ element_iterfind(ElementObject *self, PyObject *args, PyObject *kwds)
PyObject* namespaces = Py_None;
_Py_IDENTIFIER(iterfind);
static char *kwlist[] = {"path", "namespaces", 0};
+ elementtreestate *st = ET_STATE_GLOBAL;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:iterfind", kwlist,
&tag, &namespaces))
return NULL;
return _PyObject_CallMethodId(
- elementpath_obj, &PyId_iterfind, "OOO", self, tag, namespaces
+ st->elementpath_obj, &PyId_iterfind, "OOO", self, tag, namespaces
);
}
@@ -1314,8 +1325,10 @@ element_insert(ElementObject* self, PyObject* args)
&Element_Type, &element))
return NULL;
- if (!self->extra)
- create_extra(self, NULL);
+ if (!self->extra) {
+ if (create_extra(self, NULL) < 0)
+ return NULL;
+ }
if (index < 0) {
index += self->extra->length;
@@ -1456,8 +1469,10 @@ element_set(ElementObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, "OO:set", &key, &value))
return NULL;
- if (!self->extra)
- create_extra(self, NULL);
+ if (!self->extra) {
+ if (create_extra(self, NULL) < 0)
+ return NULL;
+ }
attrib = element_get_attrib(self);
if (!attrib)
@@ -1572,8 +1587,10 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
PyObject* recycle = NULL;
PyObject* seq = NULL;
- if (!self->extra)
- create_extra(self, NULL);
+ if (!self->extra) {
+ if (create_extra(self, NULL) < 0)
+ return -1;
+ }
if (PySlice_GetIndicesEx(item,
self->extra->length,
@@ -1788,7 +1805,7 @@ element_getattro(ElementObject* self, PyObject* nameobj)
return res;
} else if (strcmp(name, "text") == 0) {
res = element_get_text(self);
- Py_INCREF(res);
+ Py_XINCREF(res);
return res;
}
@@ -1803,8 +1820,10 @@ element_getattro(ElementObject* self, PyObject* nameobj)
res = element_get_tail(self);
} else if (strcmp(name, "attrib") == 0) {
PyErr_Clear();
- if (!self->extra)
- create_extra(self, NULL);
+ if (!self->extra) {
+ if (create_extra(self, NULL) < 0)
+ return NULL;
+ }
res = element_get_attrib(self);
}
@@ -1821,10 +1840,10 @@ element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
char *name = "";
if (PyUnicode_Check(nameobj))
name = _PyUnicode_AsString(nameobj);
-
- if (name == NULL) {
+ if (name == NULL)
return -1;
- } else if (strcmp(name, "tag") == 0) {
+
+ if (strcmp(name, "tag") == 0) {
Py_DECREF(self->tag);
self->tag = value;
Py_INCREF(self->tag);
@@ -1837,8 +1856,10 @@ element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
self->tail = value;
Py_INCREF(self->tail);
} else if (strcmp(name, "attrib") == 0) {
- if (!self->extra)
- create_extra(self, NULL);
+ if (!self->extra) {
+ if (create_extra(self, NULL) < 0)
+ return -1;
+ }
Py_DECREF(self->extra->attrib);
self->extra->attrib = value;
Py_INCREF(self->extra->attrib);
@@ -2154,14 +2175,6 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext)
it = PyObject_GC_New(ElementIterObject, &ElementIter_Type);
if (!it)
return NULL;
- if (!(it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)))) {
- PyObject_GC_Del(it);
- return NULL;
- }
-
- it->parent_stack->parent = NULL;
- it->parent_stack->child_index = 0;
- it->parent_stack->next = NULL;
if (PyUnicode_Check(tag))
star = PyUnicode_FromString("*");
@@ -2170,17 +2183,27 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext)
if (star && PyObject_RichCompareBool(tag, star, Py_EQ) == 1)
tag = Py_None;
-
Py_XDECREF(star);
+
+ Py_INCREF(tag);
it->sought_tag = tag;
it->root_done = 0;
it->gettext = gettext;
- it->root_element = self;
-
Py_INCREF(self);
- Py_INCREF(tag);
+ it->root_element = self;
PyObject_GC_Track(it);
+
+ it->parent_stack = PyObject_Malloc(sizeof(ParentLocator));
+ if (it->parent_stack == NULL) {
+ Py_DECREF(it);
+ PyErr_NoMemory();
+ return NULL;
+ }
+ it->parent_stack->parent = NULL;
+ it->parent_stack->child_index = 0;
+ it->parent_stack->next = NULL;
+
return (PyObject *)it;
}
@@ -2373,6 +2396,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
{
PyObject* node;
PyObject* this;
+ elementtreestate *st = ET_STATE_GLOBAL;
if (self->data) {
if (self->this == self->last) {
@@ -2403,7 +2427,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
} else {
if (self->root) {
PyErr_SetString(
- elementtree_parseerror_obj,
+ st->parseerror_obj,
"multiple elements on top level"
);
goto error;
@@ -2690,10 +2714,12 @@ static PyTypeObject TreeBuilder_Type = {
/* ==================================================================== */
/* the expat interface */
-#if defined(USE_EXPAT)
-
#include "expat.h"
#include "pyexpat.h"
+
+/* The PyExpat_CAPI structure is an immutable dispatch table, so it can be
+ * cached globally without being in per-module state.
+ */
static struct PyExpat_CAPI *expat_capi;
#define EXPAT(func) (expat_capi->func)
@@ -2760,6 +2786,10 @@ makeuniversal(XMLParserObject* self, const char* string)
if (i != size) {
/* convert to universal name */
tag = PyBytes_FromStringAndSize(NULL, size+1);
+ if (tag == NULL) {
+ Py_DECREF(key);
+ return NULL;
+ }
p = PyBytes_AS_STRING(tag);
p[0] = '{';
memcpy(p+1, string, size);
@@ -2799,6 +2829,7 @@ static void
expat_set_error(enum XML_Error error_code, int line, int column, char *message)
{
PyObject *errmsg, *error, *position, *code;
+ elementtreestate *st = ET_STATE_GLOBAL;
errmsg = PyUnicode_FromFormat("%s: line %d, column %d",
message ? message : EXPAT(ErrorString)(error_code),
@@ -2806,7 +2837,7 @@ expat_set_error(enum XML_Error error_code, int line, int column, char *message)
if (errmsg == NULL)
return;
- error = PyObject_CallFunction(elementtree_parseerror_obj, "O", errmsg);
+ error = PyObject_CallFunction(st->parseerror_obj, "O", errmsg);
Py_DECREF(errmsg);
if (!error)
return;
@@ -2836,7 +2867,7 @@ expat_set_error(enum XML_Error error_code, int line, int column, char *message)
}
Py_DECREF(position);
- PyErr_SetObject(elementtree_parseerror_obj, error);
+ PyErr_SetObject(st->parseerror_obj, error);
Py_DECREF(error);
}
@@ -2854,6 +2885,9 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
if (data_len < 2 || data_in[0] != '&')
return;
+ if (PyErr_Occurred())
+ return;
+
key = PyUnicode_DecodeUTF8(data_in + 1, data_len - 2, "strict");
if (!key)
return;
@@ -2894,6 +2928,9 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
PyObject* attrib;
int ok;
+ if (PyErr_Occurred())
+ return;
+
/* tag name */
tag = makeuniversal(self, tag_in);
if (!tag)
@@ -2952,6 +2989,9 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
PyObject* data;
PyObject* res;
+ if (PyErr_Occurred())
+ return;
+
data = PyUnicode_DecodeUTF8(data_in, data_len, "strict");
if (!data)
return; /* parser will look for errors */
@@ -2975,6 +3015,9 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
PyObject* tag;
PyObject* res = NULL;
+ if (PyErr_Occurred())
+ return;
+
if (TreeBuilder_CheckExact(self->target))
/* shortcut */
/* the standard tree builder doesn't look at the end tag */
@@ -2999,6 +3042,9 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix,
PyObject* sprefix = NULL;
PyObject* suri = NULL;
+ if (PyErr_Occurred())
+ return;
+
suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict");
if (!suri)
return;
@@ -3023,6 +3069,9 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix,
static void
expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
{
+ if (PyErr_Occurred())
+ return;
+
treebuilder_handle_namespace(
(TreeBuilderObject*) self->target, 0, NULL, NULL
);
@@ -3034,6 +3083,9 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
PyObject* comment;
PyObject* res;
+ if (PyErr_Occurred())
+ return;
+
if (self->handle_comment) {
comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict");
if (comment) {
@@ -3056,6 +3108,9 @@ expat_start_doctype_handler(XMLParserObject *self,
PyObject *parser_doctype = NULL;
PyObject *res = NULL;
+ if (PyErr_Occurred())
+ return;
+
doctype_name_obj = makeuniversal(self, doctype_name);
if (!doctype_name_obj)
return;
@@ -3124,6 +3179,9 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
PyObject* data;
PyObject* res;
+ if (PyErr_Occurred())
+ return;
+
if (self->handle_pi) {
target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict");
data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict");
@@ -3296,6 +3354,7 @@ expat_parse(XMLParserObject* self, const char* data, int data_len, int final)
{
int ok;
+ assert(!PyErr_Occurred());
ok = EXPAT(Parse)(self->parser, data, data_len, final);
if (PyErr_Occurred())
@@ -3372,10 +3431,9 @@ xmlparser_feed(XMLParserObject* self, PyObject* arg)
}
static PyObject*
-xmlparser_parse(XMLParserObject* self, PyObject* args)
+xmlparser_parse_whole(XMLParserObject* self, PyObject* args)
{
- /* (internal) parse until end of input stream */
-
+ /* (internal) parse the whole input, until end of stream */
PyObject* reader;
PyObject* buffer;
PyObject* temp;
@@ -3456,14 +3514,14 @@ static PyObject*
xmlparser_setevents(XMLParserObject *self, PyObject* args)
{
/* activate element event reporting */
+ Py_ssize_t i, seqlen;
+ TreeBuilderObject *target;
- Py_ssize_t i;
- TreeBuilderObject* target;
-
- PyObject* events; /* event collector */
- PyObject* event_set = Py_None;
- if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events,
- &event_set))
+ PyObject *events_queue;
+ PyObject *events_to_report = Py_None;
+ PyObject *events_seq;
+ if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events_queue,
+ &events_to_report))
return NULL;
if (!TreeBuilder_CheckExact(self->target)) {
@@ -3477,9 +3535,9 @@ xmlparser_setevents(XMLParserObject *self, PyObject* args)
target = (TreeBuilderObject*) self->target;
- Py_INCREF(events);
+ Py_INCREF(events_queue);
Py_XDECREF(target->events);
- target->events = events;
+ target->events = events_queue;
/* clear out existing events */
Py_CLEAR(target->start_event_obj);
@@ -3487,75 +3545,71 @@ xmlparser_setevents(XMLParserObject *self, PyObject* args)
Py_CLEAR(target->start_ns_event_obj);
Py_CLEAR(target->end_ns_event_obj);
- if (event_set == Py_None) {
+ if (events_to_report == Py_None) {
/* default is "end" only */
target->end_event_obj = PyUnicode_FromString("end");
Py_RETURN_NONE;
}
- if (!PyTuple_Check(event_set)) /* FIXME: handle arbitrary sequences */
- goto error;
+ if (!(events_seq = PySequence_Fast(events_to_report,
+ "events must be a sequence"))) {
+ return NULL;
+ }
- for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) {
- PyObject* item = PyTuple_GET_ITEM(event_set, i);
- char* event;
- if (PyUnicode_Check(item)) {
- event = _PyUnicode_AsString(item);
- if (event == NULL)
- goto error;
- } else if (PyBytes_Check(item))
- event = PyBytes_AS_STRING(item);
- else {
- goto error;
+ seqlen = PySequence_Size(events_seq);
+ for (i = 0; i < seqlen; ++i) {
+ PyObject *event_name_obj = PySequence_Fast_GET_ITEM(events_seq, i);
+ char *event_name = NULL;
+ if (PyUnicode_Check(event_name_obj)) {
+ event_name = _PyUnicode_AsString(event_name_obj);
+ } else if (PyBytes_Check(event_name_obj)) {
+ event_name = PyBytes_AS_STRING(event_name_obj);
}
- if (strcmp(event, "start") == 0) {
- Py_INCREF(item);
- target->start_event_obj = item;
- } else if (strcmp(event, "end") == 0) {
- Py_INCREF(item);
+
+ if (event_name == NULL) {
+ Py_DECREF(events_seq);
+ PyErr_Format(PyExc_ValueError, "invalid events sequence");
+ return NULL;
+ } else if (strcmp(event_name, "start") == 0) {
+ Py_INCREF(event_name_obj);
+ target->start_event_obj = event_name_obj;
+ } else if (strcmp(event_name, "end") == 0) {
+ Py_INCREF(event_name_obj);
Py_XDECREF(target->end_event_obj);
- target->end_event_obj = item;
- } else if (strcmp(event, "start-ns") == 0) {
- Py_INCREF(item);
+ target->end_event_obj = event_name_obj;
+ } else if (strcmp(event_name, "start-ns") == 0) {
+ Py_INCREF(event_name_obj);
Py_XDECREF(target->start_ns_event_obj);
- target->start_ns_event_obj = item;
+ target->start_ns_event_obj = event_name_obj;
EXPAT(SetNamespaceDeclHandler)(
self->parser,
(XML_StartNamespaceDeclHandler) expat_start_ns_handler,
(XML_EndNamespaceDeclHandler) expat_end_ns_handler
);
- } else if (strcmp(event, "end-ns") == 0) {
- Py_INCREF(item);
+ } else if (strcmp(event_name, "end-ns") == 0) {
+ Py_INCREF(event_name_obj);
Py_XDECREF(target->end_ns_event_obj);
- target->end_ns_event_obj = item;
+ target->end_ns_event_obj = event_name_obj;
EXPAT(SetNamespaceDeclHandler)(
self->parser,
(XML_StartNamespaceDeclHandler) expat_start_ns_handler,
(XML_EndNamespaceDeclHandler) expat_end_ns_handler
);
} else {
- PyErr_Format(
- PyExc_ValueError,
- "unknown event '%s'", event
- );
+ Py_DECREF(events_seq);
+ PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name);
return NULL;
}
}
+ Py_DECREF(events_seq);
Py_RETURN_NONE;
-
- error:
- PyErr_SetString(
- PyExc_TypeError,
- "invalid event tuple"
- );
- return NULL;
}
static PyMethodDef xmlparser_methods[] = {
{"feed", (PyCFunction) xmlparser_feed, METH_O},
{"close", (PyCFunction) xmlparser_close, METH_VARARGS},
- {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS},
+ {"_parse_whole", (PyCFunction) xmlparser_parse_whole, METH_VARARGS},
{"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS},
{"doctype", (PyCFunction) xmlparser_doctype, METH_VARARGS},
{NULL, NULL}
@@ -3627,8 +3681,6 @@ static PyTypeObject XMLParser_Type = {
0, /* tp_free */
};
-#endif
-
/* ==================================================================== */
/* python module interface */
@@ -3638,22 +3690,29 @@ static PyMethodDef _functions[] = {
};
-static struct PyModuleDef _elementtreemodule = {
- PyModuleDef_HEAD_INIT,
- "_elementtree",
- NULL,
- -1,
- _functions,
- NULL,
- NULL,
- NULL,
- NULL
+static struct PyModuleDef elementtreemodule = {
+ PyModuleDef_HEAD_INIT,
+ "_elementtree",
+ NULL,
+ sizeof(elementtreestate),
+ _functions,
+ NULL,
+ elementtree_traverse,
+ elementtree_clear,
+ elementtree_free
};
PyMODINIT_FUNC
PyInit__elementtree(void)
{
PyObject *m, *temp;
+ elementtreestate *st;
+
+ m = PyState_FindModule(&elementtreemodule);
+ if (m) {
+ Py_INCREF(m);
+ return m;
+ }
/* Initialize object types */
if (PyType_Ready(&ElementIter_Type) < 0)
@@ -3662,21 +3721,20 @@ PyInit__elementtree(void)
return NULL;
if (PyType_Ready(&Element_Type) < 0)
return NULL;
-#if defined(USE_EXPAT)
if (PyType_Ready(&XMLParser_Type) < 0)
return NULL;
-#endif
- m = PyModule_Create(&_elementtreemodule);
+ m = PyModule_Create(&elementtreemodule);
if (!m)
return NULL;
+ st = ET_STATE(m);
if (!(temp = PyImport_ImportModule("copy")))
return NULL;
- elementtree_deepcopy_obj = PyObject_GetAttrString(temp, "deepcopy");
+ st->deepcopy_obj = PyObject_GetAttrString(temp, "deepcopy");
Py_XDECREF(temp);
- if (!(elementpath_obj = PyImport_ImportModule("xml.etree.ElementPath")))
+ if (!(st->elementpath_obj = PyImport_ImportModule("xml.etree.ElementPath")))
return NULL;
/* link against pyexpat */
@@ -3696,11 +3754,11 @@ PyInit__elementtree(void)
return NULL;
}
- elementtree_parseerror_obj = PyErr_NewException(
+ st->parseerror_obj = PyErr_NewException(
"xml.etree.ElementTree.ParseError", PyExc_SyntaxError, NULL
);
- Py_INCREF(elementtree_parseerror_obj);
- PyModule_AddObject(m, "ParseError", elementtree_parseerror_obj);
+ Py_INCREF(st->parseerror_obj);
+ PyModule_AddObject(m, "ParseError", st->parseerror_obj);
Py_INCREF((PyObject *)&Element_Type);
PyModule_AddObject(m, "Element", (PyObject *)&Element_Type);
@@ -3708,10 +3766,8 @@ PyInit__elementtree(void)
Py_INCREF((PyObject *)&TreeBuilder_Type);
PyModule_AddObject(m, "TreeBuilder", (PyObject *)&TreeBuilder_Type);
-#if defined(USE_EXPAT)
Py_INCREF((PyObject *)&XMLParser_Type);
PyModule_AddObject(m, "XMLParser", (PyObject *)&XMLParser_Type);
-#endif
return m;
}
diff --git a/Modules/_freeze_importlib.c b/Modules/_freeze_importlib.c
index 8f07a89..57b1ac0 100644
--- a/Modules/_freeze_importlib.c
+++ b/Modules/_freeze_importlib.c
@@ -17,7 +17,7 @@
of frozen modules instead, left deliberately blank so as to avoid
unintentional import of a stale version of _frozen_importlib. */
-static struct _frozen _PyImport_FrozenModules[] = {
+const static struct _frozen _PyImport_FrozenModules[] = {
{0, 0, 0} /* sentinel */
};
@@ -25,7 +25,7 @@ static struct _frozen _PyImport_FrozenModules[] = {
/* On Windows, this links with the regular pythonXY.dll, so this variable comes
from frozen.obj. In the Makefile, frozen.o is not linked into this executable,
so we define the variable here. */
-struct _frozen *PyImport_FrozenModules;
+const struct _frozen *PyImport_FrozenModules;
#endif
const char header[] = "/* Auto-generated by Modules/_freeze_importlib.c */";
@@ -106,7 +106,7 @@ main(int argc, char *argv[])
goto error;
}
fprintf(outfile, "%s\n", header);
- fprintf(outfile, "unsigned char _Py_M__importlib[] = {\n");
+ fprintf(outfile, "const unsigned char _Py_M__importlib[] = {\n");
for (n = 0; n < data_size; n += 16) {
size_t i, end = Py_MIN(n + 16, data_size);
fprintf(outfile, " ");
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index 474561b..1db021a 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -79,7 +79,7 @@ newdbmobject(char *file, int flags, int mode)
/* Methods */
static void
-dbm_dealloc(register dbmobject *dp)
+dbm_dealloc(dbmobject *dp)
{
if (dp->di_dbm)
gdbm_close(dp->di_dbm);
@@ -112,7 +112,7 @@ dbm_length(dbmobject *dp)
}
static PyObject *
-dbm_subscript(dbmobject *dp, register PyObject *key)
+dbm_subscript(dbmobject *dp, PyObject *key)
{
PyObject *v;
datum drec, krec;
@@ -232,7 +232,7 @@ PyDoc_STRVAR(dbm_close__doc__,
Closes the database.");
static PyObject *
-dbm_close(register dbmobject *dp, PyObject *unused)
+dbm_close(dbmobject *dp, PyObject *unused)
{
if (dp->di_dbm)
gdbm_close(dp->di_dbm);
@@ -247,9 +247,9 @@ PyDoc_STRVAR(dbm_keys__doc__,
Get a list of all keys in the database.");
static PyObject *
-dbm_keys(register dbmobject *dp, PyObject *unused)
+dbm_keys(dbmobject *dp, PyObject *unused)
{
- register PyObject *v, *item;
+ PyObject *v, *item;
datum key, nextkey;
int err;
@@ -328,9 +328,9 @@ hash values, and won't be sorted by the key values. This method\n\
returns the starting key.");
static PyObject *
-dbm_firstkey(register dbmobject *dp, PyObject *unused)
+dbm_firstkey(dbmobject *dp, PyObject *unused)
{
- register PyObject *v;
+ PyObject *v;
datum key;
check_dbmobject_open(dp);
@@ -358,9 +358,9 @@ to create a list in memory that contains them all:\n\
k = db.nextkey(k)");
static PyObject *
-dbm_nextkey(register dbmobject *dp, PyObject *args)
+dbm_nextkey(dbmobject *dp, PyObject *args)
{
- register PyObject *v;
+ PyObject *v;
datum key, nextkey;
if (!PyArg_ParseTuple(args, "s#:nextkey", &key.dptr, &key.dsize))
@@ -387,7 +387,7 @@ by using this reorganization; otherwise, deleted file space will be\n\
kept and reused as new (key,value) pairs are added.");
static PyObject *
-dbm_reorganize(register dbmobject *dp, PyObject *unused)
+dbm_reorganize(dbmobject *dp, PyObject *unused)
{
check_dbmobject_open(dp);
errno = 0;
@@ -408,7 +408,7 @@ When the database has been opened in fast mode, this method forces\n\
any unwritten data to be written to the disk.");
static PyObject *
-dbm_sync(register dbmobject *dp, PyObject *unused)
+dbm_sync(dbmobject *dp, PyObject *unused)
{
check_dbmobject_open(dp);
gdbm_sync(dp->di_dbm);
diff --git a/Modules/_gestalt.c b/Modules/_gestalt.c
deleted file mode 100644
index cd30683..0000000
--- a/Modules/_gestalt.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/***********************************************************
-Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
-The Netherlands.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-/* Macintosh Gestalt interface */
-
-#include "Python.h"
-
-#include <Carbon/Carbon.h>
-
-/* Convert a 4-char string object argument to an OSType value */
-static int
-convert_to_OSType(PyObject *v, OSType *pr)
-{
- uint32_t tmp;
- if (!PyUnicode_Check(v) || PyUnicode_GetLength(v) != 4) {
- PyErr_SetString(PyExc_TypeError,
- "OSType arg must be string of 4 chars");
- return 0;
- }
- memcpy((char *)&tmp, _PyUnicode_AsString(v), 4);
- *pr = (OSType)ntohl(tmp);
- return 1;
-}
-
-static PyObject *
-gestalt_gestalt(PyObject *self, PyObject *args)
-{
- OSErr iErr;
- OSType selector;
- SInt32 response;
- if (!PyArg_ParseTuple(args, "O&", convert_to_OSType, &selector))
- return NULL;
- iErr = Gestalt(selector, &response);
- if (iErr != 0) {
- PyErr_SetString(PyExc_OSError,
- "non-zero exit code!");
- return NULL;
- }
- return PyLong_FromLong(response);
-}
-
-static struct PyMethodDef gestalt_methods[] = {
- {"gestalt", gestalt_gestalt, METH_VARARGS},
- {NULL, NULL} /* Sentinel */
-};
-
-static struct PyModuleDef gestaltmodule = {
- PyModuleDef_HEAD_INIT,
- "_gestalt",
- NULL,
- -1,
- gestalt_methods,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-PyMODINIT_FUNC
-PyInit__gestalt(void)
-{
- return PyModule_Create(&gestaltmodule);
-}
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
index 3ab1c0c..c8db5ed 100644
--- a/Modules/_hashopenssl.c
+++ b/Modules/_hashopenssl.c
@@ -17,24 +17,6 @@
#include "structmember.h"
#include "hashlib.h"
-#ifdef WITH_THREAD
-#include "pythread.h"
- #define ENTER_HASHLIB(obj) \
- if ((obj)->lock) { \
- if (!PyThread_acquire_lock((obj)->lock, 0)) { \
- Py_BEGIN_ALLOW_THREADS \
- PyThread_acquire_lock((obj)->lock, 1); \
- Py_END_ALLOW_THREADS \
- } \
- }
- #define LEAVE_HASHLIB(obj) \
- if ((obj)->lock) { \
- PyThread_release_lock((obj)->lock); \
- }
-#else
- #define ENTER_HASHLIB(obj)
- #define LEAVE_HASHLIB(obj)
-#endif
/* EVP is the preferred interface to hashing in OpenSSL */
#include <openssl/evp.h>
@@ -43,10 +25,6 @@
#define MUNCH_SIZE INT_MAX
-/* TODO(gps): We should probably make this a module or EVPobject attribute
- * to allow the user to optimize based on the platform they're using. */
-#define HASHLIB_GIL_MINSIZE 2048
-
#ifndef HASH_OBJ_CONSTRUCTOR
#define HASH_OBJ_CONSTRUCTOR 0
#endif
diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c
index f377e9c..96afcdc 100644
--- a/Modules/_heapqmodule.c
+++ b/Modules/_heapqmodule.c
@@ -168,7 +168,10 @@ heappop(PyObject *self, PyObject *heap)
lastelt = PyList_GET_ITEM(heap, n-1) ;
Py_INCREF(lastelt);
- PyList_SetSlice(heap, n-1, n, NULL);
+ if (PyList_SetSlice(heap, n-1, n, NULL) < 0) {
+ Py_DECREF(lastelt);
+ return NULL;
+ }
n--;
if (!n)
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index 4a7e758..14457e8 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -533,6 +533,31 @@ _PyIO_ConvertSsize_t(PyObject *obj, void *result) {
}
+PyObject *
+_PyIO_get_locale_module(_PyIO_State *state)
+{
+ PyObject *mod;
+ if (state->locale_module != NULL) {
+ assert(PyWeakref_CheckRef(state->locale_module));
+ mod = PyWeakref_GET_OBJECT(state->locale_module);
+ if (mod != Py_None) {
+ Py_INCREF(mod);
+ return mod;
+ }
+ Py_CLEAR(state->locale_module);
+ }
+ mod = PyImport_ImportModule("locale");
+ if (mod == NULL)
+ return NULL;
+ state->locale_module = PyWeakref_NewRef(mod, NULL);
+ if (state->locale_module == NULL) {
+ Py_DECREF(mod);
+ return NULL;
+ }
+ return mod;
+}
+
+
static int
iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
_PyIO_State *state = IO_MOD_STATE(mod);
diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h
index 0fe90a3..b90a658 100644
--- a/Modules/_io/_iomodule.h
+++ b/Modules/_io/_iomodule.h
@@ -77,7 +77,7 @@ extern int _PyIO_trap_eintr(void);
long with "%lld" even when both long and long long have the same
precision. */
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
/* Windows uses long long for offsets */
typedef PY_LONG_LONG Py_off_t;
@@ -137,6 +137,8 @@ typedef struct {
#define IO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod))
#define IO_STATE IO_MOD_STATE(PyState_FindModule(&_PyIO_Module))
+extern PyObject *_PyIO_get_locale_module(_PyIO_State *);
+
extern PyObject *_PyIO_str_close;
extern PyObject *_PyIO_str_closed;
extern PyObject *_PyIO_str_decode;
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index 3afe7b1..6fe5d58 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -190,7 +190,8 @@ PyTypeObject PyBufferedIOBase_Type = {
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
+ | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
bufferediobase_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
@@ -209,6 +210,16 @@ PyTypeObject PyBufferedIOBase_Type = {
0, /* tp_init */
0, /* tp_alloc */
0, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
@@ -220,7 +231,7 @@ typedef struct {
int detached;
int readable;
int writable;
- int deallocating;
+ char finalizing;
/* True if this is a vanilla Buffered object (rather than a user derived
class) *and* the raw stream is a vanilla FileIO object. */
@@ -384,8 +395,8 @@ _enter_buffered_busy(buffered *self)
static void
buffered_dealloc(buffered *self)
{
- self->deallocating = 1;
- if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
+ self->finalizing = 1;
+ if (_PyIOBase_finalize((PyObject *) self) < 0)
return;
_PyObject_GC_UNTRACK(self);
self->ok = 0;
@@ -428,8 +439,6 @@ buffered_traverse(buffered *self, visitproc visit, void *arg)
static int
buffered_clear(buffered *self)
{
- if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
- return -1;
self->ok = 0;
Py_CLEAR(self->raw);
Py_CLEAR(self->dict);
@@ -508,7 +517,7 @@ buffered_close(buffered *self, PyObject *args)
goto end;
}
- if (self->deallocating) {
+ if (self->finalizing) {
PyObject *r = buffered_dealloc_warn(self, (PyObject *) self);
if (r)
Py_DECREF(r);
@@ -527,6 +536,11 @@ buffered_close(buffered *self, PyObject *args)
res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL);
+ if (self->buffer) {
+ PyMem_Free(self->buffer);
+ self->buffer = NULL;
+ }
+
if (exc != NULL) {
if (res != NULL) {
Py_CLEAR(res);
@@ -658,6 +672,11 @@ static void
_set_BlockingIOError(char *msg, Py_ssize_t written)
{
PyObject *err;
+#ifdef Py_DEBUG
+ /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
+ if an exception is set when it is called */
+ PyErr_Clear();
+#endif
err = PyObject_CallFunction(PyExc_BlockingIOError, "isn",
errno, msg, written);
if (err)
@@ -1739,6 +1758,7 @@ static PyMethodDef bufferedreader_methods[] = {
static PyMemberDef bufferedreader_members[] = {
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
+ {"_finalizing", T_BOOL, offsetof(buffered, finalizing), 0},
{NULL}
};
@@ -1771,7 +1791,7 @@ PyTypeObject PyBufferedReader_Type = {
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
bufferedreader_doc, /* tp_doc */
(traverseproc)buffered_traverse, /* tp_traverse */
(inquiry)buffered_clear, /* tp_clear */
@@ -1790,6 +1810,16 @@ PyTypeObject PyBufferedReader_Type = {
(initproc)bufferedreader_init, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
@@ -2120,6 +2150,7 @@ static PyMethodDef bufferedwriter_methods[] = {
static PyMemberDef bufferedwriter_members[] = {
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
+ {"_finalizing", T_BOOL, offsetof(buffered, finalizing), 0},
{NULL}
};
@@ -2152,7 +2183,7 @@ PyTypeObject PyBufferedWriter_Type = {
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
bufferedwriter_doc, /* tp_doc */
(traverseproc)buffered_traverse, /* tp_traverse */
(inquiry)buffered_clear, /* tp_clear */
@@ -2171,6 +2202,16 @@ PyTypeObject PyBufferedWriter_Type = {
(initproc)bufferedwriter_init, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
@@ -2406,7 +2447,7 @@ PyTypeObject PyBufferedRWPair_Type = {
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
bufferedrwpair_doc, /* tp_doc */
(traverseproc)bufferedrwpair_traverse, /* tp_traverse */
(inquiry)bufferedrwpair_clear, /* tp_clear */
@@ -2425,6 +2466,16 @@ PyTypeObject PyBufferedRWPair_Type = {
(initproc)bufferedrwpair_init, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
@@ -2512,6 +2563,7 @@ static PyMethodDef bufferedrandom_methods[] = {
static PyMemberDef bufferedrandom_members[] = {
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
+ {"_finalizing", T_BOOL, offsetof(buffered, finalizing), 0},
{NULL}
};
@@ -2544,7 +2596,7 @@ PyTypeObject PyBufferedRandom_Type = {
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
bufferedrandom_doc, /* tp_doc */
(traverseproc)buffered_traverse, /* tp_traverse */
(inquiry)buffered_clear, /* tp_clear */
@@ -2563,4 +2615,14 @@ PyTypeObject PyBufferedRandom_Type = {
(initproc)bufferedrandom_init, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index 2d0239e..e88ae87 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -51,7 +51,7 @@ typedef struct {
unsigned int writable : 1;
signed int seekable : 2; /* -1 means unknown */
unsigned int closefd : 1;
- unsigned int deallocating: 1;
+ char finalizing;
PyObject *weakreflist;
PyObject *dict;
} fileio;
@@ -128,7 +128,7 @@ fileio_close(fileio *self)
self->fd = -1;
Py_RETURN_NONE;
}
- if (self->deallocating) {
+ if (self->finalizing) {
PyObject *r = fileio_dealloc_warn(self, (PyObject *) self);
if (r)
Py_DECREF(r);
@@ -391,12 +391,7 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
fd_is_own = 1;
if (self->fd < 0) {
-#ifdef MS_WINDOWS
- if (widename != NULL)
- PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj);
- else
-#endif
- PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
+ PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);
goto error;
}
}
@@ -452,7 +447,7 @@ fileio_clear(fileio *self)
static void
fileio_dealloc(fileio *self)
{
- self->deallocating = 1;
+ self->finalizing = 1;
if (_PyIOBase_finalize((PyObject *) self) < 0)
return;
_PyObject_GC_UNTRACK(self);
@@ -538,7 +533,7 @@ fileio_readinto(fileio *self, PyObject *args)
len = pbuf.len;
Py_BEGIN_ALLOW_THREADS
errno = 0;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
if (len > INT_MAX)
len = INT_MAX;
n = read(self->fd, pbuf.buf, (int)len);
@@ -561,33 +556,27 @@ fileio_readinto(fileio *self, PyObject *args)
return PyLong_FromSsize_t(n);
}
+#ifndef HAVE_FSTAT
+
+static PyObject *
+fileio_readall(fileio *self)
+{
+ _Py_IDENTIFIER(readall);
+ return _PyObject_CallMethodId((PyObject*)&PyRawIOBase_Type,
+ &PyId_readall, "O", self);
+}
+
+#else
+
static size_t
-new_buffersize(fileio *self, size_t currentsize
-#ifdef HAVE_FSTAT
- , Py_off_t pos, Py_off_t end
-#endif
- )
+new_buffersize(fileio *self, size_t currentsize)
{
size_t addend;
-#ifdef HAVE_FSTAT
- if (end != (Py_off_t)-1) {
- /* Files claiming a size smaller than SMALLCHUNK may
- actually be streaming pseudo-files. In this case, we
- apply the more aggressive algorithm below.
- */
- if (end >= SMALLCHUNK && end >= pos && pos >= 0) {
- /* Add 1 so if the file were to grow we'd notice. */
- Py_off_t bufsize = currentsize + end - pos + 1;
- if (bufsize < PY_SSIZE_T_MAX)
- return (size_t)bufsize;
- else
- return PY_SSIZE_T_MAX;
- }
- }
-#endif
+
/* Expand the buffer by an amount proportional to the current size,
giving us amortized linear-time behavior. For bigger sizes, use a
less-than-double growth factor to avoid excessive allocation. */
+ assert(currentsize <= PY_SSIZE_T_MAX);
if (currentsize > 65536)
addend = currentsize >> 3;
else
@@ -601,26 +590,19 @@ new_buffersize(fileio *self, size_t currentsize
static PyObject *
fileio_readall(fileio *self)
{
-#ifdef HAVE_FSTAT
struct stat st;
Py_off_t pos, end;
-#endif
PyObject *result;
- Py_ssize_t total = 0;
+ Py_ssize_t bytes_read = 0;
Py_ssize_t n;
- size_t newsize;
+ size_t bufsize;
if (self->fd < 0)
return err_closed();
if (!_PyVerify_fd(self->fd))
return PyErr_SetFromErrno(PyExc_IOError);
- result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
- if (result == NULL)
- return NULL;
-
-#ifdef HAVE_FSTAT
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
pos = _lseeki64(self->fd, 0L, SEEK_CUR);
#else
pos = lseek(self->fd, 0L, SEEK_CUR);
@@ -629,44 +611,46 @@ fileio_readall(fileio *self)
end = st.st_size;
else
end = (Py_off_t)-1;
-#endif
+
+ if (end > 0 && end >= pos && pos >= 0 && end - pos < PY_SSIZE_T_MAX) {
+ /* This is probably a real file, so we try to allocate a
+ buffer one byte larger than the rest of the file. If the
+ calculation is right then we should get EOF without having
+ to enlarge the buffer. */
+ bufsize = (size_t)(end - pos + 1);
+ } else {
+ bufsize = SMALLCHUNK;
+ }
+
+ result = PyBytes_FromStringAndSize(NULL, bufsize);
+ if (result == NULL)
+ return NULL;
+
while (1) {
-#ifdef HAVE_FSTAT
- newsize = new_buffersize(self, total, pos, end);
-#else
- newsize = new_buffersize(self, total);
-#endif
- if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
- PyErr_SetString(PyExc_OverflowError,
- "unbounded read returned more bytes "
- "than a Python string can hold ");
- Py_DECREF(result);
- return NULL;
- }
+ if (bytes_read >= (Py_ssize_t)bufsize) {
+ bufsize = new_buffersize(self, bytes_read);
+ if (bufsize > PY_SSIZE_T_MAX || bufsize <= 0) {
+ PyErr_SetString(PyExc_OverflowError,
+ "unbounded read returned more bytes "
+ "than a Python string can hold");
+ Py_DECREF(result);
+ return NULL;
+ }
- if (PyBytes_GET_SIZE(result) < (Py_ssize_t)newsize) {
- if (_PyBytes_Resize(&result, newsize) < 0) {
- if (total == 0) {
- Py_DECREF(result);
+ if (PyBytes_GET_SIZE(result) < (Py_ssize_t)bufsize) {
+ if (_PyBytes_Resize(&result, bufsize) < 0)
return NULL;
- }
- PyErr_Clear();
- break;
}
}
Py_BEGIN_ALLOW_THREADS
errno = 0;
- n = newsize - total;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+ n = bufsize - bytes_read;
+#ifdef MS_WINDOWS
if (n > INT_MAX)
n = INT_MAX;
- n = read(self->fd,
- PyBytes_AS_STRING(result) + total,
- (int)n);
+ n = read(self->fd, PyBytes_AS_STRING(result) + bytes_read, (int)n);
#else
- n = read(self->fd,
- PyBytes_AS_STRING(result) + total,
- n);
+ n = read(self->fd, PyBytes_AS_STRING(result) + bytes_read, n);
#endif
Py_END_ALLOW_THREADS
if (n == 0)
@@ -679,7 +663,7 @@ fileio_readall(fileio *self)
}
continue;
}
- if (total > 0)
+ if (bytes_read > 0)
break;
if (errno == EAGAIN) {
Py_DECREF(result);
@@ -689,22 +673,19 @@ fileio_readall(fileio *self)
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
- total += n;
-#ifdef HAVE_FSTAT
+ bytes_read += n;
pos += n;
-#endif
}
- if (PyBytes_GET_SIZE(result) > total) {
- if (_PyBytes_Resize(&result, total) < 0) {
- /* This should never happen, but just in case */
- Py_DECREF(result);
+ if (PyBytes_GET_SIZE(result) > bytes_read) {
+ if (_PyBytes_Resize(&result, bytes_read) < 0)
return NULL;
- }
}
return result;
}
+#endif /* HAVE_FSTAT */
+
static PyObject *
fileio_read(fileio *self, PyObject *args)
{
@@ -725,7 +706,7 @@ fileio_read(fileio *self, PyObject *args)
return fileio_readall(self);
}
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
if (size > INT_MAX)
size = INT_MAX;
#endif
@@ -737,7 +718,7 @@ fileio_read(fileio *self, PyObject *args)
if (_PyVerify_fd(self->fd)) {
Py_BEGIN_ALLOW_THREADS
errno = 0;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
n = read(self->fd, ptr, (int)size);
#else
n = read(self->fd, ptr, size);
@@ -758,7 +739,7 @@ fileio_read(fileio *self, PyObject *args)
if (n != size) {
if (_PyBytes_Resize(&bytes, n) < 0) {
- Py_DECREF(bytes);
+ Py_CLEAR(bytes);
return NULL;
}
}
@@ -785,7 +766,7 @@ fileio_write(fileio *self, PyObject *args)
Py_BEGIN_ALLOW_THREADS
errno = 0;
len = pbuf.len;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
if (len > 32767 && isatty(self->fd)) {
/* Issue #11395: the Windows console returns an error (12: not
enough space error) on writing into stdout if stdout mode is
@@ -858,7 +839,7 @@ portable_lseek(int fd, PyObject *posobj, int whence)
if (_PyVerify_fd(fd)) {
Py_BEGIN_ALLOW_THREADS
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
res = _lseeki64(fd, pos, whence);
#else
res = lseek(fd, pos, whence);
@@ -1201,6 +1182,11 @@ static PyGetSetDef fileio_getsetlist[] = {
{NULL},
};
+static PyMemberDef fileio_members[] = {
+ {"_finalizing", T_BOOL, offsetof(fileio, finalizing), 0},
+ {NULL}
+};
+
PyTypeObject PyFileIO_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"_io.FileIO",
@@ -1222,7 +1208,7 @@ PyTypeObject PyFileIO_Type = {
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
fileio_doc, /* tp_doc */
(traverseproc)fileio_traverse, /* tp_traverse */
(inquiry)fileio_clear, /* tp_clear */
@@ -1231,7 +1217,7 @@ PyTypeObject PyFileIO_Type = {
0, /* tp_iter */
0, /* tp_iternext */
fileio_methods, /* tp_methods */
- 0, /* tp_members */
+ fileio_members, /* tp_members */
fileio_getsetlist, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
@@ -1242,4 +1228,13 @@ PyTypeObject PyFileIO_Type = {
PyType_GenericAlloc, /* tp_alloc */
fileio_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index e38473a..ae188dd 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -196,26 +196,24 @@ iobase_close(PyObject *self, PyObject *args)
/* Finalization and garbage collection support */
-int
-_PyIOBase_finalize(PyObject *self)
+static void
+iobase_finalize(PyObject *self)
{
PyObject *res;
- PyObject *tp, *v, *tb;
- int closed = 1;
- int is_zombie;
+ PyObject *error_type, *error_value, *error_traceback;
+ int closed;
+ _Py_IDENTIFIER(_finalizing);
+
+ /* Save the current exception, if any. */
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
- /* If _PyIOBase_finalize() is called from a destructor, we need to
- resurrect the object as calling close() can invoke arbitrary code. */
- is_zombie = (Py_REFCNT(self) == 0);
- if (is_zombie) {
- ++Py_REFCNT(self);
- }
- PyErr_Fetch(&tp, &v, &tb);
/* If `closed` doesn't exist or can't be evaluated as bool, then the
object is probably in an unusable state, so ignore. */
res = PyObject_GetAttr(self, _PyIO_str_closed);
- if (res == NULL)
+ if (res == NULL) {
PyErr_Clear();
+ closed = -1;
+ }
else {
closed = PyObject_IsTrue(res);
Py_DECREF(res);
@@ -223,6 +221,10 @@ _PyIOBase_finalize(PyObject *self)
PyErr_Clear();
}
if (closed == 0) {
+ /* Signal close() that it was called as part of the object
+ finalization process. */
+ if (_PyObject_SetAttrId(self, &PyId__finalizing, Py_True))
+ PyErr_Clear();
res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close,
NULL);
/* Silencing I/O errors is bad, but printing spurious tracebacks is
@@ -233,31 +235,25 @@ _PyIOBase_finalize(PyObject *self)
else
Py_DECREF(res);
}
- PyErr_Restore(tp, v, tb);
- if (is_zombie) {
- if (--Py_REFCNT(self) != 0) {
- /* The object lives again. The following code is taken from
- slot_tp_del in typeobject.c. */
- Py_ssize_t refcnt = Py_REFCNT(self);
- _Py_NewReference(self);
- Py_REFCNT(self) = refcnt;
- /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
- * we need to undo that. */
- _Py_DEC_REFTOTAL;
- /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
- * chain, so no more to do there.
- * If COUNT_ALLOCS, the original decref bumped tp_frees, and
- * _Py_NewReference bumped tp_allocs: both of those need to be
- * undone.
- */
-#ifdef COUNT_ALLOCS
- --Py_TYPE(self)->tp_frees;
- --Py_TYPE(self)->tp_allocs;
-#endif
- return -1;
- }
+
+ /* Restore the saved exception. */
+ PyErr_Restore(error_type, error_value, error_traceback);
+}
+
+int
+_PyIOBase_finalize(PyObject *self)
+{
+ int is_zombie;
+
+ /* If _PyIOBase_finalize() is called from a destructor, we need to
+ resurrect the object as calling close() can invoke arbitrary code. */
+ is_zombie = (Py_REFCNT(self) == 0);
+ if (is_zombie)
+ return PyObject_CallFinalizerFromDealloc(self);
+ else {
+ PyObject_CallFinalizer(self);
+ return 0;
}
- return 0;
}
static int
@@ -270,8 +266,6 @@ iobase_traverse(iobase *self, visitproc visit, void *arg)
static int
iobase_clear(iobase *self)
{
- if (_PyIOBase_finalize((PyObject *) self) < 0)
- return -1;
Py_CLEAR(self->dict);
return 0;
}
@@ -741,7 +735,7 @@ PyTypeObject PyIOBase_Type = {
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
iobase_doc, /* tp_doc */
(traverseproc)iobase_traverse, /* tp_traverse */
(inquiry)iobase_clear, /* tp_clear */
@@ -760,6 +754,16 @@ PyTypeObject PyIOBase_Type = {
0, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ (destructor)iobase_finalize, /* tp_finalize */
};
@@ -905,7 +909,7 @@ PyTypeObject PyRawIOBase_Type = {
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
rawiobase_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
@@ -924,4 +928,14 @@ PyTypeObject PyRawIOBase_Type = {
0, /* tp_init */
0, /* tp_alloc */
0, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 111cc7e..2db37d3 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -173,7 +173,8 @@ PyTypeObject PyTextIOBase_Type = {
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
+ | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
textiobase_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
@@ -192,6 +193,16 @@ PyTypeObject PyTextIOBase_Type = {
0, /* tp_init */
0, /* tp_alloc */
0, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
@@ -691,7 +702,7 @@ typedef struct
char seekable;
char has_read1;
char telling;
- char deallocating;
+ char finalizing;
/* Specialized encoding func (see below) */
encodefunc_t encodefunc;
/* Whether or not it's the start of the stream */
@@ -758,7 +769,7 @@ utf16_encode(textio *self, PyObject *text)
{
if (!self->encoding_start_of_stream) {
/* Skip the BOM and use native byte ordering */
-#if defined(WORDS_BIGENDIAN)
+#if PY_BIG_ENDIAN
return utf16be_encode(self, text);
#else
return utf16le_encode(self, text);
@@ -787,7 +798,7 @@ utf32_encode(textio *self, PyObject *text)
{
if (!self->encoding_start_of_stream) {
/* Skip the BOM and use native byte ordering */
-#if defined(WORDS_BIGENDIAN)
+#if PY_BIG_ENDIAN
return utf32be_encode(self, text);
#else
return utf32le_encode(self, text);
@@ -906,35 +917,29 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
}
}
if (encoding == NULL && self->encoding == NULL) {
- if (state->locale_module == NULL) {
- state->locale_module = PyImport_ImportModule("locale");
- if (state->locale_module == NULL)
- goto catch_ImportError;
- else
- goto use_locale;
- }
- else {
- use_locale:
- self->encoding = _PyObject_CallMethodId(
- state->locale_module, &PyId_getpreferredencoding, "O", Py_False);
- if (self->encoding == NULL) {
- catch_ImportError:
- /*
- Importing locale can raise a ImportError because of
- _functools, and locale.getpreferredencoding can raise a
- ImportError if _locale is not available. These will happen
- during module building.
- */
- if (PyErr_ExceptionMatches(PyExc_ImportError)) {
- PyErr_Clear();
- self->encoding = PyUnicode_FromString("ascii");
- }
- else
- goto error;
+ PyObject *locale_module = _PyIO_get_locale_module(state);
+ if (locale_module == NULL)
+ goto catch_ImportError;
+ self->encoding = _PyObject_CallMethodId(
+ locale_module, &PyId_getpreferredencoding, "O", Py_False);
+ Py_DECREF(locale_module);
+ if (self->encoding == NULL) {
+ catch_ImportError:
+ /*
+ Importing locale can raise a ImportError because of
+ _functools, and locale.getpreferredencoding can raise a
+ ImportError if _locale is not available. These will happen
+ during module building.
+ */
+ if (PyErr_ExceptionMatches(PyExc_ImportError)) {
+ PyErr_Clear();
+ self->encoding = PyUnicode_FromString("ascii");
}
- else if (!PyUnicode_Check(self->encoding))
- Py_CLEAR(self->encoding);
+ else
+ goto error;
}
+ else if (!PyUnicode_Check(self->encoding))
+ Py_CLEAR(self->encoding);
}
if (self->encoding != NULL) {
encoding = _PyUnicode_AsString(self->encoding);
@@ -1112,8 +1117,6 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
static int
_textiowrapper_clear(textio *self)
{
- if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
- return -1;
self->ok = 0;
Py_CLEAR(self->buffer);
Py_CLEAR(self->encoding);
@@ -1131,9 +1134,10 @@ _textiowrapper_clear(textio *self)
static void
textiowrapper_dealloc(textio *self)
{
- self->deallocating = 1;
- if (_textiowrapper_clear(self) < 0)
+ self->finalizing = 1;
+ if (_PyIOBase_finalize((PyObject *) self) < 0)
return;
+ _textiowrapper_clear(self);
_PyObject_GC_UNTRACK(self);
if (self->weakreflist != NULL)
PyObject_ClearWeakRefs((PyObject *)self);
@@ -1937,10 +1941,7 @@ typedef struct {
#define COOKIE_BUF_LEN (sizeof(Py_off_t) + 3 * sizeof(int) + sizeof(char))
-#if defined(WORDS_BIGENDIAN)
-
-# define IS_LITTLE_ENDIAN 0
-
+#if PY_BIG_ENDIAN
/* We want the least significant byte of start_pos to also be the least
significant byte of the cookie, which means that in big-endian mode we
must copy the fields in reverse order. */
@@ -1952,9 +1953,6 @@ typedef struct {
# define OFF_NEED_EOF 0
#else
-
-# define IS_LITTLE_ENDIAN 1
-
/* Little-endian mode: the least significant byte of start_pos will
naturally end up the least significant byte of the cookie. */
@@ -1975,7 +1973,7 @@ textiowrapper_parse_cookie(cookie_type *cookie, PyObject *cookieObj)
return -1;
if (_PyLong_AsByteArray(cookieLong, buffer, sizeof(buffer),
- IS_LITTLE_ENDIAN, 0) < 0) {
+ PY_LITTLE_ENDIAN, 0) < 0) {
Py_DECREF(cookieLong);
return -1;
}
@@ -2001,9 +1999,9 @@ textiowrapper_build_cookie(cookie_type *cookie)
memcpy(buffer + OFF_CHARS_TO_SKIP, &cookie->chars_to_skip, sizeof(cookie->chars_to_skip));
memcpy(buffer + OFF_NEED_EOF, &cookie->need_eof, sizeof(cookie->need_eof));
- return _PyLong_FromByteArray(buffer, sizeof(buffer), IS_LITTLE_ENDIAN, 0);
+ return _PyLong_FromByteArray(buffer, sizeof(buffer),
+ PY_LITTLE_ENDIAN, 0);
}
-#undef IS_LITTLE_ENDIAN
static int
_textiowrapper_decoder_setstate(textio *self, cookie_type *cookie)
@@ -2353,7 +2351,7 @@ textiowrapper_tell(textio *self, PyObject *args)
/* Note our initial start point. */
cookie.start_pos += skip_bytes;
- cookie.chars_to_skip = chars_to_skip;
+ cookie.chars_to_skip = Py_SAFE_DOWNCAST(chars_to_skip, Py_ssize_t, int);
if (chars_to_skip == 0)
goto finally;
@@ -2579,7 +2577,7 @@ textiowrapper_close(textio *self, PyObject *args)
}
else {
PyObject *exc = NULL, *val, *tb;
- if (self->deallocating) {
+ if (self->finalizing) {
res = _PyObject_CallMethodId(self->buffer, &PyId__dealloc_warn, "O", self);
if (res)
Py_DECREF(res);
@@ -2740,6 +2738,7 @@ static PyMemberDef textiowrapper_members[] = {
{"encoding", T_OBJECT, offsetof(textio, encoding), READONLY},
{"buffer", T_OBJECT, offsetof(textio, buffer), READONLY},
{"line_buffering", T_BOOL, offsetof(textio, line_buffering), READONLY},
+ {"_finalizing", T_BOOL, offsetof(textio, finalizing), 0},
{NULL}
};
@@ -2776,7 +2775,7 @@ PyTypeObject PyTextIOWrapper_Type = {
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
textiowrapper_doc, /* tp_doc */
(traverseproc)textiowrapper_traverse, /* tp_traverse */
(inquiry)textiowrapper_clear, /* tp_clear */
@@ -2795,4 +2794,14 @@ PyTypeObject PyTextIOWrapper_Type = {
(initproc)textiowrapper_init, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0, /* tp_weaklist */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ 0, /* tp_finalize */
};
diff --git a/Modules/_json.c b/Modules/_json.c
index db45c28..301bc87 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -2,20 +2,6 @@
#include "structmember.h"
#include "accu.h"
-#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE)
-#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
-#endif
-#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
-typedef int Py_ssize_t;
-#define PY_SSIZE_T_MAX INT_MAX
-#define PY_SSIZE_T_MIN INT_MIN
-#define PyInt_FromSsize_t PyInt_FromLong
-#define PyInt_AsSsize_t PyInt_AsLong
-#endif
-#ifndef Py_IS_FINITE
-#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
-#endif
-
#ifdef __GNUC__
#define UNUSED __attribute__((__unused__))
#else
@@ -129,33 +115,14 @@ static void
raise_errmsg(char *msg, PyObject *s, Py_ssize_t end);
static PyObject *
encoder_encode_string(PyEncoderObject *s, PyObject *obj);
-static int
-_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr);
static PyObject *
-_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr);
+encoder_encode_long(PyEncoderObject* s UNUSED, PyObject *obj);
static PyObject *
encoder_encode_float(PyEncoderObject *s, PyObject *obj);
#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"')
#define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r'))
-static int
-_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr)
-{
- /* PyObject to Py_ssize_t converter */
- *size_ptr = PyLong_AsSsize_t(o);
- if (*size_ptr == -1 && PyErr_Occurred())
- return 0;
- return 1;
-}
-
-static PyObject *
-_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr)
-{
- /* Py_ssize_t to PyObject converter */
- return PyLong_FromSsize_t(*size_ptr);
-}
-
static Py_ssize_t
ascii_escape_unichar(Py_UCS4 c, unsigned char *output, Py_ssize_t chars)
{
@@ -174,14 +141,13 @@ ascii_escape_unichar(Py_UCS4 c, unsigned char *output, Py_ssize_t chars)
default:
if (c >= 0x10000) {
/* UTF-16 surrogate pair */
- Py_UCS4 v = c - 0x10000;
- c = 0xd800 | ((v >> 10) & 0x3ff);
+ Py_UCS4 v = Py_UNICODE_HIGH_SURROGATE(c);
output[chars++] = 'u';
- output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
- output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
- output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
- output[chars++] = Py_hexdigits[(c ) & 0xf];
- c = 0xdc00 | (v & 0x3ff);
+ output[chars++] = Py_hexdigits[(v >> 12) & 0xf];
+ output[chars++] = Py_hexdigits[(v >> 8) & 0xf];
+ output[chars++] = Py_hexdigits[(v >> 4) & 0xf];
+ output[chars++] = Py_hexdigits[(v ) & 0xf];
+ c = Py_UNICODE_LOW_SURROGATE(c);
output[chars++] = '\\';
}
output[chars++] = 'u';
@@ -268,13 +234,23 @@ raise_errmsg(char *msg, PyObject *s, Py_ssize_t end)
if (errmsg_fn == NULL)
return;
}
- pymsg = PyObject_CallFunction(errmsg_fn, "(zOO&)", msg, s, _convertPyInt_FromSsize_t, &end);
+ pymsg = PyObject_CallFunction(errmsg_fn, "(zOn)", msg, s, end);
if (pymsg) {
PyErr_SetObject(PyExc_ValueError, pymsg);
Py_DECREF(pymsg);
}
}
+static void
+raise_stop_iteration(Py_ssize_t idx)
+{
+ PyObject *value = PyLong_FromSsize_t(idx);
+ if (value != NULL) {
+ PyErr_SetObject(PyExc_StopIteration, value);
+ Py_DECREF(value);
+ }
+}
+
static PyObject *
_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
/* return (rval, idx) tuple, stealing reference to rval */
@@ -344,7 +320,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
buf = PyUnicode_DATA(pystr);
kind = PyUnicode_KIND(pystr);
- if (end < 0 || len <= end) {
+ if (end < 0 || len < end) {
PyErr_SetString(PyExc_ValueError, "end is out of bounds");
goto bail;
}
@@ -433,7 +409,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
}
}
/* Surrogate pair */
- if ((c & 0xfc00) == 0xd800) {
+ if (Py_UNICODE_IS_HIGH_SURROGATE(c)) {
Py_UCS4 c2 = 0;
if (end + 6 >= len) {
raise_errmsg("Unpaired high surrogate", pystr, end - 5);
@@ -464,13 +440,13 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
goto bail;
}
}
- if ((c2 & 0xfc00) != 0xdc00) {
+ if (!Py_UNICODE_IS_LOW_SURROGATE(c2)) {
raise_errmsg("Unpaired high surrogate", pystr, end - 5);
goto bail;
}
- c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00));
+ c = Py_UNICODE_JOIN_SURROGATES(c, c2);
}
- else if ((c & 0xfc00) == 0xdc00) {
+ else if (Py_UNICODE_IS_LOW_SURROGATE(c)) {
raise_errmsg("Unpaired low surrogate", pystr, end - 5);
goto bail;
}
@@ -527,7 +503,7 @@ py_scanstring(PyObject* self UNUSED, PyObject *args)
Py_ssize_t end;
Py_ssize_t next_end = -1;
int strict = 1;
- if (!PyArg_ParseTuple(args, "OO&|i:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &strict)) {
+ if (!PyArg_ParseTuple(args, "On|i:scanstring", &pystr, &end, &strict)) {
return NULL;
}
if (PyUnicode_Check(pystr)) {
@@ -642,12 +618,12 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind,str, idx))) idx++;
/* only loop if the object is non-empty */
- if (idx <= end_idx && PyUnicode_READ(kind, str, idx) != '}') {
- while (idx <= end_idx) {
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != '}') {
+ while (1) {
PyObject *memokey;
/* read key */
- if (PyUnicode_READ(kind, str, idx) != '"') {
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != '"') {
raise_errmsg("Expecting property name enclosed in double quotes", pystr, idx);
goto bail;
}
@@ -704,11 +680,9 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* bail if the object is closed or we didn't get the , delimiter */
- if (idx > end_idx) break;
- if (PyUnicode_READ(kind, str, idx) == '}') {
+ if (idx <= end_idx && PyUnicode_READ(kind, str, idx) == '}')
break;
- }
- else if (PyUnicode_READ(kind, str, idx) != ',') {
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != ',') {
raise_errmsg("Expecting ',' delimiter", pystr, idx);
goto bail;
}
@@ -719,12 +693,6 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
}
}
- /* verify that idx < end_idx, str[idx] should be '}' */
- if (idx > end_idx || PyUnicode_READ(kind, str, idx) != '}') {
- raise_errmsg("Expecting object", pystr, end_idx);
- goto bail;
- }
-
*next_idx_ptr = idx + 1;
if (has_pairs_hook) {
@@ -776,8 +744,8 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi
while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* only loop if the array is non-empty */
- if (idx <= end_idx && PyUnicode_READ(kind, str, idx) != ']') {
- while (idx <= end_idx) {
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != ']') {
+ while (1) {
/* read any JSON term */
val = scan_once_unicode(s, pystr, idx, &next_idx);
@@ -794,11 +762,9 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi
while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* bail if the array is closed or we didn't get the , delimiter */
- if (idx > end_idx) break;
- if (PyUnicode_READ(kind, str, idx) == ']') {
+ if (idx <= end_idx && PyUnicode_READ(kind, str, idx) == ']')
break;
- }
- else if (PyUnicode_READ(kind, str, idx) != ',') {
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != ',') {
raise_errmsg("Expecting ',' delimiter", pystr, idx);
goto bail;
}
@@ -811,7 +777,7 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi
/* verify that idx < end_idx, PyUnicode_READ(kind, str, idx) should be ']' */
if (idx > end_idx || PyUnicode_READ(kind, str, idx) != ']') {
- raise_errmsg("Expecting object", pystr, end_idx);
+ raise_errmsg("Expecting value", pystr, end_idx);
goto bail;
}
*next_idx_ptr = idx + 1;
@@ -879,7 +845,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_
if (PyUnicode_READ(kind, str, idx) == '-') {
idx++;
if (idx > end_idx) {
- PyErr_SetNone(PyExc_StopIteration);
+ raise_stop_iteration(start);
return NULL;
}
}
@@ -895,7 +861,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_
}
/* no integer digits, error */
else {
- PyErr_SetNone(PyExc_StopIteration);
+ raise_stop_iteration(start);
return NULL;
}
@@ -988,7 +954,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
length = PyUnicode_GET_LENGTH(pystr);
if (idx >= length) {
- PyErr_SetNone(PyExc_StopIteration);
+ raise_stop_iteration(idx);
return NULL;
}
@@ -1090,7 +1056,7 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds)
PyScannerObject *s;
assert(PyScanner_Check(self));
s = (PyScannerObject *)self;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:scan_once", kwlist, &pystr, &idx))
return NULL;
if (PyUnicode_Check(pystr)) {
@@ -1291,8 +1257,8 @@ encoder_call(PyObject *self, PyObject *args, PyObject *kwds)
assert(PyEncoder_Check(self));
s = (PyEncoderObject *)self;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist,
- &obj, _convertPyInt_AsSsize_t, &indent_level))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:_iterencode", kwlist,
+ &obj, &indent_level))
return NULL;
if (_PyAccu_Init(&acc))
return NULL;
@@ -1338,13 +1304,45 @@ _encoded_const(PyObject *obj)
}
static PyObject *
+encoder_encode_long(PyEncoderObject* s UNUSED, PyObject *obj)
+{
+ /* Return the JSON representation of a PyLong and PyLong subclasses.
+ Calls int() on PyLong subclasses in case the str() was changed.
+ Added specifically to deal with IntEnum. See Issue18264. */
+ PyObject *encoded, *longobj;
+ if (PyLong_CheckExact(obj)) {
+ encoded = PyObject_Str(obj);
+ }
+ else {
+ longobj = PyNumber_Long(obj);
+ if (longobj == NULL) {
+ PyErr_SetString(
+ PyExc_ValueError,
+ "Unable to coerce int subclass to int"
+ );
+ return NULL;
+ }
+ encoded = PyObject_Str(longobj);
+ Py_DECREF(longobj);
+ }
+ return encoded;
+}
+
+
+static PyObject *
encoder_encode_float(PyEncoderObject *s, PyObject *obj)
{
- /* Return the JSON representation of a PyFloat */
+ /* Return the JSON representation of a PyFloat.
+ Modified to call float() on float subclasses in case the subclass
+ changes the repr. See Issue18264. */
+ PyObject *encoded, *floatobj;
double i = PyFloat_AS_DOUBLE(obj);
if (!Py_IS_FINITE(i)) {
if (!s->allow_nan) {
- PyErr_SetString(PyExc_ValueError, "Out of range float values are not JSON compliant");
+ PyErr_SetString(
+ PyExc_ValueError,
+ "Out of range float values are not JSON compliant"
+ );
return NULL;
}
if (i > 0) {
@@ -1357,8 +1355,24 @@ encoder_encode_float(PyEncoderObject *s, PyObject *obj)
return PyUnicode_FromString("NaN");
}
}
- /* Use a better float format here? */
- return PyObject_Repr(obj);
+ /* coerce float subclasses to float (primarily for Enum) */
+ if (PyFloat_CheckExact(obj)) {
+ /* Use a better float format here? */
+ encoded = PyObject_Repr(obj);
+ }
+ else {
+ floatobj = PyNumber_Float(obj);
+ if (floatobj == NULL) {
+ PyErr_SetString(
+ PyExc_ValueError,
+ "Unable to coerce float subclass to float"
+ );
+ return NULL;
+ }
+ encoded = PyObject_Repr(floatobj);
+ Py_DECREF(floatobj);
+ }
+ return encoded;
}
static PyObject *
@@ -1402,7 +1416,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc,
return _steal_accumulate(acc, encoded);
}
else if (PyLong_Check(obj)) {
- PyObject *encoded = PyObject_Str(obj);
+ PyObject *encoded = encoder_encode_long(s, obj);
if (encoded == NULL)
return -1;
return _steal_accumulate(acc, encoded);
@@ -1587,9 +1601,10 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc,
goto bail;
}
else if (PyLong_Check(key)) {
- kstr = PyObject_Str(key);
- if (kstr == NULL)
+ kstr = encoder_encode_long(s, key);
+ if (kstr == NULL) {
goto bail;
+ }
}
else if (skipkeys) {
Py_DECREF(item);
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index cc688ba..b196749 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -147,26 +147,32 @@ PyLocale_localeconv(PyObject* self)
/* hopefully, the localeconv result survives the C library calls
involved herein */
+#define RESULT(key, obj)\
+ do { \
+ if (obj == NULL) \
+ goto failed; \
+ if (PyDict_SetItemString(result, key, obj) < 0) \
+ goto failed; \
+ Py_DECREF(obj); \
+ } while (0)
+
#define RESULT_STRING(s)\
- x = PyUnicode_DecodeLocale(l->s, NULL); \
- if (!x) goto failed;\
- PyDict_SetItemString(result, #s, x);\
- Py_XDECREF(x)
+ do { \
+ x = PyUnicode_DecodeLocale(l->s, NULL); \
+ RESULT(#s, x); \
+ } while (0)
#define RESULT_INT(i)\
- x = PyLong_FromLong(l->i);\
- if (!x) goto failed;\
- PyDict_SetItemString(result, #i, x);\
- Py_XDECREF(x)
+ do { \
+ x = PyLong_FromLong(l->i); \
+ RESULT(#i, x); \
+ } while (0)
/* Numeric information */
RESULT_STRING(decimal_point);
RESULT_STRING(thousands_sep);
x = copy_grouping(l->grouping);
- if (!x)
- goto failed;
- PyDict_SetItemString(result, "grouping", x);
- Py_XDECREF(x);
+ RESULT("grouping", x);
/* Monetary information */
RESULT_STRING(int_curr_symbol);
@@ -174,10 +180,8 @@ PyLocale_localeconv(PyObject* self)
RESULT_STRING(mon_decimal_point);
RESULT_STRING(mon_thousands_sep);
x = copy_grouping(l->mon_grouping);
- if (!x)
- goto failed;
- PyDict_SetItemString(result, "mon_grouping", x);
- Py_XDECREF(x);
+ RESULT("mon_grouping", x);
+
RESULT_STRING(positive_sign);
RESULT_STRING(negative_sign);
RESULT_INT(int_frac_digits);
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
index b0a226b..8947889 100644
--- a/Modules/_lsprof.c
+++ b/Modules/_lsprof.c
@@ -36,12 +36,8 @@ hpTimerUnit(void)
#error "This module requires gettimeofday() on non-Windows platforms!"
#endif
-#if (defined(PYOS_OS2) && defined(PYCC_GCC))
-#include <sys/time.h>
-#else
#include <sys/resource.h>
#include <sys/times.h>
-#endif
static PY_LONG_LONG
hpTimer(void)
@@ -227,7 +223,7 @@ static ProfilerEntry*
newProfilerEntry(ProfilerObject *pObj, void *key, PyObject *userObj)
{
ProfilerEntry *self;
- self = (ProfilerEntry*) malloc(sizeof(ProfilerEntry));
+ self = (ProfilerEntry*) PyMem_Malloc(sizeof(ProfilerEntry));
if (self == NULL) {
pObj->flags |= POF_NOMEMORY;
return NULL;
@@ -235,7 +231,7 @@ newProfilerEntry(ProfilerObject *pObj, void *key, PyObject *userObj)
userObj = normalizeUserObj(userObj);
if (userObj == NULL) {
PyErr_Clear();
- free(self);
+ PyMem_Free(self);
pObj->flags |= POF_NOMEMORY;
return NULL;
}
@@ -268,7 +264,7 @@ static ProfilerSubEntry *
newSubEntry(ProfilerObject *pObj, ProfilerEntry *caller, ProfilerEntry* entry)
{
ProfilerSubEntry *self;
- self = (ProfilerSubEntry*) malloc(sizeof(ProfilerSubEntry));
+ self = (ProfilerSubEntry*) PyMem_Malloc(sizeof(ProfilerSubEntry));
if (self == NULL) {
pObj->flags |= POF_NOMEMORY;
return NULL;
@@ -286,7 +282,7 @@ newSubEntry(ProfilerObject *pObj, ProfilerEntry *caller, ProfilerEntry* entry)
static int freeSubEntry(rotating_node_t *header, void *arg)
{
ProfilerSubEntry *subentry = (ProfilerSubEntry*) header;
- free(subentry);
+ PyMem_Free(subentry);
return 0;
}
@@ -295,7 +291,7 @@ static int freeEntry(rotating_node_t *header, void *arg)
ProfilerEntry *entry = (ProfilerEntry*) header;
RotatingTree_Enum(entry->calls, freeSubEntry, NULL);
Py_DECREF(entry->userObj);
- free(entry);
+ PyMem_Free(entry);
return 0;
}
@@ -305,13 +301,13 @@ static void clearEntries(ProfilerObject *pObj)
pObj->profilerEntries = EMPTY_ROTATING_TREE;
/* release the memory hold by the ProfilerContexts */
if (pObj->currentProfilerContext) {
- free(pObj->currentProfilerContext);
+ PyMem_Free(pObj->currentProfilerContext);
pObj->currentProfilerContext = NULL;
}
while (pObj->freelistProfilerContext) {
ProfilerContext *c = pObj->freelistProfilerContext;
pObj->freelistProfilerContext = c->previous;
- free(c);
+ PyMem_Free(c);
}
pObj->freelistProfilerContext = NULL;
}
@@ -397,7 +393,7 @@ ptrace_enter_call(PyObject *self, void *key, PyObject *userObj)
else {
/* free list exhausted, allocate a new one */
pContext = (ProfilerContext*)
- malloc(sizeof(ProfilerContext));
+ PyMem_Malloc(sizeof(ProfilerContext));
if (pContext == NULL) {
pObj->flags |= POF_NOMEMORY;
goto restorePyerr;
@@ -716,7 +712,7 @@ flush_unmatched(ProfilerObject *pObj)
else
pObj->currentProfilerContext = pContext->previous;
if (pContext)
- free(pContext);
+ PyMem_Free(pContext);
}
}
@@ -888,10 +884,12 @@ PyInit__lsprof(void)
PyDict_SetItemString(d, "Profiler", (PyObject *)&PyProfiler_Type);
if (!initialized) {
- PyStructSequence_InitType(&StatsEntryType,
- &profiler_entry_desc);
- PyStructSequence_InitType(&StatsSubEntryType,
- &profiler_subentry_desc);
+ if (PyStructSequence_InitType2(&StatsEntryType,
+ &profiler_entry_desc) < 0)
+ return NULL;
+ if (PyStructSequence_InitType2(&StatsSubEntryType,
+ &profiler_subentry_desc) < 0)
+ return NULL;
}
Py_INCREF((PyObject*) &StatsEntryType);
Py_INCREF((PyObject*) &StatsSubEntryType);
diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
index b482a77..5d610bf 100644
--- a/Modules/_lzmamodule.c
+++ b/Modules/_lzmamodule.c
@@ -51,6 +51,7 @@ enum {
typedef struct {
PyObject_HEAD
+ lzma_allocator alloc;
lzma_stream lzs;
int flushed;
#ifdef WITH_THREAD
@@ -60,6 +61,7 @@ typedef struct {
typedef struct {
PyObject_HEAD
+ lzma_allocator alloc;
lzma_stream lzs;
int check;
char eof;
@@ -117,6 +119,22 @@ catch_lzma_error(lzma_ret lzret)
}
}
+static void*
+PyLzma_Malloc(void *opaque, size_t items, size_t size)
+{
+ if (items > (size_t)PY_SSIZE_T_MAX / size)
+ return NULL;
+ /* PyMem_Malloc() cannot be used:
+ the GIL is not held when lzma_code() is called */
+ return PyMem_RawMalloc(items * size);
+}
+
+static void
+PyLzma_Free(void *opaque, void *ptr)
+{
+ PyMem_RawFree(ptr);
+}
+
#if BUFSIZ < 8192
#define INITIAL_BUFFER_SIZE 8192
#else
@@ -656,6 +674,11 @@ Compressor_init(Compressor *self, PyObject *args, PyObject *kwargs)
if (!uint32_converter(preset_obj, &preset))
return -1;
+ self->alloc.opaque = NULL;
+ self->alloc.alloc = PyLzma_Malloc;
+ self->alloc.free = PyLzma_Free;
+ self->lzs.allocator = &self->alloc;
+
#ifdef WITH_THREAD
self->lock = PyThread_allocate_lock();
if (self->lock == NULL) {
@@ -922,6 +945,11 @@ Decompressor_init(Decompressor *self, PyObject *args, PyObject *kwargs)
return -1;
}
+ self->alloc.opaque = NULL;
+ self->alloc.alloc = PyLzma_Malloc;
+ self->alloc.free = PyLzma_Free;
+ self->lzs.allocator = &self->alloc;
+
#ifdef WITH_THREAD
self->lock = PyThread_allocate_lock();
if (self->lock == NULL) {
diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c
index 9460c89..30cb5eb 100644
--- a/Modules/_multiprocessing/multiprocessing.c
+++ b/Modules/_multiprocessing/multiprocessing.c
@@ -10,25 +10,23 @@
#include "multiprocessing.h"
-PyObject *ProcessError, *BufferTooShort;
-
/*
* Function which raises exceptions based on error codes
*/
PyObject *
-mp_SetError(PyObject *Type, int num)
+_PyMp_SetError(PyObject *Type, int num)
{
switch (num) {
#ifdef MS_WINDOWS
case MP_STANDARD_ERROR:
if (Type == NULL)
- Type = PyExc_WindowsError;
+ Type = PyExc_OSError;
PyErr_SetExcFromWindowsErr(Type, 0);
break;
case MP_SOCKET_ERROR:
if (Type == NULL)
- Type = PyExc_WindowsError;
+ Type = PyExc_OSError;
PyErr_SetExcFromWindowsErr(Type, WSAGetLastError());
break;
#else /* !MS_WINDOWS */
@@ -128,6 +126,7 @@ static PyMethodDef module_methods[] = {
{"recv", multiprocessing_recv, METH_VARARGS, ""},
{"send", multiprocessing_send, METH_VARARGS, ""},
#endif
+ {"sem_unlink", _PyMp_sem_unlink, METH_VARARGS, ""},
{NULL}
};
@@ -159,19 +158,12 @@ PyInit__multiprocessing(void)
if (!module)
return NULL;
- /* Get copy of BufferTooShort */
- temp = PyImport_ImportModule("multiprocessing");
- if (!temp)
- return NULL;
- BufferTooShort = PyObject_GetAttrString(temp, "BufferTooShort");
- Py_XDECREF(temp);
-
#if defined(MS_WINDOWS) || \
(defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED))
- /* Add SemLock type to module */
- if (PyType_Ready(&SemLockType) < 0)
+ /* Add _PyMp_SemLock type to module */
+ if (PyType_Ready(&_PyMp_SemLockType) < 0)
return NULL;
- Py_INCREF(&SemLockType);
+ Py_INCREF(&_PyMp_SemLockType);
{
PyObject *py_sem_value_max;
/* Some systems define SEM_VALUE_MAX as an unsigned value that
@@ -182,10 +174,10 @@ PyInit__multiprocessing(void)
py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX);
if (py_sem_value_max == NULL)
return NULL;
- PyDict_SetItemString(SemLockType.tp_dict, "SEM_VALUE_MAX",
+ PyDict_SetItemString(_PyMp_SemLockType.tp_dict, "SEM_VALUE_MAX",
py_sem_value_max);
}
- PyModule_AddObject(module, "SemLock", (PyObject*)&SemLockType);
+ PyModule_AddObject(module, "SemLock", (PyObject*)&_PyMp_SemLockType);
#endif
/* Add configuration macros */
diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h
index e3de9ba..9aeea8d 100644
--- a/Modules/_multiprocessing/multiprocessing.h
+++ b/Modules/_multiprocessing/multiprocessing.h
@@ -91,23 +91,13 @@
#define MP_SOCKET_ERROR (-1002)
#define MP_EXCEPTION_HAS_BEEN_SET (-1003)
-PyObject *mp_SetError(PyObject *Type, int num);
+PyObject *_PyMp_SetError(PyObject *Type, int num);
/*
* Externs - not all will really exist on all platforms
*/
-extern PyObject *BufferTooShort;
-extern PyTypeObject SemLockType;
-extern PyTypeObject PipeConnectionType;
-
-/*
- * Miscellaneous
- */
-
-#ifndef MIN
-# define MIN(x, y) ((x) < (y) ? x : y)
-# define MAX(x, y) ((x) > (y) ? x : y)
-#endif
+extern PyTypeObject _PyMp_SemLockType;
+extern PyObject *_PyMp_sem_unlink(PyObject *ignore, PyObject *args);
#endif /* MULTIPROCESSING_H */
diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c
index 2c2b020..de85a90 100644
--- a/Modules/_multiprocessing/semaphore.c
+++ b/Modules/_multiprocessing/semaphore.c
@@ -18,6 +18,7 @@ typedef struct {
int count;
int maxvalue;
int kind;
+ char *name;
} SemLockObject;
#define ISMINE(o) (o->count > 0 && PyThread_get_thread_ident() == o->last_tid)
@@ -43,7 +44,7 @@ _GetSemaphoreValue(HANDLE handle, long *value)
{
long previous;
- switch (WaitForSingleObject(handle, 0)) {
+ switch (WaitForSingleObjectEx(handle, 0, FALSE)) {
case WAIT_OBJECT_0:
if (!ReleaseSemaphore(handle, 1, &previous))
return MP_STANDARD_ERROR;
@@ -99,7 +100,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
}
/* check whether we can acquire without releasing the GIL and blocking */
- if (WaitForSingleObject(self->handle, 0) == WAIT_OBJECT_0) {
+ if (WaitForSingleObjectEx(self->handle, 0, FALSE) == WAIT_OBJECT_0) {
self->last_tid = GetCurrentThreadId();
++self->count;
Py_RETURN_TRUE;
@@ -118,7 +119,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
Py_BEGIN_ALLOW_THREADS
if (sigint_event != NULL)
ResetEvent(sigint_event);
- res = WaitForMultipleObjects(nhandles, handles, FALSE, full_msecs);
+ res = WaitForMultipleObjectsEx(nhandles, handles, FALSE, full_msecs, FALSE);
Py_END_ALLOW_THREADS
/* handle result */
@@ -200,7 +201,7 @@ semlock_release(SemLockObject *self, PyObject *args)
#ifndef HAVE_SEM_TIMEDWAIT
# define sem_timedwait(sem,deadline) sem_timedwait_save(sem,deadline,_save)
-int
+static int
sem_timedwait_save(sem_t *sem, struct timespec *deadline, PyThreadState *_save)
{
int res;
@@ -397,7 +398,8 @@ semlock_release(SemLockObject *self, PyObject *args)
*/
static PyObject *
-newsemlockobject(PyTypeObject *type, SEM_HANDLE handle, int kind, int maxvalue)
+newsemlockobject(PyTypeObject *type, SEM_HANDLE handle, int kind, int maxvalue,
+ char *name)
{
SemLockObject *self;
@@ -409,21 +411,22 @@ newsemlockobject(PyTypeObject *type, SEM_HANDLE handle, int kind, int maxvalue)
self->count = 0;
self->last_tid = 0;
self->maxvalue = maxvalue;
+ self->name = name;
return (PyObject*)self;
}
static PyObject *
semlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- char buffer[256];
SEM_HANDLE handle = SEM_FAILED;
- int kind, maxvalue, value;
+ int kind, maxvalue, value, unlink;
PyObject *result;
- static char *kwlist[] = {"kind", "value", "maxvalue", NULL};
- static int counter = 0;
+ char *name, *name_copy = NULL;
+ static char *kwlist[] = {"kind", "value", "maxvalue", "name", "unlink",
+ NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "iii", kwlist,
- &kind, &value, &maxvalue))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "iiisi", kwlist,
+ &kind, &value, &maxvalue, &name, &unlink))
return NULL;
if (kind != RECURSIVE_MUTEX && kind != SEMAPHORE) {
@@ -431,18 +434,23 @@ semlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
- PyOS_snprintf(buffer, sizeof(buffer), "/mp%ld-%d", (long)getpid(), counter++);
+ if (!unlink) {
+ name_copy = PyMem_Malloc(strlen(name) + 1);
+ if (name_copy == NULL)
+ goto failure;
+ strcpy(name_copy, name);
+ }
SEM_CLEAR_ERROR();
- handle = SEM_CREATE(buffer, value, maxvalue);
+ handle = SEM_CREATE(name, value, maxvalue);
/* On Windows we should fail if GetLastError()==ERROR_ALREADY_EXISTS */
if (handle == SEM_FAILED || SEM_GET_LAST_ERROR() != 0)
goto failure;
- if (SEM_UNLINK(buffer) < 0)
+ if (unlink && SEM_UNLINK(name) < 0)
goto failure;
- result = newsemlockobject(type, handle, kind, maxvalue);
+ result = newsemlockobject(type, handle, kind, maxvalue, name_copy);
if (!result)
goto failure;
@@ -451,7 +459,8 @@ semlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
failure:
if (handle != SEM_FAILED)
SEM_CLOSE(handle);
- mp_SetError(NULL, MP_STANDARD_ERROR);
+ PyMem_Free(name_copy);
+ _PyMp_SetError(NULL, MP_STANDARD_ERROR);
return NULL;
}
@@ -460,12 +469,30 @@ semlock_rebuild(PyTypeObject *type, PyObject *args)
{
SEM_HANDLE handle;
int kind, maxvalue;
+ char *name, *name_copy = NULL;
- if (!PyArg_ParseTuple(args, F_SEM_HANDLE "ii",
- &handle, &kind, &maxvalue))
+ if (!PyArg_ParseTuple(args, F_SEM_HANDLE "iiz",
+ &handle, &kind, &maxvalue, &name))
return NULL;
- return newsemlockobject(type, handle, kind, maxvalue);
+ if (name != NULL) {
+ name_copy = PyMem_Malloc(strlen(name) + 1);
+ if (name_copy == NULL)
+ return PyErr_NoMemory();
+ strcpy(name_copy, name);
+ }
+
+#ifndef MS_WINDOWS
+ if (name != NULL) {
+ handle = sem_open(name, 0);
+ if (handle == SEM_FAILED) {
+ PyMem_Free(name_copy);
+ return PyErr_SetFromErrno(PyExc_OSError);
+ }
+ }
+#endif
+
+ return newsemlockobject(type, handle, kind, maxvalue, name_copy);
}
static void
@@ -473,6 +500,7 @@ semlock_dealloc(SemLockObject* self)
{
if (self->handle != SEM_FAILED)
SEM_CLOSE(self->handle);
+ PyMem_Free(self->name);
PyObject_Del(self);
}
@@ -498,7 +526,7 @@ semlock_getvalue(SemLockObject *self)
#else
int sval;
if (SEM_GETVALUE(self->handle, &sval) < 0)
- return mp_SetError(NULL, MP_STANDARD_ERROR);
+ return _PyMp_SetError(NULL, MP_STANDARD_ERROR);
/* some posix implementations use negative numbers to indicate
the number of waiting threads */
if (sval < 0)
@@ -514,16 +542,16 @@ semlock_iszero(SemLockObject *self)
if (sem_trywait(self->handle) < 0) {
if (errno == EAGAIN)
Py_RETURN_TRUE;
- return mp_SetError(NULL, MP_STANDARD_ERROR);
+ return _PyMp_SetError(NULL, MP_STANDARD_ERROR);
} else {
if (sem_post(self->handle) < 0)
- return mp_SetError(NULL, MP_STANDARD_ERROR);
+ return _PyMp_SetError(NULL, MP_STANDARD_ERROR);
Py_RETURN_FALSE;
}
#else
int sval;
if (SEM_GETVALUE(self->handle, &sval) < 0)
- return mp_SetError(NULL, MP_STANDARD_ERROR);
+ return _PyMp_SetError(NULL, MP_STANDARD_ERROR);
return PyBool_FromLong((long)sval == 0);
#endif
}
@@ -574,6 +602,8 @@ static PyMemberDef semlock_members[] = {
""},
{"maxvalue", T_INT, offsetof(SemLockObject, maxvalue), READONLY,
""},
+ {"name", T_STRING, offsetof(SemLockObject, name), READONLY,
+ ""},
{NULL}
};
@@ -581,7 +611,7 @@ static PyMemberDef semlock_members[] = {
* Semaphore type
*/
-PyTypeObject SemLockType = {
+PyTypeObject _PyMp_SemLockType = {
PyVarObject_HEAD_INIT(NULL, 0)
/* tp_name */ "_multiprocessing.SemLock",
/* tp_basicsize */ sizeof(SemLockObject),
@@ -621,3 +651,23 @@ PyTypeObject SemLockType = {
/* tp_alloc */ 0,
/* tp_new */ semlock_new,
};
+
+/*
+ * Function to unlink semaphore names
+ */
+
+PyObject *
+_PyMp_sem_unlink(PyObject *ignore, PyObject *args)
+{
+ char *name;
+
+ if (!PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ if (SEM_UNLINK(name) < 0) {
+ _PyMp_SetError(NULL, MP_STANDARD_ERROR);
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
diff --git a/Modules/operator.c b/Modules/_operator.c
index 5156b6b..e8bef04 100644
--- a/Modules/operator.c
+++ b/Modules/_operator.c
@@ -208,6 +208,31 @@ _tscmp(const unsigned char *a, const unsigned char *b,
return (result == 0);
}
+PyDoc_STRVAR(length_hint__doc__,
+"length_hint(obj, default=0) -> int\n"
+"Return an estimate of the number of items in obj.\n"
+"This is useful for presizing containers when building from an\n"
+"iterable.\n"
+"\n"
+"If the object supports len(), the result will be\n"
+"exact. Otherwise, it may over- or under-estimate by an\n"
+"arbitrary amount. The result will be an integer >= 0.");
+
+static PyObject *length_hint(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ Py_ssize_t defaultvalue = 0, res;
+ if (!PyArg_ParseTuple(args, "O|n:length_hint", &obj, &defaultvalue)) {
+ return NULL;
+ }
+ res = PyObject_LengthHint(obj, defaultvalue);
+ if (res == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ return PyLong_FromSsize_t(res);
+}
+
+
PyDoc_STRVAR(compare_digest__doc__,
"compare_digest(a, b) -> bool\n"
"\n"
@@ -297,17 +322,15 @@ compare_digest(PyObject *self, PyObject *args)
/* operator methods **********************************************************/
#define spam1(OP,DOC) {#OP, OP, METH_VARARGS, PyDoc_STR(DOC)},
-#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, \
- {#ALTOP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)},
+#define spam2(OP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)},
#define spam1o(OP,DOC) {#OP, OP, METH_O, PyDoc_STR(DOC)},
-#define spam2o(OP,ALTOP,DOC) {#OP, op_##OP, METH_O, PyDoc_STR(DOC)}, \
- {#ALTOP, op_##OP, METH_O, PyDoc_STR(DOC)},
+#define spam2o(OP,DOC) {#OP, op_##OP, METH_O, PyDoc_STR(DOC)},
static struct PyMethodDef operator_methods[] = {
spam1o(truth,
"truth(a) -- Return True if a is true, False otherwise.")
-spam2(contains,__contains__,
+spam2(contains,
"contains(a, b) -- Same as b in a (note reversed operands).")
spam1(indexOf,
"indexOf(a, b) -- Return the first index of b in a.")
@@ -316,56 +339,58 @@ spam1(countOf,
spam1(is_, "is_(a, b) -- Same as a is b.")
spam1(is_not, "is_not(a, b) -- Same as a is not b.")
-spam2o(index, __index__, "index(a) -- Same as a.__index__()")
-spam2(add,__add__, "add(a, b) -- Same as a + b.")
-spam2(sub,__sub__, "sub(a, b) -- Same as a - b.")
-spam2(mul,__mul__, "mul(a, b) -- Same as a * b.")
-spam2(floordiv,__floordiv__, "floordiv(a, b) -- Same as a // b.")
-spam2(truediv,__truediv__, "truediv(a, b) -- Same as a / b.")
-spam2(mod,__mod__, "mod(a, b) -- Same as a % b.")
-spam2o(neg,__neg__, "neg(a) -- Same as -a.")
-spam2o(pos,__pos__, "pos(a) -- Same as +a.")
-spam2o(abs,__abs__, "abs(a) -- Same as abs(a).")
-spam2o(inv,__inv__, "inv(a) -- Same as ~a.")
-spam2o(invert,__invert__, "invert(a) -- Same as ~a.")
-spam2(lshift,__lshift__, "lshift(a, b) -- Same as a << b.")
-spam2(rshift,__rshift__, "rshift(a, b) -- Same as a >> b.")
-spam2o(not_,__not__, "not_(a) -- Same as not a.")
-spam2(and_,__and__, "and_(a, b) -- Same as a & b.")
-spam2(xor,__xor__, "xor(a, b) -- Same as a ^ b.")
-spam2(or_,__or__, "or_(a, b) -- Same as a | b.")
-spam2(iadd,__iadd__, "a = iadd(a, b) -- Same as a += b.")
-spam2(isub,__isub__, "a = isub(a, b) -- Same as a -= b.")
-spam2(imul,__imul__, "a = imul(a, b) -- Same as a *= b.")
-spam2(ifloordiv,__ifloordiv__, "a = ifloordiv(a, b) -- Same as a //= b.")
-spam2(itruediv,__itruediv__, "a = itruediv(a, b) -- Same as a /= b")
-spam2(imod,__imod__, "a = imod(a, b) -- Same as a %= b.")
-spam2(ilshift,__ilshift__, "a = ilshift(a, b) -- Same as a <<= b.")
-spam2(irshift,__irshift__, "a = irshift(a, b) -- Same as a >>= b.")
-spam2(iand,__iand__, "a = iand(a, b) -- Same as a &= b.")
-spam2(ixor,__ixor__, "a = ixor(a, b) -- Same as a ^= b.")
-spam2(ior,__ior__, "a = ior(a, b) -- Same as a |= b.")
-spam2(concat,__concat__,
+spam2o(index, "index(a) -- Same as a.__index__()")
+spam2(add, "add(a, b) -- Same as a + b.")
+spam2(sub, "sub(a, b) -- Same as a - b.")
+spam2(mul, "mul(a, b) -- Same as a * b.")
+spam2(floordiv, "floordiv(a, b) -- Same as a // b.")
+spam2(truediv, "truediv(a, b) -- Same as a / b.")
+spam2(mod, "mod(a, b) -- Same as a % b.")
+spam2o(neg, "neg(a) -- Same as -a.")
+spam2o(pos, "pos(a) -- Same as +a.")
+spam2o(abs, "abs(a) -- Same as abs(a).")
+spam2o(inv, "inv(a) -- Same as ~a.")
+spam2o(invert, "invert(a) -- Same as ~a.")
+spam2(lshift, "lshift(a, b) -- Same as a << b.")
+spam2(rshift, "rshift(a, b) -- Same as a >> b.")
+spam2o(not_, "not_(a) -- Same as not a.")
+spam2(and_, "and_(a, b) -- Same as a & b.")
+spam2(xor, "xor(a, b) -- Same as a ^ b.")
+spam2(or_, "or_(a, b) -- Same as a | b.")
+spam2(iadd, "a = iadd(a, b) -- Same as a += b.")
+spam2(isub, "a = isub(a, b) -- Same as a -= b.")
+spam2(imul, "a = imul(a, b) -- Same as a *= b.")
+spam2(ifloordiv, "a = ifloordiv(a, b) -- Same as a //= b.")
+spam2(itruediv, "a = itruediv(a, b) -- Same as a /= b")
+spam2(imod, "a = imod(a, b) -- Same as a %= b.")
+spam2(ilshift, "a = ilshift(a, b) -- Same as a <<= b.")
+spam2(irshift, "a = irshift(a, b) -- Same as a >>= b.")
+spam2(iand, "a = iand(a, b) -- Same as a &= b.")
+spam2(ixor, "a = ixor(a, b) -- Same as a ^= b.")
+spam2(ior, "a = ior(a, b) -- Same as a |= b.")
+spam2(concat,
"concat(a, b) -- Same as a + b, for a and b sequences.")
-spam2(iconcat,__iconcat__,
+spam2(iconcat,
"a = iconcat(a, b) -- Same as a += b, for a and b sequences.")
-spam2(getitem,__getitem__,
+spam2(getitem,
"getitem(a, b) -- Same as a[b].")
-spam2(setitem,__setitem__,
+spam2(setitem,
"setitem(a, b, c) -- Same as a[b] = c.")
-spam2(delitem,__delitem__,
+spam2(delitem,
"delitem(a, b) -- Same as del a[b].")
-spam2(pow,__pow__, "pow(a, b) -- Same as a ** b.")
-spam2(ipow,__ipow__, "a = ipow(a, b) -- Same as a **= b.")
-spam2(lt,__lt__, "lt(a, b) -- Same as a<b.")
-spam2(le,__le__, "le(a, b) -- Same as a<=b.")
-spam2(eq,__eq__, "eq(a, b) -- Same as a==b.")
-spam2(ne,__ne__, "ne(a, b) -- Same as a!=b.")
-spam2(gt,__gt__, "gt(a, b) -- Same as a>b.")
-spam2(ge,__ge__, "ge(a, b) -- Same as a>=b.")
+spam2(pow, "pow(a, b) -- Same as a ** b.")
+spam2(ipow, "a = ipow(a, b) -- Same as a **= b.")
+spam2(lt, "lt(a, b) -- Same as a<b.")
+spam2(le, "le(a, b) -- Same as a<=b.")
+spam2(eq, "eq(a, b) -- Same as a==b.")
+spam2(ne, "ne(a, b) -- Same as a!=b.")
+spam2(gt, "gt(a, b) -- Same as a>b.")
+spam2(ge, "ge(a, b) -- Same as a>=b.")
{"_compare_digest", (PyCFunction)compare_digest, METH_VARARGS,
compare_digest__doc__},
+ {"length_hint", (PyCFunction)length_hint, METH_VARARGS,
+ length_hint__doc__},
{NULL, NULL} /* sentinel */
};
@@ -892,12 +917,12 @@ static PyTypeObject methodcaller_type = {
};
-/* Initialization function for the module (*must* be called PyInit_operator) */
+/* Initialization function for the module (*must* be called PyInit__operator) */
static struct PyModuleDef operatormodule = {
PyModuleDef_HEAD_INIT,
- "operator",
+ "_operator",
operator_doc,
-1,
operator_methods,
@@ -908,7 +933,7 @@ static struct PyModuleDef operatormodule = {
};
PyMODINIT_FUNC
-PyInit_operator(void)
+PyInit__operator(void)
{
PyObject *m;
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index ce573cf..af73a84 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -436,6 +436,7 @@ PyMemoTable_Copy(PyMemoTable *self)
new->mt_table = PyMem_MALLOC(self->mt_allocated * sizeof(PyMemoEntry));
if (new->mt_table == NULL) {
PyMem_FREE(new);
+ PyErr_NoMemory();
return NULL;
}
for (i = 0; i < self->mt_allocated; i++) {
@@ -529,7 +530,7 @@ _PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size)
oldtable = self->mt_table;
self->mt_table = PyMem_MALLOC(new_size * sizeof(PyMemoEntry));
if (self->mt_table == NULL) {
- PyMem_FREE(oldtable);
+ self->mt_table = oldtable;
PyErr_NoMemory();
return -1;
}
@@ -774,17 +775,14 @@ _Pickler_New(void)
self->fast_nesting = 0;
self->fix_imports = 0;
self->fast_memo = NULL;
-
- self->memo = PyMemoTable_New();
- if (self->memo == NULL) {
- Py_DECREF(self);
- return NULL;
- }
self->max_output_len = WRITE_BUF_SIZE;
self->output_len = 0;
+
+ self->memo = PyMemoTable_New();
self->output_buffer = PyBytes_FromStringAndSize(NULL,
self->max_output_len);
- if (self->output_buffer == NULL) {
+
+ if (self->memo == NULL || self->output_buffer == NULL) {
Py_DECREF(self);
return NULL;
}
@@ -1006,8 +1004,10 @@ _Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
char **result)
{
char *input_line = PyMem_Realloc(self->input_line, len + 1);
- if (input_line == NULL)
+ if (input_line == NULL) {
+ PyErr_NoMemory();
return -1;
+ }
memcpy(input_line, line, len);
input_line[len] = '\0';
@@ -1104,8 +1104,10 @@ static PyObject **
_Unpickler_NewMemo(Py_ssize_t new_size)
{
PyObject **memo = PyMem_MALLOC(new_size * sizeof(PyObject *));
- if (memo == NULL)
+ if (memo == NULL) {
+ PyErr_NoMemory();
return NULL;
+ }
memset(memo, 0, new_size * sizeof(PyObject *));
return memo;
}
@@ -1136,20 +1138,6 @@ _Unpickler_New(void)
if (self == NULL)
return NULL;
- self->stack = (Pdata *)Pdata_New();
- if (self->stack == NULL) {
- Py_DECREF(self);
- return NULL;
- }
- memset(&self->buffer, 0, sizeof(Py_buffer));
-
- self->memo_size = 32;
- self->memo = _Unpickler_NewMemo(self->memo_size);
- if (self->memo == NULL) {
- Py_DECREF(self);
- return NULL;
- }
-
self->arg = NULL;
self->pers_func = NULL;
self->input_buffer = NULL;
@@ -1167,6 +1155,15 @@ _Unpickler_New(void)
self->marks_size = 0;
self->proto = 0;
self->fix_imports = 0;
+ memset(&self->buffer, 0, sizeof(Py_buffer));
+ self->memo_size = 32;
+ self->memo = _Unpickler_NewMemo(self->memo_size);
+ self->stack = (Pdata *)Pdata_New();
+
+ if (self->memo == NULL || self->stack == NULL) {
+ Py_DECREF(self);
+ return NULL;
+ }
return self;
}
@@ -1213,8 +1210,8 @@ _Unpickler_SetInputEncoding(UnpicklerObject *self,
if (errors == NULL)
errors = "strict";
- self->encoding = strdup(encoding);
- self->errors = strdup(errors);
+ self->encoding = _PyMem_Strdup(encoding);
+ self->errors = _PyMem_Strdup(errors);
if (self->encoding == NULL || self->errors == NULL) {
PyErr_NoMemory();
return -1;
@@ -1364,8 +1361,10 @@ whichmodule(PyObject *global, PyObject *global_name)
search:
modules_dict = PySys_GetObject("modules");
- if (modules_dict == NULL)
+ if (modules_dict == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
return NULL;
+ }
i = 0;
module_name = NULL;
@@ -1748,8 +1747,10 @@ save_bytes(PicklerObject *self, PyObject *obj)
return -1;
if (latin1 == NULL) {
latin1 = PyUnicode_InternFromString("latin1");
- if (latin1 == NULL)
+ if (latin1 == NULL) {
+ Py_DECREF(unicode_str);
return -1;
+ }
}
reduce_value = Py_BuildValue("(O(OO))",
codecs_encode, unicode_str, latin1);
@@ -1873,63 +1874,97 @@ done:
}
static int
-save_unicode(PicklerObject *self, PyObject *obj)
+write_utf8(PicklerObject *self, char *data, Py_ssize_t size)
{
- Py_ssize_t size;
- PyObject *encoded = NULL;
+ char pdata[5];
- if (self->bin) {
- char pdata[5];
+#if SIZEOF_SIZE_T > 4
+ if (size > 0xffffffffUL) {
+ /* string too large */
+ PyErr_SetString(PyExc_OverflowError,
+ "cannot serialize a string larger than 4GiB");
+ return -1;
+ }
+#endif
- encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
- if (encoded == NULL)
- goto error;
+ pdata[0] = BINUNICODE;
+ pdata[1] = (unsigned char)(size & 0xff);
+ pdata[2] = (unsigned char)((size >> 8) & 0xff);
+ pdata[3] = (unsigned char)((size >> 16) & 0xff);
+ pdata[4] = (unsigned char)((size >> 24) & 0xff);
- size = PyBytes_GET_SIZE(encoded);
- if (size > 0xffffffffL) {
- PyErr_SetString(PyExc_OverflowError,
- "cannot serialize a string larger than 4 GiB");
- goto error; /* string too large */
- }
+ if (_Pickler_Write(self, pdata, sizeof(pdata)) < 0)
+ return -1;
- pdata[0] = BINUNICODE;
- pdata[1] = (unsigned char)(size & 0xff);
- pdata[2] = (unsigned char)((size >> 8) & 0xff);
- pdata[3] = (unsigned char)((size >> 16) & 0xff);
- pdata[4] = (unsigned char)((size >> 24) & 0xff);
+ if (_Pickler_Write(self, data, size) < 0)
+ return -1;
- if (_Pickler_Write(self, pdata, 5) < 0)
- goto error;
+ return 0;
+}
- if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0)
- goto error;
+static int
+write_unicode_binary(PicklerObject *self, PyObject *obj)
+{
+ PyObject *encoded = NULL;
+ Py_ssize_t size;
+ char *data;
+ int r;
+
+ if (PyUnicode_READY(obj))
+ return -1;
+
+ data = PyUnicode_AsUTF8AndSize(obj, &size);
+ if (data != NULL)
+ return write_utf8(self, data, size);
+
+ /* Issue #8383: for strings with lone surrogates, fallback on the
+ "surrogatepass" error handler. */
+ PyErr_Clear();
+ encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
+ if (encoded == NULL)
+ return -1;
+
+ r = write_utf8(self, PyBytes_AS_STRING(encoded),
+ PyBytes_GET_SIZE(encoded));
+ Py_DECREF(encoded);
+ return r;
+}
+
+static int
+save_unicode(PicklerObject *self, PyObject *obj)
+{
+ if (self->bin) {
+ if (write_unicode_binary(self, obj) < 0)
+ return -1;
}
else {
+ PyObject *encoded;
+ Py_ssize_t size;
const char unicode_op = UNICODE;
encoded = raw_unicode_escape(obj);
if (encoded == NULL)
- goto error;
+ return -1;
- if (_Pickler_Write(self, &unicode_op, 1) < 0)
- goto error;
+ if (_Pickler_Write(self, &unicode_op, 1) < 0) {
+ Py_DECREF(encoded);
+ return -1;
+ }
size = PyBytes_GET_SIZE(encoded);
- if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0)
- goto error;
+ if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
+ Py_DECREF(encoded);
+ return -1;
+ }
+ Py_DECREF(encoded);
if (_Pickler_Write(self, "\n", 1) < 0)
- goto error;
+ return -1;
}
if (memo_put(self, obj) < 0)
- goto error;
+ return -1;
- Py_DECREF(encoded);
return 0;
-
- error:
- Py_XDECREF(encoded);
- return -1;
}
/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
@@ -4171,36 +4206,23 @@ load_string(UnpicklerObject *self)
if ((len = _Unpickler_Readline(self, &s)) < 0)
return -1;
- if (len < 2)
- return bad_readline();
- if ((s = strdup(s)) == NULL) {
- PyErr_NoMemory();
- return -1;
- }
-
+ /* Strip the newline */
+ len--;
/* Strip outermost quotes */
- while (len > 0 && s[len - 1] <= ' ')
- len--;
- if (len > 1 && s[0] == '"' && s[len - 1] == '"') {
- s[len - 1] = '\0';
- p = s + 1;
- len -= 2;
- }
- else if (len > 1 && s[0] == '\'' && s[len - 1] == '\'') {
- s[len - 1] = '\0';
+ if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
p = s + 1;
len -= 2;
}
else {
- free(s);
- PyErr_SetString(PyExc_ValueError, "insecure string pickle");
+ PyErr_SetString(UnpicklingError,
+ "the STRING opcode argument must be quoted");
return -1;
}
+ assert(len >= 0);
/* Use the PyBytes API to decode the string, since that is what is used
to encode, and then coerce the result to Unicode. */
bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
- free(s);
if (bytes == NULL)
return -1;
str = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
@@ -4226,8 +4248,7 @@ load_binbytes(UnpicklerObject *self)
if (x < 0) {
PyErr_Format(PyExc_OverflowError,
"BINBYTES exceeds system's maximum size of %zd bytes",
- PY_SSIZE_T_MAX
- );
+ PY_SSIZE_T_MAX);
return -1;
}
@@ -4351,8 +4372,7 @@ load_binunicode(UnpicklerObject *self)
if (size < 0) {
PyErr_Format(PyExc_OverflowError,
"BINUNICODE exceeds system's maximum size of %zd bytes",
- PY_SSIZE_T_MAX
- );
+ PY_SSIZE_T_MAX);
return -1;
}
@@ -5526,8 +5546,10 @@ Unpickler_find_class(UnpicklerObject *self, PyObject *args)
}
modules_dict = PySys_GetObject("modules");
- if (modules_dict == NULL)
+ if (modules_dict == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
return NULL;
+ }
module = PyDict_GetItemWithError(modules_dict, module_name);
if (module == NULL) {
@@ -5571,8 +5593,8 @@ Unpickler_dealloc(UnpicklerObject *self)
_Unpickler_MemoCleanup(self);
PyMem_Free(self->marks);
PyMem_Free(self->input_line);
- free(self->encoding);
- free(self->errors);
+ PyMem_Free(self->encoding);
+ PyMem_Free(self->errors);
Py_TYPE(self)->tp_free((PyObject *)self);
}
@@ -5608,9 +5630,9 @@ Unpickler_clear(UnpicklerObject *self)
self->marks = NULL;
PyMem_Free(self->input_line);
self->input_line = NULL;
- free(self->encoding);
+ PyMem_Free(self->encoding);
self->encoding = NULL;
- free(self->errors);
+ PyMem_Free(self->errors);
self->errors = NULL;
return 0;
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index 07d7096..c4a6b7b 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -491,7 +491,7 @@ error:
/* We can't call strerror(saved_errno). It is not async signal safe.
* The parent process will look the error message up. */
} else {
- unused = write(errpipe_write, "RuntimeError:0:", 15);
+ unused = write(errpipe_write, "SubprocessError:0:", 18);
unused = write(errpipe_write, err_msg, strlen(err_msg));
}
if (unused) return; /* silly? yes! avoids gcc compiler warning. */
diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
index 6540ab9..59c15b3 100644
--- a/Modules/_randommodule.c
+++ b/Modules/_randommodule.c
@@ -168,9 +168,9 @@ init_genrand(RandomObject *self, unsigned long s)
/* init_key is the array for initializing keys */
/* key_length is its length */
static PyObject *
-init_by_array(RandomObject *self, unsigned long init_key[], unsigned long key_length)
+init_by_array(RandomObject *self, unsigned long init_key[], size_t key_length)
{
- unsigned int i, j, k; /* was signed in the original code. RDH 12/16/2002 */
+ size_t i, j, k; /* was signed in the original code. RDH 12/16/2002 */
unsigned long *mt;
mt = self->state;
@@ -207,14 +207,11 @@ static PyObject *
random_seed(RandomObject *self, PyObject *args)
{
PyObject *result = NULL; /* guilty until proved innocent */
- PyObject *masklower = NULL;
- PyObject *thirtytwo = NULL;
PyObject *n = NULL;
- unsigned long *new_key, *key = NULL;
- unsigned long keymax; /* # of allocated slots in key */
- unsigned long keyused; /* # of used slots in key */
- int err;
-
+ unsigned long *key = NULL;
+ unsigned char *key_as_bytes = NULL;
+ size_t bits, keyused, i;
+ int res;
PyObject *arg = NULL;
if (!PyArg_UnpackTuple(args, "seed", 0, 1, &arg))
@@ -243,69 +240,46 @@ random_seed(RandomObject *self, PyObject *args)
if (n == NULL)
goto Done;
- /* Now split n into 32-bit chunks, from the right. Each piece is
- * stored into key, which has a capacity of keymax chunks, of which
- * keyused are filled. Alas, the repeated shifting makes this a
- * quadratic-time algorithm; we'd really like to use
- * _PyLong_AsByteArray here, but then we'd have to break into the
- * long representation to figure out how big an array was needed
- * in advance.
- */
- keymax = 8; /* arbitrary; grows later if needed */
- keyused = 0;
- key = (unsigned long *)PyMem_Malloc(keymax * sizeof(*key));
- if (key == NULL)
+ /* Now split n into 32-bit chunks, from the right. */
+ bits = _PyLong_NumBits(n);
+ if (bits == (size_t)-1 && PyErr_Occurred())
goto Done;
- masklower = PyLong_FromUnsignedLong(0xffffffffU);
- if (masklower == NULL)
+ /* Figure out how many 32-bit chunks this gives us. */
+ keyused = bits == 0 ? 1 : (bits - 1) / 32 + 1;
+
+ /* Convert seed to byte sequence. */
+ key_as_bytes = (unsigned char *)PyMem_Malloc((size_t)4 * keyused);
+ if (key_as_bytes == NULL) {
+ PyErr_NoMemory();
goto Done;
- thirtytwo = PyLong_FromLong(32L);
- if (thirtytwo == NULL)
+ }
+ res = _PyLong_AsByteArray((PyLongObject *)n,
+ key_as_bytes, keyused * 4,
+ 1, /* little-endian */
+ 0); /* unsigned */
+ if (res == -1) {
+ PyMem_Free(key_as_bytes);
goto Done;
- while ((err=PyObject_IsTrue(n))) {
- PyObject *newn;
- PyObject *pychunk;
- unsigned long chunk;
-
- if (err == -1)
- goto Done;
- pychunk = PyNumber_And(n, masklower);
- if (pychunk == NULL)
- goto Done;
- chunk = PyLong_AsUnsignedLong(pychunk);
- Py_DECREF(pychunk);
- if (chunk == (unsigned long)-1 && PyErr_Occurred())
- goto Done;
- newn = PyNumber_Rshift(n, thirtytwo);
- if (newn == NULL)
- goto Done;
- Py_DECREF(n);
- n = newn;
- if (keyused >= keymax) {
- unsigned long bigger = keymax << 1;
- if ((bigger >> 1) != keymax ||
- bigger > PY_SSIZE_T_MAX / sizeof(*key)) {
- PyErr_NoMemory();
- goto Done;
- }
- new_key = (unsigned long *)PyMem_Realloc(key,
- bigger * sizeof(*key));
- if (new_key == NULL)
- goto Done;
- key = new_key;
- keymax = bigger;
- }
- assert(keyused < keymax);
- key[keyused++] = chunk;
}
- if (keyused == 0)
- key[keyused++] = 0UL;
+ /* Fill array of unsigned longs from byte sequence. */
+ key = (unsigned long *)PyMem_Malloc(sizeof(unsigned long) * keyused);
+ if (key == NULL) {
+ PyErr_NoMemory();
+ PyMem_Free(key_as_bytes);
+ goto Done;
+ }
+ for (i = 0; i < keyused; i++) {
+ key[i] =
+ ((unsigned long)key_as_bytes[4*i + 0] << 0) +
+ ((unsigned long)key_as_bytes[4*i + 1] << 8) +
+ ((unsigned long)key_as_bytes[4*i + 2] << 16) +
+ ((unsigned long)key_as_bytes[4*i + 3] << 24);
+ }
+ PyMem_Free(key_as_bytes);
result = init_by_array(self, key, keyused);
Done:
- Py_XDECREF(masklower);
- Py_XDECREF(thirtytwo);
Py_XDECREF(n);
PyMem_Free(key);
return result;
@@ -389,6 +363,9 @@ random_getrandbits(RandomObject *self, PyObject *args)
return NULL;
}
+ if (k <= 32) /* Fast path */
+ return PyLong_FromUnsignedLong(genrand_int32(self) >> (32 - k));
+
bytes = ((k - 1) / 32 + 1) * 4;
bytearray = (unsigned char *)PyMem_Malloc(bytes);
if (bytearray == NULL) {
diff --git a/Modules/_sha3/cleanup.py b/Modules/_sha3/cleanup.py
new file mode 100755
index 0000000..aabcb04
--- /dev/null
+++ b/Modules/_sha3/cleanup.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+# Copyright (C) 2012 Christian Heimes (christian@python.org)
+# Licensed to PSF under a Contributor Agreement.
+#
+# cleanup Keccak sources
+
+import os
+import re
+
+CPP1 = re.compile("^//(.*)")
+CPP2 = re.compile("\ //(.*)")
+
+STATICS = ("void ", "int ", "HashReturn ", "const UINT64 ", "UINT16 ")
+
+HERE = os.path.dirname(os.path.abspath(__file__))
+KECCAK = os.path.join(HERE, "keccak")
+
+def getfiles():
+ for name in os.listdir(KECCAK):
+ name = os.path.join(KECCAK, name)
+ if os.path.isfile(name):
+ yield name
+
+def cleanup(f):
+ buf = []
+ for line in f:
+ # mark all functions and global data as static
+ if line.startswith(STATICS):
+ buf.append("static " + line)
+ continue
+ # remove UINT64 typedef, we have our own
+ if line.startswith("typedef unsigned long long int"):
+ buf.append("/* %s */\n" % line.strip())
+ continue
+ # remove #include "brg_endian.h"
+ if "brg_endian.h" in line:
+ buf.append("/* %s */\n" % line.strip())
+ continue
+ # transform C++ comments into ANSI C comments
+ line = CPP1.sub(r"/* \1 */", line)
+ line = CPP2.sub(r" /* \1 */", line)
+ buf.append(line)
+ return "".join(buf)
+
+for name in getfiles():
+ with open(name) as f:
+ res = cleanup(f)
+ with open(name, "w") as f:
+ f.write(res)
diff --git a/Modules/_sha3/keccak/KeccakF-1600-32-rvk.macros b/Modules/_sha3/keccak/KeccakF-1600-32-rvk.macros
new file mode 100644
index 0000000..c0c9029
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-32-rvk.macros
@@ -0,0 +1,555 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by Ronny Van Keer,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+static const UINT32 KeccakF1600RoundConstants_int2[2*24] =
+{
+ 0x00000001UL, 0x00000000UL,
+ 0x00000000UL, 0x00000089UL,
+ 0x00000000UL, 0x8000008bUL,
+ 0x00000000UL, 0x80008080UL,
+ 0x00000001UL, 0x0000008bUL,
+ 0x00000001UL, 0x00008000UL,
+ 0x00000001UL, 0x80008088UL,
+ 0x00000001UL, 0x80000082UL,
+ 0x00000000UL, 0x0000000bUL,
+ 0x00000000UL, 0x0000000aUL,
+ 0x00000001UL, 0x00008082UL,
+ 0x00000000UL, 0x00008003UL,
+ 0x00000001UL, 0x0000808bUL,
+ 0x00000001UL, 0x8000000bUL,
+ 0x00000001UL, 0x8000008aUL,
+ 0x00000001UL, 0x80000081UL,
+ 0x00000000UL, 0x80000081UL,
+ 0x00000000UL, 0x80000008UL,
+ 0x00000000UL, 0x00000083UL,
+ 0x00000000UL, 0x80008003UL,
+ 0x00000001UL, 0x80008088UL,
+ 0x00000000UL, 0x80000088UL,
+ 0x00000001UL, 0x00008000UL,
+ 0x00000000UL, 0x80008082UL
+};
+
+#undef rounds
+
+#define rounds \
+{ \
+ UINT32 Da0, De0, Di0, Do0, Du0; \
+ UINT32 Da1, De1, Di1, Do1, Du1; \
+ UINT32 Ba, Be, Bi, Bo, Bu; \
+ UINT32 Aba0, Abe0, Abi0, Abo0, Abu0; \
+ UINT32 Aba1, Abe1, Abi1, Abo1, Abu1; \
+ UINT32 Aga0, Age0, Agi0, Ago0, Agu0; \
+ UINT32 Aga1, Age1, Agi1, Ago1, Agu1; \
+ UINT32 Aka0, Ake0, Aki0, Ako0, Aku0; \
+ UINT32 Aka1, Ake1, Aki1, Ako1, Aku1; \
+ UINT32 Ama0, Ame0, Ami0, Amo0, Amu0; \
+ UINT32 Ama1, Ame1, Ami1, Amo1, Amu1; \
+ UINT32 Asa0, Ase0, Asi0, Aso0, Asu0; \
+ UINT32 Asa1, Ase1, Asi1, Aso1, Asu1; \
+ UINT32 Cw, Cx, Cy, Cz; \
+ UINT32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; \
+ UINT32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; \
+ UINT32 Ega0, Ege0, Egi0, Ego0, Egu0; \
+ UINT32 Ega1, Ege1, Egi1, Ego1, Egu1; \
+ UINT32 Eka0, Eke0, Eki0, Eko0, Eku0; \
+ UINT32 Eka1, Eke1, Eki1, Eko1, Eku1; \
+ UINT32 Ema0, Eme0, Emi0, Emo0, Emu0; \
+ UINT32 Ema1, Eme1, Emi1, Emo1, Emu1; \
+ UINT32 Esa0, Ese0, Esi0, Eso0, Esu0; \
+ UINT32 Esa1, Ese1, Esi1, Eso1, Esu1; \
+ const UINT32 * pRoundConstants = KeccakF1600RoundConstants_int2; \
+ UINT32 i; \
+\
+ copyFromState(A, state) \
+\
+ for( i = 12; i != 0; --i ) { \
+ Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
+ Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
+ Da0 = Cx^ROL32(Du1, 1); \
+ Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
+ Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
+ Da1 = Cz^Du0; \
+\
+ Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
+ Do0 = Cw^ROL32(Cz, 1); \
+ Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
+ Do1 = Cy^Cx; \
+\
+ Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
+ De0 = Cx^ROL32(Cy, 1); \
+ Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
+ De1 = Cz^Cw; \
+\
+ Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
+ Di0 = Du0^ROL32(Cy, 1); \
+ Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
+ Di1 = Du1^Cw; \
+\
+ Du0 = Cw^ROL32(Cz, 1); \
+ Du1 = Cy^Cx; \
+\
+ Aba0 ^= Da0; \
+ Ba = Aba0; \
+ Age0 ^= De0; \
+ Be = ROL32(Age0, 22); \
+ Aki1 ^= Di1; \
+ Bi = ROL32(Aki1, 22); \
+ Amo1 ^= Do1; \
+ Bo = ROL32(Amo1, 11); \
+ Asu0 ^= Du0; \
+ Bu = ROL32(Asu0, 7); \
+ Eba0 = Ba ^((~Be)& Bi ) ^ *(pRoundConstants++); \
+ Ebe0 = Be ^((~Bi)& Bo ); \
+ Ebi0 = Bi ^((~Bo)& Bu ); \
+ Ebo0 = Bo ^((~Bu)& Ba ); \
+ Ebu0 = Bu ^((~Ba)& Be ); \
+\
+ Abo0 ^= Do0; \
+ Ba = ROL32(Abo0, 14); \
+ Agu0 ^= Du0; \
+ Be = ROL32(Agu0, 10); \
+ Aka1 ^= Da1; \
+ Bi = ROL32(Aka1, 2); \
+ Ame1 ^= De1; \
+ Bo = ROL32(Ame1, 23); \
+ Asi1 ^= Di1; \
+ Bu = ROL32(Asi1, 31); \
+ Ega0 = Ba ^((~Be)& Bi ); \
+ Ege0 = Be ^((~Bi)& Bo ); \
+ Egi0 = Bi ^((~Bo)& Bu ); \
+ Ego0 = Bo ^((~Bu)& Ba ); \
+ Egu0 = Bu ^((~Ba)& Be ); \
+\
+ Abe1 ^= De1; \
+ Ba = ROL32(Abe1, 1); \
+ Agi0 ^= Di0; \
+ Be = ROL32(Agi0, 3); \
+ Ako1 ^= Do1; \
+ Bi = ROL32(Ako1, 13); \
+ Amu0 ^= Du0; \
+ Bo = ROL32(Amu0, 4); \
+ Asa0 ^= Da0; \
+ Bu = ROL32(Asa0, 9); \
+ Eka0 = Ba ^((~Be)& Bi ); \
+ Eke0 = Be ^((~Bi)& Bo ); \
+ Eki0 = Bi ^((~Bo)& Bu ); \
+ Eko0 = Bo ^((~Bu)& Ba ); \
+ Eku0 = Bu ^((~Ba)& Be ); \
+\
+ Abu1 ^= Du1; \
+ Ba = ROL32(Abu1, 14); \
+ Aga0 ^= Da0; \
+ Be = ROL32(Aga0, 18); \
+ Ake0 ^= De0; \
+ Bi = ROL32(Ake0, 5); \
+ Ami1 ^= Di1; \
+ Bo = ROL32(Ami1, 8); \
+ Aso0 ^= Do0; \
+ Bu = ROL32(Aso0, 28); \
+ Ema0 = Ba ^((~Be)& Bi ); \
+ Eme0 = Be ^((~Bi)& Bo ); \
+ Emi0 = Bi ^((~Bo)& Bu ); \
+ Emo0 = Bo ^((~Bu)& Ba ); \
+ Emu0 = Bu ^((~Ba)& Be ); \
+\
+ Abi0 ^= Di0; \
+ Ba = ROL32(Abi0, 31); \
+ Ago1 ^= Do1; \
+ Be = ROL32(Ago1, 28); \
+ Aku1 ^= Du1; \
+ Bi = ROL32(Aku1, 20); \
+ Ama1 ^= Da1; \
+ Bo = ROL32(Ama1, 21); \
+ Ase0 ^= De0; \
+ Bu = ROL32(Ase0, 1); \
+ Esa0 = Ba ^((~Be)& Bi ); \
+ Ese0 = Be ^((~Bi)& Bo ); \
+ Esi0 = Bi ^((~Bo)& Bu ); \
+ Eso0 = Bo ^((~Bu)& Ba ); \
+ Esu0 = Bu ^((~Ba)& Be ); \
+\
+ Aba1 ^= Da1; \
+ Ba = Aba1; \
+ Age1 ^= De1; \
+ Be = ROL32(Age1, 22); \
+ Aki0 ^= Di0; \
+ Bi = ROL32(Aki0, 21); \
+ Amo0 ^= Do0; \
+ Bo = ROL32(Amo0, 10); \
+ Asu1 ^= Du1; \
+ Bu = ROL32(Asu1, 7); \
+ Eba1 = Ba ^((~Be)& Bi ); \
+ Eba1 ^= *(pRoundConstants++); \
+ Ebe1 = Be ^((~Bi)& Bo ); \
+ Ebi1 = Bi ^((~Bo)& Bu ); \
+ Ebo1 = Bo ^((~Bu)& Ba ); \
+ Ebu1 = Bu ^((~Ba)& Be ); \
+\
+ Abo1 ^= Do1; \
+ Ba = ROL32(Abo1, 14); \
+ Agu1 ^= Du1; \
+ Be = ROL32(Agu1, 10); \
+ Aka0 ^= Da0; \
+ Bi = ROL32(Aka0, 1); \
+ Ame0 ^= De0; \
+ Bo = ROL32(Ame0, 22); \
+ Asi0 ^= Di0; \
+ Bu = ROL32(Asi0, 30); \
+ Ega1 = Ba ^((~Be)& Bi ); \
+ Ege1 = Be ^((~Bi)& Bo ); \
+ Egi1 = Bi ^((~Bo)& Bu ); \
+ Ego1 = Bo ^((~Bu)& Ba ); \
+ Egu1 = Bu ^((~Ba)& Be ); \
+\
+ Abe0 ^= De0; \
+ Ba = Abe0; \
+ Agi1 ^= Di1; \
+ Be = ROL32(Agi1, 3); \
+ Ako0 ^= Do0; \
+ Bi = ROL32(Ako0, 12); \
+ Amu1 ^= Du1; \
+ Bo = ROL32(Amu1, 4); \
+ Asa1 ^= Da1; \
+ Bu = ROL32(Asa1, 9); \
+ Eka1 = Ba ^((~Be)& Bi ); \
+ Eke1 = Be ^((~Bi)& Bo ); \
+ Eki1 = Bi ^((~Bo)& Bu ); \
+ Eko1 = Bo ^((~Bu)& Ba ); \
+ Eku1 = Bu ^((~Ba)& Be ); \
+\
+ Abu0 ^= Du0; \
+ Ba = ROL32(Abu0, 13); \
+ Aga1 ^= Da1; \
+ Be = ROL32(Aga1, 18); \
+ Ake1 ^= De1; \
+ Bi = ROL32(Ake1, 5); \
+ Ami0 ^= Di0; \
+ Bo = ROL32(Ami0, 7); \
+ Aso1 ^= Do1; \
+ Bu = ROL32(Aso1, 28); \
+ Ema1 = Ba ^((~Be)& Bi ); \
+ Eme1 = Be ^((~Bi)& Bo ); \
+ Emi1 = Bi ^((~Bo)& Bu ); \
+ Emo1 = Bo ^((~Bu)& Ba ); \
+ Emu1 = Bu ^((~Ba)& Be ); \
+\
+ Abi1 ^= Di1; \
+ Ba = ROL32(Abi1, 31); \
+ Ago0 ^= Do0; \
+ Be = ROL32(Ago0, 27); \
+ Aku0 ^= Du0; \
+ Bi = ROL32(Aku0, 19); \
+ Ama0 ^= Da0; \
+ Bo = ROL32(Ama0, 20); \
+ Ase1 ^= De1; \
+ Bu = ROL32(Ase1, 1); \
+ Esa1 = Ba ^((~Be)& Bi ); \
+ Ese1 = Be ^((~Bi)& Bo ); \
+ Esi1 = Bi ^((~Bo)& Bu ); \
+ Eso1 = Bo ^((~Bu)& Ba ); \
+ Esu1 = Bu ^((~Ba)& Be ); \
+\
+ Cx = Ebu0^Egu0^Eku0^Emu0^Esu0; \
+ Du1 = Ebe1^Ege1^Eke1^Eme1^Ese1; \
+ Da0 = Cx^ROL32(Du1, 1); \
+ Cz = Ebu1^Egu1^Eku1^Emu1^Esu1; \
+ Du0 = Ebe0^Ege0^Eke0^Eme0^Ese0; \
+ Da1 = Cz^Du0; \
+\
+ Cw = Ebi0^Egi0^Eki0^Emi0^Esi0; \
+ Do0 = Cw^ROL32(Cz, 1); \
+ Cy = Ebi1^Egi1^Eki1^Emi1^Esi1; \
+ Do1 = Cy^Cx; \
+\
+ Cx = Eba0^Ega0^Eka0^Ema0^Esa0; \
+ De0 = Cx^ROL32(Cy, 1); \
+ Cz = Eba1^Ega1^Eka1^Ema1^Esa1; \
+ De1 = Cz^Cw; \
+\
+ Cy = Ebo1^Ego1^Eko1^Emo1^Eso1; \
+ Di0 = Du0^ROL32(Cy, 1); \
+ Cw = Ebo0^Ego0^Eko0^Emo0^Eso0; \
+ Di1 = Du1^Cw; \
+\
+ Du0 = Cw^ROL32(Cz, 1); \
+ Du1 = Cy^Cx; \
+\
+ Eba0 ^= Da0; \
+ Ba = Eba0; \
+ Ege0 ^= De0; \
+ Be = ROL32(Ege0, 22); \
+ Eki1 ^= Di1; \
+ Bi = ROL32(Eki1, 22); \
+ Emo1 ^= Do1; \
+ Bo = ROL32(Emo1, 11); \
+ Esu0 ^= Du0; \
+ Bu = ROL32(Esu0, 7); \
+ Aba0 = Ba ^((~Be)& Bi ); \
+ Aba0 ^= *(pRoundConstants++); \
+ Abe0 = Be ^((~Bi)& Bo ); \
+ Abi0 = Bi ^((~Bo)& Bu ); \
+ Abo0 = Bo ^((~Bu)& Ba ); \
+ Abu0 = Bu ^((~Ba)& Be ); \
+\
+ Ebo0 ^= Do0; \
+ Ba = ROL32(Ebo0, 14); \
+ Egu0 ^= Du0; \
+ Be = ROL32(Egu0, 10); \
+ Eka1 ^= Da1; \
+ Bi = ROL32(Eka1, 2); \
+ Eme1 ^= De1; \
+ Bo = ROL32(Eme1, 23); \
+ Esi1 ^= Di1; \
+ Bu = ROL32(Esi1, 31); \
+ Aga0 = Ba ^((~Be)& Bi ); \
+ Age0 = Be ^((~Bi)& Bo ); \
+ Agi0 = Bi ^((~Bo)& Bu ); \
+ Ago0 = Bo ^((~Bu)& Ba ); \
+ Agu0 = Bu ^((~Ba)& Be ); \
+\
+ Ebe1 ^= De1; \
+ Ba = ROL32(Ebe1, 1); \
+ Egi0 ^= Di0; \
+ Be = ROL32(Egi0, 3); \
+ Eko1 ^= Do1; \
+ Bi = ROL32(Eko1, 13); \
+ Emu0 ^= Du0; \
+ Bo = ROL32(Emu0, 4); \
+ Esa0 ^= Da0; \
+ Bu = ROL32(Esa0, 9); \
+ Aka0 = Ba ^((~Be)& Bi ); \
+ Ake0 = Be ^((~Bi)& Bo ); \
+ Aki0 = Bi ^((~Bo)& Bu ); \
+ Ako0 = Bo ^((~Bu)& Ba ); \
+ Aku0 = Bu ^((~Ba)& Be ); \
+\
+ Ebu1 ^= Du1; \
+ Ba = ROL32(Ebu1, 14); \
+ Ega0 ^= Da0; \
+ Be = ROL32(Ega0, 18); \
+ Eke0 ^= De0; \
+ Bi = ROL32(Eke0, 5); \
+ Emi1 ^= Di1; \
+ Bo = ROL32(Emi1, 8); \
+ Eso0 ^= Do0; \
+ Bu = ROL32(Eso0, 28); \
+ Ama0 = Ba ^((~Be)& Bi ); \
+ Ame0 = Be ^((~Bi)& Bo ); \
+ Ami0 = Bi ^((~Bo)& Bu ); \
+ Amo0 = Bo ^((~Bu)& Ba ); \
+ Amu0 = Bu ^((~Ba)& Be ); \
+\
+ Ebi0 ^= Di0; \
+ Ba = ROL32(Ebi0, 31); \
+ Ego1 ^= Do1; \
+ Be = ROL32(Ego1, 28); \
+ Eku1 ^= Du1; \
+ Bi = ROL32(Eku1, 20); \
+ Ema1 ^= Da1; \
+ Bo = ROL32(Ema1, 21); \
+ Ese0 ^= De0; \
+ Bu = ROL32(Ese0, 1); \
+ Asa0 = Ba ^((~Be)& Bi ); \
+ Ase0 = Be ^((~Bi)& Bo ); \
+ Asi0 = Bi ^((~Bo)& Bu ); \
+ Aso0 = Bo ^((~Bu)& Ba ); \
+ Asu0 = Bu ^((~Ba)& Be ); \
+\
+ Eba1 ^= Da1; \
+ Ba = Eba1; \
+ Ege1 ^= De1; \
+ Be = ROL32(Ege1, 22); \
+ Eki0 ^= Di0; \
+ Bi = ROL32(Eki0, 21); \
+ Emo0 ^= Do0; \
+ Bo = ROL32(Emo0, 10); \
+ Esu1 ^= Du1; \
+ Bu = ROL32(Esu1, 7); \
+ Aba1 = Ba ^((~Be)& Bi ); \
+ Aba1 ^= *(pRoundConstants++); \
+ Abe1 = Be ^((~Bi)& Bo ); \
+ Abi1 = Bi ^((~Bo)& Bu ); \
+ Abo1 = Bo ^((~Bu)& Ba ); \
+ Abu1 = Bu ^((~Ba)& Be ); \
+\
+ Ebo1 ^= Do1; \
+ Ba = ROL32(Ebo1, 14); \
+ Egu1 ^= Du1; \
+ Be = ROL32(Egu1, 10); \
+ Eka0 ^= Da0; \
+ Bi = ROL32(Eka0, 1); \
+ Eme0 ^= De0; \
+ Bo = ROL32(Eme0, 22); \
+ Esi0 ^= Di0; \
+ Bu = ROL32(Esi0, 30); \
+ Aga1 = Ba ^((~Be)& Bi ); \
+ Age1 = Be ^((~Bi)& Bo ); \
+ Agi1 = Bi ^((~Bo)& Bu ); \
+ Ago1 = Bo ^((~Bu)& Ba ); \
+ Agu1 = Bu ^((~Ba)& Be ); \
+\
+ Ebe0 ^= De0; \
+ Ba = Ebe0; \
+ Egi1 ^= Di1; \
+ Be = ROL32(Egi1, 3); \
+ Eko0 ^= Do0; \
+ Bi = ROL32(Eko0, 12); \
+ Emu1 ^= Du1; \
+ Bo = ROL32(Emu1, 4); \
+ Esa1 ^= Da1; \
+ Bu = ROL32(Esa1, 9); \
+ Aka1 = Ba ^((~Be)& Bi ); \
+ Ake1 = Be ^((~Bi)& Bo ); \
+ Aki1 = Bi ^((~Bo)& Bu ); \
+ Ako1 = Bo ^((~Bu)& Ba ); \
+ Aku1 = Bu ^((~Ba)& Be ); \
+\
+ Ebu0 ^= Du0; \
+ Ba = ROL32(Ebu0, 13); \
+ Ega1 ^= Da1; \
+ Be = ROL32(Ega1, 18); \
+ Eke1 ^= De1; \
+ Bi = ROL32(Eke1, 5); \
+ Emi0 ^= Di0; \
+ Bo = ROL32(Emi0, 7); \
+ Eso1 ^= Do1; \
+ Bu = ROL32(Eso1, 28); \
+ Ama1 = Ba ^((~Be)& Bi ); \
+ Ame1 = Be ^((~Bi)& Bo ); \
+ Ami1 = Bi ^((~Bo)& Bu ); \
+ Amo1 = Bo ^((~Bu)& Ba ); \
+ Amu1 = Bu ^((~Ba)& Be ); \
+\
+ Ebi1 ^= Di1; \
+ Ba = ROL32(Ebi1, 31); \
+ Ego0 ^= Do0; \
+ Be = ROL32(Ego0, 27); \
+ Eku0 ^= Du0; \
+ Bi = ROL32(Eku0, 19); \
+ Ema0 ^= Da0; \
+ Bo = ROL32(Ema0, 20); \
+ Ese1 ^= De1; \
+ Bu = ROL32(Ese1, 1); \
+ Asa1 = Ba ^((~Be)& Bi ); \
+ Ase1 = Be ^((~Bi)& Bo ); \
+ Asi1 = Bi ^((~Bo)& Bu ); \
+ Aso1 = Bo ^((~Bu)& Ba ); \
+ Asu1 = Bu ^((~Ba)& Be ); \
+ } \
+ copyToState(state, A) \
+}
+
+#define copyFromState(X, state) \
+ X##ba0 = state[ 0]; \
+ X##ba1 = state[ 1]; \
+ X##be0 = state[ 2]; \
+ X##be1 = state[ 3]; \
+ X##bi0 = state[ 4]; \
+ X##bi1 = state[ 5]; \
+ X##bo0 = state[ 6]; \
+ X##bo1 = state[ 7]; \
+ X##bu0 = state[ 8]; \
+ X##bu1 = state[ 9]; \
+ X##ga0 = state[10]; \
+ X##ga1 = state[11]; \
+ X##ge0 = state[12]; \
+ X##ge1 = state[13]; \
+ X##gi0 = state[14]; \
+ X##gi1 = state[15]; \
+ X##go0 = state[16]; \
+ X##go1 = state[17]; \
+ X##gu0 = state[18]; \
+ X##gu1 = state[19]; \
+ X##ka0 = state[20]; \
+ X##ka1 = state[21]; \
+ X##ke0 = state[22]; \
+ X##ke1 = state[23]; \
+ X##ki0 = state[24]; \
+ X##ki1 = state[25]; \
+ X##ko0 = state[26]; \
+ X##ko1 = state[27]; \
+ X##ku0 = state[28]; \
+ X##ku1 = state[29]; \
+ X##ma0 = state[30]; \
+ X##ma1 = state[31]; \
+ X##me0 = state[32]; \
+ X##me1 = state[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyToState(state, X) \
+ state[ 0] = X##ba0; \
+ state[ 1] = X##ba1; \
+ state[ 2] = X##be0; \
+ state[ 3] = X##be1; \
+ state[ 4] = X##bi0; \
+ state[ 5] = X##bi1; \
+ state[ 6] = X##bo0; \
+ state[ 7] = X##bo1; \
+ state[ 8] = X##bu0; \
+ state[ 9] = X##bu1; \
+ state[10] = X##ga0; \
+ state[11] = X##ga1; \
+ state[12] = X##ge0; \
+ state[13] = X##ge1; \
+ state[14] = X##gi0; \
+ state[15] = X##gi1; \
+ state[16] = X##go0; \
+ state[17] = X##go1; \
+ state[18] = X##gu0; \
+ state[19] = X##gu1; \
+ state[20] = X##ka0; \
+ state[21] = X##ka1; \
+ state[22] = X##ke0; \
+ state[23] = X##ke1; \
+ state[24] = X##ki0; \
+ state[25] = X##ki1; \
+ state[26] = X##ko0; \
+ state[27] = X##ko1; \
+ state[28] = X##ku0; \
+ state[29] = X##ku1; \
+ state[30] = X##ma0; \
+ state[31] = X##ma1; \
+ state[32] = X##me0; \
+ state[33] = X##me1; \
+ state[34] = X##mi0; \
+ state[35] = X##mi1; \
+ state[36] = X##mo0; \
+ state[37] = X##mo1; \
+ state[38] = X##mu0; \
+ state[39] = X##mu1; \
+ state[40] = X##sa0; \
+ state[41] = X##sa1; \
+ state[42] = X##se0; \
+ state[43] = X##se1; \
+ state[44] = X##si0; \
+ state[45] = X##si1; \
+ state[46] = X##so0; \
+ state[47] = X##so1; \
+ state[48] = X##su0; \
+ state[49] = X##su1; \
+
diff --git a/Modules/_sha3/keccak/KeccakF-1600-32-s1.macros b/Modules/_sha3/keccak/KeccakF-1600-32-s1.macros
new file mode 100644
index 0000000..373d61d
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-32-s1.macros
@@ -0,0 +1,1187 @@
+/*
+Code automatically generated by KeccakTools!
+
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#define declareABCDE \
+ UINT32 Aba0, Abe0, Abi0, Abo0, Abu0; \
+ UINT32 Aba1, Abe1, Abi1, Abo1, Abu1; \
+ UINT32 Aga0, Age0, Agi0, Ago0, Agu0; \
+ UINT32 Aga1, Age1, Agi1, Ago1, Agu1; \
+ UINT32 Aka0, Ake0, Aki0, Ako0, Aku0; \
+ UINT32 Aka1, Ake1, Aki1, Ako1, Aku1; \
+ UINT32 Ama0, Ame0, Ami0, Amo0, Amu0; \
+ UINT32 Ama1, Ame1, Ami1, Amo1, Amu1; \
+ UINT32 Asa0, Ase0, Asi0, Aso0, Asu0; \
+ UINT32 Asa1, Ase1, Asi1, Aso1, Asu1; \
+ UINT32 Bba0, Bbe0, Bbi0, Bbo0, Bbu0; \
+ UINT32 Bba1, Bbe1, Bbi1, Bbo1, Bbu1; \
+ UINT32 Bga0, Bge0, Bgi0, Bgo0, Bgu0; \
+ UINT32 Bga1, Bge1, Bgi1, Bgo1, Bgu1; \
+ UINT32 Bka0, Bke0, Bki0, Bko0, Bku0; \
+ UINT32 Bka1, Bke1, Bki1, Bko1, Bku1; \
+ UINT32 Bma0, Bme0, Bmi0, Bmo0, Bmu0; \
+ UINT32 Bma1, Bme1, Bmi1, Bmo1, Bmu1; \
+ UINT32 Bsa0, Bse0, Bsi0, Bso0, Bsu0; \
+ UINT32 Bsa1, Bse1, Bsi1, Bso1, Bsu1; \
+ UINT32 Ca0, Ce0, Ci0, Co0, Cu0; \
+ UINT32 Ca1, Ce1, Ci1, Co1, Cu1; \
+ UINT32 Da0, De0, Di0, Do0, Du0; \
+ UINT32 Da1, De1, Di1, Do1, Du1; \
+ UINT32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; \
+ UINT32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; \
+ UINT32 Ega0, Ege0, Egi0, Ego0, Egu0; \
+ UINT32 Ega1, Ege1, Egi1, Ego1, Egu1; \
+ UINT32 Eka0, Eke0, Eki0, Eko0, Eku0; \
+ UINT32 Eka1, Eke1, Eki1, Eko1, Eku1; \
+ UINT32 Ema0, Eme0, Emi0, Emo0, Emu0; \
+ UINT32 Ema1, Eme1, Emi1, Emo1, Emu1; \
+ UINT32 Esa0, Ese0, Esi0, Eso0, Esu0; \
+ UINT32 Esa1, Ese1, Esi1, Eso1, Esu1; \
+
+#define prepareTheta \
+ Ca0 = Aba0^Aga0^Aka0^Ama0^Asa0; \
+ Ca1 = Aba1^Aga1^Aka1^Ama1^Asa1; \
+ Ce0 = Abe0^Age0^Ake0^Ame0^Ase0; \
+ Ce1 = Abe1^Age1^Ake1^Ame1^Ase1; \
+ Ci0 = Abi0^Agi0^Aki0^Ami0^Asi0; \
+ Ci1 = Abi1^Agi1^Aki1^Ami1^Asi1; \
+ Co0 = Abo0^Ago0^Ako0^Amo0^Aso0; \
+ Co1 = Abo1^Ago1^Ako1^Amo1^Aso1; \
+ Cu0 = Abu0^Agu0^Aku0^Amu0^Asu0; \
+ Cu1 = Abu1^Agu1^Aku1^Amu1^Asu1; \
+
+#ifdef UseBebigokimisa
+/* --- Code for round, with prepare-theta (lane complementing pattern 'bebigokimisa') */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##ba0 = Bba0 ^( Bbe0 | Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ Ca0 = E##ba0; \
+ E##be0 = Bbe0 ^((~Bbi0)| Bbo0 ); \
+ Ce0 = E##be0; \
+ E##bi0 = Bbi0 ^( Bbo0 & Bbu0 ); \
+ Ci0 = E##bi0; \
+ E##bo0 = Bbo0 ^( Bbu0 | Bba0 ); \
+ Co0 = E##bo0; \
+ E##bu0 = Bbu0 ^( Bba0 & Bbe0 ); \
+ Cu0 = E##bu0; \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##ba1 = Bba1 ^( Bbe1 | Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ Ca1 = E##ba1; \
+ E##be1 = Bbe1 ^((~Bbi1)| Bbo1 ); \
+ Ce1 = E##be1; \
+ E##bi1 = Bbi1 ^( Bbo1 & Bbu1 ); \
+ Ci1 = E##bi1; \
+ E##bo1 = Bbo1 ^( Bbu1 | Bba1 ); \
+ Co1 = E##bo1; \
+ E##bu1 = Bbu1 ^( Bba1 & Bbe1 ); \
+ Cu1 = E##bu1; \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##ga0 = Bga0 ^( Bge0 | Bgi0 ); \
+ Ca0 ^= E##ga0; \
+ E##ge0 = Bge0 ^( Bgi0 & Bgo0 ); \
+ Ce0 ^= E##ge0; \
+ E##gi0 = Bgi0 ^( Bgo0 |(~Bgu0)); \
+ Ci0 ^= E##gi0; \
+ E##go0 = Bgo0 ^( Bgu0 | Bga0 ); \
+ Co0 ^= E##go0; \
+ E##gu0 = Bgu0 ^( Bga0 & Bge0 ); \
+ Cu0 ^= E##gu0; \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##ga1 = Bga1 ^( Bge1 | Bgi1 ); \
+ Ca1 ^= E##ga1; \
+ E##ge1 = Bge1 ^( Bgi1 & Bgo1 ); \
+ Ce1 ^= E##ge1; \
+ E##gi1 = Bgi1 ^( Bgo1 |(~Bgu1)); \
+ Ci1 ^= E##gi1; \
+ E##go1 = Bgo1 ^( Bgu1 | Bga1 ); \
+ Co1 ^= E##go1; \
+ E##gu1 = Bgu1 ^( Bga1 & Bge1 ); \
+ Cu1 ^= E##gu1; \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ka0 = Bka0 ^( Bke0 | Bki0 ); \
+ Ca0 ^= E##ka0; \
+ E##ke0 = Bke0 ^( Bki0 & Bko0 ); \
+ Ce0 ^= E##ke0; \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ Ci0 ^= E##ki0; \
+ E##ko0 = (~Bko0)^( Bku0 | Bka0 ); \
+ Co0 ^= E##ko0; \
+ E##ku0 = Bku0 ^( Bka0 & Bke0 ); \
+ Cu0 ^= E##ku0; \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ka1 = Bka1 ^( Bke1 | Bki1 ); \
+ Ca1 ^= E##ka1; \
+ E##ke1 = Bke1 ^( Bki1 & Bko1 ); \
+ Ce1 ^= E##ke1; \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ Ci1 ^= E##ki1; \
+ E##ko1 = (~Bko1)^( Bku1 | Bka1 ); \
+ Co1 ^= E##ko1; \
+ E##ku1 = Bku1 ^( Bka1 & Bke1 ); \
+ Cu1 ^= E##ku1; \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##ma0 = Bma0 ^( Bme0 & Bmi0 ); \
+ Ca0 ^= E##ma0; \
+ E##me0 = Bme0 ^( Bmi0 | Bmo0 ); \
+ Ce0 ^= E##me0; \
+ E##mi0 = Bmi0 ^((~Bmo0)| Bmu0 ); \
+ Ci0 ^= E##mi0; \
+ E##mo0 = (~Bmo0)^( Bmu0 & Bma0 ); \
+ Co0 ^= E##mo0; \
+ E##mu0 = Bmu0 ^( Bma0 | Bme0 ); \
+ Cu0 ^= E##mu0; \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##ma1 = Bma1 ^( Bme1 & Bmi1 ); \
+ Ca1 ^= E##ma1; \
+ E##me1 = Bme1 ^( Bmi1 | Bmo1 ); \
+ Ce1 ^= E##me1; \
+ E##mi1 = Bmi1 ^((~Bmo1)| Bmu1 ); \
+ Ci1 ^= E##mi1; \
+ E##mo1 = (~Bmo1)^( Bmu1 & Bma1 ); \
+ Co1 ^= E##mo1; \
+ E##mu1 = Bmu1 ^( Bma1 | Bme1 ); \
+ Cu1 ^= E##mu1; \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ Ca0 ^= E##sa0; \
+ E##se0 = (~Bse0)^( Bsi0 | Bso0 ); \
+ Ce0 ^= E##se0; \
+ E##si0 = Bsi0 ^( Bso0 & Bsu0 ); \
+ Ci0 ^= E##si0; \
+ E##so0 = Bso0 ^( Bsu0 | Bsa0 ); \
+ Co0 ^= E##so0; \
+ E##su0 = Bsu0 ^( Bsa0 & Bse0 ); \
+ Cu0 ^= E##su0; \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ Ca1 ^= E##sa1; \
+ E##se1 = (~Bse1)^( Bsi1 | Bso1 ); \
+ Ce1 ^= E##se1; \
+ E##si1 = Bsi1 ^( Bso1 & Bsu1 ); \
+ Ci1 ^= E##si1; \
+ E##so1 = Bso1 ^( Bsu1 | Bsa1 ); \
+ Co1 ^= E##so1; \
+ E##su1 = Bsu1 ^( Bsa1 & Bse1 ); \
+ Cu1 ^= E##su1; \
+\
+
+/* --- Code for round (lane complementing pattern 'bebigokimisa') */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##ba0 = Bba0 ^( Bbe0 | Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ E##be0 = Bbe0 ^((~Bbi0)| Bbo0 ); \
+ E##bi0 = Bbi0 ^( Bbo0 & Bbu0 ); \
+ E##bo0 = Bbo0 ^( Bbu0 | Bba0 ); \
+ E##bu0 = Bbu0 ^( Bba0 & Bbe0 ); \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##ba1 = Bba1 ^( Bbe1 | Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ E##be1 = Bbe1 ^((~Bbi1)| Bbo1 ); \
+ E##bi1 = Bbi1 ^( Bbo1 & Bbu1 ); \
+ E##bo1 = Bbo1 ^( Bbu1 | Bba1 ); \
+ E##bu1 = Bbu1 ^( Bba1 & Bbe1 ); \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##ga0 = Bga0 ^( Bge0 | Bgi0 ); \
+ E##ge0 = Bge0 ^( Bgi0 & Bgo0 ); \
+ E##gi0 = Bgi0 ^( Bgo0 |(~Bgu0)); \
+ E##go0 = Bgo0 ^( Bgu0 | Bga0 ); \
+ E##gu0 = Bgu0 ^( Bga0 & Bge0 ); \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##ga1 = Bga1 ^( Bge1 | Bgi1 ); \
+ E##ge1 = Bge1 ^( Bgi1 & Bgo1 ); \
+ E##gi1 = Bgi1 ^( Bgo1 |(~Bgu1)); \
+ E##go1 = Bgo1 ^( Bgu1 | Bga1 ); \
+ E##gu1 = Bgu1 ^( Bga1 & Bge1 ); \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ka0 = Bka0 ^( Bke0 | Bki0 ); \
+ E##ke0 = Bke0 ^( Bki0 & Bko0 ); \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ E##ko0 = (~Bko0)^( Bku0 | Bka0 ); \
+ E##ku0 = Bku0 ^( Bka0 & Bke0 ); \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ka1 = Bka1 ^( Bke1 | Bki1 ); \
+ E##ke1 = Bke1 ^( Bki1 & Bko1 ); \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ E##ko1 = (~Bko1)^( Bku1 | Bka1 ); \
+ E##ku1 = Bku1 ^( Bka1 & Bke1 ); \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##ma0 = Bma0 ^( Bme0 & Bmi0 ); \
+ E##me0 = Bme0 ^( Bmi0 | Bmo0 ); \
+ E##mi0 = Bmi0 ^((~Bmo0)| Bmu0 ); \
+ E##mo0 = (~Bmo0)^( Bmu0 & Bma0 ); \
+ E##mu0 = Bmu0 ^( Bma0 | Bme0 ); \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##ma1 = Bma1 ^( Bme1 & Bmi1 ); \
+ E##me1 = Bme1 ^( Bmi1 | Bmo1 ); \
+ E##mi1 = Bmi1 ^((~Bmo1)| Bmu1 ); \
+ E##mo1 = (~Bmo1)^( Bmu1 & Bma1 ); \
+ E##mu1 = Bmu1 ^( Bma1 | Bme1 ); \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ E##se0 = (~Bse0)^( Bsi0 | Bso0 ); \
+ E##si0 = Bsi0 ^( Bso0 & Bsu0 ); \
+ E##so0 = Bso0 ^( Bsu0 | Bsa0 ); \
+ E##su0 = Bsu0 ^( Bsa0 & Bse0 ); \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ E##se1 = (~Bse1)^( Bsi1 | Bso1 ); \
+ E##si1 = Bsi1 ^( Bso1 & Bsu1 ); \
+ E##so1 = Bso1 ^( Bsu1 | Bsa1 ); \
+ E##su1 = Bsu1 ^( Bsa1 & Bse1 ); \
+\
+
+#else /* UseBebigokimisa */
+/* --- Code for round, with prepare-theta */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##ba0 = Bba0 ^((~Bbe0)& Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ Ca0 = E##ba0; \
+ E##be0 = Bbe0 ^((~Bbi0)& Bbo0 ); \
+ Ce0 = E##be0; \
+ E##bi0 = Bbi0 ^((~Bbo0)& Bbu0 ); \
+ Ci0 = E##bi0; \
+ E##bo0 = Bbo0 ^((~Bbu0)& Bba0 ); \
+ Co0 = E##bo0; \
+ E##bu0 = Bbu0 ^((~Bba0)& Bbe0 ); \
+ Cu0 = E##bu0; \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##ba1 = Bba1 ^((~Bbe1)& Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ Ca1 = E##ba1; \
+ E##be1 = Bbe1 ^((~Bbi1)& Bbo1 ); \
+ Ce1 = E##be1; \
+ E##bi1 = Bbi1 ^((~Bbo1)& Bbu1 ); \
+ Ci1 = E##bi1; \
+ E##bo1 = Bbo1 ^((~Bbu1)& Bba1 ); \
+ Co1 = E##bo1; \
+ E##bu1 = Bbu1 ^((~Bba1)& Bbe1 ); \
+ Cu1 = E##bu1; \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##ga0 = Bga0 ^((~Bge0)& Bgi0 ); \
+ Ca0 ^= E##ga0; \
+ E##ge0 = Bge0 ^((~Bgi0)& Bgo0 ); \
+ Ce0 ^= E##ge0; \
+ E##gi0 = Bgi0 ^((~Bgo0)& Bgu0 ); \
+ Ci0 ^= E##gi0; \
+ E##go0 = Bgo0 ^((~Bgu0)& Bga0 ); \
+ Co0 ^= E##go0; \
+ E##gu0 = Bgu0 ^((~Bga0)& Bge0 ); \
+ Cu0 ^= E##gu0; \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##ga1 = Bga1 ^((~Bge1)& Bgi1 ); \
+ Ca1 ^= E##ga1; \
+ E##ge1 = Bge1 ^((~Bgi1)& Bgo1 ); \
+ Ce1 ^= E##ge1; \
+ E##gi1 = Bgi1 ^((~Bgo1)& Bgu1 ); \
+ Ci1 ^= E##gi1; \
+ E##go1 = Bgo1 ^((~Bgu1)& Bga1 ); \
+ Co1 ^= E##go1; \
+ E##gu1 = Bgu1 ^((~Bga1)& Bge1 ); \
+ Cu1 ^= E##gu1; \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ka0 = Bka0 ^((~Bke0)& Bki0 ); \
+ Ca0 ^= E##ka0; \
+ E##ke0 = Bke0 ^((~Bki0)& Bko0 ); \
+ Ce0 ^= E##ke0; \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ Ci0 ^= E##ki0; \
+ E##ko0 = Bko0 ^((~Bku0)& Bka0 ); \
+ Co0 ^= E##ko0; \
+ E##ku0 = Bku0 ^((~Bka0)& Bke0 ); \
+ Cu0 ^= E##ku0; \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ka1 = Bka1 ^((~Bke1)& Bki1 ); \
+ Ca1 ^= E##ka1; \
+ E##ke1 = Bke1 ^((~Bki1)& Bko1 ); \
+ Ce1 ^= E##ke1; \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ Ci1 ^= E##ki1; \
+ E##ko1 = Bko1 ^((~Bku1)& Bka1 ); \
+ Co1 ^= E##ko1; \
+ E##ku1 = Bku1 ^((~Bka1)& Bke1 ); \
+ Cu1 ^= E##ku1; \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##ma0 = Bma0 ^((~Bme0)& Bmi0 ); \
+ Ca0 ^= E##ma0; \
+ E##me0 = Bme0 ^((~Bmi0)& Bmo0 ); \
+ Ce0 ^= E##me0; \
+ E##mi0 = Bmi0 ^((~Bmo0)& Bmu0 ); \
+ Ci0 ^= E##mi0; \
+ E##mo0 = Bmo0 ^((~Bmu0)& Bma0 ); \
+ Co0 ^= E##mo0; \
+ E##mu0 = Bmu0 ^((~Bma0)& Bme0 ); \
+ Cu0 ^= E##mu0; \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##ma1 = Bma1 ^((~Bme1)& Bmi1 ); \
+ Ca1 ^= E##ma1; \
+ E##me1 = Bme1 ^((~Bmi1)& Bmo1 ); \
+ Ce1 ^= E##me1; \
+ E##mi1 = Bmi1 ^((~Bmo1)& Bmu1 ); \
+ Ci1 ^= E##mi1; \
+ E##mo1 = Bmo1 ^((~Bmu1)& Bma1 ); \
+ Co1 ^= E##mo1; \
+ E##mu1 = Bmu1 ^((~Bma1)& Bme1 ); \
+ Cu1 ^= E##mu1; \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ Ca0 ^= E##sa0; \
+ E##se0 = Bse0 ^((~Bsi0)& Bso0 ); \
+ Ce0 ^= E##se0; \
+ E##si0 = Bsi0 ^((~Bso0)& Bsu0 ); \
+ Ci0 ^= E##si0; \
+ E##so0 = Bso0 ^((~Bsu0)& Bsa0 ); \
+ Co0 ^= E##so0; \
+ E##su0 = Bsu0 ^((~Bsa0)& Bse0 ); \
+ Cu0 ^= E##su0; \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ Ca1 ^= E##sa1; \
+ E##se1 = Bse1 ^((~Bsi1)& Bso1 ); \
+ Ce1 ^= E##se1; \
+ E##si1 = Bsi1 ^((~Bso1)& Bsu1 ); \
+ Ci1 ^= E##si1; \
+ E##so1 = Bso1 ^((~Bsu1)& Bsa1 ); \
+ Co1 ^= E##so1; \
+ E##su1 = Bsu1 ^((~Bsa1)& Bse1 ); \
+ Cu1 ^= E##su1; \
+\
+
+/* --- Code for round */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##ba0 = Bba0 ^((~Bbe0)& Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ E##be0 = Bbe0 ^((~Bbi0)& Bbo0 ); \
+ E##bi0 = Bbi0 ^((~Bbo0)& Bbu0 ); \
+ E##bo0 = Bbo0 ^((~Bbu0)& Bba0 ); \
+ E##bu0 = Bbu0 ^((~Bba0)& Bbe0 ); \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##ba1 = Bba1 ^((~Bbe1)& Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ E##be1 = Bbe1 ^((~Bbi1)& Bbo1 ); \
+ E##bi1 = Bbi1 ^((~Bbo1)& Bbu1 ); \
+ E##bo1 = Bbo1 ^((~Bbu1)& Bba1 ); \
+ E##bu1 = Bbu1 ^((~Bba1)& Bbe1 ); \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##ga0 = Bga0 ^((~Bge0)& Bgi0 ); \
+ E##ge0 = Bge0 ^((~Bgi0)& Bgo0 ); \
+ E##gi0 = Bgi0 ^((~Bgo0)& Bgu0 ); \
+ E##go0 = Bgo0 ^((~Bgu0)& Bga0 ); \
+ E##gu0 = Bgu0 ^((~Bga0)& Bge0 ); \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##ga1 = Bga1 ^((~Bge1)& Bgi1 ); \
+ E##ge1 = Bge1 ^((~Bgi1)& Bgo1 ); \
+ E##gi1 = Bgi1 ^((~Bgo1)& Bgu1 ); \
+ E##go1 = Bgo1 ^((~Bgu1)& Bga1 ); \
+ E##gu1 = Bgu1 ^((~Bga1)& Bge1 ); \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ka0 = Bka0 ^((~Bke0)& Bki0 ); \
+ E##ke0 = Bke0 ^((~Bki0)& Bko0 ); \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ E##ko0 = Bko0 ^((~Bku0)& Bka0 ); \
+ E##ku0 = Bku0 ^((~Bka0)& Bke0 ); \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ka1 = Bka1 ^((~Bke1)& Bki1 ); \
+ E##ke1 = Bke1 ^((~Bki1)& Bko1 ); \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ E##ko1 = Bko1 ^((~Bku1)& Bka1 ); \
+ E##ku1 = Bku1 ^((~Bka1)& Bke1 ); \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##ma0 = Bma0 ^((~Bme0)& Bmi0 ); \
+ E##me0 = Bme0 ^((~Bmi0)& Bmo0 ); \
+ E##mi0 = Bmi0 ^((~Bmo0)& Bmu0 ); \
+ E##mo0 = Bmo0 ^((~Bmu0)& Bma0 ); \
+ E##mu0 = Bmu0 ^((~Bma0)& Bme0 ); \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##ma1 = Bma1 ^((~Bme1)& Bmi1 ); \
+ E##me1 = Bme1 ^((~Bmi1)& Bmo1 ); \
+ E##mi1 = Bmi1 ^((~Bmo1)& Bmu1 ); \
+ E##mo1 = Bmo1 ^((~Bmu1)& Bma1 ); \
+ E##mu1 = Bmu1 ^((~Bma1)& Bme1 ); \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ E##se0 = Bse0 ^((~Bsi0)& Bso0 ); \
+ E##si0 = Bsi0 ^((~Bso0)& Bsu0 ); \
+ E##so0 = Bso0 ^((~Bsu0)& Bsa0 ); \
+ E##su0 = Bsu0 ^((~Bsa0)& Bse0 ); \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ E##se1 = Bse1 ^((~Bsi1)& Bso1 ); \
+ E##si1 = Bsi1 ^((~Bso1)& Bsu1 ); \
+ E##so1 = Bso1 ^((~Bsu1)& Bsa1 ); \
+ E##su1 = Bsu1 ^((~Bsa1)& Bse1 ); \
+\
+
+#endif /* UseBebigokimisa */
+
+const UINT32 KeccakF1600RoundConstants_int2_0[24] = {
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000000UL };
+
+const UINT32 KeccakF1600RoundConstants_int2_1[24] = {
+ 0x00000000UL,
+ 0x00000089UL,
+ 0x8000008bUL,
+ 0x80008080UL,
+ 0x0000008bUL,
+ 0x00008000UL,
+ 0x80008088UL,
+ 0x80000082UL,
+ 0x0000000bUL,
+ 0x0000000aUL,
+ 0x00008082UL,
+ 0x00008003UL,
+ 0x0000808bUL,
+ 0x8000000bUL,
+ 0x8000008aUL,
+ 0x80000081UL,
+ 0x80000081UL,
+ 0x80000008UL,
+ 0x00000083UL,
+ 0x80008003UL,
+ 0x80008088UL,
+ 0x80000088UL,
+ 0x00008000UL,
+ 0x80008082UL };
+
+#define copyFromStateAndXor1024bits(X, state, input) \
+ X##ba0 = state[ 0]^input[ 0]; \
+ X##ba1 = state[ 1]^input[ 1]; \
+ X##be0 = state[ 2]^input[ 2]; \
+ X##be1 = state[ 3]^input[ 3]; \
+ X##bi0 = state[ 4]^input[ 4]; \
+ X##bi1 = state[ 5]^input[ 5]; \
+ X##bo0 = state[ 6]^input[ 6]; \
+ X##bo1 = state[ 7]^input[ 7]; \
+ X##bu0 = state[ 8]^input[ 8]; \
+ X##bu1 = state[ 9]^input[ 9]; \
+ X##ga0 = state[10]^input[10]; \
+ X##ga1 = state[11]^input[11]; \
+ X##ge0 = state[12]^input[12]; \
+ X##ge1 = state[13]^input[13]; \
+ X##gi0 = state[14]^input[14]; \
+ X##gi1 = state[15]^input[15]; \
+ X##go0 = state[16]^input[16]; \
+ X##go1 = state[17]^input[17]; \
+ X##gu0 = state[18]^input[18]; \
+ X##gu1 = state[19]^input[19]; \
+ X##ka0 = state[20]^input[20]; \
+ X##ka1 = state[21]^input[21]; \
+ X##ke0 = state[22]^input[22]; \
+ X##ke1 = state[23]^input[23]; \
+ X##ki0 = state[24]^input[24]; \
+ X##ki1 = state[25]^input[25]; \
+ X##ko0 = state[26]^input[26]; \
+ X##ko1 = state[27]^input[27]; \
+ X##ku0 = state[28]^input[28]; \
+ X##ku1 = state[29]^input[29]; \
+ X##ma0 = state[30]^input[30]; \
+ X##ma1 = state[31]^input[31]; \
+ X##me0 = state[32]; \
+ X##me1 = state[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyFromStateAndXor1088bits(X, state, input) \
+ X##ba0 = state[ 0]^input[ 0]; \
+ X##ba1 = state[ 1]^input[ 1]; \
+ X##be0 = state[ 2]^input[ 2]; \
+ X##be1 = state[ 3]^input[ 3]; \
+ X##bi0 = state[ 4]^input[ 4]; \
+ X##bi1 = state[ 5]^input[ 5]; \
+ X##bo0 = state[ 6]^input[ 6]; \
+ X##bo1 = state[ 7]^input[ 7]; \
+ X##bu0 = state[ 8]^input[ 8]; \
+ X##bu1 = state[ 9]^input[ 9]; \
+ X##ga0 = state[10]^input[10]; \
+ X##ga1 = state[11]^input[11]; \
+ X##ge0 = state[12]^input[12]; \
+ X##ge1 = state[13]^input[13]; \
+ X##gi0 = state[14]^input[14]; \
+ X##gi1 = state[15]^input[15]; \
+ X##go0 = state[16]^input[16]; \
+ X##go1 = state[17]^input[17]; \
+ X##gu0 = state[18]^input[18]; \
+ X##gu1 = state[19]^input[19]; \
+ X##ka0 = state[20]^input[20]; \
+ X##ka1 = state[21]^input[21]; \
+ X##ke0 = state[22]^input[22]; \
+ X##ke1 = state[23]^input[23]; \
+ X##ki0 = state[24]^input[24]; \
+ X##ki1 = state[25]^input[25]; \
+ X##ko0 = state[26]^input[26]; \
+ X##ko1 = state[27]^input[27]; \
+ X##ku0 = state[28]^input[28]; \
+ X##ku1 = state[29]^input[29]; \
+ X##ma0 = state[30]^input[30]; \
+ X##ma1 = state[31]^input[31]; \
+ X##me0 = state[32]^input[32]; \
+ X##me1 = state[33]^input[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyFromState(X, state) \
+ X##ba0 = state[ 0]; \
+ X##ba1 = state[ 1]; \
+ X##be0 = state[ 2]; \
+ X##be1 = state[ 3]; \
+ X##bi0 = state[ 4]; \
+ X##bi1 = state[ 5]; \
+ X##bo0 = state[ 6]; \
+ X##bo1 = state[ 7]; \
+ X##bu0 = state[ 8]; \
+ X##bu1 = state[ 9]; \
+ X##ga0 = state[10]; \
+ X##ga1 = state[11]; \
+ X##ge0 = state[12]; \
+ X##ge1 = state[13]; \
+ X##gi0 = state[14]; \
+ X##gi1 = state[15]; \
+ X##go0 = state[16]; \
+ X##go1 = state[17]; \
+ X##gu0 = state[18]; \
+ X##gu1 = state[19]; \
+ X##ka0 = state[20]; \
+ X##ka1 = state[21]; \
+ X##ke0 = state[22]; \
+ X##ke1 = state[23]; \
+ X##ki0 = state[24]; \
+ X##ki1 = state[25]; \
+ X##ko0 = state[26]; \
+ X##ko1 = state[27]; \
+ X##ku0 = state[28]; \
+ X##ku1 = state[29]; \
+ X##ma0 = state[30]; \
+ X##ma1 = state[31]; \
+ X##me0 = state[32]; \
+ X##me1 = state[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyToState(state, X) \
+ state[ 0] = X##ba0; \
+ state[ 1] = X##ba1; \
+ state[ 2] = X##be0; \
+ state[ 3] = X##be1; \
+ state[ 4] = X##bi0; \
+ state[ 5] = X##bi1; \
+ state[ 6] = X##bo0; \
+ state[ 7] = X##bo1; \
+ state[ 8] = X##bu0; \
+ state[ 9] = X##bu1; \
+ state[10] = X##ga0; \
+ state[11] = X##ga1; \
+ state[12] = X##ge0; \
+ state[13] = X##ge1; \
+ state[14] = X##gi0; \
+ state[15] = X##gi1; \
+ state[16] = X##go0; \
+ state[17] = X##go1; \
+ state[18] = X##gu0; \
+ state[19] = X##gu1; \
+ state[20] = X##ka0; \
+ state[21] = X##ka1; \
+ state[22] = X##ke0; \
+ state[23] = X##ke1; \
+ state[24] = X##ki0; \
+ state[25] = X##ki1; \
+ state[26] = X##ko0; \
+ state[27] = X##ko1; \
+ state[28] = X##ku0; \
+ state[29] = X##ku1; \
+ state[30] = X##ma0; \
+ state[31] = X##ma1; \
+ state[32] = X##me0; \
+ state[33] = X##me1; \
+ state[34] = X##mi0; \
+ state[35] = X##mi1; \
+ state[36] = X##mo0; \
+ state[37] = X##mo1; \
+ state[38] = X##mu0; \
+ state[39] = X##mu1; \
+ state[40] = X##sa0; \
+ state[41] = X##sa1; \
+ state[42] = X##se0; \
+ state[43] = X##se1; \
+ state[44] = X##si0; \
+ state[45] = X##si1; \
+ state[46] = X##so0; \
+ state[47] = X##so1; \
+ state[48] = X##su0; \
+ state[49] = X##su1; \
+
+#define copyStateVariables(X, Y) \
+ X##ba0 = Y##ba0; \
+ X##ba1 = Y##ba1; \
+ X##be0 = Y##be0; \
+ X##be1 = Y##be1; \
+ X##bi0 = Y##bi0; \
+ X##bi1 = Y##bi1; \
+ X##bo0 = Y##bo0; \
+ X##bo1 = Y##bo1; \
+ X##bu0 = Y##bu0; \
+ X##bu1 = Y##bu1; \
+ X##ga0 = Y##ga0; \
+ X##ga1 = Y##ga1; \
+ X##ge0 = Y##ge0; \
+ X##ge1 = Y##ge1; \
+ X##gi0 = Y##gi0; \
+ X##gi1 = Y##gi1; \
+ X##go0 = Y##go0; \
+ X##go1 = Y##go1; \
+ X##gu0 = Y##gu0; \
+ X##gu1 = Y##gu1; \
+ X##ka0 = Y##ka0; \
+ X##ka1 = Y##ka1; \
+ X##ke0 = Y##ke0; \
+ X##ke1 = Y##ke1; \
+ X##ki0 = Y##ki0; \
+ X##ki1 = Y##ki1; \
+ X##ko0 = Y##ko0; \
+ X##ko1 = Y##ko1; \
+ X##ku0 = Y##ku0; \
+ X##ku1 = Y##ku1; \
+ X##ma0 = Y##ma0; \
+ X##ma1 = Y##ma1; \
+ X##me0 = Y##me0; \
+ X##me1 = Y##me1; \
+ X##mi0 = Y##mi0; \
+ X##mi1 = Y##mi1; \
+ X##mo0 = Y##mo0; \
+ X##mo1 = Y##mo1; \
+ X##mu0 = Y##mu0; \
+ X##mu1 = Y##mu1; \
+ X##sa0 = Y##sa0; \
+ X##sa1 = Y##sa1; \
+ X##se0 = Y##se0; \
+ X##se1 = Y##se1; \
+ X##si0 = Y##si0; \
+ X##si1 = Y##si1; \
+ X##so0 = Y##so0; \
+ X##so1 = Y##so1; \
+ X##su0 = Y##su0; \
+ X##su1 = Y##su1; \
+
diff --git a/Modules/_sha3/keccak/KeccakF-1600-32-s2.macros b/Modules/_sha3/keccak/KeccakF-1600-32-s2.macros
new file mode 100644
index 0000000..fa11762
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-32-s2.macros
@@ -0,0 +1,1187 @@
+/*
+Code automatically generated by KeccakTools!
+
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#define declareABCDE \
+ UINT32 Aba0, Abe0, Abi0, Abo0, Abu0; \
+ UINT32 Aba1, Abe1, Abi1, Abo1, Abu1; \
+ UINT32 Aga0, Age0, Agi0, Ago0, Agu0; \
+ UINT32 Aga1, Age1, Agi1, Ago1, Agu1; \
+ UINT32 Aka0, Ake0, Aki0, Ako0, Aku0; \
+ UINT32 Aka1, Ake1, Aki1, Ako1, Aku1; \
+ UINT32 Ama0, Ame0, Ami0, Amo0, Amu0; \
+ UINT32 Ama1, Ame1, Ami1, Amo1, Amu1; \
+ UINT32 Asa0, Ase0, Asi0, Aso0, Asu0; \
+ UINT32 Asa1, Ase1, Asi1, Aso1, Asu1; \
+ UINT32 Bba0, Bbe0, Bbi0, Bbo0, Bbu0; \
+ UINT32 Bba1, Bbe1, Bbi1, Bbo1, Bbu1; \
+ UINT32 Bga0, Bge0, Bgi0, Bgo0, Bgu0; \
+ UINT32 Bga1, Bge1, Bgi1, Bgo1, Bgu1; \
+ UINT32 Bka0, Bke0, Bki0, Bko0, Bku0; \
+ UINT32 Bka1, Bke1, Bki1, Bko1, Bku1; \
+ UINT32 Bma0, Bme0, Bmi0, Bmo0, Bmu0; \
+ UINT32 Bma1, Bme1, Bmi1, Bmo1, Bmu1; \
+ UINT32 Bsa0, Bse0, Bsi0, Bso0, Bsu0; \
+ UINT32 Bsa1, Bse1, Bsi1, Bso1, Bsu1; \
+ UINT32 Ca0, Ce0, Ci0, Co0, Cu0; \
+ UINT32 Ca1, Ce1, Ci1, Co1, Cu1; \
+ UINT32 Da0, De0, Di0, Do0, Du0; \
+ UINT32 Da1, De1, Di1, Do1, Du1; \
+ UINT32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; \
+ UINT32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; \
+ UINT32 Ega0, Ege0, Egi0, Ego0, Egu0; \
+ UINT32 Ega1, Ege1, Egi1, Ego1, Egu1; \
+ UINT32 Eka0, Eke0, Eki0, Eko0, Eku0; \
+ UINT32 Eka1, Eke1, Eki1, Eko1, Eku1; \
+ UINT32 Ema0, Eme0, Emi0, Emo0, Emu0; \
+ UINT32 Ema1, Eme1, Emi1, Emo1, Emu1; \
+ UINT32 Esa0, Ese0, Esi0, Eso0, Esu0; \
+ UINT32 Esa1, Ese1, Esi1, Eso1, Esu1; \
+
+#define prepareTheta \
+ Ca0 = Aba0^Aga0^Aka0^Ama0^Asa0; \
+ Ca1 = Aba1^Aga1^Aka1^Ama1^Asa1; \
+ Ce0 = Abe0^Age0^Ake0^Ame0^Ase0; \
+ Ce1 = Abe1^Age1^Ake1^Ame1^Ase1; \
+ Ci0 = Abi0^Agi0^Aki0^Ami0^Asi0; \
+ Ci1 = Abi1^Agi1^Aki1^Ami1^Asi1; \
+ Co0 = Abo0^Ago0^Ako0^Amo0^Aso0; \
+ Co1 = Abo1^Ago1^Ako1^Amo1^Aso1; \
+ Cu0 = Abu0^Agu0^Aku0^Amu0^Asu0; \
+ Cu1 = Abu1^Agu1^Aku1^Amu1^Asu1; \
+
+#ifdef UseBebigokimisa
+/* --- Code for round, with prepare-theta (lane complementing pattern 'bebigokimisa') */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ E##ba0 = Bba0 ^( Bbe0 | Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ Ca0 = E##ba0; \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ E##be0 = Bbe0 ^((~Bbi0)| Bbo0 ); \
+ Ce0 = E##be0; \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##bi0 = Bbi0 ^( Bbo0 & Bbu0 ); \
+ Ci0 = E##bi0; \
+ E##bo0 = Bbo0 ^( Bbu0 | Bba0 ); \
+ Co0 = E##bo0; \
+ E##bu0 = Bbu0 ^( Bba0 & Bbe0 ); \
+ Cu0 = E##bu0; \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ E##ba1 = Bba1 ^( Bbe1 | Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ Ca1 = E##ba1; \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ E##be1 = Bbe1 ^((~Bbi1)| Bbo1 ); \
+ Ce1 = E##be1; \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##bi1 = Bbi1 ^( Bbo1 & Bbu1 ); \
+ Ci1 = E##bi1; \
+ E##bo1 = Bbo1 ^( Bbu1 | Bba1 ); \
+ Co1 = E##bo1; \
+ E##bu1 = Bbu1 ^( Bba1 & Bbe1 ); \
+ Cu1 = E##bu1; \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ E##ga0 = Bga0 ^( Bge0 | Bgi0 ); \
+ Ca0 ^= E##ga0; \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ E##ge0 = Bge0 ^( Bgi0 & Bgo0 ); \
+ Ce0 ^= E##ge0; \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##gi0 = Bgi0 ^( Bgo0 |(~Bgu0)); \
+ Ci0 ^= E##gi0; \
+ E##go0 = Bgo0 ^( Bgu0 | Bga0 ); \
+ Co0 ^= E##go0; \
+ E##gu0 = Bgu0 ^( Bga0 & Bge0 ); \
+ Cu0 ^= E##gu0; \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ E##ga1 = Bga1 ^( Bge1 | Bgi1 ); \
+ Ca1 ^= E##ga1; \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ E##ge1 = Bge1 ^( Bgi1 & Bgo1 ); \
+ Ce1 ^= E##ge1; \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##gi1 = Bgi1 ^( Bgo1 |(~Bgu1)); \
+ Ci1 ^= E##gi1; \
+ E##go1 = Bgo1 ^( Bgu1 | Bga1 ); \
+ Co1 ^= E##go1; \
+ E##gu1 = Bgu1 ^( Bga1 & Bge1 ); \
+ Cu1 ^= E##gu1; \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ E##ka0 = Bka0 ^( Bke0 | Bki0 ); \
+ Ca0 ^= E##ka0; \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ E##ke0 = Bke0 ^( Bki0 & Bko0 ); \
+ Ce0 ^= E##ke0; \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ Ci0 ^= E##ki0; \
+ E##ko0 = (~Bko0)^( Bku0 | Bka0 ); \
+ Co0 ^= E##ko0; \
+ E##ku0 = Bku0 ^( Bka0 & Bke0 ); \
+ Cu0 ^= E##ku0; \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ E##ka1 = Bka1 ^( Bke1 | Bki1 ); \
+ Ca1 ^= E##ka1; \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ E##ke1 = Bke1 ^( Bki1 & Bko1 ); \
+ Ce1 ^= E##ke1; \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ Ci1 ^= E##ki1; \
+ E##ko1 = (~Bko1)^( Bku1 | Bka1 ); \
+ Co1 ^= E##ko1; \
+ E##ku1 = Bku1 ^( Bka1 & Bke1 ); \
+ Cu1 ^= E##ku1; \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ E##ma0 = Bma0 ^( Bme0 & Bmi0 ); \
+ Ca0 ^= E##ma0; \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ E##me0 = Bme0 ^( Bmi0 | Bmo0 ); \
+ Ce0 ^= E##me0; \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##mi0 = Bmi0 ^((~Bmo0)| Bmu0 ); \
+ Ci0 ^= E##mi0; \
+ E##mo0 = (~Bmo0)^( Bmu0 & Bma0 ); \
+ Co0 ^= E##mo0; \
+ E##mu0 = Bmu0 ^( Bma0 | Bme0 ); \
+ Cu0 ^= E##mu0; \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ E##ma1 = Bma1 ^( Bme1 & Bmi1 ); \
+ Ca1 ^= E##ma1; \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ E##me1 = Bme1 ^( Bmi1 | Bmo1 ); \
+ Ce1 ^= E##me1; \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##mi1 = Bmi1 ^((~Bmo1)| Bmu1 ); \
+ Ci1 ^= E##mi1; \
+ E##mo1 = (~Bmo1)^( Bmu1 & Bma1 ); \
+ Co1 ^= E##mo1; \
+ E##mu1 = Bmu1 ^( Bma1 | Bme1 ); \
+ Cu1 ^= E##mu1; \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ Ca0 ^= E##sa0; \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ E##se0 = (~Bse0)^( Bsi0 | Bso0 ); \
+ Ce0 ^= E##se0; \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##si0 = Bsi0 ^( Bso0 & Bsu0 ); \
+ Ci0 ^= E##si0; \
+ E##so0 = Bso0 ^( Bsu0 | Bsa0 ); \
+ Co0 ^= E##so0; \
+ E##su0 = Bsu0 ^( Bsa0 & Bse0 ); \
+ Cu0 ^= E##su0; \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ Ca1 ^= E##sa1; \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ E##se1 = (~Bse1)^( Bsi1 | Bso1 ); \
+ Ce1 ^= E##se1; \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##si1 = Bsi1 ^( Bso1 & Bsu1 ); \
+ Ci1 ^= E##si1; \
+ E##so1 = Bso1 ^( Bsu1 | Bsa1 ); \
+ Co1 ^= E##so1; \
+ E##su1 = Bsu1 ^( Bsa1 & Bse1 ); \
+ Cu1 ^= E##su1; \
+\
+
+/* --- Code for round (lane complementing pattern 'bebigokimisa') */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ E##ba0 = Bba0 ^( Bbe0 | Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ E##be0 = Bbe0 ^((~Bbi0)| Bbo0 ); \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##bi0 = Bbi0 ^( Bbo0 & Bbu0 ); \
+ E##bo0 = Bbo0 ^( Bbu0 | Bba0 ); \
+ E##bu0 = Bbu0 ^( Bba0 & Bbe0 ); \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ E##ba1 = Bba1 ^( Bbe1 | Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ E##be1 = Bbe1 ^((~Bbi1)| Bbo1 ); \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##bi1 = Bbi1 ^( Bbo1 & Bbu1 ); \
+ E##bo1 = Bbo1 ^( Bbu1 | Bba1 ); \
+ E##bu1 = Bbu1 ^( Bba1 & Bbe1 ); \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ E##ga0 = Bga0 ^( Bge0 | Bgi0 ); \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ E##ge0 = Bge0 ^( Bgi0 & Bgo0 ); \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##gi0 = Bgi0 ^( Bgo0 |(~Bgu0)); \
+ E##go0 = Bgo0 ^( Bgu0 | Bga0 ); \
+ E##gu0 = Bgu0 ^( Bga0 & Bge0 ); \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ E##ga1 = Bga1 ^( Bge1 | Bgi1 ); \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ E##ge1 = Bge1 ^( Bgi1 & Bgo1 ); \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##gi1 = Bgi1 ^( Bgo1 |(~Bgu1)); \
+ E##go1 = Bgo1 ^( Bgu1 | Bga1 ); \
+ E##gu1 = Bgu1 ^( Bga1 & Bge1 ); \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ E##ka0 = Bka0 ^( Bke0 | Bki0 ); \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ E##ke0 = Bke0 ^( Bki0 & Bko0 ); \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ E##ko0 = (~Bko0)^( Bku0 | Bka0 ); \
+ E##ku0 = Bku0 ^( Bka0 & Bke0 ); \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ E##ka1 = Bka1 ^( Bke1 | Bki1 ); \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ E##ke1 = Bke1 ^( Bki1 & Bko1 ); \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ E##ko1 = (~Bko1)^( Bku1 | Bka1 ); \
+ E##ku1 = Bku1 ^( Bka1 & Bke1 ); \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ E##ma0 = Bma0 ^( Bme0 & Bmi0 ); \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ E##me0 = Bme0 ^( Bmi0 | Bmo0 ); \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##mi0 = Bmi0 ^((~Bmo0)| Bmu0 ); \
+ E##mo0 = (~Bmo0)^( Bmu0 & Bma0 ); \
+ E##mu0 = Bmu0 ^( Bma0 | Bme0 ); \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ E##ma1 = Bma1 ^( Bme1 & Bmi1 ); \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ E##me1 = Bme1 ^( Bmi1 | Bmo1 ); \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##mi1 = Bmi1 ^((~Bmo1)| Bmu1 ); \
+ E##mo1 = (~Bmo1)^( Bmu1 & Bma1 ); \
+ E##mu1 = Bmu1 ^( Bma1 | Bme1 ); \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ E##se0 = (~Bse0)^( Bsi0 | Bso0 ); \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##si0 = Bsi0 ^( Bso0 & Bsu0 ); \
+ E##so0 = Bso0 ^( Bsu0 | Bsa0 ); \
+ E##su0 = Bsu0 ^( Bsa0 & Bse0 ); \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ E##se1 = (~Bse1)^( Bsi1 | Bso1 ); \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##si1 = Bsi1 ^( Bso1 & Bsu1 ); \
+ E##so1 = Bso1 ^( Bsu1 | Bsa1 ); \
+ E##su1 = Bsu1 ^( Bsa1 & Bse1 ); \
+\
+
+#else /* UseBebigokimisa */
+/* --- Code for round, with prepare-theta */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ E##ba0 = Bba0 ^((~Bbe0)& Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ Ca0 = E##ba0; \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ E##be0 = Bbe0 ^((~Bbi0)& Bbo0 ); \
+ Ce0 = E##be0; \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##bi0 = Bbi0 ^((~Bbo0)& Bbu0 ); \
+ Ci0 = E##bi0; \
+ E##bo0 = Bbo0 ^((~Bbu0)& Bba0 ); \
+ Co0 = E##bo0; \
+ E##bu0 = Bbu0 ^((~Bba0)& Bbe0 ); \
+ Cu0 = E##bu0; \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ E##ba1 = Bba1 ^((~Bbe1)& Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ Ca1 = E##ba1; \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ E##be1 = Bbe1 ^((~Bbi1)& Bbo1 ); \
+ Ce1 = E##be1; \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##bi1 = Bbi1 ^((~Bbo1)& Bbu1 ); \
+ Ci1 = E##bi1; \
+ E##bo1 = Bbo1 ^((~Bbu1)& Bba1 ); \
+ Co1 = E##bo1; \
+ E##bu1 = Bbu1 ^((~Bba1)& Bbe1 ); \
+ Cu1 = E##bu1; \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ E##ga0 = Bga0 ^((~Bge0)& Bgi0 ); \
+ Ca0 ^= E##ga0; \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ E##ge0 = Bge0 ^((~Bgi0)& Bgo0 ); \
+ Ce0 ^= E##ge0; \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##gi0 = Bgi0 ^((~Bgo0)& Bgu0 ); \
+ Ci0 ^= E##gi0; \
+ E##go0 = Bgo0 ^((~Bgu0)& Bga0 ); \
+ Co0 ^= E##go0; \
+ E##gu0 = Bgu0 ^((~Bga0)& Bge0 ); \
+ Cu0 ^= E##gu0; \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ E##ga1 = Bga1 ^((~Bge1)& Bgi1 ); \
+ Ca1 ^= E##ga1; \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ E##ge1 = Bge1 ^((~Bgi1)& Bgo1 ); \
+ Ce1 ^= E##ge1; \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##gi1 = Bgi1 ^((~Bgo1)& Bgu1 ); \
+ Ci1 ^= E##gi1; \
+ E##go1 = Bgo1 ^((~Bgu1)& Bga1 ); \
+ Co1 ^= E##go1; \
+ E##gu1 = Bgu1 ^((~Bga1)& Bge1 ); \
+ Cu1 ^= E##gu1; \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ E##ka0 = Bka0 ^((~Bke0)& Bki0 ); \
+ Ca0 ^= E##ka0; \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ E##ke0 = Bke0 ^((~Bki0)& Bko0 ); \
+ Ce0 ^= E##ke0; \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ Ci0 ^= E##ki0; \
+ E##ko0 = Bko0 ^((~Bku0)& Bka0 ); \
+ Co0 ^= E##ko0; \
+ E##ku0 = Bku0 ^((~Bka0)& Bke0 ); \
+ Cu0 ^= E##ku0; \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ E##ka1 = Bka1 ^((~Bke1)& Bki1 ); \
+ Ca1 ^= E##ka1; \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ E##ke1 = Bke1 ^((~Bki1)& Bko1 ); \
+ Ce1 ^= E##ke1; \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ Ci1 ^= E##ki1; \
+ E##ko1 = Bko1 ^((~Bku1)& Bka1 ); \
+ Co1 ^= E##ko1; \
+ E##ku1 = Bku1 ^((~Bka1)& Bke1 ); \
+ Cu1 ^= E##ku1; \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ E##ma0 = Bma0 ^((~Bme0)& Bmi0 ); \
+ Ca0 ^= E##ma0; \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ E##me0 = Bme0 ^((~Bmi0)& Bmo0 ); \
+ Ce0 ^= E##me0; \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##mi0 = Bmi0 ^((~Bmo0)& Bmu0 ); \
+ Ci0 ^= E##mi0; \
+ E##mo0 = Bmo0 ^((~Bmu0)& Bma0 ); \
+ Co0 ^= E##mo0; \
+ E##mu0 = Bmu0 ^((~Bma0)& Bme0 ); \
+ Cu0 ^= E##mu0; \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ E##ma1 = Bma1 ^((~Bme1)& Bmi1 ); \
+ Ca1 ^= E##ma1; \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ E##me1 = Bme1 ^((~Bmi1)& Bmo1 ); \
+ Ce1 ^= E##me1; \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##mi1 = Bmi1 ^((~Bmo1)& Bmu1 ); \
+ Ci1 ^= E##mi1; \
+ E##mo1 = Bmo1 ^((~Bmu1)& Bma1 ); \
+ Co1 ^= E##mo1; \
+ E##mu1 = Bmu1 ^((~Bma1)& Bme1 ); \
+ Cu1 ^= E##mu1; \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ Ca0 ^= E##sa0; \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ E##se0 = Bse0 ^((~Bsi0)& Bso0 ); \
+ Ce0 ^= E##se0; \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##si0 = Bsi0 ^((~Bso0)& Bsu0 ); \
+ Ci0 ^= E##si0; \
+ E##so0 = Bso0 ^((~Bsu0)& Bsa0 ); \
+ Co0 ^= E##so0; \
+ E##su0 = Bsu0 ^((~Bsa0)& Bse0 ); \
+ Cu0 ^= E##su0; \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ Ca1 ^= E##sa1; \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ E##se1 = Bse1 ^((~Bsi1)& Bso1 ); \
+ Ce1 ^= E##se1; \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##si1 = Bsi1 ^((~Bso1)& Bsu1 ); \
+ Ci1 ^= E##si1; \
+ E##so1 = Bso1 ^((~Bsu1)& Bsa1 ); \
+ Co1 ^= E##so1; \
+ E##su1 = Bsu1 ^((~Bsa1)& Bse1 ); \
+ Cu1 ^= E##su1; \
+\
+
+/* --- Code for round */
+/* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da0 = Cu0^ROL32(Ce1, 1); \
+ Da1 = Cu1^Ce0; \
+ De0 = Ca0^ROL32(Ci1, 1); \
+ De1 = Ca1^Ci0; \
+ Di0 = Ce0^ROL32(Co1, 1); \
+ Di1 = Ce1^Co0; \
+ Do0 = Ci0^ROL32(Cu1, 1); \
+ Do1 = Ci1^Cu0; \
+ Du0 = Co0^ROL32(Ca1, 1); \
+ Du1 = Co1^Ca0; \
+\
+ A##ba0 ^= Da0; \
+ Bba0 = A##ba0; \
+ A##ge0 ^= De0; \
+ Bbe0 = ROL32(A##ge0, 22); \
+ A##ki1 ^= Di1; \
+ Bbi0 = ROL32(A##ki1, 22); \
+ E##ba0 = Bba0 ^((~Bbe0)& Bbi0 ); \
+ E##ba0 ^= KeccakF1600RoundConstants_int2_0[i]; \
+ A##mo1 ^= Do1; \
+ Bbo0 = ROL32(A##mo1, 11); \
+ E##be0 = Bbe0 ^((~Bbi0)& Bbo0 ); \
+ A##su0 ^= Du0; \
+ Bbu0 = ROL32(A##su0, 7); \
+ E##bi0 = Bbi0 ^((~Bbo0)& Bbu0 ); \
+ E##bo0 = Bbo0 ^((~Bbu0)& Bba0 ); \
+ E##bu0 = Bbu0 ^((~Bba0)& Bbe0 ); \
+\
+ A##ba1 ^= Da1; \
+ Bba1 = A##ba1; \
+ A##ge1 ^= De1; \
+ Bbe1 = ROL32(A##ge1, 22); \
+ A##ki0 ^= Di0; \
+ Bbi1 = ROL32(A##ki0, 21); \
+ E##ba1 = Bba1 ^((~Bbe1)& Bbi1 ); \
+ E##ba1 ^= KeccakF1600RoundConstants_int2_1[i]; \
+ A##mo0 ^= Do0; \
+ Bbo1 = ROL32(A##mo0, 10); \
+ E##be1 = Bbe1 ^((~Bbi1)& Bbo1 ); \
+ A##su1 ^= Du1; \
+ Bbu1 = ROL32(A##su1, 7); \
+ E##bi1 = Bbi1 ^((~Bbo1)& Bbu1 ); \
+ E##bo1 = Bbo1 ^((~Bbu1)& Bba1 ); \
+ E##bu1 = Bbu1 ^((~Bba1)& Bbe1 ); \
+\
+ A##bo0 ^= Do0; \
+ Bga0 = ROL32(A##bo0, 14); \
+ A##gu0 ^= Du0; \
+ Bge0 = ROL32(A##gu0, 10); \
+ A##ka1 ^= Da1; \
+ Bgi0 = ROL32(A##ka1, 2); \
+ E##ga0 = Bga0 ^((~Bge0)& Bgi0 ); \
+ A##me1 ^= De1; \
+ Bgo0 = ROL32(A##me1, 23); \
+ E##ge0 = Bge0 ^((~Bgi0)& Bgo0 ); \
+ A##si1 ^= Di1; \
+ Bgu0 = ROL32(A##si1, 31); \
+ E##gi0 = Bgi0 ^((~Bgo0)& Bgu0 ); \
+ E##go0 = Bgo0 ^((~Bgu0)& Bga0 ); \
+ E##gu0 = Bgu0 ^((~Bga0)& Bge0 ); \
+\
+ A##bo1 ^= Do1; \
+ Bga1 = ROL32(A##bo1, 14); \
+ A##gu1 ^= Du1; \
+ Bge1 = ROL32(A##gu1, 10); \
+ A##ka0 ^= Da0; \
+ Bgi1 = ROL32(A##ka0, 1); \
+ E##ga1 = Bga1 ^((~Bge1)& Bgi1 ); \
+ A##me0 ^= De0; \
+ Bgo1 = ROL32(A##me0, 22); \
+ E##ge1 = Bge1 ^((~Bgi1)& Bgo1 ); \
+ A##si0 ^= Di0; \
+ Bgu1 = ROL32(A##si0, 30); \
+ E##gi1 = Bgi1 ^((~Bgo1)& Bgu1 ); \
+ E##go1 = Bgo1 ^((~Bgu1)& Bga1 ); \
+ E##gu1 = Bgu1 ^((~Bga1)& Bge1 ); \
+\
+ A##be1 ^= De1; \
+ Bka0 = ROL32(A##be1, 1); \
+ A##gi0 ^= Di0; \
+ Bke0 = ROL32(A##gi0, 3); \
+ A##ko1 ^= Do1; \
+ Bki0 = ROL32(A##ko1, 13); \
+ E##ka0 = Bka0 ^((~Bke0)& Bki0 ); \
+ A##mu0 ^= Du0; \
+ Bko0 = ROL32(A##mu0, 4); \
+ E##ke0 = Bke0 ^((~Bki0)& Bko0 ); \
+ A##sa0 ^= Da0; \
+ Bku0 = ROL32(A##sa0, 9); \
+ E##ki0 = Bki0 ^((~Bko0)& Bku0 ); \
+ E##ko0 = Bko0 ^((~Bku0)& Bka0 ); \
+ E##ku0 = Bku0 ^((~Bka0)& Bke0 ); \
+\
+ A##be0 ^= De0; \
+ Bka1 = A##be0; \
+ A##gi1 ^= Di1; \
+ Bke1 = ROL32(A##gi1, 3); \
+ A##ko0 ^= Do0; \
+ Bki1 = ROL32(A##ko0, 12); \
+ E##ka1 = Bka1 ^((~Bke1)& Bki1 ); \
+ A##mu1 ^= Du1; \
+ Bko1 = ROL32(A##mu1, 4); \
+ E##ke1 = Bke1 ^((~Bki1)& Bko1 ); \
+ A##sa1 ^= Da1; \
+ Bku1 = ROL32(A##sa1, 9); \
+ E##ki1 = Bki1 ^((~Bko1)& Bku1 ); \
+ E##ko1 = Bko1 ^((~Bku1)& Bka1 ); \
+ E##ku1 = Bku1 ^((~Bka1)& Bke1 ); \
+\
+ A##bu1 ^= Du1; \
+ Bma0 = ROL32(A##bu1, 14); \
+ A##ga0 ^= Da0; \
+ Bme0 = ROL32(A##ga0, 18); \
+ A##ke0 ^= De0; \
+ Bmi0 = ROL32(A##ke0, 5); \
+ E##ma0 = Bma0 ^((~Bme0)& Bmi0 ); \
+ A##mi1 ^= Di1; \
+ Bmo0 = ROL32(A##mi1, 8); \
+ E##me0 = Bme0 ^((~Bmi0)& Bmo0 ); \
+ A##so0 ^= Do0; \
+ Bmu0 = ROL32(A##so0, 28); \
+ E##mi0 = Bmi0 ^((~Bmo0)& Bmu0 ); \
+ E##mo0 = Bmo0 ^((~Bmu0)& Bma0 ); \
+ E##mu0 = Bmu0 ^((~Bma0)& Bme0 ); \
+\
+ A##bu0 ^= Du0; \
+ Bma1 = ROL32(A##bu0, 13); \
+ A##ga1 ^= Da1; \
+ Bme1 = ROL32(A##ga1, 18); \
+ A##ke1 ^= De1; \
+ Bmi1 = ROL32(A##ke1, 5); \
+ E##ma1 = Bma1 ^((~Bme1)& Bmi1 ); \
+ A##mi0 ^= Di0; \
+ Bmo1 = ROL32(A##mi0, 7); \
+ E##me1 = Bme1 ^((~Bmi1)& Bmo1 ); \
+ A##so1 ^= Do1; \
+ Bmu1 = ROL32(A##so1, 28); \
+ E##mi1 = Bmi1 ^((~Bmo1)& Bmu1 ); \
+ E##mo1 = Bmo1 ^((~Bmu1)& Bma1 ); \
+ E##mu1 = Bmu1 ^((~Bma1)& Bme1 ); \
+\
+ A##bi0 ^= Di0; \
+ Bsa0 = ROL32(A##bi0, 31); \
+ A##go1 ^= Do1; \
+ Bse0 = ROL32(A##go1, 28); \
+ A##ku1 ^= Du1; \
+ Bsi0 = ROL32(A##ku1, 20); \
+ E##sa0 = Bsa0 ^((~Bse0)& Bsi0 ); \
+ A##ma1 ^= Da1; \
+ Bso0 = ROL32(A##ma1, 21); \
+ E##se0 = Bse0 ^((~Bsi0)& Bso0 ); \
+ A##se0 ^= De0; \
+ Bsu0 = ROL32(A##se0, 1); \
+ E##si0 = Bsi0 ^((~Bso0)& Bsu0 ); \
+ E##so0 = Bso0 ^((~Bsu0)& Bsa0 ); \
+ E##su0 = Bsu0 ^((~Bsa0)& Bse0 ); \
+\
+ A##bi1 ^= Di1; \
+ Bsa1 = ROL32(A##bi1, 31); \
+ A##go0 ^= Do0; \
+ Bse1 = ROL32(A##go0, 27); \
+ A##ku0 ^= Du0; \
+ Bsi1 = ROL32(A##ku0, 19); \
+ E##sa1 = Bsa1 ^((~Bse1)& Bsi1 ); \
+ A##ma0 ^= Da0; \
+ Bso1 = ROL32(A##ma0, 20); \
+ E##se1 = Bse1 ^((~Bsi1)& Bso1 ); \
+ A##se1 ^= De1; \
+ Bsu1 = ROL32(A##se1, 1); \
+ E##si1 = Bsi1 ^((~Bso1)& Bsu1 ); \
+ E##so1 = Bso1 ^((~Bsu1)& Bsa1 ); \
+ E##su1 = Bsu1 ^((~Bsa1)& Bse1 ); \
+\
+
+#endif /* UseBebigokimisa */
+
+const UINT32 KeccakF1600RoundConstants_int2_0[24] = {
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000000UL,
+ 0x00000001UL,
+ 0x00000000UL };
+
+const UINT32 KeccakF1600RoundConstants_int2_1[24] = {
+ 0x00000000UL,
+ 0x00000089UL,
+ 0x8000008bUL,
+ 0x80008080UL,
+ 0x0000008bUL,
+ 0x00008000UL,
+ 0x80008088UL,
+ 0x80000082UL,
+ 0x0000000bUL,
+ 0x0000000aUL,
+ 0x00008082UL,
+ 0x00008003UL,
+ 0x0000808bUL,
+ 0x8000000bUL,
+ 0x8000008aUL,
+ 0x80000081UL,
+ 0x80000081UL,
+ 0x80000008UL,
+ 0x00000083UL,
+ 0x80008003UL,
+ 0x80008088UL,
+ 0x80000088UL,
+ 0x00008000UL,
+ 0x80008082UL };
+
+#define copyFromStateAndXor1024bits(X, state, input) \
+ X##ba0 = state[ 0]^input[ 0]; \
+ X##ba1 = state[ 1]^input[ 1]; \
+ X##be0 = state[ 2]^input[ 2]; \
+ X##be1 = state[ 3]^input[ 3]; \
+ X##bi0 = state[ 4]^input[ 4]; \
+ X##bi1 = state[ 5]^input[ 5]; \
+ X##bo0 = state[ 6]^input[ 6]; \
+ X##bo1 = state[ 7]^input[ 7]; \
+ X##bu0 = state[ 8]^input[ 8]; \
+ X##bu1 = state[ 9]^input[ 9]; \
+ X##ga0 = state[10]^input[10]; \
+ X##ga1 = state[11]^input[11]; \
+ X##ge0 = state[12]^input[12]; \
+ X##ge1 = state[13]^input[13]; \
+ X##gi0 = state[14]^input[14]; \
+ X##gi1 = state[15]^input[15]; \
+ X##go0 = state[16]^input[16]; \
+ X##go1 = state[17]^input[17]; \
+ X##gu0 = state[18]^input[18]; \
+ X##gu1 = state[19]^input[19]; \
+ X##ka0 = state[20]^input[20]; \
+ X##ka1 = state[21]^input[21]; \
+ X##ke0 = state[22]^input[22]; \
+ X##ke1 = state[23]^input[23]; \
+ X##ki0 = state[24]^input[24]; \
+ X##ki1 = state[25]^input[25]; \
+ X##ko0 = state[26]^input[26]; \
+ X##ko1 = state[27]^input[27]; \
+ X##ku0 = state[28]^input[28]; \
+ X##ku1 = state[29]^input[29]; \
+ X##ma0 = state[30]^input[30]; \
+ X##ma1 = state[31]^input[31]; \
+ X##me0 = state[32]; \
+ X##me1 = state[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyFromStateAndXor1088bits(X, state, input) \
+ X##ba0 = state[ 0]^input[ 0]; \
+ X##ba1 = state[ 1]^input[ 1]; \
+ X##be0 = state[ 2]^input[ 2]; \
+ X##be1 = state[ 3]^input[ 3]; \
+ X##bi0 = state[ 4]^input[ 4]; \
+ X##bi1 = state[ 5]^input[ 5]; \
+ X##bo0 = state[ 6]^input[ 6]; \
+ X##bo1 = state[ 7]^input[ 7]; \
+ X##bu0 = state[ 8]^input[ 8]; \
+ X##bu1 = state[ 9]^input[ 9]; \
+ X##ga0 = state[10]^input[10]; \
+ X##ga1 = state[11]^input[11]; \
+ X##ge0 = state[12]^input[12]; \
+ X##ge1 = state[13]^input[13]; \
+ X##gi0 = state[14]^input[14]; \
+ X##gi1 = state[15]^input[15]; \
+ X##go0 = state[16]^input[16]; \
+ X##go1 = state[17]^input[17]; \
+ X##gu0 = state[18]^input[18]; \
+ X##gu1 = state[19]^input[19]; \
+ X##ka0 = state[20]^input[20]; \
+ X##ka1 = state[21]^input[21]; \
+ X##ke0 = state[22]^input[22]; \
+ X##ke1 = state[23]^input[23]; \
+ X##ki0 = state[24]^input[24]; \
+ X##ki1 = state[25]^input[25]; \
+ X##ko0 = state[26]^input[26]; \
+ X##ko1 = state[27]^input[27]; \
+ X##ku0 = state[28]^input[28]; \
+ X##ku1 = state[29]^input[29]; \
+ X##ma0 = state[30]^input[30]; \
+ X##ma1 = state[31]^input[31]; \
+ X##me0 = state[32]^input[32]; \
+ X##me1 = state[33]^input[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyFromState(X, state) \
+ X##ba0 = state[ 0]; \
+ X##ba1 = state[ 1]; \
+ X##be0 = state[ 2]; \
+ X##be1 = state[ 3]; \
+ X##bi0 = state[ 4]; \
+ X##bi1 = state[ 5]; \
+ X##bo0 = state[ 6]; \
+ X##bo1 = state[ 7]; \
+ X##bu0 = state[ 8]; \
+ X##bu1 = state[ 9]; \
+ X##ga0 = state[10]; \
+ X##ga1 = state[11]; \
+ X##ge0 = state[12]; \
+ X##ge1 = state[13]; \
+ X##gi0 = state[14]; \
+ X##gi1 = state[15]; \
+ X##go0 = state[16]; \
+ X##go1 = state[17]; \
+ X##gu0 = state[18]; \
+ X##gu1 = state[19]; \
+ X##ka0 = state[20]; \
+ X##ka1 = state[21]; \
+ X##ke0 = state[22]; \
+ X##ke1 = state[23]; \
+ X##ki0 = state[24]; \
+ X##ki1 = state[25]; \
+ X##ko0 = state[26]; \
+ X##ko1 = state[27]; \
+ X##ku0 = state[28]; \
+ X##ku1 = state[29]; \
+ X##ma0 = state[30]; \
+ X##ma1 = state[31]; \
+ X##me0 = state[32]; \
+ X##me1 = state[33]; \
+ X##mi0 = state[34]; \
+ X##mi1 = state[35]; \
+ X##mo0 = state[36]; \
+ X##mo1 = state[37]; \
+ X##mu0 = state[38]; \
+ X##mu1 = state[39]; \
+ X##sa0 = state[40]; \
+ X##sa1 = state[41]; \
+ X##se0 = state[42]; \
+ X##se1 = state[43]; \
+ X##si0 = state[44]; \
+ X##si1 = state[45]; \
+ X##so0 = state[46]; \
+ X##so1 = state[47]; \
+ X##su0 = state[48]; \
+ X##su1 = state[49]; \
+
+#define copyToState(state, X) \
+ state[ 0] = X##ba0; \
+ state[ 1] = X##ba1; \
+ state[ 2] = X##be0; \
+ state[ 3] = X##be1; \
+ state[ 4] = X##bi0; \
+ state[ 5] = X##bi1; \
+ state[ 6] = X##bo0; \
+ state[ 7] = X##bo1; \
+ state[ 8] = X##bu0; \
+ state[ 9] = X##bu1; \
+ state[10] = X##ga0; \
+ state[11] = X##ga1; \
+ state[12] = X##ge0; \
+ state[13] = X##ge1; \
+ state[14] = X##gi0; \
+ state[15] = X##gi1; \
+ state[16] = X##go0; \
+ state[17] = X##go1; \
+ state[18] = X##gu0; \
+ state[19] = X##gu1; \
+ state[20] = X##ka0; \
+ state[21] = X##ka1; \
+ state[22] = X##ke0; \
+ state[23] = X##ke1; \
+ state[24] = X##ki0; \
+ state[25] = X##ki1; \
+ state[26] = X##ko0; \
+ state[27] = X##ko1; \
+ state[28] = X##ku0; \
+ state[29] = X##ku1; \
+ state[30] = X##ma0; \
+ state[31] = X##ma1; \
+ state[32] = X##me0; \
+ state[33] = X##me1; \
+ state[34] = X##mi0; \
+ state[35] = X##mi1; \
+ state[36] = X##mo0; \
+ state[37] = X##mo1; \
+ state[38] = X##mu0; \
+ state[39] = X##mu1; \
+ state[40] = X##sa0; \
+ state[41] = X##sa1; \
+ state[42] = X##se0; \
+ state[43] = X##se1; \
+ state[44] = X##si0; \
+ state[45] = X##si1; \
+ state[46] = X##so0; \
+ state[47] = X##so1; \
+ state[48] = X##su0; \
+ state[49] = X##su1; \
+
+#define copyStateVariables(X, Y) \
+ X##ba0 = Y##ba0; \
+ X##ba1 = Y##ba1; \
+ X##be0 = Y##be0; \
+ X##be1 = Y##be1; \
+ X##bi0 = Y##bi0; \
+ X##bi1 = Y##bi1; \
+ X##bo0 = Y##bo0; \
+ X##bo1 = Y##bo1; \
+ X##bu0 = Y##bu0; \
+ X##bu1 = Y##bu1; \
+ X##ga0 = Y##ga0; \
+ X##ga1 = Y##ga1; \
+ X##ge0 = Y##ge0; \
+ X##ge1 = Y##ge1; \
+ X##gi0 = Y##gi0; \
+ X##gi1 = Y##gi1; \
+ X##go0 = Y##go0; \
+ X##go1 = Y##go1; \
+ X##gu0 = Y##gu0; \
+ X##gu1 = Y##gu1; \
+ X##ka0 = Y##ka0; \
+ X##ka1 = Y##ka1; \
+ X##ke0 = Y##ke0; \
+ X##ke1 = Y##ke1; \
+ X##ki0 = Y##ki0; \
+ X##ki1 = Y##ki1; \
+ X##ko0 = Y##ko0; \
+ X##ko1 = Y##ko1; \
+ X##ku0 = Y##ku0; \
+ X##ku1 = Y##ku1; \
+ X##ma0 = Y##ma0; \
+ X##ma1 = Y##ma1; \
+ X##me0 = Y##me0; \
+ X##me1 = Y##me1; \
+ X##mi0 = Y##mi0; \
+ X##mi1 = Y##mi1; \
+ X##mo0 = Y##mo0; \
+ X##mo1 = Y##mo1; \
+ X##mu0 = Y##mu0; \
+ X##mu1 = Y##mu1; \
+ X##sa0 = Y##sa0; \
+ X##sa1 = Y##sa1; \
+ X##se0 = Y##se0; \
+ X##se1 = Y##se1; \
+ X##si0 = Y##si0; \
+ X##si1 = Y##si1; \
+ X##so0 = Y##so0; \
+ X##so1 = Y##so1; \
+ X##su0 = Y##su0; \
+ X##su1 = Y##su1; \
+
diff --git a/Modules/_sha3/keccak/KeccakF-1600-32.macros b/Modules/_sha3/keccak/KeccakF-1600-32.macros
new file mode 100644
index 0000000..9ade600
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-32.macros
@@ -0,0 +1,26 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#ifdef UseSchedule
+ #if (UseSchedule == 1)
+ #include "KeccakF-1600-32-s1.macros"
+ #elif (UseSchedule == 2)
+ #include "KeccakF-1600-32-s2.macros"
+ #elif (UseSchedule == 3)
+ #include "KeccakF-1600-32-rvk.macros"
+ #else
+ #error "This schedule is not supported."
+ #endif
+#else
+ #include "KeccakF-1600-32-s1.macros"
+#endif
diff --git a/Modules/_sha3/keccak/KeccakF-1600-64.macros b/Modules/_sha3/keccak/KeccakF-1600-64.macros
new file mode 100644
index 0000000..dc0f789
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-64.macros
@@ -0,0 +1,728 @@
+/*
+Code automatically generated by KeccakTools!
+
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#define declareABCDE \
+ UINT64 Aba, Abe, Abi, Abo, Abu; \
+ UINT64 Aga, Age, Agi, Ago, Agu; \
+ UINT64 Aka, Ake, Aki, Ako, Aku; \
+ UINT64 Ama, Ame, Ami, Amo, Amu; \
+ UINT64 Asa, Ase, Asi, Aso, Asu; \
+ UINT64 Bba, Bbe, Bbi, Bbo, Bbu; \
+ UINT64 Bga, Bge, Bgi, Bgo, Bgu; \
+ UINT64 Bka, Bke, Bki, Bko, Bku; \
+ UINT64 Bma, Bme, Bmi, Bmo, Bmu; \
+ UINT64 Bsa, Bse, Bsi, Bso, Bsu; \
+ UINT64 Ca, Ce, Ci, Co, Cu; \
+ UINT64 Da, De, Di, Do, Du; \
+ UINT64 Eba, Ebe, Ebi, Ebo, Ebu; \
+ UINT64 Ega, Ege, Egi, Ego, Egu; \
+ UINT64 Eka, Eke, Eki, Eko, Eku; \
+ UINT64 Ema, Eme, Emi, Emo, Emu; \
+ UINT64 Esa, Ese, Esi, Eso, Esu; \
+
+#define prepareTheta \
+ Ca = Aba^Aga^Aka^Ama^Asa; \
+ Ce = Abe^Age^Ake^Ame^Ase; \
+ Ci = Abi^Agi^Aki^Ami^Asi; \
+ Co = Abo^Ago^Ako^Amo^Aso; \
+ Cu = Abu^Agu^Aku^Amu^Asu; \
+
+#ifdef UseBebigokimisa
+/* --- Code for round, with prepare-theta (lane complementing pattern 'bebigokimisa') */
+/* --- 64-bit lanes mapped to 64-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da = Cu^ROL64(Ce, 1); \
+ De = Ca^ROL64(Ci, 1); \
+ Di = Ce^ROL64(Co, 1); \
+ Do = Ci^ROL64(Cu, 1); \
+ Du = Co^ROL64(Ca, 1); \
+\
+ A##ba ^= Da; \
+ Bba = A##ba; \
+ A##ge ^= De; \
+ Bbe = ROL64(A##ge, 44); \
+ A##ki ^= Di; \
+ Bbi = ROL64(A##ki, 43); \
+ A##mo ^= Do; \
+ Bbo = ROL64(A##mo, 21); \
+ A##su ^= Du; \
+ Bbu = ROL64(A##su, 14); \
+ E##ba = Bba ^( Bbe | Bbi ); \
+ E##ba ^= KeccakF1600RoundConstants[i]; \
+ Ca = E##ba; \
+ E##be = Bbe ^((~Bbi)| Bbo ); \
+ Ce = E##be; \
+ E##bi = Bbi ^( Bbo & Bbu ); \
+ Ci = E##bi; \
+ E##bo = Bbo ^( Bbu | Bba ); \
+ Co = E##bo; \
+ E##bu = Bbu ^( Bba & Bbe ); \
+ Cu = E##bu; \
+\
+ A##bo ^= Do; \
+ Bga = ROL64(A##bo, 28); \
+ A##gu ^= Du; \
+ Bge = ROL64(A##gu, 20); \
+ A##ka ^= Da; \
+ Bgi = ROL64(A##ka, 3); \
+ A##me ^= De; \
+ Bgo = ROL64(A##me, 45); \
+ A##si ^= Di; \
+ Bgu = ROL64(A##si, 61); \
+ E##ga = Bga ^( Bge | Bgi ); \
+ Ca ^= E##ga; \
+ E##ge = Bge ^( Bgi & Bgo ); \
+ Ce ^= E##ge; \
+ E##gi = Bgi ^( Bgo |(~Bgu)); \
+ Ci ^= E##gi; \
+ E##go = Bgo ^( Bgu | Bga ); \
+ Co ^= E##go; \
+ E##gu = Bgu ^( Bga & Bge ); \
+ Cu ^= E##gu; \
+\
+ A##be ^= De; \
+ Bka = ROL64(A##be, 1); \
+ A##gi ^= Di; \
+ Bke = ROL64(A##gi, 6); \
+ A##ko ^= Do; \
+ Bki = ROL64(A##ko, 25); \
+ A##mu ^= Du; \
+ Bko = ROL64(A##mu, 8); \
+ A##sa ^= Da; \
+ Bku = ROL64(A##sa, 18); \
+ E##ka = Bka ^( Bke | Bki ); \
+ Ca ^= E##ka; \
+ E##ke = Bke ^( Bki & Bko ); \
+ Ce ^= E##ke; \
+ E##ki = Bki ^((~Bko)& Bku ); \
+ Ci ^= E##ki; \
+ E##ko = (~Bko)^( Bku | Bka ); \
+ Co ^= E##ko; \
+ E##ku = Bku ^( Bka & Bke ); \
+ Cu ^= E##ku; \
+\
+ A##bu ^= Du; \
+ Bma = ROL64(A##bu, 27); \
+ A##ga ^= Da; \
+ Bme = ROL64(A##ga, 36); \
+ A##ke ^= De; \
+ Bmi = ROL64(A##ke, 10); \
+ A##mi ^= Di; \
+ Bmo = ROL64(A##mi, 15); \
+ A##so ^= Do; \
+ Bmu = ROL64(A##so, 56); \
+ E##ma = Bma ^( Bme & Bmi ); \
+ Ca ^= E##ma; \
+ E##me = Bme ^( Bmi | Bmo ); \
+ Ce ^= E##me; \
+ E##mi = Bmi ^((~Bmo)| Bmu ); \
+ Ci ^= E##mi; \
+ E##mo = (~Bmo)^( Bmu & Bma ); \
+ Co ^= E##mo; \
+ E##mu = Bmu ^( Bma | Bme ); \
+ Cu ^= E##mu; \
+\
+ A##bi ^= Di; \
+ Bsa = ROL64(A##bi, 62); \
+ A##go ^= Do; \
+ Bse = ROL64(A##go, 55); \
+ A##ku ^= Du; \
+ Bsi = ROL64(A##ku, 39); \
+ A##ma ^= Da; \
+ Bso = ROL64(A##ma, 41); \
+ A##se ^= De; \
+ Bsu = ROL64(A##se, 2); \
+ E##sa = Bsa ^((~Bse)& Bsi ); \
+ Ca ^= E##sa; \
+ E##se = (~Bse)^( Bsi | Bso ); \
+ Ce ^= E##se; \
+ E##si = Bsi ^( Bso & Bsu ); \
+ Ci ^= E##si; \
+ E##so = Bso ^( Bsu | Bsa ); \
+ Co ^= E##so; \
+ E##su = Bsu ^( Bsa & Bse ); \
+ Cu ^= E##su; \
+\
+
+/* --- Code for round (lane complementing pattern 'bebigokimisa') */
+/* --- 64-bit lanes mapped to 64-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da = Cu^ROL64(Ce, 1); \
+ De = Ca^ROL64(Ci, 1); \
+ Di = Ce^ROL64(Co, 1); \
+ Do = Ci^ROL64(Cu, 1); \
+ Du = Co^ROL64(Ca, 1); \
+\
+ A##ba ^= Da; \
+ Bba = A##ba; \
+ A##ge ^= De; \
+ Bbe = ROL64(A##ge, 44); \
+ A##ki ^= Di; \
+ Bbi = ROL64(A##ki, 43); \
+ A##mo ^= Do; \
+ Bbo = ROL64(A##mo, 21); \
+ A##su ^= Du; \
+ Bbu = ROL64(A##su, 14); \
+ E##ba = Bba ^( Bbe | Bbi ); \
+ E##ba ^= KeccakF1600RoundConstants[i]; \
+ E##be = Bbe ^((~Bbi)| Bbo ); \
+ E##bi = Bbi ^( Bbo & Bbu ); \
+ E##bo = Bbo ^( Bbu | Bba ); \
+ E##bu = Bbu ^( Bba & Bbe ); \
+\
+ A##bo ^= Do; \
+ Bga = ROL64(A##bo, 28); \
+ A##gu ^= Du; \
+ Bge = ROL64(A##gu, 20); \
+ A##ka ^= Da; \
+ Bgi = ROL64(A##ka, 3); \
+ A##me ^= De; \
+ Bgo = ROL64(A##me, 45); \
+ A##si ^= Di; \
+ Bgu = ROL64(A##si, 61); \
+ E##ga = Bga ^( Bge | Bgi ); \
+ E##ge = Bge ^( Bgi & Bgo ); \
+ E##gi = Bgi ^( Bgo |(~Bgu)); \
+ E##go = Bgo ^( Bgu | Bga ); \
+ E##gu = Bgu ^( Bga & Bge ); \
+\
+ A##be ^= De; \
+ Bka = ROL64(A##be, 1); \
+ A##gi ^= Di; \
+ Bke = ROL64(A##gi, 6); \
+ A##ko ^= Do; \
+ Bki = ROL64(A##ko, 25); \
+ A##mu ^= Du; \
+ Bko = ROL64(A##mu, 8); \
+ A##sa ^= Da; \
+ Bku = ROL64(A##sa, 18); \
+ E##ka = Bka ^( Bke | Bki ); \
+ E##ke = Bke ^( Bki & Bko ); \
+ E##ki = Bki ^((~Bko)& Bku ); \
+ E##ko = (~Bko)^( Bku | Bka ); \
+ E##ku = Bku ^( Bka & Bke ); \
+\
+ A##bu ^= Du; \
+ Bma = ROL64(A##bu, 27); \
+ A##ga ^= Da; \
+ Bme = ROL64(A##ga, 36); \
+ A##ke ^= De; \
+ Bmi = ROL64(A##ke, 10); \
+ A##mi ^= Di; \
+ Bmo = ROL64(A##mi, 15); \
+ A##so ^= Do; \
+ Bmu = ROL64(A##so, 56); \
+ E##ma = Bma ^( Bme & Bmi ); \
+ E##me = Bme ^( Bmi | Bmo ); \
+ E##mi = Bmi ^((~Bmo)| Bmu ); \
+ E##mo = (~Bmo)^( Bmu & Bma ); \
+ E##mu = Bmu ^( Bma | Bme ); \
+\
+ A##bi ^= Di; \
+ Bsa = ROL64(A##bi, 62); \
+ A##go ^= Do; \
+ Bse = ROL64(A##go, 55); \
+ A##ku ^= Du; \
+ Bsi = ROL64(A##ku, 39); \
+ A##ma ^= Da; \
+ Bso = ROL64(A##ma, 41); \
+ A##se ^= De; \
+ Bsu = ROL64(A##se, 2); \
+ E##sa = Bsa ^((~Bse)& Bsi ); \
+ E##se = (~Bse)^( Bsi | Bso ); \
+ E##si = Bsi ^( Bso & Bsu ); \
+ E##so = Bso ^( Bsu | Bsa ); \
+ E##su = Bsu ^( Bsa & Bse ); \
+\
+
+#else /* UseBebigokimisa */
+/* --- Code for round, with prepare-theta */
+/* --- 64-bit lanes mapped to 64-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da = Cu^ROL64(Ce, 1); \
+ De = Ca^ROL64(Ci, 1); \
+ Di = Ce^ROL64(Co, 1); \
+ Do = Ci^ROL64(Cu, 1); \
+ Du = Co^ROL64(Ca, 1); \
+\
+ A##ba ^= Da; \
+ Bba = A##ba; \
+ A##ge ^= De; \
+ Bbe = ROL64(A##ge, 44); \
+ A##ki ^= Di; \
+ Bbi = ROL64(A##ki, 43); \
+ A##mo ^= Do; \
+ Bbo = ROL64(A##mo, 21); \
+ A##su ^= Du; \
+ Bbu = ROL64(A##su, 14); \
+ E##ba = Bba ^((~Bbe)& Bbi ); \
+ E##ba ^= KeccakF1600RoundConstants[i]; \
+ Ca = E##ba; \
+ E##be = Bbe ^((~Bbi)& Bbo ); \
+ Ce = E##be; \
+ E##bi = Bbi ^((~Bbo)& Bbu ); \
+ Ci = E##bi; \
+ E##bo = Bbo ^((~Bbu)& Bba ); \
+ Co = E##bo; \
+ E##bu = Bbu ^((~Bba)& Bbe ); \
+ Cu = E##bu; \
+\
+ A##bo ^= Do; \
+ Bga = ROL64(A##bo, 28); \
+ A##gu ^= Du; \
+ Bge = ROL64(A##gu, 20); \
+ A##ka ^= Da; \
+ Bgi = ROL64(A##ka, 3); \
+ A##me ^= De; \
+ Bgo = ROL64(A##me, 45); \
+ A##si ^= Di; \
+ Bgu = ROL64(A##si, 61); \
+ E##ga = Bga ^((~Bge)& Bgi ); \
+ Ca ^= E##ga; \
+ E##ge = Bge ^((~Bgi)& Bgo ); \
+ Ce ^= E##ge; \
+ E##gi = Bgi ^((~Bgo)& Bgu ); \
+ Ci ^= E##gi; \
+ E##go = Bgo ^((~Bgu)& Bga ); \
+ Co ^= E##go; \
+ E##gu = Bgu ^((~Bga)& Bge ); \
+ Cu ^= E##gu; \
+\
+ A##be ^= De; \
+ Bka = ROL64(A##be, 1); \
+ A##gi ^= Di; \
+ Bke = ROL64(A##gi, 6); \
+ A##ko ^= Do; \
+ Bki = ROL64(A##ko, 25); \
+ A##mu ^= Du; \
+ Bko = ROL64(A##mu, 8); \
+ A##sa ^= Da; \
+ Bku = ROL64(A##sa, 18); \
+ E##ka = Bka ^((~Bke)& Bki ); \
+ Ca ^= E##ka; \
+ E##ke = Bke ^((~Bki)& Bko ); \
+ Ce ^= E##ke; \
+ E##ki = Bki ^((~Bko)& Bku ); \
+ Ci ^= E##ki; \
+ E##ko = Bko ^((~Bku)& Bka ); \
+ Co ^= E##ko; \
+ E##ku = Bku ^((~Bka)& Bke ); \
+ Cu ^= E##ku; \
+\
+ A##bu ^= Du; \
+ Bma = ROL64(A##bu, 27); \
+ A##ga ^= Da; \
+ Bme = ROL64(A##ga, 36); \
+ A##ke ^= De; \
+ Bmi = ROL64(A##ke, 10); \
+ A##mi ^= Di; \
+ Bmo = ROL64(A##mi, 15); \
+ A##so ^= Do; \
+ Bmu = ROL64(A##so, 56); \
+ E##ma = Bma ^((~Bme)& Bmi ); \
+ Ca ^= E##ma; \
+ E##me = Bme ^((~Bmi)& Bmo ); \
+ Ce ^= E##me; \
+ E##mi = Bmi ^((~Bmo)& Bmu ); \
+ Ci ^= E##mi; \
+ E##mo = Bmo ^((~Bmu)& Bma ); \
+ Co ^= E##mo; \
+ E##mu = Bmu ^((~Bma)& Bme ); \
+ Cu ^= E##mu; \
+\
+ A##bi ^= Di; \
+ Bsa = ROL64(A##bi, 62); \
+ A##go ^= Do; \
+ Bse = ROL64(A##go, 55); \
+ A##ku ^= Du; \
+ Bsi = ROL64(A##ku, 39); \
+ A##ma ^= Da; \
+ Bso = ROL64(A##ma, 41); \
+ A##se ^= De; \
+ Bsu = ROL64(A##se, 2); \
+ E##sa = Bsa ^((~Bse)& Bsi ); \
+ Ca ^= E##sa; \
+ E##se = Bse ^((~Bsi)& Bso ); \
+ Ce ^= E##se; \
+ E##si = Bsi ^((~Bso)& Bsu ); \
+ Ci ^= E##si; \
+ E##so = Bso ^((~Bsu)& Bsa ); \
+ Co ^= E##so; \
+ E##su = Bsu ^((~Bsa)& Bse ); \
+ Cu ^= E##su; \
+\
+
+/* --- Code for round */
+/* --- 64-bit lanes mapped to 64-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da = Cu^ROL64(Ce, 1); \
+ De = Ca^ROL64(Ci, 1); \
+ Di = Ce^ROL64(Co, 1); \
+ Do = Ci^ROL64(Cu, 1); \
+ Du = Co^ROL64(Ca, 1); \
+\
+ A##ba ^= Da; \
+ Bba = A##ba; \
+ A##ge ^= De; \
+ Bbe = ROL64(A##ge, 44); \
+ A##ki ^= Di; \
+ Bbi = ROL64(A##ki, 43); \
+ A##mo ^= Do; \
+ Bbo = ROL64(A##mo, 21); \
+ A##su ^= Du; \
+ Bbu = ROL64(A##su, 14); \
+ E##ba = Bba ^((~Bbe)& Bbi ); \
+ E##ba ^= KeccakF1600RoundConstants[i]; \
+ E##be = Bbe ^((~Bbi)& Bbo ); \
+ E##bi = Bbi ^((~Bbo)& Bbu ); \
+ E##bo = Bbo ^((~Bbu)& Bba ); \
+ E##bu = Bbu ^((~Bba)& Bbe ); \
+\
+ A##bo ^= Do; \
+ Bga = ROL64(A##bo, 28); \
+ A##gu ^= Du; \
+ Bge = ROL64(A##gu, 20); \
+ A##ka ^= Da; \
+ Bgi = ROL64(A##ka, 3); \
+ A##me ^= De; \
+ Bgo = ROL64(A##me, 45); \
+ A##si ^= Di; \
+ Bgu = ROL64(A##si, 61); \
+ E##ga = Bga ^((~Bge)& Bgi ); \
+ E##ge = Bge ^((~Bgi)& Bgo ); \
+ E##gi = Bgi ^((~Bgo)& Bgu ); \
+ E##go = Bgo ^((~Bgu)& Bga ); \
+ E##gu = Bgu ^((~Bga)& Bge ); \
+\
+ A##be ^= De; \
+ Bka = ROL64(A##be, 1); \
+ A##gi ^= Di; \
+ Bke = ROL64(A##gi, 6); \
+ A##ko ^= Do; \
+ Bki = ROL64(A##ko, 25); \
+ A##mu ^= Du; \
+ Bko = ROL64(A##mu, 8); \
+ A##sa ^= Da; \
+ Bku = ROL64(A##sa, 18); \
+ E##ka = Bka ^((~Bke)& Bki ); \
+ E##ke = Bke ^((~Bki)& Bko ); \
+ E##ki = Bki ^((~Bko)& Bku ); \
+ E##ko = Bko ^((~Bku)& Bka ); \
+ E##ku = Bku ^((~Bka)& Bke ); \
+\
+ A##bu ^= Du; \
+ Bma = ROL64(A##bu, 27); \
+ A##ga ^= Da; \
+ Bme = ROL64(A##ga, 36); \
+ A##ke ^= De; \
+ Bmi = ROL64(A##ke, 10); \
+ A##mi ^= Di; \
+ Bmo = ROL64(A##mi, 15); \
+ A##so ^= Do; \
+ Bmu = ROL64(A##so, 56); \
+ E##ma = Bma ^((~Bme)& Bmi ); \
+ E##me = Bme ^((~Bmi)& Bmo ); \
+ E##mi = Bmi ^((~Bmo)& Bmu ); \
+ E##mo = Bmo ^((~Bmu)& Bma ); \
+ E##mu = Bmu ^((~Bma)& Bme ); \
+\
+ A##bi ^= Di; \
+ Bsa = ROL64(A##bi, 62); \
+ A##go ^= Do; \
+ Bse = ROL64(A##go, 55); \
+ A##ku ^= Du; \
+ Bsi = ROL64(A##ku, 39); \
+ A##ma ^= Da; \
+ Bso = ROL64(A##ma, 41); \
+ A##se ^= De; \
+ Bsu = ROL64(A##se, 2); \
+ E##sa = Bsa ^((~Bse)& Bsi ); \
+ E##se = Bse ^((~Bsi)& Bso ); \
+ E##si = Bsi ^((~Bso)& Bsu ); \
+ E##so = Bso ^((~Bsu)& Bsa ); \
+ E##su = Bsu ^((~Bsa)& Bse ); \
+\
+
+#endif /* UseBebigokimisa */
+
+static const UINT64 KeccakF1600RoundConstants[24] = {
+ 0x0000000000000001ULL,
+ 0x0000000000008082ULL,
+ 0x800000000000808aULL,
+ 0x8000000080008000ULL,
+ 0x000000000000808bULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008009ULL,
+ 0x000000000000008aULL,
+ 0x0000000000000088ULL,
+ 0x0000000080008009ULL,
+ 0x000000008000000aULL,
+ 0x000000008000808bULL,
+ 0x800000000000008bULL,
+ 0x8000000000008089ULL,
+ 0x8000000000008003ULL,
+ 0x8000000000008002ULL,
+ 0x8000000000000080ULL,
+ 0x000000000000800aULL,
+ 0x800000008000000aULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008080ULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008008ULL };
+
+#define copyFromStateAndXor576bits(X, state, input) \
+ X##ba = state[ 0]^input[ 0]; \
+ X##be = state[ 1]^input[ 1]; \
+ X##bi = state[ 2]^input[ 2]; \
+ X##bo = state[ 3]^input[ 3]; \
+ X##bu = state[ 4]^input[ 4]; \
+ X##ga = state[ 5]^input[ 5]; \
+ X##ge = state[ 6]^input[ 6]; \
+ X##gi = state[ 7]^input[ 7]; \
+ X##go = state[ 8]^input[ 8]; \
+ X##gu = state[ 9]; \
+ X##ka = state[10]; \
+ X##ke = state[11]; \
+ X##ki = state[12]; \
+ X##ko = state[13]; \
+ X##ku = state[14]; \
+ X##ma = state[15]; \
+ X##me = state[16]; \
+ X##mi = state[17]; \
+ X##mo = state[18]; \
+ X##mu = state[19]; \
+ X##sa = state[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyFromStateAndXor832bits(X, state, input) \
+ X##ba = state[ 0]^input[ 0]; \
+ X##be = state[ 1]^input[ 1]; \
+ X##bi = state[ 2]^input[ 2]; \
+ X##bo = state[ 3]^input[ 3]; \
+ X##bu = state[ 4]^input[ 4]; \
+ X##ga = state[ 5]^input[ 5]; \
+ X##ge = state[ 6]^input[ 6]; \
+ X##gi = state[ 7]^input[ 7]; \
+ X##go = state[ 8]^input[ 8]; \
+ X##gu = state[ 9]^input[ 9]; \
+ X##ka = state[10]^input[10]; \
+ X##ke = state[11]^input[11]; \
+ X##ki = state[12]^input[12]; \
+ X##ko = state[13]; \
+ X##ku = state[14]; \
+ X##ma = state[15]; \
+ X##me = state[16]; \
+ X##mi = state[17]; \
+ X##mo = state[18]; \
+ X##mu = state[19]; \
+ X##sa = state[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyFromStateAndXor1024bits(X, state, input) \
+ X##ba = state[ 0]^input[ 0]; \
+ X##be = state[ 1]^input[ 1]; \
+ X##bi = state[ 2]^input[ 2]; \
+ X##bo = state[ 3]^input[ 3]; \
+ X##bu = state[ 4]^input[ 4]; \
+ X##ga = state[ 5]^input[ 5]; \
+ X##ge = state[ 6]^input[ 6]; \
+ X##gi = state[ 7]^input[ 7]; \
+ X##go = state[ 8]^input[ 8]; \
+ X##gu = state[ 9]^input[ 9]; \
+ X##ka = state[10]^input[10]; \
+ X##ke = state[11]^input[11]; \
+ X##ki = state[12]^input[12]; \
+ X##ko = state[13]^input[13]; \
+ X##ku = state[14]^input[14]; \
+ X##ma = state[15]^input[15]; \
+ X##me = state[16]; \
+ X##mi = state[17]; \
+ X##mo = state[18]; \
+ X##mu = state[19]; \
+ X##sa = state[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyFromStateAndXor1088bits(X, state, input) \
+ X##ba = state[ 0]^input[ 0]; \
+ X##be = state[ 1]^input[ 1]; \
+ X##bi = state[ 2]^input[ 2]; \
+ X##bo = state[ 3]^input[ 3]; \
+ X##bu = state[ 4]^input[ 4]; \
+ X##ga = state[ 5]^input[ 5]; \
+ X##ge = state[ 6]^input[ 6]; \
+ X##gi = state[ 7]^input[ 7]; \
+ X##go = state[ 8]^input[ 8]; \
+ X##gu = state[ 9]^input[ 9]; \
+ X##ka = state[10]^input[10]; \
+ X##ke = state[11]^input[11]; \
+ X##ki = state[12]^input[12]; \
+ X##ko = state[13]^input[13]; \
+ X##ku = state[14]^input[14]; \
+ X##ma = state[15]^input[15]; \
+ X##me = state[16]^input[16]; \
+ X##mi = state[17]; \
+ X##mo = state[18]; \
+ X##mu = state[19]; \
+ X##sa = state[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyFromStateAndXor1152bits(X, state, input) \
+ X##ba = state[ 0]^input[ 0]; \
+ X##be = state[ 1]^input[ 1]; \
+ X##bi = state[ 2]^input[ 2]; \
+ X##bo = state[ 3]^input[ 3]; \
+ X##bu = state[ 4]^input[ 4]; \
+ X##ga = state[ 5]^input[ 5]; \
+ X##ge = state[ 6]^input[ 6]; \
+ X##gi = state[ 7]^input[ 7]; \
+ X##go = state[ 8]^input[ 8]; \
+ X##gu = state[ 9]^input[ 9]; \
+ X##ka = state[10]^input[10]; \
+ X##ke = state[11]^input[11]; \
+ X##ki = state[12]^input[12]; \
+ X##ko = state[13]^input[13]; \
+ X##ku = state[14]^input[14]; \
+ X##ma = state[15]^input[15]; \
+ X##me = state[16]^input[16]; \
+ X##mi = state[17]^input[17]; \
+ X##mo = state[18]; \
+ X##mu = state[19]; \
+ X##sa = state[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyFromStateAndXor1344bits(X, state, input) \
+ X##ba = state[ 0]^input[ 0]; \
+ X##be = state[ 1]^input[ 1]; \
+ X##bi = state[ 2]^input[ 2]; \
+ X##bo = state[ 3]^input[ 3]; \
+ X##bu = state[ 4]^input[ 4]; \
+ X##ga = state[ 5]^input[ 5]; \
+ X##ge = state[ 6]^input[ 6]; \
+ X##gi = state[ 7]^input[ 7]; \
+ X##go = state[ 8]^input[ 8]; \
+ X##gu = state[ 9]^input[ 9]; \
+ X##ka = state[10]^input[10]; \
+ X##ke = state[11]^input[11]; \
+ X##ki = state[12]^input[12]; \
+ X##ko = state[13]^input[13]; \
+ X##ku = state[14]^input[14]; \
+ X##ma = state[15]^input[15]; \
+ X##me = state[16]^input[16]; \
+ X##mi = state[17]^input[17]; \
+ X##mo = state[18]^input[18]; \
+ X##mu = state[19]^input[19]; \
+ X##sa = state[20]^input[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyFromState(X, state) \
+ X##ba = state[ 0]; \
+ X##be = state[ 1]; \
+ X##bi = state[ 2]; \
+ X##bo = state[ 3]; \
+ X##bu = state[ 4]; \
+ X##ga = state[ 5]; \
+ X##ge = state[ 6]; \
+ X##gi = state[ 7]; \
+ X##go = state[ 8]; \
+ X##gu = state[ 9]; \
+ X##ka = state[10]; \
+ X##ke = state[11]; \
+ X##ki = state[12]; \
+ X##ko = state[13]; \
+ X##ku = state[14]; \
+ X##ma = state[15]; \
+ X##me = state[16]; \
+ X##mi = state[17]; \
+ X##mo = state[18]; \
+ X##mu = state[19]; \
+ X##sa = state[20]; \
+ X##se = state[21]; \
+ X##si = state[22]; \
+ X##so = state[23]; \
+ X##su = state[24]; \
+
+#define copyToState(state, X) \
+ state[ 0] = X##ba; \
+ state[ 1] = X##be; \
+ state[ 2] = X##bi; \
+ state[ 3] = X##bo; \
+ state[ 4] = X##bu; \
+ state[ 5] = X##ga; \
+ state[ 6] = X##ge; \
+ state[ 7] = X##gi; \
+ state[ 8] = X##go; \
+ state[ 9] = X##gu; \
+ state[10] = X##ka; \
+ state[11] = X##ke; \
+ state[12] = X##ki; \
+ state[13] = X##ko; \
+ state[14] = X##ku; \
+ state[15] = X##ma; \
+ state[16] = X##me; \
+ state[17] = X##mi; \
+ state[18] = X##mo; \
+ state[19] = X##mu; \
+ state[20] = X##sa; \
+ state[21] = X##se; \
+ state[22] = X##si; \
+ state[23] = X##so; \
+ state[24] = X##su; \
+
+#define copyStateVariables(X, Y) \
+ X##ba = Y##ba; \
+ X##be = Y##be; \
+ X##bi = Y##bi; \
+ X##bo = Y##bo; \
+ X##bu = Y##bu; \
+ X##ga = Y##ga; \
+ X##ge = Y##ge; \
+ X##gi = Y##gi; \
+ X##go = Y##go; \
+ X##gu = Y##gu; \
+ X##ka = Y##ka; \
+ X##ke = Y##ke; \
+ X##ki = Y##ki; \
+ X##ko = Y##ko; \
+ X##ku = Y##ku; \
+ X##ma = Y##ma; \
+ X##me = Y##me; \
+ X##mi = Y##mi; \
+ X##mo = Y##mo; \
+ X##mu = Y##mu; \
+ X##sa = Y##sa; \
+ X##se = Y##se; \
+ X##si = Y##si; \
+ X##so = Y##so; \
+ X##su = Y##su; \
+
diff --git a/Modules/_sha3/keccak/KeccakF-1600-int-set.h b/Modules/_sha3/keccak/KeccakF-1600-int-set.h
new file mode 100644
index 0000000..0ed1d80
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-int-set.h
@@ -0,0 +1,6 @@
+#define ProvideFast576
+#define ProvideFast832
+#define ProvideFast1024
+#define ProvideFast1088
+#define ProvideFast1152
+#define ProvideFast1344
diff --git a/Modules/_sha3/keccak/KeccakF-1600-interface.h b/Modules/_sha3/keccak/KeccakF-1600-interface.h
new file mode 100644
index 0000000..ce2710e
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-interface.h
@@ -0,0 +1,46 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#ifndef _KeccakPermutationInterface_h_
+#define _KeccakPermutationInterface_h_
+
+#include "KeccakF-1600-int-set.h"
+
+static void KeccakInitialize( void );
+static void KeccakInitializeState(unsigned char *state);
+static void KeccakPermutation(unsigned char *state);
+#ifdef ProvideFast576
+static void KeccakAbsorb576bits(unsigned char *state, const unsigned char *data);
+#endif
+#ifdef ProvideFast832
+static void KeccakAbsorb832bits(unsigned char *state, const unsigned char *data);
+#endif
+#ifdef ProvideFast1024
+static void KeccakAbsorb1024bits(unsigned char *state, const unsigned char *data);
+#endif
+#ifdef ProvideFast1088
+static void KeccakAbsorb1088bits(unsigned char *state, const unsigned char *data);
+#endif
+#ifdef ProvideFast1152
+static void KeccakAbsorb1152bits(unsigned char *state, const unsigned char *data);
+#endif
+#ifdef ProvideFast1344
+static void KeccakAbsorb1344bits(unsigned char *state, const unsigned char *data);
+#endif
+static void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsigned int laneCount);
+#ifdef ProvideFast1024
+static void KeccakExtract1024bits(const unsigned char *state, unsigned char *data);
+#endif
+static void KeccakExtract(const unsigned char *state, unsigned char *data, unsigned int laneCount);
+
+#endif
diff --git a/Modules/_sha3/keccak/KeccakF-1600-opt32-settings.h b/Modules/_sha3/keccak/KeccakF-1600-opt32-settings.h
new file mode 100644
index 0000000..615c782
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-opt32-settings.h
@@ -0,0 +1,6 @@
+/*
+#define Unrolling 2
+#define UseBebigokimisa
+#define UseInterleaveTables
+#define UseSchedule 3
+*/
diff --git a/Modules/_sha3/keccak/KeccakF-1600-opt32.c b/Modules/_sha3/keccak/KeccakF-1600-opt32.c
new file mode 100644
index 0000000..dba6d59
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-opt32.c
@@ -0,0 +1,524 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#include <string.h>
+/* #include "brg_endian.h" */
+#include "KeccakF-1600-opt32-settings.h"
+#include "KeccakF-1600-interface.h"
+
+typedef unsigned char UINT8;
+typedef unsigned short UINT16;
+typedef unsigned int UINT32;
+/* typedef unsigned long long int UINT64; */
+
+#ifdef UseInterleaveTables
+static int interleaveTablesBuilt = 0;
+static UINT16 interleaveTable[65536];
+static UINT16 deinterleaveTable[65536];
+
+static void buildInterleaveTables()
+{
+ UINT32 i, j;
+ UINT16 x;
+
+ if (!interleaveTablesBuilt) {
+ for(i=0; i<65536; i++) {
+ x = 0;
+ for(j=0; j<16; j++) {
+ if (i & (1 << j))
+ x |= (1 << (j/2 + 8*(j%2)));
+ }
+ interleaveTable[i] = x;
+ deinterleaveTable[x] = (UINT16)i;
+ }
+ interleaveTablesBuilt = 1;
+ }
+}
+
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+
+#define xor2bytesIntoInterleavedWords(even, odd, source, j) \
+ i##j = interleaveTable[((const UINT16*)source)[j]]; \
+ ((UINT8*)even)[j] ^= i##j & 0xFF; \
+ ((UINT8*)odd)[j] ^= i##j >> 8;
+
+#define setInterleavedWordsInto2bytes(dest, even, odd, j) \
+ d##j = deinterleaveTable[((even >> (j*8)) & 0xFF) ^ (((odd >> (j*8)) & 0xFF) << 8)]; \
+ ((UINT16*)dest)[j] = d##j;
+
+#else /* (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN) */
+
+#define xor2bytesIntoInterleavedWords(even, odd, source, j) \
+ i##j = interleaveTable[source[2*j] ^ ((UINT16)source[2*j+1] << 8)]; \
+ *even ^= (i##j & 0xFF) << (j*8); \
+ *odd ^= ((i##j >> 8) & 0xFF) << (j*8);
+
+#define setInterleavedWordsInto2bytes(dest, even, odd, j) \
+ d##j = deinterleaveTable[((even >> (j*8)) & 0xFF) ^ (((odd >> (j*8)) & 0xFF) << 8)]; \
+ dest[2*j] = d##j & 0xFF; \
+ dest[2*j+1] = d##j >> 8;
+
+#endif /* Endianness */
+
+static void xor8bytesIntoInterleavedWords(UINT32 *even, UINT32 *odd, const UINT8* source)
+{
+ UINT16 i0, i1, i2, i3;
+
+ xor2bytesIntoInterleavedWords(even, odd, source, 0)
+ xor2bytesIntoInterleavedWords(even, odd, source, 1)
+ xor2bytesIntoInterleavedWords(even, odd, source, 2)
+ xor2bytesIntoInterleavedWords(even, odd, source, 3)
+}
+
+#define xorLanesIntoState(laneCount, state, input) \
+ { \
+ int i; \
+ for(i=0; i<(laneCount); i++) \
+ xor8bytesIntoInterleavedWords(state+i*2, state+i*2+1, input+i*8); \
+ }
+
+static void setInterleavedWordsInto8bytes(UINT8* dest, UINT32 even, UINT32 odd)
+{
+ UINT16 d0, d1, d2, d3;
+
+ setInterleavedWordsInto2bytes(dest, even, odd, 0)
+ setInterleavedWordsInto2bytes(dest, even, odd, 1)
+ setInterleavedWordsInto2bytes(dest, even, odd, 2)
+ setInterleavedWordsInto2bytes(dest, even, odd, 3)
+}
+
+#define extractLanes(laneCount, state, data) \
+ { \
+ int i; \
+ for(i=0; i<(laneCount); i++) \
+ setInterleavedWordsInto8bytes(data+i*8, ((UINT32*)state)[i*2], ((UINT32*)state)[i*2+1]); \
+ }
+
+#else /* No interleaving tables */
+
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+
+/* Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
+#define xorInterleavedLE(rateInLanes, state, input) \
+ { \
+ const UINT32 * pI = (const UINT32 *)input; \
+ UINT32 * pS = state; \
+ UINT32 t, x0, x1; \
+ int i; \
+ for (i = (rateInLanes)-1; i >= 0; --i) \
+ { \
+ x0 = *(pI++); \
+ t = (x0 ^ (x0 >> 1)) & 0x22222222UL; x0 = x0 ^ t ^ (t << 1); \
+ t = (x0 ^ (x0 >> 2)) & 0x0C0C0C0CUL; x0 = x0 ^ t ^ (t << 2); \
+ t = (x0 ^ (x0 >> 4)) & 0x00F000F0UL; x0 = x0 ^ t ^ (t << 4); \
+ t = (x0 ^ (x0 >> 8)) & 0x0000FF00UL; x0 = x0 ^ t ^ (t << 8); \
+ x1 = *(pI++); \
+ t = (x1 ^ (x1 >> 1)) & 0x22222222UL; x1 = x1 ^ t ^ (t << 1); \
+ t = (x1 ^ (x1 >> 2)) & 0x0C0C0C0CUL; x1 = x1 ^ t ^ (t << 2); \
+ t = (x1 ^ (x1 >> 4)) & 0x00F000F0UL; x1 = x1 ^ t ^ (t << 4); \
+ t = (x1 ^ (x1 >> 8)) & 0x0000FF00UL; x1 = x1 ^ t ^ (t << 8); \
+ *(pS++) ^= (UINT16)x0 | (x1 << 16); \
+ *(pS++) ^= (x0 >> 16) | (x1 & 0xFFFF0000); \
+ } \
+ }
+
+#define xorLanesIntoState(laneCount, state, input) \
+ xorInterleavedLE(laneCount, state, input)
+
+#else /* (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN) */
+
+/* Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
+UINT64 toInterleaving(UINT64 x)
+{
+ UINT64 t;
+
+ t = (x ^ (x >> 1)) & 0x2222222222222222ULL; x = x ^ t ^ (t << 1);
+ t = (x ^ (x >> 2)) & 0x0C0C0C0C0C0C0C0CULL; x = x ^ t ^ (t << 2);
+ t = (x ^ (x >> 4)) & 0x00F000F000F000F0ULL; x = x ^ t ^ (t << 4);
+ t = (x ^ (x >> 8)) & 0x0000FF000000FF00ULL; x = x ^ t ^ (t << 8);
+ t = (x ^ (x >> 16)) & 0x00000000FFFF0000ULL; x = x ^ t ^ (t << 16);
+
+ return x;
+}
+
+static void xor8bytesIntoInterleavedWords(UINT32* evenAndOdd, const UINT8* source)
+{
+ /* This can be optimized */
+ UINT64 sourceWord =
+ (UINT64)source[0]
+ ^ (((UINT64)source[1]) << 8)
+ ^ (((UINT64)source[2]) << 16)
+ ^ (((UINT64)source[3]) << 24)
+ ^ (((UINT64)source[4]) << 32)
+ ^ (((UINT64)source[5]) << 40)
+ ^ (((UINT64)source[6]) << 48)
+ ^ (((UINT64)source[7]) << 56);
+ UINT64 evenAndOddWord = toInterleaving(sourceWord);
+ evenAndOdd[0] ^= (UINT32)evenAndOddWord;
+ evenAndOdd[1] ^= (UINT32)(evenAndOddWord >> 32);
+}
+
+#define xorLanesIntoState(laneCount, state, input) \
+ { \
+ int i; \
+ for(i=0; i<(laneCount); i++) \
+ xor8bytesIntoInterleavedWords(state+i*2, input+i*8); \
+ }
+
+#endif /* Endianness */
+
+/* Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
+UINT64 fromInterleaving(UINT64 x)
+{
+ UINT64 t;
+
+ t = (x ^ (x >> 16)) & 0x00000000FFFF0000ULL; x = x ^ t ^ (t << 16);
+ t = (x ^ (x >> 8)) & 0x0000FF000000FF00ULL; x = x ^ t ^ (t << 8);
+ t = (x ^ (x >> 4)) & 0x00F000F000F000F0ULL; x = x ^ t ^ (t << 4);
+ t = (x ^ (x >> 2)) & 0x0C0C0C0C0C0C0C0CULL; x = x ^ t ^ (t << 2);
+ t = (x ^ (x >> 1)) & 0x2222222222222222ULL; x = x ^ t ^ (t << 1);
+
+ return x;
+}
+
+static void setInterleavedWordsInto8bytes(UINT8* dest, UINT32* evenAndOdd)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ ((UINT64*)dest)[0] = fromInterleaving(*(UINT64*)evenAndOdd);
+#else /* (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN) */
+ /* This can be optimized */
+ UINT64 evenAndOddWord = (UINT64)evenAndOdd[0] ^ ((UINT64)evenAndOdd[1] << 32);
+ UINT64 destWord = fromInterleaving(evenAndOddWord);
+ dest[0] = destWord & 0xFF;
+ dest[1] = (destWord >> 8) & 0xFF;
+ dest[2] = (destWord >> 16) & 0xFF;
+ dest[3] = (destWord >> 24) & 0xFF;
+ dest[4] = (destWord >> 32) & 0xFF;
+ dest[5] = (destWord >> 40) & 0xFF;
+ dest[6] = (destWord >> 48) & 0xFF;
+ dest[7] = (destWord >> 56) & 0xFF;
+#endif /* Endianness */
+}
+
+#define extractLanes(laneCount, state, data) \
+ { \
+ int i; \
+ for(i=0; i<(laneCount); i++) \
+ setInterleavedWordsInto8bytes(data+i*8, (UINT32*)state+i*2); \
+ }
+
+#endif /* With or without interleaving tables */
+
+#if defined(_MSC_VER)
+#define ROL32(a, offset) _rotl(a, offset)
+#elif (defined (__arm__) && defined(__ARMCC_VERSION))
+#define ROL32(a, offset) __ror(a, 32-(offset))
+#else
+#define ROL32(a, offset) ((((UINT32)a) << (offset)) ^ (((UINT32)a) >> (32-(offset))))
+#endif
+
+#include "KeccakF-1600-unrolling.macros"
+#include "KeccakF-1600-32.macros"
+
+#if (UseSchedule == 3)
+
+#ifdef UseBebigokimisa
+#error "No lane complementing with schedule 3."
+#endif
+
+#if (Unrolling != 2)
+#error "Only unrolling 2 is supported by schedule 3."
+#endif
+
+static void KeccakPermutationOnWords(UINT32 *state)
+{
+ rounds
+}
+
+static void KeccakPermutationOnWordsAfterXoring(UINT32 *state, const UINT8 *input, unsigned int laneCount)
+{
+ xorLanesIntoState(laneCount, state, input)
+ rounds
+}
+
+#ifdef ProvideFast576
+static void KeccakPermutationOnWordsAfterXoring576bits(UINT32 *state, const UINT8 *input)
+{
+ xorLanesIntoState(9, state, input)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast832
+static void KeccakPermutationOnWordsAfterXoring832bits(UINT32 *state, const UINT8 *input)
+{
+ xorLanesIntoState(13, state, input)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1024
+static void KeccakPermutationOnWordsAfterXoring1024bits(UINT32 *state, const UINT8 *input)
+{
+ xorLanesIntoState(16, state, input)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1088
+static void KeccakPermutationOnWordsAfterXoring1088bits(UINT32 *state, const UINT8 *input)
+{
+ xorLanesIntoState(17, state, input)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1152
+static void KeccakPermutationOnWordsAfterXoring1152bits(UINT32 *state, const UINT8 *input)
+{
+ xorLanesIntoState(18, state, input)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1344
+static void KeccakPermutationOnWordsAfterXoring1344bits(UINT32 *state, const UINT8 *input)
+{
+ xorLanesIntoState(21, state, input)
+ rounds
+}
+#endif
+
+#else /* (Schedule != 3) */
+
+static void KeccakPermutationOnWords(UINT32 *state)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromState(A, state)
+ rounds
+}
+
+static void KeccakPermutationOnWordsAfterXoring(UINT32 *state, const UINT8 *input, unsigned int laneCount)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(laneCount, state, input)
+ copyFromState(A, state)
+ rounds
+}
+
+#ifdef ProvideFast576
+static void KeccakPermutationOnWordsAfterXoring576bits(UINT32 *state, const UINT8 *input)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(9, state, input)
+ copyFromState(A, state)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast832
+static void KeccakPermutationOnWordsAfterXoring832bits(UINT32 *state, const UINT8 *input)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(13, state, input)
+ copyFromState(A, state)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1024
+static void KeccakPermutationOnWordsAfterXoring1024bits(UINT32 *state, const UINT8 *input)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(16, state, input)
+ copyFromState(A, state)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1088
+static void KeccakPermutationOnWordsAfterXoring1088bits(UINT32 *state, const UINT8 *input)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(17, state, input)
+ copyFromState(A, state)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1152
+static void KeccakPermutationOnWordsAfterXoring1152bits(UINT32 *state, const UINT8 *input)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(18, state, input)
+ copyFromState(A, state)
+ rounds
+}
+#endif
+
+#ifdef ProvideFast1344
+static void KeccakPermutationOnWordsAfterXoring1344bits(UINT32 *state, const UINT8 *input)
+{
+ declareABCDE
+ unsigned int i;
+
+ xorLanesIntoState(21, state, input)
+ copyFromState(A, state)
+ rounds
+}
+#endif
+
+#endif
+
+static void KeccakInitialize()
+{
+#ifdef UseInterleaveTables
+ buildInterleaveTables();
+#endif
+}
+
+static void KeccakInitializeState(unsigned char *state)
+{
+ memset(state, 0, 200);
+#ifdef UseBebigokimisa
+ ((UINT32*)state)[ 2] = ~(UINT32)0;
+ ((UINT32*)state)[ 3] = ~(UINT32)0;
+ ((UINT32*)state)[ 4] = ~(UINT32)0;
+ ((UINT32*)state)[ 5] = ~(UINT32)0;
+ ((UINT32*)state)[16] = ~(UINT32)0;
+ ((UINT32*)state)[17] = ~(UINT32)0;
+ ((UINT32*)state)[24] = ~(UINT32)0;
+ ((UINT32*)state)[25] = ~(UINT32)0;
+ ((UINT32*)state)[34] = ~(UINT32)0;
+ ((UINT32*)state)[35] = ~(UINT32)0;
+ ((UINT32*)state)[40] = ~(UINT32)0;
+ ((UINT32*)state)[41] = ~(UINT32)0;
+#endif
+}
+
+static void KeccakPermutation(unsigned char *state)
+{
+ /* We assume the state is always stored as interleaved 32-bit words */
+ KeccakPermutationOnWords((UINT32*)state);
+}
+
+#ifdef ProvideFast576
+static void KeccakAbsorb576bits(unsigned char *state, const unsigned char *data)
+{
+ KeccakPermutationOnWordsAfterXoring576bits((UINT32*)state, data);
+}
+#endif
+
+#ifdef ProvideFast832
+static void KeccakAbsorb832bits(unsigned char *state, const unsigned char *data)
+{
+ KeccakPermutationOnWordsAfterXoring832bits((UINT32*)state, data);
+}
+#endif
+
+#ifdef ProvideFast1024
+static void KeccakAbsorb1024bits(unsigned char *state, const unsigned char *data)
+{
+ KeccakPermutationOnWordsAfterXoring1024bits((UINT32*)state, data);
+}
+#endif
+
+#ifdef ProvideFast1088
+static void KeccakAbsorb1088bits(unsigned char *state, const unsigned char *data)
+{
+ KeccakPermutationOnWordsAfterXoring1088bits((UINT32*)state, data);
+}
+#endif
+
+#ifdef ProvideFast1152
+static void KeccakAbsorb1152bits(unsigned char *state, const unsigned char *data)
+{
+ KeccakPermutationOnWordsAfterXoring1152bits((UINT32*)state, data);
+}
+#endif
+
+#ifdef ProvideFast1344
+static void KeccakAbsorb1344bits(unsigned char *state, const unsigned char *data)
+{
+ KeccakPermutationOnWordsAfterXoring1344bits((UINT32*)state, data);
+}
+#endif
+
+static void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsigned int laneCount)
+{
+ KeccakPermutationOnWordsAfterXoring((UINT32*)state, data, laneCount);
+}
+
+#ifdef ProvideFast1024
+static void KeccakExtract1024bits(const unsigned char *state, unsigned char *data)
+{
+ extractLanes(16, state, data)
+#ifdef UseBebigokimisa
+ ((UINT32*)data)[ 2] = ~((UINT32*)data)[ 2];
+ ((UINT32*)data)[ 3] = ~((UINT32*)data)[ 3];
+ ((UINT32*)data)[ 4] = ~((UINT32*)data)[ 4];
+ ((UINT32*)data)[ 5] = ~((UINT32*)data)[ 5];
+ ((UINT32*)data)[16] = ~((UINT32*)data)[16];
+ ((UINT32*)data)[17] = ~((UINT32*)data)[17];
+ ((UINT32*)data)[24] = ~((UINT32*)data)[24];
+ ((UINT32*)data)[25] = ~((UINT32*)data)[25];
+#endif
+}
+#endif
+
+static void KeccakExtract(const unsigned char *state, unsigned char *data, unsigned int laneCount)
+{
+ extractLanes(laneCount, state, data)
+#ifdef UseBebigokimisa
+ if (laneCount > 1) {
+ ((UINT32*)data)[ 2] = ~((UINT32*)data)[ 2];
+ ((UINT32*)data)[ 3] = ~((UINT32*)data)[ 3];
+ if (laneCount > 2) {
+ ((UINT32*)data)[ 4] = ~((UINT32*)data)[ 4];
+ ((UINT32*)data)[ 5] = ~((UINT32*)data)[ 5];
+ if (laneCount > 8) {
+ ((UINT32*)data)[16] = ~((UINT32*)data)[16];
+ ((UINT32*)data)[17] = ~((UINT32*)data)[17];
+ if (laneCount > 12) {
+ ((UINT32*)data)[24] = ~((UINT32*)data)[24];
+ ((UINT32*)data)[25] = ~((UINT32*)data)[25];
+ if (laneCount > 17) {
+ ((UINT32*)data)[34] = ~((UINT32*)data)[34];
+ ((UINT32*)data)[35] = ~((UINT32*)data)[35];
+ if (laneCount > 20) {
+ ((UINT32*)data)[40] = ~((UINT32*)data)[40];
+ ((UINT32*)data)[41] = ~((UINT32*)data)[41];
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+}
diff --git a/Modules/_sha3/keccak/KeccakF-1600-opt64-settings.h b/Modules/_sha3/keccak/KeccakF-1600-opt64-settings.h
new file mode 100644
index 0000000..df83e63
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-opt64-settings.h
@@ -0,0 +1,9 @@
+/*
+#define Unrolling 24
+#define UseBebigokimisa
+#define UseSSE
+#define UseOnlySIMD64
+#define UseMMX
+#define UseSHLD
+#define UseXOP
+*/
diff --git a/Modules/_sha3/keccak/KeccakF-1600-opt64.c b/Modules/_sha3/keccak/KeccakF-1600-opt64.c
new file mode 100644
index 0000000..f19b18b
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-opt64.c
@@ -0,0 +1,510 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#include <string.h>
+/* #include "brg_endian.h" */
+#include "KeccakF-1600-opt64-settings.h"
+#include "KeccakF-1600-interface.h"
+
+typedef unsigned char UINT8;
+/* typedef unsigned long long int UINT64; */
+
+#if defined(__GNUC__)
+#define ALIGN __attribute__ ((aligned(32)))
+#elif defined(_MSC_VER)
+#define ALIGN __declspec(align(32))
+#else
+#define ALIGN
+#endif
+
+#if defined(UseSSE)
+ #include <x86intrin.h>
+ typedef __m128i V64;
+ typedef __m128i V128;
+ typedef union {
+ V128 v128;
+ UINT64 v64[2];
+ } V6464;
+
+ #define ANDnu64(a, b) _mm_andnot_si128(a, b)
+ #define LOAD64(a) _mm_loadl_epi64((const V64 *)&(a))
+ #define CONST64(a) _mm_loadl_epi64((const V64 *)&(a))
+ #define ROL64(a, o) _mm_or_si128(_mm_slli_epi64(a, o), _mm_srli_epi64(a, 64-(o)))
+ #define STORE64(a, b) _mm_storel_epi64((V64 *)&(a), b)
+ #define XOR64(a, b) _mm_xor_si128(a, b)
+ #define XOReq64(a, b) a = _mm_xor_si128(a, b)
+ #define SHUFFLEBYTES128(a, b) _mm_shuffle_epi8(a, b)
+
+ #define ANDnu128(a, b) _mm_andnot_si128(a, b)
+ #define LOAD6464(a, b) _mm_set_epi64((__m64)(a), (__m64)(b))
+ #define CONST128(a) _mm_load_si128((const V128 *)&(a))
+ #define LOAD128(a) _mm_load_si128((const V128 *)&(a))
+ #define LOAD128u(a) _mm_loadu_si128((const V128 *)&(a))
+ #define ROL64in128(a, o) _mm_or_si128(_mm_slli_epi64(a, o), _mm_srli_epi64(a, 64-(o)))
+ #define STORE128(a, b) _mm_store_si128((V128 *)&(a), b)
+ #define XOR128(a, b) _mm_xor_si128(a, b)
+ #define XOReq128(a, b) a = _mm_xor_si128(a, b)
+ #define GET64LOLO(a, b) _mm_unpacklo_epi64(a, b)
+ #define GET64HIHI(a, b) _mm_unpackhi_epi64(a, b)
+ #define COPY64HI2LO(a) _mm_shuffle_epi32(a, 0xEE)
+ #define COPY64LO2HI(a) _mm_shuffle_epi32(a, 0x44)
+ #define ZERO128() _mm_setzero_si128()
+
+ #ifdef UseOnlySIMD64
+ #include "KeccakF-1600-simd64.macros"
+ #else
+ALIGN const UINT64 rho8_56[2] = {0x0605040302010007, 0x080F0E0D0C0B0A09};
+ #include "KeccakF-1600-simd128.macros"
+ #endif
+
+ #ifdef UseBebigokimisa
+ #error "UseBebigokimisa cannot be used in combination with UseSSE"
+ #endif
+#elif defined(UseXOP)
+ #include <x86intrin.h>
+ typedef __m128i V64;
+ typedef __m128i V128;
+
+ #define LOAD64(a) _mm_loadl_epi64((const V64 *)&(a))
+ #define CONST64(a) _mm_loadl_epi64((const V64 *)&(a))
+ #define STORE64(a, b) _mm_storel_epi64((V64 *)&(a), b)
+ #define XOR64(a, b) _mm_xor_si128(a, b)
+ #define XOReq64(a, b) a = _mm_xor_si128(a, b)
+
+ #define ANDnu128(a, b) _mm_andnot_si128(a, b)
+ #define LOAD6464(a, b) _mm_set_epi64((__m64)(a), (__m64)(b))
+ #define CONST128(a) _mm_load_si128((const V128 *)&(a))
+ #define LOAD128(a) _mm_load_si128((const V128 *)&(a))
+ #define LOAD128u(a) _mm_loadu_si128((const V128 *)&(a))
+ #define STORE128(a, b) _mm_store_si128((V128 *)&(a), b)
+ #define XOR128(a, b) _mm_xor_si128(a, b)
+ #define XOReq128(a, b) a = _mm_xor_si128(a, b)
+ #define ZERO128() _mm_setzero_si128()
+
+ #define SWAP64(a) _mm_shuffle_epi32(a, 0x4E)
+ #define GET64LOLO(a, b) _mm_unpacklo_epi64(a, b)
+ #define GET64HIHI(a, b) _mm_unpackhi_epi64(a, b)
+ #define GET64LOHI(a, b) ((__m128i)_mm_blend_pd((__m128d)a, (__m128d)b, 2))
+ #define GET64HILO(a, b) SWAP64(GET64LOHI(b, a))
+ #define COPY64HI2LO(a) _mm_shuffle_epi32(a, 0xEE)
+ #define COPY64LO2HI(a) _mm_shuffle_epi32(a, 0x44)
+
+ #define ROL6464same(a, o) _mm_roti_epi64(a, o)
+ #define ROL6464(a, r1, r2) _mm_rot_epi64(a, CONST128( rot_##r1##_##r2 ))
+ALIGN const UINT64 rot_0_20[2] = { 0, 20};
+ALIGN const UINT64 rot_44_3[2] = {44, 3};
+ALIGN const UINT64 rot_43_45[2] = {43, 45};
+ALIGN const UINT64 rot_21_61[2] = {21, 61};
+ALIGN const UINT64 rot_14_28[2] = {14, 28};
+ALIGN const UINT64 rot_1_36[2] = { 1, 36};
+ALIGN const UINT64 rot_6_10[2] = { 6, 10};
+ALIGN const UINT64 rot_25_15[2] = {25, 15};
+ALIGN const UINT64 rot_8_56[2] = { 8, 56};
+ALIGN const UINT64 rot_18_27[2] = {18, 27};
+ALIGN const UINT64 rot_62_55[2] = {62, 55};
+ALIGN const UINT64 rot_39_41[2] = {39, 41};
+
+#if defined(UseSimulatedXOP)
+ /* For debugging purposes, when XOP is not available */
+ #undef ROL6464
+ #undef ROL6464same
+ #define ROL6464same(a, o) _mm_or_si128(_mm_slli_epi64(a, o), _mm_srli_epi64(a, 64-(o)))
+ V128 ROL6464(V128 a, int r0, int r1)
+ {
+ V128 a0 = ROL64(a, r0);
+ V128 a1 = COPY64HI2LO(ROL64(a, r1));
+ return GET64LOLO(a0, a1);
+ }
+#endif
+
+ #include "KeccakF-1600-xop.macros"
+
+ #ifdef UseBebigokimisa
+ #error "UseBebigokimisa cannot be used in combination with UseXOP"
+ #endif
+#elif defined(UseMMX)
+ #include <mmintrin.h>
+ typedef __m64 V64;
+ #define ANDnu64(a, b) _mm_andnot_si64(a, b)
+
+ #if (defined(_MSC_VER) || defined (__INTEL_COMPILER))
+ #define LOAD64(a) *(V64*)&(a)
+ #define CONST64(a) *(V64*)&(a)
+ #define STORE64(a, b) *(V64*)&(a) = b
+ #else
+ #define LOAD64(a) (V64)a
+ #define CONST64(a) (V64)a
+ #define STORE64(a, b) a = (UINT64)b
+ #endif
+ #define ROL64(a, o) _mm_or_si64(_mm_slli_si64(a, o), _mm_srli_si64(a, 64-(o)))
+ #define XOR64(a, b) _mm_xor_si64(a, b)
+ #define XOReq64(a, b) a = _mm_xor_si64(a, b)
+
+ #include "KeccakF-1600-simd64.macros"
+
+ #ifdef UseBebigokimisa
+ #error "UseBebigokimisa cannot be used in combination with UseMMX"
+ #endif
+#else
+ #if defined(_MSC_VER)
+ #define ROL64(a, offset) _rotl64(a, offset)
+ #elif defined(UseSHLD)
+ #define ROL64(x,N) ({ \
+ register UINT64 __out; \
+ register UINT64 __in = x; \
+ __asm__ ("shld %2,%0,%0" : "=r"(__out) : "0"(__in), "i"(N)); \
+ __out; \
+ })
+ #else
+ #define ROL64(a, offset) ((((UINT64)a) << offset) ^ (((UINT64)a) >> (64-offset)))
+ #endif
+
+ #include "KeccakF-1600-64.macros"
+#endif
+
+#include "KeccakF-1600-unrolling.macros"
+
+static void KeccakPermutationOnWords(UINT64 *state)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromState(A, state)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+
+static void KeccakPermutationOnWordsAfterXoring(UINT64 *state, const UINT64 *input, unsigned int laneCount)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+ unsigned int j;
+
+ for(j=0; j<laneCount; j++)
+ state[j] ^= input[j];
+ copyFromState(A, state)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+
+#ifdef ProvideFast576
+static void KeccakPermutationOnWordsAfterXoring576bits(UINT64 *state, const UINT64 *input)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromStateAndXor576bits(A, state, input)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+#endif
+
+#ifdef ProvideFast832
+static void KeccakPermutationOnWordsAfterXoring832bits(UINT64 *state, const UINT64 *input)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromStateAndXor832bits(A, state, input)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+#endif
+
+#ifdef ProvideFast1024
+static void KeccakPermutationOnWordsAfterXoring1024bits(UINT64 *state, const UINT64 *input)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromStateAndXor1024bits(A, state, input)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+#endif
+
+#ifdef ProvideFast1088
+static void KeccakPermutationOnWordsAfterXoring1088bits(UINT64 *state, const UINT64 *input)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromStateAndXor1088bits(A, state, input)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+#endif
+
+#ifdef ProvideFast1152
+static void KeccakPermutationOnWordsAfterXoring1152bits(UINT64 *state, const UINT64 *input)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromStateAndXor1152bits(A, state, input)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+#endif
+
+#ifdef ProvideFast1344
+static void KeccakPermutationOnWordsAfterXoring1344bits(UINT64 *state, const UINT64 *input)
+{
+ declareABCDE
+#if (Unrolling != 24)
+ unsigned int i;
+#endif
+
+ copyFromStateAndXor1344bits(A, state, input)
+ rounds
+#if defined(UseMMX)
+ _mm_empty();
+#endif
+}
+#endif
+
+static void KeccakInitialize()
+{
+}
+
+static void KeccakInitializeState(unsigned char *state)
+{
+ memset(state, 0, 200);
+#ifdef UseBebigokimisa
+ ((UINT64*)state)[ 1] = ~(UINT64)0;
+ ((UINT64*)state)[ 2] = ~(UINT64)0;
+ ((UINT64*)state)[ 8] = ~(UINT64)0;
+ ((UINT64*)state)[12] = ~(UINT64)0;
+ ((UINT64*)state)[17] = ~(UINT64)0;
+ ((UINT64*)state)[20] = ~(UINT64)0;
+#endif
+}
+
+static void KeccakPermutation(unsigned char *state)
+{
+ /* We assume the state is always stored as words */
+ KeccakPermutationOnWords((UINT64*)state);
+}
+
+#if (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN)
+static void fromBytesToWord(UINT64 *word, const UINT8 *bytes)
+{
+ unsigned int i;
+
+ *word = 0;
+ for(i=0; i<(64/8); i++)
+ *word |= (UINT64)(bytes[i]) << (8*i);
+}
+#endif
+
+
+#ifdef ProvideFast576
+static void KeccakAbsorb576bits(unsigned char *state, const unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring576bits((UINT64*)state, (const UINT64*)data);
+#else
+ UINT64 dataAsWords[9];
+ unsigned int i;
+
+ for(i=0; i<9; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring576bits((UINT64*)state, dataAsWords);
+#endif
+}
+#endif
+
+#ifdef ProvideFast832
+static void KeccakAbsorb832bits(unsigned char *state, const unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring832bits((UINT64*)state, (const UINT64*)data);
+#else
+ UINT64 dataAsWords[13];
+ unsigned int i;
+
+ for(i=0; i<13; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring832bits((UINT64*)state, dataAsWords);
+#endif
+}
+#endif
+
+#ifdef ProvideFast1024
+static void KeccakAbsorb1024bits(unsigned char *state, const unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring1024bits((UINT64*)state, (const UINT64*)data);
+#else
+ UINT64 dataAsWords[16];
+ unsigned int i;
+
+ for(i=0; i<16; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring1024bits((UINT64*)state, dataAsWords);
+#endif
+}
+#endif
+
+#ifdef ProvideFast1088
+static void KeccakAbsorb1088bits(unsigned char *state, const unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring1088bits((UINT64*)state, (const UINT64*)data);
+#else
+ UINT64 dataAsWords[17];
+ unsigned int i;
+
+ for(i=0; i<17; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring1088bits((UINT64*)state, dataAsWords);
+#endif
+}
+#endif
+
+#ifdef ProvideFast1152
+static void KeccakAbsorb1152bits(unsigned char *state, const unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring1152bits((UINT64*)state, (const UINT64*)data);
+#else
+ UINT64 dataAsWords[18];
+ unsigned int i;
+
+ for(i=0; i<18; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring1152bits((UINT64*)state, dataAsWords);
+#endif
+}
+#endif
+
+#ifdef ProvideFast1344
+static void KeccakAbsorb1344bits(unsigned char *state, const unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring1344bits((UINT64*)state, (const UINT64*)data);
+#else
+ UINT64 dataAsWords[21];
+ unsigned int i;
+
+ for(i=0; i<21; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring1344bits((UINT64*)state, dataAsWords);
+#endif
+}
+#endif
+
+static void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsigned int laneCount)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ KeccakPermutationOnWordsAfterXoring((UINT64*)state, (const UINT64*)data, laneCount);
+#else
+ UINT64 dataAsWords[25];
+ unsigned int i;
+
+ for(i=0; i<laneCount; i++)
+ fromBytesToWord(dataAsWords+i, data+(i*8));
+ KeccakPermutationOnWordsAfterXoring((UINT64*)state, dataAsWords, laneCount);
+#endif
+}
+
+#if (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN)
+static void fromWordToBytes(UINT8 *bytes, const UINT64 word)
+{
+ unsigned int i;
+
+ for(i=0; i<(64/8); i++)
+ bytes[i] = (word >> (8*i)) & 0xFF;
+}
+#endif
+
+
+#ifdef ProvideFast1024
+static void KeccakExtract1024bits(const unsigned char *state, unsigned char *data)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ memcpy(data, state, 128);
+#else
+ unsigned int i;
+
+ for(i=0; i<16; i++)
+ fromWordToBytes(data+(i*8), ((const UINT64*)state)[i]);
+#endif
+#ifdef UseBebigokimisa
+ ((UINT64*)data)[ 1] = ~((UINT64*)data)[ 1];
+ ((UINT64*)data)[ 2] = ~((UINT64*)data)[ 2];
+ ((UINT64*)data)[ 8] = ~((UINT64*)data)[ 8];
+ ((UINT64*)data)[12] = ~((UINT64*)data)[12];
+#endif
+}
+#endif
+
+static void KeccakExtract(const unsigned char *state, unsigned char *data, unsigned int laneCount)
+{
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
+ memcpy(data, state, laneCount*8);
+#else
+ unsigned int i;
+
+ for(i=0; i<laneCount; i++)
+ fromWordToBytes(data+(i*8), ((const UINT64*)state)[i]);
+#endif
+#ifdef UseBebigokimisa
+ if (laneCount > 1) {
+ ((UINT64*)data)[ 1] = ~((UINT64*)data)[ 1];
+ if (laneCount > 2) {
+ ((UINT64*)data)[ 2] = ~((UINT64*)data)[ 2];
+ if (laneCount > 8) {
+ ((UINT64*)data)[ 8] = ~((UINT64*)data)[ 8];
+ if (laneCount > 12) {
+ ((UINT64*)data)[12] = ~((UINT64*)data)[12];
+ if (laneCount > 17) {
+ ((UINT64*)data)[17] = ~((UINT64*)data)[17];
+ if (laneCount > 20) {
+ ((UINT64*)data)[20] = ~((UINT64*)data)[20];
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+}
diff --git a/Modules/_sha3/keccak/KeccakF-1600-simd128.macros b/Modules/_sha3/keccak/KeccakF-1600-simd128.macros
new file mode 100644
index 0000000..98e47f5
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-simd128.macros
@@ -0,0 +1,651 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#define declareABCDE \
+ V6464 Abage, Abegi, Abigo, Abogu, Abuga; \
+ V6464 Akame, Akemi, Akimo, Akomu, Akuma; \
+ V6464 Abae, Abio, Agae, Agio, Akae, Akio, Amae, Amio, Asae, Asio; \
+ V64 Aba, Abe, Abi, Abo, Abu; \
+ V64 Aga, Age, Agi, Ago, Agu; \
+ V64 Aka, Ake, Aki, Ako, Aku; \
+ V64 Ama, Ame, Ami, Amo, Amu; \
+ V64 Asa, Ase, Asi, Aso, Asu; \
+ V128 Bbage, Bbegi, Bbigo, Bbogu, Bbuga; \
+ V128 Bkame, Bkemi, Bkimo, Bkomu, Bkuma; \
+ V64 Bba, Bbe, Bbi, Bbo, Bbu; \
+ V64 Bga, Bge, Bgi, Bgo, Bgu; \
+ V64 Bka, Bke, Bki, Bko, Bku; \
+ V64 Bma, Bme, Bmi, Bmo, Bmu; \
+ V64 Bsa, Bse, Bsi, Bso, Bsu; \
+ V128 Cae, Cei, Cio, Cou, Cua, Dei, Dou; \
+ V64 Ca, Ce, Ci, Co, Cu; \
+ V64 Da, De, Di, Do, Du; \
+ V6464 Ebage, Ebegi, Ebigo, Ebogu, Ebuga; \
+ V6464 Ekame, Ekemi, Ekimo, Ekomu, Ekuma; \
+ V64 Eba, Ebe, Ebi, Ebo, Ebu; \
+ V64 Ega, Ege, Egi, Ego, Egu; \
+ V64 Eka, Eke, Eki, Eko, Eku; \
+ V64 Ema, Eme, Emi, Emo, Emu; \
+ V64 Esa, Ese, Esi, Eso, Esu; \
+ V128 Zero;
+
+#define prepareTheta
+
+#define computeD \
+ Cua = GET64LOLO(Cu, Cae); \
+ Dei = XOR128(Cae, ROL64in128(Cio, 1)); \
+ Dou = XOR128(Cio, ROL64in128(Cua, 1)); \
+ Da = XOR64(Cu, ROL64in128(COPY64HI2LO(Cae), 1)); \
+ De = Dei; \
+ Di = COPY64HI2LO(Dei); \
+ Do = Dou; \
+ Du = COPY64HI2LO(Dou);
+
+/* --- Theta Rho Pi Chi Iota Prepare-theta */
+/* --- 64-bit lanes mapped to 64-bit and 128-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ computeD \
+ \
+ A##ba = LOAD64(A##bage.v64[0]); \
+ XOReq64(A##ba, Da); \
+ Bba = A##ba; \
+ XOReq64(A##gu, Du); \
+ Bge = ROL64(A##gu, 20); \
+ Bbage = GET64LOLO(Bba, Bge); \
+ A##ge = LOAD64(A##bage.v64[1]); \
+ XOReq64(A##ge, De); \
+ Bbe = ROL64(A##ge, 44); \
+ A##ka = LOAD64(A##kame.v64[0]); \
+ XOReq64(A##ka, Da); \
+ Bgi = ROL64(A##ka, 3); \
+ Bbegi = GET64LOLO(Bbe, Bgi); \
+ XOReq64(A##ki, Di); \
+ Bbi = ROL64(A##ki, 43); \
+ A##me = LOAD64(A##kame.v64[1]); \
+ XOReq64(A##me, De); \
+ Bgo = ROL64(A##me, 45); \
+ Bbigo = GET64LOLO(Bbi, Bgo); \
+ E##bage.v128 = XOR128(Bbage, ANDnu128(Bbegi, Bbigo)); \
+ XOReq128(E##bage.v128, CONST64(KeccakF1600RoundConstants[i])); \
+ Cae = E##bage.v128; \
+ XOReq64(A##mo, Do); \
+ Bbo = ROL64(A##mo, 21); \
+ XOReq64(A##si, Di); \
+ Bgu = ROL64(A##si, 61); \
+ Bbogu = GET64LOLO(Bbo, Bgu); \
+ E##begi.v128 = XOR128(Bbegi, ANDnu128(Bbigo, Bbogu)); \
+ Cei = E##begi.v128; \
+ XOReq64(A##su, Du); \
+ Bbu = ROL64(A##su, 14); \
+ XOReq64(A##bo, Do); \
+ Bga = ROL64(A##bo, 28); \
+ Bbuga = GET64LOLO(Bbu, Bga); \
+ E##bigo.v128 = XOR128(Bbigo, ANDnu128(Bbogu, Bbuga)); \
+ E##bi = E##bigo.v128; \
+ E##go = GET64HIHI(E##bigo.v128, E##bigo.v128); \
+ Cio = E##bigo.v128; \
+ E##bogu.v128 = XOR128(Bbogu, ANDnu128(Bbuga, Bbage)); \
+ E##bo = E##bogu.v128; \
+ E##gu = GET64HIHI(E##bogu.v128, E##bogu.v128); \
+ Cou = E##bogu.v128; \
+ E##buga.v128 = XOR128(Bbuga, ANDnu128(Bbage, Bbegi)); \
+ E##bu = E##buga.v128; \
+ E##ga = GET64HIHI(E##buga.v128, E##buga.v128); \
+ Cua = E##buga.v128; \
+\
+ A##be = LOAD64(A##begi.v64[0]); \
+ XOReq64(A##be, De); \
+ Bka = ROL64(A##be, 1); \
+ XOReq64(A##ga, Da); \
+ Bme = ROL64(A##ga, 36); \
+ Bkame = GET64LOLO(Bka, Bme); \
+ A##gi = LOAD64(A##begi.v64[1]); \
+ XOReq64(A##gi, Di); \
+ Bke = ROL64(A##gi, 6); \
+ A##ke = LOAD64(A##kemi.v64[0]); \
+ XOReq64(A##ke, De); \
+ Bmi = ROL64(A##ke, 10); \
+ Bkemi = GET64LOLO(Bke, Bmi); \
+ XOReq64(A##ko, Do); \
+ Bki = ROL64(A##ko, 25); \
+ A##mi = LOAD64(A##kemi.v64[1]); \
+ XOReq64(A##mi, Di); \
+ Bmo = ROL64(A##mi, 15); \
+ Bkimo = GET64LOLO(Bki, Bmo); \
+ E##kame.v128 = XOR128(Bkame, ANDnu128(Bkemi, Bkimo)); \
+ XOReq128(Cae, E##kame.v128); \
+ Bkomu = GET64LOLO(XOR64(A##mu, Du), XOR64(A##so, Do)); \
+ Bkomu = SHUFFLEBYTES128(Bkomu, CONST128(rho8_56)); \
+ E##kemi.v128 = XOR128(Bkemi, ANDnu128(Bkimo, Bkomu)); \
+ XOReq128(Cei, E##kemi.v128); \
+ XOReq64(A##sa, Da); \
+ Bku = ROL64(A##sa, 18); \
+ XOReq64(A##bu, Du); \
+ Bma = ROL64(A##bu, 27); \
+ Bkuma = GET64LOLO(Bku, Bma); \
+ E##kimo.v128 = XOR128(Bkimo, ANDnu128(Bkomu, Bkuma)); \
+ E##ki = E##kimo.v128; \
+ E##mo = GET64HIHI(E##kimo.v128, E##kimo.v128); \
+ XOReq128(Cio, E##kimo.v128); \
+ E##komu.v128 = XOR128(Bkomu, ANDnu128(Bkuma, Bkame)); \
+ E##ko = E##komu.v128; \
+ E##mu = GET64HIHI(E##komu.v128, E##komu.v128); \
+ XOReq128(Cou, E##komu.v128); \
+ E##kuma.v128 = XOR128(Bkuma, ANDnu128(Bkame, Bkemi)); \
+ E##ku = E##kuma.v128; \
+ E##ma = GET64HIHI(E##kuma.v128, E##kuma.v128); \
+ XOReq128(Cua, E##kuma.v128); \
+\
+ XOReq64(A##bi, Di); \
+ Bsa = ROL64(A##bi, 62); \
+ XOReq64(A##go, Do); \
+ Bse = ROL64(A##go, 55); \
+ XOReq64(A##ku, Du); \
+ Bsi = ROL64(A##ku, 39); \
+ E##sa = XOR64(Bsa, ANDnu64(Bse, Bsi)); \
+ Ca = E##sa; \
+ XOReq64(A##ma, Da); \
+ Bso = ROL64(A##ma, 41); \
+ E##se = XOR64(Bse, ANDnu64(Bsi, Bso)); \
+ Ce = E##se; \
+ XOReq128(Cae, GET64LOLO(Ca, Ce)); \
+ XOReq64(A##se, De); \
+ Bsu = ROL64(A##se, 2); \
+ E##si = XOR64(Bsi, ANDnu64(Bso, Bsu)); \
+ Ci = E##si; \
+ E##so = XOR64(Bso, ANDnu64(Bsu, Bsa)); \
+ Co = E##so; \
+ XOReq128(Cio, GET64LOLO(Ci, Co)); \
+ E##su = XOR64(Bsu, ANDnu64(Bsa, Bse)); \
+ Cu = E##su; \
+\
+ Zero = ZERO128(); \
+ XOReq128(Cae, GET64HIHI(Cua, Zero)); \
+ XOReq128(Cae, GET64LOLO(Zero, Cei)); \
+ XOReq128(Cio, GET64HIHI(Cei, Zero)); \
+ XOReq128(Cio, GET64LOLO(Zero, Cou)); \
+ XOReq128(Cua, GET64HIHI(Cou, Zero)); \
+ XOReq64(Cu, Cua); \
+
+/* --- Theta Rho Pi Chi Iota */
+/* --- 64-bit lanes mapped to 64-bit and 128-bit words */
+#define thetaRhoPiChiIota(i, A, E) thetaRhoPiChiIotaPrepareTheta(i, A, E)
+
+static const UINT64 KeccakF1600RoundConstants[24] = {
+ 0x0000000000000001ULL,
+ 0x0000000000008082ULL,
+ 0x800000000000808aULL,
+ 0x8000000080008000ULL,
+ 0x000000000000808bULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008009ULL,
+ 0x000000000000008aULL,
+ 0x0000000000000088ULL,
+ 0x0000000080008009ULL,
+ 0x000000008000000aULL,
+ 0x000000008000808bULL,
+ 0x800000000000008bULL,
+ 0x8000000000008089ULL,
+ 0x8000000000008003ULL,
+ 0x8000000000008002ULL,
+ 0x8000000000000080ULL,
+ 0x000000000000800aULL,
+ 0x800000008000000aULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008080ULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008008ULL };
+
+#define copyFromStateAndXor576bits(X, state, input) \
+ X##bae.v128 = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cu = X##bu; \
+ X##gae.v128 = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = LOAD64(state[ 9]); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = LOAD128(state[10]); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = LOAD128(state[12]); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = LOAD64(state[14]); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = LOAD128u(state[15]); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = LOAD128u(state[17]); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = LOAD64(state[19]); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = LOAD128(state[20]); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyFromStateAndXor832bits(X, state, input) \
+ X##bae.v128 = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cu = X##bu; \
+ X##gae.v128 = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = XOR128(LOAD128(state[12]), LOAD64(input[12])); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = LOAD64(state[14]); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = LOAD128u(state[15]); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = LOAD128u(state[17]); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = LOAD64(state[19]); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = LOAD128(state[20]); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyFromStateAndXor1024bits(X, state, input) \
+ X##bae.v128 = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cu = X##bu; \
+ X##gae.v128 = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = XOR128(LOAD128u(state[15]), LOAD64(input[15])); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = LOAD128u(state[17]); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = LOAD64(state[19]); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = LOAD128(state[20]); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyFromStateAndXor1088bits(X, state, input) \
+ X##bae.v128 = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cu = X##bu; \
+ X##gae.v128 = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = XOR128(LOAD128u(state[15]), LOAD128u(input[15])); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = LOAD128u(state[17]); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = LOAD64(state[19]); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = LOAD128(state[20]); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyFromStateAndXor1152bits(X, state, input) \
+ X##bae.v128 = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cu = X##bu; \
+ X##gae.v128 = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = XOR128(LOAD128u(state[15]), LOAD128u(input[15])); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = XOR128(LOAD128u(state[17]), LOAD64(input[17])); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = LOAD64(state[19]); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = LOAD128(state[20]); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyFromStateAndXor1344bits(X, state, input) \
+ X##bae.v128 = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cu = X##bu; \
+ X##gae.v128 = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = XOR128(LOAD128u(state[15]), LOAD128u(input[15])); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = XOR128(LOAD128u(state[17]), LOAD128u(input[17])); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = XOR64(LOAD64(state[19]), LOAD64(input[19])); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = XOR128(LOAD128(state[20]), LOAD64(input[20])); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyFromState(X, state) \
+ X##bae.v128 = LOAD128(state[ 0]); \
+ X##ba = X##bae.v128; \
+ X##be = GET64HIHI(X##bae.v128, X##bae.v128); \
+ Cae = X##bae.v128; \
+ X##bio.v128 = LOAD128(state[ 2]); \
+ X##bi = X##bio.v128; \
+ X##bo = GET64HIHI(X##bio.v128, X##bio.v128); \
+ Cio = X##bio.v128; \
+ X##bu = LOAD64(state[ 4]); \
+ Cu = X##bu; \
+ X##gae.v128 = LOAD128u(state[ 5]); \
+ X##ga = X##gae.v128; \
+ X##ge = GET64HIHI(X##gae.v128, X##gae.v128); \
+ X##bage.v128 = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae.v128); \
+ X##gio.v128 = LOAD128u(state[ 7]); \
+ X##gi = X##gio.v128; \
+ X##begi.v128 = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio.v128, X##gio.v128); \
+ XOReq128(Cio, X##gio.v128); \
+ X##gu = LOAD64(state[ 9]); \
+ XOReq64(Cu, X##gu); \
+ X##kae.v128 = LOAD128(state[10]); \
+ X##ka = X##kae.v128; \
+ X##ke = GET64HIHI(X##kae.v128, X##kae.v128); \
+ XOReq128(Cae, X##kae.v128); \
+ X##kio.v128 = LOAD128(state[12]); \
+ X##ki = X##kio.v128; \
+ X##ko = GET64HIHI(X##kio.v128, X##kio.v128); \
+ XOReq128(Cio, X##kio.v128); \
+ X##ku = LOAD64(state[14]); \
+ XOReq64(Cu, X##ku); \
+ X##mae.v128 = LOAD128u(state[15]); \
+ X##ma = X##mae.v128; \
+ X##me = GET64HIHI(X##mae.v128, X##mae.v128); \
+ X##kame.v128 = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, X##mae.v128); \
+ X##mio.v128 = LOAD128u(state[17]); \
+ X##mi = X##mio.v128; \
+ X##kemi.v128 = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio.v128, X##mio.v128); \
+ XOReq128(Cio, X##mio.v128); \
+ X##mu = LOAD64(state[19]); \
+ XOReq64(Cu, X##mu); \
+ X##sae.v128 = LOAD128(state[20]); \
+ X##sa = X##sae.v128; \
+ X##se = GET64HIHI(X##sae.v128, X##sae.v128); \
+ XOReq128(Cae, X##sae.v128); \
+ X##sio.v128 = LOAD128(state[22]); \
+ X##si = X##sio.v128; \
+ X##so = GET64HIHI(X##sio.v128, X##sio.v128); \
+ XOReq128(Cio, X##sio.v128); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cu, X##su); \
+
+#define copyToState(state, X) \
+ state[ 0] = A##bage.v64[0]; \
+ state[ 1] = A##begi.v64[0]; \
+ STORE64(state[ 2], X##bi); \
+ STORE64(state[ 3], X##bo); \
+ STORE64(state[ 4], X##bu); \
+ STORE64(state[ 5], X##ga); \
+ state[ 6] = A##bage.v64[1]; \
+ state[ 7] = A##begi.v64[1]; \
+ STORE64(state[ 8], X##go); \
+ STORE64(state[ 9], X##gu); \
+ state[10] = X##kame.v64[0]; \
+ state[11] = X##kemi.v64[0]; \
+ STORE64(state[12], X##ki); \
+ STORE64(state[13], X##ko); \
+ STORE64(state[14], X##ku); \
+ STORE64(state[15], X##ma); \
+ state[16] = X##kame.v64[1]; \
+ state[17] = X##kemi.v64[1]; \
+ STORE64(state[18], X##mo); \
+ STORE64(state[19], X##mu); \
+ STORE64(state[20], X##sa); \
+ STORE64(state[21], X##se); \
+ STORE64(state[22], X##si); \
+ STORE64(state[23], X##so); \
+ STORE64(state[24], X##su); \
+
+#define copyStateVariables(X, Y) \
+ X##bage = Y##bage; \
+ X##begi = Y##begi; \
+ X##bi = Y##bi; \
+ X##bo = Y##bo; \
+ X##bu = Y##bu; \
+ X##ga = Y##ga; \
+ X##go = Y##go; \
+ X##gu = Y##gu; \
+ X##kame = Y##kame; \
+ X##kemi = Y##kemi; \
+ X##ki = Y##ki; \
+ X##ko = Y##ko; \
+ X##ku = Y##ku; \
+ X##ma = Y##ma; \
+ X##mo = Y##mo; \
+ X##mu = Y##mu; \
+ X##sa = Y##sa; \
+ X##se = Y##se; \
+ X##si = Y##si; \
+ X##so = Y##so; \
+ X##su = Y##su; \
+
diff --git a/Modules/_sha3/keccak/KeccakF-1600-simd64.macros b/Modules/_sha3/keccak/KeccakF-1600-simd64.macros
new file mode 100644
index 0000000..06a30e2
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-simd64.macros
@@ -0,0 +1,517 @@
+/*
+Code automatically generated by KeccakTools!
+
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#define declareABCDE \
+ V64 Aba, Abe, Abi, Abo, Abu; \
+ V64 Aga, Age, Agi, Ago, Agu; \
+ V64 Aka, Ake, Aki, Ako, Aku; \
+ V64 Ama, Ame, Ami, Amo, Amu; \
+ V64 Asa, Ase, Asi, Aso, Asu; \
+ V64 Bba, Bbe, Bbi, Bbo, Bbu; \
+ V64 Bga, Bge, Bgi, Bgo, Bgu; \
+ V64 Bka, Bke, Bki, Bko, Bku; \
+ V64 Bma, Bme, Bmi, Bmo, Bmu; \
+ V64 Bsa, Bse, Bsi, Bso, Bsu; \
+ V64 Ca, Ce, Ci, Co, Cu; \
+ V64 Da, De, Di, Do, Du; \
+ V64 Eba, Ebe, Ebi, Ebo, Ebu; \
+ V64 Ega, Ege, Egi, Ego, Egu; \
+ V64 Eka, Eke, Eki, Eko, Eku; \
+ V64 Ema, Eme, Emi, Emo, Emu; \
+ V64 Esa, Ese, Esi, Eso, Esu; \
+
+#define prepareTheta \
+ Ca = XOR64(Aba, XOR64(Aga, XOR64(Aka, XOR64(Ama, Asa)))); \
+ Ce = XOR64(Abe, XOR64(Age, XOR64(Ake, XOR64(Ame, Ase)))); \
+ Ci = XOR64(Abi, XOR64(Agi, XOR64(Aki, XOR64(Ami, Asi)))); \
+ Co = XOR64(Abo, XOR64(Ago, XOR64(Ako, XOR64(Amo, Aso)))); \
+ Cu = XOR64(Abu, XOR64(Agu, XOR64(Aku, XOR64(Amu, Asu)))); \
+
+/* --- Code for round, with prepare-theta */
+/* --- 64-bit lanes mapped to 64-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ Da = XOR64(Cu, ROL64(Ce, 1)); \
+ De = XOR64(Ca, ROL64(Ci, 1)); \
+ Di = XOR64(Ce, ROL64(Co, 1)); \
+ Do = XOR64(Ci, ROL64(Cu, 1)); \
+ Du = XOR64(Co, ROL64(Ca, 1)); \
+\
+ XOReq64(A##ba, Da); \
+ Bba = A##ba; \
+ XOReq64(A##ge, De); \
+ Bbe = ROL64(A##ge, 44); \
+ XOReq64(A##ki, Di); \
+ Bbi = ROL64(A##ki, 43); \
+ E##ba = XOR64(Bba, ANDnu64(Bbe, Bbi)); \
+ XOReq64(E##ba, CONST64(KeccakF1600RoundConstants[i])); \
+ Ca = E##ba; \
+ XOReq64(A##mo, Do); \
+ Bbo = ROL64(A##mo, 21); \
+ E##be = XOR64(Bbe, ANDnu64(Bbi, Bbo)); \
+ Ce = E##be; \
+ XOReq64(A##su, Du); \
+ Bbu = ROL64(A##su, 14); \
+ E##bi = XOR64(Bbi, ANDnu64(Bbo, Bbu)); \
+ Ci = E##bi; \
+ E##bo = XOR64(Bbo, ANDnu64(Bbu, Bba)); \
+ Co = E##bo; \
+ E##bu = XOR64(Bbu, ANDnu64(Bba, Bbe)); \
+ Cu = E##bu; \
+\
+ XOReq64(A##bo, Do); \
+ Bga = ROL64(A##bo, 28); \
+ XOReq64(A##gu, Du); \
+ Bge = ROL64(A##gu, 20); \
+ XOReq64(A##ka, Da); \
+ Bgi = ROL64(A##ka, 3); \
+ E##ga = XOR64(Bga, ANDnu64(Bge, Bgi)); \
+ XOReq64(Ca, E##ga); \
+ XOReq64(A##me, De); \
+ Bgo = ROL64(A##me, 45); \
+ E##ge = XOR64(Bge, ANDnu64(Bgi, Bgo)); \
+ XOReq64(Ce, E##ge); \
+ XOReq64(A##si, Di); \
+ Bgu = ROL64(A##si, 61); \
+ E##gi = XOR64(Bgi, ANDnu64(Bgo, Bgu)); \
+ XOReq64(Ci, E##gi); \
+ E##go = XOR64(Bgo, ANDnu64(Bgu, Bga)); \
+ XOReq64(Co, E##go); \
+ E##gu = XOR64(Bgu, ANDnu64(Bga, Bge)); \
+ XOReq64(Cu, E##gu); \
+\
+ XOReq64(A##be, De); \
+ Bka = ROL64(A##be, 1); \
+ XOReq64(A##gi, Di); \
+ Bke = ROL64(A##gi, 6); \
+ XOReq64(A##ko, Do); \
+ Bki = ROL64(A##ko, 25); \
+ E##ka = XOR64(Bka, ANDnu64(Bke, Bki)); \
+ XOReq64(Ca, E##ka); \
+ XOReq64(A##mu, Du); \
+ Bko = ROL64(A##mu, 8); \
+ E##ke = XOR64(Bke, ANDnu64(Bki, Bko)); \
+ XOReq64(Ce, E##ke); \
+ XOReq64(A##sa, Da); \
+ Bku = ROL64(A##sa, 18); \
+ E##ki = XOR64(Bki, ANDnu64(Bko, Bku)); \
+ XOReq64(Ci, E##ki); \
+ E##ko = XOR64(Bko, ANDnu64(Bku, Bka)); \
+ XOReq64(Co, E##ko); \
+ E##ku = XOR64(Bku, ANDnu64(Bka, Bke)); \
+ XOReq64(Cu, E##ku); \
+\
+ XOReq64(A##bu, Du); \
+ Bma = ROL64(A##bu, 27); \
+ XOReq64(A##ga, Da); \
+ Bme = ROL64(A##ga, 36); \
+ XOReq64(A##ke, De); \
+ Bmi = ROL64(A##ke, 10); \
+ E##ma = XOR64(Bma, ANDnu64(Bme, Bmi)); \
+ XOReq64(Ca, E##ma); \
+ XOReq64(A##mi, Di); \
+ Bmo = ROL64(A##mi, 15); \
+ E##me = XOR64(Bme, ANDnu64(Bmi, Bmo)); \
+ XOReq64(Ce, E##me); \
+ XOReq64(A##so, Do); \
+ Bmu = ROL64(A##so, 56); \
+ E##mi = XOR64(Bmi, ANDnu64(Bmo, Bmu)); \
+ XOReq64(Ci, E##mi); \
+ E##mo = XOR64(Bmo, ANDnu64(Bmu, Bma)); \
+ XOReq64(Co, E##mo); \
+ E##mu = XOR64(Bmu, ANDnu64(Bma, Bme)); \
+ XOReq64(Cu, E##mu); \
+\
+ XOReq64(A##bi, Di); \
+ Bsa = ROL64(A##bi, 62); \
+ XOReq64(A##go, Do); \
+ Bse = ROL64(A##go, 55); \
+ XOReq64(A##ku, Du); \
+ Bsi = ROL64(A##ku, 39); \
+ E##sa = XOR64(Bsa, ANDnu64(Bse, Bsi)); \
+ XOReq64(Ca, E##sa); \
+ XOReq64(A##ma, Da); \
+ Bso = ROL64(A##ma, 41); \
+ E##se = XOR64(Bse, ANDnu64(Bsi, Bso)); \
+ XOReq64(Ce, E##se); \
+ XOReq64(A##se, De); \
+ Bsu = ROL64(A##se, 2); \
+ E##si = XOR64(Bsi, ANDnu64(Bso, Bsu)); \
+ XOReq64(Ci, E##si); \
+ E##so = XOR64(Bso, ANDnu64(Bsu, Bsa)); \
+ XOReq64(Co, E##so); \
+ E##su = XOR64(Bsu, ANDnu64(Bsa, Bse)); \
+ XOReq64(Cu, E##su); \
+\
+
+/* --- Code for round */
+/* --- 64-bit lanes mapped to 64-bit words */
+#define thetaRhoPiChiIota(i, A, E) \
+ Da = XOR64(Cu, ROL64(Ce, 1)); \
+ De = XOR64(Ca, ROL64(Ci, 1)); \
+ Di = XOR64(Ce, ROL64(Co, 1)); \
+ Do = XOR64(Ci, ROL64(Cu, 1)); \
+ Du = XOR64(Co, ROL64(Ca, 1)); \
+\
+ XOReq64(A##ba, Da); \
+ Bba = A##ba; \
+ XOReq64(A##ge, De); \
+ Bbe = ROL64(A##ge, 44); \
+ XOReq64(A##ki, Di); \
+ Bbi = ROL64(A##ki, 43); \
+ E##ba = XOR64(Bba, ANDnu64(Bbe, Bbi)); \
+ XOReq64(E##ba, CONST64(KeccakF1600RoundConstants[i])); \
+ XOReq64(A##mo, Do); \
+ Bbo = ROL64(A##mo, 21); \
+ E##be = XOR64(Bbe, ANDnu64(Bbi, Bbo)); \
+ XOReq64(A##su, Du); \
+ Bbu = ROL64(A##su, 14); \
+ E##bi = XOR64(Bbi, ANDnu64(Bbo, Bbu)); \
+ E##bo = XOR64(Bbo, ANDnu64(Bbu, Bba)); \
+ E##bu = XOR64(Bbu, ANDnu64(Bba, Bbe)); \
+\
+ XOReq64(A##bo, Do); \
+ Bga = ROL64(A##bo, 28); \
+ XOReq64(A##gu, Du); \
+ Bge = ROL64(A##gu, 20); \
+ XOReq64(A##ka, Da); \
+ Bgi = ROL64(A##ka, 3); \
+ E##ga = XOR64(Bga, ANDnu64(Bge, Bgi)); \
+ XOReq64(A##me, De); \
+ Bgo = ROL64(A##me, 45); \
+ E##ge = XOR64(Bge, ANDnu64(Bgi, Bgo)); \
+ XOReq64(A##si, Di); \
+ Bgu = ROL64(A##si, 61); \
+ E##gi = XOR64(Bgi, ANDnu64(Bgo, Bgu)); \
+ E##go = XOR64(Bgo, ANDnu64(Bgu, Bga)); \
+ E##gu = XOR64(Bgu, ANDnu64(Bga, Bge)); \
+\
+ XOReq64(A##be, De); \
+ Bka = ROL64(A##be, 1); \
+ XOReq64(A##gi, Di); \
+ Bke = ROL64(A##gi, 6); \
+ XOReq64(A##ko, Do); \
+ Bki = ROL64(A##ko, 25); \
+ E##ka = XOR64(Bka, ANDnu64(Bke, Bki)); \
+ XOReq64(A##mu, Du); \
+ Bko = ROL64(A##mu, 8); \
+ E##ke = XOR64(Bke, ANDnu64(Bki, Bko)); \
+ XOReq64(A##sa, Da); \
+ Bku = ROL64(A##sa, 18); \
+ E##ki = XOR64(Bki, ANDnu64(Bko, Bku)); \
+ E##ko = XOR64(Bko, ANDnu64(Bku, Bka)); \
+ E##ku = XOR64(Bku, ANDnu64(Bka, Bke)); \
+\
+ XOReq64(A##bu, Du); \
+ Bma = ROL64(A##bu, 27); \
+ XOReq64(A##ga, Da); \
+ Bme = ROL64(A##ga, 36); \
+ XOReq64(A##ke, De); \
+ Bmi = ROL64(A##ke, 10); \
+ E##ma = XOR64(Bma, ANDnu64(Bme, Bmi)); \
+ XOReq64(A##mi, Di); \
+ Bmo = ROL64(A##mi, 15); \
+ E##me = XOR64(Bme, ANDnu64(Bmi, Bmo)); \
+ XOReq64(A##so, Do); \
+ Bmu = ROL64(A##so, 56); \
+ E##mi = XOR64(Bmi, ANDnu64(Bmo, Bmu)); \
+ E##mo = XOR64(Bmo, ANDnu64(Bmu, Bma)); \
+ E##mu = XOR64(Bmu, ANDnu64(Bma, Bme)); \
+\
+ XOReq64(A##bi, Di); \
+ Bsa = ROL64(A##bi, 62); \
+ XOReq64(A##go, Do); \
+ Bse = ROL64(A##go, 55); \
+ XOReq64(A##ku, Du); \
+ Bsi = ROL64(A##ku, 39); \
+ E##sa = XOR64(Bsa, ANDnu64(Bse, Bsi)); \
+ XOReq64(A##ma, Da); \
+ Bso = ROL64(A##ma, 41); \
+ E##se = XOR64(Bse, ANDnu64(Bsi, Bso)); \
+ XOReq64(A##se, De); \
+ Bsu = ROL64(A##se, 2); \
+ E##si = XOR64(Bsi, ANDnu64(Bso, Bsu)); \
+ E##so = XOR64(Bso, ANDnu64(Bsu, Bsa)); \
+ E##su = XOR64(Bsu, ANDnu64(Bsa, Bse)); \
+\
+
+static const UINT64 KeccakF1600RoundConstants[24] = {
+ 0x0000000000000001ULL,
+ 0x0000000000008082ULL,
+ 0x800000000000808aULL,
+ 0x8000000080008000ULL,
+ 0x000000000000808bULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008009ULL,
+ 0x000000000000008aULL,
+ 0x0000000000000088ULL,
+ 0x0000000080008009ULL,
+ 0x000000008000000aULL,
+ 0x000000008000808bULL,
+ 0x800000000000008bULL,
+ 0x8000000000008089ULL,
+ 0x8000000000008003ULL,
+ 0x8000000000008002ULL,
+ 0x8000000000000080ULL,
+ 0x000000000000800aULL,
+ 0x800000008000000aULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008080ULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008008ULL };
+
+#define copyFromStateAndXor576bits(X, state, input) \
+ X##ba = XOR64(LOAD64(state[ 0]), LOAD64(input[ 0])); \
+ X##be = XOR64(LOAD64(state[ 1]), LOAD64(input[ 1])); \
+ X##bi = XOR64(LOAD64(state[ 2]), LOAD64(input[ 2])); \
+ X##bo = XOR64(LOAD64(state[ 3]), LOAD64(input[ 3])); \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ X##ga = XOR64(LOAD64(state[ 5]), LOAD64(input[ 5])); \
+ X##ge = XOR64(LOAD64(state[ 6]), LOAD64(input[ 6])); \
+ X##gi = XOR64(LOAD64(state[ 7]), LOAD64(input[ 7])); \
+ X##go = XOR64(LOAD64(state[ 8]), LOAD64(input[ 8])); \
+ X##gu = LOAD64(state[ 9]); \
+ X##ka = LOAD64(state[10]); \
+ X##ke = LOAD64(state[11]); \
+ X##ki = LOAD64(state[12]); \
+ X##ko = LOAD64(state[13]); \
+ X##ku = LOAD64(state[14]); \
+ X##ma = LOAD64(state[15]); \
+ X##me = LOAD64(state[16]); \
+ X##mi = LOAD64(state[17]); \
+ X##mo = LOAD64(state[18]); \
+ X##mu = LOAD64(state[19]); \
+ X##sa = LOAD64(state[20]); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyFromStateAndXor832bits(X, state, input) \
+ X##ba = XOR64(LOAD64(state[ 0]), LOAD64(input[ 0])); \
+ X##be = XOR64(LOAD64(state[ 1]), LOAD64(input[ 1])); \
+ X##bi = XOR64(LOAD64(state[ 2]), LOAD64(input[ 2])); \
+ X##bo = XOR64(LOAD64(state[ 3]), LOAD64(input[ 3])); \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ X##ga = XOR64(LOAD64(state[ 5]), LOAD64(input[ 5])); \
+ X##ge = XOR64(LOAD64(state[ 6]), LOAD64(input[ 6])); \
+ X##gi = XOR64(LOAD64(state[ 7]), LOAD64(input[ 7])); \
+ X##go = XOR64(LOAD64(state[ 8]), LOAD64(input[ 8])); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##ka = XOR64(LOAD64(state[10]), LOAD64(input[10])); \
+ X##ke = XOR64(LOAD64(state[11]), LOAD64(input[11])); \
+ X##ki = XOR64(LOAD64(state[12]), LOAD64(input[12])); \
+ X##ko = LOAD64(state[13]); \
+ X##ku = LOAD64(state[14]); \
+ X##ma = LOAD64(state[15]); \
+ X##me = LOAD64(state[16]); \
+ X##mi = LOAD64(state[17]); \
+ X##mo = LOAD64(state[18]); \
+ X##mu = LOAD64(state[19]); \
+ X##sa = LOAD64(state[20]); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyFromStateAndXor1024bits(X, state, input) \
+ X##ba = XOR64(LOAD64(state[ 0]), LOAD64(input[ 0])); \
+ X##be = XOR64(LOAD64(state[ 1]), LOAD64(input[ 1])); \
+ X##bi = XOR64(LOAD64(state[ 2]), LOAD64(input[ 2])); \
+ X##bo = XOR64(LOAD64(state[ 3]), LOAD64(input[ 3])); \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ X##ga = XOR64(LOAD64(state[ 5]), LOAD64(input[ 5])); \
+ X##ge = XOR64(LOAD64(state[ 6]), LOAD64(input[ 6])); \
+ X##gi = XOR64(LOAD64(state[ 7]), LOAD64(input[ 7])); \
+ X##go = XOR64(LOAD64(state[ 8]), LOAD64(input[ 8])); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##ka = XOR64(LOAD64(state[10]), LOAD64(input[10])); \
+ X##ke = XOR64(LOAD64(state[11]), LOAD64(input[11])); \
+ X##ki = XOR64(LOAD64(state[12]), LOAD64(input[12])); \
+ X##ko = XOR64(LOAD64(state[13]), LOAD64(input[13])); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ X##ma = XOR64(LOAD64(state[15]), LOAD64(input[15])); \
+ X##me = LOAD64(state[16]); \
+ X##mi = LOAD64(state[17]); \
+ X##mo = LOAD64(state[18]); \
+ X##mu = LOAD64(state[19]); \
+ X##sa = LOAD64(state[20]); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyFromStateAndXor1088bits(X, state, input) \
+ X##ba = XOR64(LOAD64(state[ 0]), LOAD64(input[ 0])); \
+ X##be = XOR64(LOAD64(state[ 1]), LOAD64(input[ 1])); \
+ X##bi = XOR64(LOAD64(state[ 2]), LOAD64(input[ 2])); \
+ X##bo = XOR64(LOAD64(state[ 3]), LOAD64(input[ 3])); \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ X##ga = XOR64(LOAD64(state[ 5]), LOAD64(input[ 5])); \
+ X##ge = XOR64(LOAD64(state[ 6]), LOAD64(input[ 6])); \
+ X##gi = XOR64(LOAD64(state[ 7]), LOAD64(input[ 7])); \
+ X##go = XOR64(LOAD64(state[ 8]), LOAD64(input[ 8])); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##ka = XOR64(LOAD64(state[10]), LOAD64(input[10])); \
+ X##ke = XOR64(LOAD64(state[11]), LOAD64(input[11])); \
+ X##ki = XOR64(LOAD64(state[12]), LOAD64(input[12])); \
+ X##ko = XOR64(LOAD64(state[13]), LOAD64(input[13])); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ X##ma = XOR64(LOAD64(state[15]), LOAD64(input[15])); \
+ X##me = XOR64(LOAD64(state[16]), LOAD64(input[16])); \
+ X##mi = LOAD64(state[17]); \
+ X##mo = LOAD64(state[18]); \
+ X##mu = LOAD64(state[19]); \
+ X##sa = LOAD64(state[20]); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyFromStateAndXor1152bits(X, state, input) \
+ X##ba = XOR64(LOAD64(state[ 0]), LOAD64(input[ 0])); \
+ X##be = XOR64(LOAD64(state[ 1]), LOAD64(input[ 1])); \
+ X##bi = XOR64(LOAD64(state[ 2]), LOAD64(input[ 2])); \
+ X##bo = XOR64(LOAD64(state[ 3]), LOAD64(input[ 3])); \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ X##ga = XOR64(LOAD64(state[ 5]), LOAD64(input[ 5])); \
+ X##ge = XOR64(LOAD64(state[ 6]), LOAD64(input[ 6])); \
+ X##gi = XOR64(LOAD64(state[ 7]), LOAD64(input[ 7])); \
+ X##go = XOR64(LOAD64(state[ 8]), LOAD64(input[ 8])); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##ka = XOR64(LOAD64(state[10]), LOAD64(input[10])); \
+ X##ke = XOR64(LOAD64(state[11]), LOAD64(input[11])); \
+ X##ki = XOR64(LOAD64(state[12]), LOAD64(input[12])); \
+ X##ko = XOR64(LOAD64(state[13]), LOAD64(input[13])); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ X##ma = XOR64(LOAD64(state[15]), LOAD64(input[15])); \
+ X##me = XOR64(LOAD64(state[16]), LOAD64(input[16])); \
+ X##mi = XOR64(LOAD64(state[17]), LOAD64(input[17])); \
+ X##mo = LOAD64(state[18]); \
+ X##mu = LOAD64(state[19]); \
+ X##sa = LOAD64(state[20]); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyFromStateAndXor1344bits(X, state, input) \
+ X##ba = XOR64(LOAD64(state[ 0]), LOAD64(input[ 0])); \
+ X##be = XOR64(LOAD64(state[ 1]), LOAD64(input[ 1])); \
+ X##bi = XOR64(LOAD64(state[ 2]), LOAD64(input[ 2])); \
+ X##bo = XOR64(LOAD64(state[ 3]), LOAD64(input[ 3])); \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ X##ga = XOR64(LOAD64(state[ 5]), LOAD64(input[ 5])); \
+ X##ge = XOR64(LOAD64(state[ 6]), LOAD64(input[ 6])); \
+ X##gi = XOR64(LOAD64(state[ 7]), LOAD64(input[ 7])); \
+ X##go = XOR64(LOAD64(state[ 8]), LOAD64(input[ 8])); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##ka = XOR64(LOAD64(state[10]), LOAD64(input[10])); \
+ X##ke = XOR64(LOAD64(state[11]), LOAD64(input[11])); \
+ X##ki = XOR64(LOAD64(state[12]), LOAD64(input[12])); \
+ X##ko = XOR64(LOAD64(state[13]), LOAD64(input[13])); \
+ X##ku = XOR64(LOAD64(state[14]), LOAD64(input[14])); \
+ X##ma = XOR64(LOAD64(state[15]), LOAD64(input[15])); \
+ X##me = XOR64(LOAD64(state[16]), LOAD64(input[16])); \
+ X##mi = XOR64(LOAD64(state[17]), LOAD64(input[17])); \
+ X##mo = XOR64(LOAD64(state[18]), LOAD64(input[18])); \
+ X##mu = XOR64(LOAD64(state[19]), LOAD64(input[19])); \
+ X##sa = XOR64(LOAD64(state[20]), LOAD64(input[20])); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyFromState(X, state) \
+ X##ba = LOAD64(state[ 0]); \
+ X##be = LOAD64(state[ 1]); \
+ X##bi = LOAD64(state[ 2]); \
+ X##bo = LOAD64(state[ 3]); \
+ X##bu = LOAD64(state[ 4]); \
+ X##ga = LOAD64(state[ 5]); \
+ X##ge = LOAD64(state[ 6]); \
+ X##gi = LOAD64(state[ 7]); \
+ X##go = LOAD64(state[ 8]); \
+ X##gu = LOAD64(state[ 9]); \
+ X##ka = LOAD64(state[10]); \
+ X##ke = LOAD64(state[11]); \
+ X##ki = LOAD64(state[12]); \
+ X##ko = LOAD64(state[13]); \
+ X##ku = LOAD64(state[14]); \
+ X##ma = LOAD64(state[15]); \
+ X##me = LOAD64(state[16]); \
+ X##mi = LOAD64(state[17]); \
+ X##mo = LOAD64(state[18]); \
+ X##mu = LOAD64(state[19]); \
+ X##sa = LOAD64(state[20]); \
+ X##se = LOAD64(state[21]); \
+ X##si = LOAD64(state[22]); \
+ X##so = LOAD64(state[23]); \
+ X##su = LOAD64(state[24]); \
+
+#define copyToState(state, X) \
+ STORE64(state[ 0], X##ba); \
+ STORE64(state[ 1], X##be); \
+ STORE64(state[ 2], X##bi); \
+ STORE64(state[ 3], X##bo); \
+ STORE64(state[ 4], X##bu); \
+ STORE64(state[ 5], X##ga); \
+ STORE64(state[ 6], X##ge); \
+ STORE64(state[ 7], X##gi); \
+ STORE64(state[ 8], X##go); \
+ STORE64(state[ 9], X##gu); \
+ STORE64(state[10], X##ka); \
+ STORE64(state[11], X##ke); \
+ STORE64(state[12], X##ki); \
+ STORE64(state[13], X##ko); \
+ STORE64(state[14], X##ku); \
+ STORE64(state[15], X##ma); \
+ STORE64(state[16], X##me); \
+ STORE64(state[17], X##mi); \
+ STORE64(state[18], X##mo); \
+ STORE64(state[19], X##mu); \
+ STORE64(state[20], X##sa); \
+ STORE64(state[21], X##se); \
+ STORE64(state[22], X##si); \
+ STORE64(state[23], X##so); \
+ STORE64(state[24], X##su); \
+
+#define copyStateVariables(X, Y) \
+ X##ba = Y##ba; \
+ X##be = Y##be; \
+ X##bi = Y##bi; \
+ X##bo = Y##bo; \
+ X##bu = Y##bu; \
+ X##ga = Y##ga; \
+ X##ge = Y##ge; \
+ X##gi = Y##gi; \
+ X##go = Y##go; \
+ X##gu = Y##gu; \
+ X##ka = Y##ka; \
+ X##ke = Y##ke; \
+ X##ki = Y##ki; \
+ X##ko = Y##ko; \
+ X##ku = Y##ku; \
+ X##ma = Y##ma; \
+ X##me = Y##me; \
+ X##mi = Y##mi; \
+ X##mo = Y##mo; \
+ X##mu = Y##mu; \
+ X##sa = Y##sa; \
+ X##se = Y##se; \
+ X##si = Y##si; \
+ X##so = Y##so; \
+ X##su = Y##su; \
+
diff --git a/Modules/_sha3/keccak/KeccakF-1600-unrolling.macros b/Modules/_sha3/keccak/KeccakF-1600-unrolling.macros
new file mode 100644
index 0000000..83c694c
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-unrolling.macros
@@ -0,0 +1,124 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#if (Unrolling == 24)
+#define rounds \
+ prepareTheta \
+ thetaRhoPiChiIotaPrepareTheta( 0, A, E) \
+ thetaRhoPiChiIotaPrepareTheta( 1, E, A) \
+ thetaRhoPiChiIotaPrepareTheta( 2, A, E) \
+ thetaRhoPiChiIotaPrepareTheta( 3, E, A) \
+ thetaRhoPiChiIotaPrepareTheta( 4, A, E) \
+ thetaRhoPiChiIotaPrepareTheta( 5, E, A) \
+ thetaRhoPiChiIotaPrepareTheta( 6, A, E) \
+ thetaRhoPiChiIotaPrepareTheta( 7, E, A) \
+ thetaRhoPiChiIotaPrepareTheta( 8, A, E) \
+ thetaRhoPiChiIotaPrepareTheta( 9, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(10, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(11, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(12, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(13, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(14, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(15, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(16, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(17, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(18, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(19, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(20, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(21, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(22, A, E) \
+ thetaRhoPiChiIota(23, E, A) \
+ copyToState(state, A)
+#elif (Unrolling == 12)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i+=12) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 1, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 2, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 3, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 4, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 5, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 6, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 7, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 8, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+ 9, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+10, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+11, E, A) \
+ } \
+ copyToState(state, A)
+#elif (Unrolling == 8)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i+=8) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+4, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+5, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+6, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+7, E, A) \
+ } \
+ copyToState(state, A)
+#elif (Unrolling == 6)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i+=6) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+4, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+5, E, A) \
+ } \
+ copyToState(state, A)
+#elif (Unrolling == 4)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i+=4) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
+ } \
+ copyToState(state, A)
+#elif (Unrolling == 3)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i+=3) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
+ thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
+ copyStateVariables(A, E) \
+ } \
+ copyToState(state, A)
+#elif (Unrolling == 2)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i+=2) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
+ } \
+ copyToState(state, A)
+#elif (Unrolling == 1)
+#define rounds \
+ prepareTheta \
+ for(i=0; i<24; i++) { \
+ thetaRhoPiChiIotaPrepareTheta(i , A, E) \
+ copyStateVariables(A, E) \
+ } \
+ copyToState(state, A)
+#else
+#error "Unrolling is not correctly specified!"
+#endif
diff --git a/Modules/_sha3/keccak/KeccakF-1600-xop.macros b/Modules/_sha3/keccak/KeccakF-1600-xop.macros
new file mode 100644
index 0000000..823c946
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakF-1600-xop.macros
@@ -0,0 +1,573 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#define declareABCDE \
+ V128 Abage, Abegi, Abigo, Abogu, Abuga; \
+ V128 Akame, Akemi, Akimo, Akomu, Akuma; \
+ V128 Abae, Abio, Agae, Agio, Akae, Akio, Amae, Amio; \
+ V64 Aba, Abe, Abi, Abo, Abu; \
+ V64 Aga, Age, Agi, Ago, Agu; \
+ V64 Aka, Ake, Aki, Ako, Aku; \
+ V64 Ama, Ame, Ami, Amo, Amu; \
+ V128 Asase, Asiso; \
+ V64 Asu; \
+ V128 Bbage, Bbegi, Bbigo, Bbogu, Bbuga; \
+ V128 Bkame, Bkemi, Bkimo, Bkomu, Bkuma; \
+ V128 Bsase, Bsesi, Bsiso, Bsosu, Bsusa; \
+ V128 Cae, Cei, Cio, Cou, Cua; \
+ V128 Dau, Dea, Die, Doi, Duo; \
+ V128 Dua, Dae, Dei, Dio, Dou; \
+ V128 Ebage, Ebegi, Ebigo, Ebogu, Ebuga; \
+ V128 Ekame, Ekemi, Ekimo, Ekomu, Ekuma; \
+ V128 Esase, Esiso; \
+ V64 Esu; \
+ V128 Zero;
+
+#define prepareTheta
+
+#define computeD \
+ Cua = GET64LOLO(Cua, Cae); \
+ Dei = XOR128(Cae, ROL6464same(Cio, 1)); \
+ Dou = XOR128(Cio, ROL6464same(Cua, 1)); \
+ Cei = GET64HILO(Cae, Cio); \
+ Dae = XOR128(Cua, ROL6464same(Cei, 1)); \
+ Dau = GET64LOHI(Dae, Dou); \
+ Dea = SWAP64(Dae); \
+ Die = SWAP64(Dei); \
+ Doi = GET64LOLO(Dou, Die); \
+ Duo = SWAP64(Dou);
+
+/* --- Theta Rho Pi Chi Iota Prepare-theta */
+/* --- 64-bit lanes mapped to 64-bit and 128-bit words */
+#define thetaRhoPiChiIotaPrepareTheta(i, A, E) \
+ computeD \
+ \
+ Bbage = XOR128(GET64LOHI(A##bage, A##bogu), Dau); \
+ Bbage = ROL6464(Bbage, 0, 20); \
+ Bbegi = XOR128(GET64HILO(A##bage, A##kame), Dea); \
+ Bbegi = ROL6464(Bbegi, 44, 3); \
+ Bbigo = XOR128(GET64LOHI(A##kimo, A##kame), Die); \
+ Bbigo = ROL6464(Bbigo, 43, 45); \
+ E##bage = XOR128(Bbage, ANDnu128(Bbegi, Bbigo)); \
+ XOReq128(E##bage, CONST64(KeccakF1600RoundConstants[i])); \
+ Cae = E##bage; \
+ Bbogu = XOR128(GET64HILO(A##kimo, A##siso), Doi); \
+ Bbogu = ROL6464(Bbogu, 21, 61); \
+ E##begi = XOR128(Bbegi, ANDnu128(Bbigo, Bbogu)); \
+ Cei = E##begi; \
+ Bbuga = XOR128(GET64LOLO(A##su, A##bogu), Duo); \
+ Bbuga = ROL6464(Bbuga, 14, 28); \
+ E##bigo = XOR128(Bbigo, ANDnu128(Bbogu, Bbuga)); \
+ Cio = E##bigo; \
+ E##bogu = XOR128(Bbogu, ANDnu128(Bbuga, Bbage)); \
+ Cou = E##bogu; \
+ E##buga = XOR128(Bbuga, ANDnu128(Bbage, Bbegi)); \
+ Cua = E##buga; \
+\
+ Bkame = XOR128(GET64LOHI(A##begi, A##buga), Dea); \
+ Bkame = ROL6464(Bkame, 1, 36); \
+ Bkemi = XOR128(GET64HILO(A##begi, A##kemi), Die); \
+ Bkemi = ROL6464(Bkemi, 6, 10); \
+ Bkimo = XOR128(GET64LOHI(A##komu, A##kemi), Doi); \
+ Bkimo = ROL6464(Bkimo, 25, 15); \
+ E##kame = XOR128(Bkame, ANDnu128(Bkemi, Bkimo)); \
+ XOReq128(Cae, E##kame); \
+ Bkomu = XOR128(GET64HIHI(A##komu, A##siso), Duo); \
+ Bkomu = ROL6464(Bkomu, 8, 56); \
+ E##kemi = XOR128(Bkemi, ANDnu128(Bkimo, Bkomu)); \
+ XOReq128(Cei, E##kemi); \
+ Bkuma = XOR128(GET64LOLO(A##sase, A##buga), Dau); \
+ Bkuma = ROL6464(Bkuma, 18, 27); \
+ E##kimo = XOR128(Bkimo, ANDnu128(Bkomu, Bkuma)); \
+ XOReq128(Cio, E##kimo); \
+ E##komu = XOR128(Bkomu, ANDnu128(Bkuma, Bkame)); \
+ XOReq128(Cou, E##komu); \
+ E##kuma = XOR128(Bkuma, ANDnu128(Bkame, Bkemi)); \
+ XOReq128(Cua, E##kuma); \
+\
+ Bsase = XOR128(A##bigo, SWAP64(Doi)); \
+ Bsase = ROL6464(Bsase, 62, 55); \
+ Bsiso = XOR128(A##kuma, SWAP64(Dau)); \
+ Bsiso = ROL6464(Bsiso, 39, 41); \
+ Bsusa = XOR64(COPY64HI2LO(A##sase), Dei); \
+ Bsusa = ROL6464same(Bsusa, 2); \
+ Bsusa = GET64LOLO(Bsusa, Bsase); \
+ Bsesi = GET64HILO(Bsase, Bsiso); \
+ Bsosu = GET64HILO(Bsiso, Bsusa); \
+ E##sase = XOR128(Bsase, ANDnu128(Bsesi, Bsiso)); \
+ XOReq128(Cae, E##sase); \
+ E##siso = XOR128(Bsiso, ANDnu128(Bsosu, Bsusa)); \
+ XOReq128(Cio, E##siso); \
+ E##su = GET64LOLO(XOR128(Bsusa, ANDnu128(Bsase, Bsesi)), Zero); \
+ XOReq128(Cua, E##su); \
+\
+ Zero = ZERO128(); \
+ XOReq128(Cae, GET64HIHI(Cua, Zero)); \
+ XOReq128(Cae, GET64LOLO(Zero, Cei)); \
+ XOReq128(Cio, GET64HIHI(Cei, Zero)); \
+ XOReq128(Cio, GET64LOLO(Zero, Cou)); \
+ XOReq128(Cua, GET64HIHI(Cou, Zero)); \
+
+/* --- Theta Rho Pi Chi Iota */
+/* --- 64-bit lanes mapped to 64-bit and 128-bit words */
+#define thetaRhoPiChiIota(i, A, E) thetaRhoPiChiIotaPrepareTheta(i, A, E)
+
+static const UINT64 KeccakF1600RoundConstants[24] = {
+ 0x0000000000000001ULL,
+ 0x0000000000008082ULL,
+ 0x800000000000808aULL,
+ 0x8000000080008000ULL,
+ 0x000000000000808bULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008009ULL,
+ 0x000000000000008aULL,
+ 0x0000000000000088ULL,
+ 0x0000000080008009ULL,
+ 0x000000008000000aULL,
+ 0x000000008000808bULL,
+ 0x800000000000008bULL,
+ 0x8000000000008089ULL,
+ 0x8000000000008003ULL,
+ 0x8000000000008002ULL,
+ 0x8000000000000080ULL,
+ 0x000000000000800aULL,
+ 0x800000008000000aULL,
+ 0x8000000080008081ULL,
+ 0x8000000000008080ULL,
+ 0x0000000080000001ULL,
+ 0x8000000080008008ULL };
+
+#define copyFromStateAndXor576bits(X, state, input) \
+ X##bae = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cua = X##bu; \
+ X##gae = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = LOAD64(state[ 9]); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = LOAD128(state[10]); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = LOAD128(state[12]); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = LOAD128(state[14]); \
+ XOReq64(Cua, X##kuma); \
+ X##me = LOAD64(state[16]); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = LOAD128u(state[17]); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = LOAD64(state[19]); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = LOAD128(state[20]); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyFromStateAndXor832bits(X, state, input) \
+ X##bae = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cua = X##bu; \
+ X##gae = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = XOR128(LOAD128(state[12]), LOAD64(input[12])); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = LOAD128(state[14]); \
+ XOReq64(Cua, X##kuma); \
+ X##me = LOAD64(state[16]); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = LOAD128u(state[17]); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = LOAD64(state[19]); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = LOAD128(state[20]); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyFromStateAndXor1024bits(X, state, input) \
+ X##bae = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cua = X##bu; \
+ X##gae = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = XOR128(LOAD128(state[14]), LOAD128(input[14])); \
+ XOReq64(Cua, X##kuma); \
+ X##me = LOAD64(state[16]); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = LOAD128u(state[17]); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = LOAD64(state[19]); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = LOAD128(state[20]); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyFromStateAndXor1088bits(X, state, input) \
+ X##bae = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cua = X##bu; \
+ X##gae = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = XOR128(LOAD128(state[14]), LOAD128(input[14])); \
+ XOReq64(Cua, X##kuma); \
+ X##me = XOR64(LOAD64(state[16]), LOAD64(input[16])); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = LOAD128u(state[17]); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = LOAD64(state[19]); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = LOAD128(state[20]); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyFromStateAndXor1152bits(X, state, input) \
+ X##bae = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cua = X##bu; \
+ X##gae = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = XOR128(LOAD128(state[14]), LOAD128(input[14])); \
+ XOReq64(Cua, X##kuma); \
+ X##me = XOR64(LOAD64(state[16]), LOAD64(input[16])); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = XOR128(LOAD128u(state[17]), LOAD64(input[17])); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = LOAD64(state[19]); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = LOAD128(state[20]); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyFromStateAndXor1344bits(X, state, input) \
+ X##bae = XOR128(LOAD128(state[ 0]), LOAD128u(input[ 0])); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = XOR128(LOAD128(state[ 2]), LOAD128u(input[ 2])); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = XOR64(LOAD64(state[ 4]), LOAD64(input[ 4])); \
+ Cua = X##bu; \
+ X##gae = XOR128(LOAD128u(state[ 5]), LOAD128u(input[ 5])); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = XOR128(LOAD128u(state[ 7]), LOAD128u(input[ 7])); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = XOR64(LOAD64(state[ 9]), LOAD64(input[ 9])); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = XOR128(LOAD128(state[10]), LOAD128u(input[10])); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = XOR128(LOAD128(state[12]), LOAD128u(input[12])); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = XOR128(LOAD128(state[14]), LOAD128(input[14])); \
+ XOReq64(Cua, X##kuma); \
+ X##me = XOR64(LOAD64(state[16]), LOAD64(input[16])); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = XOR128(LOAD128u(state[17]), LOAD128u(input[17])); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = XOR64(LOAD64(state[19]), LOAD64(input[19])); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = XOR128(LOAD128(state[20]), LOAD64(input[20])); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyFromState(X, state) \
+ X##bae = LOAD128(state[ 0]); \
+ X##ba = X##bae; \
+ X##be = GET64HIHI(X##bae, X##bae); \
+ Cae = X##bae; \
+ X##bio = LOAD128(state[ 2]); \
+ X##bi = X##bio; \
+ X##bo = GET64HIHI(X##bio, X##bio); \
+ Cio = X##bio; \
+ X##bu = LOAD64(state[ 4]); \
+ Cua = X##bu; \
+ X##gae = LOAD128u(state[ 5]); \
+ X##ga = X##gae; \
+ X##buga = GET64LOLO(X##bu, X##ga); \
+ X##ge = GET64HIHI(X##gae, X##gae); \
+ X##bage = GET64LOLO(X##ba, X##ge); \
+ XOReq128(Cae, X##gae); \
+ X##gio = LOAD128u(state[ 7]); \
+ X##gi = X##gio; \
+ X##begi = GET64LOLO(X##be, X##gi); \
+ X##go = GET64HIHI(X##gio, X##gio); \
+ X##bigo = GET64LOLO(X##bi, X##go); \
+ XOReq128(Cio, X##gio); \
+ X##gu = LOAD64(state[ 9]); \
+ X##bogu = GET64LOLO(X##bo, X##gu); \
+ XOReq64(Cua, X##gu); \
+ X##kae = LOAD128(state[10]); \
+ X##ka = X##kae; \
+ X##ke = GET64HIHI(X##kae, X##kae); \
+ XOReq128(Cae, X##kae); \
+ X##kio = LOAD128(state[12]); \
+ X##ki = X##kio; \
+ X##ko = GET64HIHI(X##kio, X##kio); \
+ XOReq128(Cio, X##kio); \
+ X##kuma = LOAD128(state[14]); \
+ XOReq64(Cua, X##kuma); \
+ X##me = LOAD64(state[16]); \
+ X##kame = GET64LOLO(X##ka, X##me); \
+ XOReq128(Cae, GET64HIHI(X##kuma, X##kame)); \
+ X##mio = LOAD128u(state[17]); \
+ X##mi = X##mio; \
+ X##kemi = GET64LOLO(X##ke, X##mi); \
+ X##mo = GET64HIHI(X##mio, X##mio); \
+ X##kimo = GET64LOLO(X##ki, X##mo); \
+ XOReq128(Cio, X##mio); \
+ X##mu = LOAD64(state[19]); \
+ X##komu = GET64LOLO(X##ko, X##mu); \
+ XOReq64(Cua, X##mu); \
+ X##sase = LOAD128(state[20]); \
+ XOReq128(Cae, X##sase); \
+ X##siso = LOAD128(state[22]); \
+ XOReq128(Cio, X##siso); \
+ X##su = LOAD64(state[24]); \
+ XOReq64(Cua, X##su); \
+
+#define copyToState(state, X) \
+ STORE64(state[ 0], X##bage); \
+ STORE64(state[ 1], X##begi); \
+ STORE64(state[ 2], X##bigo); \
+ STORE64(state[ 3], X##bogu); \
+ STORE128(state[ 4], X##buga); \
+ STORE64(state[ 6], COPY64HI2LO(X##bage)); \
+ STORE64(state[ 7], COPY64HI2LO(X##begi)); \
+ STORE64(state[ 8], COPY64HI2LO(X##bigo)); \
+ STORE64(state[ 9], COPY64HI2LO(X##bogu)); \
+ STORE64(state[10], X##kame); \
+ STORE64(state[11], X##kemi); \
+ STORE64(state[12], X##kimo); \
+ STORE64(state[13], X##komu); \
+ STORE128(state[14], X##kuma); \
+ STORE64(state[16], COPY64HI2LO(X##kame)); \
+ STORE64(state[17], COPY64HI2LO(X##kemi)); \
+ STORE64(state[18], COPY64HI2LO(X##kimo)); \
+ STORE64(state[19], COPY64HI2LO(X##komu)); \
+ STORE128(state[20], X##sase); \
+ STORE128(state[22], X##siso); \
+ STORE64(state[24], X##su); \
+
+#define copyStateVariables(X, Y) \
+ X##bage = Y##bage; \
+ X##begi = Y##begi; \
+ X##bigo = Y##bigo; \
+ X##bogu = Y##bogu; \
+ X##buga = Y##buga; \
+ X##kame = Y##kame; \
+ X##kemi = Y##kemi; \
+ X##kimo = Y##kimo; \
+ X##komu = Y##komu; \
+ X##kuma = Y##kuma; \
+ X##sase = Y##sase; \
+ X##siso = Y##siso; \
+ X##su = Y##su; \
+
diff --git a/Modules/_sha3/keccak/KeccakNISTInterface.c b/Modules/_sha3/keccak/KeccakNISTInterface.c
new file mode 100644
index 0000000..e94082b
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakNISTInterface.c
@@ -0,0 +1,83 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#include <string.h>
+#include "KeccakNISTInterface.h"
+#include "KeccakF-1600-interface.h"
+
+static HashReturn Init(hashState *state, int hashbitlen)
+{
+ switch(hashbitlen) {
+ case 0: /* Default parameters, arbitrary length output */
+ InitSponge((spongeState*)state, 1024, 576);
+ break;
+ case 224:
+ InitSponge((spongeState*)state, 1152, 448);
+ break;
+ case 256:
+ InitSponge((spongeState*)state, 1088, 512);
+ break;
+ case 384:
+ InitSponge((spongeState*)state, 832, 768);
+ break;
+ case 512:
+ InitSponge((spongeState*)state, 576, 1024);
+ break;
+ default:
+ return BAD_HASHLEN;
+ }
+ state->fixedOutputLength = hashbitlen;
+ return SUCCESS;
+}
+
+static HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen)
+{
+ if ((databitlen % 8) == 0)
+ return Absorb((spongeState*)state, data, databitlen);
+ else {
+ HashReturn ret = Absorb((spongeState*)state, data, databitlen - (databitlen % 8));
+ if (ret == SUCCESS) {
+ unsigned char lastByte;
+ /* Align the last partial byte to the least significant bits */
+ lastByte = data[databitlen/8] >> (8 - (databitlen % 8));
+ return Absorb((spongeState*)state, &lastByte, databitlen % 8);
+ }
+ else
+ return ret;
+ }
+}
+
+static HashReturn Final(hashState *state, BitSequence *hashval)
+{
+ return Squeeze(state, hashval, state->fixedOutputLength);
+}
+
+/*
+static HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval)
+{
+ hashState state;
+ HashReturn result;
+
+ if ((hashbitlen != 224) && (hashbitlen != 256) && (hashbitlen != 384) && (hashbitlen != 512))
+ return BAD_HASHLEN; * Only the four fixed output lengths available through this API *
+ result = Init(&state, hashbitlen);
+ if (result != SUCCESS)
+ return result;
+ result = Update(&state, data, databitlen);
+ if (result != SUCCESS)
+ return result;
+ result = Final(&state, hashval);
+ return result;
+}
+*/
+
diff --git a/Modules/_sha3/keccak/KeccakNISTInterface.h b/Modules/_sha3/keccak/KeccakNISTInterface.h
new file mode 100644
index 0000000..244431b
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakNISTInterface.h
@@ -0,0 +1,72 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#ifndef _KeccakNISTInterface_h_
+#define _KeccakNISTInterface_h_
+
+#include "KeccakSponge.h"
+
+typedef unsigned char BitSequence;
+typedef unsigned long long DataLength;
+typedef enum { SUCCESS = 0, FAIL = 1, BAD_HASHLEN = 2 } HashReturn;
+
+typedef spongeState hashState;
+
+/**
+ * Function to initialize the state of the Keccak[r, c] sponge function.
+ * The rate r and capacity c values are determined from @a hashbitlen.
+ * @param state Pointer to the state of the sponge function to be initialized.
+ * @param hashbitlen The desired number of output bits,
+ * or 0 for Keccak[] with default parameters
+ * and arbitrarily-long output.
+ * @pre The value of hashbitlen must be one of 0, 224, 256, 384 and 512.
+ * @return SUCCESS if successful, BAD_HASHLEN if the value of hashbitlen is incorrect.
+ */
+static HashReturn Init(hashState *state, int hashbitlen);
+/**
+ * Function to give input data for the sponge function to absorb.
+ * @param state Pointer to the state of the sponge function initialized by Init().
+ * @param data Pointer to the input data.
+ * When @a databitLen is not a multiple of 8, the last bits of data must be
+ * in the most significant bits of the last byte.
+ * @param databitLen The number of input bits provided in the input data.
+ * @pre In the previous call to Absorb(), databitLen was a multiple of 8.
+ * @return SUCCESS if successful, FAIL otherwise.
+ */
+static HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen);
+/**
+ * Function to squeeze output data from the sponge function.
+ * If @a hashbitlen was not 0 in the call to Init(), the number of output bits is equal to @a hashbitlen.
+ * If @a hashbitlen was 0 in the call to Init(), the output bits must be extracted using the Squeeze() function.
+ * @param state Pointer to the state of the sponge function initialized by Init().
+ * @param hashval Pointer to the buffer where to store the output data.
+ * @return SUCCESS if successful, FAIL otherwise.
+ */
+static HashReturn Final(hashState *state, BitSequence *hashval);
+/**
+ * Function to compute a hash using the Keccak[r, c] sponge function.
+ * The rate r and capacity c values are determined from @a hashbitlen.
+ * @param hashbitlen The desired number of output bits.
+ * @param data Pointer to the input data.
+ * When @a databitLen is not a multiple of 8, the last bits of data must be
+ * in the most significant bits of the last byte.
+ * @param databitLen The number of input bits provided in the input data.
+ * @param hashval Pointer to the buffer where to store the output data.
+ * @pre The value of hashbitlen must be one of 224, 256, 384 and 512.
+ * @return SUCCESS if successful, BAD_HASHLEN if the value of hashbitlen is incorrect.
+ */
+/*
+static HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval);
+*/
+
+#endif
diff --git a/Modules/_sha3/keccak/KeccakSponge.c b/Modules/_sha3/keccak/KeccakSponge.c
new file mode 100644
index 0000000..1ca6bf0
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakSponge.c
@@ -0,0 +1,266 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#include <string.h>
+#include "KeccakSponge.h"
+#include "KeccakF-1600-interface.h"
+#ifdef KeccakReference
+#include "displayIntermediateValues.h"
+#endif
+
+static int InitSponge(spongeState *state, unsigned int rate, unsigned int capacity)
+{
+ if (rate+capacity != 1600)
+ return 1;
+ if ((rate <= 0) || (rate >= 1600) || ((rate % 64) != 0))
+ return 1;
+ KeccakInitialize();
+ state->rate = rate;
+ state->capacity = capacity;
+ state->fixedOutputLength = 0;
+ KeccakInitializeState(state->state);
+ memset(state->dataQueue, 0, KeccakMaximumRateInBytes);
+ state->bitsInQueue = 0;
+ state->squeezing = 0;
+ state->bitsAvailableForSqueezing = 0;
+
+ return 0;
+}
+
+static void AbsorbQueue(spongeState *state)
+{
+ /* state->bitsInQueue is assumed to be equal to state->rate */
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", state->dataQueue, state->rate/8);
+ #endif
+#ifdef ProvideFast576
+ if (state->rate == 576)
+ KeccakAbsorb576bits(state->state, state->dataQueue);
+ else
+#endif
+#ifdef ProvideFast832
+ if (state->rate == 832)
+ KeccakAbsorb832bits(state->state, state->dataQueue);
+ else
+#endif
+#ifdef ProvideFast1024
+ if (state->rate == 1024)
+ KeccakAbsorb1024bits(state->state, state->dataQueue);
+ else
+#endif
+#ifdef ProvideFast1088
+ if (state->rate == 1088)
+ KeccakAbsorb1088bits(state->state, state->dataQueue);
+ else
+#endif
+#ifdef ProvideFast1152
+ if (state->rate == 1152)
+ KeccakAbsorb1152bits(state->state, state->dataQueue);
+ else
+#endif
+#ifdef ProvideFast1344
+ if (state->rate == 1344)
+ KeccakAbsorb1344bits(state->state, state->dataQueue);
+ else
+#endif
+ KeccakAbsorb(state->state, state->dataQueue, state->rate/64);
+ state->bitsInQueue = 0;
+}
+
+static int Absorb(spongeState *state, const unsigned char *data, unsigned long long databitlen)
+{
+ unsigned long long i, j, wholeBlocks;
+ unsigned int partialBlock, partialByte;
+ const unsigned char *curData;
+
+ if ((state->bitsInQueue % 8) != 0)
+ return 1; /* Only the last call may contain a partial byte */
+ if (state->squeezing)
+ return 1; /* Too late for additional input */
+
+ i = 0;
+ while(i < databitlen) {
+ if ((state->bitsInQueue == 0) && (databitlen >= state->rate) && (i <= (databitlen-state->rate))) {
+ wholeBlocks = (databitlen-i)/state->rate;
+ curData = data+i/8;
+#ifdef ProvideFast576
+ if (state->rate == 576) {
+ for(j=0; j<wholeBlocks; j++, curData+=576/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb576bits(state->state, curData);
+ }
+ }
+ else
+#endif
+#ifdef ProvideFast832
+ if (state->rate == 832) {
+ for(j=0; j<wholeBlocks; j++, curData+=832/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb832bits(state->state, curData);
+ }
+ }
+ else
+#endif
+#ifdef ProvideFast1024
+ if (state->rate == 1024) {
+ for(j=0; j<wholeBlocks; j++, curData+=1024/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb1024bits(state->state, curData);
+ }
+ }
+ else
+#endif
+#ifdef ProvideFast1088
+ if (state->rate == 1088) {
+ for(j=0; j<wholeBlocks; j++, curData+=1088/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb1088bits(state->state, curData);
+ }
+ }
+ else
+#endif
+#ifdef ProvideFast1152
+ if (state->rate == 1152) {
+ for(j=0; j<wholeBlocks; j++, curData+=1152/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb1152bits(state->state, curData);
+ }
+ }
+ else
+#endif
+#ifdef ProvideFast1344
+ if (state->rate == 1344) {
+ for(j=0; j<wholeBlocks; j++, curData+=1344/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb1344bits(state->state, curData);
+ }
+ }
+ else
+#endif
+ {
+ for(j=0; j<wholeBlocks; j++, curData+=state->rate/8) {
+ #ifdef KeccakReference
+ displayBytes(1, "Block to be absorbed", curData, state->rate/8);
+ #endif
+ KeccakAbsorb(state->state, curData, state->rate/64);
+ }
+ }
+ i += wholeBlocks*state->rate;
+ }
+ else {
+ partialBlock = (unsigned int)(databitlen - i);
+ if (partialBlock+state->bitsInQueue > state->rate)
+ partialBlock = state->rate-state->bitsInQueue;
+ partialByte = partialBlock % 8;
+ partialBlock -= partialByte;
+ memcpy(state->dataQueue+state->bitsInQueue/8, data+i/8, partialBlock/8);
+ state->bitsInQueue += partialBlock;
+ i += partialBlock;
+ if (state->bitsInQueue == state->rate)
+ AbsorbQueue(state);
+ if (partialByte > 0) {
+ unsigned char mask = (1 << partialByte)-1;
+ state->dataQueue[state->bitsInQueue/8] = data[i/8] & mask;
+ state->bitsInQueue += partialByte;
+ i += partialByte;
+ }
+ }
+ }
+ return 0;
+}
+
+static void PadAndSwitchToSqueezingPhase(spongeState *state)
+{
+ /* Note: the bits are numbered from 0=LSB to 7=MSB */
+ if (state->bitsInQueue + 1 == state->rate) {
+ state->dataQueue[state->bitsInQueue/8 ] |= 1 << (state->bitsInQueue % 8);
+ AbsorbQueue(state);
+ memset(state->dataQueue, 0, state->rate/8);
+ }
+ else {
+ memset(state->dataQueue + (state->bitsInQueue+7)/8, 0, state->rate/8 - (state->bitsInQueue+7)/8);
+ state->dataQueue[state->bitsInQueue/8 ] |= 1 << (state->bitsInQueue % 8);
+ }
+ state->dataQueue[(state->rate-1)/8] |= 1 << ((state->rate-1) % 8);
+ AbsorbQueue(state);
+
+ #ifdef KeccakReference
+ displayText(1, "--- Switching to squeezing phase ---");
+ #endif
+#ifdef ProvideFast1024
+ if (state->rate == 1024) {
+ KeccakExtract1024bits(state->state, state->dataQueue);
+ state->bitsAvailableForSqueezing = 1024;
+ }
+ else
+#endif
+ {
+ KeccakExtract(state->state, state->dataQueue, state->rate/64);
+ state->bitsAvailableForSqueezing = state->rate;
+ }
+ #ifdef KeccakReference
+ displayBytes(1, "Block available for squeezing", state->dataQueue, state->bitsAvailableForSqueezing/8);
+ #endif
+ state->squeezing = 1;
+}
+
+static int Squeeze(spongeState *state, unsigned char *output, unsigned long long outputLength)
+{
+ unsigned long long i;
+ unsigned int partialBlock;
+
+ if (!state->squeezing)
+ PadAndSwitchToSqueezingPhase(state);
+ if ((outputLength % 8) != 0)
+ return 1; /* Only multiple of 8 bits are allowed, truncation can be done at user level */
+
+ i = 0;
+ while(i < outputLength) {
+ if (state->bitsAvailableForSqueezing == 0) {
+ KeccakPermutation(state->state);
+#ifdef ProvideFast1024
+ if (state->rate == 1024) {
+ KeccakExtract1024bits(state->state, state->dataQueue);
+ state->bitsAvailableForSqueezing = 1024;
+ }
+ else
+#endif
+ {
+ KeccakExtract(state->state, state->dataQueue, state->rate/64);
+ state->bitsAvailableForSqueezing = state->rate;
+ }
+ #ifdef KeccakReference
+ displayBytes(1, "Block available for squeezing", state->dataQueue, state->bitsAvailableForSqueezing/8);
+ #endif
+ }
+ partialBlock = state->bitsAvailableForSqueezing;
+ if ((unsigned long long)partialBlock > outputLength - i)
+ partialBlock = (unsigned int)(outputLength - i);
+ memcpy(output+i/8, state->dataQueue+(state->rate-state->bitsAvailableForSqueezing)/8, partialBlock/8);
+ state->bitsAvailableForSqueezing -= partialBlock;
+ i += partialBlock;
+ }
+ return 0;
+}
diff --git a/Modules/_sha3/keccak/KeccakSponge.h b/Modules/_sha3/keccak/KeccakSponge.h
new file mode 100644
index 0000000..a545cac
--- /dev/null
+++ b/Modules/_sha3/keccak/KeccakSponge.h
@@ -0,0 +1,76 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaël Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#ifndef _KeccakSponge_h_
+#define _KeccakSponge_h_
+
+#define KeccakPermutationSize 1600
+#define KeccakPermutationSizeInBytes (KeccakPermutationSize/8)
+#define KeccakMaximumRate 1536
+#define KeccakMaximumRateInBytes (KeccakMaximumRate/8)
+
+#if defined(__GNUC__)
+#define ALIGN __attribute__ ((aligned(32)))
+#elif defined(_MSC_VER)
+#define ALIGN __declspec(align(32))
+#else
+#define ALIGN
+#endif
+
+ALIGN typedef struct spongeStateStruct {
+ ALIGN unsigned char state[KeccakPermutationSizeInBytes];
+ ALIGN unsigned char dataQueue[KeccakMaximumRateInBytes];
+ unsigned int rate;
+ unsigned int capacity;
+ unsigned int bitsInQueue;
+ unsigned int fixedOutputLength;
+ int squeezing;
+ unsigned int bitsAvailableForSqueezing;
+} spongeState;
+
+/**
+ * Function to initialize the state of the Keccak[r, c] sponge function.
+ * The sponge function is set to the absorbing phase.
+ * @param state Pointer to the state of the sponge function to be initialized.
+ * @param rate The value of the rate r.
+ * @param capacity The value of the capacity c.
+ * @pre One must have r+c=1600 and the rate a multiple of 64 bits in this implementation.
+ * @return Zero if successful, 1 otherwise.
+ */
+static int InitSponge(spongeState *state, unsigned int rate, unsigned int capacity);
+/**
+ * Function to give input data for the sponge function to absorb.
+ * @param state Pointer to the state of the sponge function initialized by InitSponge().
+ * @param data Pointer to the input data.
+ * When @a databitLen is not a multiple of 8, the last bits of data must be
+ * in the least significant bits of the last byte.
+ * @param databitLen The number of input bits provided in the input data.
+ * @pre In the previous call to Absorb(), databitLen was a multiple of 8.
+ * @pre The sponge function must be in the absorbing phase,
+ * i.e., Squeeze() must not have been called before.
+ * @return Zero if successful, 1 otherwise.
+ */
+static int Absorb(spongeState *state, const unsigned char *data, unsigned long long databitlen);
+/**
+ * Function to squeeze output data from the sponge function.
+ * If the sponge function was in the absorbing phase, this function
+ * switches it to the squeezing phase.
+ * @param state Pointer to the state of the sponge function initialized by InitSponge().
+ * @param output Pointer to the buffer where to store the output data.
+ * @param outputLength The number of output bits desired.
+ * It must be a multiple of 8.
+ * @return Zero if successful, 1 otherwise.
+ */
+static int Squeeze(spongeState *state, unsigned char *output, unsigned long long outputLength);
+
+#endif
diff --git a/Modules/_sha3/keccak/brg_endian.h b/Modules/_sha3/keccak/brg_endian.h
new file mode 100755
index 0000000..7226eb3
--- /dev/null
+++ b/Modules/_sha3/keccak/brg_endian.h
@@ -0,0 +1,142 @@
+/*
+ ---------------------------------------------------------------------------
+ Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
+
+ LICENSE TERMS
+
+ The redistribution and use of this software (with or without changes)
+ is allowed without the payment of fees or royalties provided that:
+
+ 1. source code distributions include the above copyright notice, this
+ list of conditions and the following disclaimer;
+
+ 2. binary distributions include the above copyright notice, this list
+ of conditions and the following disclaimer in their documentation;
+
+ 3. the name of the copyright holder is not used to endorse products
+ built using this software without specific written permission.
+
+ DISCLAIMER
+
+ This software is provided 'as is' with no explicit or implied warranties
+ in respect of its properties, including, but not limited to, correctness
+ and/or fitness for purpose.
+ ---------------------------------------------------------------------------
+ Issue Date: 20/12/2007
+ Changes for ARM 9/9/2010
+*/
+
+#ifndef _BRG_ENDIAN_H
+#define _BRG_ENDIAN_H
+
+#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
+#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */
+
+#if 0
+/* Include files where endian defines and byteswap functions may reside */
+#if defined( __sun )
+# include <sys/isa_defs.h>
+#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )
+# include <sys/endian.h>
+#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \
+ defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
+# include <machine/endian.h>
+#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
+# if !defined( __MINGW32__ ) && !defined( _AIX )
+# include <endian.h>
+# if !defined( __BEOS__ )
+# include <byteswap.h>
+# endif
+# endif
+#endif
+#endif
+
+/* Now attempt to set the define for platform byte order using any */
+/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
+/* seem to encompass most endian symbol definitions */
+
+#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )
+# if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+# elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+# endif
+#elif defined( BIG_ENDIAN )
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+#elif defined( LITTLE_ENDIAN )
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+#endif
+
+#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )
+# if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+# elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+# endif
+#elif defined( _BIG_ENDIAN )
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+#elif defined( _LITTLE_ENDIAN )
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+#endif
+
+#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )
+# if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+# elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+# endif
+#elif defined( __BIG_ENDIAN )
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+#elif defined( __LITTLE_ENDIAN )
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+#endif
+
+#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )
+# if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+# elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+# endif
+#elif defined( __BIG_ENDIAN__ )
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+#elif defined( __LITTLE_ENDIAN__ )
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+#endif
+
+/* if the platform byte order could not be determined, then try to */
+/* set this define using common machine defines */
+#if !defined(PLATFORM_BYTE_ORDER)
+
+#if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \
+ defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \
+ defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \
+ defined( vax ) || defined( vms ) || defined( VMS ) || \
+ defined( __VMS ) || defined( _M_X64 )
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+
+#elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \
+ defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \
+ defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \
+ defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \
+ defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \
+ defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \
+ defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX )
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+
+#elif defined(__arm__)
+# ifdef __BIG_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+# else
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+# endif
+#elif 1 /* **** EDIT HERE IF NECESSARY **** */
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+#elif 0 /* **** EDIT HERE IF NECESSARY **** */
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+#else
+# error Please edit lines 132 or 134 in brg_endian.h to set the platform byte order
+#endif
+
+#endif
+
+#endif
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/a.out b/Modules/_sha3/keccak/crypto_hash.h
index e69de29..e69de29 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/a.out
+++ b/Modules/_sha3/keccak/crypto_hash.h
diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c
new file mode 100644
index 0000000..4e6352b
--- /dev/null
+++ b/Modules/_sha3/sha3module.c
@@ -0,0 +1,585 @@
+/* SHA3 module
+ *
+ * This module provides an interface to the SHA3 algorithm
+ *
+ * See below for information about the original code this module was
+ * based upon. Additional work performed by:
+ *
+ * Andrew Kuchling (amk@amk.ca)
+ * Greg Stein (gstein@lyra.org)
+ * Trevor Perrin (trevp@trevp.net)
+ * Gregory P. Smith (greg@krypto.org)
+ *
+ * Copyright (C) 2012 Christian Heimes (christian@python.org)
+ * Licensed to PSF under a Contributor Agreement.
+ *
+ */
+
+#include "Python.h"
+#include "../hashlib.h"
+
+/* **************************************************************************
+ * SHA-3 (Keccak)
+ *
+ * The code is based on KeccakReferenceAndOptimized-3.2.zip from 29 May 2012.
+ *
+ * The reference implementation is altered in this points:
+ * - C++ comments are converted to ANSI C comments.
+ * - All functions and globals are declared static.
+ * - The typedef for UINT64 is commented out.
+ * - KeccakF-1600-opt[32|64]-settings.h are commented out
+ * - Some unused functions are commented out to silence compiler warnings.
+ *
+ * In order to avoid name clashes with other software I have to declare all
+ * Keccak functions and global data as static. The C code is directly
+ * included into this file in order to access the static functions.
+ *
+ * Keccak can be tuned with several paramenters. I try to explain all options
+ * as far as I understand them. The reference implementation also contains
+ * assembler code for ARM platforms (NEON instructions).
+ *
+ * Common
+ * ======
+ *
+ * Options:
+ * UseBebigokimisa, Unrolling
+ *
+ * - Unrolling: loop unrolling (24, 12, 8, 6, 4, 3, 2, 1)
+ * - UseBebigokimisa: lane complementing
+ *
+ * 64bit platforms
+ * ===============
+ *
+ * Additional options:
+ * UseSSE, UseOnlySIMD64, UseMMX, UseXOP, UseSHLD
+ *
+ * Optimized instructions (disabled by default):
+ * - UseSSE: use Stream SIMD extensions
+ * o UseOnlySIMD64: limit to 64bit instructions, otherwise 128bit
+ * o w/o UseOnlySIMD64: requires compiler agument -mssse3 or -mtune
+ * - UseMMX: use 64bit MMX instructions
+ * - UseXOP: use AMD's eXtended Operations (128bit SSE extension)
+ *
+ * Other:
+ * - Unrolling: default 24
+ * - UseBebigokimisa: default 1
+ *
+ * When neither UseSSE, UseMMX nor UseXOP is configured, ROL64 (rotate left
+ * 64) is implemented as:
+ * - Windows: _rotl64()
+ * - UseSHLD: use shld (shift left) asm optimization
+ * - otherwise: shift and xor
+ *
+ * UseBebigokimisa can't be used in combination with UseSSE, UseMMX or
+ * UseXOP. UseOnlySIMD64 has no effect unless UseSSE is specified.
+ *
+ * Tests have shown that UseSSE + UseOnlySIMD64 is about three to four
+ * times SLOWER than UseBebigokimisa. UseSSE and UseMMX are about two times
+ * slower. (tested by CH and AP)
+ *
+ * 32bit platforms
+ * ===============
+ *
+ * Additional options:
+ * UseInterleaveTables, UseSchedule
+ *
+ * - Unrolling: default 2
+ * - UseBebigokimisa: default n/a
+ * - UseSchedule: ???, (1, 2, 3; default 3)
+ * - UseInterleaveTables: use two 64k lookup tables for (de)interleaving
+ * default: n/a
+ *
+ * schedules:
+ * - 3: no UseBebigokimisa, Unrolling must be 2
+ * - 2 + 1: ???
+ *
+ * *************************************************************************/
+
+#ifdef __sparc
+ /* opt64 uses un-aligned memory access that causes a BUS error with msg
+ * 'invalid address alignment' on SPARC. */
+ #define KeccakOpt 32
+#elif SIZEOF_VOID_P == 8 && defined(PY_UINT64_T)
+ /* opt64 works only for 64bit platforms with unsigned int64 */
+ #define KeccakOpt 64
+#else
+ /* opt32 is used for the remaining 32 and 64bit platforms */
+ #define KeccakOpt 32
+#endif
+
+#if KeccakOpt == 64 && defined(PY_UINT64_T)
+ /* 64bit platforms with unsigned int64 */
+ #define Unrolling 24
+ #define UseBebigokimisa
+ typedef PY_UINT64_T UINT64;
+#elif KeccakOpt == 32 && defined(PY_UINT64_T)
+ /* 32bit platforms with unsigned int64 */
+ #define Unrolling 2
+ #define UseSchedule 3
+ typedef PY_UINT64_T UINT64;
+#else
+ /* 32 or 64bit platforms without unsigned int64 */
+ #define Unrolling 2
+ #define UseSchedule 3
+ #define UseInterleaveTables
+#endif
+
+/* replacement for brg_endian.h */
+#define IS_BIG_ENDIAN 4321
+#define IS_LITTLE_ENDIAN 1234
+#if PY_BIG_ENDIAN
+# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
+#else
+# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
+#endif
+
+/* inline all Keccak dependencies */
+#include "keccak/KeccakNISTInterface.h"
+#include "keccak/KeccakNISTInterface.c"
+#include "keccak/KeccakSponge.c"
+#if KeccakOpt == 64
+ #include "keccak/KeccakF-1600-opt64.c"
+#elif KeccakOpt == 32
+ #include "keccak/KeccakF-1600-opt32.c"
+#endif
+
+/* #define SHA3_BLOCKSIZE 200 // 1600 bits */
+#define SHA3_MAX_DIGESTSIZE 64 /* 512 bits */
+#define SHA3_state hashState
+#define SHA3_init Init
+#define SHA3_process Update
+#define SHA3_done Final
+#define SHA3_copystate(dest, src) memcpy(&(dest), &(src), sizeof(SHA3_state))
+#define SHA3_clearstate(state) memset(&(state), 0, sizeof(SHA3_state))
+
+/* The structure for storing SHA3 info */
+
+typedef struct {
+ PyObject_HEAD
+ int hashbitlen;
+ SHA3_state hash_state;
+#ifdef WITH_THREAD
+ PyThread_type_lock lock;
+#endif
+
+} SHA3object;
+
+static PyTypeObject SHA3type;
+
+
+static SHA3object *
+newSHA3object(int hashbitlen)
+{
+ SHA3object *newobj;
+
+ /* check hashbitlen */
+ switch(hashbitlen) {
+ /* supported hash length */
+ case 224:
+ break;
+ case 256:
+ break;
+ case 384:
+ break;
+ case 512:
+ break;
+ case 0:
+ /* arbitrarily-long output isn't supported by this module */
+ default:
+ /* everything else is an error */
+ PyErr_SetString(PyExc_ValueError,
+ "hashbitlen must be one of 224, 256, 384 or 512.");
+ return NULL;
+ }
+ newobj = (SHA3object *)PyObject_New(SHA3object, &SHA3type);
+ if (newobj == NULL) {
+ return NULL;
+ }
+ newobj->hashbitlen = hashbitlen;
+#ifdef WITH_THREAD
+ newobj->lock = NULL;
+#endif
+ return newobj;
+}
+
+
+/* Internal methods for a hash object */
+
+static void
+SHA3_dealloc(SHA3object *self)
+{
+ SHA3_clearstate(self->hash_state);
+#ifdef WITH_THREAD
+ if (self->lock) {
+ PyThread_free_lock(self->lock);
+ }
+#endif
+ PyObject_Del(self);
+}
+
+
+/* External methods for a hash object */
+
+PyDoc_STRVAR(SHA3_copy__doc__, "Return a copy of the hash object.");
+
+static PyObject *
+SHA3_copy(SHA3object *self, PyObject *unused)
+{
+ SHA3object *newobj;
+
+ if ((newobj = newSHA3object(self->hashbitlen)) == NULL) {
+ return NULL;
+ }
+ ENTER_HASHLIB(self);
+ SHA3_copystate(newobj->hash_state, self->hash_state);
+ LEAVE_HASHLIB(self);
+ return (PyObject *)newobj;
+}
+
+
+PyDoc_STRVAR(SHA3_digest__doc__,
+"Return the digest value as a string of binary data.");
+
+static PyObject *
+SHA3_digest(SHA3object *self, PyObject *unused)
+{
+ unsigned char digest[SHA3_MAX_DIGESTSIZE];
+ SHA3_state temp;
+ HashReturn res;
+
+ ENTER_HASHLIB(self);
+ SHA3_copystate(temp, self->hash_state);
+ LEAVE_HASHLIB(self);
+ res = SHA3_done(&temp, digest);
+ SHA3_clearstate(temp);
+ if (res != SUCCESS) {
+ PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Final()");
+ return NULL;
+ }
+ return PyBytes_FromStringAndSize((const char *)digest,
+ self->hashbitlen / 8);
+}
+
+
+PyDoc_STRVAR(SHA3_hexdigest__doc__,
+"Return the digest value as a string of hexadecimal digits.");
+
+static PyObject *
+SHA3_hexdigest(SHA3object *self, PyObject *unused)
+{
+ unsigned char digest[SHA3_MAX_DIGESTSIZE];
+ SHA3_state temp;
+ HashReturn res;
+ PyObject *retval;
+ Py_UCS1 *hex_digest;
+ int digestlen, i, j;
+
+ /* Get the raw (binary) digest value */
+ ENTER_HASHLIB(self);
+ SHA3_copystate(temp, self->hash_state);
+ LEAVE_HASHLIB(self);
+ res = SHA3_done(&temp, digest);
+ SHA3_clearstate(temp);
+ if (res != SUCCESS) {
+ PyErr_SetString(PyExc_RuntimeError, "internal error in SHA3 Final()");
+ return NULL;
+ }
+
+ /* Create a new string */
+ digestlen = self->hashbitlen / 8;
+ retval = PyUnicode_New(digestlen * 2, 127);
+ if (!retval)
+ return NULL;
+ hex_digest = PyUnicode_1BYTE_DATA(retval);
+
+ /* Make hex version of the digest */
+ for(i=j=0; i < digestlen; i++) {
+ unsigned char c;
+ c = (digest[i] >> 4) & 0xf;
+ hex_digest[j++] = Py_hexdigits[c];
+ c = (digest[i] & 0xf);
+ hex_digest[j++] = Py_hexdigits[c];
+ }
+#ifdef Py_DEBUG
+ assert(_PyUnicode_CheckConsistency(retval, 1));
+#endif
+ return retval;
+}
+
+PyDoc_STRVAR(SHA3_update__doc__,
+"Update this hash object's state with the provided string.");
+
+static PyObject *
+SHA3_update(SHA3object *self, PyObject *args)
+{
+ PyObject *obj;
+ Py_buffer buf;
+ HashReturn res;
+
+ if (!PyArg_ParseTuple(args, "O:update", &obj))
+ return NULL;
+
+ GET_BUFFER_VIEW_OR_ERROUT(obj, &buf);
+
+ /* add new data, the function takes the length in bits not bytes */
+#ifdef WITH_THREAD
+ if (self->lock == NULL && buf.len >= HASHLIB_GIL_MINSIZE) {
+ self->lock = PyThread_allocate_lock();
+ }
+ /* Once a lock exists all code paths must be synchronized. We have to
+ * release the GIL even for small buffers as acquiring the lock may take
+ * an unlimited amount of time when another thread updates this object
+ * with lots of data. */
+ if (self->lock) {
+ Py_BEGIN_ALLOW_THREADS
+ PyThread_acquire_lock(self->lock, 1);
+ res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8);
+ PyThread_release_lock(self->lock);
+ Py_END_ALLOW_THREADS
+ }
+ else {
+ res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8);
+ }
+#else
+ res = SHA3_process(&self->hash_state, buf.buf, buf.len * 8);
+#endif
+ LEAVE_HASHLIB(self);
+
+ if (res != SUCCESS) {
+ PyBuffer_Release(&buf);
+ PyErr_SetString(PyExc_RuntimeError,
+ "internal error in SHA3 Update()");
+ return NULL;
+ }
+
+ PyBuffer_Release(&buf);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyMethodDef SHA3_methods[] = {
+ {"copy", (PyCFunction)SHA3_copy, METH_NOARGS,
+ SHA3_copy__doc__},
+ {"digest", (PyCFunction)SHA3_digest, METH_NOARGS,
+ SHA3_digest__doc__},
+ {"hexdigest", (PyCFunction)SHA3_hexdigest, METH_NOARGS,
+ SHA3_hexdigest__doc__},
+ {"update", (PyCFunction)SHA3_update, METH_VARARGS,
+ SHA3_update__doc__},
+ {NULL, NULL} /* sentinel */
+};
+
+static PyObject *
+SHA3_get_block_size(SHA3object *self, void *closure)
+{
+ /* HMAC-SHA3 hasn't been specified yet and no official test vectors are
+ * available. Thus block_size returns NotImplemented to prevent people
+ * from using SHA3 with the hmac module.
+ */
+ Py_RETURN_NOTIMPLEMENTED;
+}
+
+static PyObject *
+SHA3_get_name(SHA3object *self, void *closure)
+{
+ return PyUnicode_FromFormat("sha3_%i", self->hashbitlen);
+}
+
+static PyObject *
+SHA3_get_digest_size(SHA3object *self, void *closure)
+{
+ return PyLong_FromLong(self->hashbitlen / 8);
+}
+
+
+static PyGetSetDef SHA3_getseters[] = {
+ {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL},
+ {"name", (getter)SHA3_get_name, NULL, NULL, NULL},
+ {"digest_size", (getter)SHA3_get_digest_size, NULL, NULL, NULL},
+ {NULL} /* Sentinel */
+};
+
+static PyTypeObject SHA3type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_sha3.SHA3", /* tp_name */
+ sizeof(SHA3object), /* tp_size */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)SHA3_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ SHA3_methods, /* tp_methods */
+ NULL, /* tp_members */
+ SHA3_getseters, /* tp_getset */
+};
+
+
+/* constructor helper */
+static PyObject *
+SHA3_factory(PyObject *args, PyObject *kwdict, const char *fmt,
+ int hashbitlen)
+{
+ SHA3object *newobj = NULL;
+ static char *kwlist[] = {"string", NULL};
+ PyObject *data_obj = NULL;
+ Py_buffer buf;
+ HashReturn res;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, fmt, kwlist,
+ &data_obj)) {
+ return NULL;
+ }
+
+ if (data_obj)
+ GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf);
+
+ if ((newobj = newSHA3object(hashbitlen)) == NULL) {
+ goto error;
+ }
+
+ if (SHA3_init(&newobj->hash_state, hashbitlen) != SUCCESS) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "internal error in SHA3 Update()");
+ goto error;
+ }
+
+ if (data_obj) {
+#ifdef WITH_THREAD
+ if (buf.len >= HASHLIB_GIL_MINSIZE) {
+ /* invariant: New objects can't be accessed by other code yet,
+ * thus it's safe to release the GIL without locking the object.
+ */
+ Py_BEGIN_ALLOW_THREADS
+ res = SHA3_process(&newobj->hash_state, buf.buf, buf.len * 8);
+ Py_END_ALLOW_THREADS
+ }
+ else {
+ res = SHA3_process(&newobj->hash_state, buf.buf, buf.len * 8);
+ }
+#else
+ res = SHA3_process(&newobj->hash_state, buf.buf, buf.len * 8);
+#endif
+ if (res != SUCCESS) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "internal error in SHA3 Update()");
+ goto error;
+ }
+ PyBuffer_Release(&buf);
+ }
+
+ return (PyObject *)newobj;
+
+ error:
+ if (newobj) {
+ SHA3_dealloc(newobj);
+ }
+ if (data_obj) {
+ PyBuffer_Release(&buf);
+ }
+ return NULL;
+
+}
+
+PyDoc_STRVAR(sha3_224__doc__,
+"sha3_224([string]) -> SHA3 object\n\
+\n\
+Return a new SHA3 hash object with a hashbit length of 28 bytes.");
+
+static PyObject *
+sha3_224(PyObject *self, PyObject *args, PyObject *kwdict)
+{
+ return SHA3_factory(args, kwdict, "|O:sha3_224", 224);
+}
+
+
+PyDoc_STRVAR(sha3_256__doc__,
+"sha3_256([string]) -> SHA3 object\n\
+\n\
+Return a new SHA3 hash object with a hashbit length of 32 bytes.");
+
+static PyObject *
+sha3_256(PyObject *self, PyObject *args, PyObject *kwdict)
+{
+ return SHA3_factory(args, kwdict, "|O:sha3_256", 256);
+}
+
+PyDoc_STRVAR(sha3_384__doc__,
+"sha3_384([string]) -> SHA3 object\n\
+\n\
+Return a new SHA3 hash object with a hashbit length of 48 bytes.");
+
+static PyObject *
+sha3_384(PyObject *self, PyObject *args, PyObject *kwdict)
+{
+ return SHA3_factory(args, kwdict, "|O:sha3_384", 384);
+}
+
+PyDoc_STRVAR(sha3_512__doc__,
+"sha3_512([string]) -> SHA3 object\n\
+\n\
+Return a new SHA3 hash object with a hashbit length of 64 bytes.");
+
+static PyObject *
+sha3_512(PyObject *self, PyObject *args, PyObject *kwdict)
+{
+ return SHA3_factory(args, kwdict, "|O:sha3_512", 512);
+}
+
+
+/* List of functions exported by this module */
+static struct PyMethodDef SHA3_functions[] = {
+ {"sha3_224", (PyCFunction)sha3_224, METH_VARARGS|METH_KEYWORDS,
+ sha3_224__doc__},
+ {"sha3_256", (PyCFunction)sha3_256, METH_VARARGS|METH_KEYWORDS,
+ sha3_256__doc__},
+ {"sha3_384", (PyCFunction)sha3_384, METH_VARARGS|METH_KEYWORDS,
+ sha3_384__doc__},
+ {"sha3_512", (PyCFunction)sha3_512, METH_VARARGS|METH_KEYWORDS,
+ sha3_512__doc__},
+ {NULL, NULL} /* Sentinel */
+};
+
+
+/* Initialize this module. */
+static struct PyModuleDef _SHA3module = {
+ PyModuleDef_HEAD_INIT,
+ "_sha3",
+ NULL,
+ -1,
+ SHA3_functions,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit__sha3(void)
+{
+ Py_TYPE(&SHA3type) = &PyType_Type;
+ if (PyType_Ready(&SHA3type) < 0) {
+ return NULL;
+ }
+
+ return PyModule_Create(&_SHA3module);
+}
diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c
index 3693363..3689a4e 100644
--- a/Modules/_sqlite/cache.c
+++ b/Modules/_sqlite/cache.c
@@ -21,7 +21,6 @@
* 3. This notice may not be removed or altered from any source distribution.
*/
-#include "sqlitecompat.h"
#include "cache.h"
#include <limits.h>
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 28bd647..531516c 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -29,7 +29,6 @@
#include "cursor.h"
#include "prepare_protocol.h"
#include "util.h"
-#include "sqlitecompat.h"
#include "pythread.h"
@@ -60,7 +59,11 @@ static void _sqlite3_result_error(sqlite3_context* ctx, const char* errmsg, int
int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
{
- static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL};
+ static char *kwlist[] = {
+ "database", "timeout", "detect_types", "isolation_level",
+ "check_same_thread", "factory", "cached_statements", "uri",
+ NULL
+ };
char* database;
int detect_types = 0;
@@ -68,11 +71,14 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject
PyObject* factory = NULL;
int check_same_thread = 1;
int cached_statements = 100;
+ int uri = 0;
double timeout = 5.0;
int rc;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOi", kwlist,
- &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements))
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOip", kwlist,
+ &database, &timeout, &detect_types,
+ &isolation_level, &check_same_thread,
+ &factory, &cached_statements, &uri))
{
return -1;
}
@@ -91,8 +97,19 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject
Py_INCREF(&PyUnicode_Type);
self->text_factory = (PyObject*)&PyUnicode_Type;
+#ifdef SQLITE_OPEN_URI
+ Py_BEGIN_ALLOW_THREADS
+ rc = sqlite3_open_v2(database, &self->db,
+ SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
+ (uri ? SQLITE_OPEN_URI : 0), NULL);
+#else
+ if (uri) {
+ PyErr_SetString(pysqlite_NotSupportedError, "URIs not supported");
+ return -1;
+ }
Py_BEGIN_ALLOW_THREADS
rc = sqlite3_open(database, &self->db);
+#endif
Py_END_ALLOW_THREADS
if (rc != SQLITE_OK) {
@@ -679,6 +696,8 @@ void _pysqlite_final_callback(sqlite3_context* context)
PyObject** aggregate_instance;
_Py_IDENTIFIER(finalize);
int ok;
+ PyObject *exception, *value, *tb;
+ int restore;
#ifdef WITH_THREAD
PyGILState_STATE threadstate;
@@ -694,7 +713,12 @@ void _pysqlite_final_callback(sqlite3_context* context)
goto error;
}
+ /* Keep the exception (if any) of the last call to step() */
+ PyErr_Fetch(&exception, &value, &tb);
+ restore = 1;
+
function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, "");
+
Py_DECREF(*aggregate_instance);
ok = 0;
@@ -709,6 +733,17 @@ void _pysqlite_final_callback(sqlite3_context* context)
PyErr_Clear();
}
_sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1);
+#if SQLITE_VERSION_NUMBER < 3003003
+ /* with old SQLite versions, _sqlite3_result_error() sets a new Python
+ exception, so don't restore the previous exception */
+ restore = 0;
+#endif
+ }
+
+ if (restore) {
+ /* Restore the exception (if any) of the last call to step(),
+ but clear also the current exception if finalize() failed */
+ PyErr_Restore(exception, value, tb);
}
error:
@@ -856,22 +891,29 @@ static int _authorizer_callback(void* user_arg, int action, const char* arg1, co
gilstate = PyGILState_Ensure();
#endif
+
ret = PyObject_CallFunction((PyObject*)user_arg, "issss", action, arg1, arg2, dbname, access_attempt_source);
- if (!ret) {
- if (_enable_callback_tracebacks) {
+ if (ret == NULL) {
+ if (_enable_callback_tracebacks)
PyErr_Print();
- } else {
+ else
PyErr_Clear();
- }
rc = SQLITE_DENY;
- } else {
+ }
+ else {
if (PyLong_Check(ret)) {
rc = _PyLong_AsInt(ret);
- if (rc == -1 && PyErr_Occurred())
+ if (rc == -1 && PyErr_Occurred()) {
+ if (_enable_callback_tracebacks)
+ PyErr_Print();
+ else
+ PyErr_Clear();
rc = SQLITE_DENY;
- } else {
+ }
+ }
+ else {
rc = SQLITE_DENY;
}
Py_DECREF(ret);
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 4999415..bf4bbb4 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -24,7 +24,6 @@
#include "cursor.h"
#include "module.h"
#include "util.h"
-#include "sqlitecompat.h"
PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self);
@@ -339,6 +338,11 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self)
if (self->connection->text_factory == (PyObject*)&PyUnicode_Type) {
converted = PyUnicode_FromStringAndSize(val_str, nbytes);
if (!converted) {
+#ifdef Py_DEBUG
+ /* in debug mode, type_call() fails with an assertion
+ error if an exception is set when it is called */
+ PyErr_Clear();
+#endif
colname = sqlite3_column_name(self->statement->st, i);
if (!colname) {
colname = "<unknown column name>";
diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c
index bea6d6a..7a7e860 100644
--- a/Modules/_sqlite/module.c
+++ b/Modules/_sqlite/module.c
@@ -50,19 +50,26 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
* C-level, so this code is redundant with the one in connection_init in
* connection.c and must always be copied from there ... */
- static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL};
+ static char *kwlist[] = {
+ "database", "timeout", "detect_types", "isolation_level",
+ "check_same_thread", "factory", "cached_statements", "uri",
+ NULL
+ };
char* database;
int detect_types = 0;
PyObject* isolation_level;
PyObject* factory = NULL;
int check_same_thread = 1;
int cached_statements;
+ int uri = 0;
double timeout = 5.0;
PyObject* result;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOi", kwlist,
- &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements))
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOip", kwlist,
+ &database, &timeout, &detect_types,
+ &isolation_level, &check_same_thread,
+ &factory, &cached_statements, &uri))
{
return NULL;
}
@@ -77,7 +84,8 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
}
PyDoc_STRVAR(module_connect_doc,
-"connect(database[, timeout, isolation_level, detect_types, factory])\n\
+"connect(database[, timeout, detect_types, isolation_level,\n\
+ check_same_thread, factory, cached_statements, uri])\n\
\n\
Opens a connection to the SQLite database file *database*. You can use\n\
\":memory:\" to open a database connection to a database that resides in\n\
diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c
index fc68874..f2c85f9 100644
--- a/Modules/_sqlite/prepare_protocol.c
+++ b/Modules/_sqlite/prepare_protocol.c
@@ -21,7 +21,6 @@
* 3. This notice may not be removed or altered from any source distribution.
*/
-#include "sqlitecompat.h"
#include "prepare_protocol.h"
int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs)
diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c
index b50658c..14c148e 100644
--- a/Modules/_sqlite/row.c
+++ b/Modules/_sqlite/row.c
@@ -23,7 +23,6 @@
#include "row.h"
#include "cursor.h"
-#include "sqlitecompat.h"
void pysqlite_row_dealloc(pysqlite_Row* self)
{
diff --git a/Modules/_sqlite/sqlitecompat.h b/Modules/_sqlite/sqlitecompat.h
deleted file mode 100644
index cf20f16..0000000
--- a/Modules/_sqlite/sqlitecompat.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* sqlitecompat.h - compatibility macros
- *
- * Copyright (C) 2006-2010 Gerhard Häring <gh@ghaering.de>
- *
- * This file is part of pysqlite.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- */
-
-#include "Python.h"
-
-#ifndef PYSQLITE_COMPAT_H
-#define PYSQLITE_COMPAT_H
-
-/* define Py_ssize_t for pre-2.5 versions of Python */
-
-#if PY_VERSION_HEX < 0x02050000
-typedef int Py_ssize_t;
-typedef int (*lenfunc)(PyObject*);
-#endif
-
-
-/* define PyDict_CheckExact for pre-2.4 versions of Python */
-#ifndef PyDict_CheckExact
-#define PyDict_CheckExact(op) ((op)->ob_type == &PyDict_Type)
-#endif
-
-/* define Py_CLEAR for pre-2.4 versions of Python */
-#ifndef Py_CLEAR
-#define Py_CLEAR(op) \
- do { \
- if (op) { \
- PyObject *tmp = (PyObject *)(op); \
- (op) = NULL; \
- Py_DECREF(tmp); \
- } \
- } while (0)
-#endif
-
-#ifndef PyVarObject_HEAD_INIT
-#define PyVarObject_HEAD_INIT(type, size) \
- PyObject_HEAD_INIT(type) size,
-#endif
-
-#ifndef Py_TYPE
-#define Py_TYPE(ob) ((ob)->ob_type)
-#endif
-
-#endif
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c
index 471a067..36beef1 100644
--- a/Modules/_sqlite/statement.c
+++ b/Modules/_sqlite/statement.c
@@ -27,7 +27,6 @@
#include "microprotocols.h"
#include "prepare_protocol.h"
#include "util.h"
-#include "sqlitecompat.h"
/* prototypes */
static int pysqlite_check_remaining_sql(const char* tail);
diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c
index d88bc3f..312fe3b 100644
--- a/Modules/_sqlite/util.c
+++ b/Modules/_sqlite/util.c
@@ -132,7 +132,7 @@ _pysqlite_long_from_int64(sqlite_int64 value)
}
# endif
#endif
- return PyLong_FromLong(value);
+ return PyLong_FromLong(Py_SAFE_DOWNCAST(value, sqlite_int64, long));
}
sqlite_int64
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 2ecbcc0..41ed667 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -70,10 +70,6 @@ static char copyright[] =
/* enables copy/deepcopy handling (work in progress) */
#undef USE_BUILTIN_COPY
-#if PY_VERSION_HEX < 0x01060000
-#define PyObject_DEL(op) PyMem_DEL((op))
-#endif
-
/* -------------------------------------------------------------------- */
#if defined(_MSC_VER)
@@ -1871,7 +1867,7 @@ static PyObject*
pattern_match(PatternObject* self, PyObject* args, PyObject* kw)
{
SRE_STATE state;
- int status;
+ Py_ssize_t status;
PyObject* string;
Py_ssize_t start = 0;
@@ -1993,10 +1989,8 @@ join_list(PyObject* list, PyObject* string)
/* join list elements */
PyObject* joiner;
-#if PY_VERSION_HEX >= 0x01060000
PyObject* function;
PyObject* args;
-#endif
PyObject* result;
joiner = PySequence_GetSlice(string, 0, 0);
@@ -2008,7 +2002,6 @@ join_list(PyObject* list, PyObject* string)
return joiner;
}
-#if PY_VERSION_HEX >= 0x01060000
function = PyObject_GetAttrString(joiner, "join");
if (!function) {
Py_DECREF(joiner);
@@ -2024,12 +2017,6 @@ join_list(PyObject* list, PyObject* string)
result = PyObject_CallObject(function, args);
Py_DECREF(args); /* also removes list */
Py_DECREF(function);
-#else
- result = call(
- "string", "join",
- PyTuple_Pack(2, list, joiner)
- );
-#endif
Py_DECREF(joiner);
return result;
@@ -2040,7 +2027,7 @@ pattern_findall(PatternObject* self, PyObject* args, PyObject* kw)
{
SRE_STATE state;
PyObject* list;
- int status;
+ Py_ssize_t status;
Py_ssize_t i, b, e;
PyObject* string;
@@ -2136,7 +2123,6 @@ error:
}
-#if PY_VERSION_HEX >= 0x02020000
static PyObject*
pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kw)
{
@@ -2158,7 +2144,6 @@ pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kw)
return iterator;
}
-#endif
static PyObject*
pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
@@ -2166,7 +2151,7 @@ pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
SRE_STATE state;
PyObject* list;
PyObject* item;
- int status;
+ Py_ssize_t status;
Py_ssize_t n;
Py_ssize_t i;
void* last;
@@ -2282,7 +2267,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
PyObject* args;
PyObject* match;
void* ptr;
- int status;
+ Py_ssize_t status;
Py_ssize_t n;
Py_ssize_t i, b, e;
int logical_charsize, charsize;
@@ -2301,7 +2286,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
ptr = getstring(ptemplate, &n, &logical_charsize, &charsize, &view);
b = charsize;
if (ptr) {
- literal = sre_literal_template(b, ptr, n);
+ literal = sre_literal_template(charsize, ptr, n);
} else {
PyErr_Clear();
literal = 0;
@@ -2581,10 +2566,8 @@ static PyMethodDef pattern_methods[] = {
pattern_split_doc},
{"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS,
pattern_findall_doc},
-#if PY_VERSION_HEX >= 0x02020000
{"finditer", (PyCFunction) pattern_finditer, METH_VARARGS|METH_KEYWORDS,
pattern_finditer_doc},
-#endif
{"scanner", (PyCFunction) pattern_scanner, METH_VARARGS|METH_KEYWORDS},
{"__copy__", (PyCFunction) pattern_copy, METH_NOARGS},
{"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_O},
@@ -3767,7 +3750,7 @@ scanner_match(ScannerObject* self, PyObject *unused)
{
SRE_STATE* state = &self->state;
PyObject* match;
- int status;
+ Py_ssize_t status;
state_reset(state);
@@ -3798,7 +3781,7 @@ scanner_search(ScannerObject* self, PyObject *unused)
{
SRE_STATE* state = &self->state;
PyObject* match;
- int status;
+ Py_ssize_t status;
state_reset(state);
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index cd6640f..3eb03a7 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -45,6 +45,70 @@
#endif
+/* Include symbols from _socket module */
+#include "socketmodule.h"
+
+static PySocketModule_APIObject PySocketModule;
+
+#if defined(HAVE_POLL_H)
+#include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+#include <sys/poll.h>
+#endif
+
+/* Include OpenSSL header files */
+#include "openssl/rsa.h"
+#include "openssl/crypto.h"
+#include "openssl/x509.h"
+#include "openssl/x509v3.h"
+#include "openssl/pem.h"
+#include "openssl/ssl.h"
+#include "openssl/err.h"
+#include "openssl/rand.h"
+
+/* SSL error object */
+static PyObject *PySSLErrorObject;
+static PyObject *PySSLZeroReturnErrorObject;
+static PyObject *PySSLWantReadErrorObject;
+static PyObject *PySSLWantWriteErrorObject;
+static PyObject *PySSLSyscallErrorObject;
+static PyObject *PySSLEOFErrorObject;
+
+/* Error mappings */
+static PyObject *err_codes_to_names;
+static PyObject *err_names_to_codes;
+static PyObject *lib_codes_to_names;
+
+struct py_ssl_error_code {
+ const char *mnemonic;
+ int library, reason;
+};
+struct py_ssl_library_code {
+ const char *library;
+ int code;
+};
+
+/* Include generated data (error codes) */
+#include "_ssl_data.h"
+
+/* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
+ http://www.openssl.org/news/changelog.html
+ */
+#if OPENSSL_VERSION_NUMBER >= 0x10001000L
+# define HAVE_TLSv1_2 1
+#else
+# define HAVE_TLSv1_2 0
+#endif
+
+/* SNI support (client- and server-side) appeared in OpenSSL 1.0.0.
+ * This includes the SSL_set_SSL_CTX() function.
+ */
+#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
+# define HAVE_SNI 1
+#else
+# define HAVE_SNI 0
+#endif
+
enum py_ssl_error {
/* these mirror ssl.h */
PY_SSL_ERROR_NONE,
@@ -78,55 +142,14 @@ enum py_ssl_version {
#endif
PY_SSL_VERSION_SSL3=1,
PY_SSL_VERSION_SSL23,
+#if HAVE_TLSv1_2
+ PY_SSL_VERSION_TLS1,
+ PY_SSL_VERSION_TLS1_1,
+ PY_SSL_VERSION_TLS1_2
+#else
PY_SSL_VERSION_TLS1
-};
-
-struct py_ssl_error_code {
- const char *mnemonic;
- int library, reason;
-};
-
-struct py_ssl_library_code {
- const char *library;
- int code;
-};
-
-/* Include symbols from _socket module */
-#include "socketmodule.h"
-
-static PySocketModule_APIObject PySocketModule;
-
-#if defined(HAVE_POLL_H)
-#include <poll.h>
-#elif defined(HAVE_SYS_POLL_H)
-#include <sys/poll.h>
#endif
-
-/* Include OpenSSL header files */
-#include "openssl/rsa.h"
-#include "openssl/crypto.h"
-#include "openssl/x509.h"
-#include "openssl/x509v3.h"
-#include "openssl/pem.h"
-#include "openssl/ssl.h"
-#include "openssl/err.h"
-#include "openssl/rand.h"
-
-/* Include generated data (error codes) */
-#include "_ssl_data.h"
-
-/* SSL error object */
-static PyObject *PySSLErrorObject;
-static PyObject *PySSLZeroReturnErrorObject;
-static PyObject *PySSLWantReadErrorObject;
-static PyObject *PySSLWantWriteErrorObject;
-static PyObject *PySSLSyscallErrorObject;
-static PyObject *PySSLEOFErrorObject;
-
-/* Error mappings */
-static PyObject *err_codes_to_names;
-static PyObject *err_names_to_codes;
-static PyObject *lib_codes_to_names;
+};
#ifdef WITH_THREAD
@@ -186,12 +209,16 @@ typedef struct {
char *npn_protocols;
int npn_protocols_len;
#endif
+#ifndef OPENSSL_NO_TLSEXT
+ PyObject *set_hostname;
+#endif
} PySSLContext;
typedef struct {
PyObject_HEAD
PyObject *Socket; /* weakref to socket on which we're layered */
SSL *ssl;
+ PySSLContext *ctx; /* weakref to SSL context */
X509 *peer_cert;
int shutdown_seen_zero;
enum py_ssl_server_or_client socket_type;
@@ -442,11 +469,13 @@ _setSSLError (char *errstr, int errcode, char *filename, int lineno) {
*/
static PySSLSocket *
-newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
+newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
enum py_ssl_server_or_client socket_type,
char *server_hostname)
{
PySSLSocket *self;
+ SSL_CTX *ctx = sslctx->ctx;
+ long mode;
self = PyObject_New(PySSLSocket, &PySSLSocket_Type);
if (self == NULL)
@@ -455,6 +484,8 @@ newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
self->peer_cert = NULL;
self->ssl = NULL;
self->Socket = NULL;
+ self->ctx = sslctx;
+ Py_INCREF(sslctx);
/* Make sure the SSL error state is initialized */
(void) ERR_get_state();
@@ -463,12 +494,15 @@ newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
PySSL_BEGIN_ALLOW_THREADS
self->ssl = SSL_new(ctx);
PySSL_END_ALLOW_THREADS
+ SSL_set_app_data(self->ssl,self);
SSL_set_fd(self->ssl, sock->sock_fd);
+ mode = SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
#ifdef SSL_MODE_AUTO_RETRY
- SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
+ mode |= SSL_MODE_AUTO_RETRY;
#endif
+ SSL_set_mode(self->ssl, mode);
-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
+#if HAVE_SNI
if (server_hostname != NULL)
SSL_set_tlsext_host_name(self->ssl, server_hostname);
#endif
@@ -1050,6 +1084,24 @@ _decode_certificate(X509 *certificate) {
return NULL;
}
+static PyObject *
+_certificate_to_der(X509 *certificate)
+{
+ unsigned char *bytes_buf = NULL;
+ int len;
+ PyObject *retval;
+
+ bytes_buf = NULL;
+ len = i2d_X509(certificate, &bytes_buf);
+ if (len < 0) {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ return NULL;
+ }
+ /* this is actually an immutable bytes sequence */
+ retval = PyBytes_FromStringAndSize((const char *) bytes_buf, len);
+ OPENSSL_free(bytes_buf);
+ return retval;
+}
static PyObject *
PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
@@ -1095,8 +1147,6 @@ PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
static PyObject *
PySSL_peercert(PySSLSocket *self, PyObject *args)
{
- PyObject *retval = NULL;
- int len;
int verification;
int binary_mode = 0;
@@ -1108,21 +1158,7 @@ PySSL_peercert(PySSLSocket *self, PyObject *args)
if (binary_mode) {
/* return cert in DER-encoded format */
-
- unsigned char *bytes_buf = NULL;
-
- bytes_buf = NULL;
- len = i2d_X509(self->peer_cert, &bytes_buf);
- if (len < 0) {
- PySSL_SetError(self, len, __FILE__, __LINE__);
- return NULL;
- }
- /* this is actually an immutable bytes sequence */
- retval = PyBytes_FromStringAndSize
- ((const char *) bytes_buf, len);
- OPENSSL_free(bytes_buf);
- return retval;
-
+ return _certificate_to_der(self->peer_cert);
} else {
verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl));
if ((verification & SSL_VERIFY_PEER) == 0)
@@ -1225,6 +1261,43 @@ static PyObject *PySSL_compression(PySSLSocket *self) {
#endif
}
+static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) {
+ Py_INCREF(self->ctx);
+ return self->ctx;
+}
+
+static int PySSL_set_context(PySSLSocket *self, PyObject *value,
+ void *closure) {
+
+ if (PyObject_TypeCheck(value, &PySSLContext_Type)) {
+#if !HAVE_SNI
+ PyErr_SetString(PyExc_NotImplementedError, "setting a socket's "
+ "context is not supported by your OpenSSL library");
+ return -1;
+#else
+ Py_INCREF(value);
+ Py_DECREF(self->ctx);
+ self->ctx = (PySSLContext *) value;
+ SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
+#endif
+ } else {
+ PyErr_SetString(PyExc_TypeError, "The value must be a SSLContext");
+ return -1;
+ }
+
+ return 0;
+}
+
+PyDoc_STRVAR(PySSL_set_context_doc,
+"_setter_context(ctx)\n\
+\
+This changes the context associated with the SSLSocket. This is typically\n\
+used from within a callback function set by the set_servername_callback\n\
+on the SSLContext to change the certificate information associated with the\n\
+SSLSocket before the cryptographic exchange handshake messages\n");
+
+
+
static void PySSL_dealloc(PySSLSocket *self)
{
if (self->peer_cert) /* Possible not to have one? */
@@ -1232,6 +1305,7 @@ static void PySSL_dealloc(PySSLSocket *self)
if (self->ssl)
SSL_free(self->ssl);
Py_XDECREF(self->Socket);
+ Py_XDECREF(self->ctx);
PyObject_Del(self);
}
@@ -1672,6 +1746,12 @@ If the TLS handshake is not yet complete, None is returned");
#endif /* HAVE_OPENSSL_FINISHED */
+static PyGetSetDef ssl_getsetlist[] = {
+ {"context", (getter) PySSL_get_context,
+ (setter) PySSL_set_context, PySSL_set_context_doc},
+ {NULL}, /* sentinel */
+};
+
static PyMethodDef PySSLMethods[] = {
{"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
{"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
@@ -1726,6 +1806,8 @@ static PyTypeObject PySSLSocket_Type = {
0, /*tp_iter*/
0, /*tp_iternext*/
PySSLMethods, /*tp_methods*/
+ 0, /*tp_members*/
+ ssl_getsetlist, /*tp_getset*/
};
@@ -1749,6 +1831,12 @@ context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PySSL_BEGIN_ALLOW_THREADS
if (proto_version == PY_SSL_VERSION_TLS1)
ctx = SSL_CTX_new(TLSv1_method());
+#if HAVE_TLSv1_2
+ else if (proto_version == PY_SSL_VERSION_TLS1_1)
+ ctx = SSL_CTX_new(TLSv1_1_method());
+ else if (proto_version == PY_SSL_VERSION_TLS1_2)
+ ctx = SSL_CTX_new(TLSv1_2_method());
+#endif
else if (proto_version == PY_SSL_VERSION_SSL3)
ctx = SSL_CTX_new(SSLv3_method());
#ifndef OPENSSL_NO_SSL2
@@ -1782,6 +1870,9 @@ context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
#ifdef OPENSSL_NPN_NEGOTIATED
self->npn_protocols = NULL;
#endif
+#ifndef OPENSSL_NO_TLSEXT
+ self->set_hostname = NULL;
+#endif
/* Defaults */
SSL_CTX_set_verify(self->ctx, SSL_VERIFY_NONE, NULL);
SSL_CTX_set_options(self->ctx,
@@ -1795,9 +1886,28 @@ context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return (PyObject *)self;
}
+static int
+context_traverse(PySSLContext *self, visitproc visit, void *arg)
+{
+#ifndef OPENSSL_NO_TLSEXT
+ Py_VISIT(self->set_hostname);
+#endif
+ return 0;
+}
+
+static int
+context_clear(PySSLContext *self)
+{
+#ifndef OPENSSL_NO_TLSEXT
+ Py_CLEAR(self->set_hostname);
+#endif
+ return 0;
+}
+
static void
context_dealloc(PySSLContext *self)
{
+ context_clear(self);
SSL_CTX_free(self->ctx);
#ifdef OPENSSL_NPN_NEGOTIATED
PyMem_Free(self->npn_protocols);
@@ -2021,8 +2131,8 @@ _pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password,
goto error;
}
- free(pw_info->password);
- pw_info->password = malloc(size);
+ PyMem_Free(pw_info->password);
+ pw_info->password = PyMem_Malloc(size);
if (!pw_info->password) {
PyErr_SetString(PyExc_MemoryError,
"unable to allocate password buffer");
@@ -2166,13 +2276,13 @@ load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds)
}
SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
- free(pw_info.password);
+ PyMem_Free(pw_info.password);
Py_RETURN_NONE;
error:
SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
- free(pw_info.password);
+ PyMem_Free(pw_info.password);
Py_XDECREF(keyfile_bytes);
Py_XDECREF(certfile_bytes);
return NULL;
@@ -2288,7 +2398,7 @@ context_wrap_socket(PySSLContext *self, PyObject *args, PyObject *kwds)
&sock, &server_side,
"idna", &hostname))
return NULL;
-#ifndef SSL_CTRL_SET_TLSEXT_HOSTNAME
+#if !HAVE_SNI
PyMem_Free(hostname);
PyErr_SetString(PyExc_ValueError, "server_hostname is not supported "
"by your OpenSSL library");
@@ -2296,7 +2406,7 @@ context_wrap_socket(PySSLContext *self, PyObject *args, PyObject *kwds)
#endif
}
- res = (PyObject *) newPySSLSocket(self->ctx, sock, server_side,
+ res = (PyObject *) newPySSLSocket(self, sock, server_side,
hostname);
if (hostname != NULL)
PyMem_Free(hostname);
@@ -2381,6 +2491,248 @@ set_ecdh_curve(PySSLContext *self, PyObject *name)
}
#endif
+#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
+static int
+_servername_callback(SSL *s, int *al, void *args)
+{
+ int ret;
+ PySSLContext *ssl_ctx = (PySSLContext *) args;
+ PySSLSocket *ssl;
+ PyObject *servername_o;
+ PyObject *servername_idna;
+ PyObject *result;
+ /* The high-level ssl.SSLSocket object */
+ PyObject *ssl_socket;
+ const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
+#ifdef WITH_THREAD
+ PyGILState_STATE gstate = PyGILState_Ensure();
+#endif
+
+ if (ssl_ctx->set_hostname == NULL) {
+ /* remove race condition in this the call back while if removing the
+ * callback is in progress */
+#ifdef WITH_THREAD
+ PyGILState_Release(gstate);
+#endif
+ return SSL_TLSEXT_ERR_OK;
+ }
+
+ ssl = SSL_get_app_data(s);
+ assert(PySSLSocket_Check(ssl));
+ ssl_socket = PyWeakref_GetObject(ssl->Socket);
+ Py_INCREF(ssl_socket);
+ if (ssl_socket == Py_None) {
+ goto error;
+ }
+
+ if (servername == NULL) {
+ result = PyObject_CallFunctionObjArgs(ssl_ctx->set_hostname, ssl_socket,
+ Py_None, ssl_ctx, NULL);
+ }
+ else {
+ servername_o = PyBytes_FromString(servername);
+ if (servername_o == NULL) {
+ PyErr_WriteUnraisable((PyObject *) ssl_ctx);
+ goto error;
+ }
+ servername_idna = PyUnicode_FromEncodedObject(servername_o, "idna", NULL);
+ if (servername_idna == NULL) {
+ PyErr_WriteUnraisable(servername_o);
+ Py_DECREF(servername_o);
+ goto error;
+ }
+ Py_DECREF(servername_o);
+ result = PyObject_CallFunctionObjArgs(ssl_ctx->set_hostname, ssl_socket,
+ servername_idna, ssl_ctx, NULL);
+ Py_DECREF(servername_idna);
+ }
+ Py_DECREF(ssl_socket);
+
+ if (result == NULL) {
+ PyErr_WriteUnraisable(ssl_ctx->set_hostname);
+ *al = SSL_AD_HANDSHAKE_FAILURE;
+ ret = SSL_TLSEXT_ERR_ALERT_FATAL;
+ }
+ else {
+ if (result != Py_None) {
+ *al = (int) PyLong_AsLong(result);
+ if (PyErr_Occurred()) {
+ PyErr_WriteUnraisable(result);
+ *al = SSL_AD_INTERNAL_ERROR;
+ }
+ ret = SSL_TLSEXT_ERR_ALERT_FATAL;
+ }
+ else {
+ ret = SSL_TLSEXT_ERR_OK;
+ }
+ Py_DECREF(result);
+ }
+
+#ifdef WITH_THREAD
+ PyGILState_Release(gstate);
+#endif
+ return ret;
+
+error:
+ Py_DECREF(ssl_socket);
+ *al = SSL_AD_INTERNAL_ERROR;
+ ret = SSL_TLSEXT_ERR_ALERT_FATAL;
+#ifdef WITH_THREAD
+ PyGILState_Release(gstate);
+#endif
+ return ret;
+}
+#endif
+
+PyDoc_STRVAR(PySSL_set_servername_callback_doc,
+"set_servername_callback(method)\n\
+\n\
+This sets a callback that will be called when a server name is provided by\n\
+the SSL/TLS client in the SNI extension.\n\
+\n\
+If the argument is None then the callback is disabled. The method is called\n\
+with the SSLSocket, the server name as a string, and the SSLContext object.\n\
+See RFC 6066 for details of the SNI extension.");
+
+static PyObject *
+set_servername_callback(PySSLContext *self, PyObject *args)
+{
+#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
+ PyObject *cb;
+
+ if (!PyArg_ParseTuple(args, "O", &cb))
+ return NULL;
+
+ Py_CLEAR(self->set_hostname);
+ if (cb == Py_None) {
+ SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
+ }
+ else {
+ if (!PyCallable_Check(cb)) {
+ SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
+ PyErr_SetString(PyExc_TypeError,
+ "not a callable object");
+ return NULL;
+ }
+ Py_INCREF(cb);
+ self->set_hostname = cb;
+ SSL_CTX_set_tlsext_servername_callback(self->ctx, _servername_callback);
+ SSL_CTX_set_tlsext_servername_arg(self->ctx, self);
+ }
+ Py_RETURN_NONE;
+#else
+ PyErr_SetString(PyExc_NotImplementedError,
+ "The TLS extension servername callback, "
+ "SSL_CTX_set_tlsext_servername_callback, "
+ "is not in the current OpenSSL library.");
+ return NULL;
+#endif
+}
+
+PyDoc_STRVAR(PySSL_get_stats_doc,
+"cert_store_stats() -> {'crl': int, 'x509_ca': int, 'x509': int}\n\
+\n\
+Returns quantities of loaded X.509 certificates. X.509 certificates with a\n\
+CA extension and certificate revocation lists inside the context's cert\n\
+store.\n\
+NOTE: Certificates in a capath directory aren't loaded unless they have\n\
+been used at least once.");
+
+static PyObject *
+cert_store_stats(PySSLContext *self)
+{
+ X509_STORE *store;
+ X509_OBJECT *obj;
+ int x509 = 0, crl = 0, pkey = 0, ca = 0, i;
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+ for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
+ obj = sk_X509_OBJECT_value(store->objs, i);
+ switch (obj->type) {
+ case X509_LU_X509:
+ x509++;
+ if (X509_check_ca(obj->data.x509)) {
+ ca++;
+ }
+ break;
+ case X509_LU_CRL:
+ crl++;
+ break;
+ case X509_LU_PKEY:
+ pkey++;
+ break;
+ default:
+ /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
+ * As far as I can tell they are internal states and never
+ * stored in a cert store */
+ break;
+ }
+ }
+ return Py_BuildValue("{sisisi}", "x509", x509, "crl", crl,
+ "x509_ca", ca);
+}
+
+PyDoc_STRVAR(PySSL_get_ca_certs_doc,
+"get_ca_certs([der=False]) -> list of loaded certificate\n\
+\n\
+Returns a list of dicts with information of loaded CA certs. If the\n\
+optional argument is True, returns a DER-encoded copy of the CA certificate.\n\
+NOTE: Certificates in a capath directory aren't loaded unless they have\n\
+been used at least once.");
+
+static PyObject *
+get_ca_certs(PySSLContext *self, PyObject *args)
+{
+ X509_STORE *store;
+ PyObject *ci = NULL, *rlist = NULL;
+ int i;
+ int binary_mode = 0;
+
+ if (!PyArg_ParseTuple(args, "|p:get_ca_certs", &binary_mode)) {
+ return NULL;
+ }
+
+ if ((rlist = PyList_New(0)) == NULL) {
+ return NULL;
+ }
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+ for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
+ X509_OBJECT *obj;
+ X509 *cert;
+
+ obj = sk_X509_OBJECT_value(store->objs, i);
+ if (obj->type != X509_LU_X509) {
+ /* not a x509 cert */
+ continue;
+ }
+ /* CA for any purpose */
+ cert = obj->data.x509;
+ if (!X509_check_ca(cert)) {
+ continue;
+ }
+ if (binary_mode) {
+ ci = _certificate_to_der(cert);
+ } else {
+ ci = _decode_certificate(cert);
+ }
+ if (ci == NULL) {
+ goto error;
+ }
+ if (PyList_Append(rlist, ci) == -1) {
+ goto error;
+ }
+ Py_CLEAR(ci);
+ }
+ return rlist;
+
+ error:
+ Py_XDECREF(ci);
+ Py_XDECREF(rlist);
+ return NULL;
+}
+
+
static PyGetSetDef context_getsetlist[] = {
{"options", (getter) get_options,
(setter) set_options, NULL},
@@ -2410,6 +2762,12 @@ static struct PyMethodDef context_methods[] = {
{"set_ecdh_curve", (PyCFunction) set_ecdh_curve,
METH_O, NULL},
#endif
+ {"set_servername_callback", (PyCFunction) set_servername_callback,
+ METH_VARARGS, PySSL_set_servername_callback_doc},
+ {"cert_store_stats", (PyCFunction) cert_store_stats,
+ METH_NOARGS, PySSL_get_stats_doc},
+ {"get_ca_certs", (PyCFunction) get_ca_certs,
+ METH_VARARGS, PySSL_get_ca_certs_doc},
{NULL, NULL} /* sentinel */
};
@@ -2433,10 +2791,10 @@ static PyTypeObject PySSLContext_Type = {
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
+ (traverseproc) context_traverse, /*tp_traverse*/
+ (inquiry) context_clear, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
0, /*tp_iter*/
@@ -2647,7 +3005,169 @@ PySSL_RAND_atfork(void)
#endif /* HAVE_OPENSSL_RAND */
+PyDoc_STRVAR(PySSL_get_default_verify_paths_doc,
+"get_default_verify_paths() -> tuple\n\
+\n\
+Return search paths and environment vars that are used by SSLContext's\n\
+set_default_verify_paths() to load default CAs. The values are\n\
+'cert_file_env', 'cert_file', 'cert_dir_env', 'cert_dir'.");
+
+static PyObject *
+PySSL_get_default_verify_paths(PyObject *self)
+{
+ PyObject *ofile_env = NULL;
+ PyObject *ofile = NULL;
+ PyObject *odir_env = NULL;
+ PyObject *odir = NULL;
+
+#define convert(info, target) { \
+ const char *tmp = (info); \
+ target = NULL; \
+ if (!tmp) { Py_INCREF(Py_None); target = Py_None; } \
+ else if ((target = PyUnicode_DecodeFSDefault(tmp)) == NULL) { \
+ target = PyBytes_FromString(tmp); } \
+ if (!target) goto error; \
+ } while(0)
+
+ convert(X509_get_default_cert_file_env(), ofile_env);
+ convert(X509_get_default_cert_file(), ofile);
+ convert(X509_get_default_cert_dir_env(), odir_env);
+ convert(X509_get_default_cert_dir(), odir);
+#undef convert
+
+ return Py_BuildValue("NNNN", ofile_env, ofile, odir_env, odir);
+
+ error:
+ Py_XDECREF(ofile_env);
+ Py_XDECREF(ofile);
+ Py_XDECREF(odir_env);
+ Py_XDECREF(odir);
+ return NULL;
+}
+#ifdef _MSC_VER
+PyDoc_STRVAR(PySSL_enum_cert_store_doc,
+"enum_cert_store(store_name, cert_type='certificate') -> []\n\
+\n\
+Retrieve certificates from Windows' cert store. store_name may be one of\n\
+'CA', 'ROOT' or 'MY'. The system may provide more cert storages, too.\n\
+cert_type must be either 'certificate' or 'crl'.\n\
+The function returns a list of (bytes, encoding_type) tuples. The\n\
+encoding_type flag can be interpreted with X509_ASN_ENCODING or\n\
+PKCS_7_ASN_ENCODING.");
+
+static PyObject *
+PySSL_enum_cert_store(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ char *kwlist[] = {"store_name", "cert_type", NULL};
+ char *store_name;
+ char *cert_type = "certificate";
+ HCERTSTORE hStore = NULL;
+ PyObject *result = NULL;
+ PyObject *tup = NULL, *cert = NULL, *enc = NULL;
+ int ok = 1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|s:enum_cert_store",
+ kwlist, &store_name, &cert_type)) {
+ return NULL;
+ }
+
+ if ((strcmp(cert_type, "certificate") != 0) &&
+ (strcmp(cert_type, "crl") != 0)) {
+ return PyErr_Format(PyExc_ValueError,
+ "cert_type must be 'certificate' or 'crl', "
+ "not %.100s", cert_type);
+ }
+
+ if ((result = PyList_New(0)) == NULL) {
+ return NULL;
+ }
+
+ if ((hStore = CertOpenSystemStore(NULL, store_name)) == NULL) {
+ Py_DECREF(result);
+ return PyErr_SetFromWindowsErr(GetLastError());
+ }
+
+ if (strcmp(cert_type, "certificate") == 0) {
+ PCCERT_CONTEXT pCertCtx = NULL;
+ while (pCertCtx = CertEnumCertificatesInStore(hStore, pCertCtx)) {
+ cert = PyBytes_FromStringAndSize((const char*)pCertCtx->pbCertEncoded,
+ pCertCtx->cbCertEncoded);
+ if (!cert) {
+ ok = 0;
+ break;
+ }
+ if ((enc = PyLong_FromLong(pCertCtx->dwCertEncodingType)) == NULL) {
+ ok = 0;
+ break;
+ }
+ if ((tup = PyTuple_New(2)) == NULL) {
+ ok = 0;
+ break;
+ }
+ PyTuple_SET_ITEM(tup, 0, cert); cert = NULL;
+ PyTuple_SET_ITEM(tup, 1, enc); enc = NULL;
+
+ if (PyList_Append(result, tup) < 0) {
+ ok = 0;
+ break;
+ }
+ Py_CLEAR(tup);
+ }
+ if (pCertCtx) {
+ /* loop ended with an error, need to clean up context manually */
+ CertFreeCertificateContext(pCertCtx);
+ }
+ } else {
+ PCCRL_CONTEXT pCrlCtx = NULL;
+ while (pCrlCtx = CertEnumCRLsInStore(hStore, pCrlCtx)) {
+ cert = PyBytes_FromStringAndSize((const char*)pCrlCtx->pbCrlEncoded,
+ pCrlCtx->cbCrlEncoded);
+ if (!cert) {
+ ok = 0;
+ break;
+ }
+ if ((enc = PyLong_FromLong(pCrlCtx->dwCertEncodingType)) == NULL) {
+ ok = 0;
+ break;
+ }
+ if ((tup = PyTuple_New(2)) == NULL) {
+ ok = 0;
+ break;
+ }
+ PyTuple_SET_ITEM(tup, 0, cert); cert = NULL;
+ PyTuple_SET_ITEM(tup, 1, enc); enc = NULL;
+
+ if (PyList_Append(result, tup) < 0) {
+ ok = 0;
+ break;
+ }
+ Py_CLEAR(tup);
+ }
+ if (pCrlCtx) {
+ /* loop ended with an error, need to clean up context manually */
+ CertFreeCRLContext(pCrlCtx);
+ }
+ }
+
+ /* In error cases cert, enc and tup may not be NULL */
+ Py_XDECREF(cert);
+ Py_XDECREF(enc);
+ Py_XDECREF(tup);
+
+ if (!CertCloseStore(hStore, 0)) {
+ /* This error case might shadow another exception.*/
+ Py_DECREF(result);
+ return PyErr_SetFromWindowsErr(GetLastError());
+ }
+ if (ok) {
+ return result;
+ } else {
+ Py_DECREF(result);
+ return NULL;
+ }
+}
+#endif
/* List of functions exported by this module. */
@@ -2666,6 +3186,12 @@ static PyMethodDef PySSL_methods[] = {
{"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
PySSL_RAND_status_doc},
#endif
+ {"get_default_verify_paths", (PyCFunction)PySSL_get_default_verify_paths,
+ METH_NOARGS, PySSL_get_default_verify_paths_doc},
+#ifdef _MSC_VER
+ {"enum_cert_store", (PyCFunction)PySSL_enum_cert_store,
+ METH_VARARGS | METH_KEYWORDS, PySSL_enum_cert_store_doc},
+#endif
{NULL, NULL} /* Sentinel */
};
@@ -2727,7 +3253,7 @@ static int _setup_ssl_threads(void) {
if (_ssl_locks == NULL) {
_ssl_locks_count = CRYPTO_num_locks();
_ssl_locks = (PyThread_type_lock *)
- malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
+ PyMem_Malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
if (_ssl_locks == NULL)
return 0;
memset(_ssl_locks, 0,
@@ -2739,7 +3265,7 @@ static int _setup_ssl_threads(void) {
for (j = 0; j < i; j++) {
PyThread_free_lock(_ssl_locks[j]);
}
- free(_ssl_locks);
+ PyMem_Free(_ssl_locks);
return 0;
}
}
@@ -2894,6 +3420,63 @@ PyInit__ssl(void)
PyModule_AddIntConstant(m, "CERT_REQUIRED",
PY_SSL_CERT_REQUIRED);
+#ifdef _MSC_VER
+ /* Windows dwCertEncodingType */
+ PyModule_AddIntMacro(m, X509_ASN_ENCODING);
+ PyModule_AddIntMacro(m, PKCS_7_ASN_ENCODING);
+#endif
+
+ /* Alert Descriptions from ssl.h */
+ /* note RESERVED constants no longer intended for use have been removed */
+ /* http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6 */
+
+#define ADD_AD_CONSTANT(s) \
+ PyModule_AddIntConstant(m, "ALERT_DESCRIPTION_"#s, \
+ SSL_AD_##s)
+
+ ADD_AD_CONSTANT(CLOSE_NOTIFY);
+ ADD_AD_CONSTANT(UNEXPECTED_MESSAGE);
+ ADD_AD_CONSTANT(BAD_RECORD_MAC);
+ ADD_AD_CONSTANT(RECORD_OVERFLOW);
+ ADD_AD_CONSTANT(DECOMPRESSION_FAILURE);
+ ADD_AD_CONSTANT(HANDSHAKE_FAILURE);
+ ADD_AD_CONSTANT(BAD_CERTIFICATE);
+ ADD_AD_CONSTANT(UNSUPPORTED_CERTIFICATE);
+ ADD_AD_CONSTANT(CERTIFICATE_REVOKED);
+ ADD_AD_CONSTANT(CERTIFICATE_EXPIRED);
+ ADD_AD_CONSTANT(CERTIFICATE_UNKNOWN);
+ ADD_AD_CONSTANT(ILLEGAL_PARAMETER);
+ ADD_AD_CONSTANT(UNKNOWN_CA);
+ ADD_AD_CONSTANT(ACCESS_DENIED);
+ ADD_AD_CONSTANT(DECODE_ERROR);
+ ADD_AD_CONSTANT(DECRYPT_ERROR);
+ ADD_AD_CONSTANT(PROTOCOL_VERSION);
+ ADD_AD_CONSTANT(INSUFFICIENT_SECURITY);
+ ADD_AD_CONSTANT(INTERNAL_ERROR);
+ ADD_AD_CONSTANT(USER_CANCELLED);
+ ADD_AD_CONSTANT(NO_RENEGOTIATION);
+ /* Not all constants are in old OpenSSL versions */
+#ifdef SSL_AD_UNSUPPORTED_EXTENSION
+ ADD_AD_CONSTANT(UNSUPPORTED_EXTENSION);
+#endif
+#ifdef SSL_AD_CERTIFICATE_UNOBTAINABLE
+ ADD_AD_CONSTANT(CERTIFICATE_UNOBTAINABLE);
+#endif
+#ifdef SSL_AD_UNRECOGNIZED_NAME
+ ADD_AD_CONSTANT(UNRECOGNIZED_NAME);
+#endif
+#ifdef SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE
+ ADD_AD_CONSTANT(BAD_CERTIFICATE_STATUS_RESPONSE);
+#endif
+#ifdef SSL_AD_BAD_CERTIFICATE_HASH_VALUE
+ ADD_AD_CONSTANT(BAD_CERTIFICATE_HASH_VALUE);
+#endif
+#ifdef SSL_AD_UNKNOWN_PSK_IDENTITY
+ ADD_AD_CONSTANT(UNKNOWN_PSK_IDENTITY);
+#endif
+
+#undef ADD_AD_CONSTANT
+
/* protocol versions */
#ifndef OPENSSL_NO_SSL2
PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
@@ -2905,6 +3488,12 @@ PyInit__ssl(void)
PY_SSL_VERSION_SSL23);
PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
PY_SSL_VERSION_TLS1);
+#if HAVE_TLSv1_2
+ PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_1",
+ PY_SSL_VERSION_TLS1_1);
+ PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_2",
+ PY_SSL_VERSION_TLS1_2);
+#endif
/* protocol options */
PyModule_AddIntConstant(m, "OP_ALL",
@@ -2912,6 +3501,10 @@ PyInit__ssl(void)
PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
+#if HAVE_TLSv1_2
+ PyModule_AddIntConstant(m, "OP_NO_TLSv1_1", SSL_OP_NO_TLSv1_1);
+ PyModule_AddIntConstant(m, "OP_NO_TLSv1_2", SSL_OP_NO_TLSv1_2);
+#endif
PyModule_AddIntConstant(m, "OP_CIPHER_SERVER_PREFERENCE",
SSL_OP_CIPHER_SERVER_PREFERENCE);
PyModule_AddIntConstant(m, "OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE);
@@ -2923,7 +3516,7 @@ PyInit__ssl(void)
SSL_OP_NO_COMPRESSION);
#endif
-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
+#if HAVE_SNI
r = Py_True;
#else
r = Py_False;
diff --git a/Modules/_stat.c b/Modules/_stat.c
new file mode 100644
index 0000000..a301fa8
--- /dev/null
+++ b/Modules/_stat.c
@@ -0,0 +1,563 @@
+/* stat.h interface
+ *
+ * The module defines all S_IF*, S_I*, UF_*, SF_* and ST_* constants to
+ * sensible default values as well as defines S_IS*() macros in order to keep
+ * backward compatibility with the old stat.py module.
+ *
+ * New constants and macros such as S_IFDOOR / S_ISDOOR() are always defined
+ * as int 0.
+ *
+ * NOTE: POSIX only defines the values of the S_I* permission bits.
+ *
+ */
+
+#define PY_SSIZE_T_CLEAN
+#include "Python.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif /* HAVE_SYS_TYPES_H */
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif /* HAVE_SYS_STAT_H */
+
+#ifdef MS_WINDOWS
+typedef unsigned short mode_t;
+#endif
+
+/* From Python's stat.py */
+#ifndef S_IMODE
+# define S_IMODE 07777
+#endif
+
+/* S_IFXXX constants (file types)
+ *
+ * Only the names are defined by POSIX but not their value. All common file
+ * types seems to have the same numeric value on all platforms, though.
+ *
+ * pyport.h guarantees S_IFMT, S_IFDIR, S_IFCHR, S_IFREG and S_IFLNK
+ */
+
+#ifndef S_IFBLK
+# define S_IFBLK 0060000
+#endif
+
+#ifndef S_IFIFO
+# define S_IFIFO 0010000
+#endif
+
+#ifndef S_IFSOCK
+# define S_IFSOCK 0140000
+#endif
+
+#ifndef S_IFDOOR
+# define S_IFDOOR 0
+#endif
+
+#ifndef S_IFPORT
+# define S_IFPORT 0
+#endif
+
+#ifndef S_IFWHT
+# define S_IFWHT 0
+#endif
+
+
+/* S_ISXXX()
+ * pyport.h defines S_ISDIR(), S_ISREG() and S_ISCHR()
+ */
+
+#ifndef S_ISBLK
+# define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
+#endif
+
+#ifndef S_ISFIFO
+# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
+#endif
+
+#ifndef S_ISLNK
+# define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
+#endif
+
+#ifndef S_ISSOCK
+# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
+#endif
+
+#ifndef S_ISDOOR
+# define S_ISDOOR(mode) 0
+#endif
+
+#ifndef S_ISPORT
+# define S_ISPORT(mode) 0
+#endif
+
+#ifndef S_ISWHT
+# define S_ISWHT(mode) 0
+#endif
+
+
+/* S_I* file permission
+ *
+ * The permission bit value are defined by POSIX standards.
+ */
+#ifndef S_ISUID
+# define S_ISUID 04000
+#endif
+
+#ifndef S_ISGID
+# define S_ISGID 02000
+#endif
+
+/* what is S_ENFMT? */
+#ifndef S_ENFMT
+# define S_ENFMT S_ISGID
+#endif
+
+#ifndef S_ISVTX
+# define S_ISVTX 01000
+#endif
+
+#ifndef S_IREAD
+# define S_IREAD 00400
+#endif
+
+#ifndef S_IWRITE
+# define S_IWRITE 00200
+#endif
+
+#ifndef S_IEXEC
+# define S_IEXEC 00100
+#endif
+
+#ifndef S_IRWXU
+# define S_IRWXU 00700
+#endif
+
+#ifndef S_IRUSR
+# define S_IRUSR 00400
+#endif
+
+#ifndef S_IWUSR
+# define S_IWUSR 00200
+#endif
+
+#ifndef S_IXUSR
+# define S_IXUSR 00100
+#endif
+
+#ifndef S_IRWXG
+# define S_IRWXG 00070
+#endif
+
+#ifndef S_IRGRP
+# define S_IRGRP 00040
+#endif
+
+#ifndef S_IWGRP
+# define S_IWGRP 00020
+#endif
+
+#ifndef S_IXGRP
+# define S_IXGRP 00010
+#endif
+
+#ifndef S_IRWXO
+# define S_IRWXO 00007
+#endif
+
+#ifndef S_IROTH
+# define S_IROTH 00004
+#endif
+
+#ifndef S_IWOTH
+# define S_IWOTH 00002
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 00001
+#endif
+
+
+/* Names for file flags */
+#ifndef UF_NODUMP
+# define UF_NODUMP 0x00000001
+#endif
+
+#ifndef UF_IMMUTABLE
+# define UF_IMMUTABLE 0x00000002
+#endif
+
+#ifndef UF_APPEND
+# define UF_APPEND 0x00000004
+#endif
+
+#ifndef UF_OPAQUE
+# define UF_OPAQUE 0x00000008
+#endif
+
+#ifndef UF_NOUNLINK
+# define UF_NOUNLINK 0x00000010
+#endif
+
+#ifndef UF_COMPRESSED
+# define UF_COMPRESSED 0x00000020
+#endif
+
+#ifndef UF_HIDDEN
+# define UF_HIDDEN 0x00008000
+#endif
+
+#ifndef SF_ARCHIVED
+# define SF_ARCHIVED 0x00010000
+#endif
+
+#ifndef SF_IMMUTABLE
+# define SF_IMMUTABLE 0x00020000
+#endif
+
+#ifndef SF_APPEND
+# define SF_APPEND 0x00040000
+#endif
+
+#ifndef SF_NOUNLINK
+# define SF_NOUNLINK 0x00100000
+#endif
+
+#ifndef SF_SNAPSHOT
+# define SF_SNAPSHOT 0x00200000
+#endif
+
+static mode_t
+_PyLong_AsMode_t(PyObject *op)
+{
+ unsigned long value;
+ mode_t mode;
+
+ value = PyLong_AsUnsignedLong(op);
+ if ((value == (unsigned long)-1) && PyErr_Occurred())
+ return (mode_t)-1;
+
+ mode = (mode_t)value;
+ if ((unsigned long)mode != value) {
+ PyErr_SetString(PyExc_OverflowError, "mode out of range");
+ return (mode_t)-1;
+ }
+ return mode;
+}
+
+
+#define stat_S_ISFUNC(isfunc, doc) \
+ static PyObject * \
+ stat_ ##isfunc (PyObject *self, PyObject *omode) \
+ { \
+ mode_t mode = _PyLong_AsMode_t(omode); \
+ if ((mode == (mode_t)-1) && PyErr_Occurred()) \
+ return NULL; \
+ return PyBool_FromLong(isfunc(mode)); \
+ } \
+ PyDoc_STRVAR(stat_ ## isfunc ## _doc, doc)
+
+stat_S_ISFUNC(S_ISDIR,
+ "S_ISDIR(mode) -> bool\n\n"
+ "Return True if mode is from a directory.");
+
+stat_S_ISFUNC(S_ISCHR,
+ "S_ISCHR(mode) -> bool\n\n"
+ "Return True if mode is from a character special device file.");
+
+stat_S_ISFUNC(S_ISBLK,
+ "S_ISBLK(mode) -> bool\n\n"
+ "Return True if mode is from a block special device file.");
+
+stat_S_ISFUNC(S_ISREG,
+ "S_ISREG(mode) -> bool\n\n"
+ "Return True if mode is from a regular file.");
+
+stat_S_ISFUNC(S_ISFIFO,
+ "S_ISFIFO(mode) -> bool\n\n"
+ "Return True if mode is from a FIFO (named pipe).");
+
+stat_S_ISFUNC(S_ISLNK,
+ "S_ISLNK(mode) -> bool\n\n"
+ "Return True if mode is from a symbolic link.");
+
+stat_S_ISFUNC(S_ISSOCK,
+ "S_ISSOCK(mode) -> bool\n\n"
+ "Return True if mode is from a socket.");
+
+stat_S_ISFUNC(S_ISDOOR,
+ "S_ISDOOR(mode) -> bool\n\n"
+ "Return True if mode is from a door.");
+
+stat_S_ISFUNC(S_ISPORT,
+ "S_ISPORT(mode) -> bool\n\n"
+ "Return True if mode is from an event port.");
+
+stat_S_ISFUNC(S_ISWHT,
+ "S_ISWHT(mode) -> bool\n\n"
+ "Return True if mode is from a whiteout.");
+
+
+PyDoc_STRVAR(stat_S_IMODE_doc,
+"Return the portion of the file's mode that can be set by os.chmod().");
+
+static PyObject *
+stat_S_IMODE(PyObject *self, PyObject *omode)
+{
+ mode_t mode = _PyLong_AsMode_t(omode);
+ if ((mode == (mode_t)-1) && PyErr_Occurred())
+ return NULL;
+ return PyLong_FromUnsignedLong(mode & S_IMODE);
+}
+
+
+PyDoc_STRVAR(stat_S_IFMT_doc,
+"Return the portion of the file's mode that describes the file type.");
+
+static PyObject *
+stat_S_IFMT(PyObject *self, PyObject *omode)
+{
+ mode_t mode = _PyLong_AsMode_t(omode);
+ if ((mode == (mode_t)-1) && PyErr_Occurred())
+ return NULL;
+ return PyLong_FromUnsignedLong(mode & S_IFMT);
+}
+
+/* file type chars according to
+ http://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/sys/stat.h */
+
+static char
+filetype(mode_t mode)
+{
+ /* common cases first */
+ if (S_ISREG(mode)) return '-';
+ if (S_ISDIR(mode)) return 'd';
+ if (S_ISLNK(mode)) return 'l';
+ /* special files */
+ if (S_ISBLK(mode)) return 'b';
+ if (S_ISCHR(mode)) return 'c';
+ if (S_ISFIFO(mode)) return 'p';
+ if (S_ISSOCK(mode)) return 's';
+ /* non-standard types */
+ if (S_ISDOOR(mode)) return 'D';
+ if (S_ISPORT(mode)) return 'P';
+ if (S_ISWHT(mode)) return 'w';
+ /* unknown */
+ return '?';
+}
+
+static void
+fileperm(mode_t mode, char *buf)
+{
+ buf[0] = mode & S_IRUSR ? 'r' : '-';
+ buf[1] = mode & S_IWUSR ? 'w' : '-';
+ if (mode & S_ISUID) {
+ buf[2] = mode & S_IXUSR ? 's' : 'S';
+ } else {
+ buf[2] = mode & S_IXUSR ? 'x' : '-';
+ }
+ buf[3] = mode & S_IRGRP ? 'r' : '-';
+ buf[4] = mode & S_IWGRP ? 'w' : '-';
+ if (mode & S_ISGID) {
+ buf[5] = mode & S_IXGRP ? 's' : 'S';
+ } else {
+ buf[5] = mode & S_IXGRP ? 'x' : '-';
+ }
+ buf[6] = mode & S_IROTH ? 'r' : '-';
+ buf[7] = mode & S_IWOTH ? 'w' : '-';
+ if (mode & S_ISVTX) {
+ buf[8] = mode & S_IXOTH ? 't' : 'T';
+ } else {
+ buf[8] = mode & S_IXOTH ? 'x' : '-';
+ }
+}
+
+PyDoc_STRVAR(stat_filemode_doc,
+"Convert a file's mode to a string of the form '-rwxrwxrwx'");
+
+static PyObject *
+stat_filemode(PyObject *self, PyObject *omode)
+{
+ char buf[10];
+ mode_t mode;
+
+ mode = _PyLong_AsMode_t(omode);
+ if ((mode == (mode_t)-1) && PyErr_Occurred())
+ return NULL;
+
+ buf[0] = filetype(mode);
+ fileperm(mode, &buf[1]);
+ return PyUnicode_FromStringAndSize(buf, 10);
+}
+
+
+static PyMethodDef stat_methods[] = {
+ {"S_ISDIR", stat_S_ISDIR, METH_O, stat_S_ISDIR_doc},
+ {"S_ISCHR", stat_S_ISCHR, METH_O, stat_S_ISCHR_doc},
+ {"S_ISBLK", stat_S_ISBLK, METH_O, stat_S_ISBLK_doc},
+ {"S_ISREG", stat_S_ISREG, METH_O, stat_S_ISREG_doc},
+ {"S_ISFIFO", stat_S_ISFIFO, METH_O, stat_S_ISFIFO_doc},
+ {"S_ISLNK", stat_S_ISLNK, METH_O, stat_S_ISLNK_doc},
+ {"S_ISSOCK", stat_S_ISSOCK, METH_O, stat_S_ISSOCK_doc},
+ {"S_ISDOOR", stat_S_ISDOOR, METH_O, stat_S_ISDOOR_doc},
+ {"S_ISPORT", stat_S_ISPORT, METH_O, stat_S_ISPORT_doc},
+ {"S_ISWHT", stat_S_ISWHT, METH_O, stat_S_ISWHT_doc},
+ {"S_IMODE", stat_S_IMODE, METH_O, stat_S_IMODE_doc},
+ {"S_IFMT", stat_S_IFMT, METH_O, stat_S_IFMT_doc},
+ {"filemode", stat_filemode, METH_O, stat_filemode_doc},
+ {NULL, NULL} /* sentinel */
+};
+
+
+PyDoc_STRVAR(module_doc,
+"S_IFMT_: file type bits\n\
+S_IFDIR: directory\n\
+S_IFCHR: character device\n\
+S_IFBLK: block device\n\
+S_IFREG: regular file\n\
+S_IFIFO: fifo (named pipe)\n\
+S_IFLNK: symbolic link\n\
+S_IFSOCK: socket file\n\
+S_IFDOOR: door\n\
+S_IFPORT: event port\n\
+S_IFWHT: whiteout\n\
+\n"
+
+"S_ISUID: set UID bit\n\
+S_ISGID: set GID bit\n\
+S_ENFMT: file locking enforcement\n\
+S_ISVTX: sticky bit\n\
+S_IREAD: Unix V7 synonym for S_IRUSR\n\
+S_IWRITE: Unix V7 synonym for S_IWUSR\n\
+S_IEXEC: Unix V7 synonym for S_IXUSR\n\
+S_IRWXU: mask for owner permissions\n\
+S_IRUSR: read by owner\n\
+S_IWUSR: write by owner\n\
+S_IXUSR: execute by owner\n\
+S_IRWXG: mask for group permissions\n\
+S_IRGRP: read by group\n\
+S_IWGRP: write by group\n\
+S_IXGRP: execute by group\n\
+S_IRWXO: mask for others (not in group) permissions\n\
+S_IROTH: read by others\n\
+S_IWOTH: write by others\n\
+S_IXOTH: execute by others\n\
+\n"
+
+"UF_NODUMP: do not dump file\n\
+UF_IMMUTABLE: file may not be changed\n\
+UF_APPEND: file may only be appended to\n\
+UF_OPAQUE: directory is opaque when viewed through a union stack\n\
+UF_NOUNLINK: file may not be renamed or deleted\n\
+UF_COMPRESSED: OS X: file is hfs-compressed\n\
+UF_HIDDEN: OS X: file should not be displayed\n\
+SF_ARCHIVED: file may be archived\n\
+SF_IMMUTABLE: file may not be changed\n\
+SF_APPEND: file may only be appended to\n\
+SF_NOUNLINK: file may not be renamed or deleted\n\
+SF_SNAPSHOT: file is a snapshot file\n\
+\n"
+
+"ST_MODE\n\
+ST_INO\n\
+ST_DEV\n\
+ST_NLINK\n\
+ST_UID\n\
+ST_GID\n\
+ST_SIZE\n\
+ST_ATIME\n\
+ST_MTIME\n\
+ST_CTIME\n\
+");
+
+
+static struct PyModuleDef statmodule = {
+ PyModuleDef_HEAD_INIT,
+ "_stat",
+ module_doc,
+ -1,
+ stat_methods,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit__stat(void)
+{
+ PyObject *m;
+ m = PyModule_Create(&statmodule);
+ if (m == NULL)
+ return NULL;
+
+ if (PyModule_AddIntMacro(m, S_IFDIR)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFCHR)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFBLK)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFREG)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFIFO)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFLNK)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFSOCK)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFDOOR)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFPORT)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IFWHT)) return NULL;
+
+ if (PyModule_AddIntMacro(m, S_ISUID)) return NULL;
+ if (PyModule_AddIntMacro(m, S_ISGID)) return NULL;
+ if (PyModule_AddIntMacro(m, S_ISVTX)) return NULL;
+ if (PyModule_AddIntMacro(m, S_ENFMT)) return NULL;
+
+ if (PyModule_AddIntMacro(m, S_IREAD)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IWRITE)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IEXEC)) return NULL;
+
+ if (PyModule_AddIntMacro(m, S_IRWXU)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IRUSR)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IWUSR)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IXUSR)) return NULL;
+
+ if (PyModule_AddIntMacro(m, S_IRWXG)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IRGRP)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IWGRP)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IXGRP)) return NULL;
+
+ if (PyModule_AddIntMacro(m, S_IRWXO)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IROTH)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IWOTH)) return NULL;
+ if (PyModule_AddIntMacro(m, S_IXOTH)) return NULL;
+
+ if (PyModule_AddIntMacro(m, UF_NODUMP)) return NULL;
+ if (PyModule_AddIntMacro(m, UF_IMMUTABLE)) return NULL;
+ if (PyModule_AddIntMacro(m, UF_APPEND)) return NULL;
+ if (PyModule_AddIntMacro(m, UF_OPAQUE)) return NULL;
+ if (PyModule_AddIntMacro(m, UF_NOUNLINK)) return NULL;
+ if (PyModule_AddIntMacro(m, UF_COMPRESSED)) return NULL;
+ if (PyModule_AddIntMacro(m, UF_HIDDEN)) return NULL;
+ if (PyModule_AddIntMacro(m, SF_ARCHIVED)) return NULL;
+ if (PyModule_AddIntMacro(m, SF_IMMUTABLE)) return NULL;
+ if (PyModule_AddIntMacro(m, SF_APPEND)) return NULL;
+ if (PyModule_AddIntMacro(m, SF_NOUNLINK)) return NULL;
+ if (PyModule_AddIntMacro(m, SF_SNAPSHOT)) return NULL;
+
+ if (PyModule_AddIntConstant(m, "ST_MODE", 0)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_INO", 1)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_DEV", 2)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_NLINK", 3)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_UID", 4)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_GID", 5)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_SIZE", 6)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_ATIME", 7)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_MTIME", 8)) return NULL;
+ if (PyModule_AddIntConstant(m, "ST_CTIME", 9)) return NULL;
+
+ return m;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Modules/_struct.c b/Modules/_struct.c
index 2848614..5848b19 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -26,6 +26,7 @@ typedef struct _formatcode {
const struct _formatdef *fmtdef;
Py_ssize_t offset;
Py_ssize_t size;
+ Py_ssize_t repeat;
} formatcode;
/* Struct object interface */
@@ -1199,12 +1200,11 @@ whichtable(char **pfmt)
case '!': /* Network byte order is big-endian */
return bigendian_table;
case '=': { /* Host byte order -- different from native in alignment! */
- int n = 1;
- char *p = (char *) &n;
- if (*p == 1)
- return lilendian_table;
- else
- return bigendian_table;
+#if PY_LITTLE_ENDIAN
+ return lilendian_table;
+#else
+ return bigendian_table;
+#endif
}
default:
--*pfmt; /* Back out of pointer increment */
@@ -1248,6 +1248,9 @@ align(Py_ssize_t size, char c, const formatdef *e)
return size;
}
+/*
+ * Struct object implementation.
+ */
/* calculate the size of a format string */
@@ -1261,7 +1264,7 @@ prepare_s(PyStructObject *self)
const char *s;
const char *fmt;
char c;
- Py_ssize_t size, len, num, itemsize;
+ Py_ssize_t size, len, ncodes, num, itemsize;
fmt = PyBytes_AS_STRING(self->s_format);
@@ -1270,6 +1273,7 @@ prepare_s(PyStructObject *self)
s = fmt;
size = 0;
len = 0;
+ ncodes = 0;
while ((c = *s++) != '\0') {
if (Py_ISSPACE(Py_CHARMASK(c)))
continue;
@@ -1299,9 +1303,9 @@ prepare_s(PyStructObject *self)
switch (c) {
case 's': /* fall through */
- case 'p': len++; break;
+ case 'p': len++; ncodes++; break;
case 'x': break;
- default: len += num; break;
+ default: len += num; if (num) ncodes++; break;
}
itemsize = e->size;
@@ -1316,14 +1320,14 @@ prepare_s(PyStructObject *self)
}
/* check for overflow */
- if ((len + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) {
+ if ((ncodes + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) {
PyErr_NoMemory();
return -1;
}
self->s_size = size;
self->s_len = len;
- codes = PyMem_MALLOC((len + 1) * sizeof(formatcode));
+ codes = PyMem_MALLOC((ncodes + 1) * sizeof(formatcode));
if (codes == NULL) {
PyErr_NoMemory();
return -1;
@@ -1355,23 +1359,24 @@ prepare_s(PyStructObject *self)
codes->offset = size;
codes->size = num;
codes->fmtdef = e;
+ codes->repeat = 1;
codes++;
size += num;
} else if (c == 'x') {
size += num;
- } else {
- while (--num >= 0) {
- codes->offset = size;
- codes->size = e->size;
- codes->fmtdef = e;
- codes++;
- size += e->size;
- }
+ } else if (num) {
+ codes->offset = size;
+ codes->size = e->size;
+ codes->fmtdef = e;
+ codes->repeat = num;
+ codes++;
+ size += e->size * num;
}
}
codes->fmtdef = NULL;
codes->offset = size;
codes->size = 0;
+ codes->repeat = 0;
return 0;
@@ -1460,22 +1465,26 @@ s_unpack_internal(PyStructObject *soself, char *startfrom) {
return NULL;
for (code = soself->s_codes; code->fmtdef != NULL; code++) {
- PyObject *v;
const formatdef *e = code->fmtdef;
const char *res = startfrom + code->offset;
- if (e->format == 's') {
- v = PyBytes_FromStringAndSize(res, code->size);
- } else if (e->format == 'p') {
- Py_ssize_t n = *(unsigned char*)res;
- if (n >= code->size)
- n = code->size - 1;
- v = PyBytes_FromStringAndSize(res + 1, n);
- } else {
- v = e->unpack(res, e);
+ Py_ssize_t j = code->repeat;
+ while (j--) {
+ PyObject *v;
+ if (e->format == 's') {
+ v = PyBytes_FromStringAndSize(res, code->size);
+ } else if (e->format == 'p') {
+ Py_ssize_t n = *(unsigned char*)res;
+ if (n >= code->size)
+ n = code->size - 1;
+ v = PyBytes_FromStringAndSize(res + 1, n);
+ } else {
+ v = e->unpack(res, e);
+ }
+ if (v == NULL)
+ goto fail;
+ PyTuple_SET_ITEM(result, i++, v);
+ res += code->size;
}
- if (v == NULL)
- goto fail;
- PyTuple_SET_ITEM(result, i++, v);
}
return result;
@@ -1557,6 +1566,142 @@ s_unpack_from(PyObject *self, PyObject *args, PyObject *kwds)
}
+/* Unpack iterator type */
+
+typedef struct {
+ PyObject_HEAD
+ PyStructObject *so;
+ Py_buffer buf;
+ Py_ssize_t index;
+} unpackiterobject;
+
+static void
+unpackiter_dealloc(unpackiterobject *self)
+{
+ Py_XDECREF(self->so);
+ PyBuffer_Release(&self->buf);
+ PyObject_GC_Del(self);
+}
+
+static int
+unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->so);
+ Py_VISIT(self->buf.obj);
+ return 0;
+}
+
+static PyObject *
+unpackiter_len(unpackiterobject *self)
+{
+ Py_ssize_t len;
+ if (self->so == NULL)
+ len = 0;
+ else
+ len = (self->buf.len - self->index) / self->so->s_size;
+ return PyLong_FromSsize_t(len);
+}
+
+static PyMethodDef unpackiter_methods[] = {
+ {"__length_hint__", (PyCFunction) unpackiter_len, METH_NOARGS, NULL},
+ {NULL, NULL} /* sentinel */
+};
+
+static PyObject *
+unpackiter_iternext(unpackiterobject *self)
+{
+ PyObject *result;
+ if (self->so == NULL)
+ return NULL;
+ if (self->index >= self->buf.len) {
+ /* Iterator exhausted */
+ Py_CLEAR(self->so);
+ PyBuffer_Release(&self->buf);
+ return NULL;
+ }
+ assert(self->index + self->so->s_size <= self->buf.len);
+ result = s_unpack_internal(self->so,
+ (char*) self->buf.buf + self->index);
+ self->index += self->so->s_size;
+ return result;
+}
+
+PyTypeObject unpackiter_type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "unpack_iterator", /* tp_name */
+ sizeof(unpackiterobject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)unpackiter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)unpackiter_traverse, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ PyObject_SelfIter, /* tp_iter */
+ (iternextfunc)unpackiter_iternext, /* tp_iternext */
+ unpackiter_methods /* tp_methods */
+};
+
+PyDoc_STRVAR(s_iter_unpack__doc__,
+"S.iter_unpack(buffer) -> iterator(v1, v2, ...)\n\
+\n\
+Return an iterator yielding tuples unpacked from the given bytes\n\
+source, like a repeated invocation of unpack_from(). Requires\n\
+that the bytes length be a multiple of the struct size.");
+
+static PyObject *
+s_iter_unpack(PyObject *_so, PyObject *input)
+{
+ PyStructObject *so = (PyStructObject *) _so;
+ unpackiterobject *self;
+
+ assert(PyStruct_Check(_so));
+ assert(so->s_codes != NULL);
+
+ if (so->s_size == 0) {
+ PyErr_Format(StructError,
+ "cannot iteratively unpack with a struct of length 0");
+ return NULL;
+ }
+
+ self = (unpackiterobject *) PyType_GenericAlloc(&unpackiter_type, 0);
+ if (self == NULL)
+ return NULL;
+
+ if (PyObject_GetBuffer(input, &self->buf, PyBUF_SIMPLE) < 0) {
+ Py_DECREF(self);
+ return NULL;
+ }
+ if (self->buf.len % so->s_size != 0) {
+ PyErr_Format(StructError,
+ "iterative unpacking requires a bytes length "
+ "multiple of %zd",
+ so->s_size);
+ Py_DECREF(self);
+ return NULL;
+ }
+ Py_INCREF(so);
+ self->so = so;
+ self->index = 0;
+ return (PyObject *) self;
+}
+
+
/*
* Guts of the pack function.
*
@@ -1578,62 +1723,67 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf)
memset(buf, '\0', soself->s_size);
i = offset;
for (code = soself->s_codes; code->fmtdef != NULL; code++) {
- Py_ssize_t n;
- PyObject *v = PyTuple_GET_ITEM(args, i++);
const formatdef *e = code->fmtdef;
char *res = buf + code->offset;
- if (e->format == 's') {
- int isstring;
- void *p;
- isstring = PyBytes_Check(v);
- if (!isstring && !PyByteArray_Check(v)) {
- PyErr_SetString(StructError,
- "argument for 's' must be a bytes object");
- return -1;
- }
- if (isstring) {
- n = PyBytes_GET_SIZE(v);
- p = PyBytes_AS_STRING(v);
- }
- else {
- n = PyByteArray_GET_SIZE(v);
- p = PyByteArray_AS_STRING(v);
- }
- if (n > code->size)
- n = code->size;
- if (n > 0)
- memcpy(res, p, n);
- } else if (e->format == 'p') {
- int isstring;
- void *p;
- isstring = PyBytes_Check(v);
- if (!isstring && !PyByteArray_Check(v)) {
- PyErr_SetString(StructError,
- "argument for 'p' must be a bytes object");
- return -1;
- }
- if (isstring) {
- n = PyBytes_GET_SIZE(v);
- p = PyBytes_AS_STRING(v);
- }
- else {
- n = PyByteArray_GET_SIZE(v);
- p = PyByteArray_AS_STRING(v);
- }
- if (n > (code->size - 1))
- n = code->size - 1;
- if (n > 0)
- memcpy(res + 1, p, n);
- if (n > 255)
- n = 255;
- *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
- } else {
- if (e->pack(res, v, e) < 0) {
- if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError))
+ Py_ssize_t j = code->repeat;
+ while (j--) {
+ PyObject *v = PyTuple_GET_ITEM(args, i++);
+ if (e->format == 's') {
+ Py_ssize_t n;
+ int isstring;
+ void *p;
+ isstring = PyBytes_Check(v);
+ if (!isstring && !PyByteArray_Check(v)) {
PyErr_SetString(StructError,
- "long too large to convert to int");
- return -1;
+ "argument for 's' must be a bytes object");
+ return -1;
+ }
+ if (isstring) {
+ n = PyBytes_GET_SIZE(v);
+ p = PyBytes_AS_STRING(v);
+ }
+ else {
+ n = PyByteArray_GET_SIZE(v);
+ p = PyByteArray_AS_STRING(v);
+ }
+ if (n > code->size)
+ n = code->size;
+ if (n > 0)
+ memcpy(res, p, n);
+ } else if (e->format == 'p') {
+ Py_ssize_t n;
+ int isstring;
+ void *p;
+ isstring = PyBytes_Check(v);
+ if (!isstring && !PyByteArray_Check(v)) {
+ PyErr_SetString(StructError,
+ "argument for 'p' must be a bytes object");
+ return -1;
+ }
+ if (isstring) {
+ n = PyBytes_GET_SIZE(v);
+ p = PyBytes_AS_STRING(v);
+ }
+ else {
+ n = PyByteArray_GET_SIZE(v);
+ p = PyByteArray_AS_STRING(v);
+ }
+ if (n > (code->size - 1))
+ n = code->size - 1;
+ if (n > 0)
+ memcpy(res + 1, p, n);
+ if (n > 255)
+ n = 255;
+ *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
+ } else {
+ if (e->pack(res, v, e) < 0) {
+ if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError))
+ PyErr_SetString(StructError,
+ "long too large to convert to int");
+ return -1;
+ }
}
+ res += code->size;
}
}
@@ -1769,14 +1919,18 @@ static PyObject *
s_sizeof(PyStructObject *self, void *unused)
{
Py_ssize_t size;
+ formatcode *code;
- size = sizeof(PyStructObject) + sizeof(formatcode) * (self->s_len + 1);
+ size = sizeof(PyStructObject) + sizeof(formatcode);
+ for (code = self->s_codes; code->fmtdef != NULL; code++)
+ size += sizeof(formatcode);
return PyLong_FromSsize_t(size);
}
/* List of functions */
static struct PyMethodDef s_methods[] = {
+ {"iter_unpack", s_iter_unpack, METH_O, s_iter_unpack__doc__},
{"pack", s_pack, METH_VARARGS, s_pack__doc__},
{"pack_into", s_pack_into, METH_VARARGS, s_pack_into__doc__},
{"unpack", s_unpack, METH_O, s_unpack__doc__},
@@ -2026,9 +2180,34 @@ unpack_from(PyObject *self, PyObject *args, PyObject *kwds)
return result;
}
+PyDoc_STRVAR(iter_unpack_doc,
+"iter_unpack(fmt, buffer) -> iterator(v1, v2, ...)\n\
+\n\
+Return an iterator yielding tuples unpacked from the given bytes\n\
+source according to the format string, like a repeated invocation of\n\
+unpack_from(). Requires that the bytes length be a multiple of the\n\
+format struct size.");
+
+static PyObject *
+iter_unpack(PyObject *self, PyObject *args)
+{
+ PyObject *s_object, *fmt, *input, *result;
+
+ if (!PyArg_ParseTuple(args, "OO:iter_unpack", &fmt, &input))
+ return NULL;
+
+ s_object = cache_struct(fmt);
+ if (s_object == NULL)
+ return NULL;
+ result = s_iter_unpack(s_object, input);
+ Py_DECREF(s_object);
+ return result;
+}
+
static struct PyMethodDef module_functions[] = {
{"_clearcache", (PyCFunction)clearcache, METH_NOARGS, clearcache_doc},
{"calcsize", calcsize, METH_O, calcsize_doc},
+ {"iter_unpack", iter_unpack, METH_VARARGS, iter_unpack_doc},
{"pack", pack, METH_VARARGS, pack_doc},
{"pack_into", pack_into, METH_VARARGS, pack_into_doc},
{"unpack", unpack, METH_VARARGS, unpack_doc},
@@ -2098,13 +2277,13 @@ PyInit__struct(void)
/* Check endian and swap in faster functions */
{
- int one = 1;
formatdef *native = native_table;
formatdef *other, *ptr;
- if ((int)*(unsigned char*)&one)
- other = lilendian_table;
- else
- other = bigendian_table;
+#if PY_LITTLE_ENDIAN
+ other = lilendian_table;
+#else
+ other = bigendian_table;
+#endif
/* Scan through the native table, find a matching
entry in the endian table and swap in the
native implementations whenever possible
diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c
index 316666e..a4e1643 100644
--- a/Modules/_testbuffer.c
+++ b/Modules/_testbuffer.c
@@ -2837,36 +2837,36 @@ PyInit__testbuffer(void)
if (simple_format == NULL)
return NULL;
- PyModule_AddIntConstant(m, "ND_MAX_NDIM", ND_MAX_NDIM);
- PyModule_AddIntConstant(m, "ND_VAREXPORT", ND_VAREXPORT);
- PyModule_AddIntConstant(m, "ND_WRITABLE", ND_WRITABLE);
- PyModule_AddIntConstant(m, "ND_FORTRAN", ND_FORTRAN);
- PyModule_AddIntConstant(m, "ND_SCALAR", ND_SCALAR);
- PyModule_AddIntConstant(m, "ND_PIL", ND_PIL);
- PyModule_AddIntConstant(m, "ND_GETBUF_FAIL", ND_GETBUF_FAIL);
- PyModule_AddIntConstant(m, "ND_GETBUF_UNDEFINED", ND_GETBUF_UNDEFINED);
- PyModule_AddIntConstant(m, "ND_REDIRECT", ND_REDIRECT);
-
- PyModule_AddIntConstant(m, "PyBUF_SIMPLE", PyBUF_SIMPLE);
- PyModule_AddIntConstant(m, "PyBUF_WRITABLE", PyBUF_WRITABLE);
- PyModule_AddIntConstant(m, "PyBUF_FORMAT", PyBUF_FORMAT);
- PyModule_AddIntConstant(m, "PyBUF_ND", PyBUF_ND);
- PyModule_AddIntConstant(m, "PyBUF_STRIDES", PyBUF_STRIDES);
- PyModule_AddIntConstant(m, "PyBUF_INDIRECT", PyBUF_INDIRECT);
- PyModule_AddIntConstant(m, "PyBUF_C_CONTIGUOUS", PyBUF_C_CONTIGUOUS);
- PyModule_AddIntConstant(m, "PyBUF_F_CONTIGUOUS", PyBUF_F_CONTIGUOUS);
- PyModule_AddIntConstant(m, "PyBUF_ANY_CONTIGUOUS", PyBUF_ANY_CONTIGUOUS);
- PyModule_AddIntConstant(m, "PyBUF_FULL", PyBUF_FULL);
- PyModule_AddIntConstant(m, "PyBUF_FULL_RO", PyBUF_FULL_RO);
- PyModule_AddIntConstant(m, "PyBUF_RECORDS", PyBUF_RECORDS);
- PyModule_AddIntConstant(m, "PyBUF_RECORDS_RO", PyBUF_RECORDS_RO);
- PyModule_AddIntConstant(m, "PyBUF_STRIDED", PyBUF_STRIDED);
- PyModule_AddIntConstant(m, "PyBUF_STRIDED_RO", PyBUF_STRIDED_RO);
- PyModule_AddIntConstant(m, "PyBUF_CONTIG", PyBUF_CONTIG);
- PyModule_AddIntConstant(m, "PyBUF_CONTIG_RO", PyBUF_CONTIG_RO);
-
- PyModule_AddIntConstant(m, "PyBUF_READ", PyBUF_READ);
- PyModule_AddIntConstant(m, "PyBUF_WRITE", PyBUF_WRITE);
+ PyModule_AddIntMacro(m, ND_MAX_NDIM);
+ PyModule_AddIntMacro(m, ND_VAREXPORT);
+ PyModule_AddIntMacro(m, ND_WRITABLE);
+ PyModule_AddIntMacro(m, ND_FORTRAN);
+ PyModule_AddIntMacro(m, ND_SCALAR);
+ PyModule_AddIntMacro(m, ND_PIL);
+ PyModule_AddIntMacro(m, ND_GETBUF_FAIL);
+ PyModule_AddIntMacro(m, ND_GETBUF_UNDEFINED);
+ PyModule_AddIntMacro(m, ND_REDIRECT);
+
+ PyModule_AddIntMacro(m, PyBUF_SIMPLE);
+ PyModule_AddIntMacro(m, PyBUF_WRITABLE);
+ PyModule_AddIntMacro(m, PyBUF_FORMAT);
+ PyModule_AddIntMacro(m, PyBUF_ND);
+ PyModule_AddIntMacro(m, PyBUF_STRIDES);
+ PyModule_AddIntMacro(m, PyBUF_INDIRECT);
+ PyModule_AddIntMacro(m, PyBUF_C_CONTIGUOUS);
+ PyModule_AddIntMacro(m, PyBUF_F_CONTIGUOUS);
+ PyModule_AddIntMacro(m, PyBUF_ANY_CONTIGUOUS);
+ PyModule_AddIntMacro(m, PyBUF_FULL);
+ PyModule_AddIntMacro(m, PyBUF_FULL_RO);
+ PyModule_AddIntMacro(m, PyBUF_RECORDS);
+ PyModule_AddIntMacro(m, PyBUF_RECORDS_RO);
+ PyModule_AddIntMacro(m, PyBUF_STRIDED);
+ PyModule_AddIntMacro(m, PyBUF_STRIDED_RO);
+ PyModule_AddIntMacro(m, PyBUF_CONTIG);
+ PyModule_AddIntMacro(m, PyBUF_CONTIG_RO);
+
+ PyModule_AddIntMacro(m, PyBUF_READ);
+ PyModule_AddIntMacro(m, PyBUF_WRITE);
return m;
}
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 86ef713..59d3182 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -1424,6 +1424,20 @@ test_widechar(PyObject *self)
else
return raiseTestError("test_widechar",
"PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
+
+ wide = PyUnicode_FromUnicode(NULL, 1);
+ if (wide == NULL)
+ return NULL;
+ PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
+ if (_PyUnicode_Ready(wide) < 0) {
+ Py_DECREF(wide);
+ PyErr_Clear();
+ }
+ else {
+ Py_DECREF(wide);
+ return raiseTestError("test_widechar",
+ "PyUnicode_Ready() didn't fail");
+ }
#endif
Py_RETURN_NONE;
@@ -2477,6 +2491,293 @@ test_pytime_object_to_timespec(PyObject *self, PyObject *args)
return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
}
+static void
+slot_tp_del(PyObject *self)
+{
+ _Py_IDENTIFIER(__tp_del__);
+ PyObject *del, *res;
+ PyObject *error_type, *error_value, *error_traceback;
+
+ /* Temporarily resurrect the object. */
+ assert(self->ob_refcnt == 0);
+ self->ob_refcnt = 1;
+
+ /* Save the current exception, if any. */
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+
+ /* Execute __del__ method, if any. */
+ del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
+ if (del != NULL) {
+ res = PyEval_CallObject(del, NULL);
+ if (res == NULL)
+ PyErr_WriteUnraisable(del);
+ else
+ Py_DECREF(res);
+ Py_DECREF(del);
+ }
+
+ /* Restore the saved exception. */
+ PyErr_Restore(error_type, error_value, error_traceback);
+
+ /* Undo the temporary resurrection; can't use DECREF here, it would
+ * cause a recursive call.
+ */
+ assert(self->ob_refcnt > 0);
+ if (--self->ob_refcnt == 0)
+ return; /* this is the normal path out */
+
+ /* __del__ resurrected it! Make it look like the original Py_DECREF
+ * never happened.
+ */
+ {
+ Py_ssize_t refcnt = self->ob_refcnt;
+ _Py_NewReference(self);
+ self->ob_refcnt = refcnt;
+ }
+ assert(!PyType_IS_GC(Py_TYPE(self)) ||
+ _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+ /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
+ * we need to undo that. */
+ _Py_DEC_REFTOTAL;
+ /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
+ * chain, so no more to do there.
+ * If COUNT_ALLOCS, the original decref bumped tp_frees, and
+ * _Py_NewReference bumped tp_allocs: both of those need to be
+ * undone.
+ */
+#ifdef COUNT_ALLOCS
+ --Py_TYPE(self)->tp_frees;
+ --Py_TYPE(self)->tp_allocs;
+#endif
+}
+
+static PyObject *
+with_tp_del(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ PyTypeObject *tp;
+
+ if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
+ return NULL;
+ tp = (PyTypeObject *) obj;
+ if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
+ PyErr_Format(PyExc_TypeError,
+ "heap type expected, got %R", obj);
+ return NULL;
+ }
+ tp->tp_del = slot_tp_del;
+ Py_INCREF(obj);
+ return obj;
+}
+
+static PyObject *
+_test_incref(PyObject *ob)
+{
+ Py_INCREF(ob);
+ return ob;
+}
+
+static PyObject *
+test_xincref_doesnt_leak(PyObject *ob)
+{
+ PyObject *obj = PyLong_FromLong(0);
+ Py_XINCREF(_test_incref(obj));
+ Py_DECREF(obj);
+ Py_DECREF(obj);
+ Py_DECREF(obj);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+test_incref_doesnt_leak(PyObject *ob)
+{
+ PyObject *obj = PyLong_FromLong(0);
+ Py_INCREF(_test_incref(obj));
+ Py_DECREF(obj);
+ Py_DECREF(obj);
+ Py_DECREF(obj);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+test_xdecref_doesnt_leak(PyObject *ob)
+{
+ Py_XDECREF(PyLong_FromLong(0));
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+test_decref_doesnt_leak(PyObject *ob)
+{
+ Py_DECREF(PyLong_FromLong(0));
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+test_incref_decref_API(PyObject *ob)
+{
+ PyObject *obj = PyLong_FromLong(0);
+ Py_IncRef(ob);
+ Py_DecRef(obj);
+ Py_DecRef(obj);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+test_pymem_alloc0(PyObject *self)
+{
+ void *ptr;
+
+ ptr = PyMem_Malloc(0);
+ if (ptr == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
+ return NULL;
+ }
+ PyMem_Free(ptr);
+
+ ptr = PyObject_Malloc(0);
+ if (ptr == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
+ return NULL;
+ }
+ PyObject_Free(ptr);
+
+ Py_RETURN_NONE;
+}
+
+typedef struct {
+ PyMemAllocator alloc;
+
+ size_t malloc_size;
+ void *realloc_ptr;
+ size_t realloc_new_size;
+ void *free_ptr;
+} alloc_hook_t;
+
+static void* hook_malloc (void* ctx, size_t size)
+{
+ alloc_hook_t *hook = (alloc_hook_t *)ctx;
+ hook->malloc_size = size;
+ return hook->alloc.malloc(hook->alloc.ctx, size);
+}
+
+static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
+{
+ alloc_hook_t *hook = (alloc_hook_t *)ctx;
+ hook->realloc_ptr = ptr;
+ hook->realloc_new_size = new_size;
+ return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
+}
+
+static void hook_free (void *ctx, void *ptr)
+{
+ alloc_hook_t *hook = (alloc_hook_t *)ctx;
+ hook->free_ptr = ptr;
+ hook->alloc.free(hook->alloc.ctx, ptr);
+}
+
+static PyObject *
+test_setallocators(PyMemAllocatorDomain domain)
+{
+ PyObject *res = NULL;
+ const char *error_msg;
+ alloc_hook_t hook;
+ PyMemAllocator alloc;
+ size_t size, size2;
+ void *ptr, *ptr2;
+
+ hook.malloc_size = 0;
+ hook.realloc_ptr = NULL;
+ hook.realloc_new_size = 0;
+ hook.free_ptr = NULL;
+
+ alloc.ctx = &hook;
+ alloc.malloc = &hook_malloc;
+ alloc.realloc = &hook_realloc;
+ alloc.free = &hook_free;
+ PyMem_GetAllocator(domain, &hook.alloc);
+ PyMem_SetAllocator(domain, &alloc);
+
+ size = 42;
+ switch(domain)
+ {
+ case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
+ case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
+ case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
+ default: ptr = NULL; break;
+ }
+
+ if (ptr == NULL) {
+ error_msg = "malloc failed";
+ goto fail;
+ }
+
+ if (hook.malloc_size != size) {
+ error_msg = "malloc invalid size";
+ goto fail;
+ }
+
+ size2 = 200;
+ switch(domain)
+ {
+ case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
+ case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
+ case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
+ default: ptr2 = NULL; break;
+ }
+
+ if (ptr2 == NULL) {
+ error_msg = "realloc failed";
+ goto fail;
+ }
+
+ if (hook.realloc_ptr != ptr
+ || hook.realloc_new_size != size2) {
+ error_msg = "realloc invalid parameters";
+ goto fail;
+ }
+
+ switch(domain)
+ {
+ case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
+ case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
+ case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
+ }
+
+ if (hook.free_ptr != ptr2) {
+ error_msg = "free invalid pointer";
+ goto fail;
+ }
+
+ Py_INCREF(Py_None);
+ res = Py_None;
+ goto finally;
+
+fail:
+ PyErr_SetString(PyExc_RuntimeError, error_msg);
+
+finally:
+ PyMem_SetAllocator(domain, &hook.alloc);
+ return res;
+}
+
+static PyObject *
+test_pymem_setrawallocators(PyObject *self)
+{
+ return test_setallocators(PYMEM_DOMAIN_RAW);
+}
+
+static PyObject *
+test_pymem_setallocators(PyObject *self)
+{
+ return test_setallocators(PYMEM_DOMAIN_MEM);
+}
+
+static PyObject *
+test_pyobject_setallocators(PyObject *self)
+{
+ return test_setallocators(PYMEM_DOMAIN_OBJ);
+}
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
@@ -2487,6 +2788,11 @@ static PyMethodDef TestMethods[] = {
{"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
{"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
{"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
+ {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
+ {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
+ {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
+ {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
+ {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
{"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
METH_NOARGS},
{"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
@@ -2574,6 +2880,15 @@ static PyMethodDef TestMethods[] = {
{"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
{"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
{"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
+ {"with_tp_del", with_tp_del, METH_VARARGS},
+ {"test_pymem",
+ (PyCFunction)test_pymem_alloc0, METH_NOARGS},
+ {"test_pymem_alloc0",
+ (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
+ {"test_pymem_setallocators",
+ (PyCFunction)test_pymem_setallocators, METH_NOARGS},
+ {"test_pyobject_setallocators",
+ (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
{NULL, NULL} /* sentinel */
};
diff --git a/Modules/_testimportmultiple.c b/Modules/_testimportmultiple.c
new file mode 100644
index 0000000..1caeb66
--- /dev/null
+++ b/Modules/_testimportmultiple.c
@@ -0,0 +1,57 @@
+/*
+ * C extensions module to test importing multiple modules from one compiled
+ * file (issue16421). This file defines 3 modules (_testimportmodule,
+ * foo, bar), only the first one is called the same as the compiled file.
+ */
+#include<Python.h>
+
+static struct PyModuleDef _testimportmultiple = {
+ PyModuleDef_HEAD_INIT,
+ "_testimportmultiple",
+ "_testimportmultiple doc",
+ -1,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC PyInit__testimportmultiple(void)
+{
+ return PyModule_Create(&_testimportmultiple);
+}
+
+static struct PyModuleDef _foomodule = {
+ PyModuleDef_HEAD_INIT,
+ "_testimportmultiple_foo",
+ "_testimportmultiple_foo doc",
+ -1,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC PyInit__testimportmultiple_foo(void)
+{
+ return PyModule_Create(&_foomodule);
+}
+
+static struct PyModuleDef _barmodule = {
+ PyModuleDef_HEAD_INIT,
+ "_testimportmultiple_bar",
+ "_testimportmultiple_bar doc",
+ -1,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC PyInit__testimportmultiple_bar(void){
+ return PyModule_Create(&_barmodule);
+}
+
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index d1dc61d..cbb2901 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -741,7 +741,7 @@ local_new(PyTypeObject *type, PyObject *args, PyObject *kw)
wr = PyWeakref_NewRef((PyObject *) self, NULL);
if (wr == NULL)
goto err;
- self->wr_callback = PyCFunction_New(&wr_callback_def, wr);
+ self->wr_callback = PyCFunction_NewEx(&wr_callback_def, wr, NULL);
Py_DECREF(wr);
if (self->wr_callback == NULL)
goto err;
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index cdb28e5..637a9bb 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -125,52 +125,60 @@ Copyright (C) 1994 Steen Lumholt.
/* The threading situation is complicated. Tcl is not thread-safe, except
when configured with --enable-threads.
- So we need to use a lock around all uses of Tcl. Previously, the Python
- interpreter lock was used for this. However, this causes problems when
- other Python threads need to run while Tcl is blocked waiting for events.
-
- To solve this problem, a separate lock for Tcl is introduced. Holding it
- is incompatible with holding Python's interpreter lock. The following four
- macros manipulate both locks together.
-
- ENTER_TCL and LEAVE_TCL are brackets, just like Py_BEGIN_ALLOW_THREADS and
- Py_END_ALLOW_THREADS. They should be used whenever a call into Tcl is made
- that could call an event handler, or otherwise affect the state of a Tcl
- interpreter. These assume that the surrounding code has the Python
- interpreter lock; inside the brackets, the Python interpreter lock has been
- released and the lock for Tcl has been acquired.
-
- Sometimes, it is necessary to have both the Python lock and the Tcl lock.
- (For example, when transferring data from the Tcl interpreter result to a
- Python string object.) This can be done by using different macros to close
- the ENTER_TCL block: ENTER_OVERLAP reacquires the Python lock (and restores
- the thread state) but doesn't release the Tcl lock; LEAVE_OVERLAP_TCL
- releases the Tcl lock.
+
+ So we need to use a lock around all uses of Tcl. Previously, the
+ Python interpreter lock was used for this. However, this causes
+ problems when other Python threads need to run while Tcl is blocked
+ waiting for events.
+
+ To solve this problem, a separate lock for Tcl is introduced.
+ Holding it is incompatible with holding Python's interpreter lock.
+ The following four macros manipulate both locks together.
+
+ ENTER_TCL and LEAVE_TCL are brackets, just like
+ Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS. They should be
+ used whenever a call into Tcl is made that could call an event
+ handler, or otherwise affect the state of a Tcl interpreter. These
+ assume that the surrounding code has the Python interpreter lock;
+ inside the brackets, the Python interpreter lock has been released
+ and the lock for Tcl has been acquired.
+
+ Sometimes, it is necessary to have both the Python lock and the Tcl
+ lock. (For example, when transferring data from the Tcl
+ interpreter result to a Python string object.) This can be done by
+ using different macros to close the ENTER_TCL block: ENTER_OVERLAP
+ reacquires the Python lock (and restores the thread state) but
+ doesn't release the Tcl lock; LEAVE_OVERLAP_TCL releases the Tcl
+ lock.
By contrast, ENTER_PYTHON and LEAVE_PYTHON are used in Tcl event
- handlers when the handler needs to use Python. Such event handlers are
- entered while the lock for Tcl is held; the event handler presumably needs
- to use Python. ENTER_PYTHON releases the lock for Tcl and acquires
- the Python interpreter lock, restoring the appropriate thread state, and
- LEAVE_PYTHON releases the Python interpreter lock and re-acquires the lock
- for Tcl. It is okay for ENTER_TCL/LEAVE_TCL pairs to be contained inside
- the code between ENTER_PYTHON and LEAVE_PYTHON.
-
- These locks expand to several statements and brackets; they should not be
- used in branches of if statements and the like.
-
- If Tcl is threaded, this approach won't work anymore. The Tcl interpreter is
- only valid in the thread that created it, and all Tk activity must happen in this
- thread, also. That means that the mainloop must be invoked in the thread that
- created the interpreter. Invoking commands from other threads is possible;
- _tkinter will queue an event for the interpreter thread, which will then
- execute the command and pass back the result. If the main thread is not in the
- mainloop, and invoking commands causes an exception; if the main loop is running
- but not processing events, the command invocation will block.
-
- In addition, for a threaded Tcl, a single global tcl_tstate won't be sufficient
- anymore, since multiple Tcl interpreters may simultaneously dispatch in different
- threads. So we use the Tcl TLS API.
+ handlers when the handler needs to use Python. Such event handlers
+ are entered while the lock for Tcl is held; the event handler
+ presumably needs to use Python. ENTER_PYTHON releases the lock for
+ Tcl and acquires the Python interpreter lock, restoring the
+ appropriate thread state, and LEAVE_PYTHON releases the Python
+ interpreter lock and re-acquires the lock for Tcl. It is okay for
+ ENTER_TCL/LEAVE_TCL pairs to be contained inside the code between
+ ENTER_PYTHON and LEAVE_PYTHON.
+
+ These locks expand to several statements and brackets; they should
+ not be used in branches of if statements and the like.
+
+ If Tcl is threaded, this approach won't work anymore. The Tcl
+ interpreter is only valid in the thread that created it, and all Tk
+ activity must happen in this thread, also. That means that the
+ mainloop must be invoked in the thread that created the
+ interpreter. Invoking commands from other threads is possible;
+ _tkinter will queue an event for the interpreter thread, which will
+ then execute the command and pass back the result. If the main
+ thread is not in the mainloop, and invoking commands causes an
+ exception; if the main loop is running but not processing events,
+ the command invocation will block.
+
+ In addition, for a threaded Tcl, a single global tcl_tstate won't
+ be sufficient anymore, since multiple Tcl interpreters may
+ simultaneously dispatch in different threads. So we use the Tcl TLS
+ API.
*/
@@ -179,7 +187,8 @@ static PyThread_type_lock tcl_lock = 0;
#ifdef TCL_THREADS
static Tcl_ThreadDataKey state_key;
typedef PyThreadState *ThreadSpecificData;
-#define tcl_tstate (*(PyThreadState**)Tcl_GetThreadData(&state_key, sizeof(PyThreadState*)))
+#define tcl_tstate \
+ (*(PyThreadState**)Tcl_GetThreadData(&state_key, sizeof(PyThreadState*)))
#else
static PyThreadState *tcl_tstate = NULL;
#endif
@@ -189,7 +198,8 @@ static PyThreadState *tcl_tstate = NULL;
if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate;
#define LEAVE_TCL \
- tcl_tstate = NULL; if(tcl_lock)PyThread_release_lock(tcl_lock); Py_END_ALLOW_THREADS}
+ tcl_tstate = NULL; \
+ if(tcl_lock)PyThread_release_lock(tcl_lock); Py_END_ALLOW_THREADS}
#define ENTER_OVERLAP \
Py_END_ALLOW_THREADS
@@ -199,7 +209,8 @@ static PyThreadState *tcl_tstate = NULL;
#define ENTER_PYTHON \
{ PyThreadState *tstate = tcl_tstate; tcl_tstate = NULL; \
- if(tcl_lock)PyThread_release_lock(tcl_lock); PyEval_RestoreThread((tstate)); }
+ if(tcl_lock) \
+ PyThread_release_lock(tcl_lock); PyEval_RestoreThread((tstate)); }
#define LEAVE_PYTHON \
{ PyThreadState *tstate = PyEval_SaveThread(); \
@@ -208,7 +219,8 @@ static PyThreadState *tcl_tstate = NULL;
#define CHECK_TCL_APPARTMENT \
if (((TkappObject *)self)->threaded && \
((TkappObject *)self)->thread_id != Tcl_GetCurrentThread()) { \
- PyErr_SetString(PyExc_RuntimeError, "Calling Tcl from different appartment"); \
+ PyErr_SetString(PyExc_RuntimeError, \
+ "Calling Tcl from different appartment"); \
return 0; \
}
@@ -230,7 +242,7 @@ static PyThreadState *tcl_tstate = NULL;
/**** Tkapp Object Declaration ****/
-static PyTypeObject Tkapp_Type;
+static PyObject *Tkapp_Type;
typedef struct {
PyObject_HEAD
@@ -250,7 +262,6 @@ typedef struct {
Tcl_ObjType *StringType;
} TkappObject;
-#define Tkapp_Check(v) (Py_TYPE(v) == &Tkapp_Type)
#define Tkapp_Interp(v) (((TkappObject *) (v))->interp)
#define Tkapp_Result(v) Tcl_GetStringResult(Tkapp_Interp(v))
@@ -323,115 +334,9 @@ WaitForMainloop(TkappObject* self)
#endif /* WITH_THREAD */
-static char *
-AsString(PyObject *value, PyObject *tmp)
-{
- if (PyBytes_Check(value))
- return PyBytes_AsString(value);
- else if (PyUnicode_Check(value)) {
- PyObject *v = PyUnicode_AsUTF8String(value);
- if (v == NULL)
- return NULL;
- if (PyList_Append(tmp, v) != 0) {
- Py_DECREF(v);
- return NULL;
- }
- Py_DECREF(v);
- return PyBytes_AsString(v);
- }
- else {
- PyObject *v = PyObject_Str(value);
- if (v == NULL)
- return NULL;
- if (PyList_Append(tmp, v) != 0) {
- Py_DECREF(v);
- return NULL;
- }
- Py_DECREF(v);
- return PyBytes_AsString(v);
- }
-}
-
-
#define ARGSZ 64
-static char *
-Merge(PyObject *args)
-{
- PyObject *tmp = NULL;
- char *argvStore[ARGSZ];
- char **argv = NULL;
- int fvStore[ARGSZ];
- int *fv = NULL;
- int argc = 0, fvc = 0, i;
- char *res = NULL;
-
- if (!(tmp = PyList_New(0)))
- return NULL;
-
- argv = argvStore;
- fv = fvStore;
-
- if (args == NULL)
- argc = 0;
-
- else if (!PyTuple_Check(args)) {
- argc = 1;
- fv[0] = 0;
- if (!(argv[0] = AsString(args, tmp)))
- goto finally;
- }
- else {
- argc = PyTuple_Size(args);
-
- if (argc > ARGSZ) {
- argv = (char **)ckalloc(argc * sizeof(char *));
- fv = (int *)ckalloc(argc * sizeof(int));
- if (argv == NULL || fv == NULL) {
- PyErr_NoMemory();
- goto finally;
- }
- }
-
- for (i = 0; i < argc; i++) {
- PyObject *v = PyTuple_GetItem(args, i);
- if (PyTuple_Check(v)) {
- fv[i] = 1;
- if (!(argv[i] = Merge(v)))
- goto finally;
- fvc++;
- }
- else if (v == Py_None) {
- argc = i;
- break;
- }
- else {
- fv[i] = 0;
- if (!(argv[i] = AsString(v, tmp)))
- goto finally;
- fvc++;
- }
- }
- }
- res = Tcl_Merge(argc, argv);
- if (res == NULL)
- PyErr_SetString(Tkinter_TclError, "merge failed");
-
- finally:
- for (i = 0; i < fvc; i++)
- if (fv[i]) {
- ckfree(argv[i]);
- }
- if (argv != argvStore)
- ckfree(FREECAST argv);
- if (fv != fvStore)
- ckfree(FREECAST fv);
-
- Py_DECREF(tmp);
- return res;
-}
-
static PyObject *
@@ -442,8 +347,7 @@ Split(char *list)
PyObject *v;
if (list == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
@@ -475,9 +379,9 @@ Split(char *list)
return v;
}
-/* In some cases, Tcl will still return strings that are supposed to be
- lists. SplitObj walks through a nested tuple, finding string objects that
- need to be split. */
+/* In some cases, Tcl will still return strings that are supposed to
+ be lists. SplitObj walks through a nested tuple, finding string
+ objects that need to be split. */
static PyObject *
SplitObj(PyObject *arg)
@@ -609,9 +513,10 @@ Tkapp_New(char *screenName, char *className,
TkappObject *v;
char *argv0;
- v = PyObject_New(TkappObject, &Tkapp_Type);
+ v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type);
if (v == NULL)
return NULL;
+ Py_INCREF(Tkapp_Type);
v->interp = Tcl_CreateInterp();
v->wantobjects = wantobjects;
@@ -622,7 +527,8 @@ Tkapp_New(char *screenName, char *className,
#ifndef TCL_THREADS
if (v->threaded) {
- PyErr_SetString(PyExc_RuntimeError, "Tcl is threaded but _tkinter is not");
+ PyErr_SetString(PyExc_RuntimeError,
+ "Tcl is threaded but _tkinter is not");
Py_DECREF(v);
return 0;
}
@@ -759,16 +665,17 @@ typedef struct {
PyObject *string; /* This cannot cause cycles. */
} PyTclObject;
-static PyTypeObject PyTclObject_Type;
-#define PyTclObject_Check(v) ((v)->ob_type == &PyTclObject_Type)
+static PyObject *PyTclObject_Type;
+#define PyTclObject_Check(v) ((v)->ob_type == (PyTypeObject *) PyTclObject_Type)
static PyObject *
newPyTclObject(Tcl_Obj *arg)
{
PyTclObject *self;
- self = PyObject_New(PyTclObject, &PyTclObject_Type);
+ self = PyObject_New(PyTclObject, (PyTypeObject *) PyTclObject_Type);
if (self == NULL)
return NULL;
+ Py_INCREF(PyTclObject_Type);
Tcl_IncrRefCount(arg);
self->value = arg;
self->string = NULL;
@@ -778,9 +685,11 @@ newPyTclObject(Tcl_Obj *arg)
static void
PyTclObject_dealloc(PyTclObject *self)
{
+ PyObject *tp = (PyObject *) Py_TYPE(self);
Tcl_DecrRefCount(self->value);
Py_XDECREF(self->string);
PyObject_Del(self);
+ Py_DECREF(tp);
}
static char*
@@ -900,50 +809,25 @@ static PyGetSetDef PyTclObject_getsetlist[] = {
{0},
};
-static PyTypeObject PyTclObject_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_tkinter.Tcl_Obj", /*tp_name*/
- sizeof(PyTclObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)PyTclObject_dealloc,/*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- (reprfunc)PyTclObject_repr, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- (reprfunc)PyTclObject_str, /*tp_str*/
- PyObject_GenericGetAttr, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- PyTclObject_richcompare, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- 0, /*tp_methods*/
- 0, /*tp_members*/
- PyTclObject_getsetlist, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- 0, /*tp_init*/
- 0, /*tp_alloc*/
- 0, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
+static PyType_Slot PyTclObject_Type_slots[] = {
+ {Py_tp_dealloc, (destructor)PyTclObject_dealloc},
+ {Py_tp_repr, (reprfunc)PyTclObject_repr},
+ {Py_tp_str, (reprfunc)PyTclObject_str},
+ {Py_tp_getattro, PyObject_GenericGetAttr},
+ {Py_tp_richcompare, PyTclObject_richcompare},
+ {Py_tp_getset, PyTclObject_getsetlist},
+ {0, 0}
+};
+
+static PyType_Spec PyTclObject_Type_spec = {
+ "_tkinter.Tcl_Obj",
+ sizeof(PyTclObject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+ PyTclObject_Type_slots,
};
+
static Tcl_Obj*
AsObj(PyObject *value)
{
@@ -1347,42 +1231,6 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
static PyObject *
-Tkapp_GlobalCall(PyObject *self, PyObject *args)
-{
- /* Could do the same here as for Tkapp_Call(), but this is not used
- much, so I can't be bothered. Unfortunately Tcl doesn't export a
- way for the user to do what all its Global* variants do (save and
- reset the scope pointer, call the local version, restore the saved
- scope pointer). */
-
- char *cmd;
- PyObject *res = NULL;
-
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "globalcall is deprecated and will be removed in 3.4",
- 1) < 0)
- return 0;
-
- CHECK_TCL_APPARTMENT;
-
- cmd = Merge(args);
- if (cmd) {
- int err;
- ENTER_TCL
- err = Tcl_GlobalEval(Tkapp_Interp(self), cmd);
- ENTER_OVERLAP
- if (err == TCL_ERROR)
- res = Tkinter_Error(self);
- else
- res = PyUnicode_FromString(Tkapp_Result(self));
- LEAVE_OVERLAP_TCL
- ckfree(cmd);
- }
-
- return res;
-}
-
-static PyObject *
Tkapp_Eval(PyObject *self, PyObject *args)
{
char *script;
@@ -1406,34 +1254,6 @@ Tkapp_Eval(PyObject *self, PyObject *args)
}
static PyObject *
-Tkapp_GlobalEval(PyObject *self, PyObject *args)
-{
- char *script;
- PyObject *res = NULL;
- int err;
-
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "globaleval is deprecated and will be removed in 3.4",
- 1) < 0)
- return 0;
-
- if (!PyArg_ParseTuple(args, "s:globaleval", &script))
- return NULL;
-
- CHECK_TCL_APPARTMENT;
-
- ENTER_TCL
- err = Tcl_GlobalEval(Tkapp_Interp(self), script);
- ENTER_OVERLAP
- if (err == TCL_ERROR)
- res = Tkinter_Error(self);
- else
- res = PyUnicode_FromString(Tkapp_Result(self));
- LEAVE_OVERLAP_TCL
- return res;
-}
-
-static PyObject *
Tkapp_EvalFile(PyObject *self, PyObject *args)
{
char *fileName;
@@ -1493,8 +1313,7 @@ Tkapp_AddErrorInfo(PyObject *self, PyObject *args)
Tcl_AddErrorInfo(Tkapp_Interp(self), msg);
LEAVE_TCL
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
@@ -1692,7 +1511,8 @@ GetVar(PyObject *self, PyObject *args, int flags)
tres = Tcl_GetVar2Ex(Tkapp_Interp(self), name1, name2, flags);
ENTER_OVERLAP
if (tres == NULL) {
- PyErr_SetString(Tkinter_TclError, Tcl_GetStringResult(Tkapp_Interp(self)));
+ PyErr_SetString(Tkinter_TclError,
+ Tcl_GetStringResult(Tkapp_Interp(self)));
} else {
if (((TkappObject*)self)->wantobjects) {
res = FromObj(self, tres);
@@ -1751,7 +1571,8 @@ Tkapp_UnsetVar(PyObject *self, PyObject *args)
static PyObject *
Tkapp_GlobalUnsetVar(PyObject *self, PyObject *args)
{
- return var_invoke(UnsetVar, self, args, TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
+ return var_invoke(UnsetVar, self, args,
+ TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY);
}
@@ -1976,27 +1797,6 @@ Tkapp_Split(PyObject *self, PyObject *args)
return v;
}
-static PyObject *
-Tkapp_Merge(PyObject *self, PyObject *args)
-{
- char *s;
- PyObject *res = NULL;
-
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "merge is deprecated and will be removed in 3.4",
- 1) < 0)
- return 0;
-
- s = Merge(args);
-
- if (s) {
- res = PyUnicode_FromString(s);
- ckfree(s);
- }
-
- return res;
-}
-
/** Tcl Command **/
@@ -2182,8 +1982,7 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args)
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
@@ -2224,8 +2023,7 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args)
PyErr_SetString(Tkinter_TclError, "can't delete Tcl command");
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
@@ -2329,8 +2127,7 @@ Tkapp_CreateFileHandler(PyObject *self, PyObject *args)
ENTER_TCL
Tcl_CreateFileHandler(tfile, mask, FileHandler, (ClientData) data);
LEAVE_TCL
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *
@@ -2354,15 +2151,14 @@ Tkapp_DeleteFileHandler(PyObject *self, PyObject *args)
ENTER_TCL
Tcl_DeleteFileHandler(tfile);
LEAVE_TCL
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
#endif /* HAVE_CREATEFILEHANDLER */
/**** Tktt Object (timer token) ****/
-static PyTypeObject Tktt_Type;
+static PyObject *Tktt_Type;
typedef struct {
PyObject_HEAD
@@ -2387,8 +2183,7 @@ Tktt_DeleteTimerHandler(PyObject *self, PyObject *args)
Py_DECREF(func);
Py_DECREF(v); /* See Tktt_New() */
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyMethodDef Tktt_methods[] =
@@ -2402,9 +2197,10 @@ Tktt_New(PyObject *func)
{
TkttObject *v;
- v = PyObject_New(TkttObject, &Tktt_Type);
+ v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type);
if (v == NULL)
return NULL;
+ Py_INCREF(Tktt_Type);
Py_INCREF(func);
v->token = NULL;
@@ -2420,10 +2216,12 @@ Tktt_Dealloc(PyObject *self)
{
TkttObject *v = (TkttObject *)self;
PyObject *func = v->func;
+ PyObject *tp = (PyObject *) Py_TYPE(self);
Py_XDECREF(func);
PyObject_Del(self);
+ Py_DECREF(tp);
}
static PyObject *
@@ -2435,38 +2233,20 @@ Tktt_Repr(PyObject *self)
v->func == NULL ? ", handler deleted" : "");
}
-static PyTypeObject Tktt_Type =
-{
- PyVarObject_HEAD_INIT(NULL, 0)
- "tktimertoken", /*tp_name */
- sizeof(TkttObject), /*tp_basicsize */
- 0, /*tp_itemsize */
- Tktt_Dealloc, /*tp_dealloc */
- 0, /*tp_print */
- 0, /*tp_getattr */
- 0, /*tp_setattr */
- 0, /*tp_reserved */
- Tktt_Repr, /*tp_repr */
- 0, /*tp_as_number */
- 0, /*tp_as_sequence */
- 0, /*tp_as_mapping */
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- Tktt_methods, /*tp_methods*/
+static PyType_Slot Tktt_Type_slots[] = {
+ {Py_tp_dealloc, Tktt_Dealloc},
+ {Py_tp_repr, Tktt_Repr},
+ {Py_tp_methods, Tktt_methods},
+ {0, 0}
};
+static PyType_Spec Tktt_Type_spec = {
+ "tktimertoken",
+ sizeof(TkttObject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+ Tktt_Type_slots,
+};
/** Timer Handler **/
@@ -2588,8 +2368,7 @@ Tkapp_MainLoop(PyObject *selfptr, PyObject *args)
excInCmd = valInCmd = trbInCmd = NULL;
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *
@@ -2615,8 +2394,7 @@ Tkapp_Quit(PyObject *self, PyObject *args)
return NULL;
quitMainLoop = 1;
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *
@@ -2666,15 +2444,15 @@ Tkapp_TkInit(PyObject *self, PyObject *args)
}
if (_tk_exists == NULL || strcmp(_tk_exists, "1") != 0) {
if (Tk_Init(interp) == TCL_ERROR) {
- PyErr_SetString(Tkinter_TclError, Tcl_GetStringResult(Tkapp_Interp(self)));
+ PyErr_SetString(Tkinter_TclError,
+ Tcl_GetStringResult(Tkapp_Interp(self)));
#ifdef TKINTER_PROTECT_LOADTK
tk_load_failed = 1;
#endif
return NULL;
}
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *
@@ -2688,8 +2466,7 @@ Tkapp_WantObjects(PyObject *self, PyObject *args)
return PyBool_FromLong(((TkappObject*)self)->wantobjects);
((TkappObject*)self)->wantobjects = wantobjects;
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *
@@ -2698,8 +2475,7 @@ Tkapp_WillDispatch(PyObject *self, PyObject *args)
((TkappObject*)self)->dispatching = 1;
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
@@ -2710,9 +2486,7 @@ static PyMethodDef Tkapp_methods[] =
{"willdispatch", Tkapp_WillDispatch, METH_NOARGS},
{"wantobjects", Tkapp_WantObjects, METH_VARARGS},
{"call", Tkapp_Call, METH_VARARGS},
- {"globalcall", Tkapp_GlobalCall, METH_VARARGS},
{"eval", Tkapp_Eval, METH_VARARGS},
- {"globaleval", Tkapp_GlobalEval, METH_VARARGS},
{"evalfile", Tkapp_EvalFile, METH_VARARGS},
{"record", Tkapp_Record, METH_VARARGS},
{"adderrorinfo", Tkapp_AddErrorInfo, METH_VARARGS},
@@ -2731,7 +2505,6 @@ static PyMethodDef Tkapp_methods[] =
{"exprboolean", Tkapp_ExprBoolean, METH_VARARGS},
{"splitlist", Tkapp_SplitList, METH_VARARGS},
{"split", Tkapp_Split, METH_VARARGS},
- {"merge", Tkapp_Merge, METH_VARARGS},
{"createcommand", Tkapp_CreateCommand, METH_VARARGS},
{"deletecommand", Tkapp_DeleteCommand, METH_VARARGS},
#ifdef HAVE_CREATEFILEHANDLER
@@ -2754,44 +2527,29 @@ static PyMethodDef Tkapp_methods[] =
static void
Tkapp_Dealloc(PyObject *self)
{
+ PyObject *tp = (PyObject *) Py_TYPE(self);
/*CHECK_TCL_APPARTMENT;*/
ENTER_TCL
Tcl_DeleteInterp(Tkapp_Interp(self));
LEAVE_TCL
PyObject_Del(self);
+ Py_DECREF(tp);
DisableEventHook();
}
-static PyTypeObject Tkapp_Type =
-{
- PyVarObject_HEAD_INIT(NULL, 0)
- "tkapp", /*tp_name */
- sizeof(TkappObject), /*tp_basicsize */
- 0, /*tp_itemsize */
- Tkapp_Dealloc, /*tp_dealloc */
- 0, /*tp_print */
- 0, /*tp_getattr */
- 0, /*tp_setattr */
- 0, /*tp_reserved */
- 0, /*tp_repr */
- 0, /*tp_as_number */
- 0, /*tp_as_sequence */
- 0, /*tp_as_mapping */
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- Tkapp_methods, /*tp_methods*/
+static PyType_Slot Tkapp_Type_slots[] = {
+ {Py_tp_dealloc, Tkapp_Dealloc},
+ {Py_tp_methods, Tkapp_methods},
+ {0, 0}
+};
+
+
+static PyType_Spec Tkapp_Type_spec = {
+ "tkapp",
+ sizeof(TkappObject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+ Tkapp_Type_slots,
};
@@ -2931,7 +2689,7 @@ Tkinter_Create(PyObject *self, PyObject *args)
return NULL;
return (PyObject *) Tkapp_New(screenName, className,
- interactive, wantobjects, wantTk,
+ interactive, wantobjects, wantTk,
sync, use);
}
@@ -2947,8 +2705,7 @@ Tkinter_setbusywaitinterval(PyObject *self, PyObject *args)
return NULL;
}
Tkinter_busywaitinterval = new_val;
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char setbusywaitinterval_doc[] =
@@ -3081,27 +2838,6 @@ DisableEventHook(void)
}
-/* all errors will be checked in one fell swoop in init_tkinter() */
-static void
-ins_long(PyObject *d, char *name, long val)
-{
- PyObject *v = PyLong_FromLong(val);
- if (v) {
- PyDict_SetItemString(d, name, v);
- Py_DECREF(v);
- }
-}
-static void
-ins_string(PyObject *d, char *name, char *val)
-{
- PyObject *v = PyUnicode_FromString(val);
- if (v) {
- PyDict_SetItemString(d, name, v);
- Py_DECREF(v);
- }
-}
-
-
static struct PyModuleDef _tkintermodule = {
PyModuleDef_HEAD_INIT,
"_tkinter",
@@ -3117,45 +2853,111 @@ static struct PyModuleDef _tkintermodule = {
PyMODINIT_FUNC
PyInit__tkinter(void)
{
- PyObject *m, *d, *uexe, *cexe;
-
- if (PyType_Ready(&Tkapp_Type) < 0)
- return NULL;
+ PyObject *m, *uexe, *cexe, *o;
#ifdef WITH_THREAD
tcl_lock = PyThread_allocate_lock();
+ if (tcl_lock == NULL)
+ return NULL;
#endif
m = PyModule_Create(&_tkintermodule);
if (m == NULL)
return NULL;
- d = PyModule_GetDict(m);
- Tkinter_TclError = PyErr_NewException("_tkinter.TclError", NULL, NULL);
- PyDict_SetItemString(d, "TclError", Tkinter_TclError);
+ o = PyErr_NewException("_tkinter.TclError", NULL, NULL);
+ if (o == NULL) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ Py_INCREF(o);
+ if (PyModule_AddObject(m, "TclError", o)) {
+ Py_DECREF(o);
+ Py_DECREF(m);
+ return NULL;
+ }
+ Tkinter_TclError = o;
- ins_long(d, "READABLE", TCL_READABLE);
- ins_long(d, "WRITABLE", TCL_WRITABLE);
- ins_long(d, "EXCEPTION", TCL_EXCEPTION);
- ins_long(d, "WINDOW_EVENTS", TCL_WINDOW_EVENTS);
- ins_long(d, "FILE_EVENTS", TCL_FILE_EVENTS);
- ins_long(d, "TIMER_EVENTS", TCL_TIMER_EVENTS);
- ins_long(d, "IDLE_EVENTS", TCL_IDLE_EVENTS);
- ins_long(d, "ALL_EVENTS", TCL_ALL_EVENTS);
- ins_long(d, "DONT_WAIT", TCL_DONT_WAIT);
- ins_string(d, "TK_VERSION", TK_VERSION);
- ins_string(d, "TCL_VERSION", TCL_VERSION);
+ if (PyModule_AddIntConstant(m, "READABLE", TCL_READABLE)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "WRITABLE", TCL_WRITABLE)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "EXCEPTION", TCL_EXCEPTION)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "WINDOW_EVENTS", TCL_WINDOW_EVENTS)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "FILE_EVENTS", TCL_FILE_EVENTS)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "TIMER_EVENTS", TCL_TIMER_EVENTS)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "IDLE_EVENTS", TCL_IDLE_EVENTS)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "ALL_EVENTS", TCL_ALL_EVENTS)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddIntConstant(m, "DONT_WAIT", TCL_DONT_WAIT)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddStringConstant(m, "TK_VERSION", TK_VERSION)) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddStringConstant(m, "TCL_VERSION", TCL_VERSION)) {
+ Py_DECREF(m);
+ return NULL;
+ }
- PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type);
+ o = PyType_FromSpec(&Tkapp_Type_spec);
+ if (o == NULL) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddObject(m, "TkappType", o)) {
+ Py_DECREF(o);
+ Py_DECREF(m);
+ return NULL;
+ }
+ Tkapp_Type = o;
- if (PyType_Ready(&Tktt_Type) < 0) {
+ o = PyType_FromSpec(&Tktt_Type_spec);
+ if (o == NULL) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddObject(m, "TkttType", o)) {
+ Py_DECREF(o);
Py_DECREF(m);
return NULL;
}
- PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type);
+ Tktt_Type = o;
- Py_TYPE(&PyTclObject_Type) = &PyType_Type;
- PyDict_SetItemString(d, "Tcl_Obj", (PyObject *)&PyTclObject_Type);
+ o = PyType_FromSpec(&PyTclObject_Type_spec);
+ if (o == NULL) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ if (PyModule_AddObject(m, "Tcl_Obj", o)) {
+ Py_DECREF(o);
+ Py_DECREF(m);
+ return NULL;
+ }
+ PyTclObject_Type = o;
#ifdef TK_AQUA
/* Tk_MacOSXSetupTkNotifier must be called before Tcl's subsystems
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index c53d55a..20d0063 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -62,6 +62,8 @@
#define T_HANDLE T_POINTER
+#define DWORD_MAX 4294967295U
+
/* Grab CancelIoEx dynamically from kernel32 */
static int has_CancelIoEx = -1;
static BOOL (CALLBACK *Py_CancelIoEx)(HANDLE, LPOVERLAPPED);
@@ -1142,7 +1144,7 @@ winapi_WriteFile(PyObject *self, PyObject *args, PyObject *kwds)
HANDLE handle;
Py_buffer _buf, *buf;
PyObject *bufobj;
- DWORD written;
+ DWORD len, written;
BOOL ret;
int use_overlapped = 0;
DWORD err;
@@ -1170,7 +1172,8 @@ winapi_WriteFile(PyObject *self, PyObject *args, PyObject *kwds)
}
Py_BEGIN_ALLOW_THREADS
- ret = WriteFile(handle, buf->buf, buf->len, &written,
+ len = (DWORD)Py_MIN(buf->len, DWORD_MAX);
+ ret = WriteFile(handle, buf->buf, len, &written,
overlapped ? &overlapped->overlapped : NULL);
Py_END_ALLOW_THREADS
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 96c9e5b..75b31f5 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -513,7 +513,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
static PyObject *
getarrayitem(PyObject *op, Py_ssize_t i)
{
- register arrayobject *ap;
+ arrayobject *ap;
assert(array_Check(op));
ap = (arrayobject *)op;
assert(i>=0 && i<Py_SIZE(ap));
@@ -968,8 +968,13 @@ array_count(arrayobject *self, PyObject *v)
Py_ssize_t i;
for (i = 0; i < Py_SIZE(self); i++) {
- PyObject *selfi = getarrayitem((PyObject *)self, i);
- int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
+ PyObject *selfi;
+ int cmp;
+
+ selfi = getarrayitem((PyObject *)self, i);
+ if (selfi == NULL)
+ return NULL;
+ cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Py_DECREF(selfi);
if (cmp > 0)
count++;
@@ -990,8 +995,13 @@ array_index(arrayobject *self, PyObject *v)
Py_ssize_t i;
for (i = 0; i < Py_SIZE(self); i++) {
- PyObject *selfi = getarrayitem((PyObject *)self, i);
- int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
+ PyObject *selfi;
+ int cmp;
+
+ selfi = getarrayitem((PyObject *)self, i);
+ if (selfi == NULL)
+ return NULL;
+ cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Py_DECREF(selfi);
if (cmp > 0) {
return PyLong_FromLong((long)i);
@@ -1016,6 +1026,8 @@ array_contains(arrayobject *self, PyObject *v)
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
PyObject *selfi = getarrayitem((PyObject *)self, i);
+ if (selfi == NULL)
+ return -1;
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Py_DECREF(selfi);
}
@@ -1028,8 +1040,13 @@ array_remove(arrayobject *self, PyObject *v)
int i;
for (i = 0; i < Py_SIZE(self); i++) {
- PyObject *selfi = getarrayitem((PyObject *)self,i);
- int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
+ PyObject *selfi;
+ int cmp;
+
+ selfi = getarrayitem((PyObject *)self,i);
+ if (selfi == NULL)
+ return NULL;
+ cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Py_DECREF(selfi);
if (cmp > 0) {
if (array_ass_slice(self, i, i+1,
@@ -1068,7 +1085,9 @@ array_pop(arrayobject *self, PyObject *args)
PyErr_SetString(PyExc_IndexError, "pop index out of range");
return NULL;
}
- v = getarrayitem((PyObject *)self,i);
+ v = getarrayitem((PyObject *)self, i);
+ if (v == NULL)
+ return NULL;
if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
Py_DECREF(v);
return NULL;
@@ -1206,8 +1225,8 @@ Byteswap all items of the array. If the items in the array are not 1, 2,\n\
static PyObject *
array_reverse(arrayobject *self, PyObject *unused)
{
- register Py_ssize_t itemsize = self->ob_descr->itemsize;
- register char *p, *q;
+ Py_ssize_t itemsize = self->ob_descr->itemsize;
+ char *p, *q;
/* little buffer to hold items while swapping */
char tmp[256]; /* 8 is probably enough -- but why skimp */
assert((size_t)itemsize <= sizeof(tmp));
@@ -1386,13 +1405,16 @@ array_tolist(arrayobject *self, PyObject *unused)
return NULL;
for (i = 0; i < Py_SIZE(self); i++) {
PyObject *v = getarrayitem((PyObject *)self, i);
- if (v == NULL) {
- Py_DECREF(list);
- return NULL;
- }
- PyList_SetItem(list, i, v);
+ if (v == NULL)
+ goto error;
+ if (PyList_SetItem(list, i, v) < 0)
+ goto error;
}
return list;
+
+error:
+ Py_DECREF(list);
+ return NULL;
}
PyDoc_STRVAR(tolist_doc,
@@ -1664,11 +1686,8 @@ static const struct mformatdescr {
static enum machine_format_code
typecode_to_mformat_code(char typecode)
{
-#ifdef WORDS_BIGENDIAN
- const int is_big_endian = 1;
-#else
- const int is_big_endian = 0;
-#endif
+ const int is_big_endian = PY_BIG_ENDIAN;
+
size_t intsize;
int is_signed;
diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c
index f68d804..9887014 100644
--- a/Modules/atexitmodule.c
+++ b/Modules/atexitmodule.c
@@ -10,8 +10,6 @@
/* Forward declaration (for atexit_cleanup) */
static PyObject *atexit_clear(PyObject*, PyObject*);
-/* Forward declaration (for atexit_callfuncs) */
-static void atexit_cleanup(PyObject*);
/* Forward declaration of module object */
static struct PyModuleDef atexitmodule;
@@ -33,6 +31,35 @@ typedef struct {
#define GET_ATEXIT_STATE(mod) ((atexitmodule_state*)PyModule_GetState(mod))
+static void
+atexit_delete_cb(atexitmodule_state *modstate, int i)
+{
+ atexit_callback *cb;
+
+ cb = modstate->atexit_callbacks[i];
+ modstate->atexit_callbacks[i] = NULL;
+ Py_DECREF(cb->func);
+ Py_DECREF(cb->args);
+ Py_XDECREF(cb->kwargs);
+ PyMem_Free(cb);
+}
+
+/* Clear all callbacks without calling them */
+static void
+atexit_cleanup(atexitmodule_state *modstate)
+{
+ atexit_callback *cb;
+ int i;
+ for (i = 0; i < modstate->ncallbacks; i++) {
+ cb = modstate->atexit_callbacks[i];
+ if (cb == NULL)
+ continue;
+
+ atexit_delete_cb(modstate, i);
+ }
+ modstate->ncallbacks = 0;
+}
+
/* Installed into pythonrun.c's atexit mechanism */
static void
@@ -78,34 +105,12 @@ atexit_callfuncs(void)
}
}
- atexit_cleanup(module);
+ atexit_cleanup(modstate);
if (exc_type)
PyErr_Restore(exc_type, exc_value, exc_tb);
}
-static void
-atexit_delete_cb(PyObject *self, int i)
-{
- atexitmodule_state *modstate;
- atexit_callback *cb;
-
- modstate = GET_ATEXIT_STATE(self);
- cb = modstate->atexit_callbacks[i];
- modstate->atexit_callbacks[i] = NULL;
- Py_DECREF(cb->func);
- Py_DECREF(cb->args);
- Py_XDECREF(cb->kwargs);
- PyMem_Free(cb);
-}
-
-static void
-atexit_cleanup(PyObject *self)
-{
- PyObject *r = atexit_clear(self, NULL);
- Py_DECREF(r);
-}
-
/* ===================================================================== */
/* Module methods. */
@@ -194,21 +199,50 @@ Clear the list of previously registered exit functions.");
static PyObject *
atexit_clear(PyObject *self, PyObject *unused)
{
+ atexit_cleanup(GET_ATEXIT_STATE(self));
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(atexit_ncallbacks__doc__,
+"_ncallbacks() -> int\n\
+\n\
+Return the number of registered exit functions.");
+
+static PyObject *
+atexit_ncallbacks(PyObject *self, PyObject *unused)
+{
atexitmodule_state *modstate;
- atexit_callback *cb;
- int i;
modstate = GET_ATEXIT_STATE(self);
+ return PyLong_FromSsize_t(modstate->ncallbacks);
+}
+
+static int
+atexit_m_traverse(PyObject *self, visitproc visit, void *arg)
+{
+ int i;
+ atexitmodule_state *modstate;
+
+ modstate = GET_ATEXIT_STATE(self);
for (i = 0; i < modstate->ncallbacks; i++) {
- cb = modstate->atexit_callbacks[i];
+ atexit_callback *cb = modstate->atexit_callbacks[i];
if (cb == NULL)
continue;
-
- atexit_delete_cb(self, i);
+ Py_VISIT(cb->func);
+ Py_VISIT(cb->args);
+ Py_VISIT(cb->kwargs);
}
- modstate->ncallbacks = 0;
- Py_RETURN_NONE;
+ return 0;
+}
+
+static int
+atexit_m_clear(PyObject *self)
+{
+ atexitmodule_state *modstate;
+ modstate = GET_ATEXIT_STATE(self);
+ atexit_cleanup(modstate);
+ return 0;
}
static void
@@ -216,6 +250,7 @@ atexit_free(PyObject *m)
{
atexitmodule_state *modstate;
modstate = GET_ATEXIT_STATE(m);
+ atexit_cleanup(modstate);
PyMem_Free(modstate->atexit_callbacks);
}
@@ -246,7 +281,7 @@ atexit_unregister(PyObject *self, PyObject *func)
if (eq < 0)
return NULL;
if (eq)
- atexit_delete_cb(self, i);
+ atexit_delete_cb(modstate, i);
}
Py_RETURN_NONE;
}
@@ -260,6 +295,8 @@ static PyMethodDef atexit_methods[] = {
atexit_unregister__doc__},
{"_run_exitfuncs", (PyCFunction) atexit_run_exitfuncs, METH_NOARGS,
atexit_run_exitfuncs__doc__},
+ {"_ncallbacks", (PyCFunction) atexit_ncallbacks, METH_NOARGS,
+ atexit_ncallbacks__doc__},
{NULL, NULL} /* sentinel */
};
@@ -275,15 +312,15 @@ Two public functions, register and unregister, are defined.\n\
static struct PyModuleDef atexitmodule = {
- PyModuleDef_HEAD_INIT,
- "atexit",
- atexit__doc__,
- sizeof(atexitmodule_state),
- atexit_methods,
- NULL,
- NULL,
- NULL,
- (freefunc)atexit_free
+ PyModuleDef_HEAD_INIT,
+ "atexit",
+ atexit__doc__,
+ sizeof(atexitmodule_state),
+ atexit_methods,
+ NULL,
+ atexit_m_traverse,
+ atexit_m_clear,
+ (freefunc)atexit_free
};
PyMODINIT_FUNC
diff --git a/Modules/audioop.c b/Modules/audioop.c
index 7e40bbd..7175cec 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -37,7 +37,7 @@ fbound(double val, double minval, double maxval)
val = maxval;
else if (val < minval + 1)
val = minval;
- return val;
+ return (int)val;
}
@@ -1137,8 +1137,8 @@ audioop_ratecv(PyObject *self, PyObject *args)
"not enough memory for output buffer");
return 0;
}
- prev_i = (int *) malloc(nchannels * sizeof(int));
- cur_i = (int *) malloc(nchannels * sizeof(int));
+ prev_i = (int *) PyMem_Malloc(nchannels * sizeof(int));
+ cur_i = (int *) PyMem_Malloc(nchannels * sizeof(int));
if (prev_i == NULL || cur_i == NULL) {
(void) PyErr_NoMemory();
goto exit;
@@ -1257,10 +1257,8 @@ audioop_ratecv(PyObject *self, PyObject *args)
}
}
exit:
- if (prev_i != NULL)
- free(prev_i);
- if (cur_i != NULL)
- free(cur_i);
+ PyMem_Free(prev_i);
+ PyMem_Free(cur_i);
return rv;
}
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 340ec9c..386c2de 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -361,8 +361,7 @@ binascii_b2a_uu(PyObject *self, PyObject *args)
if (_PyBytes_Resize(&rv,
(ascii_data -
(unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
PyBuffer_Release(&pbin);
return rv;
@@ -491,8 +490,7 @@ binascii_a2b_base64(PyObject *self, PyObject *args)
*/
if (bin_len > 0) {
if (_PyBytes_Resize(&rv, bin_len) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
}
else {
@@ -563,8 +561,7 @@ binascii_b2a_base64(PyObject *self, PyObject *args)
if (_PyBytes_Resize(&rv,
(ascii_data -
(unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
PyBuffer_Release(&pbuf);
return rv;
@@ -642,8 +639,7 @@ binascii_a2b_hqx(PyObject *self, PyObject *args)
if (_PyBytes_Resize(&rv,
(bin_data -
(unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
if (rv) {
PyObject *rrv = Py_BuildValue("Oi", rv, done);
@@ -713,8 +709,7 @@ binascii_rlecode_hqx(PyObject *self, PyObject *args)
if (_PyBytes_Resize(&rv,
(out_data -
(unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
PyBuffer_Release(&pbuf);
return rv;
@@ -770,8 +765,7 @@ binascii_b2a_hqx(PyObject *self, PyObject *args)
if (_PyBytes_Resize(&rv,
(ascii_data -
(unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
PyBuffer_Release(&pbin);
return rv;
@@ -834,7 +828,7 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args)
if ( --out_len_left < 0 ) { \
if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \
if (_PyBytes_Resize(&rv, 2*out_len) < 0) \
- { Py_DECREF(rv); PyBuffer_Release(&pin); return NULL; } \
+ { Py_XDECREF(rv); PyBuffer_Release(&pin); return NULL; } \
out_data = (unsigned char *)PyBytes_AS_STRING(rv) \
+ out_len; \
out_len_left = out_len-1; \
@@ -887,8 +881,7 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args)
if (_PyBytes_Resize(&rv,
(out_data -
(unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
- Py_DECREF(rv);
- rv = NULL;
+ Py_CLEAR(rv);
}
PyBuffer_Release(&pin);
return rv;
diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
index 9e9e96c..285da1e 100644
--- a/Modules/cjkcodecs/_codecs_cn.c
+++ b/Modules/cjkcodecs/_codecs_cn.c
@@ -23,12 +23,12 @@
* A844 undefined U+2015 HORIZONTAL BAR
*/
-#define GBK_DECODE(dc1, dc2, assi) \
- if ((dc1) == 0xa1 && (dc2) == 0xaa) (assi) = 0x2014; \
- else if ((dc1) == 0xa8 && (dc2) == 0x44) (assi) = 0x2015; \
- else if ((dc1) == 0xa1 && (dc2) == 0xa4) (assi) = 0x00b7; \
- else TRYMAP_DEC(gb2312, assi, dc1 ^ 0x80, dc2 ^ 0x80); \
- else TRYMAP_DEC(gbkext, assi, dc1, dc2);
+#define GBK_DECODE(dc1, dc2, writer) \
+ if ((dc1) == 0xa1 && (dc2) == 0xaa) OUTCHAR(0x2014); \
+ else if ((dc1) == 0xa8 && (dc2) == 0x44) OUTCHAR(0x2015); \
+ else if ((dc1) == 0xa1 && (dc2) == 0xa4) OUTCHAR(0x00b7); \
+ else TRYMAP_DEC(gb2312, writer, dc1 ^ 0x80, dc2 ^ 0x80); \
+ else TRYMAP_DEC(gbkext, writer, dc1, dc2);
#define GBK_ENCODE(code, assi) \
if ((code) == 0x2014) (assi) = 0xa1aa; \
@@ -42,16 +42,18 @@
ENCODER(gb2312)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
TRYMAP_ENC(gbcommon, code, c);
@@ -60,9 +62,9 @@ ENCODER(gb2312)
if (code & 0x8000) /* MSB set: GBK */
return 1;
- OUT1((code >> 8) | 0x80)
- OUT2((code & 0xFF) | 0x80)
- NEXT(1, 2)
+ OUTBYTE1((code >> 8) | 0x80)
+ OUTBYTE2((code & 0xFF) | 0x80)
+ NEXT(1, 2);
}
return 0;
@@ -73,17 +75,15 @@ DECODER(gb2312)
while (inleft > 0) {
unsigned char c = **inbuf;
- REQUIRE_OUTBUF(1)
-
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
- NEXT(2, 1)
+ TRYMAP_DEC(gb2312, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
+ NEXT_IN(2);
}
else return 1;
}
@@ -98,28 +98,30 @@ DECODER(gb2312)
ENCODER(gbk)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
GBK_ENCODE(c, code)
else return 1;
- OUT1((code >> 8) | 0x80)
+ OUTBYTE1((code >> 8) | 0x80)
if (code & 0x8000)
- OUT2((code & 0xFF)) /* MSB set: GBK */
+ OUTBYTE2((code & 0xFF)) /* MSB set: GBK */
else
- OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
- NEXT(1, 2)
+ OUTBYTE2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
+ NEXT(1, 2);
}
return 0;
@@ -128,22 +130,20 @@ ENCODER(gbk)
DECODER(gbk)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- GBK_DECODE(c, IN2, **outbuf)
+ GBK_DECODE(c, INBYTE2, writer)
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
return 0;
@@ -156,41 +156,31 @@ DECODER(gbk)
ENCODER(gb18030)
{
- while (inleft > 0) {
- ucs4_t c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1(c)
- NEXT(1, 1)
+ WRITEBYTE1(c)
+ NEXT(1, 1);
continue;
}
- DECODE_SURROGATE(c)
- if (c > 0x10FFFF)
-#if Py_UNICODE_SIZE == 2
- return 2; /* surrogates pair */
-#else
- return 1;
-#endif
- else if (c >= 0x10000) {
- ucs4_t tc = c - 0x10000;
+ if (c >= 0x10000) {
+ Py_UCS4 tc = c - 0x10000;
+ assert (c <= 0x10FFFF);
REQUIRE_OUTBUF(4)
- OUT4((unsigned char)(tc % 10) + 0x30)
+ OUTBYTE4((unsigned char)(tc % 10) + 0x30)
tc /= 10;
- OUT3((unsigned char)(tc % 126) + 0x81)
+ OUTBYTE3((unsigned char)(tc % 126) + 0x81)
tc /= 126;
- OUT2((unsigned char)(tc % 10) + 0x30)
+ OUTBYTE2((unsigned char)(tc % 10) + 0x30)
tc /= 10;
- OUT1((unsigned char)(tc + 0x90))
+ OUTBYTE1((unsigned char)(tc + 0x90))
-#if Py_UNICODE_SIZE == 2
- NEXT(2, 4) /* surrogates pair */
-#else
- NEXT(1, 4)
-#endif
+ NEXT(1, 4);
continue;
}
@@ -208,20 +198,20 @@ ENCODER(gb18030)
utrrange++)
if (utrrange->first <= c &&
c <= utrrange->last) {
- Py_UNICODE tc;
+ Py_UCS4 tc;
tc = c - utrrange->first +
utrrange->base;
- OUT4((unsigned char)(tc % 10) + 0x30)
+ OUTBYTE4((unsigned char)(tc % 10) + 0x30)
tc /= 10;
- OUT3((unsigned char)(tc % 126) + 0x81)
+ OUTBYTE3((unsigned char)(tc % 126) + 0x81)
tc /= 126;
- OUT2((unsigned char)(tc % 10) + 0x30)
+ OUTBYTE2((unsigned char)(tc % 10) + 0x30)
tc /= 10;
- OUT1((unsigned char)tc + 0x81)
+ OUTBYTE1((unsigned char)tc + 0x81)
- NEXT(1, 4)
+ NEXT(1, 4);
break;
}
@@ -230,13 +220,13 @@ ENCODER(gb18030)
continue;
}
- OUT1((code >> 8) | 0x80)
+ OUTBYTE1((code >> 8) | 0x80)
if (code & 0x8000)
- OUT2((code & 0xFF)) /* MSB set: GBK or GB18030ext */
+ OUTBYTE2((code & 0xFF)) /* MSB set: GBK or GB18030ext */
else
- OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
+ OUTBYTE2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
- NEXT(1, 2)
+ NEXT(1, 2);
}
return 0;
@@ -245,61 +235,59 @@ ENCODER(gb18030)
DECODER(gb18030)
{
while (inleft > 0) {
- unsigned char c = IN1, c2;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1, c2;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
if (c2 >= 0x30 && c2 <= 0x39) { /* 4 bytes seq */
const struct _gb18030_to_unibmp_ranges *utr;
unsigned char c3, c4;
- ucs4_t lseq;
+ Py_UCS4 lseq;
REQUIRE_INBUF(4)
- c3 = IN3;
- c4 = IN4;
+ c3 = INBYTE3;
+ c4 = INBYTE4;
if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39)
return 1;
c -= 0x81; c2 -= 0x30;
c3 -= 0x81; c4 -= 0x30;
if (c < 4) { /* U+0080 - U+FFFF */
- lseq = ((ucs4_t)c * 10 + c2) * 1260 +
- (ucs4_t)c3 * 10 + c4;
+ lseq = ((Py_UCS4)c * 10 + c2) * 1260 +
+ (Py_UCS4)c3 * 10 + c4;
if (lseq < 39420) {
for (utr = gb18030_to_unibmp_ranges;
lseq >= (utr + 1)->base;
utr++) ;
- OUT1(utr->first - utr->base + lseq)
- NEXT(4, 1)
+ OUTCHAR(utr->first - utr->base + lseq);
+ NEXT_IN(4);
continue;
}
}
else if (c >= 15) { /* U+10000 - U+10FFFF */
- lseq = 0x10000 + (((ucs4_t)c-15) * 10 + c2)
- * 1260 + (ucs4_t)c3 * 10 + c4;
+ lseq = 0x10000 + (((Py_UCS4)c-15) * 10 + c2)
+ * 1260 + (Py_UCS4)c3 * 10 + c4;
if (lseq <= 0x10FFFF) {
- WRITEUCS4(lseq);
- NEXT_IN(4)
+ OUTCHAR(lseq);
+ NEXT_IN(4);
continue;
}
}
return 1;
}
- GBK_DECODE(c, c2, **outbuf)
- else TRYMAP_DEC(gb18030ext, **outbuf, c, c2);
+ GBK_DECODE(c, c2, writer)
+ else TRYMAP_DEC(gb18030ext, writer, c, c2);
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
return 0;
@@ -319,33 +307,34 @@ ENCODER_INIT(hz)
ENCODER_RESET(hz)
{
if (state->i != 0) {
- WRITE2('~', '}')
+ WRITEBYTE2('~', '}')
state->i = 0;
- NEXT_OUT(2)
+ NEXT_OUT(2);
}
return 0;
}
ENCODER(hz)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
if (state->i == 0) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
}
else {
- WRITE3('~', '}', (unsigned char)c)
- NEXT(1, 3)
+ WRITEBYTE3('~', '}', (unsigned char)c)
+ NEXT(1, 3);
state->i = 0;
}
continue;
}
- UCS4INVALID(c)
+ if (c > 0xFFFF)
+ return 1;
TRYMAP_ENC(gbcommon, code, c);
else return 1;
@@ -354,13 +343,13 @@ ENCODER(hz)
return 1;
if (state->i == 0) {
- WRITE4('~', '{', code >> 8, code & 0xff)
- NEXT(1, 4)
+ WRITEBYTE4('~', '{', code >> 8, code & 0xff)
+ NEXT(1, 4);
state->i = 1;
}
else {
- WRITE2(code >> 8, code & 0xff)
- NEXT(1, 2)
+ WRITEBYTE2(code >> 8, code & 0xff)
+ NEXT(1, 2);
}
}
@@ -382,15 +371,15 @@ DECODER_RESET(hz)
DECODER(hz)
{
while (inleft > 0) {
- unsigned char c = IN1;
+ unsigned char c = INBYTE1;
if (c == '~') {
- unsigned char c2 = IN2;
+ unsigned char c2 = INBYTE2;
REQUIRE_INBUF(2)
if (c2 == '~') {
- WRITE1('~')
- NEXT(2, 1)
+ OUTCHAR('~');
+ NEXT_IN(2);
continue;
}
else if (c2 == '{' && state->i == 0)
@@ -401,7 +390,7 @@ DECODER(hz)
; /* line-continuation */
else
return 1;
- NEXT(2, 0);
+ NEXT_IN(2);
continue;
}
@@ -409,14 +398,13 @@ DECODER(hz)
return 1;
if (state->i == 0) { /* ASCII mode */
- WRITE1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
}
else { /* GB mode */
REQUIRE_INBUF(2)
- REQUIRE_OUTBUF(1)
- TRYMAP_DEC(gb2312, **outbuf, c, IN2) {
- NEXT(2, 1)
+ TRYMAP_DEC(gb2312, writer, c, INBYTE2) {
+ NEXT_IN(2);
}
else
return 1;
diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
index d3ad04b..fe5f597 100644
--- a/Modules/cjkcodecs/_codecs_hk.c
+++ b/Modules/cjkcodecs/_codecs_hk.c
@@ -38,35 +38,39 @@ static const DBCHAR big5hkscs_pairenc_table[4] = {0x8862, 0x8864, 0x88a3, 0x88a5
ENCODER(big5hkscs)
{
- while (inleft > 0) {
- ucs4_t c = **inbuf;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
Py_ssize_t insize;
if (c < 0x80) {
REQUIRE_OUTBUF(1)
**outbuf = (unsigned char)c;
- NEXT(1, 1)
+ NEXT(1, 1);
continue;
}
- DECODE_SURROGATE(c)
- insize = GET_INSIZE(c);
-
+ insize = 1;
REQUIRE_OUTBUF(2)
if (c < 0x10000) {
TRYMAP_ENC(big5hkscs_bmp, code, c) {
if (code == MULTIC) {
- if (inleft >= 2 &&
+ Py_UCS4 c2;
+ if (inlen - *inpos >= 2)
+ c2 = INCHAR2;
+ else
+ c2 = 0;
+
+ if (inlen - *inpos >= 2 &&
((c & 0xffdf) == 0x00ca) &&
- (((*inbuf)[1] & 0xfff7) == 0x0304)) {
+ ((c2 & 0xfff7) == 0x0304)) {
code = big5hkscs_pairenc_table[
((c >> 4) |
- ((*inbuf)[1] >> 3)) & 3];
+ (c2 >> 3)) & 3];
insize = 2;
}
- else if (inleft < 2 &&
+ else if (inlen - *inpos < 2 &&
!(flags & MBENC_FLUSH))
return MBERR_TOOFEW;
else {
@@ -89,9 +93,9 @@ ENCODER(big5hkscs)
else
return insize;
- OUT1(code >> 8)
- OUT2(code & 0xFF)
- NEXT(insize, 2)
+ OUTBYTE1(code >> 8)
+ OUTBYTE2(code & 0xFF)
+ NEXT(insize, 2);
}
return 0;
@@ -102,33 +106,31 @@ ENCODER(big5hkscs)
DECODER(big5hkscs)
{
while (inleft > 0) {
- unsigned char c = IN1;
- ucs4_t decoded;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
+ Py_UCS4 decoded;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- if (0xc6 > c || c > 0xc8 || (c < 0xc7 && IN2 < 0xa1)) {
- TRYMAP_DEC(big5, **outbuf, c, IN2) {
- NEXT(2, 1)
+ if (0xc6 > c || c > 0xc8 || (c < 0xc7 && INBYTE2 < 0xa1)) {
+ TRYMAP_DEC(big5, writer, c, INBYTE2) {
+ NEXT_IN(2);
continue;
}
}
- TRYMAP_DEC(big5hkscs, decoded, c, IN2)
+ TRYMAP_DEC_CHAR(big5hkscs, decoded, c, INBYTE2)
{
- int s = BH2S(c, IN2);
+ int s = BH2S(c, INBYTE2);
const unsigned char *hintbase;
assert(0x87 <= c && c <= 0xfe);
- assert(0x40 <= IN2 && IN2 <= 0xfe);
+ assert(0x40 <= INBYTE2 && INBYTE2 <= 0xfe);
if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
hintbase = big5hkscs_phint_0;
@@ -146,25 +148,25 @@ DECODER(big5hkscs)
return MBERR_INTERNAL;
if (hintbase[s >> 3] & (1 << (s & 7))) {
- WRITEUCS4(decoded | 0x20000)
- NEXT_IN(2)
+ OUTCHAR(decoded | 0x20000);
+ NEXT_IN(2);
}
else {
- OUT1(decoded)
- NEXT(2, 1)
+ OUTCHAR(decoded);
+ NEXT_IN(2);
}
continue;
}
- switch ((c << 8) | IN2) {
- case 0x8862: WRITE2(0x00ca, 0x0304); break;
- case 0x8864: WRITE2(0x00ca, 0x030c); break;
- case 0x88a3: WRITE2(0x00ea, 0x0304); break;
- case 0x88a5: WRITE2(0x00ea, 0x030c); break;
+ switch ((c << 8) | INBYTE2) {
+ case 0x8862: OUTCHAR2(0x00ca, 0x0304); break;
+ case 0x8864: OUTCHAR2(0x00ca, 0x030c); break;
+ case 0x88a3: OUTCHAR2(0x00ea, 0x0304); break;
+ case 0x88a5: OUTCHAR2(0x00ea, 0x030c); break;
default: return 1;
}
- NEXT(2, 2) /* all decoded codepoints are pairs, above. */
+ NEXT_IN(2); /* all decoded codepoints are pairs, above. */
}
return 0;
diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
index cbc1542..bb63835 100644
--- a/Modules/cjkcodecs/_codecs_iso2022.c
+++ b/Modules/cjkcodecs/_codecs_iso2022.c
@@ -102,8 +102,8 @@
/*-*- internal data structures -*-*/
typedef int (*iso2022_init_func)(void);
-typedef ucs4_t (*iso2022_decode_func)(const unsigned char *data);
-typedef DBCHAR (*iso2022_encode_func)(const ucs4_t *data, Py_ssize_t *length);
+typedef Py_UCS4 (*iso2022_decode_func)(const unsigned char *data);
+typedef DBCHAR (*iso2022_encode_func)(const Py_UCS4 *data, Py_ssize_t *length);
struct iso2022_designation {
unsigned char mark;
@@ -141,13 +141,13 @@ ENCODER_INIT(iso2022)
ENCODER_RESET(iso2022)
{
if (STATE_GETFLAG(F_SHIFTED)) {
- WRITE1(SI)
- NEXT_OUT(1)
+ WRITEBYTE1(SI)
+ NEXT_OUT(1);
STATE_CLEARFLAG(F_SHIFTED)
}
if (STATE_G0 != CHARSET_ASCII) {
- WRITE3(ESC, '(', 'B')
- NEXT_OUT(3)
+ WRITEBYTE3(ESC, '(', 'B')
+ NEXT_OUT(3);
STATE_SETG0(CHARSET_ASCII)
}
return 0;
@@ -155,30 +155,29 @@ ENCODER_RESET(iso2022)
ENCODER(iso2022)
{
- while (inleft > 0) {
+ while (*inpos < inlen) {
const struct iso2022_designation *dsg;
DBCHAR encoded;
- ucs4_t c = **inbuf;
+ Py_UCS4 c = INCHAR1;
Py_ssize_t insize;
if (c < 0x80) {
if (STATE_G0 != CHARSET_ASCII) {
- WRITE3(ESC, '(', 'B')
+ WRITEBYTE3(ESC, '(', 'B')
STATE_SETG0(CHARSET_ASCII)
- NEXT_OUT(3)
+ NEXT_OUT(3);
}
if (STATE_GETFLAG(F_SHIFTED)) {
- WRITE1(SI)
+ WRITEBYTE1(SI)
STATE_CLEARFLAG(F_SHIFTED)
- NEXT_OUT(1)
+ NEXT_OUT(1);
}
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- DECODE_SURROGATE(c)
- insize = GET_INSIZE(c);
+ insize = 1;
encoded = MAP_UNMAPPABLE;
for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
@@ -187,24 +186,14 @@ ENCODER(iso2022)
if (encoded == MAP_MULTIPLE_AVAIL) {
/* this implementation won't work for pair
* of non-bmp characters. */
- if (inleft < 2) {
+ if (inlen - *inpos < 2) {
if (!(flags & MBENC_FLUSH))
return MBERR_TOOFEW;
length = -1;
}
else
length = 2;
-#if Py_UNICODE_SIZE == 2
- if (length == 2) {
- ucs4_t u4in[2];
- u4in[0] = (ucs4_t)IN1;
- u4in[1] = (ucs4_t)IN2;
- encoded = dsg->encoder(u4in, &length);
- } else
- encoded = dsg->encoder(&c, &length);
-#else
encoded = dsg->encoder(&c, &length);
-#endif
if (encoded != MAP_UNMAPPABLE) {
insize = length;
break;
@@ -221,47 +210,47 @@ ENCODER(iso2022)
switch (dsg->plane) {
case 0: /* G0 */
if (STATE_GETFLAG(F_SHIFTED)) {
- WRITE1(SI)
+ WRITEBYTE1(SI)
STATE_CLEARFLAG(F_SHIFTED)
- NEXT_OUT(1)
+ NEXT_OUT(1);
}
if (STATE_G0 != dsg->mark) {
if (dsg->width == 1) {
- WRITE3(ESC, '(', ESCMARK(dsg->mark))
+ WRITEBYTE3(ESC, '(', ESCMARK(dsg->mark))
STATE_SETG0(dsg->mark)
- NEXT_OUT(3)
+ NEXT_OUT(3);
}
else if (dsg->mark == CHARSET_JISX0208) {
- WRITE3(ESC, '$', ESCMARK(dsg->mark))
+ WRITEBYTE3(ESC, '$', ESCMARK(dsg->mark))
STATE_SETG0(dsg->mark)
- NEXT_OUT(3)
+ NEXT_OUT(3);
}
else {
- WRITE4(ESC, '$', '(',
+ WRITEBYTE4(ESC, '$', '(',
ESCMARK(dsg->mark))
STATE_SETG0(dsg->mark)
- NEXT_OUT(4)
+ NEXT_OUT(4);
}
}
break;
case 1: /* G1 */
if (STATE_G1 != dsg->mark) {
if (dsg->width == 1) {
- WRITE3(ESC, ')', ESCMARK(dsg->mark))
+ WRITEBYTE3(ESC, ')', ESCMARK(dsg->mark))
STATE_SETG1(dsg->mark)
- NEXT_OUT(3)
+ NEXT_OUT(3);
}
else {
- WRITE4(ESC, '$', ')',
+ WRITEBYTE4(ESC, '$', ')',
ESCMARK(dsg->mark))
STATE_SETG1(dsg->mark)
- NEXT_OUT(4)
+ NEXT_OUT(4);
}
}
if (!STATE_GETFLAG(F_SHIFTED)) {
- WRITE1(SO)
+ WRITEBYTE1(SO)
STATE_SETFLAG(F_SHIFTED)
- NEXT_OUT(1)
+ NEXT_OUT(1);
}
break;
default: /* G2 and G3 is not supported: no encoding in
@@ -270,14 +259,14 @@ ENCODER(iso2022)
}
if (dsg->width == 1) {
- WRITE1((unsigned char)encoded)
- NEXT_OUT(1)
+ WRITEBYTE1((unsigned char)encoded)
+ NEXT_OUT(1);
}
else {
- WRITE2(encoded >> 8, encoded & 0xff)
- NEXT_OUT(2)
+ WRITEBYTE2(encoded >> 8, encoded & 0xff)
+ NEXT_OUT(2);
}
- NEXT_IN(insize)
+ NEXT_INCHAR(insize);
}
return 0;
@@ -323,26 +312,26 @@ iso2022processesc(const void *config, MultibyteCodec_State *state,
switch (esclen) {
case 3:
- if (IN2 == '$') {
- charset = IN3 | CHARSET_DBCS;
+ if (INBYTE2 == '$') {
+ charset = INBYTE3 | CHARSET_DBCS;
designation = 0;
}
else {
- charset = IN3;
- if (IN2 == '(') designation = 0;
- else if (IN2 == ')') designation = 1;
- else if (CONFIG_ISSET(USE_G2) && IN2 == '.')
+ charset = INBYTE3;
+ if (INBYTE2 == '(') designation = 0;
+ else if (INBYTE2 == ')') designation = 1;
+ else if (CONFIG_ISSET(USE_G2) && INBYTE2 == '.')
designation = 2;
else return 3;
}
break;
case 4:
- if (IN2 != '$')
+ if (INBYTE2 != '$')
return 4;
- charset = IN4 | CHARSET_DBCS;
- if (IN3 == '(') designation = 0;
- else if (IN3 == ')') designation = 1;
+ charset = INBYTE4 | CHARSET_DBCS;
+ if (INBYTE3 == '(') designation = 0;
+ else if (INBYTE3 == ')') designation = 1;
else return 4;
break;
case 6: /* designation with prefix */
@@ -376,45 +365,43 @@ iso2022processesc(const void *config, MultibyteCodec_State *state,
return 0;
}
-#define ISO8859_7_DECODE(c, assi) \
- if ((c) < 0xa0) (assi) = (c); \
- else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) \
- (assi) = (c); \
- else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 || \
- (0xbffffd77L & (1L << ((c)-0xb4))))) \
- (assi) = 0x02d0 + (c); \
- else if ((c) == 0xa1) (assi) = 0x2018; \
- else if ((c) == 0xa2) (assi) = 0x2019; \
- else if ((c) == 0xaf) (assi) = 0x2015;
+#define ISO8859_7_DECODE(c, writer) \
+ if ((c) < 0xa0) OUTCHAR(c); \
+ else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) \
+ OUTCHAR(c); \
+ else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 || \
+ (0xbffffd77L & (1L << ((c)-0xb4))))) \
+ OUTCHAR(0x02d0 + (c)); \
+ else if ((c) == 0xa1) OUTCHAR(0x2018); \
+ else if ((c) == 0xa2) OUTCHAR(0x2019); \
+ else if ((c) == 0xaf) OUTCHAR(0x2015);
static Py_ssize_t
iso2022processg2(const void *config, MultibyteCodec_State *state,
const unsigned char **inbuf, Py_ssize_t *inleft,
- Py_UNICODE **outbuf, Py_ssize_t *outleft)
+ _PyUnicodeWriter *writer)
{
/* not written to use encoder, decoder functions because only few
* encodings use G2 designations in CJKCodecs */
if (STATE_G2 == CHARSET_ISO8859_1) {
- if (IN3 < 0x80)
- OUT1(IN3 + 0x80)
+ if (INBYTE3 < 0x80)
+ OUTCHAR(INBYTE3 + 0x80);
else
return 3;
}
else if (STATE_G2 == CHARSET_ISO8859_7) {
- ISO8859_7_DECODE(IN3 ^ 0x80, **outbuf)
+ ISO8859_7_DECODE(INBYTE3 ^ 0x80, writer)
else return 3;
}
else if (STATE_G2 == CHARSET_ASCII) {
- if (IN3 & 0x80) return 3;
- else **outbuf = IN3;
+ if (INBYTE3 & 0x80) return 3;
+ else OUTCHAR(INBYTE3);
}
else
return MBERR_INTERNAL;
(*inbuf) += 3;
*inleft -= 3;
- (*outbuf) += 1;
- *outleft -= 1;
return 0;
}
@@ -423,14 +410,14 @@ DECODER(iso2022)
const struct iso2022_designation *dsgcache = NULL;
while (inleft > 0) {
- unsigned char c = IN1;
+ unsigned char c = INBYTE1;
Py_ssize_t err;
if (STATE_GETFLAG(F_ESCTHROUGHOUT)) {
/* ESC throughout mode:
* for non-iso2022 escape sequences */
- WRITE1(c) /* assume as ISO-8859-1 */
- NEXT(1, 1)
+ OUTCHAR(c); /* assume as ISO-8859-1 */
+ NEXT_IN(1);
if (IS_ESCEND(c)) {
STATE_CLEARFLAG(F_ESCTHROUGHOUT)
}
@@ -440,41 +427,41 @@ DECODER(iso2022)
switch (c) {
case ESC:
REQUIRE_INBUF(2)
- if (IS_ISO2022ESC(IN2)) {
+ if (IS_ISO2022ESC(INBYTE2)) {
err = iso2022processesc(config, state,
inbuf, &inleft);
if (err != 0)
return err;
}
- else if (CONFIG_ISSET(USE_G2) && IN2 == 'N') {/* SS2 */
+ else if (CONFIG_ISSET(USE_G2) && INBYTE2 == 'N') {/* SS2 */
REQUIRE_INBUF(3)
err = iso2022processg2(config, state,
- inbuf, &inleft, outbuf, &outleft);
+ inbuf, &inleft, writer);
if (err != 0)
return err;
}
else {
- WRITE1(ESC)
+ OUTCHAR(ESC);
STATE_SETFLAG(F_ESCTHROUGHOUT)
- NEXT(1, 1)
+ NEXT_IN(1);
}
break;
case SI:
if (CONFIG_ISSET(NO_SHIFT))
goto bypass;
STATE_CLEARFLAG(F_SHIFTED)
- NEXT_IN(1)
+ NEXT_IN(1);
break;
case SO:
if (CONFIG_ISSET(NO_SHIFT))
goto bypass;
STATE_SETFLAG(F_SHIFTED)
- NEXT_IN(1)
+ NEXT_IN(1);
break;
case LF:
STATE_CLEARFLAG(F_SHIFTED)
- WRITE1(LF)
- NEXT(1, 1)
+ OUTCHAR(LF);
+ NEXT_IN(1);
break;
default:
if (c < 0x20) /* C0 */
@@ -484,7 +471,7 @@ DECODER(iso2022)
else {
const struct iso2022_designation *dsg;
unsigned char charset;
- ucs4_t decoded;
+ Py_UCS4 decoded;
if (STATE_GETFLAG(F_SHIFTED))
charset = STATE_G1;
@@ -492,8 +479,8 @@ DECODER(iso2022)
charset = STATE_G0;
if (charset == CHARSET_ASCII) {
-bypass: WRITE1(c)
- NEXT(1, 1)
+bypass: OUTCHAR(c);
+ NEXT_IN(1);
break;
}
@@ -518,17 +505,15 @@ bypass: WRITE1(c)
return dsg->width;
if (decoded < 0x10000) {
- WRITE1(decoded)
- NEXT_OUT(1)
+ OUTCHAR(decoded);
}
else if (decoded < 0x30000) {
- WRITEUCS4(decoded)
+ OUTCHAR(decoded);
}
else { /* JIS X 0213 pairs */
- WRITE2(decoded >> 16, decoded & 0xffff)
- NEXT_OUT(2)
+ OUTCHAR2(decoded >> 16, decoded & 0xffff);
}
- NEXT_IN(dsg->width)
+ NEXT_IN(dsg->width);
}
break;
}
@@ -577,18 +562,18 @@ ksx1001_init(void)
return 0;
}
-static ucs4_t
+static Py_UCS4
ksx1001_decoder(const unsigned char *data)
{
- ucs4_t u;
- TRYMAP_DEC(ksx1001, u, data[0], data[1])
+ Py_UCS4 u;
+ TRYMAP_DEC_CHAR(ksx1001, u, data[0], data[1])
return u;
else
return MAP_UNMAPPABLE;
}
static DBCHAR
-ksx1001_encoder(const ucs4_t *data, Py_ssize_t *length)
+ksx1001_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
assert(*length == 1);
@@ -613,20 +598,20 @@ jisx0208_init(void)
return 0;
}
-static ucs4_t
+static Py_UCS4
jisx0208_decoder(const unsigned char *data)
{
- ucs4_t u;
+ Py_UCS4 u;
if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
return 0xff3c;
- else TRYMAP_DEC(jisx0208, u, data[0], data[1])
+ else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1])
return u;
else
return MAP_UNMAPPABLE;
}
static DBCHAR
-jisx0208_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0208_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
assert(*length == 1);
@@ -654,18 +639,18 @@ jisx0212_init(void)
return 0;
}
-static ucs4_t
+static Py_UCS4
jisx0212_decoder(const unsigned char *data)
{
- ucs4_t u;
- TRYMAP_DEC(jisx0212, u, data[0], data[1])
+ Py_UCS4 u;
+ TRYMAP_DEC_CHAR(jisx0212, u, data[0], data[1])
return u;
else
return MAP_UNMAPPABLE;
}
static DBCHAR
-jisx0212_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0212_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
assert(*length == 1);
@@ -705,30 +690,30 @@ jisx0213_init(void)
}
#define config ((void *)2000)
-static ucs4_t
+static Py_UCS4
jisx0213_2000_1_decoder(const unsigned char *data)
{
- ucs4_t u;
+ Py_UCS4 u;
EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
return 0xff3c;
- else TRYMAP_DEC(jisx0208, u, data[0], data[1]);
- else TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]);
- else TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])
+ else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
u |= 0x20000;
- else TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
else
return MAP_UNMAPPABLE;
return u;
}
-static ucs4_t
+static Py_UCS4
jisx0213_2000_2_decoder(const unsigned char *data)
{
- ucs4_t u;
- EMULATE_JISX0213_2000_DECODE_PLANE2(u, data[0], data[1])
- TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]);
- else TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])
+ Py_UCS4 u;
+ EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1])
+ TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
u |= 0x20000;
else
return MAP_UNMAPPABLE;
@@ -736,28 +721,28 @@ jisx0213_2000_2_decoder(const unsigned char *data)
}
#undef config
-static ucs4_t
+static Py_UCS4
jisx0213_2004_1_decoder(const unsigned char *data)
{
- ucs4_t u;
+ Py_UCS4 u;
if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
return 0xff3c;
- else TRYMAP_DEC(jisx0208, u, data[0], data[1]);
- else TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]);
- else TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])
+ else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
u |= 0x20000;
- else TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
else
return MAP_UNMAPPABLE;
return u;
}
-static ucs4_t
+static Py_UCS4
jisx0213_2004_2_decoder(const unsigned char *data)
{
- ucs4_t u;
- TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]);
- else TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])
+ Py_UCS4 u;
+ TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
+ else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
u |= 0x20000;
else
return MAP_UNMAPPABLE;
@@ -765,7 +750,7 @@ jisx0213_2004_2_decoder(const unsigned char *data)
}
static DBCHAR
-jisx0213_encoder(const ucs4_t *data, Py_ssize_t *length, void *config)
+jisx0213_encoder(const Py_UCS4 *data, Py_ssize_t *length, void *config)
{
DBCHAR coded;
@@ -819,7 +804,7 @@ jisx0213_encoder(const ucs4_t *data, Py_ssize_t *length, void *config)
}
static DBCHAR
-jisx0213_2000_1_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0213_2000_1_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);
if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
@@ -831,7 +816,7 @@ jisx0213_2000_1_encoder(const ucs4_t *data, Py_ssize_t *length)
}
static DBCHAR
-jisx0213_2000_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)
+jisx0213_2000_1_encoder_paironly(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
Py_ssize_t ilength = *length;
@@ -854,7 +839,7 @@ jisx0213_2000_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)
}
static DBCHAR
-jisx0213_2000_2_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0213_2000_2_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);
if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
@@ -866,7 +851,7 @@ jisx0213_2000_2_encoder(const ucs4_t *data, Py_ssize_t *length)
}
static DBCHAR
-jisx0213_2004_1_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0213_2004_1_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded = jisx0213_encoder(data, length, NULL);
if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
@@ -878,7 +863,7 @@ jisx0213_2004_1_encoder(const ucs4_t *data, Py_ssize_t *length)
}
static DBCHAR
-jisx0213_2004_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)
+jisx0213_2004_1_encoder_paironly(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
Py_ssize_t ilength = *length;
@@ -901,7 +886,7 @@ jisx0213_2004_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)
}
static DBCHAR
-jisx0213_2004_2_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0213_2004_2_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded = jisx0213_encoder(data, length, NULL);
if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
@@ -912,17 +897,17 @@ jisx0213_2004_2_encoder(const ucs4_t *data, Py_ssize_t *length)
return MAP_UNMAPPABLE;
}
-static ucs4_t
+static Py_UCS4
jisx0201_r_decoder(const unsigned char *data)
{
- ucs4_t u;
- JISX0201_R_DECODE(*data, u)
+ Py_UCS4 u;
+ JISX0201_R_DECODE_CHAR(*data, u)
else return MAP_UNMAPPABLE;
return u;
}
static DBCHAR
-jisx0201_r_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0201_r_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
JISX0201_R_ENCODE(*data, coded)
@@ -930,17 +915,17 @@ jisx0201_r_encoder(const ucs4_t *data, Py_ssize_t *length)
return coded;
}
-static ucs4_t
+static Py_UCS4
jisx0201_k_decoder(const unsigned char *data)
{
- ucs4_t u;
- JISX0201_K_DECODE(*data ^ 0x80, u)
+ Py_UCS4 u;
+ JISX0201_K_DECODE_CHAR(*data ^ 0x80, u)
else return MAP_UNMAPPABLE;
return u;
}
static DBCHAR
-jisx0201_k_encoder(const ucs4_t *data, Py_ssize_t *length)
+jisx0201_k_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
JISX0201_K_ENCODE(*data, coded)
@@ -961,18 +946,18 @@ gb2312_init(void)
return 0;
}
-static ucs4_t
+static Py_UCS4
gb2312_decoder(const unsigned char *data)
{
- ucs4_t u;
- TRYMAP_DEC(gb2312, u, data[0], data[1])
+ Py_UCS4 u;
+ TRYMAP_DEC_CHAR(gb2312, u, data[0], data[1])
return u;
else
return MAP_UNMAPPABLE;
}
static DBCHAR
-gb2312_encoder(const ucs4_t *data, Py_ssize_t *length)
+gb2312_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
DBCHAR coded;
assert(*length == 1);
@@ -986,14 +971,14 @@ gb2312_encoder(const ucs4_t *data, Py_ssize_t *length)
}
-static ucs4_t
+static Py_UCS4
dummy_decoder(const unsigned char *data)
{
return MAP_UNMAPPABLE;
}
static DBCHAR
-dummy_encoder(const ucs4_t *data, Py_ssize_t *length)
+dummy_encoder(const Py_UCS4 *data, Py_ssize_t *length)
{
return MAP_UNMAPPABLE;
}
diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
index a500696..7ab318b 100644
--- a/Modules/cjkcodecs/_codecs_jp.c
+++ b/Modules/cjkcodecs/_codecs_jp.c
@@ -19,38 +19,39 @@
ENCODER(cp932)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
unsigned char c1, c2;
if (c <= 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
else if (c >= 0xff61 && c <= 0xff9f) {
- WRITE1(c - 0xfec0)
- NEXT(1, 1)
+ WRITEBYTE1(c - 0xfec0)
+ NEXT(1, 1);
continue;
}
else if (c >= 0xf8f0 && c <= 0xf8f3) {
/* Windows compatibility */
REQUIRE_OUTBUF(1)
if (c == 0xf8f0)
- OUT1(0xa0)
+ OUTBYTE1(0xa0)
else
- OUT1(c - 0xfef1 + 0xfd)
- NEXT(1, 1)
+ OUTBYTE1(c - 0xfef1 + 0xfd)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
TRYMAP_ENC(cp932ext, code, c) {
- OUT1(code >> 8)
- OUT2(code & 0xff)
+ OUTBYTE1(code >> 8)
+ OUTBYTE2(code & 0xff)
}
else TRYMAP_ENC(jisxcommon, code, c) {
if (code & 0x8000) /* MSB set: JIS X 0212 */
@@ -61,20 +62,20 @@ ENCODER(cp932)
c2 = code & 0xff;
c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
c1 = (c1 - 0x21) >> 1;
- OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
- OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
+ OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
+ OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
}
else if (c >= 0xe000 && c < 0xe758) {
/* User-defined area */
- c1 = (Py_UNICODE)(c - 0xe000) / 188;
- c2 = (Py_UNICODE)(c - 0xe000) % 188;
- OUT1(c1 + 0xf0)
- OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
+ c1 = (Py_UCS4)(c - 0xe000) / 188;
+ c2 = (Py_UCS4)(c - 0xe000) % 188;
+ OUTBYTE1(c1 + 0xf0)
+ OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
}
else
return 1;
- NEXT(1, 2)
+ NEXT(1, 2);
}
return 0;
@@ -83,33 +84,32 @@ ENCODER(cp932)
DECODER(cp932)
{
while (inleft > 0) {
- unsigned char c = IN1, c2;
+ unsigned char c = INBYTE1, c2;
- REQUIRE_OUTBUF(1)
if (c <= 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
else if (c >= 0xa0 && c <= 0xdf) {
if (c == 0xa0)
- OUT1(0xf8f0) /* half-width katakana */
+ OUTCHAR(0xf8f0); /* half-width katakana */
else
- OUT1(0xfec0 + c)
- NEXT(1, 1)
+ OUTCHAR(0xfec0 + c);
+ NEXT_IN(1);
continue;
}
else if (c >= 0xfd/* && c <= 0xff*/) {
/* Windows compatibility */
- OUT1(0xf8f1 - 0xfd + c)
- NEXT(1, 1)
+ OUTCHAR(0xf8f1 - 0xfd + c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
- TRYMAP_DEC(cp932ext, **outbuf, c, c2);
+ TRYMAP_DEC(cp932ext, writer, c, c2);
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
return 1;
@@ -119,21 +119,21 @@ DECODER(cp932)
c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
- TRYMAP_DEC(jisx0208, **outbuf, c, c2);
+ TRYMAP_DEC(jisx0208, writer, c, c2);
else return 1;
}
else if (c >= 0xf0 && c <= 0xf9) {
if ((c2 >= 0x40 && c2 <= 0x7e) ||
(c2 >= 0x80 && c2 <= 0xfc))
- OUT1(0xe000 + 188 * (c - 0xf0) +
- (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41))
+ OUTCHAR(0xe000 + 188 * (c - 0xf0) +
+ (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41));
else
return 1;
}
else
return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
return 0;
@@ -146,25 +146,24 @@ DECODER(cp932)
ENCODER(euc_jis_2004)
{
- while (inleft > 0) {
- ucs4_t c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
Py_ssize_t insize;
if (c < 0x80) {
- WRITE1(c)
- NEXT(1, 1)
+ WRITEBYTE1(c)
+ NEXT(1, 1);
continue;
}
- DECODE_SURROGATE(c)
- insize = GET_INSIZE(c);
+ insize = 1;
if (c <= 0xFFFF) {
EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
else TRYMAP_ENC(jisx0213_bmp, code, c) {
if (code == MULTIC) {
- if (inleft < 2) {
+ if (inlen - *inpos < 2) {
if (flags & MBENC_FLUSH) {
code = find_pairencmap(
(ucs2_t)c, 0,
@@ -177,8 +176,9 @@ ENCODER(euc_jis_2004)
return MBERR_TOOFEW;
}
else {
+ Py_UCS4 c2 = INCHAR2;
code = find_pairencmap(
- (ucs2_t)c, (*inbuf)[1],
+ (ucs2_t)c, c2,
jisx0213_pair_encmap,
JISX0213_ENCPAIRS);
if (code == DBCINV) {
@@ -196,8 +196,8 @@ ENCODER(euc_jis_2004)
else TRYMAP_ENC(jisxcommon, code, c);
else if (c >= 0xff61 && c <= 0xff9f) {
/* JIS X 0201 half-width katakana */
- WRITE2(0x8e, c - 0xfec0)
- NEXT(1, 2)
+ WRITEBYTE2(0x8e, c - 0xfec0)
+ NEXT(1, 2);
continue;
}
else if (c == 0xff3c)
@@ -219,12 +219,12 @@ ENCODER(euc_jis_2004)
if (code & 0x8000) {
/* Codeset 2 */
- WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
- NEXT(insize, 3)
+ WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
+ NEXT(insize, 3);
} else {
/* Codeset 1 */
- WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
- NEXT(insize, 2)
+ WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
+ NEXT(insize, 2);
}
}
@@ -234,14 +234,12 @@ ENCODER(euc_jis_2004)
DECODER(euc_jis_2004)
{
while (inleft > 0) {
- unsigned char c = IN1;
- ucs4_t code;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
+ Py_UCS4 code;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
@@ -250,10 +248,10 @@ DECODER(euc_jis_2004)
unsigned char c2;
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
if (c2 >= 0xa1 && c2 <= 0xdf) {
- OUT1(0xfec0 + c2)
- NEXT(2, 1)
+ OUTCHAR(0xfec0 + c2);
+ NEXT_IN(2);
}
else
return 1;
@@ -262,46 +260,46 @@ DECODER(euc_jis_2004)
unsigned char c2, c3;
REQUIRE_INBUF(3)
- c2 = IN2 ^ 0x80;
- c3 = IN3 ^ 0x80;
+ c2 = INBYTE2 ^ 0x80;
+ c3 = INBYTE3 ^ 0x80;
/* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
- EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf, c2, c3)
- else TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c2, c3) ;
- else TRYMAP_DEC(jisx0213_2_emp, code, c2, c3) {
- WRITEUCS4(EMPBASE | code)
- NEXT_IN(3)
+ EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
+ else TRYMAP_DEC(jisx0213_2_bmp, writer, c2, c3) ;
+ else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c2, c3) {
+ OUTCHAR(EMPBASE | code);
+ NEXT_IN(3);
continue;
}
- else TRYMAP_DEC(jisx0212, **outbuf, c2, c3) ;
+ else TRYMAP_DEC(jisx0212, writer, c2, c3) ;
else return 1;
- NEXT(3, 1)
+ NEXT_IN(3);
}
else {
unsigned char c2;
REQUIRE_INBUF(2)
c ^= 0x80;
- c2 = IN2 ^ 0x80;
+ c2 = INBYTE2 ^ 0x80;
/* JIS X 0213 Plane 1 */
- EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf, c, c2)
- else if (c == 0x21 && c2 == 0x40) **outbuf = 0xff3c;
- else if (c == 0x22 && c2 == 0x32) **outbuf = 0xff5e;
- else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
- else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c, c2);
- else TRYMAP_DEC(jisx0213_1_emp, code, c, c2) {
- WRITEUCS4(EMPBASE | code)
- NEXT_IN(2)
+ EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
+ else if (c == 0x21 && c2 == 0x40) OUTCHAR(0xff3c);
+ else if (c == 0x22 && c2 == 0x32) OUTCHAR(0xff5e);
+ else TRYMAP_DEC(jisx0208, writer, c, c2);
+ else TRYMAP_DEC(jisx0213_1_bmp, writer, c, c2);
+ else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c, c2) {
+ OUTCHAR(EMPBASE | code);
+ NEXT_IN(2);
continue;
}
- else TRYMAP_DEC(jisx0213_pair, code, c, c2) {
- WRITE2(code >> 16, code & 0xffff)
- NEXT(2, 2)
+ else TRYMAP_DEC_CHAR(jisx0213_pair, code, c, c2) {
+ OUTCHAR2(code >> 16, code & 0xffff);
+ NEXT_IN(2);
continue;
}
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
}
@@ -315,35 +313,36 @@ DECODER(euc_jis_2004)
ENCODER(euc_jp)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+ if (c > 0xFFFF)
+ return 1;
TRYMAP_ENC(jisxcommon, code, c);
else if (c >= 0xff61 && c <= 0xff9f) {
/* JIS X 0201 half-width katakana */
- WRITE2(0x8e, c - 0xfec0)
- NEXT(1, 2)
+ WRITEBYTE2(0x8e, c - 0xfec0)
+ NEXT(1, 2);
continue;
}
#ifndef STRICT_BUILD
else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
code = 0x2140;
else if (c == 0xa5) { /* YEN SIGN */
- WRITE1(0x5c);
- NEXT(1, 1)
+ WRITEBYTE1(0x5c);
+ NEXT(1, 1);
continue;
} else if (c == 0x203e) { /* OVERLINE */
- WRITE1(0x7e);
- NEXT(1, 1)
+ WRITEBYTE1(0x7e);
+ NEXT(1, 1);
continue;
}
#endif
@@ -352,12 +351,12 @@ ENCODER(euc_jp)
if (code & 0x8000) {
/* JIS X 0212 */
- WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
- NEXT(1, 3)
+ WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
+ NEXT(1, 3);
} else {
/* JIS X 0208 */
- WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
- NEXT(1, 2)
+ WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
+ NEXT(1, 2);
}
}
@@ -367,13 +366,11 @@ ENCODER(euc_jp)
DECODER(euc_jp)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
@@ -382,10 +379,10 @@ DECODER(euc_jp)
unsigned char c2;
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
if (c2 >= 0xa1 && c2 <= 0xdf) {
- OUT1(0xfec0 + c2)
- NEXT(2, 1)
+ OUTCHAR(0xfec0 + c2);
+ NEXT_IN(2);
}
else
return 1;
@@ -394,11 +391,11 @@ DECODER(euc_jp)
unsigned char c2, c3;
REQUIRE_INBUF(3)
- c2 = IN2;
- c3 = IN3;
+ c2 = INBYTE2;
+ c3 = INBYTE3;
/* JIS X 0212 */
- TRYMAP_DEC(jisx0212, **outbuf, c2 ^ 0x80, c3 ^ 0x80) {
- NEXT(3, 1)
+ TRYMAP_DEC(jisx0212, writer, c2 ^ 0x80, c3 ^ 0x80) {
+ NEXT_IN(3);
}
else
return 1;
@@ -407,18 +404,18 @@ DECODER(euc_jp)
unsigned char c2;
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
/* JIS X 0208 */
#ifndef STRICT_BUILD
if (c == 0xa1 && c2 == 0xc0)
/* FULL-WIDTH REVERSE SOLIDUS */
- **outbuf = 0xff3c;
+ OUTCHAR(0xff3c);
else
#endif
- TRYMAP_DEC(jisx0208, **outbuf,
+ TRYMAP_DEC(jisx0208, writer,
c ^ 0x80, c2 ^ 0x80) ;
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
}
@@ -432,8 +429,8 @@ DECODER(euc_jp)
ENCODER(shift_jis)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
unsigned char c1, c2;
@@ -445,14 +442,16 @@ ENCODER(shift_jis)
else if (c == 0x203e) code = 0x7e; /* OVERLINE */
#endif
else JISX0201_K_ENCODE(c, code)
- else UCS4INVALID(c)
- else code = NOCHAR;
+ else if (c > 0xFFFF)
+ return 1;
+ else
+ code = NOCHAR;
if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
REQUIRE_OUTBUF(1)
- OUT1((unsigned char)code)
- NEXT(1, 1)
+ OUTBYTE1((unsigned char)code)
+ NEXT(1, 1);
continue;
}
@@ -475,9 +474,9 @@ ENCODER(shift_jis)
c2 = code & 0xff;
c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
c1 = (c1 - 0x21) >> 1;
- OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
- OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
- NEXT(1, 2)
+ OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
+ OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
+ NEXT(1, 2);
}
return 0;
@@ -486,21 +485,19 @@ ENCODER(shift_jis)
DECODER(shift_jis)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
#ifdef STRICT_BUILD
- JISX0201_R_DECODE(c, **outbuf)
+ JISX0201_R_DECODE(c, writer)
#else
- if (c < 0x80) **outbuf = c;
+ if (c < 0x80) OUTCHAR(c);
#endif
- else JISX0201_K_DECODE(c, **outbuf)
+ else JISX0201_K_DECODE(c, writer)
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
unsigned char c1, c2;
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
return 1;
@@ -512,13 +509,13 @@ DECODER(shift_jis)
#ifndef STRICT_BUILD
if (c1 == 0x21 && c2 == 0x40) {
/* FULL-WIDTH REVERSE SOLIDUS */
- OUT1(0xff3c)
- NEXT(2, 1)
+ OUTCHAR(0xff3c);
+ NEXT_IN(2);
continue;
}
#endif
- TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
- NEXT(2, 1)
+ TRYMAP_DEC(jisx0208, writer, c1, c2) {
+ NEXT_IN(2);
continue;
}
else
@@ -527,7 +524,7 @@ DECODER(shift_jis)
else
return 1;
- NEXT(1, 1) /* JIS X 0201 */
+ NEXT_IN(1); /* JIS X 0201 */
}
return 0;
@@ -540,30 +537,29 @@ DECODER(shift_jis)
ENCODER(shift_jis_2004)
{
- while (inleft > 0) {
- ucs4_t c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code = NOCHAR;
int c1, c2;
Py_ssize_t insize;
JISX0201_ENCODE(c, code)
- else DECODE_SURROGATE(c)
if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
- WRITE1((unsigned char)code)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)code)
+ NEXT(1, 1);
continue;
}
REQUIRE_OUTBUF(2)
- insize = GET_INSIZE(c);
+ insize = 1;
if (code == NOCHAR) {
if (c <= 0xffff) {
EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
else TRYMAP_ENC(jisx0213_bmp, code, c) {
if (code == MULTIC) {
- if (inleft < 2) {
+ if (inlen - *inpos < 2) {
if (flags & MBENC_FLUSH) {
code = find_pairencmap
((ucs2_t)c, 0,
@@ -576,8 +572,9 @@ ENCODER(shift_jis_2004)
return MBERR_TOOFEW;
}
else {
+ Py_UCS4 ch2 = INCHAR2;
code = find_pairencmap(
- (ucs2_t)c, IN2,
+ (ucs2_t)c, ch2,
jisx0213_pair_encmap,
JISX0213_ENCPAIRS);
if (code == DBCINV) {
@@ -622,10 +619,10 @@ ENCODER(shift_jis_2004)
if (c1 & 1) c2 += 0x5e;
c1 >>= 1;
- OUT1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
- OUT2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
+ OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
+ OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
- NEXT(insize, 2)
+ NEXT(insize, 2);
}
return 0;
@@ -634,16 +631,15 @@ ENCODER(shift_jis_2004)
DECODER(shift_jis_2004)
{
while (inleft > 0) {
- unsigned char c = IN1;
+ unsigned char c = INBYTE1;
- REQUIRE_OUTBUF(1)
- JISX0201_DECODE(c, **outbuf)
+ JISX0201_DECODE(c, writer)
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
unsigned char c1, c2;
- ucs4_t code;
+ Py_UCS4 code;
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
return 1;
@@ -654,50 +650,47 @@ DECODER(shift_jis_2004)
if (c1 < 0x5e) { /* Plane 1 */
c1 += 0x21;
- EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf,
+ EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
c1, c2)
- else TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
- NEXT_OUT(1)
+ else TRYMAP_DEC(jisx0208, writer, c1, c2) {
}
- else TRYMAP_DEC(jisx0213_1_bmp, **outbuf,
+ else TRYMAP_DEC(jisx0213_1_bmp, writer,
c1, c2) {
- NEXT_OUT(1)
}
- else TRYMAP_DEC(jisx0213_1_emp, code, c1, c2) {
- WRITEUCS4(EMPBASE | code)
+ else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c1, c2) {
+ OUTCHAR(EMPBASE | code);
}
- else TRYMAP_DEC(jisx0213_pair, code, c1, c2) {
- WRITE2(code >> 16, code & 0xffff)
- NEXT_OUT(2)
+ else TRYMAP_DEC_CHAR(jisx0213_pair, code, c1, c2) {
+ OUTCHAR2(code >> 16, code & 0xffff);
}
else
return 1;
- NEXT_IN(2)
+ NEXT_IN(2);
}
else { /* Plane 2 */
if (c1 >= 0x67) c1 += 0x07;
else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;
else c1 -= 0x3d;
- EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf,
+ EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
c1, c2)
- else TRYMAP_DEC(jisx0213_2_bmp, **outbuf,
- c1, c2) ;
- else TRYMAP_DEC(jisx0213_2_emp, code, c1, c2) {
- WRITEUCS4(EMPBASE | code)
- NEXT_IN(2)
+ else TRYMAP_DEC(jisx0213_2_bmp, writer,
+ c1, c2) {
+ } else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c1, c2) {
+ OUTCHAR(EMPBASE | code);
+ NEXT_IN(2);
continue;
}
else
return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
continue;
}
else
return 1;
- NEXT(1, 1) /* JIS X 0201 */
+ NEXT_IN(1); /* JIS X 0201 */
}
return 0;
diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
index f5697dd..0c2309d 100644
--- a/Modules/cjkcodecs/_codecs_kr.c
+++ b/Modules/cjkcodecs/_codecs_kr.c
@@ -33,16 +33,18 @@ static const unsigned char u2cgk_jongseong[28] = {
ENCODER(euc_kr)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
TRYMAP_ENC(cp949, code, c);
@@ -50,9 +52,9 @@ ENCODER(euc_kr)
if ((code & 0x8000) == 0) {
/* KS X 1001 coded character */
- OUT1((code >> 8) | 0x80)
- OUT2((code & 0xFF) | 0x80)
- NEXT(1, 2)
+ OUTBYTE1((code >> 8) | 0x80)
+ OUTBYTE2((code & 0xFF) | 0x80)
+ NEXT(1, 2);
}
else { /* Mapping is found in CP949 extension,
* but we encode it in KS X 1001:1998 Annex 3,
@@ -61,23 +63,23 @@ ENCODER(euc_kr)
REQUIRE_OUTBUF(8)
/* syllable composition precedence */
- OUT1(EUCKR_JAMO_FIRSTBYTE)
- OUT2(EUCKR_JAMO_FILLER)
+ OUTBYTE1(EUCKR_JAMO_FIRSTBYTE)
+ OUTBYTE2(EUCKR_JAMO_FILLER)
/* All codepoints in CP949 extension are in unicode
* Hangul Syllable area. */
assert(0xac00 <= c && c <= 0xd7a3);
c -= 0xac00;
- OUT3(EUCKR_JAMO_FIRSTBYTE)
- OUT4(u2cgk_choseong[c / 588])
- NEXT_OUT(4)
+ OUTBYTE3(EUCKR_JAMO_FIRSTBYTE)
+ OUTBYTE4(u2cgk_choseong[c / 588])
+ NEXT_OUT(4);
- OUT1(EUCKR_JAMO_FIRSTBYTE)
- OUT2(u2cgk_jungseong[(c / 28) % 21])
- OUT3(EUCKR_JAMO_FIRSTBYTE)
- OUT4(u2cgk_jongseong[c % 28])
- NEXT(1, 4)
+ OUTBYTE1(EUCKR_JAMO_FIRSTBYTE)
+ OUTBYTE2(u2cgk_jungseong[(c / 28) % 21])
+ OUTBYTE3(EUCKR_JAMO_FIRSTBYTE)
+ OUTBYTE4(u2cgk_jongseong[c % 28])
+ NEXT(1, 4);
}
}
@@ -102,20 +104,18 @@ static const unsigned char cgk2u_jongseong[] = { /* [A1, BE] */
DECODER(euc_kr)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
if (c == EUCKR_JAMO_FIRSTBYTE &&
- IN2 == EUCKR_JAMO_FILLER) {
+ INBYTE2 == EUCKR_JAMO_FILLER) {
/* KS X 1001:1998 Annex 3 make-up sequence */
DBCHAR cho, jung, jong;
@@ -145,11 +145,11 @@ DECODER(euc_kr)
if (cho == NONE || jung == NONE || jong == NONE)
return 1;
- OUT1(0xac00 + cho*588 + jung*28 + jong);
- NEXT(8, 1)
+ OUTCHAR(0xac00 + cho*588 + jung*28 + jong);
+ NEXT_IN(8);
}
- else TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
- NEXT(2, 1)
+ else TRYMAP_DEC(ksx1001, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
+ NEXT_IN(2);
}
else
return 1;
@@ -166,27 +166,29 @@ DECODER(euc_kr)
ENCODER(cp949)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
TRYMAP_ENC(cp949, code, c);
else return 1;
- OUT1((code >> 8) | 0x80)
+ OUTBYTE1((code >> 8) | 0x80)
if (code & 0x8000)
- OUT2(code & 0xFF) /* MSB set: CP949 */
+ OUTBYTE2(code & 0xFF) /* MSB set: CP949 */
else
- OUT2((code & 0xFF) | 0x80) /* MSB unset: ks x 1001 */
- NEXT(1, 2)
+ OUTBYTE2((code & 0xFF) | 0x80) /* MSB unset: ks x 1001 */
+ NEXT(1, 2);
}
return 0;
@@ -195,22 +197,20 @@ ENCODER(cp949)
DECODER(cp949)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80);
- else TRYMAP_DEC(cp949ext, **outbuf, c, IN2);
+ TRYMAP_DEC(ksx1001, writer, c ^ 0x80, INBYTE2 ^ 0x80);
+ else TRYMAP_DEC(cp949ext, writer, c, INBYTE2);
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
return 0;
@@ -250,16 +250,18 @@ static const DBCHAR u2johabjamo[] = {
ENCODER(johab)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
@@ -285,9 +287,9 @@ ENCODER(johab)
t1 = (c1 < 0x4a ? (c1 - 0x21 + 0x1b2) :
(c1 - 0x21 + 0x197));
t2 = ((t1 & 1) ? 0x5e : 0) + (c2 - 0x21);
- OUT1(t1 >> 1)
- OUT2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43)
- NEXT(1, 2)
+ OUTBYTE1(t1 >> 1)
+ OUTBYTE2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43)
+ NEXT(1, 2);
continue;
}
else
@@ -296,9 +298,9 @@ ENCODER(johab)
else
return 1;
- OUT1(code >> 8)
- OUT2(code & 0xff)
- NEXT(1, 2)
+ OUTBYTE1(code >> 8)
+ OUTBYTE2(code & 0xff)
+ NEXT(1, 2);
}
return 0;
@@ -348,18 +350,16 @@ static const unsigned char johabjamo_jongseong[32] = {
DECODER(johab)
{
while (inleft > 0) {
- unsigned char c = IN1, c2;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1, c2;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- c2 = IN2;
+ c2 = INBYTE2;
if (c < 0xd8) {
/* johab hangul */
@@ -381,33 +381,33 @@ DECODER(johab)
if (i_cho == FILL) {
if (i_jung == FILL) {
if (i_jong == FILL)
- OUT1(0x3000)
+ OUTCHAR(0x3000);
else
- OUT1(0x3100 |
- johabjamo_jongseong[c_jong])
+ OUTCHAR(0x3100 |
+ johabjamo_jongseong[c_jong]);
}
else {
if (i_jong == FILL)
- OUT1(0x3100 |
- johabjamo_jungseong[c_jung])
+ OUTCHAR(0x3100 |
+ johabjamo_jungseong[c_jung]);
else
return 1;
}
} else {
if (i_jung == FILL) {
if (i_jong == FILL)
- OUT1(0x3100 |
- johabjamo_choseong[c_cho])
+ OUTCHAR(0x3100 |
+ johabjamo_choseong[c_cho]);
else
return 1;
}
else
- OUT1(0xac00 +
- i_cho * 588 +
- i_jung * 28 +
- (i_jong == FILL ? 0 : i_jong))
+ OUTCHAR(0xac00 +
+ i_cho * 588 +
+ i_jung * 28 +
+ (i_jong == FILL ? 0 : i_jong));
}
- NEXT(2, 1)
+ NEXT_IN(2);
} else {
/* KS X 1001 except hangul jamos and syllables */
if (c == 0xdf || c > 0xf9 ||
@@ -424,9 +424,9 @@ DECODER(johab)
t1 = t1 + (t2 < 0x5e ? 0 : 1) + 0x21;
t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;
- TRYMAP_DEC(ksx1001, **outbuf, t1, t2);
+ TRYMAP_DEC(ksx1001, writer, t1, t2);
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
}
}
diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
index 916298d..80e0b81 100644
--- a/Modules/cjkcodecs/_codecs_tw.c
+++ b/Modules/cjkcodecs/_codecs_tw.c
@@ -13,26 +13,28 @@
ENCODER(big5)
{
- while (inleft > 0) {
- Py_UNICODE c = **inbuf;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
REQUIRE_OUTBUF(1)
**outbuf = (unsigned char)c;
- NEXT(1, 1)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
TRYMAP_ENC(big5, code, c);
else return 1;
- OUT1(code >> 8)
- OUT2(code & 0xFF)
- NEXT(1, 2)
+ OUTBYTE1(code >> 8)
+ OUTBYTE2(code & 0xFF)
+ NEXT(1, 2);
}
return 0;
@@ -41,19 +43,17 @@ ENCODER(big5)
DECODER(big5)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(big5, **outbuf, c, IN2) {
- NEXT(2, 1)
+ TRYMAP_DEC(big5, writer, c, INBYTE2) {
+ NEXT_IN(2);
}
else return 1;
}
@@ -68,25 +68,27 @@ DECODER(big5)
ENCODER(cp950)
{
- while (inleft > 0) {
- Py_UNICODE c = IN1;
+ while (*inpos < inlen) {
+ Py_UCS4 c = INCHAR1;
DBCHAR code;
if (c < 0x80) {
- WRITE1((unsigned char)c)
- NEXT(1, 1)
+ WRITEBYTE1((unsigned char)c)
+ NEXT(1, 1);
continue;
}
- UCS4INVALID(c)
+
+ if (c > 0xFFFF)
+ return 1;
REQUIRE_OUTBUF(2)
TRYMAP_ENC(cp950ext, code, c);
else TRYMAP_ENC(big5, code, c);
else return 1;
- OUT1(code >> 8)
- OUT2(code & 0xFF)
- NEXT(1, 2)
+ OUTBYTE1(code >> 8)
+ OUTBYTE2(code & 0xFF)
+ NEXT(1, 2);
}
return 0;
@@ -95,23 +97,21 @@ ENCODER(cp950)
DECODER(cp950)
{
while (inleft > 0) {
- unsigned char c = IN1;
-
- REQUIRE_OUTBUF(1)
+ unsigned char c = INBYTE1;
if (c < 0x80) {
- OUT1(c)
- NEXT(1, 1)
+ OUTCHAR(c);
+ NEXT_IN(1);
continue;
}
REQUIRE_INBUF(2)
- TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
- else TRYMAP_DEC(big5, **outbuf, c, IN2);
+ TRYMAP_DEC(cp950ext, writer, c, INBYTE2);
+ else TRYMAP_DEC(big5, writer, c, INBYTE2);
else return 1;
- NEXT(2, 1)
+ NEXT_IN(2);
}
return 0;
diff --git a/Modules/cjkcodecs/alg_jisx0201.h b/Modules/cjkcodecs/alg_jisx0201.h
index 0bc7db5..98c63e6 100644
--- a/Modules/cjkcodecs/alg_jisx0201.h
+++ b/Modules/cjkcodecs/alg_jisx0201.h
@@ -10,15 +10,24 @@
JISX0201_R_ENCODE(c, assi) \
else JISX0201_K_ENCODE(c, assi)
-#define JISX0201_R_DECODE(c, assi) \
+#define JISX0201_R_DECODE_CHAR(c, assi) \
if ((c) < 0x5c) (assi) = (c); \
else if ((c) == 0x5c) (assi) = 0x00a5; \
else if ((c) < 0x7e) (assi) = (c); \
else if ((c) == 0x7e) (assi) = 0x203e; \
else if ((c) == 0x7f) (assi) = 0x7f;
-#define JISX0201_K_DECODE(c, assi) \
+#define JISX0201_R_DECODE(c, writer) \
+ if ((c) < 0x5c) OUTCHAR(c); \
+ else if ((c) == 0x5c) OUTCHAR(0x00a5); \
+ else if ((c) < 0x7e) OUTCHAR(c); \
+ else if ((c) == 0x7e) OUTCHAR(0x203e); \
+ else if ((c) == 0x7f) OUTCHAR(0x7f);
+#define JISX0201_K_DECODE(c, writer) \
if ((c) >= 0xa1 && (c) <= 0xdf) \
- (assi) = 0xfec0 + (c);
-#define JISX0201_DECODE(c, assi) \
- JISX0201_R_DECODE(c, assi) \
- else JISX0201_K_DECODE(c, assi)
+ OUTCHAR(0xfec0 + (c));
+#define JISX0201_K_DECODE_CHAR(c, assi) \
+ if ((c) >= 0xa1 && (c) <= 0xdf) \
+ (assi) = 0xfec0 + (c);
+#define JISX0201_DECODE(c, writer) \
+ JISX0201_R_DECODE(c, writer) \
+ else JISX0201_K_DECODE(c, writer)
diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
index ab0682a..9e92db2 100644
--- a/Modules/cjkcodecs/cjkcodecs.h
+++ b/Modules/cjkcodecs/cjkcodecs.h
@@ -33,7 +33,7 @@ struct dbcs_index {
typedef struct dbcs_index decode_map;
struct widedbcs_index {
- const ucs4_t *map;
+ const Py_UCS4 *map;
unsigned char bottom, top;
};
typedef struct widedbcs_index widedecode_map;
@@ -56,7 +56,7 @@ struct dbcs_map {
};
struct pair_encodemap {
- ucs4_t uniseq;
+ Py_UCS4 uniseq;
DBCHAR code;
};
@@ -72,7 +72,8 @@ static const struct dbcs_map *mapping_list;
#define ENCODER(encoding) \
static Py_ssize_t encoding##_encode( \
MultibyteCodec_State *state, const void *config, \
- const Py_UNICODE **inbuf, Py_ssize_t inleft, \
+ int kind, void *data, \
+ Py_ssize_t *inpos, Py_ssize_t inlen, \
unsigned char **outbuf, Py_ssize_t outleft, int flags)
#define ENCODER_RESET(encoding) \
static Py_ssize_t encoding##_encode_reset( \
@@ -86,28 +87,30 @@ static const struct dbcs_map *mapping_list;
static Py_ssize_t encoding##_decode( \
MultibyteCodec_State *state, const void *config, \
const unsigned char **inbuf, Py_ssize_t inleft, \
- Py_UNICODE **outbuf, Py_ssize_t outleft)
+ _PyUnicodeWriter *writer)
#define DECODER_RESET(encoding) \
static Py_ssize_t encoding##_decode_reset( \
MultibyteCodec_State *state, const void *config)
-#if Py_UNICODE_SIZE == 4
-#define UCS4INVALID(code) \
- if ((code) > 0xFFFF) \
- return 1;
-#else
-#define UCS4INVALID(code) \
- if (0) ;
-#endif
-
#define NEXT_IN(i) \
- (*inbuf) += (i); \
- (inleft) -= (i);
+ do { \
+ (*inbuf) += (i); \
+ (inleft) -= (i); \
+ } while (0)
+#define NEXT_INCHAR(i) \
+ do { \
+ (*inpos) += (i); \
+ } while (0)
#define NEXT_OUT(o) \
- (*outbuf) += (o); \
- (outleft) -= (o);
+ do { \
+ (*outbuf) += (o); \
+ (outleft) -= (o); \
+ } while (0)
#define NEXT(i, o) \
- NEXT_IN(i) NEXT_OUT(o)
+ do { \
+ NEXT_INCHAR(i); \
+ NEXT_OUT(o); \
+ } while (0)
#define REQUIRE_INBUF(n) \
if (inleft < (n)) \
@@ -116,48 +119,55 @@ static const struct dbcs_map *mapping_list;
if (outleft < (n)) \
return MBERR_TOOSMALL;
-#define IN1 ((*inbuf)[0])
-#define IN2 ((*inbuf)[1])
-#define IN3 ((*inbuf)[2])
-#define IN4 ((*inbuf)[3])
-
-#define OUT1(c) ((*outbuf)[0]) = (c);
-#define OUT2(c) ((*outbuf)[1]) = (c);
-#define OUT3(c) ((*outbuf)[2]) = (c);
-#define OUT4(c) ((*outbuf)[3]) = (c);
-
-#define WRITE1(c1) \
+#define INBYTE1 ((*inbuf)[0])
+#define INBYTE2 ((*inbuf)[1])
+#define INBYTE3 ((*inbuf)[2])
+#define INBYTE4 ((*inbuf)[3])
+
+#define INCHAR1 PyUnicode_READ(kind, data, *inpos)
+#define INCHAR2 PyUnicode_READ(kind, data, *inpos + 1)
+
+#define OUTCHAR(c) \
+ do { \
+ if (_PyUnicodeWriter_WriteChar(writer, (c)) < 0) \
+ return MBERR_EXCEPTION; \
+ } while (0)
+
+#define OUTCHAR2(c1, c2) \
+ do { \
+ Py_UCS4 _c1 = (c1); \
+ Py_UCS4 _c2 = (c2); \
+ if (_PyUnicodeWriter_Prepare(writer, 2, Py_MAX(_c1, c2)) < 0) \
+ return MBERR_EXCEPTION; \
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, _c1); \
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos + 1, _c2); \
+ writer->pos += 2; \
+ } while (0)
+
+#define OUTBYTE1(c) ((*outbuf)[0]) = (c);
+#define OUTBYTE2(c) ((*outbuf)[1]) = (c);
+#define OUTBYTE3(c) ((*outbuf)[2]) = (c);
+#define OUTBYTE4(c) ((*outbuf)[3]) = (c);
+
+#define WRITEBYTE1(c1) \
REQUIRE_OUTBUF(1) \
(*outbuf)[0] = (c1);
-#define WRITE2(c1, c2) \
+#define WRITEBYTE2(c1, c2) \
REQUIRE_OUTBUF(2) \
(*outbuf)[0] = (c1); \
(*outbuf)[1] = (c2);
-#define WRITE3(c1, c2, c3) \
+#define WRITEBYTE3(c1, c2, c3) \
REQUIRE_OUTBUF(3) \
(*outbuf)[0] = (c1); \
(*outbuf)[1] = (c2); \
(*outbuf)[2] = (c3);
-#define WRITE4(c1, c2, c3, c4) \
+#define WRITEBYTE4(c1, c2, c3, c4) \
REQUIRE_OUTBUF(4) \
(*outbuf)[0] = (c1); \
(*outbuf)[1] = (c2); \
(*outbuf)[2] = (c3); \
(*outbuf)[3] = (c4);
-#if Py_UNICODE_SIZE == 2
-# define WRITEUCS4(c) \
- REQUIRE_OUTBUF(2) \
- (*outbuf)[0] = 0xd800 + (((c) - 0x10000) >> 10); \
- (*outbuf)[1] = 0xdc00 + (((c) - 0x10000) & 0x3ff); \
- NEXT_OUT(2)
-#else
-# define WRITEUCS4(c) \
- REQUIRE_OUTBUF(1) \
- **outbuf = (Py_UNICODE)(c); \
- NEXT_OUT(1)
-#endif
-
#define _TRYMAP_ENC(m, assi, val) \
((m)->map != NULL && (val) >= (m)->bottom && \
(val)<= (m)->top && ((assi) = (m)->map[(val) - \
@@ -167,39 +177,41 @@ static const struct dbcs_map *mapping_list;
#define TRYMAP_ENC(charset, assi, uni) \
if TRYMAP_ENC_COND(charset, assi, uni)
-#define _TRYMAP_DEC(m, assi, val) \
- ((m)->map != NULL && (val) >= (m)->bottom && \
- (val)<= (m)->top && ((assi) = (m)->map[(val) - \
- (m)->bottom]) != UNIINV)
-#define TRYMAP_DEC(charset, assi, c1, c2) \
- if _TRYMAP_DEC(&charset##_decmap[c1], assi, c2)
+Py_LOCAL_INLINE(int)
+_TRYMAP_DEC_WRITE(_PyUnicodeWriter *writer, Py_UCS4 c)
+{
+ if (c == UNIINV || _PyUnicodeWriter_WriteChar(writer, c) < 0)
+ return UNIINV;
+ else
+ return c;
+}
-#define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val) \
- ((m)->map != NULL && (val) >= (m)->bottom && \
- (val)<= (m)->top && \
- ((assplane) = (m)->map[((val) - (m)->bottom)*3]) != 0 && \
+#define _TRYMAP_DEC(m, writer, val) \
+ ((m)->map != NULL && \
+ (val) >= (m)->bottom && \
+ (val)<= (m)->top && \
+ _TRYMAP_DEC_WRITE(writer, (m)->map[(val) - (m)->bottom]) != UNIINV)
+#define _TRYMAP_DEC_CHAR(m, assi, val) \
+ ((m)->map != NULL && \
+ (val) >= (m)->bottom && \
+ (val)<= (m)->top && \
+ ((assi) = (m)->map[(val) - (m)->bottom]) != UNIINV)
+#define TRYMAP_DEC(charset, writer, c1, c2) \
+ if _TRYMAP_DEC(&charset##_decmap[c1], writer, c2)
+#define TRYMAP_DEC_CHAR(charset, assi, c1, c2) \
+ if _TRYMAP_DEC_CHAR(&charset##_decmap[c1], assi, c2)
+
+#define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val) \
+ ((m)->map != NULL && (val) >= (m)->bottom && \
+ (val)<= (m)->top && \
+ ((assplane) = (m)->map[((val) - (m)->bottom)*3]) != 0 && \
(((asshi) = (m)->map[((val) - (m)->bottom)*3 + 1]), 1) && \
(((asslo) = (m)->map[((val) - (m)->bottom)*3 + 2]), 1))
#define TRYMAP_ENC_MPLANE(charset, assplane, asshi, asslo, uni) \
if _TRYMAP_ENC_MPLANE(&charset##_encmap[(uni) >> 8], \
assplane, asshi, asslo, (uni) & 0xff)
-#define TRYMAP_DEC_MPLANE(charset, assi, plane, c1, c2) \
- if _TRYMAP_DEC(&charset##_decmap[plane][c1], assi, c2)
-
-#if Py_UNICODE_SIZE == 2
-#define DECODE_SURROGATE(c) \
- if (c >> 10 == 0xd800 >> 10) { /* high surrogate */ \
- REQUIRE_INBUF(2) \
- if (IN2 >> 10 == 0xdc00 >> 10) { /* low surrogate */ \
- c = 0x10000 + ((ucs4_t)(c - 0xd800) << 10) + \
- ((ucs4_t)(IN2) - 0xdc00); \
- } \
- }
-#define GET_INSIZE(c) ((c) > 0xffff ? 2 : 1)
-#else
-#define DECODE_SURROGATE(c) {;}
-#define GET_INSIZE(c) 1
-#endif
+#define TRYMAP_DEC_MPLANE(charset, writer, plane, c1, c2) \
+ if _TRYMAP_DEC(&charset##_decmap[plane][c1], writer, c2)
#define BEGIN_MAPPINGS_LIST static const struct dbcs_map _mapping_list[] = {
#define MAPPING_ENCONLY(enc) {#enc, (void*)enc##_encmap, NULL},
@@ -324,7 +336,7 @@ find_pairencmap(ucs2_t body, ucs2_t modifier,
const struct pair_encodemap *haystack, int haystacksize)
{
int pos, min, max;
- ucs4_t value = body << 16 | modifier;
+ Py_UCS4 value = body << 16 | modifier;
min = 0;
max = haystacksize;
diff --git a/Modules/cjkcodecs/emu_jisx0213_2000.h b/Modules/cjkcodecs/emu_jisx0213_2000.h
index 4227fb2..877337e 100644
--- a/Modules/cjkcodecs/emu_jisx0213_2000.h
+++ b/Modules/cjkcodecs/emu_jisx0213_2000.h
@@ -38,6 +38,9 @@
((c1) == 0x7E && (c2) == 0x7E))) \
return EMULATE_JISX0213_2000_DECODE_INVALID;
-#define EMULATE_JISX0213_2000_DECODE_PLANE2(assi, c1, c2) \
+#define EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c1, c2) \
+ if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B) \
+ OUTCHAR(0x9B1D);
+#define EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(assi, c1, c2) \
if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B) \
(assi) = 0x9B1D;
diff --git a/Modules/cjkcodecs/mappings_cn.h b/Modules/cjkcodecs/mappings_cn.h
index a6dcebf..1f8c299 100644
--- a/Modules/cjkcodecs/mappings_cn.h
+++ b/Modules/cjkcodecs/mappings_cn.h
@@ -4049,7 +4049,7 @@ __gb18030ext_encmap+3126,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
static const struct _gb18030_to_unibmp_ranges {
- Py_UNICODE first, last;
+ Py_UCS4 first, last;
DBCHAR base;
} gb18030_to_unibmp_ranges[] = {
{128,163,0},{165,166,36},{169,175,38},{178,182,45},{184,214,50},{216,223,81},{
diff --git a/Modules/cjkcodecs/mappings_jisx0213_pair.h b/Modules/cjkcodecs/mappings_jisx0213_pair.h
index eda8e9e..729e4bc 100644
--- a/Modules/cjkcodecs/mappings_jisx0213_pair.h
+++ b/Modules/cjkcodecs/mappings_jisx0213_pair.h
@@ -3,7 +3,7 @@
static const struct widedbcs_index *jisx0213_pair_decmap;
static const struct pair_encodemap *jisx0213_pair_encmap;
#else
-static const ucs4_t __jisx0213_pair_decmap[49] = {
+static const Py_UCS4 __jisx0213_pair_decmap[49] = {
810234010,810365082,810496154,810627226,810758298,816525466,816656538,
816787610,816918682,817049754,817574042,818163866,818426010,838283418,
15074048,U,U,U,39060224,39060225,42730240,42730241,39387904,39387905,39453440,
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index c032cdb..3c5173f 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -10,15 +10,16 @@
#include "multibytecodec.h"
typedef struct {
- const Py_UNICODE *inbuf, *inbuf_top, *inbuf_end;
+ PyObject *inobj;
+ Py_ssize_t inpos, inlen;
unsigned char *outbuf, *outbuf_end;
PyObject *excobj, *outobj;
} MultibyteEncodeBuffer;
typedef struct {
const unsigned char *inbuf, *inbuf_top, *inbuf_end;
- Py_UNICODE *outbuf, *outbuf_end;
- PyObject *excobj, *outobj;
+ PyObject *excobj;
+ _PyUnicodeWriter writer;
} MultibyteDecodeBuffer;
PyDoc_STRVAR(MultibyteCodec_Encode__doc__,
@@ -45,7 +46,7 @@ static char *incrementalkwarglist[] = {"input", "final", NULL};
static char *streamkwarglist[] = {"stream", "errors", NULL};
static PyObject *multibytecodec_encode(MultibyteCodec *,
- MultibyteCodec_State *, const Py_UNICODE **, Py_ssize_t,
+ MultibyteCodec_State *, PyObject *, Py_ssize_t *,
PyObject *, int);
#define MBENC_RESET MBENC_MAX<<1 /* reset after an encoding session */
@@ -197,29 +198,6 @@ expand_encodebuffer(MultibyteEncodeBuffer *buf, Py_ssize_t esize)
goto errorexit; \
}
-static int
-expand_decodebuffer(MultibyteDecodeBuffer *buf, Py_ssize_t esize)
-{
- Py_ssize_t orgpos, orgsize;
-
- orgpos = (Py_ssize_t)(buf->outbuf - PyUnicode_AS_UNICODE(buf->outobj));
- orgsize = PyUnicode_GET_SIZE(buf->outobj);
- if (PyUnicode_Resize(&buf->outobj, orgsize + (
- esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize)) == -1)
- return -1;
-
- buf->outbuf = PyUnicode_AS_UNICODE(buf->outobj) + orgpos;
- buf->outbuf_end = PyUnicode_AS_UNICODE(buf->outobj)
- + PyUnicode_GET_SIZE(buf->outobj);
-
- return 0;
-}
-#define REQUIRE_DECODEBUFFER(buf, s) { \
- if ((s) < 1 || (buf)->outbuf + (s) > (buf)->outbuf_end) \
- if (expand_decodebuffer(buf, s) == -1) \
- goto errorexit; \
-}
-
/**
* MultibyteCodec object
@@ -247,7 +225,7 @@ multibytecodec_encerror(MultibyteCodec *codec,
return 0; /* retry it */
case MBERR_TOOFEW:
reason = "incomplete multibyte sequence";
- esize = (Py_ssize_t)(buf->inbuf_end - buf->inbuf);
+ esize = (Py_ssize_t)buf->inpos;
break;
case MBERR_INTERNAL:
PyErr_SetString(PyExc_RuntimeError,
@@ -261,14 +239,24 @@ multibytecodec_encerror(MultibyteCodec *codec,
}
if (errors == ERROR_REPLACE) {
- const Py_UNICODE replchar = '?', *inbuf = &replchar;
+ PyObject *replchar;
Py_ssize_t r;
+ Py_ssize_t inpos;
+ int kind;
+ void *data;
+
+ replchar = PyUnicode_FromOrdinal('?');
+ if (replchar == NULL)
+ goto errorexit;
+ kind = PyUnicode_KIND(replchar);
+ data = PyUnicode_DATA(replchar);
+ inpos = 0;
for (;;) {
- Py_ssize_t outleft;
+ Py_ssize_t outleft = (Py_ssize_t)(buf->outbuf_end - buf->outbuf);
- outleft = (Py_ssize_t)(buf->outbuf_end - buf->outbuf);
- r = codec->encode(state, codec->config, &inbuf, 1,
+ r = codec->encode(state, codec->config,
+ kind, data, &inpos, 1,
&buf->outbuf, outleft, 0);
if (r == MBERR_TOOSMALL) {
REQUIRE_ENCODEBUFFER(buf, -1);
@@ -278,25 +266,27 @@ multibytecodec_encerror(MultibyteCodec *codec,
break;
}
+ Py_DECREF(replchar);
+
if (r != 0) {
REQUIRE_ENCODEBUFFER(buf, 1);
*buf->outbuf++ = '?';
}
}
if (errors == ERROR_IGNORE || errors == ERROR_REPLACE) {
- buf->inbuf += esize;
+ buf->inpos += esize;
return 0;
}
- start = (Py_ssize_t)(buf->inbuf - buf->inbuf_top);
+ start = (Py_ssize_t)buf->inpos;
end = start + esize;
/* use cached exception object if available */
if (buf->excobj == NULL) {
- buf->excobj = PyUnicodeEncodeError_Create(codec->encoding,
- buf->inbuf_top,
- buf->inbuf_end - buf->inbuf_top,
- start, end, reason);
+ buf->excobj = PyObject_CallFunction(PyExc_UnicodeEncodeError,
+ "sOnns",
+ codec->encoding, buf->inobj,
+ start, end, reason);
if (buf->excobj == NULL)
goto errorexit;
}
@@ -325,10 +315,10 @@ multibytecodec_encerror(MultibyteCodec *codec,
}
if (PyUnicode_Check(tobj)) {
- const Py_UNICODE *uraw = PyUnicode_AS_UNICODE(tobj);
+ Py_ssize_t inpos;
- retstr = multibytecodec_encode(codec, state, &uraw,
- PyUnicode_GET_SIZE(tobj), ERROR_STRICT,
+ retstr = multibytecodec_encode(codec, state, tobj,
+ &inpos, ERROR_STRICT,
MBENC_FLUSH);
if (retstr == NULL)
goto errorexit;
@@ -347,15 +337,15 @@ multibytecodec_encerror(MultibyteCodec *codec,
newpos = PyLong_AsSsize_t(PyTuple_GET_ITEM(retobj, 1));
if (newpos < 0 && !PyErr_Occurred())
- newpos += (Py_ssize_t)(buf->inbuf_end - buf->inbuf_top);
- if (newpos < 0 || buf->inbuf_top + newpos > buf->inbuf_end) {
+ newpos += (Py_ssize_t)buf->inlen;
+ if (newpos < 0 || newpos > buf->inlen) {
PyErr_Clear();
PyErr_Format(PyExc_IndexError,
"position %zd from error handler out of bounds",
newpos);
goto errorexit;
}
- buf->inbuf = buf->inbuf_top + newpos;
+ buf->inpos = newpos;
Py_DECREF(retobj);
Py_DECREF(retstr);
@@ -374,7 +364,7 @@ multibytecodec_decerror(MultibyteCodec *codec,
PyObject *errors, Py_ssize_t e)
{
PyObject *retobj = NULL, *retuni = NULL;
- Py_ssize_t retunisize, newpos;
+ Py_ssize_t newpos;
const char *reason;
Py_ssize_t esize, start, end;
@@ -385,7 +375,6 @@ multibytecodec_decerror(MultibyteCodec *codec,
else {
switch (e) {
case MBERR_TOOSMALL:
- REQUIRE_DECODEBUFFER(buf, -1);
return 0; /* retry it */
case MBERR_TOOFEW:
reason = "incomplete multibyte sequence";
@@ -395,6 +384,8 @@ multibytecodec_decerror(MultibyteCodec *codec,
PyErr_SetString(PyExc_RuntimeError,
"internal codec error");
return -1;
+ case MBERR_EXCEPTION:
+ return -1;
default:
PyErr_SetString(PyExc_RuntimeError,
"unknown runtime error");
@@ -403,8 +394,9 @@ multibytecodec_decerror(MultibyteCodec *codec,
}
if (errors == ERROR_REPLACE) {
- REQUIRE_DECODEBUFFER(buf, 1);
- *buf->outbuf++ = Py_UNICODE_REPLACEMENT_CHARACTER;
+ if (_PyUnicodeWriter_WriteChar(&buf->writer,
+ Py_UNICODE_REPLACEMENT_CHARACTER) < 0)
+ goto errorexit;
}
if (errors == ERROR_IGNORE || errors == ERROR_REPLACE) {
buf->inbuf += esize;
@@ -447,15 +439,8 @@ multibytecodec_decerror(MultibyteCodec *codec,
goto errorexit;
}
- if (PyUnicode_AsUnicode(retuni) == NULL)
+ if (_PyUnicodeWriter_WriteStr(&buf->writer, retuni) < 0)
goto errorexit;
- retunisize = PyUnicode_GET_SIZE(retuni);
- if (retunisize > 0) {
- REQUIRE_DECODEBUFFER(buf, retunisize);
- memcpy((char *)buf->outbuf, PyUnicode_AS_UNICODE(retuni),
- retunisize * Py_UNICODE_SIZE);
- buf->outbuf += retunisize;
- }
newpos = PyLong_AsSsize_t(PyTuple_GET_ITEM(retobj, 1));
if (newpos < 0 && !PyErr_Occurred())
@@ -479,19 +464,29 @@ errorexit:
static PyObject *
multibytecodec_encode(MultibyteCodec *codec,
MultibyteCodec_State *state,
- const Py_UNICODE **data, Py_ssize_t datalen,
+ PyObject *text, Py_ssize_t *inpos_t,
PyObject *errors, int flags)
{
MultibyteEncodeBuffer buf;
Py_ssize_t finalsize, r = 0;
+ Py_ssize_t datalen;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(text) < 0)
+ return NULL;
+ datalen = PyUnicode_GET_LENGTH(text);
if (datalen == 0 && !(flags & MBENC_RESET))
return PyBytes_FromStringAndSize(NULL, 0);
buf.excobj = NULL;
buf.outobj = NULL;
- buf.inbuf = buf.inbuf_top = *data;
- buf.inbuf_end = buf.inbuf_top + datalen;
+ buf.inobj = text; /* borrowed reference */
+ buf.inpos = 0;
+ buf.inlen = datalen;
+ kind = PyUnicode_KIND(buf.inobj);
+ data = PyUnicode_DATA(buf.inobj);
if (datalen > (PY_SSIZE_T_MAX - 16) / 2) {
PyErr_NoMemory();
@@ -504,14 +499,14 @@ multibytecodec_encode(MultibyteCodec *codec,
buf.outbuf = (unsigned char *)PyBytes_AS_STRING(buf.outobj);
buf.outbuf_end = buf.outbuf + PyBytes_GET_SIZE(buf.outobj);
- while (buf.inbuf < buf.inbuf_end) {
- Py_ssize_t inleft, outleft;
-
+ while (buf.inpos < buf.inlen) {
/* we don't reuse inleft and outleft here.
* error callbacks can relocate the cursor anywhere on buffer*/
- inleft = (Py_ssize_t)(buf.inbuf_end - buf.inbuf);
- outleft = (Py_ssize_t)(buf.outbuf_end - buf.outbuf);
- r = codec->encode(state, codec->config, &buf.inbuf, inleft,
+ Py_ssize_t outleft = (Py_ssize_t)(buf.outbuf_end - buf.outbuf);
+
+ r = codec->encode(state, codec->config,
+ kind, data,
+ &buf.inpos, buf.inlen,
&buf.outbuf, outleft, flags);
if ((r == 0) || (r == MBERR_TOOFEW && !(flags & MBENC_FLUSH)))
break;
@@ -542,7 +537,8 @@ multibytecodec_encode(MultibyteCodec *codec,
if (_PyBytes_Resize(&buf.outobj, finalsize) == -1)
goto errorexit;
- *data = buf.inbuf;
+ if (inpos_t)
+ *inpos_t = buf.inpos;
Py_XDECREF(buf.excobj);
return buf.outobj;
@@ -557,7 +553,6 @@ MultibyteCodec_Encode(MultibyteCodecObject *self,
PyObject *args, PyObject *kwargs)
{
MultibyteCodec_State state;
- Py_UNICODE *data;
PyObject *errorcb, *r, *arg, *ucvt;
const char *errors = NULL;
Py_ssize_t datalen;
@@ -580,11 +575,11 @@ MultibyteCodec_Encode(MultibyteCodecObject *self,
}
}
- data = PyUnicode_AsUnicodeAndSize(arg, &datalen);
- if (data == NULL) {
+ if (PyUnicode_READY(arg) < 0) {
Py_XDECREF(ucvt);
return NULL;
}
+ datalen = PyUnicode_GET_LENGTH(arg);
errorcb = internal_error_callback(errors);
if (errorcb == NULL) {
@@ -596,7 +591,7 @@ MultibyteCodec_Encode(MultibyteCodecObject *self,
self->codec->encinit(&state, self->codec->config) != 0)
goto errorexit;
r = multibytecodec_encode(self->codec, &state,
- (const Py_UNICODE **)&data, datalen, errorcb,
+ arg, NULL, errorcb,
MBENC_FLUSH | MBENC_RESET);
if (r == NULL)
goto errorexit;
@@ -617,10 +612,10 @@ MultibyteCodec_Decode(MultibyteCodecObject *self,
{
MultibyteCodec_State state;
MultibyteDecodeBuffer buf;
- PyObject *errorcb;
+ PyObject *errorcb, *res;
Py_buffer pdata;
const char *data, *errors = NULL;
- Py_ssize_t datalen, finalsize;
+ Py_ssize_t datalen;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|z:decode",
codeckwarglist, &pdata, &errors))
@@ -640,29 +635,23 @@ MultibyteCodec_Decode(MultibyteCodecObject *self,
return make_tuple(PyUnicode_New(0, 0), 0);
}
+ _PyUnicodeWriter_Init(&buf.writer);
+ buf.writer.min_length = datalen;
buf.excobj = NULL;
buf.inbuf = buf.inbuf_top = (unsigned char *)data;
buf.inbuf_end = buf.inbuf_top + datalen;
- buf.outobj = PyUnicode_FromUnicode(NULL, datalen);
- if (buf.outobj == NULL)
- goto errorexit;
- buf.outbuf = PyUnicode_AS_UNICODE(buf.outobj);
- if (buf.outbuf == NULL)
- goto errorexit;
- buf.outbuf_end = buf.outbuf + PyUnicode_GET_SIZE(buf.outobj);
if (self->codec->decinit != NULL &&
self->codec->decinit(&state, self->codec->config) != 0)
goto errorexit;
while (buf.inbuf < buf.inbuf_end) {
- Py_ssize_t inleft, outleft, r;
+ Py_ssize_t inleft, r;
inleft = (Py_ssize_t)(buf.inbuf_end - buf.inbuf);
- outleft = (Py_ssize_t)(buf.outbuf_end - buf.outbuf);
r = self->codec->decode(&state, self->codec->config,
- &buf.inbuf, inleft, &buf.outbuf, outleft);
+ &buf.inbuf, inleft, &buf.writer);
if (r == 0)
break;
else if (multibytecodec_decerror(self->codec, &state,
@@ -670,23 +659,20 @@ MultibyteCodec_Decode(MultibyteCodecObject *self,
goto errorexit;
}
- finalsize = (Py_ssize_t)(buf.outbuf -
- PyUnicode_AS_UNICODE(buf.outobj));
-
- if (finalsize != PyUnicode_GET_SIZE(buf.outobj))
- if (PyUnicode_Resize(&buf.outobj, finalsize) == -1)
- goto errorexit;
+ res = _PyUnicodeWriter_Finish(&buf.writer);
+ if (res == NULL)
+ goto errorexit;
PyBuffer_Release(&pdata);
Py_XDECREF(buf.excobj);
ERROR_DECREF(errorcb);
- return make_tuple(buf.outobj, datalen);
+ return make_tuple(res, datalen);
errorexit:
PyBuffer_Release(&pdata);
ERROR_DECREF(errorcb);
Py_XDECREF(buf.excobj);
- Py_XDECREF(buf.outobj);
+ _PyUnicodeWriter_Dealloc(&buf.writer);
return NULL;
}
@@ -752,9 +738,9 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
PyObject *unistr, int final)
{
PyObject *ucvt, *r = NULL;
- Py_UNICODE *inbuf, *inbuf_end, *inbuf_tmp = NULL;
- Py_ssize_t datalen, origpending;
- wchar_t *data;
+ PyObject *inbuf = NULL;
+ Py_ssize_t inpos, datalen;
+ PyObject *origpending = NULL;
if (PyUnicode_Check(unistr))
ucvt = NULL;
@@ -770,69 +756,66 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
}
}
- data = PyUnicode_AsUnicodeAndSize(unistr, &datalen);
- if (data == NULL)
- goto errorexit;
- origpending = ctx->pendingsize;
+ if (ctx->pending) {
+ PyObject *inbuf_tmp;
- if (origpending > 0) {
- if (datalen > PY_SSIZE_T_MAX - ctx->pendingsize) {
- PyErr_NoMemory();
- /* inbuf_tmp == NULL */
- goto errorexit;
- }
- inbuf_tmp = PyMem_New(Py_UNICODE, datalen + ctx->pendingsize);
+ Py_INCREF(ctx->pending);
+ origpending = ctx->pending;
+
+ Py_INCREF(ctx->pending);
+ inbuf_tmp = ctx->pending;
+ PyUnicode_Append(&inbuf_tmp, unistr);
if (inbuf_tmp == NULL)
goto errorexit;
- memcpy(inbuf_tmp, ctx->pending,
- Py_UNICODE_SIZE * ctx->pendingsize);
- memcpy(inbuf_tmp + ctx->pendingsize,
- PyUnicode_AS_UNICODE(unistr),
- Py_UNICODE_SIZE * datalen);
- datalen += ctx->pendingsize;
- ctx->pendingsize = 0;
+ Py_CLEAR(ctx->pending);
inbuf = inbuf_tmp;
}
- else
- inbuf = (Py_UNICODE *)PyUnicode_AS_UNICODE(unistr);
+ else {
+ origpending = NULL;
- inbuf_end = inbuf + datalen;
+ Py_INCREF(unistr);
+ inbuf = unistr;
+ }
+ if (PyUnicode_READY(inbuf) < 0)
+ goto errorexit;
+ inpos = 0;
+ datalen = PyUnicode_GET_LENGTH(inbuf);
r = multibytecodec_encode(ctx->codec, &ctx->state,
- (const Py_UNICODE **)&inbuf, datalen,
- ctx->errors, final ? MBENC_FLUSH | MBENC_RESET : 0);
+ inbuf, &inpos,
+ ctx->errors, final ? MBENC_FLUSH | MBENC_RESET : 0);
if (r == NULL) {
/* recover the original pending buffer */
- if (origpending > 0)
- memcpy(ctx->pending, inbuf_tmp,
- Py_UNICODE_SIZE * origpending);
- ctx->pendingsize = origpending;
+ Py_CLEAR(ctx->pending);
+ ctx->pending = origpending;
+ origpending = NULL;
goto errorexit;
}
+ Py_XDECREF(origpending);
- if (inbuf < inbuf_end) {
- ctx->pendingsize = (Py_ssize_t)(inbuf_end - inbuf);
- if (ctx->pendingsize > MAXENCPENDING) {
+ if (inpos < datalen) {
+ if (datalen - inpos > MAXENCPENDING) {
/* normal codecs can't reach here */
- ctx->pendingsize = 0;
PyErr_SetString(PyExc_UnicodeError,
"pending buffer overflow");
goto errorexit;
}
- memcpy(ctx->pending, inbuf,
- ctx->pendingsize * Py_UNICODE_SIZE);
+ ctx->pending = PyUnicode_Substring(inbuf, inpos, datalen);
+ if (ctx->pending == NULL) {
+ /* normal codecs can't reach here */
+ goto errorexit;
+ }
}
- if (inbuf_tmp != NULL)
- PyMem_Del(inbuf_tmp);
+ Py_DECREF(inbuf);
Py_XDECREF(ucvt);
return r;
errorexit:
- if (inbuf_tmp != NULL)
- PyMem_Del(inbuf_tmp);
Py_XDECREF(r);
Py_XDECREF(ucvt);
+ Py_XDECREF(origpending);
+ Py_XDECREF(inbuf);
return NULL;
}
@@ -859,17 +842,7 @@ decoder_prepare_buffer(MultibyteDecodeBuffer *buf, const char *data,
{
buf->inbuf = buf->inbuf_top = (const unsigned char *)data;
buf->inbuf_end = buf->inbuf_top + size;
- if (buf->outobj == NULL) { /* only if outobj is not allocated yet */
- buf->outobj = PyUnicode_FromUnicode(NULL, size);
- if (buf->outobj == NULL)
- return -1;
- buf->outbuf = PyUnicode_AsUnicode(buf->outobj);
- if (buf->outbuf == NULL)
- return -1;
- buf->outbuf_end = buf->outbuf +
- PyUnicode_GET_SIZE(buf->outobj);
- }
-
+ buf->writer.min_length += size;
return 0;
}
@@ -878,14 +851,13 @@ decoder_feed_buffer(MultibyteStatefulDecoderContext *ctx,
MultibyteDecodeBuffer *buf)
{
while (buf->inbuf < buf->inbuf_end) {
- Py_ssize_t inleft, outleft;
+ Py_ssize_t inleft;
Py_ssize_t r;
inleft = (Py_ssize_t)(buf->inbuf_end - buf->inbuf);
- outleft = (Py_ssize_t)(buf->outbuf_end - buf->outbuf);
r = ctx->codec->decode(&ctx->state, ctx->codec->config,
- &buf->inbuf, inleft, &buf->outbuf, outleft);
+ &buf->inbuf, inleft, &buf->writer);
if (r == 0 || r == MBERR_TOOFEW)
break;
else if (multibytecodec_decerror(ctx->codec, &ctx->state,
@@ -927,7 +899,7 @@ mbiencoder_reset(MultibyteIncrementalEncoderObject *self)
if (r != 0)
return NULL;
}
- self->pendingsize = 0;
+ Py_CLEAR(self->pending);
Py_RETURN_NONE;
}
@@ -963,7 +935,7 @@ mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
self->codec = ((MultibyteCodecObject *)codec)->codec;
- self->pendingsize = 0;
+ self->pending = NULL;
self->errors = internal_error_callback(errors);
if (self->errors == NULL)
goto errorexit;
@@ -1058,8 +1030,9 @@ mbidecoder_decode(MultibyteIncrementalDecoderObject *self,
MultibyteDecodeBuffer buf;
char *data, *wdata = NULL;
Py_buffer pdata;
- Py_ssize_t wsize, finalsize = 0, size, origpending;
+ Py_ssize_t wsize, size, origpending;
int final = 0;
+ PyObject *res;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i:decode",
incrementalkwarglist, &pdata, &final))
@@ -1067,7 +1040,8 @@ mbidecoder_decode(MultibyteIncrementalDecoderObject *self,
data = pdata.buf;
size = pdata.len;
- buf.outobj = buf.excobj = NULL;
+ _PyUnicodeWriter_Init(&buf.writer);
+ buf.excobj = NULL;
origpending = self->pendingsize;
if (self->pendingsize == 0) {
@@ -1081,8 +1055,10 @@ mbidecoder_decode(MultibyteIncrementalDecoderObject *self,
}
wsize = size + self->pendingsize;
wdata = PyMem_Malloc(wsize);
- if (wdata == NULL)
+ if (wdata == NULL) {
+ PyErr_NoMemory();
goto errorexit;
+ }
memcpy(wdata, self->pending, self->pendingsize);
memcpy(wdata + self->pendingsize, data, size);
self->pendingsize = 0;
@@ -1109,23 +1085,22 @@ mbidecoder_decode(MultibyteIncrementalDecoderObject *self,
goto errorexit;
}
- finalsize = (Py_ssize_t)(buf.outbuf - PyUnicode_AS_UNICODE(buf.outobj));
- if (finalsize != PyUnicode_GET_SIZE(buf.outobj))
- if (PyUnicode_Resize(&buf.outobj, finalsize) == -1)
- goto errorexit;
+ res = _PyUnicodeWriter_Finish(&buf.writer);
+ if (res == NULL)
+ goto errorexit;
PyBuffer_Release(&pdata);
if (wdata != data)
PyMem_Del(wdata);
Py_XDECREF(buf.excobj);
- return buf.outobj;
+ return res;
errorexit:
PyBuffer_Release(&pdata);
if (wdata != NULL && wdata != data)
PyMem_Del(wdata);
Py_XDECREF(buf.excobj);
- Py_XDECREF(buf.outobj);
+ _PyUnicodeWriter_Dealloc(&buf.writer);
return NULL;
}
@@ -1265,13 +1240,14 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self,
const char *method, Py_ssize_t sizehint)
{
MultibyteDecodeBuffer buf;
- PyObject *cres;
- Py_ssize_t rsize, finalsize = 0;
+ PyObject *cres, *res;
+ Py_ssize_t rsize;
if (sizehint == 0)
return PyUnicode_New(0, 0);
- buf.outobj = buf.excobj = NULL;
+ _PyUnicodeWriter_Init(&buf.writer);
+ buf.excobj = NULL;
cres = NULL;
for (;;) {
@@ -1303,19 +1279,19 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self,
if (PyBytes_GET_SIZE(cres) > PY_SSIZE_T_MAX - self->pendingsize) {
PyErr_NoMemory();
goto errorexit;
- }
- rsize = PyBytes_GET_SIZE(cres) + self->pendingsize;
- ctr = PyBytes_FromStringAndSize(NULL, rsize);
- if (ctr == NULL)
- goto errorexit;
- ctrdata = PyBytes_AS_STRING(ctr);
- memcpy(ctrdata, self->pending, self->pendingsize);
- memcpy(ctrdata + self->pendingsize,
- PyBytes_AS_STRING(cres),
- PyBytes_GET_SIZE(cres));
- Py_DECREF(cres);
- cres = ctr;
- self->pendingsize = 0;
+ }
+ rsize = PyBytes_GET_SIZE(cres) + self->pendingsize;
+ ctr = PyBytes_FromStringAndSize(NULL, rsize);
+ if (ctr == NULL)
+ goto errorexit;
+ ctrdata = PyBytes_AS_STRING(ctr);
+ memcpy(ctrdata, self->pending, self->pendingsize);
+ memcpy(ctrdata + self->pendingsize,
+ PyBytes_AS_STRING(cres),
+ PyBytes_GET_SIZE(cres));
+ Py_DECREF(cres);
+ cres = ctr;
+ self->pendingsize = 0;
}
rsize = PyBytes_GET_SIZE(cres);
@@ -1340,29 +1316,27 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self,
goto errorexit;
}
- finalsize = (Py_ssize_t)(buf.outbuf -
- PyUnicode_AS_UNICODE(buf.outobj));
Py_DECREF(cres);
cres = NULL;
- if (sizehint < 0 || finalsize != 0 || rsize == 0)
+ if (sizehint < 0 || buf.writer.pos != 0 || rsize == 0)
break;
sizehint = 1; /* read 1 more byte and retry */
}
- if (finalsize != PyUnicode_GET_SIZE(buf.outobj))
- if (PyUnicode_Resize(&buf.outobj, finalsize) == -1)
- goto errorexit;
+ res = _PyUnicodeWriter_Finish(&buf.writer);
+ if (res == NULL)
+ goto errorexit;
Py_XDECREF(cres);
Py_XDECREF(buf.excobj);
- return buf.outobj;
+ return res;
errorexit:
Py_XDECREF(cres);
Py_XDECREF(buf.excobj);
- Py_XDECREF(buf.outobj);
+ _PyUnicodeWriter_Dealloc(&buf.writer);
return NULL;
}
@@ -1649,18 +1623,16 @@ mbstreamwriter_writelines(MultibyteStreamWriterObject *self, PyObject *lines)
static PyObject *
mbstreamwriter_reset(MultibyteStreamWriterObject *self)
{
- const Py_UNICODE *pending;
PyObject *pwrt;
- pending = self->pending;
pwrt = multibytecodec_encode(self->codec, &self->state,
- &pending, self->pendingsize, self->errors,
+ self->pending, NULL, self->errors,
MBENC_FLUSH | MBENC_RESET);
/* some pending buffer can be truncated when UnicodeEncodeError is
* raised on 'strict' mode. but, 'reset' method is designed to
* reset the pending buffer or states so failed string sequence
* ought to be missed */
- self->pendingsize = 0;
+ Py_CLEAR(self->pending);
if (pwrt == NULL)
return NULL;
@@ -1706,7 +1678,7 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self->codec = ((MultibyteCodecObject *)codec)->codec;
self->stream = stream;
Py_INCREF(stream);
- self->pendingsize = 0;
+ self->pending = NULL;
self->errors = internal_error_callback(errors);
if (self->errors == NULL)
goto errorexit;
diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h
index 1b6ef55..7cde8e3 100644
--- a/Modules/cjkcodecs/multibytecodec.h
+++ b/Modules/cjkcodecs/multibytecodec.h
@@ -10,12 +10,6 @@
extern "C" {
#endif
-#ifdef uint32_t
-typedef uint32_t ucs4_t;
-#else
-typedef unsigned int ucs4_t;
-#endif
-
#ifdef uint16_t
typedef uint16_t ucs2_t, DBCHAR;
#else
@@ -27,13 +21,14 @@ typedef union {
int i;
unsigned char c[8];
ucs2_t u2[4];
- ucs4_t u4[2];
+ Py_UCS4 u4[2];
} MultibyteCodec_State;
typedef int (*mbcodec_init)(const void *config);
typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
const void *config,
- const Py_UNICODE **inbuf, Py_ssize_t inleft,
+ int kind, void *data,
+ Py_ssize_t *inpos, Py_ssize_t inlen,
unsigned char **outbuf, Py_ssize_t outleft,
int flags);
typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
@@ -44,7 +39,7 @@ typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
const void *config,
const unsigned char **inbuf, Py_ssize_t inleft,
- Py_UNICODE **outbuf, Py_ssize_t outleft);
+ _PyUnicodeWriter *writer);
typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
const void *config);
typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
@@ -81,8 +76,7 @@ typedef struct {
#define MAXENCPENDING 2
#define _MultibyteStatefulEncoder_HEAD \
_MultibyteStatefulCodec_HEAD \
- Py_UNICODE pending[MAXENCPENDING]; \
- Py_ssize_t pendingsize;
+ PyObject *pending;
typedef struct {
_MultibyteStatefulEncoder_HEAD
} MultibyteStatefulEncoderContext;
@@ -118,6 +112,7 @@ typedef struct {
#define MBERR_TOOSMALL (-1) /* insufficient output buffer space */
#define MBERR_TOOFEW (-2) /* incomplete input buffer */
#define MBERR_INTERNAL (-3) /* internal runtime error */
+#define MBERR_EXCEPTION (-4) /* an exception has been raised */
#define ERROR_STRICT (PyObject *)(1)
#define ERROR_IGNORE (PyObject *)(2)
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index c86a27f..172945d 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -22,7 +22,9 @@
# define FAULTHANDLER_USER
#endif
-#define PUTS(fd, str) write(fd, str, strlen(str))
+/* cast size_t to int because write() takes an int on Windows
+ (anyway, the length is smaller than 30 characters) */
+#define PUTS(fd, str) write(fd, str, (int)strlen(str))
#ifdef HAVE_SIGACTION
typedef struct sigaction _Py_sighandler_t;
@@ -79,9 +81,6 @@ typedef struct {
static user_signal_t *user_signals;
/* the following macros come from Python: Modules/signalmodule.c */
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-#define NSIG 12
-#endif
#ifndef NSIG
# if defined(_NSIG)
# define NSIG _NSIG /* For BSD/SysV */
@@ -448,7 +447,7 @@ faulthandler_thread(void *unused)
/* get the thread holding the GIL, NULL if no thread hold the GIL */
current = _Py_atomic_load_relaxed(&_PyThreadState_Current);
- write(thread.fd, thread.header, thread.header_len);
+ write(thread.fd, thread.header, (int)thread.header_len);
errmsg = _Py_DumpTracebackThreads(thread.fd, thread.interp, current);
ok = (errmsg == NULL);
@@ -476,7 +475,7 @@ cancel_dump_traceback_later(void)
Py_CLEAR(thread.file);
if (thread.header) {
- free(thread.header);
+ PyMem_Free(thread.header);
thread.header = NULL;
}
}
@@ -505,7 +504,7 @@ format_timeout(double timeout)
"Timeout (%lu:%02lu:%02lu)!\n",
hour, min, sec);
- return strdup(buffer);
+ return _PyMem_Strdup(buffer);
}
static PyObject*
@@ -571,7 +570,7 @@ faulthandler_dump_traceback_later(PyObject *self,
if (PyThread_start_new_thread(faulthandler_thread, NULL) == -1) {
PyThread_release_lock(thread.running);
Py_CLEAR(thread.file);
- free(header);
+ PyMem_Free(header);
thread.header = NULL;
PyErr_SetString(PyExc_RuntimeError,
"unable to start watchdog thread");
@@ -730,9 +729,10 @@ faulthandler_register_py(PyObject *self,
return NULL;
if (user_signals == NULL) {
- user_signals = calloc(NSIG, sizeof(user_signal_t));
+ user_signals = PyMem_Malloc(NSIG * sizeof(user_signal_t));
if (user_signals == NULL)
return PyErr_NoMemory();
+ memset(user_signals, 0, NSIG * sizeof(user_signal_t));
}
user = &user_signals[signum];
@@ -1137,7 +1137,7 @@ void _PyFaulthandler_Fini(void)
if (user_signals != NULL) {
for (signum=0; signum < NSIG; signum++)
faulthandler_unregister(&user_signals[signum], signum);
- free(user_signals);
+ PyMem_Free(user_signals);
user_signals = NULL;
}
#endif
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 6b7e3fc..38ef55f 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -325,11 +325,6 @@ fcntl_lockf(PyObject *self, PyObject *args)
&lenobj, &startobj, &whence))
return NULL;
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- PyErr_SetString(PyExc_NotImplementedError,
- "lockf not supported on OS/2 (EMX)");
- return NULL;
-#else
#ifndef LOCK_SH
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
@@ -383,7 +378,6 @@ fcntl_lockf(PyObject *self, PyObject *args)
}
Py_INCREF(Py_None);
return Py_None;
-#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
}
PyDoc_STRVAR(lockf_doc,
@@ -430,188 +424,179 @@ a file or socket object.");
/* Module initialisation */
-static int
-ins(PyObject* d, char* symbol, long value)
-{
- PyObject* v = PyLong_FromLong(value);
- if (!v || PyDict_SetItemString(d, symbol, v) < 0)
- return -1;
-
- Py_DECREF(v);
- return 0;
-}
-
-#define INS(x) if (ins(d, #x, (long)x)) return -1
static int
-all_ins(PyObject* d)
+all_ins(PyObject* m)
{
- if (ins(d, "LOCK_SH", (long)LOCK_SH)) return -1;
- if (ins(d, "LOCK_EX", (long)LOCK_EX)) return -1;
- if (ins(d, "LOCK_NB", (long)LOCK_NB)) return -1;
- if (ins(d, "LOCK_UN", (long)LOCK_UN)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_SH)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_EX)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_NB)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_UN)) return -1;
/* GNU extensions, as of glibc 2.2.4 */
#ifdef LOCK_MAND
- if (ins(d, "LOCK_MAND", (long)LOCK_MAND)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_MAND)) return -1;
#endif
#ifdef LOCK_READ
- if (ins(d, "LOCK_READ", (long)LOCK_READ)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_READ)) return -1;
#endif
#ifdef LOCK_WRITE
- if (ins(d, "LOCK_WRITE", (long)LOCK_WRITE)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_WRITE)) return -1;
#endif
#ifdef LOCK_RW
- if (ins(d, "LOCK_RW", (long)LOCK_RW)) return -1;
+ if (PyModule_AddIntMacro(m, LOCK_RW)) return -1;
#endif
#ifdef F_DUPFD
- if (ins(d, "F_DUPFD", (long)F_DUPFD)) return -1;
+ if (PyModule_AddIntMacro(m, F_DUPFD)) return -1;
+#endif
+#ifdef F_DUPFD_CLOEXEC
+ if (PyModule_AddIntMacro(m, F_DUPFD_CLOEXEC)) return -1;
#endif
#ifdef F_GETFD
- if (ins(d, "F_GETFD", (long)F_GETFD)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETFD)) return -1;
#endif
#ifdef F_SETFD
- if (ins(d, "F_SETFD", (long)F_SETFD)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETFD)) return -1;
#endif
#ifdef F_GETFL
- if (ins(d, "F_GETFL", (long)F_GETFL)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETFL)) return -1;
#endif
#ifdef F_SETFL
- if (ins(d, "F_SETFL", (long)F_SETFL)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETFL)) return -1;
#endif
#ifdef F_GETLK
- if (ins(d, "F_GETLK", (long)F_GETLK)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETLK)) return -1;
#endif
#ifdef F_SETLK
- if (ins(d, "F_SETLK", (long)F_SETLK)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETLK)) return -1;
#endif
#ifdef F_SETLKW
- if (ins(d, "F_SETLKW", (long)F_SETLKW)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETLKW)) return -1;
#endif
#ifdef F_GETOWN
- if (ins(d, "F_GETOWN", (long)F_GETOWN)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETOWN)) return -1;
#endif
#ifdef F_SETOWN
- if (ins(d, "F_SETOWN", (long)F_SETOWN)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETOWN)) return -1;
#endif
#ifdef F_GETSIG
- if (ins(d, "F_GETSIG", (long)F_GETSIG)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETSIG)) return -1;
#endif
#ifdef F_SETSIG
- if (ins(d, "F_SETSIG", (long)F_SETSIG)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETSIG)) return -1;
#endif
#ifdef F_RDLCK
- if (ins(d, "F_RDLCK", (long)F_RDLCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_RDLCK)) return -1;
#endif
#ifdef F_WRLCK
- if (ins(d, "F_WRLCK", (long)F_WRLCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_WRLCK)) return -1;
#endif
#ifdef F_UNLCK
- if (ins(d, "F_UNLCK", (long)F_UNLCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_UNLCK)) return -1;
#endif
/* LFS constants */
#ifdef F_GETLK64
- if (ins(d, "F_GETLK64", (long)F_GETLK64)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETLK64)) return -1;
#endif
#ifdef F_SETLK64
- if (ins(d, "F_SETLK64", (long)F_SETLK64)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETLK64)) return -1;
#endif
#ifdef F_SETLKW64
- if (ins(d, "F_SETLKW64", (long)F_SETLKW64)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETLKW64)) return -1;
#endif
/* GNU extensions, as of glibc 2.2.4. */
#ifdef FASYNC
- if (ins(d, "FASYNC", (long)FASYNC)) return -1;
+ if (PyModule_AddIntMacro(m, FASYNC)) return -1;
#endif
#ifdef F_SETLEASE
- if (ins(d, "F_SETLEASE", (long)F_SETLEASE)) return -1;
+ if (PyModule_AddIntMacro(m, F_SETLEASE)) return -1;
#endif
#ifdef F_GETLEASE
- if (ins(d, "F_GETLEASE", (long)F_GETLEASE)) return -1;
+ if (PyModule_AddIntMacro(m, F_GETLEASE)) return -1;
#endif
#ifdef F_NOTIFY
- if (ins(d, "F_NOTIFY", (long)F_NOTIFY)) return -1;
+ if (PyModule_AddIntMacro(m, F_NOTIFY)) return -1;
#endif
/* Old BSD flock(). */
#ifdef F_EXLCK
- if (ins(d, "F_EXLCK", (long)F_EXLCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_EXLCK)) return -1;
#endif
#ifdef F_SHLCK
- if (ins(d, "F_SHLCK", (long)F_SHLCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_SHLCK)) return -1;
#endif
/* OS X specifics */
#ifdef F_FULLFSYNC
- if (ins(d, "F_FULLFSYNC", (long)F_FULLFSYNC)) return -1;
+ if (PyModule_AddIntMacro(m, F_FULLFSYNC)) return -1;
#endif
#ifdef F_NOCACHE
- if (ins(d, "F_NOCACHE", (long)F_NOCACHE)) return -1;
+ if (PyModule_AddIntMacro(m, F_NOCACHE)) return -1;
#endif
/* For F_{GET|SET}FL */
#ifdef FD_CLOEXEC
- if (ins(d, "FD_CLOEXEC", (long)FD_CLOEXEC)) return -1;
+ if (PyModule_AddIntMacro(m, FD_CLOEXEC)) return -1;
#endif
/* For F_NOTIFY */
#ifdef DN_ACCESS
- if (ins(d, "DN_ACCESS", (long)DN_ACCESS)) return -1;
+ if (PyModule_AddIntMacro(m, DN_ACCESS)) return -1;
#endif
#ifdef DN_MODIFY
- if (ins(d, "DN_MODIFY", (long)DN_MODIFY)) return -1;
+ if (PyModule_AddIntMacro(m, DN_MODIFY)) return -1;
#endif
#ifdef DN_CREATE
- if (ins(d, "DN_CREATE", (long)DN_CREATE)) return -1;
+ if (PyModule_AddIntMacro(m, DN_CREATE)) return -1;
#endif
#ifdef DN_DELETE
- if (ins(d, "DN_DELETE", (long)DN_DELETE)) return -1;
+ if (PyModule_AddIntMacro(m, DN_DELETE)) return -1;
#endif
#ifdef DN_RENAME
- if (ins(d, "DN_RENAME", (long)DN_RENAME)) return -1;
+ if (PyModule_AddIntMacro(m, DN_RENAME)) return -1;
#endif
#ifdef DN_ATTRIB
- if (ins(d, "DN_ATTRIB", (long)DN_ATTRIB)) return -1;
+ if (PyModule_AddIntMacro(m, DN_ATTRIB)) return -1;
#endif
#ifdef DN_MULTISHOT
- if (ins(d, "DN_MULTISHOT", (long)DN_MULTISHOT)) return -1;
+ if (PyModule_AddIntMacro(m, DN_MULTISHOT)) return -1;
#endif
#ifdef HAVE_STROPTS_H
/* Unix 98 guarantees that these are in stropts.h. */
- INS(I_PUSH);
- INS(I_POP);
- INS(I_LOOK);
- INS(I_FLUSH);
- INS(I_FLUSHBAND);
- INS(I_SETSIG);
- INS(I_GETSIG);
- INS(I_FIND);
- INS(I_PEEK);
- INS(I_SRDOPT);
- INS(I_GRDOPT);
- INS(I_NREAD);
- INS(I_FDINSERT);
- INS(I_STR);
- INS(I_SWROPT);
+ if (PyModule_AddIntMacro(m, I_PUSH)) return -1;
+ if (PyModule_AddIntMacro(m, I_POP)) return -1;
+ if (PyModule_AddIntMacro(m, I_LOOK)) return -1;
+ if (PyModule_AddIntMacro(m, I_FLUSH)) return -1;
+ if (PyModule_AddIntMacro(m, I_FLUSHBAND)) return -1;
+ if (PyModule_AddIntMacro(m, I_SETSIG)) return -1;
+ if (PyModule_AddIntMacro(m, I_GETSIG)) return -1;
+ if (PyModule_AddIntMacro(m, I_FIND)) return -1;
+ if (PyModule_AddIntMacro(m, I_PEEK)) return -1;
+ if (PyModule_AddIntMacro(m, I_SRDOPT)) return -1;
+ if (PyModule_AddIntMacro(m, I_GRDOPT)) return -1;
+ if (PyModule_AddIntMacro(m, I_NREAD)) return -1;
+ if (PyModule_AddIntMacro(m, I_FDINSERT)) return -1;
+ if (PyModule_AddIntMacro(m, I_STR)) return -1;
+ if (PyModule_AddIntMacro(m, I_SWROPT)) return -1;
#ifdef I_GWROPT
/* despite the comment above, old-ish glibcs miss a couple... */
- INS(I_GWROPT);
-#endif
- INS(I_SENDFD);
- INS(I_RECVFD);
- INS(I_LIST);
- INS(I_ATMARK);
- INS(I_CKBAND);
- INS(I_GETBAND);
- INS(I_CANPUT);
- INS(I_SETCLTIME);
+ if (PyModule_AddIntMacro(m, I_GWROPT)) return -1;
+#endif
+ if (PyModule_AddIntMacro(m, I_SENDFD)) return -1;
+ if (PyModule_AddIntMacro(m, I_RECVFD)) return -1;
+ if (PyModule_AddIntMacro(m, I_LIST)) return -1;
+ if (PyModule_AddIntMacro(m, I_ATMARK)) return -1;
+ if (PyModule_AddIntMacro(m, I_CKBAND)) return -1;
+ if (PyModule_AddIntMacro(m, I_GETBAND)) return -1;
+ if (PyModule_AddIntMacro(m, I_CANPUT)) return -1;
+ if (PyModule_AddIntMacro(m, I_SETCLTIME)) return -1;
#ifdef I_GETCLTIME
- INS(I_GETCLTIME);
+ if (PyModule_AddIntMacro(m, I_GETCLTIME)) return -1;
#endif
- INS(I_LINK);
- INS(I_UNLINK);
- INS(I_PLINK);
- INS(I_PUNLINK);
+ if (PyModule_AddIntMacro(m, I_LINK)) return -1;
+ if (PyModule_AddIntMacro(m, I_UNLINK)) return -1;
+ if (PyModule_AddIntMacro(m, I_PLINK)) return -1;
+ if (PyModule_AddIntMacro(m, I_PUNLINK)) return -1;
#endif
return 0;
@@ -633,7 +618,7 @@ static struct PyModuleDef fcntlmodule = {
PyMODINIT_FUNC
PyInit_fcntl(void)
{
- PyObject *m, *d;
+ PyObject *m;
/* Create the module and add the functions and documentation */
m = PyModule_Create(&fcntlmodule);
@@ -641,7 +626,6 @@ PyInit_fcntl(void)
return NULL;
/* Add some symbolic constants to the module */
- d = PyModule_GetDict(m);
- all_ins(d);
+ all_ins(m);
return m;
}
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index f782dd0..a84d752 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -118,7 +118,7 @@ static Py_ssize_t long_lived_pending = 0;
/*
NOTE: about untracking of mutable objects.
-
+
Certain types of container cannot participate in a reference cycle, and
so do not need to be tracked by the garbage collector. Untracking these
objects reduces the cost of garbage collections. However, determining
@@ -136,10 +136,10 @@ static Py_ssize_t long_lived_pending = 0;
not survive until garbage collection. It is therefore not worthwhile
to untrack eligible tuples at creation time.
- Instead, all tuples except the empty tuple are tracked when created.
- During garbage collection it is determined whether any surviving tuples
- can be untracked. A tuple can be untracked if all of its contents are
- already not tracked. Tuples are examined for untracking in all garbage
+ Instead, all tuples except the empty tuple are tracked when created.
+ During garbage collection it is determined whether any surviving tuples
+ can be untracked. A tuple can be untracked if all of its contents are
+ already not tracked. Tuples are examined for untracking in all garbage
collection cycles. It may take more than one cycle to untrack a tuple.
Dictionaries containing only immutable objects also do not need to be
@@ -152,8 +152,8 @@ static Py_ssize_t long_lived_pending = 0;
The module provides the python function is_tracked(obj), which returns
the CURRENT tracking status of the object. Subsequent garbage
collections may change the tracking status of the object.
-
- Untracking of certain containers was introduced in issue #4688, and
+
+ Untracking of certain containers was introduced in issue #4688, and
the algorithm was refined in response to issue #14775.
*/
@@ -168,6 +168,18 @@ static Py_ssize_t long_lived_pending = 0;
static int debug;
static PyObject *tmod = NULL;
+/* Running stats per generation */
+struct gc_generation_stats {
+ /* total number of collections */
+ Py_ssize_t collections;
+ /* total number of collected objects */
+ Py_ssize_t collected;
+ /* total number of uncollectable objects (put into gc.garbage) */
+ Py_ssize_t uncollectable;
+};
+
+static struct gc_generation_stats generation_stats[NUM_GENERATIONS];
+
/*--------------------------------------------------------------------------
gc_refs values.
@@ -211,10 +223,10 @@ GC_TENTATIVELY_UNREACHABLE
#define GC_REACHABLE _PyGC_REFS_REACHABLE
#define GC_TENTATIVELY_UNREACHABLE _PyGC_REFS_TENTATIVELY_UNREACHABLE
-#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)
-#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)
+#define IS_TRACKED(o) (_PyGC_REFS(o) != GC_UNTRACKED)
+#define IS_REACHABLE(o) (_PyGC_REFS(o) == GC_REACHABLE)
#define IS_TENTATIVELY_UNREACHABLE(o) ( \
- (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
+ _PyGC_REFS(o) == GC_TENTATIVELY_UNREACHABLE)
/*** list functions ***/
@@ -329,8 +341,8 @@ update_refs(PyGC_Head *containers)
{
PyGC_Head *gc = containers->gc.gc_next;
for (; gc != containers; gc = gc->gc.gc_next) {
- assert(gc->gc.gc_refs == GC_REACHABLE);
- gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));
+ assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
+ _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
/* Python's cyclic gc should never see an incoming refcount
* of 0: if something decref'ed to 0, it should have been
* deallocated immediately at that time.
@@ -349,7 +361,7 @@ update_refs(PyGC_Head *containers)
* so serious that maybe this should be a release-build
* check instead of an assert?
*/
- assert(gc->gc.gc_refs != 0);
+ assert(_PyGCHead_REFS(gc) != 0);
}
}
@@ -364,9 +376,9 @@ visit_decref(PyObject *op, void *data)
* generation being collected, which can be recognized
* because only they have positive gc_refs.
*/
- assert(gc->gc.gc_refs != 0); /* else refcount was too small */
- if (gc->gc.gc_refs > 0)
- gc->gc.gc_refs--;
+ assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
+ if (_PyGCHead_REFS(gc) > 0)
+ _PyGCHead_DECREF(gc);
}
return 0;
}
@@ -395,7 +407,7 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
{
if (PyObject_IS_GC(op)) {
PyGC_Head *gc = AS_GC(op);
- const Py_ssize_t gc_refs = gc->gc.gc_refs;
+ const Py_ssize_t gc_refs = _PyGCHead_REFS(gc);
if (gc_refs == 0) {
/* This is in move_unreachable's 'young' list, but
@@ -403,7 +415,7 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
* we need to do is tell move_unreachable that it's
* reachable.
*/
- gc->gc.gc_refs = 1;
+ _PyGCHead_SET_REFS(gc, 1);
}
else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
/* This had gc_refs = 0 when move_unreachable got
@@ -413,7 +425,7 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
* again.
*/
gc_list_move(gc, reachable);
- gc->gc.gc_refs = 1;
+ _PyGCHead_SET_REFS(gc, 1);
}
/* Else there's nothing to do.
* If gc_refs > 0, it must be in move_unreachable's 'young'
@@ -457,7 +469,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
while (gc != young) {
PyGC_Head *next;
- if (gc->gc.gc_refs) {
+ if (_PyGCHead_REFS(gc)) {
/* gc is definitely reachable from outside the
* original 'young'. Mark it as such, and traverse
* its pointers to find any other objects that may
@@ -468,8 +480,8 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
*/
PyObject *op = FROM_GC(gc);
traverseproc traverse = Py_TYPE(op)->tp_traverse;
- assert(gc->gc.gc_refs > 0);
- gc->gc.gc_refs = GC_REACHABLE;
+ assert(_PyGCHead_REFS(gc) > 0);
+ _PyGCHead_SET_REFS(gc, GC_REACHABLE);
(void) traverse(op,
(visitproc)visit_reachable,
(void *)young);
@@ -488,7 +500,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
*/
next = gc->gc.gc_next;
gc_list_move(gc, unreachable);
- gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
+ _PyGCHead_SET_REFS(gc, GC_TENTATIVELY_UNREACHABLE);
}
gc = next;
}
@@ -508,22 +520,19 @@ untrack_dicts(PyGC_Head *head)
}
}
-/* Return true if object has a finalization method. */
+/* Return true if object has a pre-PEP 442 finalization method. */
static int
-has_finalizer(PyObject *op)
+has_legacy_finalizer(PyObject *op)
{
- if (PyGen_CheckExact(op))
- return PyGen_NeedsFinalizing((PyGenObject *)op);
- else
- return op->ob_type->tp_del != NULL;
+ return op->ob_type->tp_del != NULL;
}
-/* Move the objects in unreachable with __del__ methods into `finalizers`.
+/* Move the objects in unreachable with tp_del slots into `finalizers`.
* Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the
* objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE.
*/
static void
-move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
+move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
{
PyGC_Head *gc;
PyGC_Head *next;
@@ -537,14 +546,14 @@ move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
assert(IS_TENTATIVELY_UNREACHABLE(op));
next = gc->gc.gc_next;
- if (has_finalizer(op)) {
+ if (has_legacy_finalizer(op)) {
gc_list_move(gc, finalizers);
- gc->gc.gc_refs = GC_REACHABLE;
+ _PyGCHead_SET_REFS(gc, GC_REACHABLE);
}
}
}
-/* A traversal callback for move_finalizer_reachable. */
+/* A traversal callback for move_legacy_finalizer_reachable. */
static int
visit_move(PyObject *op, PyGC_Head *tolist)
{
@@ -552,7 +561,7 @@ visit_move(PyObject *op, PyGC_Head *tolist)
if (IS_TENTATIVELY_UNREACHABLE(op)) {
PyGC_Head *gc = AS_GC(op);
gc_list_move(gc, tolist);
- gc->gc.gc_refs = GC_REACHABLE;
+ _PyGCHead_SET_REFS(gc, GC_REACHABLE);
}
}
return 0;
@@ -562,7 +571,7 @@ visit_move(PyObject *op, PyGC_Head *tolist)
* into finalizers set.
*/
static void
-move_finalizer_reachable(PyGC_Head *finalizers)
+move_legacy_finalizer_reachable(PyGC_Head *finalizers)
{
traverseproc traverse;
PyGC_Head *gc = finalizers->gc.gc_next;
@@ -735,7 +744,7 @@ debug_cycle(char *msg, PyObject *op)
msg, Py_TYPE(op)->tp_name, op);
}
-/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
+/* Handle uncollectable garbage (cycles with tp_del slots, and stuff reachable
* only from such cycles).
* If DEBUG_SAVEALL, all objects in finalizers are appended to the module
* garbage list (a Python list), else only the objects in finalizers with
@@ -745,7 +754,7 @@ debug_cycle(char *msg, PyObject *op)
* The finalizers list is made empty on a successful return.
*/
static int
-handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
+handle_legacy_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
{
PyGC_Head *gc = finalizers->gc.gc_next;
@@ -757,7 +766,7 @@ handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
for (; gc != finalizers; gc = gc->gc.gc_next) {
PyObject *op = FROM_GC(gc);
- if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
+ if ((debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) {
if (PyList_Append(garbage, op) < 0)
return -1;
}
@@ -767,6 +776,62 @@ handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
return 0;
}
+static void
+finalize_garbage(PyGC_Head *collectable, PyGC_Head *old)
+{
+ destructor finalize;
+ PyGC_Head *gc = collectable->gc.gc_next;
+
+ for (; gc != collectable; gc = gc->gc.gc_next) {
+ PyObject *op = FROM_GC(gc);
+
+ if (!_PyGCHead_FINALIZED(gc) &&
+ PyType_HasFeature(Py_TYPE(op), Py_TPFLAGS_HAVE_FINALIZE) &&
+ (finalize = Py_TYPE(op)->tp_finalize) != NULL) {
+ _PyGCHead_SET_FINALIZED(gc, 1);
+ Py_INCREF(op);
+ finalize(op);
+ if (Py_REFCNT(op) == 1) {
+ /* op will be destroyed */
+ gc = gc->gc.gc_prev;
+ }
+ Py_DECREF(op);
+ }
+ }
+}
+
+/* Walk the collectable list and check that they are really unreachable
+ from the outside (some objects could have been resurrected by a
+ finalizer). */
+static int
+check_garbage(PyGC_Head *collectable)
+{
+ PyGC_Head *gc;
+ for (gc = collectable->gc.gc_next; gc != collectable;
+ gc = gc->gc.gc_next) {
+ _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
+ assert(_PyGCHead_REFS(gc) != 0);
+ }
+ subtract_refs(collectable);
+ for (gc = collectable->gc.gc_next; gc != collectable;
+ gc = gc->gc.gc_next) {
+ assert(_PyGCHead_REFS(gc) >= 0);
+ if (_PyGCHead_REFS(gc) != 0)
+ return -1;
+ }
+ return 0;
+}
+
+static void
+revive_garbage(PyGC_Head *collectable)
+{
+ PyGC_Head *gc;
+ for (gc = collectable->gc.gc_next; gc != collectable;
+ gc = gc->gc.gc_next) {
+ _PyGCHead_SET_REFS(gc, GC_REACHABLE);
+ }
+}
+
/* Break reference cycles by clearing the containers involved. This is
* tricky business as the lists can be changing and we don't know which
* objects may be freed. It is possible I screwed something up here.
@@ -780,7 +845,6 @@ delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
PyGC_Head *gc = collectable->gc.gc_next;
PyObject *op = FROM_GC(gc);
- assert(IS_TENTATIVELY_UNREACHABLE(op));
if (debug & DEBUG_SAVEALL) {
PyList_Append(garbage, op);
}
@@ -794,7 +858,7 @@ delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
if (collectable->gc.gc_next == gc) {
/* object is still alive, move it, it may die later */
gc_list_move(gc, old);
- gc->gc.gc_refs = GC_REACHABLE;
+ _PyGCHead_SET_REFS(gc, GC_REACHABLE);
}
}
}
@@ -841,7 +905,8 @@ get_time(void)
/* This is the main function. Read this to understand how the
* collection process works. */
static Py_ssize_t
-collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
+collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
+ int nofail)
{
int i;
Py_ssize_t m = 0; /* # objects collected */
@@ -852,6 +917,7 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
PyGC_Head finalizers; /* objects with, & reachable from, __del__ */
PyGC_Head *gc;
double t1 = 0.0;
+ struct gc_generation_stats *stats = &generation_stats[generation];
if (debug & DEBUG_STATS) {
PySys_WriteStderr("gc: collecting generation %d...\n",
@@ -915,19 +981,15 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
}
/* All objects in unreachable are trash, but objects reachable from
- * finalizers can't safely be deleted. Python programmers should take
- * care not to create such things. For Python, finalizers means
- * instance objects with __del__ methods. Weakrefs with callbacks
- * can also call arbitrary Python code but they will be dealt with by
- * handle_weakrefs().
+ * legacy finalizers (e.g. tp_del) can't safely be deleted.
*/
gc_list_init(&finalizers);
- move_finalizers(&unreachable, &finalizers);
- /* finalizers contains the unreachable objects with a finalizer;
+ move_legacy_finalizers(&unreachable, &finalizers);
+ /* finalizers contains the unreachable objects with a legacy finalizer;
* unreachable objects reachable *from* those are also uncollectable,
* and we move those into the finalizers list too.
*/
- move_finalizer_reachable(&finalizers);
+ move_legacy_finalizer_reachable(&finalizers);
/* Collect statistics on collectable objects found and print
* debugging information.
@@ -943,11 +1005,20 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
/* Clear weakrefs and invoke callbacks as necessary. */
m += handle_weakrefs(&unreachable, old);
- /* Call tp_clear on objects in the unreachable set. This will cause
- * the reference cycles to be broken. It may also cause some objects
- * in finalizers to be freed.
- */
- delete_garbage(&unreachable, old);
+ /* Call tp_finalize on objects which have one. */
+ finalize_garbage(&unreachable, old);
+
+ if (check_garbage(&unreachable)) {
+ revive_garbage(&unreachable);
+ gc_list_merge(&unreachable, old);
+ }
+ else {
+ /* Call tp_clear on objects in the unreachable set. This will cause
+ * the reference cycles to be broken. It may also cause some objects
+ * in finalizers to be freed.
+ */
+ delete_garbage(&unreachable, old);
+ }
/* Collect statistics on uncollectable objects found and print
* debugging information. */
@@ -978,7 +1049,7 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
* reachable list of garbage. The programmer has to deal with
* this if they insist on creating this type of structure.
*/
- (void)handle_finalizers(&finalizers, old);
+ (void)handle_legacy_finalizers(&finalizers, old);
/* Clear free list only during the collection of the highest
* generation */
@@ -987,16 +1058,25 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
}
if (PyErr_Occurred()) {
- if (gc_str == NULL)
- gc_str = PyUnicode_FromString("garbage collection");
- PyErr_WriteUnraisable(gc_str);
- Py_FatalError("unexpected exception during garbage collection");
+ if (nofail) {
+ PyErr_Clear();
+ }
+ else {
+ if (gc_str == NULL)
+ gc_str = PyUnicode_FromString("garbage collection");
+ PyErr_WriteUnraisable(gc_str);
+ Py_FatalError("unexpected exception during garbage collection");
+ }
}
+ /* Update stats */
if (n_collected)
*n_collected = m;
if (n_uncollectable)
*n_uncollectable = n;
+ stats->collections++;
+ stats->collected += m;
+ stats->uncollectable += n;
return n+m;
}
@@ -1045,7 +1125,7 @@ collect_with_callback(int generation)
{
Py_ssize_t result, collected, uncollectable;
invoke_gc_callback("start", generation, 0, 0);
- result = collect(generation, &collected, &uncollectable);
+ result = collect(generation, &collected, &uncollectable, 0);
invoke_gc_callback("stop", generation, collected, uncollectable);
return result;
}
@@ -1343,6 +1423,52 @@ gc_get_objects(PyObject *self, PyObject *noargs)
return result;
}
+PyDoc_STRVAR(gc_get_stats__doc__,
+"get_stats() -> [...]\n"
+"\n"
+"Return a list of dictionaries containing per-generation statistics.\n");
+
+static PyObject *
+gc_get_stats(PyObject *self, PyObject *noargs)
+{
+ int i;
+ PyObject *result;
+ struct gc_generation_stats stats[NUM_GENERATIONS], *st;
+
+ /* To get consistent values despite allocations while constructing
+ the result list, we use a snapshot of the running stats. */
+ for (i = 0; i < NUM_GENERATIONS; i++) {
+ stats[i] = generation_stats[i];
+ }
+
+ result = PyList_New(0);
+ if (result == NULL)
+ return NULL;
+
+ for (i = 0; i < NUM_GENERATIONS; i++) {
+ PyObject *dict;
+ st = &stats[i];
+ dict = Py_BuildValue("{snsnsn}",
+ "collections", st->collections,
+ "collected", st->collected,
+ "uncollectable", st->uncollectable
+ );
+ if (dict == NULL)
+ goto error;
+ if (PyList_Append(result, dict)) {
+ Py_DECREF(dict);
+ goto error;
+ }
+ Py_DECREF(dict);
+ }
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
+}
+
+
PyDoc_STRVAR(gc_is_tracked__doc__,
"is_tracked(obj) -> bool\n"
"\n"
@@ -1393,6 +1519,7 @@ static PyMethodDef GcMethods[] = {
{"collect", (PyCFunction)gc_collect,
METH_VARARGS | METH_KEYWORDS, gc_collect__doc__},
{"get_objects", gc_get_objects,METH_NOARGS, gc_get_objects__doc__},
+ {"get_stats", gc_get_stats, METH_NOARGS, gc_get_stats__doc__},
{"is_tracked", gc_is_tracked, METH_O, gc_is_tracked__doc__},
{"get_referrers", gc_get_referrers, METH_VARARGS,
gc_get_referrers__doc__},
@@ -1480,8 +1607,29 @@ PyGC_Collect(void)
return n;
}
+Py_ssize_t
+_PyGC_CollectNoFail(void)
+{
+ Py_ssize_t n;
+
+ /* Ideally, this function is only called on interpreter shutdown,
+ and therefore not recursively. Unfortunately, when there are daemon
+ threads, a daemon thread can start a cyclic garbage collection
+ during interpreter shutdown (and then never finish it).
+ See http://bugs.python.org/issue8713#msg195178 for an example.
+ */
+ if (collecting)
+ n = 0;
+ else {
+ collecting = 1;
+ n = collect(NUM_GENERATIONS - 1, NULL, NULL, 1);
+ collecting = 0;
+ }
+ return n;
+}
+
void
-_PyGC_Fini(void)
+_PyGC_DumpShutdownStats(void)
{
if (!(debug & DEBUG_SAVEALL)
&& garbage != NULL && PyList_GET_SIZE(garbage) > 0) {
@@ -1492,8 +1640,12 @@ _PyGC_Fini(void)
else
message = "gc: %zd uncollectable objects at " \
"shutdown; use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them";
- if (PyErr_WarnFormat(PyExc_ResourceWarning, 0, message,
- PyList_GET_SIZE(garbage)) < 0)
+ /* PyErr_WarnFormat does too many things and we are at shutdown,
+ the warnings module's dependencies (e.g. linecache) may be gone
+ already. */
+ if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0,
+ "gc", NULL, message,
+ PyList_GET_SIZE(garbage)))
PyErr_WriteUnraisable(NULL);
if (debug & DEBUG_UNCOLLECTABLE) {
PyObject *repr = NULL, *bytes = NULL;
@@ -1502,7 +1654,7 @@ _PyGC_Fini(void)
PyErr_WriteUnraisable(garbage);
else {
PySys_WriteStderr(
- " %s\n",
+ " %s\n",
PyBytes_AS_STRING(bytes)
);
}
@@ -1510,7 +1662,13 @@ _PyGC_Fini(void)
Py_XDECREF(bytes);
}
}
+}
+
+void
+_PyGC_Fini(void)
+{
Py_CLEAR(callbacks);
+ Py_CLEAR(tmod);
}
/* for debugging */
@@ -1569,7 +1727,8 @@ _PyObject_GC_Malloc(size_t basicsize)
sizeof(PyGC_Head) + basicsize);
if (g == NULL)
return PyErr_NoMemory();
- g->gc.gc_refs = GC_UNTRACKED;
+ g->gc.gc_refs = 0;
+ _PyGCHead_SET_REFS(g, GC_UNTRACKED);
generations[0].count++; /* number of allocated GC objects */
if (generations[0].count > generations[0].threshold &&
enabled &&
@@ -1596,8 +1755,15 @@ _PyObject_GC_New(PyTypeObject *tp)
PyVarObject *
_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
{
- const size_t size = _PyObject_VAR_SIZE(tp, nitems);
- PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
+ size_t size;
+ PyVarObject *op;
+
+ if (nitems < 0) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ size = _PyObject_VAR_SIZE(tp, nitems);
+ op = (PyVarObject *) _PyObject_GC_Malloc(size);
if (op != NULL)
op = PyObject_INIT_VAR(op, tp, nitems);
return op;
diff --git a/Modules/getpath.c b/Modules/getpath.c
index ff14fdd..1a43150 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -346,7 +346,7 @@ search_for_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_prefix)
wcsncpy(prefix, argv0_path, MAXPATHLEN);
prefix[MAXPATHLEN] = L'\0';
joinpath(prefix, vpath);
- PyMem_Free(vpath);
+ PyMem_RawFree(vpath);
joinpath(prefix, L"Lib");
joinpath(prefix, LANDMARK);
if (ismodule(prefix))
@@ -562,8 +562,7 @@ calculate_path(void)
}
else
progpath[0] = '\0';
- if (path_buffer != NULL)
- PyMem_Free(path_buffer);
+ PyMem_RawFree(path_buffer);
if (progpath[0] != SEP && progpath[0] != '\0')
absolutize(progpath);
wcsncpy(argv0_path, progpath, MAXPATHLEN);
@@ -605,7 +604,7 @@ calculate_path(void)
/* Use the location of the library as the progpath */
wcsncpy(argv0_path, wbuf, MAXPATHLEN);
}
- PyMem_Free(wbuf);
+ PyMem_RawFree(wbuf);
}
#endif
@@ -707,13 +706,11 @@ calculate_path(void)
*/
bufsz = 0;
- if (_rtpypath) {
+ if (_rtpypath && _rtpypath[0] != '\0') {
size_t rtpypath_len;
rtpypath = _Py_char2wchar(_rtpypath, &rtpypath_len);
if (rtpypath != NULL)
bufsz += rtpypath_len + 1;
- else
- _rtpypath = NULL;
}
defpath = _pythonpath;
@@ -818,11 +815,10 @@ calculate_path(void)
else
wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
- PyMem_Free(_pythonpath);
- PyMem_Free(_prefix);
- PyMem_Free(_exec_prefix);
- if (rtpypath != NULL)
- PyMem_Free(rtpypath);
+ PyMem_RawFree(_pythonpath);
+ PyMem_RawFree(_prefix);
+ PyMem_RawFree(_exec_prefix);
+ PyMem_RawFree(rtpypath);
}
@@ -832,7 +828,7 @@ Py_SetPath(const wchar_t *path)
{
if (module_search_path != NULL) {
if (module_search_path_malloced)
- PyMem_Free(module_search_path);
+ PyMem_RawFree(module_search_path);
module_search_path = NULL;
module_search_path_malloced = 0;
}
@@ -841,7 +837,7 @@ Py_SetPath(const wchar_t *path)
wchar_t *prog = Py_GetProgramName();
wcsncpy(progpath, prog, MAXPATHLEN);
exec_prefix[0] = prefix[0] = L'\0';
- module_search_path = PyMem_Malloc((wcslen(path) + 1) * sizeof(wchar_t));
+ module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t));
module_search_path_malloced = 1;
if (module_search_path != NULL)
wcscpy(module_search_path, path);
diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c
index 042cf05..a85a271 100644
--- a/Modules/grpmodule.c
+++ b/Modules/grpmodule.c
@@ -210,9 +210,14 @@ PyInit_grp(void)
if (m == NULL)
return NULL;
d = PyModule_GetDict(m);
- if (!initialized)
- PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
- PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
+ if (!initialized) {
+ if (PyStructSequence_InitType2(&StructGrpType,
+ &struct_group_type_desc) < 0)
+ return NULL;
+ }
+ if (PyDict_SetItemString(d, "struct_group",
+ (PyObject *)&StructGrpType) < 0)
+ return NULL;
initialized = 1;
return m;
}
diff --git a/Modules/hashlib.h b/Modules/hashlib.h
index 4599146..51c68f6 100644
--- a/Modules/hashlib.h
+++ b/Modules/hashlib.h
@@ -26,3 +26,36 @@
return NULL; \
} \
} while(0);
+
+/*
+ * Helper code to synchronize access to the hash object when the GIL is
+ * released around a CPU consuming hashlib operation. All code paths that
+ * access a mutable part of obj must be enclosed in a ENTER_HASHLIB /
+ * LEAVE_HASHLIB block or explicitly acquire and release the lock inside
+ * a PY_BEGIN / END_ALLOW_THREADS block if they wish to release the GIL for
+ * an operation.
+ */
+
+#ifdef WITH_THREAD
+#include "pythread.h"
+ #define ENTER_HASHLIB(obj) \
+ if ((obj)->lock) { \
+ if (!PyThread_acquire_lock((obj)->lock, 0)) { \
+ Py_BEGIN_ALLOW_THREADS \
+ PyThread_acquire_lock((obj)->lock, 1); \
+ Py_END_ALLOW_THREADS \
+ } \
+ }
+ #define LEAVE_HASHLIB(obj) \
+ if ((obj)->lock) { \
+ PyThread_release_lock((obj)->lock); \
+ }
+#else
+ #define ENTER_HASHLIB(obj)
+ #define LEAVE_HASHLIB(obj)
+#endif
+
+/* TODO(gps): We should probably make this a module or EVPobject attribute
+ * to allow the user to optimize based on the platform they're using. */
+#define HASHLIB_GIL_MINSIZE 2048
+
diff --git a/Modules/main.c b/Modules/main.c
index 3cfc9c3..25190b8 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -22,15 +22,11 @@
#include <crtdbg.h>
#endif
-#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
+#if defined(MS_WINDOWS)
#define PYTHONHOMEHELP "<prefix>\\lib"
#else
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-#define PYTHONHOMEHELP "<prefix>/Lib"
-#else
#define PYTHONHOMEHELP "<prefix>/pythonX.X"
#endif
-#endif
#include "pygetopt.h"
@@ -47,7 +43,7 @@ static wchar_t **orig_argv;
static int orig_argc;
/* command line options */
-#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?"
+#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
#define PROGRAM_OPTS BASE_OPTS
@@ -69,6 +65,7 @@ Options and arguments (and corresponding environment variables):\n\
static char *usage_2 = "\
-i : inspect interactively after running script; forces a prompt even\n\
if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
+-I : isolate Python from the user's environment (implies -E and -s)\n\
-m mod : run library module as a script (terminates option list)\n\
-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
-OO : remove doc-strings in addition to the -O optimizations\n\
@@ -165,6 +162,32 @@ static void RunStartupFile(PyCompilerFlags *cf)
}
}
+static void RunInteractiveHook(void)
+{
+ PyObject *sys, *hook, *result;
+ sys = PyImport_ImportModule("sys");
+ if (sys == NULL)
+ goto error;
+ hook = PyObject_GetAttrString(sys, "__interactivehook__");
+ Py_DECREF(sys);
+ if (hook == NULL)
+ PyErr_Clear();
+ else {
+ result = PyObject_CallObject(hook, NULL);
+ Py_DECREF(hook);
+ if (result == NULL)
+ goto error;
+ else
+ Py_DECREF(result);
+ }
+ return;
+
+error:
+ PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
+ PyErr_Print();
+ PyErr_Clear();
+}
+
static int RunModule(wchar_t *modname, int set_argv0)
{
@@ -172,17 +195,20 @@ static int RunModule(wchar_t *modname, int set_argv0)
runpy = PyImport_ImportModule("runpy");
if (runpy == NULL) {
fprintf(stderr, "Could not import runpy module\n");
+ PyErr_Print();
return -1;
}
runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
if (runmodule == NULL) {
fprintf(stderr, "Could not access runpy._run_module_as_main\n");
+ PyErr_Print();
Py_DECREF(runpy);
return -1;
}
module = PyUnicode_FromWideChar(modname, wcslen(modname));
if (module == NULL) {
fprintf(stderr, "Could not convert module name to unicode\n");
+ PyErr_Print();
Py_DECREF(runpy);
Py_DECREF(runmodule);
return -1;
@@ -191,6 +217,7 @@ static int RunModule(wchar_t *modname, int set_argv0)
if (runargs == NULL) {
fprintf(stderr,
"Could not create arguments for runpy._run_module_as_main\n");
+ PyErr_Print();
Py_DECREF(runpy);
Py_DECREF(runmodule);
Py_DECREF(module);
@@ -235,8 +262,10 @@ RunMainFromImporter(wchar_t *filename)
/* argv0 is usable as an import source, so put it in sys.path[0]
and import __main__ */
sys_path = PySys_GetObject("path");
- if (sys_path == NULL)
+ if (sys_path == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
goto error;
+ }
if (PyList_SetItem(sys_path, 0, argv0)) {
argv0 = NULL;
goto error;
@@ -366,7 +395,7 @@ Py_Main(int argc, wchar_t **argv)
command to interpret. */
len = wcslen(_PyOS_optarg) + 1 + 1;
- command = (wchar_t *)malloc(sizeof(wchar_t) * len);
+ command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
if (command == NULL)
Py_FatalError(
"not enough memory to copy -c argument");
@@ -398,6 +427,12 @@ Py_Main(int argc, wchar_t **argv)
Py_InteractiveFlag++;
break;
+ case 'I':
+ Py_IsolatedFlag++;
+ Py_NoUserSiteDirectory++;
+ Py_IgnoreEnvironmentFlag++;
+ break;
+
/* case 'J': reserved for Jython */
case 'O':
@@ -475,7 +510,7 @@ Py_Main(int argc, wchar_t **argv)
return usage(0, argv[0]);
if (version) {
- fprintf(stderr, "Python %s\n", PY_VERSION);
+ printf("Python %s\n", PY_VERSION);
return 0;
}
@@ -495,7 +530,7 @@ Py_Main(int argc, wchar_t **argv)
*wp != L'\0') {
wchar_t *buf, *warning;
- buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t));
+ buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
if (buf == NULL)
Py_FatalError(
"not enough memory to copy PYTHONWARNINGS");
@@ -505,7 +540,7 @@ Py_Main(int argc, wchar_t **argv)
warning = wcstok(NULL, L",")) {
PySys_AddWarnOption(warning);
}
- free(buf);
+ PyMem_RawFree(buf);
}
#else
if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
@@ -514,12 +549,12 @@ Py_Main(int argc, wchar_t **argv)
/* settle for strtok here as there's no one standard
C89 wcstok */
- buf = (char *)malloc(strlen(p) + 1);
+ buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
if (buf == NULL)
Py_FatalError(
"not enough memory to copy PYTHONWARNINGS");
strcpy(buf, p);
- oldloc = strdup(setlocale(LC_ALL, NULL));
+ oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, "");
for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
#ifdef __APPLE__
@@ -537,8 +572,8 @@ Py_Main(int argc, wchar_t **argv)
Py_DECREF(unicode);
}
setlocale(LC_ALL, oldloc);
- free(oldloc);
- free(buf);
+ PyMem_RawFree(oldloc);
+ PyMem_RawFree(buf);
}
#endif
@@ -608,7 +643,7 @@ Py_Main(int argc, wchar_t **argv)
wchar_t* buffer;
size_t len = strlen(p) + 1;
- buffer = malloc(len * sizeof(wchar_t));
+ buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
if (buffer == NULL) {
Py_FatalError(
"not enough memory to copy PYTHONEXECUTABLE");
@@ -682,7 +717,7 @@ Py_Main(int argc, wchar_t **argv)
if (command) {
sts = run_command(command, &cf);
- free(command);
+ PyMem_RawFree(command);
} else if (module) {
sts = (RunModule(module, 1) != 0);
}
@@ -691,6 +726,7 @@ Py_Main(int argc, wchar_t **argv)
if (filename == NULL && stdin_is_interactive) {
Py_InspectFlag = 0; /* do exit on SystemExit */
RunStartupFile(&cf);
+ RunInteractiveHook();
}
/* XXX */
@@ -756,6 +792,7 @@ Py_Main(int argc, wchar_t **argv)
if (Py_InspectFlag && stdin_is_interactive &&
(filename != NULL || command != NULL || module != NULL)) {
Py_InspectFlag = 0;
+ RunInteractiveHook();
/* XXX */
sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
}
diff --git a/Modules/md5module.c b/Modules/md5module.c
index 12e187c..bb91b6c 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -91,10 +91,6 @@ typedef struct {
(y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
(y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
-#ifndef MIN
- #define MIN(x, y) ( ((x)<(y))?(x):(y) )
-#endif
-
/* MD5 macros */
@@ -244,9 +240,9 @@ md5_process(struct md5_state *md5, const unsigned char *in, Py_ssize_t inlen)
in += MD5_BLOCKSIZE;
inlen -= MD5_BLOCKSIZE;
} else {
- n = MIN(inlen, (Py_ssize_t)(MD5_BLOCKSIZE - md5->curlen));
+ n = Py_MIN(inlen, (Py_ssize_t)(MD5_BLOCKSIZE - md5->curlen));
memcpy(md5->buf + md5->curlen, in, (size_t)n);
- md5->curlen += n;
+ md5->curlen += (MD5_INT32)n;
in += n;
inlen -= n;
if (md5->curlen == MD5_BLOCKSIZE) {
@@ -443,7 +439,7 @@ MD5_get_block_size(PyObject *self, void *closure)
static PyObject *
MD5_get_name(PyObject *self, void *closure)
{
- return PyUnicode_FromStringAndSize("MD5", 3);
+ return PyUnicode_FromStringAndSize("md5", 3);
}
static PyObject *
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 1107eb8..4b4be61 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -20,6 +20,7 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
+#include "structmember.h"
#ifndef MS_WINDOWS
#define UNIX
@@ -108,6 +109,7 @@ typedef struct {
int fd;
#endif
+ PyObject *weakreflist;
access_mode access;
} mmap_object;
@@ -134,6 +136,8 @@ mmap_object_dealloc(mmap_object *m_obj)
}
#endif /* UNIX */
+ if (m_obj->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) m_obj);
Py_TYPE(m_obj)->tp_free((PyObject*)m_obj);
}
@@ -1032,7 +1036,7 @@ static PyTypeObject mmap_object_type = {
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
+ offsetof(mmap_object, weakreflist), /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
mmap_object_methods, /* tp_methods */
@@ -1190,6 +1194,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
m_obj->data = NULL;
m_obj->size = (size_t) map_size;
m_obj->pos = (size_t) 0;
+ m_obj->weakreflist = NULL;
m_obj->exports = 0;
m_obj->offset = offset;
if (fd == -1) {
@@ -1394,6 +1399,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
/* set the initial position */
m_obj->pos = (size_t) 0;
+ m_obj->weakreflist = NULL;
m_obj->exports = 0;
/* set the tag name */
if (tagname != NULL && *tagname != '\0') {
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index 50e266f..5e45abd 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -245,7 +245,7 @@ _do_ioctl_1(int fd, PyObject *args, char *fname, int cmd)
int arg;
assert(strlen(fname) <= 30);
- strcat(argfmt, fname);
+ strncat(argfmt, fname, 30);
if (!PyArg_ParseTuple(args, argfmt, &arg))
return NULL;
@@ -270,7 +270,7 @@ _do_ioctl_1_internal(int fd, PyObject *args, char *fname, int cmd)
int arg = 0;
assert(strlen(fname) <= 30);
- strcat(argfmt, fname);
+ strncat(argfmt, fname, 30);
if (!PyArg_ParseTuple(args, argfmt, &arg))
return NULL;
@@ -290,7 +290,7 @@ _do_ioctl_0(int fd, PyObject *args, char *fname, int cmd)
int rv;
assert(strlen(fname) <= 30);
- strcat(argfmt, fname);
+ strncat(argfmt, fname, 30);
if (!PyArg_ParseTuple(args, argfmt))
return NULL;
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index e86fe4d..7a6e455 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -83,54 +83,78 @@ node2tuple(node *n, /* node to convert */
int lineno, /* include line numbers? */
int col_offset) /* include column offsets? */
{
+ PyObject *result = NULL, *w;
+
if (n == NULL) {
Py_INCREF(Py_None);
- return (Py_None);
+ return Py_None;
}
+
if (ISNONTERMINAL(TYPE(n))) {
int i;
- PyObject *v;
- PyObject *w;
- v = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl));
- if (v == NULL)
- return (v);
+ result = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl));
+ if (result == NULL)
+ goto error;
+
w = PyLong_FromLong(TYPE(n));
- if (w == NULL) {
- Py_DECREF(v);
- return ((PyObject*) NULL);
- }
- (void) addelem(v, 0, w);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 0, w);
+
for (i = 0; i < NCH(n); i++) {
w = node2tuple(CHILD(n, i), mkseq, addelem, lineno, col_offset);
- if (w == NULL) {
- Py_DECREF(v);
- return ((PyObject*) NULL);
- }
- (void) addelem(v, i+1, w);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, i+1, w);
}
- if (TYPE(n) == encoding_decl)
- (void) addelem(v, i+1, PyUnicode_FromString(STR(n)));
- return (v);
+ if (TYPE(n) == encoding_decl) {
+ w = PyUnicode_FromString(STR(n));
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, i+1, w);
+ }
}
else if (ISTERMINAL(TYPE(n))) {
- PyObject *result = mkseq(2 + lineno + col_offset);
- if (result != NULL) {
- (void) addelem(result, 0, PyLong_FromLong(TYPE(n)));
- (void) addelem(result, 1, PyUnicode_FromString(STR(n)));
- if (lineno == 1)
- (void) addelem(result, 2, PyLong_FromLong(n->n_lineno));
- if (col_offset == 1)
- (void) addelem(result, 3, PyLong_FromLong(n->n_col_offset));
+ result = mkseq(2 + lineno + col_offset);
+ if (result == NULL)
+ goto error;
+
+ w = PyLong_FromLong(TYPE(n));
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 0, w);
+
+ w = PyUnicode_FromString(STR(n));
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 1, w);
+
+ if (lineno == 1) {
+ w = PyLong_FromLong(n->n_lineno);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 2, w);
+ }
+
+ if (col_offset == 1) {
+ w = PyLong_FromLong(n->n_col_offset);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 3, w);
}
- return (result);
}
else {
PyErr_SetString(PyExc_SystemError,
"unrecognized parse tree node type");
return ((PyObject*) NULL);
}
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
}
/*
* End of material copyrighted by Stichting Mathematisch Centrum.
@@ -809,8 +833,13 @@ build_node_children(PyObject *tuple, node *root, int *line_num)
return 0;
}
strn = (char *)PyObject_MALLOC(len + 1);
- if (strn != NULL)
- (void) memcpy(strn, temp_str, len + 1);
+ if (strn == NULL) {
+ Py_DECREF(temp);
+ Py_XDECREF(elem);
+ PyErr_NoMemory();
+ return 0;
+ }
+ (void) memcpy(strn, temp_str, len + 1);
Py_DECREF(temp);
}
else if (!ISNONTERMINAL(type)) {
@@ -870,7 +899,7 @@ build_node_tree(PyObject *tuple)
* The tuple is simple, but it doesn't start with a start symbol.
* Raise an exception now and be done with it.
*/
- tuple = Py_BuildValue("os", tuple,
+ tuple = Py_BuildValue("Os", tuple,
"Illegal syntax-tree; cannot start with terminal symbol.");
PyErr_SetObject(parser_error, tuple);
Py_XDECREF(tuple);
@@ -906,8 +935,14 @@ build_node_tree(PyObject *tuple)
return NULL;
}
res->n_str = (char *)PyObject_MALLOC(len + 1);
- if (res->n_str != NULL && temp != NULL)
- (void) memcpy(res->n_str, temp, len + 1);
+ if (res->n_str == NULL) {
+ Py_DECREF(res);
+ Py_DECREF(encoding);
+ Py_DECREF(tuple);
+ PyErr_NoMemory();
+ return NULL;
+ }
+ (void) memcpy(res->n_str, temp, len + 1);
Py_DECREF(encoding);
Py_DECREF(tuple);
}
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index f3234a4..ab3e9f0 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1,15 +1,12 @@
/* POSIX module implementation */
-/* This file is also used for Windows NT/MS-Win and OS/2. In that case the
- module actually calls itself 'nt' or 'os2', not 'posix', and a few
+/* This file is also used for Windows NT/MS-Win. In that case the
+ module actually calls itself 'nt', not 'posix', and a few
functions are either unimplemented or implemented differently. The source
assumes that for Windows NT, the macro 'MS_WINDOWS' is defined independent
of the compiler used. Different compilers define their own feature
- test macro, e.g. '__BORLANDC__' or '_MSC_VER'. For OS/2, the compiler
- independent macro PYOS_OS2 should be defined. On OS/2 the default
- compiler is assumed to be IBM's VisualAge C++ (VACPP). PYCC_GCC is used
- as the compiler specific macro for the EMX port of gcc to OS/2. */
+ test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
#ifdef __APPLE__
/*
@@ -46,22 +43,6 @@ disguised Unix interface). Refer to the library manual and\n\
corresponding Unix manual entries for more information on calls.");
-#if defined(PYOS_OS2)
-#error "PEP 11: OS/2 is now unsupported, code will be removed in Python 3.4"
-#define INCL_DOS
-#define INCL_DOSERRORS
-#define INCL_DOSPROCESS
-#define INCL_NOPMAPI
-#include <os2.h>
-#if defined(PYCC_GCC)
-#include <ctype.h>
-#include <io.h>
-#include <stdio.h>
-#include <process.h>
-#endif
-#include "osdefs.h"
-#endif
-
#ifdef HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif
@@ -132,6 +113,18 @@ corresponding Unix manual entries for more information on calls.");
#include <dlfcn.h>
#endif
+#ifdef __hpux
+#include <sys/mpctl.h>
+#endif
+
+#if defined(__DragonFly__) || \
+ defined(__OpenBSD__) || \
+ defined(__FreeBSD__) || \
+ defined(__NetBSD__) || \
+ defined(__APPLE__)
+#include <sys/sysctl.h>
+#endif
+
#if defined(MS_WINDOWS)
# define TERMSIZE_USE_CONIO
#elif defined(HAVE_SYS_IOCTL_H)
@@ -146,17 +139,10 @@ corresponding Unix manual entries for more information on calls.");
/* Various compilers have only certain posix functions */
/* XXX Gosh I wish these were all moved into pyconfig.h */
-#if defined(PYCC_VACPP) && defined(PYOS_OS2)
-#include <process.h>
-#else
#if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */
#define HAVE_GETCWD 1
#define HAVE_OPENDIR 1
#define HAVE_SYSTEM 1
-#if defined(__OS2__)
-#define HAVE_EXECV 1
-#define HAVE_WAIT 1
-#endif
#include <process.h>
#else
#ifdef __BORLANDC__ /* Borland compiler */
@@ -179,8 +165,8 @@ corresponding Unix manual entries for more information on calls.");
#define HAVE_FSYNC 1
#define fsync _commit
#else
-#if defined(PYOS_OS2) && defined(PYCC_GCC) || defined(__VMS)
-/* Everything needed is defined in PC/os2emx/pyconfig.h or vms/pyconfig.h */
+#if defined(__VMS)
+/* Everything needed is defined in vms/pyconfig.h */
#else /* all other compilers */
/* Unix functions that the configure script doesn't check for */
#define HAVE_EXECV 1
@@ -200,11 +186,10 @@ corresponding Unix manual entries for more information on calls.");
#define HAVE_SYSTEM 1
#define HAVE_WAIT 1
#define HAVE_TTYNAME 1
-#endif /* PYOS_OS2 && PYCC_GCC && __VMS */
+#endif /* __VMS */
#endif /* _MSC_VER */
#endif /* __BORLANDC__ */
#endif /* ! __WATCOMC__ || __QNX__ */
-#endif /* ! __IBMC__ */
@@ -335,10 +320,6 @@ static int win32_can_symlink = 0;
#endif
#endif /* _MSC_VER */
-#if defined(PYCC_VACPP) && defined(PYOS_OS2)
-#include <io.h>
-#endif /* OS2 */
-
#ifndef MAXPATHLEN
#if defined(PATH_MAX) && PATH_MAX > 1024
#define MAXPATHLEN PATH_MAX
@@ -380,7 +361,7 @@ static int win32_can_symlink = 0;
#undef STAT
#undef FSTAT
#undef STRUCT_STAT
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
# define STAT win32_stat
# define LSTAT win32_lstat
# define FSTAT win32_fstat
@@ -436,108 +417,213 @@ _PyLong_FromGid(gid_t gid)
int
_Py_Uid_Converter(PyObject *obj, void *p)
{
+ uid_t uid;
+ PyObject *index;
int overflow;
long result;
- if (PyFloat_Check(obj)) {
- PyErr_SetString(PyExc_TypeError,
- "integer argument expected, got float");
+ unsigned long uresult;
+
+ index = PyNumber_Index(obj);
+ if (index == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "uid should be integer, not %.200s",
+ Py_TYPE(obj)->tp_name);
return 0;
}
- result = PyLong_AsLongAndOverflow(obj, &overflow);
- if (overflow < 0)
- goto OverflowDown;
- if (!overflow && result == -1) {
- /* error or -1 */
- if (PyErr_Occurred())
- return 0;
- *(uid_t *)p = (uid_t)-1;
- }
- else {
- /* unsigned uid_t */
- unsigned long uresult;
- if (overflow > 0) {
- uresult = PyLong_AsUnsignedLong(obj);
- if (PyErr_Occurred()) {
- if (PyErr_ExceptionMatches(PyExc_OverflowError))
- goto OverflowUp;
- return 0;
- }
- if ((uid_t)uresult == (uid_t)-1)
- goto OverflowUp;
- } else {
- if (result < 0)
- goto OverflowDown;
- uresult = result;
+
+ /*
+ * Handling uid_t is complicated for two reasons:
+ * * Although uid_t is (always?) unsigned, it still
+ * accepts -1.
+ * * We don't know its size in advance--it may be
+ * bigger than an int, or it may be smaller than
+ * a long.
+ *
+ * So a bit of defensive programming is in order.
+ * Start with interpreting the value passed
+ * in as a signed long and see if it works.
+ */
+
+ result = PyLong_AsLongAndOverflow(index, &overflow);
+
+ if (!overflow) {
+ uid = (uid_t)result;
+
+ if (result == -1) {
+ if (PyErr_Occurred())
+ goto fail;
+ /* It's a legitimate -1, we're done. */
+ goto success;
}
+
+ /* Any other negative number is disallowed. */
+ if (result < 0)
+ goto underflow;
+
+ /* Ensure the value wasn't truncated. */
if (sizeof(uid_t) < sizeof(long) &&
- (unsigned long)(uid_t)uresult != uresult)
- goto OverflowUp;
- *(uid_t *)p = (uid_t)uresult;
+ (long)uid != result)
+ goto underflow;
+ goto success;
+ }
+
+ if (overflow < 0)
+ goto underflow;
+
+ /*
+ * Okay, the value overflowed a signed long. If it
+ * fits in an *unsigned* long, it may still be okay,
+ * as uid_t may be unsigned long on this platform.
+ */
+ uresult = PyLong_AsUnsignedLong(index);
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_OverflowError))
+ goto overflow;
+ goto fail;
}
+
+ uid = (uid_t)uresult;
+
+ /*
+ * If uid == (uid_t)-1, the user actually passed in ULONG_MAX,
+ * but this value would get interpreted as (uid_t)-1 by chown
+ * and its siblings. That's not what the user meant! So we
+ * throw an overflow exception instead. (We already
+ * handled a real -1 with PyLong_AsLongAndOverflow() above.)
+ */
+ if (uid == (uid_t)-1)
+ goto overflow;
+
+ /* Ensure the value wasn't truncated. */
+ if (sizeof(uid_t) < sizeof(long) &&
+ (unsigned long)uid != uresult)
+ goto overflow;
+ /* fallthrough */
+
+success:
+ Py_DECREF(index);
+ *(uid_t *)p = uid;
return 1;
-OverflowDown:
+underflow:
PyErr_SetString(PyExc_OverflowError,
- "user id is less than minimum");
- return 0;
+ "uid is less than minimum");
+ goto fail;
-OverflowUp:
+overflow:
PyErr_SetString(PyExc_OverflowError,
- "user id is greater than maximum");
+ "uid is greater than maximum");
+ /* fallthrough */
+
+fail:
+ Py_DECREF(index);
return 0;
}
int
_Py_Gid_Converter(PyObject *obj, void *p)
{
+ gid_t gid;
+ PyObject *index;
int overflow;
long result;
- if (PyFloat_Check(obj)) {
- PyErr_SetString(PyExc_TypeError,
- "integer argument expected, got float");
+ unsigned long uresult;
+
+ index = PyNumber_Index(obj);
+ if (index == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "gid should be integer, not %.200s",
+ Py_TYPE(obj)->tp_name);
return 0;
}
- result = PyLong_AsLongAndOverflow(obj, &overflow);
- if (overflow < 0)
- goto OverflowDown;
- if (!overflow && result == -1) {
- /* error or -1 */
- if (PyErr_Occurred())
- return 0;
- *(gid_t *)p = (gid_t)-1;
- }
- else {
- /* unsigned gid_t */
- unsigned long uresult;
- if (overflow > 0) {
- uresult = PyLong_AsUnsignedLong(obj);
- if (PyErr_Occurred()) {
- if (PyErr_ExceptionMatches(PyExc_OverflowError))
- goto OverflowUp;
- return 0;
- }
- if ((gid_t)uresult == (gid_t)-1)
- goto OverflowUp;
- } else {
- if (result < 0)
- goto OverflowDown;
- uresult = result;
+
+ /*
+ * Handling gid_t is complicated for two reasons:
+ * * Although gid_t is (always?) unsigned, it still
+ * accepts -1.
+ * * We don't know its size in advance--it may be
+ * bigger than an int, or it may be smaller than
+ * a long.
+ *
+ * So a bit of defensive programming is in order.
+ * Start with interpreting the value passed
+ * in as a signed long and see if it works.
+ */
+
+ result = PyLong_AsLongAndOverflow(index, &overflow);
+
+ if (!overflow) {
+ gid = (gid_t)result;
+
+ if (result == -1) {
+ if (PyErr_Occurred())
+ goto fail;
+ /* It's a legitimate -1, we're done. */
+ goto success;
+ }
+
+ /* Any other negative number is disallowed. */
+ if (result < 0) {
+ goto underflow;
}
+
+ /* Ensure the value wasn't truncated. */
if (sizeof(gid_t) < sizeof(long) &&
- (unsigned long)(gid_t)uresult != uresult)
- goto OverflowUp;
- *(gid_t *)p = (gid_t)uresult;
+ (long)gid != result)
+ goto underflow;
+ goto success;
+ }
+
+ if (overflow < 0)
+ goto underflow;
+
+ /*
+ * Okay, the value overflowed a signed long. If it
+ * fits in an *unsigned* long, it may still be okay,
+ * as gid_t may be unsigned long on this platform.
+ */
+ uresult = PyLong_AsUnsignedLong(index);
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_OverflowError))
+ goto overflow;
+ goto fail;
}
+
+ gid = (gid_t)uresult;
+
+ /*
+ * If gid == (gid_t)-1, the user actually passed in ULONG_MAX,
+ * but this value would get interpreted as (gid_t)-1 by chown
+ * and its siblings. That's not what the user meant! So we
+ * throw an overflow exception instead. (We already
+ * handled a real -1 with PyLong_AsLongAndOverflow() above.)
+ */
+ if (gid == (gid_t)-1)
+ goto overflow;
+
+ /* Ensure the value wasn't truncated. */
+ if (sizeof(gid_t) < sizeof(long) &&
+ (unsigned long)gid != uresult)
+ goto overflow;
+ /* fallthrough */
+
+success:
+ Py_DECREF(index);
+ *(gid_t *)p = gid;
return 1;
-OverflowDown:
+underflow:
PyErr_SetString(PyExc_OverflowError,
- "group id is less than minimum");
- return 0;
+ "gid is less than minimum");
+ goto fail;
-OverflowUp:
+overflow:
PyErr_SetString(PyExc_OverflowError,
- "group id is greater than maximum");
+ "gid is greater than maximum");
+ /* fallthrough */
+
+fail:
+ Py_DECREF(index);
return 0;
}
#endif /* MS_WINDOWS */
@@ -560,25 +646,29 @@ static int
_fd_converter(PyObject *o, int *p, const char *allowed)
{
int overflow;
- long long_value = PyLong_AsLongAndOverflow(o, &overflow);
- if (PyFloat_Check(o) ||
- (long_value == -1 && !overflow && PyErr_Occurred())) {
- PyErr_Clear();
+ long long_value;
+
+ PyObject *index = PyNumber_Index(o);
+ if (index == NULL) {
PyErr_Format(PyExc_TypeError,
- "argument should be %s, not %.200s",
- allowed, Py_TYPE(o)->tp_name);
+ "argument should be %s, not %.200s",
+ allowed, Py_TYPE(o)->tp_name);
return 0;
}
+
+ long_value = PyLong_AsLongAndOverflow(index, &overflow);
+ Py_DECREF(index);
if (overflow > 0 || long_value > INT_MAX) {
PyErr_SetString(PyExc_OverflowError,
- "signed integer is greater than maximum");
+ "fd is greater than maximum");
return 0;
}
if (overflow < 0 || long_value < INT_MIN) {
PyErr_SetString(PyExc_OverflowError,
- "signed integer is less than minimum");
+ "fd is less than minimum");
return 0;
}
+
*p = (int)long_value;
return 1;
}
@@ -678,8 +768,8 @@ dir_fd_converter(PyObject *o, void *p)
* path_cleanup(). However it is safe to do so.)
*/
typedef struct {
- char *function_name;
- char *argument_name;
+ const char *function_name;
+ const char *argument_name;
int nullable;
int allow_fd;
wchar_t *wide;
@@ -1105,10 +1195,6 @@ convertenviron(void)
#else
char **e;
#endif
-#if defined(PYOS_OS2)
- APIRET rc;
- char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
-#endif
d = PyDict_New();
if (d == NULL)
@@ -1177,20 +1263,6 @@ convertenviron(void)
Py_DECREF(v);
}
#endif
-#if defined(PYOS_OS2)
- rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
- if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
- PyObject *v = PyBytes_FromString(buffer);
- PyDict_SetItemString(d, "BEGINLIBPATH", v);
- Py_DECREF(v);
- }
- rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
- if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
- PyObject *v = PyBytes_FromString(buffer);
- PyDict_SetItemString(d, "ENDLIBPATH", v);
- Py_DECREF(v);
- }
-#endif
return d;
}
@@ -1201,25 +1273,6 @@ posix_error(void)
{
return PyErr_SetFromErrno(PyExc_OSError);
}
-static PyObject *
-posix_error_with_filename(char* name)
-{
- return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
-}
-
-
-static PyObject *
-posix_error_with_allocated_filename(PyObject* name)
-{
- PyObject *name_str, *rc;
- name_str = PyUnicode_DecodeFSDefaultAndSize(PyBytes_AsString(name),
- PyBytes_GET_SIZE(name));
- Py_DECREF(name);
- rc = PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError,
- name_str);
- Py_XDECREF(name_str);
- return rc;
-}
#ifdef MS_WINDOWS
static PyObject *
@@ -1238,24 +1291,13 @@ win32_error(char* function, const char* filename)
}
static PyObject *
-win32_error_unicode(char* function, wchar_t* filename)
-{
- /* XXX - see win32_error for comments on 'function' */
- errno = GetLastError();
- if (filename)
- return PyErr_SetFromWindowsErrWithUnicodeFilename(errno, filename);
- else
- return PyErr_SetFromWindowsErr(errno);
-}
-
-static PyObject *
win32_error_object(char* function, PyObject* filename)
{
/* XXX - see win32_error for comments on 'function' */
errno = GetLastError();
if (filename)
return PyErr_SetExcFromWindowsErrWithFilenameObject(
- PyExc_WindowsError,
+ PyExc_OSError,
errno,
filename);
else
@@ -1264,109 +1306,17 @@ win32_error_object(char* function, PyObject* filename)
#endif /* MS_WINDOWS */
-/*
- * Some functions return Win32 errors, others only ever use posix_error
- * (this is for backwards compatibility with exceptions)
- */
-static PyObject *
-path_posix_error(char *function_name, path_t *path)
-{
- if (path->narrow)
- return posix_error_with_filename(path->narrow);
- return posix_error();
-}
-
static PyObject *
-path_error(char *function_name, path_t *path)
+path_error(path_t *path)
{
#ifdef MS_WINDOWS
- if (path->narrow)
- return win32_error(function_name, path->narrow);
- if (path->wide)
- return win32_error_unicode(function_name, path->wide);
- return win32_error(function_name, NULL);
+ return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError,
+ 0, path->object);
#else
- return path_posix_error(function_name, path);
+ return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object);
#endif
}
-#if defined(PYOS_OS2)
-/**********************************************************************
- * Helper Function to Trim and Format OS/2 Messages
- **********************************************************************/
-static void
-os2_formatmsg(char *msgbuf, int msglen, char *reason)
-{
- msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
-
- if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
- char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
-
- while (lastc > msgbuf && Py_ISSPACE(Py_CHARMASK(*lastc)))
- *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
- }
-
- /* Add Optional Reason Text */
- if (reason) {
- strcat(msgbuf, " : ");
- strcat(msgbuf, reason);
- }
-}
-
-/**********************************************************************
- * Decode an OS/2 Operating System Error Code
- *
- * A convenience function to lookup an OS/2 error code and return a
- * text message we can use to raise a Python exception.
- *
- * Notes:
- * The messages for errors returned from the OS/2 kernel reside in
- * the file OSO001.MSG in the \OS2 directory hierarchy.
- *
- **********************************************************************/
-static char *
-os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
-{
- APIRET rc;
- ULONG msglen;
-
- /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
- Py_BEGIN_ALLOW_THREADS
- rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
- errorcode, "oso001.msg", &msglen);
- Py_END_ALLOW_THREADS
-
- if (rc == NO_ERROR)
- os2_formatmsg(msgbuf, msglen, reason);
- else
- PyOS_snprintf(msgbuf, msgbuflen,
- "unknown OS error #%d", errorcode);
-
- return msgbuf;
-}
-
-/* Set an OS/2-specific error and return NULL. OS/2 kernel
- errors are not in a global variable e.g. 'errno' nor are
- they congruent with posix error numbers. */
-
-static PyObject *
-os2_error(int code)
-{
- char text[1024];
- PyObject *v;
-
- os2_strerror(text, sizeof(text), code, "");
-
- v = Py_BuildValue("(is)", code, text);
- if (v != NULL) {
- PyErr_SetObject(PyExc_OSError, v);
- Py_DECREF(v);
- }
- return NULL; /* Signal to Python that an Exception is Pending */
-}
-
-#endif /* OS2 */
-
/* POSIX generic methods */
static PyObject *
@@ -1389,65 +1339,31 @@ posix_fildes(PyObject *fdobj, int (*func)(int))
}
static PyObject *
-posix_1str(PyObject *args, char *format, int (*func)(const char*))
+posix_1str(const char *func_name, PyObject *args, char *format,
+ int (*func)(const char*))
{
- PyObject *opath1 = NULL;
- char *path1;
+ path_t path;
int res;
+ memset(&path, 0, sizeof(path));
+ path.function_name = func_name;
if (!PyArg_ParseTuple(args, format,
- PyUnicode_FSConverter, &opath1))
+ path_converter, &path))
return NULL;
- path1 = PyBytes_AsString(opath1);
Py_BEGIN_ALLOW_THREADS
- res = (*func)(path1);
+ res = (*func)(path.narrow);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath1);
- Py_DECREF(opath1);
+ if (res < 0) {
+ path_error(&path);
+ path_cleanup(&path);
+ return NULL;
+ }
+ path_cleanup(&path);
Py_INCREF(Py_None);
return Py_None;
}
#ifdef MS_WINDOWS
-static PyObject*
-win32_1str(PyObject* args, char* func,
- char* format, BOOL (__stdcall *funcA)(LPCSTR),
- char* wformat, BOOL (__stdcall *funcW)(LPWSTR))
-{
- PyObject *uni;
- const char *ansi;
- BOOL result;
-
- if (PyArg_ParseTuple(args, wformat, &uni))
- {
- wchar_t *wstr = PyUnicode_AsUnicode(uni);
- if (wstr == NULL)
- return NULL;
- Py_BEGIN_ALLOW_THREADS
- result = funcW(wstr);
- Py_END_ALLOW_THREADS
- if (!result)
- return win32_error_object(func, uni);
- Py_INCREF(Py_None);
- return Py_None;
- }
- PyErr_Clear();
-
- if (!PyArg_ParseTuple(args, format, &ansi))
- return NULL;
- if (win32_warn_bytes_api())
- return NULL;
- Py_BEGIN_ALLOW_THREADS
- result = funcA(ansi);
- Py_END_ALLOW_THREADS
- if (!result)
- return win32_error(func, ansi);
- Py_INCREF(Py_None);
- return Py_None;
-
-}
-
/* This is a reimplementation of the C library's chdir function,
but one that produces Win32 errors instead of DOS error codes.
chdir is essentially a wrapper around SetCurrentDirectory; however,
@@ -1491,14 +1407,14 @@ win32_wchdir(LPCWSTR path)
if (!result)
return FALSE;
if (result > MAX_PATH+1) {
- new_path = malloc(result * sizeof(wchar_t));
+ new_path = PyMem_RawMalloc(result * sizeof(wchar_t));
if (!new_path) {
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
result = GetCurrentDirectoryW(result, new_path);
if (!result) {
- free(new_path);
+ PyMem_RawFree(new_path);
return FALSE;
}
}
@@ -1509,7 +1425,7 @@ win32_wchdir(LPCWSTR path)
env[1] = new_path[0];
result = SetEnvironmentVariableW(env, new_path);
if (new_path != _new_path)
- free(new_path);
+ PyMem_RawFree(new_path);
return result;
}
#endif
@@ -1524,13 +1440,13 @@ win32_wchdir(LPCWSTR path)
#define HAVE_STAT_NSEC 1
struct win32_stat{
- int st_dev;
+ unsigned long st_dev;
__int64 st_ino;
unsigned short st_mode;
int st_nlink;
int st_uid;
int st_gid;
- int st_rdev;
+ unsigned long st_rdev;
__int64 st_size;
time_t st_atime;
int st_atime_nsec;
@@ -1589,6 +1505,8 @@ attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, ULONG reparse_tag, stru
memset(result, 0, sizeof(*result));
result->st_mode = attributes_to_mode(info->dwFileAttributes);
result->st_size = (((__int64)info->nFileSizeHigh)<<32) + info->nFileSizeLow;
+ result->st_dev = info->dwVolumeSerialNumber;
+ result->st_rdev = result->st_dev;
FILE_TIME_to_time_t_nsec(&info->ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
@@ -1596,9 +1514,9 @@ attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, ULONG reparse_tag, stru
result->st_ino = (((__int64)info->nFileIndexHigh)<<32) + info->nFileIndexLow;
if (reparse_tag == IO_REPARSE_TAG_SYMLINK) {
/* first clear the S_IFMT bits */
- result->st_mode ^= (result->st_mode & 0170000);
+ result->st_mode ^= (result->st_mode & S_IFMT);
/* now set the bits that make this a symlink */
- result->st_mode |= 0120000;
+ result->st_mode |= S_IFLNK;
}
return 0;
@@ -1651,7 +1569,7 @@ attributes_from_dir_w(LPCWSTR pszFile, BY_HANDLE_FILE_INFORMATION *info, ULONG *
}
/* Grab GetFinalPathNameByHandle dynamically from kernel32 */
-static int has_GetFinalPathNameByHandle = 0;
+static int has_GetFinalPathNameByHandle = -1;
static DWORD (CALLBACK *Py_GetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD,
DWORD);
static int
@@ -1662,7 +1580,7 @@ check_GetFinalPathNameByHandle()
DWORD);
/* only recheck */
- if (!has_GetFinalPathNameByHandle)
+ if (-1 == has_GetFinalPathNameByHandle)
{
hKernel32 = GetModuleHandleW(L"KERNEL32");
*(FARPROC*)&Py_GetFinalPathNameByHandleA = GetProcAddress(hKernel32,
@@ -1688,7 +1606,7 @@ get_target_path(HANDLE hdl, wchar_t **target_path)
if(!buf_size)
return FALSE;
- buf = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t));
+ buf = (wchar_t *)PyMem_Malloc((buf_size+1)*sizeof(wchar_t));
if (!buf) {
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
@@ -1698,12 +1616,12 @@ get_target_path(HANDLE hdl, wchar_t **target_path)
buf, buf_size, VOLUME_NAME_DOS);
if(!result_length) {
- free(buf);
+ PyMem_Free(buf);
return FALSE;
}
if(!CloseHandle(hdl)) {
- free(buf);
+ PyMem_Free(buf);
return FALSE;
}
@@ -1794,7 +1712,7 @@ win32_xstat_impl(const char *path, struct win32_stat *result,
return -1;
code = win32_xstat_impl_w(target_path, result, FALSE);
- free(target_path);
+ PyMem_Free(target_path);
return code;
}
} else
@@ -1890,7 +1808,7 @@ win32_xstat_impl_w(const wchar_t *path, struct win32_stat *result,
return -1;
code = win32_xstat_impl_w(target_path, result, FALSE);
- free(target_path);
+ PyMem_Free(target_path);
return code;
}
} else
@@ -2289,7 +2207,9 @@ _pystat_fromstructstat(STRUCT_STAT *st)
#else
PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long)st->st_ino));
#endif
-#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
+ PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev));
+#elif defined(HAVE_LONG_LONG)
PyStructSequence_SET_ITEM(v, 2,
PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
#else
@@ -2424,8 +2344,9 @@ posix_do_stat(char *function_name, path_t *path,
result = STAT(path->narrow, &st);
Py_END_ALLOW_THREADS
- if (result != 0)
- return path_error("stat", path);
+ if (result != 0) {
+ return path_error(path);
+ }
return _pystat_fromstructstat(&st);
}
@@ -2456,6 +2377,7 @@ posix_stat(PyObject *self, PyObject *args, PyObject *kwargs)
PyObject *return_value;
memset(&path, 0, sizeof(path));
+ path.function_name = "stat";
path.allow_fd = 1;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&p:stat", keywords,
path_converter, &path,
@@ -2486,6 +2408,7 @@ posix_lstat(PyObject *self, PyObject *args, PyObject *kwargs)
PyObject *return_value;
memset(&path, 0, sizeof(path));
+ path.function_name = "lstat";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:lstat", keywords,
path_converter, &path,
#ifdef HAVE_FSTATAT
@@ -2694,6 +2617,7 @@ posix_chdir(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "chdir";
#ifdef HAVE_FCHDIR
path.allow_fd = 1;
#endif
@@ -2709,8 +2633,6 @@ posix_chdir(PyObject *self, PyObject *args, PyObject *kwargs)
else
result = win32_chdir(path.narrow);
result = !result; /* on unix, success = 0, on windows, success = !0 */
-#elif defined(PYOS_OS2) && defined(PYCC_GCC)
- result = _chdir2(path.narrow);
#else
#ifdef HAVE_FCHDIR
if (path.fd != -1)
@@ -2722,7 +2644,7 @@ posix_chdir(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_error("chdir", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -2786,6 +2708,7 @@ posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
#endif
memset(&path, 0, sizeof(path));
+ path.function_name = "chmod";
#ifdef HAVE_FCHMOD
path.allow_fd = 1;
#endif
@@ -2826,7 +2749,7 @@ posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (!result) {
- return_value = win32_error_object("chmod", path.object);
+ return_value = path_error(&path);
goto exit;
}
#else /* MS_WINDOWS */
@@ -2880,7 +2803,7 @@ posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
}
else
#endif
- return_value = path_error("chmod", &path);
+ return_value = path_error(&path);
goto exit;
}
#endif
@@ -2924,20 +2847,23 @@ Equivalent to chmod(path, mode, follow_symlinks=False).");
static PyObject *
posix_lchmod(PyObject *self, PyObject *args)
{
- PyObject *opath;
- char *path;
+ path_t path;
int i;
int res;
- if (!PyArg_ParseTuple(args, "O&i:lchmod", PyUnicode_FSConverter,
- &opath, &i))
+ memset(&path, 0, sizeof(path));
+ path.function_name = "lchmod";
+ if (!PyArg_ParseTuple(args, "O&i:lchmod",
+ path_converter, &path, &i))
return NULL;
- path = PyBytes_AsString(opath);
Py_BEGIN_ALLOW_THREADS
- res = lchmod(path, i);
+ res = lchmod(path.narrow, i);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
+ if (res < 0) {
+ path_error(&path);
+ path_cleanup(&path);
+ return NULL;
+ }
+ path_cleanup(&path);
Py_RETURN_NONE;
}
#endif /* HAVE_LCHMOD */
@@ -2965,6 +2891,7 @@ posix_chflags(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "flags", "follow_symlinks", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "chflags";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&k|$i:chflags", keywords,
path_converter, &path,
&flags, &follow_symlinks))
@@ -2985,7 +2912,7 @@ posix_chflags(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_posix_error("chflags", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -3008,22 +2935,24 @@ Equivalent to chflags(path, flags, follow_symlinks=False).");
static PyObject *
posix_lchflags(PyObject *self, PyObject *args)
{
- PyObject *opath;
- char *path;
+ path_t path;
unsigned long flags;
int res;
+ memset(&path, 0, sizeof(path));
+ path.function_name = "lchflags";
if (!PyArg_ParseTuple(args, "O&k:lchflags",
- PyUnicode_FSConverter, &opath, &flags))
+ path_converter, &path, &flags))
return NULL;
- path = PyBytes_AsString(opath);
Py_BEGIN_ALLOW_THREADS
- res = lchflags(path, flags);
+ res = lchflags(path.narrow, flags);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
- Py_INCREF(Py_None);
- return Py_None;
+ if (res < 0) {
+ path_error(&path);
+ path_cleanup(&path);
+ return NULL;
+ }
+ path_cleanup(&path);
+ Py_RETURN_NONE;
}
#endif /* HAVE_LCHFLAGS */
@@ -3035,7 +2964,7 @@ Change root directory to path.");
static PyObject *
posix_chroot(PyObject *self, PyObject *args)
{
- return posix_1str(args, "O&:chroot", chroot);
+ return posix_1str("chroot", args, "O&:chroot", chroot);
}
#endif
@@ -3117,6 +3046,7 @@ posix_chown(PyObject *self, PyObject *args, PyObject *kwargs)
"follow_symlinks", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "chown";
#ifdef HAVE_FCHOWN
path.allow_fd = 1;
#endif
@@ -3174,7 +3104,7 @@ posix_chown(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_posix_error("chown", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -3223,23 +3153,26 @@ Equivalent to os.chown(path, uid, gid, follow_symlinks=False).");
static PyObject *
posix_lchown(PyObject *self, PyObject *args)
{
- PyObject *opath;
- char *path;
+ path_t path;
uid_t uid;
gid_t gid;
int res;
+ memset(&path, 0, sizeof(path));
+ path.function_name = "lchown";
if (!PyArg_ParseTuple(args, "O&O&O&:lchown",
- PyUnicode_FSConverter, &opath,
+ path_converter, &path,
_Py_Uid_Converter, &uid,
_Py_Gid_Converter, &gid))
return NULL;
- path = PyBytes_AsString(opath);
Py_BEGIN_ALLOW_THREADS
- res = lchown(path, uid, gid);
+ res = lchown(path.narrow, uid, gid);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
+ if (res < 0) {
+ path_error(&path);
+ path_cleanup(&path);
+ return NULL;
+ }
+ path_cleanup(&path);
Py_INCREF(Py_None);
return Py_None;
}
@@ -3265,7 +3198,7 @@ posix_getcwd(int use_bytes)
terminating \0. If the buffer is too small, len includes
the space needed for the terminator. */
if (len >= sizeof wbuf/ sizeof wbuf[0]) {
- wbuf2 = malloc(len * sizeof(wchar_t));
+ wbuf2 = PyMem_RawMalloc(len * sizeof(wchar_t));
if (wbuf2)
len = GetCurrentDirectoryW(len, wbuf2);
}
@@ -3275,11 +3208,13 @@ posix_getcwd(int use_bytes)
return NULL;
}
if (!len) {
- if (wbuf2 != wbuf) free(wbuf2);
- return win32_error("getcwdu", NULL);
+ if (wbuf2 != wbuf)
+ PyMem_RawFree(wbuf2);
+ return PyErr_SetFromWindowsErr(0);
}
resobj = PyUnicode_FromWideChar(wbuf2, len);
- if (wbuf2 != wbuf) free(wbuf2);
+ if (wbuf2 != wbuf)
+ PyMem_RawFree(wbuf2);
return resobj;
}
@@ -3288,11 +3223,7 @@ posix_getcwd(int use_bytes)
#endif
Py_BEGIN_ALLOW_THREADS
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- res = _getcwd2(buf, sizeof buf);
-#else
res = getcwd(buf, sizeof buf);
-#endif
Py_END_ALLOW_THREADS
if (res == NULL)
return posix_error();
@@ -3359,6 +3290,8 @@ posix_link(PyObject *self, PyObject *args, PyObject *kwargs)
memset(&src, 0, sizeof(src));
memset(&dst, 0, sizeof(dst));
+ src.function_name = "link";
+ dst.function_name = "link";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|O&O&p:link", keywords,
path_converter, &src,
path_converter, &dst,
@@ -3389,7 +3322,7 @@ posix_link(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (!result) {
- return_value = win32_error_object("link", dst.object);
+ return_value = path_error(&src);
goto exit;
}
#else
@@ -3407,7 +3340,7 @@ posix_link(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_error("link", &dst);
+ return_value = path_error(&src);
goto exit;
}
#endif
@@ -3437,17 +3370,11 @@ On some platforms, path may also be specified as an open file descriptor;\n\
the file descriptor must refer to a directory.\n\
If this functionality is unavailable, using it raises NotImplementedError.");
+#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
static PyObject *
-posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
+_listdir_windows_no_opendir(path_t *path, PyObject *list)
{
- path_t path;
- PyObject *list = NULL;
static char *keywords[] = {"path", NULL};
-#ifdef HAVE_FDOPENDIR
- int fd = -1;
-#endif /* HAVE_FDOPENDIR */
-
-#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
PyObject *v;
HANDLE hFindFile = INVALID_HANDLE_VALUE;
BOOL result;
@@ -3458,51 +3385,20 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
Py_ssize_t len = sizeof(namebuf)-5;
PyObject *po = NULL;
wchar_t *wnamebuf = NULL;
-#elif defined(PYOS_OS2)
-#ifndef MAX_PATH
-#define MAX_PATH CCHMAXPATH
-#endif
- char *pt;
- PyObject *v;
- char namebuf[MAX_PATH+5];
- HDIR hdir = 1;
- ULONG srchcnt = 1;
- FILEFINDBUF3 ep;
- APIRET rc;
-#else
- PyObject *v;
- DIR *dirp = NULL;
- struct dirent *ep;
- int return_str; /* if false, return bytes */
-#endif
-
- memset(&path, 0, sizeof(path));
- path.nullable = 1;
-#ifdef HAVE_FDOPENDIR
- path.allow_fd = 1;
- path.fd = -1;
-#endif
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords,
- path_converter, &path
- ))
- return NULL;
- /* XXX Should redo this putting the (now four) versions of opendir
- in separate files instead of having them all here... */
-#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
- if (!path.narrow) {
+ if (!path->narrow) {
WIN32_FIND_DATAW wFileData;
wchar_t *po_wchars;
- if (!path.wide) { /* Default arg: "." */
+ if (!path->wide) { /* Default arg: "." */
po_wchars = L".";
len = 1;
} else {
- po_wchars = path.wide;
- len = wcslen(path.wide);
+ po_wchars = path->wide;
+ len = wcslen(path->wide);
}
/* The +5 is so we can append "\\*.*\0" */
- wnamebuf = malloc((len + 5) * sizeof(wchar_t));
+ wnamebuf = PyMem_Malloc((len + 5) * sizeof(wchar_t));
if (!wnamebuf) {
PyErr_NoMemory();
goto exit;
@@ -3525,8 +3421,7 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
if (error == ERROR_FILE_NOT_FOUND)
goto exit;
Py_DECREF(list);
- list = NULL;
- win32_error_unicode("FindFirstFileW", wnamebuf);
+ list = path_error(path);
goto exit;
}
do {
@@ -3555,15 +3450,15 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
it got to the end of the directory. */
if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
Py_DECREF(list);
- list = win32_error_unicode("FindNextFileW", wnamebuf);
+ list = path_error(path);
goto exit;
}
} while (result == TRUE);
goto exit;
}
- strcpy(namebuf, path.narrow);
- len = path.length;
+ strcpy(namebuf, path->narrow);
+ len = path->length;
if (len > 0) {
char ch = namebuf[len-1];
if (ch != SEP && ch != ALTSEP && ch != ':')
@@ -3582,7 +3477,7 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
if (error == ERROR_FILE_NOT_FOUND)
goto exit;
Py_DECREF(list);
- list = win32_error("FindFirstFile", namebuf);
+ list = path_error(path);
goto exit;
}
do {
@@ -3610,7 +3505,7 @@ posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
it got to the end of the directory. */
if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
Py_DECREF(list);
- list = win32_error("FindNextFile", namebuf);
+ list = path_error(path);
goto exit;
}
} while (result == TRUE);
@@ -3620,86 +3515,34 @@ exit:
if (FindClose(hFindFile) == FALSE) {
if (list != NULL) {
Py_DECREF(list);
- list = win32_error_object("FindClose", path.object);
+ list = path_error(path);
}
}
}
- if (wnamebuf)
- free(wnamebuf);
- path_cleanup(&path);
+ PyMem_Free(wnamebuf);
return list;
+} /* end of _listdir_windows_no_opendir */
-#elif defined(PYOS_OS2)
- if (path.length >= MAX_PATH) {
- PyErr_SetString(PyExc_ValueError, "path too long");
- goto exit;
- }
- strcpy(namebuf, path.narrow);
- for (pt = namebuf; *pt; pt++)
- if (*pt == ALTSEP)
- *pt = SEP;
- if (namebuf[len-1] != SEP)
- namebuf[len++] = SEP;
- strcpy(namebuf + len, "*.*");
-
- if ((list = PyList_New(0)) == NULL) {
- goto exit;
- }
-
- rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
- &hdir, /* Handle to Use While Search Directory */
- FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
- &ep, sizeof(ep), /* Structure to Receive Directory Entry */
- &srchcnt, /* Max and Actual Count of Entries Per Iteration */
- FIL_STANDARD); /* Format of Entry (EAs or Not) */
-
- if (rc != NO_ERROR) {
- errno = ENOENT;
- Py_DECREF(list);
- list = posix_error_with_filename(path.narrow);
- goto exit;
- }
-
- if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
- do {
- if (ep.achName[0] == '.'
- && (ep.achName[1] == '\0' || (ep.achName[1] == '.' && ep.achName[2] == '\0')))
- continue; /* Skip Over "." and ".." Names */
-
- strcpy(namebuf, ep.achName);
-
- /* Leave Case of Name Alone -- In Native Form */
- /* (Removed Forced Lowercasing Code) */
-
- v = PyBytes_FromString(namebuf);
- if (v == NULL) {
- Py_DECREF(list);
- list = NULL;
- break;
- }
- if (PyList_Append(list, v) != 0) {
- Py_DECREF(v);
- Py_DECREF(list);
- list = NULL;
- break;
- }
- Py_DECREF(v);
- } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
- }
-
-exit:
- path_cleanup(&path);
+#else /* thus POSIX, ie: not (MS_WINDOWS and not HAVE_OPENDIR) */
- return list;
-#else
+static PyObject *
+_posix_listdir(path_t *path, PyObject *list)
+{
+ PyObject *v;
+ DIR *dirp = NULL;
+ struct dirent *ep;
+ int return_str; /* if false, return bytes */
+#ifdef HAVE_FDOPENDIR
+ int fd = -1;
+#endif
errno = 0;
#ifdef HAVE_FDOPENDIR
- if (path.fd != -1) {
+ if (path->fd != -1) {
/* closedir() closes the FD, so we duplicate it */
Py_BEGIN_ALLOW_THREADS
- fd = dup(path.fd);
+ fd = dup(path->fd);
Py_END_ALLOW_THREADS
if (fd == -1) {
@@ -3717,10 +3560,10 @@ exit:
#endif
{
char *name;
- if (path.narrow) {
- name = path.narrow;
+ if (path->narrow) {
+ name = path->narrow;
/* only return bytes if they specified a bytes object */
- return_str = !(PyBytes_Check(path.object));
+ return_str = !(PyBytes_Check(path->object));
}
else {
name = ".";
@@ -3733,14 +3576,14 @@ exit:
}
if (dirp == NULL) {
- list = path_error("listdir", &path);
+ list = path_error(path);
#ifdef HAVE_FDOPENDIR
if (fd != -1) {
Py_BEGIN_ALLOW_THREADS
close(fd);
Py_END_ALLOW_THREADS
}
-#endif /* HAVE_FDOPENDIR */
+#endif
goto exit;
}
if ((list = PyList_New(0)) == NULL) {
@@ -3756,7 +3599,7 @@ exit:
break;
} else {
Py_DECREF(list);
- list = path_error("listdir", &path);
+ list = path_error(path);
goto exit;
}
}
@@ -3786,17 +3629,44 @@ exit:
#ifdef HAVE_FDOPENDIR
if (fd > -1)
rewinddir(dirp);
-#endif /* HAVE_FDOPENDIR */
+#endif
closedir(dirp);
Py_END_ALLOW_THREADS
}
- path_cleanup(&path);
-
return list;
+} /* end of _posix_listdir */
+#endif /* which OS */
-#endif /* which OS */
-} /* end of posix_listdir */
+static PyObject *
+posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ PyObject *list = NULL;
+ static char *keywords[] = {"path", NULL};
+ PyObject *return_value;
+
+ memset(&path, 0, sizeof(path));
+ path.function_name = "listdir";
+ path.nullable = 1;
+#ifdef HAVE_FDOPENDIR
+ path.allow_fd = 1;
+ path.fd = -1;
+#endif
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords,
+ path_converter, &path)) {
+ return NULL;
+ }
+
+#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
+ return_value = _listdir_windows_no_opendir(&path, list);
+#else
+ return_value = _posix_listdir(&path, list);
+#endif
+ path_cleanup(&path);
+ return return_value;
+}
#ifdef MS_WINDOWS
/* A helper function for abspath on win32 */
@@ -3823,7 +3693,7 @@ posix__getfullpathname(PyObject *self, PyObject *args)
Py_ARRAY_LENGTH(woutbuf),
woutbuf, &wtemp);
if (result > Py_ARRAY_LENGTH(woutbuf)) {
- woutbufp = malloc(result * sizeof(wchar_t));
+ woutbufp = PyMem_Malloc(result * sizeof(wchar_t));
if (!woutbufp)
return PyErr_NoMemory();
result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
@@ -3833,7 +3703,7 @@ posix__getfullpathname(PyObject *self, PyObject *args)
else
v = win32_error_object("GetFullPathNameW", po);
if (woutbufp != woutbuf)
- free(woutbufp);
+ PyMem_Free(woutbufp);
return v;
}
/* Drop the argument parsing error as narrow strings
@@ -3903,7 +3773,7 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
if(!buf_size)
return win32_error_object("GetFinalPathNameByHandle", po);
- target_path = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t));
+ target_path = (wchar_t *)PyMem_Malloc((buf_size+1)*sizeof(wchar_t));
if(!target_path)
return PyErr_NoMemory();
@@ -3917,36 +3787,11 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
target_path[result_length] = 0;
result = PyUnicode_FromWideChar(target_path, result_length);
- free(target_path);
+ PyMem_Free(target_path);
return result;
} /* end of posix__getfinalpathname */
-static PyObject *
-posix__getfileinformation(PyObject *self, PyObject *args)
-{
- HANDLE hFile;
- BY_HANDLE_FILE_INFORMATION info;
- int fd;
-
- if (!PyArg_ParseTuple(args, "i:_getfileinformation", &fd))
- return NULL;
-
- if (!_PyVerify_fd(fd))
- return posix_error();
-
- hFile = (HANDLE)_get_osfhandle(fd);
- if (hFile == INVALID_HANDLE_VALUE)
- return posix_error();
-
- if (!GetFileInformationByHandle(hFile, &info))
- return win32_error("_getfileinformation", NULL);
-
- return Py_BuildValue("iii", info.dwVolumeSerialNumber,
- info.nFileIndexHigh,
- info.nFileIndexLow);
-}
-
PyDoc_STRVAR(posix__isdir__doc__,
"Return true if the pathname refers to an existing directory.");
@@ -3985,6 +3830,47 @@ check:
else
Py_RETURN_FALSE;
}
+
+PyDoc_STRVAR(posix__getvolumepathname__doc__,
+"Return volume mount point of the specified path.");
+
+/* A helper function for ismount on windows */
+static PyObject *
+posix__getvolumepathname(PyObject *self, PyObject *args)
+{
+ PyObject *po, *result;
+ wchar_t *path, *mountpath=NULL;
+ size_t bufsize;
+ BOOL ret;
+
+ if (!PyArg_ParseTuple(args, "U|:_getvolumepathname", &po))
+ return NULL;
+ path = PyUnicode_AsUnicode(po);
+ if (path == NULL)
+ return NULL;
+
+ /* Volume path should be shorter than entire path */
+ bufsize = max(MAX_PATH, wcslen(path) * 2 * sizeof(wchar_t)+1);
+ mountpath = (wchar_t *)PyMem_Malloc(bufsize);
+ if (mountpath == NULL)
+ return PyErr_NoMemory();
+
+ Py_BEGIN_ALLOW_THREADS
+ ret = GetVolumePathNameW(path, mountpath, bufsize);
+ Py_END_ALLOW_THREADS
+
+ if (!ret) {
+ result = win32_error_object("_getvolumepathname", po);
+ goto exit;
+ }
+ result = PyUnicode_FromWideChar(mountpath, wcslen(mountpath));
+
+exit:
+ PyMem_Free(mountpath);
+ return result;
+}
+/* end of posix__getvolumepathname */
+
#endif /* MS_WINDOWS */
PyDoc_STRVAR(posix_mkdir__doc__,
@@ -4009,6 +3895,7 @@ posix_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
int result;
memset(&path, 0, sizeof(path));
+ path.function_name = "mkdir";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|i$O&:mkdir", keywords,
path_converter, &path, &mode,
#ifdef HAVE_MKDIRAT
@@ -4028,7 +3915,7 @@ posix_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (!result) {
- return_value = win32_error_object("mkdir", path.object);
+ return_value = path_error(&path);
goto exit;
}
#else
@@ -4045,7 +3932,7 @@ posix_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
#endif
Py_END_ALLOW_THREADS
if (result < 0) {
- return_value = path_error("mkdir", &path);
+ return_value = path_error(&path);
goto exit;
}
#endif
@@ -4163,6 +4050,8 @@ internal_rename(PyObject *args, PyObject *kwargs, int is_replace)
memset(&src, 0, sizeof(src));
memset(&dst, 0, sizeof(dst));
+ src.function_name = function_name;
+ dst.function_name = function_name;
strcpy(format, "O&O&|$O&O&:");
strcat(format, function_name);
if (!PyArg_ParseTupleAndKeywords(args, kwargs, format, keywords,
@@ -4196,7 +4085,7 @@ internal_rename(PyObject *args, PyObject *kwargs, int is_replace)
Py_END_ALLOW_THREADS
if (!result) {
- return_value = win32_error_object(function_name, dst.object);
+ return_value = path_error(&src);
goto exit;
}
@@ -4211,7 +4100,7 @@ internal_rename(PyObject *args, PyObject *kwargs, int is_replace)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_error(function_name, &dst);
+ return_value = path_error(&src);
goto exit;
}
#endif
@@ -4275,6 +4164,7 @@ posix_rmdir(PyObject *self, PyObject *args, PyObject *kwargs)
PyObject *return_value = NULL;
memset(&path, 0, sizeof(path));
+ path.function_name = "rmdir";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:rmdir", keywords,
path_converter, &path,
#ifdef HAVE_UNLINKAT
@@ -4303,7 +4193,7 @@ posix_rmdir(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_error("rmdir", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -4431,6 +4321,7 @@ posix_unlink(PyObject *self, PyObject *args, PyObject *kwargs)
PyObject *return_value = NULL;
memset(&path, 0, sizeof(path));
+ path.function_name = "unlink";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:unlink", keywords,
path_converter, &path,
#ifdef HAVE_UNLINKAT
@@ -4459,7 +4350,7 @@ posix_unlink(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_error("unlink", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -4762,6 +4653,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
PyObject *return_value = NULL;
memset(&path, 0, sizeof(path));
+ path.function_name = "utime";
memset(&utime, 0, sizeof(utime_t));
#if UTIME_HAVE_FD
path.allow_fd = 1;
@@ -4857,7 +4749,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
FILE_FLAG_BACKUP_SEMANTICS, NULL);
Py_END_ALLOW_THREADS
if (hFile == INVALID_HANDLE_VALUE) {
- win32_error_object("utime", path.object);
+ path_error(&path);
goto exit;
}
@@ -4866,7 +4758,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
GetSystemTime(&now);
if (!SystemTimeToFileTime(&now, &mtime) ||
!SystemTimeToFileTime(&now, &atime)) {
- win32_error("utime", NULL);
+ PyErr_SetFromWindowsErr(0);
goto exit;
}
}
@@ -4879,7 +4771,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
as that may confuse the user into believing that
something is wrong with the file, when it also
could be the time stamp that gives a problem. */
- win32_error("utime", NULL);
+ PyErr_SetFromWindowsErr(0);
goto exit;
}
#else /* MS_WINDOWS */
@@ -5013,10 +4905,6 @@ parse_envlist(PyObject* env, Py_ssize_t *envc_ptr)
goto error;
}
-#if defined(PYOS_OS2)
- /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
- if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
-#endif
k = PyBytes_AsString(key2);
v = PyBytes_AsString(val2);
len = PyBytes_GET_SIZE(key2) + PyBytes_GET_SIZE(val2) + 2;
@@ -5032,9 +4920,6 @@ parse_envlist(PyObject* env, Py_ssize_t *envc_ptr)
envlist[envc++] = p;
Py_DECREF(key2);
Py_DECREF(val2);
-#if defined(PYOS_OS2)
- }
-#endif
}
Py_DECREF(vals);
Py_DECREF(keys);
@@ -5160,6 +5045,7 @@ posix_execve(PyObject *self, PyObject *args, PyObject *kwargs)
like posix.environ. */
memset(&path, 0, sizeof(path));
+ path.function_name = "execve";
#ifdef HAVE_FEXECVE
path.allow_fd = 1;
#endif
@@ -5199,7 +5085,7 @@ posix_execve(PyObject *self, PyObject *args, PyObject *kwargs)
/* If we get here it's definitely an error */
- path_posix_error("execve", &path);
+ path_error(&path);
while (--envc >= 0)
PyMem_DEL(envlist[envc]);
@@ -5275,18 +5161,12 @@ posix_spawnv(PyObject *self, PyObject *args)
}
argvlist[argc] = NULL;
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- Py_BEGIN_ALLOW_THREADS
- spawnval = spawnv(mode, path, argvlist);
- Py_END_ALLOW_THREADS
-#else
if (mode == _OLD_P_OVERLAY)
mode = _P_OVERLAY;
Py_BEGIN_ALLOW_THREADS
spawnval = _spawnv(mode, path, argvlist);
Py_END_ALLOW_THREADS
-#endif
free_string_array(argvlist, argc);
Py_DECREF(opath);
@@ -5294,11 +5174,7 @@ posix_spawnv(PyObject *self, PyObject *args)
if (spawnval == -1)
return posix_error();
else
-#if SIZEOF_LONG == SIZEOF_VOID_P
- return Py_BuildValue("l", (long) spawnval);
-#else
- return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
-#endif
+ return Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
}
@@ -5374,27 +5250,17 @@ posix_spawnve(PyObject *self, PyObject *args)
if (envlist == NULL)
goto fail_1;
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- Py_BEGIN_ALLOW_THREADS
- spawnval = spawnve(mode, path, argvlist, envlist);
- Py_END_ALLOW_THREADS
-#else
if (mode == _OLD_P_OVERLAY)
mode = _P_OVERLAY;
Py_BEGIN_ALLOW_THREADS
spawnval = _spawnve(mode, path, argvlist, envlist);
Py_END_ALLOW_THREADS
-#endif
if (spawnval == -1)
(void) posix_error();
else
-#if SIZEOF_LONG == SIZEOF_VOID_P
- res = Py_BuildValue("l", (long) spawnval);
-#else
- res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
-#endif
+ res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
while (--envc >= 0)
PyMem_DEL(envlist[envc]);
@@ -5406,183 +5272,6 @@ posix_spawnve(PyObject *self, PyObject *args)
return res;
}
-/* OS/2 supports spawnvp & spawnvpe natively */
-#if defined(PYOS_OS2)
-PyDoc_STRVAR(posix_spawnvp__doc__,
-"spawnvp(mode, file, args)\n\n\
-Execute the program 'file' in a new process, using the environment\n\
-search path to find the file.\n\
-\n\
- mode: mode of process creation\n\
- file: executable file name\n\
- args: tuple or list of strings");
-
-static PyObject *
-posix_spawnvp(PyObject *self, PyObject *args)
-{
- PyObject *opath;
- char *path;
- PyObject *argv;
- char **argvlist;
- int mode, i, argc;
- Py_intptr_t spawnval;
- PyObject *(*getitem)(PyObject *, Py_ssize_t);
-
- /* spawnvp has three arguments: (mode, path, argv), where
- argv is a list or tuple of strings. */
-
- if (!PyArg_ParseTuple(args, "iO&O:spawnvp", &mode,
- PyUnicode_FSConverter,
- &opath, &argv))
- return NULL;
- path = PyBytes_AsString(opath);
- if (PyList_Check(argv)) {
- argc = PyList_Size(argv);
- getitem = PyList_GetItem;
- }
- else if (PyTuple_Check(argv)) {
- argc = PyTuple_Size(argv);
- getitem = PyTuple_GetItem;
- }
- else {
- PyErr_SetString(PyExc_TypeError,
- "spawnvp() arg 2 must be a tuple or list");
- Py_DECREF(opath);
- return NULL;
- }
-
- argvlist = PyMem_NEW(char *, argc+1);
- if (argvlist == NULL) {
- Py_DECREF(opath);
- return PyErr_NoMemory();
- }
- for (i = 0; i < argc; i++) {
- if (!fsconvert_strdup((*getitem)(argv, i),
- &argvlist[i])) {
- free_string_array(argvlist, i);
- PyErr_SetString(
- PyExc_TypeError,
- "spawnvp() arg 2 must contain only strings");
- Py_DECREF(opath);
- return NULL;
- }
- }
- argvlist[argc] = NULL;
-
- Py_BEGIN_ALLOW_THREADS
-#if defined(PYCC_GCC)
- spawnval = spawnvp(mode, path, argvlist);
-#else
- spawnval = _spawnvp(mode, path, argvlist);
-#endif
- Py_END_ALLOW_THREADS
-
- free_string_array(argvlist, argc);
- Py_DECREF(opath);
-
- if (spawnval == -1)
- return posix_error();
- else
- return Py_BuildValue("l", (long) spawnval);
-}
-
-
-PyDoc_STRVAR(posix_spawnvpe__doc__,
-"spawnvpe(mode, file, args, env)\n\n\
-Execute the program 'file' in a new process, using the environment\n\
-search path to find the file.\n\
-\n\
- mode: mode of process creation\n\
- file: executable file name\n\
- args: tuple or list of arguments\n\
- env: dictionary of strings mapping to strings");
-
-static PyObject *
-posix_spawnvpe(PyObject *self, PyObject *args)
-{
- PyObject *opath;
- char *path;
- PyObject *argv, *env;
- char **argvlist;
- char **envlist;
- PyObject *res=NULL;
- int mode;
- Py_ssize_t argc, i, envc;
- Py_intptr_t spawnval;
- PyObject *(*getitem)(PyObject *, Py_ssize_t);
- int lastarg = 0;
-
- /* spawnvpe has four arguments: (mode, path, argv, env), where
- argv is a list or tuple of strings and env is a dictionary
- like posix.environ. */
-
- if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode,
- PyUnicode_FSConverter,
- &opath, &argv, &env))
- return NULL;
- path = PyBytes_AsString(opath);
- if (PyList_Check(argv)) {
- argc = PyList_Size(argv);
- getitem = PyList_GetItem;
- }
- else if (PyTuple_Check(argv)) {
- argc = PyTuple_Size(argv);
- getitem = PyTuple_GetItem;
- }
- else {
- PyErr_SetString(PyExc_TypeError,
- "spawnvpe() arg 2 must be a tuple or list");
- goto fail_0;
- }
- if (!PyMapping_Check(env)) {
- PyErr_SetString(PyExc_TypeError,
- "spawnvpe() arg 3 must be a mapping object");
- goto fail_0;
- }
-
- argvlist = PyMem_NEW(char *, argc+1);
- if (argvlist == NULL) {
- PyErr_NoMemory();
- goto fail_0;
- }
- for (i = 0; i < argc; i++) {
- if (!fsconvert_strdup((*getitem)(argv, i),
- &argvlist[i]))
- {
- lastarg = i;
- goto fail_1;
- }
- }
- lastarg = argc;
- argvlist[argc] = NULL;
-
- envlist = parse_envlist(env, &envc);
- if (envlist == NULL)
- goto fail_1;
-
- Py_BEGIN_ALLOW_THREADS
-#if defined(PYCC_GCC)
- spawnval = spawnvpe(mode, path, argvlist, envlist);
-#else
- spawnval = _spawnvpe(mode, path, argvlist, envlist);
-#endif
- Py_END_ALLOW_THREADS
-
- if (spawnval == -1)
- (void) posix_error();
- else
- res = Py_BuildValue("l", (long) spawnval);
-
- while (--envc >= 0)
- PyMem_DEL(envlist[envc]);
- PyMem_DEL(envlist);
- fail_1:
- free_string_array(argvlist, lastarg);
- fail_0:
- Py_DECREF(opath);
- return res;
-}
-#endif /* PYOS_OS2 */
#endif /* HAVE_SPAWNV */
@@ -6632,23 +6321,8 @@ posix_kill(PyObject *self, PyObject *args)
int sig;
if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:kill", &pid, &sig))
return NULL;
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
- if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
- APIRET rc;
- if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
- return os2_error(rc);
-
- } else if (sig == XCPT_SIGNAL_KILLPROC) {
- APIRET rc;
- if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
- return os2_error(rc);
-
- } else
- return NULL; /* Unrecognized Signal Requested */
-#else
if (kill(pid, sig) == -1)
return posix_error();
-#endif
Py_INCREF(Py_None);
return Py_None;
}
@@ -6686,16 +6360,17 @@ static PyObject *
win32_kill(PyObject *self, PyObject *args)
{
PyObject *result;
- DWORD pid, sig, err;
+ pid_t pid;
+ DWORD sig, err;
HANDLE handle;
- if (!PyArg_ParseTuple(args, "kk:kill", &pid, &sig))
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID "k:kill", &pid, &sig))
return NULL;
/* Console processes which share a common console can be sent CTRL+C or
CTRL+BREAK events, provided they handle said events. */
if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
- if (GenerateConsoleCtrlEvent(sig, pid) == 0) {
+ if (GenerateConsoleCtrlEvent(sig, (DWORD)pid) == 0) {
err = GetLastError();
PyErr_SetFromWindowsErr(err);
}
@@ -6705,7 +6380,7 @@ win32_kill(PyObject *self, PyObject *args)
/* If the signal is outside of what GenerateConsoleCtrlEvent can use,
attempt to open and terminate the process. */
- handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
+ handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);
if (handle == NULL) {
err = GetLastError();
return PyErr_SetFromWindowsErr(err);
@@ -7111,7 +6786,7 @@ posix_waitpid(PyObject *self, PyObject *args)
Py_intptr_t pid;
int status, options;
- if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options))
+ if (!PyArg_ParseTuple(args, _Py_PARSE_INTPTR "i:waitpid", &pid, &options))
return NULL;
Py_BEGIN_ALLOW_THREADS
pid = _cwait(&status, pid, options);
@@ -7120,7 +6795,7 @@ posix_waitpid(PyObject *self, PyObject *args)
return posix_error();
/* shift the status left a byte so this is more like the POSIX waitpid */
- return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
+ return Py_BuildValue(_Py_PARSE_INTPTR "i", pid, status << 8);
}
#endif /* HAVE_WAITPID || HAVE_CWAIT */
@@ -7171,6 +6846,7 @@ posix_readlink(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "dir_fd", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "readlink";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:readlink", keywords,
path_converter, &path,
#ifdef HAVE_READLINKAT
@@ -7191,7 +6867,7 @@ posix_readlink(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (length < 0) {
- return_value = path_posix_error("readlink", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -7227,8 +6903,9 @@ dir_fd may not be implemented on your platform.\n\
/* Grab CreateSymbolicLinkW dynamically from kernel32 */
static DWORD (CALLBACK *Py_CreateSymbolicLinkW)(LPWSTR, LPWSTR, DWORD) = NULL;
static DWORD (CALLBACK *Py_CreateSymbolicLinkA)(LPSTR, LPSTR, DWORD) = NULL;
+
static int
-check_CreateSymbolicLink()
+check_CreateSymbolicLink(void)
{
HINSTANCE hKernel32;
/* only recheck */
@@ -7242,55 +6919,57 @@ check_CreateSymbolicLink()
return (Py_CreateSymbolicLinkW && Py_CreateSymbolicLinkA);
}
-void _dirnameW(WCHAR *path) {
- /* Remove the last portion of the path */
-
+/* Remove the last portion of the path */
+static void
+_dirnameW(WCHAR *path)
+{
WCHAR *ptr;
/* walk the path from the end until a backslash is encountered */
- for(ptr = path + wcslen(path); ptr != path; ptr--)
- {
- if(*ptr == *L"\\" || *ptr == *L"/") {
+ for(ptr = path + wcslen(path); ptr != path; ptr--) {
+ if (*ptr == L'\\' || *ptr == L'/')
break;
- }
}
*ptr = 0;
}
-void _dirnameA(char *path) {
- /* Remove the last portion of the path */
-
+/* Remove the last portion of the path */
+static void
+_dirnameA(char *path)
+{
char *ptr;
/* walk the path from the end until a backslash is encountered */
- for(ptr = path + strlen(path); ptr != path; ptr--)
- {
- if(*ptr == '\\' || *ptr == '/') {
+ for(ptr = path + strlen(path); ptr != path; ptr--) {
+ if (*ptr == '\\' || *ptr == '/')
break;
- }
}
*ptr = 0;
}
-int _is_absW(WCHAR *path) {
- /* Is this path absolute? */
-
+/* Is this path absolute? */
+static int
+_is_absW(const WCHAR *path)
+{
return path[0] == L'\\' || path[0] == L'/' || path[1] == L':';
}
-int _is_absA(char *path) {
- /* Is this path absolute? */
-
+/* Is this path absolute? */
+static int
+_is_absA(const char *path)
+{
return path[0] == '\\' || path[0] == '/' || path[1] == ':';
}
-void _joinW(WCHAR *dest_path, const WCHAR *root, const WCHAR *rest) {
- /* join root and rest with a backslash */
- int root_len;
+/* join root and rest with a backslash */
+static void
+_joinW(WCHAR *dest_path, const WCHAR *root, const WCHAR *rest)
+{
+ size_t root_len;
- if(_is_absW(rest)) {
+ if (_is_absW(rest)) {
wcscpy(dest_path, rest);
return;
}
@@ -7299,17 +6978,19 @@ void _joinW(WCHAR *dest_path, const WCHAR *root, const WCHAR *rest) {
wcscpy(dest_path, root);
if(root_len) {
- dest_path[root_len] = *L"\\";
- root_len += 1;
+ dest_path[root_len] = L'\\';
+ root_len++;
}
wcscpy(dest_path+root_len, rest);
}
-void _joinA(char *dest_path, const char *root, const char *rest) {
- /* join root and rest with a backslash */
- int root_len;
+/* join root and rest with a backslash */
+static void
+_joinA(char *dest_path, const char *root, const char *rest)
+{
+ size_t root_len;
- if(_is_absA(rest)) {
+ if (_is_absA(rest)) {
strcpy(dest_path, rest);
return;
}
@@ -7319,14 +7000,15 @@ void _joinA(char *dest_path, const char *root, const char *rest) {
strcpy(dest_path, root);
if(root_len) {
dest_path[root_len] = '\\';
- root_len += 1;
+ root_len++;
}
strcpy(dest_path+root_len, rest);
}
-int _check_dirW(WCHAR *src, WCHAR *dest)
+/* Return True if the path at src relative to dest is a directory */
+static int
+_check_dirW(WCHAR *src, WCHAR *dest)
{
- /* Return True if the path at src relative to dest is a directory */
WIN32_FILE_ATTRIBUTE_DATA src_info;
WCHAR dest_parent[MAX_PATH];
WCHAR src_resolved[MAX_PATH] = L"";
@@ -7342,18 +7024,19 @@ int _check_dirW(WCHAR *src, WCHAR *dest)
);
}
-int _check_dirA(char *src, char *dest)
+/* Return True if the path at src relative to dest is a directory */
+static int
+_check_dirA(char *src, char *dest)
{
- /* Return True if the path at src relative to dest is a directory */
WIN32_FILE_ATTRIBUTE_DATA src_info;
char dest_parent[MAX_PATH];
char src_resolved[MAX_PATH] = "";
/* dest_parent = os.path.dirname(dest) */
strcpy(dest_parent, dest);
- _dirnameW(dest_parent);
+ _dirnameA(dest_parent);
/* src_resolved = os.path.join(dest_parent, src) */
- _joinW(src_resolved, dest_parent, src);
+ _joinA(src_resolved, dest_parent, src);
return (
GetFileAttributesExA(src_resolved, GetFileExInfoStandard, &src_info)
&& src_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
@@ -7379,8 +7062,10 @@ posix_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
#endif
memset(&src, 0, sizeof(src));
+ src.function_name = "symlink";
src.argument_name = "src";
memset(&dst, 0, sizeof(dst));
+ dst.function_name = "symlink";
dst.argument_name = "dst";
#ifdef MS_WINDOWS
@@ -7433,7 +7118,7 @@ posix_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (!result) {
- return_value = win32_error_object("symlink", src.object);
+ return_value = path_error(&src);
goto exit;
}
@@ -7449,7 +7134,7 @@ posix_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_error("symlink", &dst);
+ return_value = path_error(&src);
goto exit;
}
#endif
@@ -7611,31 +7296,7 @@ Return an object containing floating point numbers indicating process\n\
times. The object behaves like a named tuple with these fields:\n\
(utime, stime, cutime, cstime, elapsed_time)");
-#if defined(PYCC_VACPP) && defined(PYOS_OS2)
-static long
-system_uptime(void)
-{
- ULONG value = 0;
-
- Py_BEGIN_ALLOW_THREADS
- DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
- Py_END_ALLOW_THREADS
-
- return value;
-}
-
-static PyObject *
-posix_times(PyObject *self, PyObject *noargs)
-{
- /* Currently Only Uptime is Provided -- Others Later */
- return build_times_result(
- (double)0 /* t.tms_utime / HZ */,
- (double)0 /* t.tms_stime / HZ */,
- (double)0 /* t.tms_cutime / HZ */,
- (double)0 /* t.tms_cstime / HZ */,
- (double)system_uptime() / 1000);
-}
-#elif defined(MS_WINDOWS)
+#if defined(MS_WINDOWS)
static PyObject *
posix_times(PyObject *self, PyObject *noargs)
{
@@ -7657,7 +7318,7 @@ posix_times(PyObject *self, PyObject *noargs)
(double)0,
(double)0);
}
-#else /* Neither Windows nor OS/2 */
+#else /* Not Windows */
#define NEED_TICKS_PER_SECOND
static long ticks_per_second = -1;
static PyObject *
@@ -7798,6 +7459,7 @@ posix_open(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "flags", "mode", "dir_fd", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "open";
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|i$O&:open", keywords,
path_converter, &path,
&flags, &mode,
@@ -7824,13 +7486,7 @@ posix_open(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (fd == -1) {
-#ifdef MS_WINDOWS
- /* force use of posix_error here for exact backwards compatibility */
- if (path.wide)
- return_value = posix_error();
- else
-#endif
- return_value = path_error("open", &path);
+ PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path.object);
goto exit;
}
@@ -7959,7 +7615,7 @@ static PyObject *
posix_lseek(PyObject *self, PyObject *args)
{
int fd, how;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
PY_LONG_LONG pos, res;
#else
off_t pos, res;
@@ -7987,7 +7643,7 @@ posix_lseek(PyObject *self, PyObject *args)
if (!_PyVerify_fd(fd))
return posix_error();
Py_BEGIN_ALLOW_THREADS
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
res = _lseeki64(fd, pos, how);
#else
res = lseek(fd, pos, how);
@@ -8193,7 +7849,7 @@ posix_write(PyObject *self, PyObject *args)
}
len = pbuf.len;
Py_BEGIN_ALLOW_THREADS
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
if (len > INT_MAX)
len = INT_MAX;
size = write(fd, pbuf.buf, (int)len);
@@ -8230,12 +7886,13 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict)
off_t sbytes;
struct sf_hdtr sf;
int flags = 0;
- sf.headers = NULL;
- sf.trailers = NULL;
static char *keywords[] = {"out", "in",
"offset", "count",
"headers", "trailers", "flags", NULL};
+ sf.headers = NULL;
+ sf.trailers = NULL;
+
#ifdef __APPLE__
if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&O&|OOi:sendfile",
keywords, &out, &in, _parse_off_t, &offset, _parse_off_t, &sbytes,
@@ -8368,7 +8025,7 @@ posix_fstat(PyObject *self, PyObject *args)
Py_END_ALLOW_THREADS
if (res != 0) {
#ifdef MS_WINDOWS
- return win32_error("fstat", NULL);
+ return PyErr_SetFromWindowsErr(0);
#else
return posix_error();
#endif
@@ -8401,16 +8058,6 @@ Create a pipe.");
static PyObject *
posix_pipe(PyObject *self, PyObject *noargs)
{
-#if defined(PYOS_OS2)
- HFILE read, write;
- APIRET rc;
-
- rc = DosCreatePipe( &read, &write, 4096);
- if (rc != NO_ERROR)
- return os2_error(rc);
-
- return Py_BuildValue("(ii)", read, write);
-#else
#if !defined(MS_WINDOWS)
int fds[2];
int res;
@@ -8424,12 +8071,11 @@ posix_pipe(PyObject *self, PyObject *noargs)
BOOL ok;
ok = CreatePipe(&read, &write, NULL, 0);
if (!ok)
- return win32_error("CreatePipe", NULL);
+ return PyErr_SetFromWindowsErr(0);
read_fd = _open_osfhandle((Py_intptr_t)read, 0);
write_fd = _open_osfhandle((Py_intptr_t)write, 1);
return Py_BuildValue("(ii)", read_fd, write_fd);
#endif /* MS_WINDOWS */
-#endif
}
#endif /* HAVE_PIPE */
@@ -8728,6 +8374,7 @@ posix_truncate(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "length", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "truncate";
#ifdef HAVE_FTRUNCATE
path.allow_fd = 1;
#endif
@@ -8745,7 +8392,7 @@ posix_truncate(PyObject *self, PyObject *args, PyObject *kwargs)
res = truncate(path.narrow, length);
Py_END_ALLOW_THREADS
if (res < 0)
- result = path_posix_error("truncate", &path);
+ result = path_error(&path);
else {
Py_INCREF(Py_None);
result = Py_None;
@@ -9217,6 +8864,7 @@ posix_statvfs(PyObject *self, PyObject *args, PyObject *kwargs)
struct statvfs st;
memset(&path, 0, sizeof(path));
+ path.function_name = "statvfs";
#ifdef HAVE_FSTATVFS
path.allow_fd = 1;
#endif
@@ -9243,7 +8891,7 @@ posix_statvfs(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS
if (result) {
- return_value = path_posix_error("statvfs", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -9480,6 +9128,7 @@ posix_pathconf(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "name", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "pathconf";
#ifdef HAVE_FPATHCONF
path.allow_fd = 1;
#endif
@@ -9500,7 +9149,7 @@ posix_pathconf(PyObject *self, PyObject *args, PyObject *kwargs)
/* could be a path or name problem */
posix_error();
else
- result = path_posix_error("pathconf", &path);
+ result = path_error(&path);
}
else
result = PyLong_FromLong(limit);
@@ -9682,7 +9331,7 @@ posix_confstr(PyObject *self, PyObject *args)
PyObject *result = NULL;
int name;
char buffer[255];
- int len;
+ size_t len;
if (!PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name))
return NULL;
@@ -9699,7 +9348,7 @@ posix_confstr(PyObject *self, PyObject *args)
}
}
- if ((unsigned int)len >= sizeof(buffer)) {
+ if (len >= sizeof(buffer)) {
char *buf = PyMem_Malloc(len);
if (buf == NULL)
return PyErr_NoMemory();
@@ -10229,7 +9878,7 @@ posix_sysconf(PyObject *self, PyObject *args)
int name;
if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
- int value;
+ long value;
errno = 0;
value = sysconf(name);
@@ -10559,6 +10208,8 @@ posix_getxattr(PyObject *self, PyObject *args, PyObject *kwargs)
memset(&path, 0, sizeof(path));
memset(&attribute, 0, sizeof(attribute));
+ path.function_name = "getxattr";
+ attribute.function_name = "getxattr";
path.allow_fd = 1;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|$p:getxattr", keywords,
path_converter, &path,
@@ -10575,7 +10226,7 @@ posix_getxattr(PyObject *self, PyObject *args, PyObject *kwargs)
static Py_ssize_t buffer_sizes[] = {128, XATTR_SIZE_MAX, 0};
Py_ssize_t buffer_size = buffer_sizes[i];
if (!buffer_size) {
- path_error("getxattr", &path);
+ path_error(&path);
goto exit;
}
buffer = PyBytes_FromStringAndSize(NULL, buffer_size);
@@ -10597,7 +10248,7 @@ posix_getxattr(PyObject *self, PyObject *args, PyObject *kwargs)
buffer = NULL;
if (errno == ERANGE)
continue;
- path_error("getxattr", &path);
+ path_error(&path);
goto exit;
}
@@ -10636,6 +10287,7 @@ posix_setxattr(PyObject *self, PyObject *args, PyObject *kwargs)
"flags", "follow_symlinks", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "setxattr";
path.allow_fd = 1;
memset(&attribute, 0, sizeof(attribute));
memset(&value, 0, sizeof(value));
@@ -10663,7 +10315,7 @@ posix_setxattr(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS;
if (result) {
- return_value = path_error("setxattr", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -10697,7 +10349,9 @@ posix_removexattr(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "attribute", "follow_symlinks", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "removexattr";
memset(&attribute, 0, sizeof(attribute));
+ attribute.function_name = "removexattr";
path.allow_fd = 1;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|$p:removexattr",
keywords,
@@ -10719,7 +10373,7 @@ posix_removexattr(PyObject *self, PyObject *args, PyObject *kwargs)
Py_END_ALLOW_THREADS;
if (result) {
- return_value = path_error("removexattr", &path);
+ return_value = path_error(&path);
goto exit;
}
@@ -10755,6 +10409,7 @@ posix_listxattr(PyObject *self, PyObject *args, PyObject *kwargs)
static char *keywords[] = {"path", "follow_symlinks", NULL};
memset(&path, 0, sizeof(path));
+ path.function_name = "listxattr";
path.allow_fd = 1;
path.fd = -1;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&$p:listxattr", keywords,
@@ -10773,7 +10428,7 @@ posix_listxattr(PyObject *self, PyObject *args, PyObject *kwargs)
Py_ssize_t buffer_size = buffer_sizes[i];
if (!buffer_size) {
/* ERANGE */
- path_error("listxattr", &path);
+ path_error(&path);
break;
}
buffer = PyMem_MALLOC(buffer_size);
@@ -10797,7 +10452,7 @@ posix_listxattr(PyObject *self, PyObject *args, PyObject *kwargs)
buffer = NULL;
continue;
}
- path_error("listxattr", &path);
+ path_error(&path);
break;
}
@@ -10975,6 +10630,41 @@ get_terminal_size(PyObject *self, PyObject *args)
}
#endif /* defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) */
+PyDoc_STRVAR(posix_cpu_count__doc__,
+"cpu_count() -> integer\n\n\
+Return the number of CPUs in the system, or None if this value cannot be\n\
+established.");
+
+static PyObject *
+posix_cpu_count(PyObject *self)
+{
+ int ncpu = 0;
+#ifdef MS_WINDOWS
+ SYSTEM_INFO sysinfo;
+ GetSystemInfo(&sysinfo);
+ ncpu = sysinfo.dwNumberOfProcessors;
+#elif defined(__hpux)
+ ncpu = mpctl(MPC_GETNUMSPUS, NULL, NULL);
+#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
+ ncpu = sysconf(_SC_NPROCESSORS_ONLN);
+#elif defined(__DragonFly__) || \
+ defined(__OpenBSD__) || \
+ defined(__FreeBSD__) || \
+ defined(__NetBSD__) || \
+ defined(__APPLE__)
+ int mib[2];
+ size_t len = sizeof(ncpu);
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+ if (sysctl(mib, 2, &ncpu, &len, NULL, 0) != 0)
+ ncpu = 0;
+#endif
+ if (ncpu >= 1)
+ return PyLong_FromLong(ncpu);
+ else
+ Py_RETURN_NONE;
+}
+
static PyMethodDef posix_methods[] = {
{"access", (PyCFunction)posix_access,
@@ -11105,10 +10795,6 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_SPAWNV
{"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
{"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
-#if defined(PYOS_OS2)
- {"spawnvp", posix_spawnvp, METH_VARARGS, posix_spawnvp__doc__},
- {"spawnvpe", posix_spawnvpe, METH_VARARGS, posix_spawnvpe__doc__},
-#endif /* PYOS_OS2 */
#endif /* HAVE_SPAWNV */
#ifdef HAVE_FORK1
{"fork1", posix_fork1, METH_NOARGS, posix_fork1__doc__},
@@ -11387,9 +11073,9 @@ static PyMethodDef posix_methods[] = {
#ifdef MS_WINDOWS
{"_getfullpathname", posix__getfullpathname, METH_VARARGS, NULL},
{"_getfinalpathname", posix__getfinalpathname, METH_VARARGS, NULL},
- {"_getfileinformation", posix__getfileinformation, METH_VARARGS, NULL},
{"_isdir", posix__isdir, METH_VARARGS, posix__isdir__doc__},
{"_getdiskusage", win32__getdiskusage, METH_VARARGS, win32__getdiskusage__doc__},
+ {"_getvolumepathname", posix__getvolumepathname, METH_VARARGS, posix__getvolumepathname__doc__},
#endif
#ifdef HAVE_GETLOADAVG
{"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
@@ -11425,69 +11111,12 @@ static PyMethodDef posix_methods[] = {
#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)
{"get_terminal_size", get_terminal_size, METH_VARARGS, termsize__doc__},
#endif
+ {"cpu_count", (PyCFunction)posix_cpu_count,
+ METH_NOARGS, posix_cpu_count__doc__},
{NULL, NULL} /* Sentinel */
};
-static int
-ins(PyObject *module, char *symbol, long value)
-{
- return PyModule_AddIntConstant(module, symbol, value);
-}
-
-#if defined(PYOS_OS2)
-/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
-static int insertvalues(PyObject *module)
-{
- APIRET rc;
- ULONG values[QSV_MAX+1];
- PyObject *v;
- char *ver, tmp[50];
-
- Py_BEGIN_ALLOW_THREADS
- rc = DosQuerySysInfo(1L, QSV_MAX, &values[1], sizeof(ULONG) * QSV_MAX);
- Py_END_ALLOW_THREADS
-
- if (rc != NO_ERROR) {
- os2_error(rc);
- return -1;
- }
-
- if (ins(module, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
- if (ins(module, "memkernel", values[QSV_TOTRESMEM])) return -1;
- if (ins(module, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
- if (ins(module, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
- if (ins(module, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
- if (ins(module, "revision", values[QSV_VERSION_REVISION])) return -1;
- if (ins(module, "timeslice", values[QSV_MIN_SLICE])) return -1;
-
- switch (values[QSV_VERSION_MINOR]) {
- case 0: ver = "2.00"; break;
- case 10: ver = "2.10"; break;
- case 11: ver = "2.11"; break;
- case 30: ver = "3.00"; break;
- case 40: ver = "4.00"; break;
- case 50: ver = "5.00"; break;
- default:
- PyOS_snprintf(tmp, sizeof(tmp),
- "%d-%d", values[QSV_VERSION_MAJOR],
- values[QSV_VERSION_MINOR]);
- ver = &tmp[0];
- }
-
- /* Add Indicator of the Version of the Operating System */
- if (PyModule_AddStringConstant(module, "version", tmp) < 0)
- return -1;
-
- /* Add Indicator of Which Drive was Used to Boot the System */
- tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
- tmp[1] = ':';
- tmp[2] = '\0';
-
- return PyModule_AddStringConstant(module, "bootdrive", tmp);
-}
-#endif
-
#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS)
static int
enable_symlink()
@@ -11518,401 +11147,381 @@ enable_symlink()
#endif /* defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */
static int
-all_ins(PyObject *d)
+all_ins(PyObject *m)
{
#ifdef F_OK
- if (ins(d, "F_OK", (long)F_OK)) return -1;
+ if (PyModule_AddIntMacro(m, F_OK)) return -1;
#endif
#ifdef R_OK
- if (ins(d, "R_OK", (long)R_OK)) return -1;
+ if (PyModule_AddIntMacro(m, R_OK)) return -1;
#endif
#ifdef W_OK
- if (ins(d, "W_OK", (long)W_OK)) return -1;
+ if (PyModule_AddIntMacro(m, W_OK)) return -1;
#endif
#ifdef X_OK
- if (ins(d, "X_OK", (long)X_OK)) return -1;
+ if (PyModule_AddIntMacro(m, X_OK)) return -1;
#endif
#ifdef NGROUPS_MAX
- if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
+ if (PyModule_AddIntMacro(m, NGROUPS_MAX)) return -1;
#endif
#ifdef TMP_MAX
- if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
+ if (PyModule_AddIntMacro(m, TMP_MAX)) return -1;
#endif
#ifdef WCONTINUED
- if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1;
+ if (PyModule_AddIntMacro(m, WCONTINUED)) return -1;
#endif
#ifdef WNOHANG
- if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
+ if (PyModule_AddIntMacro(m, WNOHANG)) return -1;
#endif
#ifdef WUNTRACED
- if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1;
+ if (PyModule_AddIntMacro(m, WUNTRACED)) return -1;
#endif
#ifdef O_RDONLY
- if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
+ if (PyModule_AddIntMacro(m, O_RDONLY)) return -1;
#endif
#ifdef O_WRONLY
- if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
+ if (PyModule_AddIntMacro(m, O_WRONLY)) return -1;
#endif
#ifdef O_RDWR
- if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
+ if (PyModule_AddIntMacro(m, O_RDWR)) return -1;
#endif
#ifdef O_NDELAY
- if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
+ if (PyModule_AddIntMacro(m, O_NDELAY)) return -1;
#endif
#ifdef O_NONBLOCK
- if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
+ if (PyModule_AddIntMacro(m, O_NONBLOCK)) return -1;
#endif
#ifdef O_APPEND
- if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
+ if (PyModule_AddIntMacro(m, O_APPEND)) return -1;
#endif
#ifdef O_DSYNC
- if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
+ if (PyModule_AddIntMacro(m, O_DSYNC)) return -1;
#endif
#ifdef O_RSYNC
- if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
+ if (PyModule_AddIntMacro(m, O_RSYNC)) return -1;
#endif
#ifdef O_SYNC
- if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
+ if (PyModule_AddIntMacro(m, O_SYNC)) return -1;
#endif
#ifdef O_NOCTTY
- if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
+ if (PyModule_AddIntMacro(m, O_NOCTTY)) return -1;
#endif
#ifdef O_CREAT
- if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
+ if (PyModule_AddIntMacro(m, O_CREAT)) return -1;
#endif
#ifdef O_EXCL
- if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
+ if (PyModule_AddIntMacro(m, O_EXCL)) return -1;
#endif
#ifdef O_TRUNC
- if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
+ if (PyModule_AddIntMacro(m, O_TRUNC)) return -1;
#endif
#ifdef O_BINARY
- if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
+ if (PyModule_AddIntMacro(m, O_BINARY)) return -1;
#endif
#ifdef O_TEXT
- if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
+ if (PyModule_AddIntMacro(m, O_TEXT)) return -1;
#endif
#ifdef O_XATTR
- if (ins(d, "O_XATTR", (long)O_XATTR)) return -1;
+ if (PyModule_AddIntMacro(m, O_XATTR)) return -1;
#endif
#ifdef O_LARGEFILE
- if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
+ if (PyModule_AddIntMacro(m, O_LARGEFILE)) return -1;
#endif
#ifdef O_SHLOCK
- if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1;
+ if (PyModule_AddIntMacro(m, O_SHLOCK)) return -1;
#endif
#ifdef O_EXLOCK
- if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1;
+ if (PyModule_AddIntMacro(m, O_EXLOCK)) return -1;
#endif
#ifdef O_EXEC
- if (ins(d, "O_EXEC", (long)O_EXEC)) return -1;
+ if (PyModule_AddIntMacro(m, O_EXEC)) return -1;
#endif
#ifdef O_SEARCH
- if (ins(d, "O_SEARCH", (long)O_SEARCH)) return -1;
+ if (PyModule_AddIntMacro(m, O_SEARCH)) return -1;
+#endif
+#ifdef O_PATH
+ if (PyModule_AddIntMacro(m, O_PATH)) return -1;
#endif
#ifdef O_TTY_INIT
- if (ins(d, "O_TTY_INIT", (long)O_TTY_INIT)) return -1;
+ if (PyModule_AddIntMacro(m, O_TTY_INIT)) return -1;
+#endif
+#ifdef O_TMPFILE
+ if (PyModule_AddIntMacro(m, O_TMPFILE)) return -1;
#endif
#ifdef PRIO_PROCESS
- if (ins(d, "PRIO_PROCESS", (long)PRIO_PROCESS)) return -1;
+ if (PyModule_AddIntMacro(m, PRIO_PROCESS)) return -1;
#endif
#ifdef PRIO_PGRP
- if (ins(d, "PRIO_PGRP", (long)PRIO_PGRP)) return -1;
+ if (PyModule_AddIntMacro(m, PRIO_PGRP)) return -1;
#endif
#ifdef PRIO_USER
- if (ins(d, "PRIO_USER", (long)PRIO_USER)) return -1;
+ if (PyModule_AddIntMacro(m, PRIO_USER)) return -1;
#endif
#ifdef O_CLOEXEC
- if (ins(d, "O_CLOEXEC", (long)O_CLOEXEC)) return -1;
+ if (PyModule_AddIntMacro(m, O_CLOEXEC)) return -1;
#endif
#ifdef O_ACCMODE
- if (ins(d, "O_ACCMODE", (long)O_ACCMODE)) return -1;
+ if (PyModule_AddIntMacro(m, O_ACCMODE)) return -1;
#endif
#ifdef SEEK_HOLE
- if (ins(d, "SEEK_HOLE", (long)SEEK_HOLE)) return -1;
+ if (PyModule_AddIntMacro(m, SEEK_HOLE)) return -1;
#endif
#ifdef SEEK_DATA
- if (ins(d, "SEEK_DATA", (long)SEEK_DATA)) return -1;
+ if (PyModule_AddIntMacro(m, SEEK_DATA)) return -1;
#endif
/* MS Windows */
#ifdef O_NOINHERIT
/* Don't inherit in child processes. */
- if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1;
+ if (PyModule_AddIntMacro(m, O_NOINHERIT)) return -1;
#endif
#ifdef _O_SHORT_LIVED
/* Optimize for short life (keep in memory). */
/* MS forgot to define this one with a non-underscore form too. */
- if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1;
+ if (PyModule_AddIntConstant(m, "O_SHORT_LIVED", _O_SHORT_LIVED)) return -1;
#endif
#ifdef O_TEMPORARY
/* Automatically delete when last handle is closed. */
- if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1;
+ if (PyModule_AddIntMacro(m, O_TEMPORARY)) return -1;
#endif
#ifdef O_RANDOM
/* Optimize for random access. */
- if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1;
+ if (PyModule_AddIntMacro(m, O_RANDOM)) return -1;
#endif
#ifdef O_SEQUENTIAL
/* Optimize for sequential access. */
- if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1;
+ if (PyModule_AddIntMacro(m, O_SEQUENTIAL)) return -1;
#endif
/* GNU extensions. */
#ifdef O_ASYNC
/* Send a SIGIO signal whenever input or output
becomes available on file descriptor */
- if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1;
+ if (PyModule_AddIntMacro(m, O_ASYNC)) return -1;
#endif
#ifdef O_DIRECT
/* Direct disk access. */
- if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1;
+ if (PyModule_AddIntMacro(m, O_DIRECT)) return -1;
#endif
#ifdef O_DIRECTORY
/* Must be a directory. */
- if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1;
+ if (PyModule_AddIntMacro(m, O_DIRECTORY)) return -1;
#endif
#ifdef O_NOFOLLOW
/* Do not follow links. */
- if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
+ if (PyModule_AddIntMacro(m, O_NOFOLLOW)) return -1;
#endif
#ifdef O_NOLINKS
/* Fails if link count of the named file is greater than 1 */
- if (ins(d, "O_NOLINKS", (long)O_NOLINKS)) return -1;
+ if (PyModule_AddIntMacro(m, O_NOLINKS)) return -1;
#endif
#ifdef O_NOATIME
/* Do not update the access time. */
- if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1;
+ if (PyModule_AddIntMacro(m, O_NOATIME)) return -1;
#endif
/* These come from sysexits.h */
#ifdef EX_OK
- if (ins(d, "EX_OK", (long)EX_OK)) return -1;
+ if (PyModule_AddIntMacro(m, EX_OK)) return -1;
#endif /* EX_OK */
#ifdef EX_USAGE
- if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1;
+ if (PyModule_AddIntMacro(m, EX_USAGE)) return -1;
#endif /* EX_USAGE */
#ifdef EX_DATAERR
- if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1;
+ if (PyModule_AddIntMacro(m, EX_DATAERR)) return -1;
#endif /* EX_DATAERR */
#ifdef EX_NOINPUT
- if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1;
+ if (PyModule_AddIntMacro(m, EX_NOINPUT)) return -1;
#endif /* EX_NOINPUT */
#ifdef EX_NOUSER
- if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1;
+ if (PyModule_AddIntMacro(m, EX_NOUSER)) return -1;
#endif /* EX_NOUSER */
#ifdef EX_NOHOST
- if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1;
+ if (PyModule_AddIntMacro(m, EX_NOHOST)) return -1;
#endif /* EX_NOHOST */
#ifdef EX_UNAVAILABLE
- if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1;
+ if (PyModule_AddIntMacro(m, EX_UNAVAILABLE)) return -1;
#endif /* EX_UNAVAILABLE */
#ifdef EX_SOFTWARE
- if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1;
+ if (PyModule_AddIntMacro(m, EX_SOFTWARE)) return -1;
#endif /* EX_SOFTWARE */
#ifdef EX_OSERR
- if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1;
+ if (PyModule_AddIntMacro(m, EX_OSERR)) return -1;
#endif /* EX_OSERR */
#ifdef EX_OSFILE
- if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1;
+ if (PyModule_AddIntMacro(m, EX_OSFILE)) return -1;
#endif /* EX_OSFILE */
#ifdef EX_CANTCREAT
- if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1;
+ if (PyModule_AddIntMacro(m, EX_CANTCREAT)) return -1;
#endif /* EX_CANTCREAT */
#ifdef EX_IOERR
- if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1;
+ if (PyModule_AddIntMacro(m, EX_IOERR)) return -1;
#endif /* EX_IOERR */
#ifdef EX_TEMPFAIL
- if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1;
+ if (PyModule_AddIntMacro(m, EX_TEMPFAIL)) return -1;
#endif /* EX_TEMPFAIL */
#ifdef EX_PROTOCOL
- if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1;
+ if (PyModule_AddIntMacro(m, EX_PROTOCOL)) return -1;
#endif /* EX_PROTOCOL */
#ifdef EX_NOPERM
- if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1;
+ if (PyModule_AddIntMacro(m, EX_NOPERM)) return -1;
#endif /* EX_NOPERM */
#ifdef EX_CONFIG
- if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1;
+ if (PyModule_AddIntMacro(m, EX_CONFIG)) return -1;
#endif /* EX_CONFIG */
#ifdef EX_NOTFOUND
- if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1;
+ if (PyModule_AddIntMacro(m, EX_NOTFOUND)) return -1;
#endif /* EX_NOTFOUND */
/* statvfs */
#ifdef ST_RDONLY
- if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
+ if (PyModule_AddIntMacro(m, ST_RDONLY)) return -1;
#endif /* ST_RDONLY */
#ifdef ST_NOSUID
- if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
+ if (PyModule_AddIntMacro(m, ST_NOSUID)) return -1;
#endif /* ST_NOSUID */
/* FreeBSD sendfile() constants */
#ifdef SF_NODISKIO
- if (ins(d, "SF_NODISKIO", (long)SF_NODISKIO)) return -1;
+ if (PyModule_AddIntMacro(m, SF_NODISKIO)) return -1;
#endif
#ifdef SF_MNOWAIT
- if (ins(d, "SF_MNOWAIT", (long)SF_MNOWAIT)) return -1;
+ if (PyModule_AddIntMacro(m, SF_MNOWAIT)) return -1;
#endif
#ifdef SF_SYNC
- if (ins(d, "SF_SYNC", (long)SF_SYNC)) return -1;
+ if (PyModule_AddIntMacro(m, SF_SYNC)) return -1;
#endif
/* constants for posix_fadvise */
#ifdef POSIX_FADV_NORMAL
- if (ins(d, "POSIX_FADV_NORMAL", (long)POSIX_FADV_NORMAL)) return -1;
+ if (PyModule_AddIntMacro(m, POSIX_FADV_NORMAL)) return -1;
#endif
#ifdef POSIX_FADV_SEQUENTIAL
- if (ins(d, "POSIX_FADV_SEQUENTIAL", (long)POSIX_FADV_SEQUENTIAL)) return -1;
+ if (PyModule_AddIntMacro(m, POSIX_FADV_SEQUENTIAL)) return -1;
#endif
#ifdef POSIX_FADV_RANDOM
- if (ins(d, "POSIX_FADV_RANDOM", (long)POSIX_FADV_RANDOM)) return -1;
+ if (PyModule_AddIntMacro(m, POSIX_FADV_RANDOM)) return -1;
#endif
#ifdef POSIX_FADV_NOREUSE
- if (ins(d, "POSIX_FADV_NOREUSE", (long)POSIX_FADV_NOREUSE)) return -1;
+ if (PyModule_AddIntMacro(m, POSIX_FADV_NOREUSE)) return -1;
#endif
#ifdef POSIX_FADV_WILLNEED
- if (ins(d, "POSIX_FADV_WILLNEED", (long)POSIX_FADV_WILLNEED)) return -1;
+ if (PyModule_AddIntMacro(m, POSIX_FADV_WILLNEED)) return -1;
#endif
#ifdef POSIX_FADV_DONTNEED
- if (ins(d, "POSIX_FADV_DONTNEED", (long)POSIX_FADV_DONTNEED)) return -1;
+ if (PyModule_AddIntMacro(m, POSIX_FADV_DONTNEED)) return -1;
#endif
/* constants for waitid */
#if defined(HAVE_SYS_WAIT_H) && defined(HAVE_WAITID)
- if (ins(d, "P_PID", (long)P_PID)) return -1;
- if (ins(d, "P_PGID", (long)P_PGID)) return -1;
- if (ins(d, "P_ALL", (long)P_ALL)) return -1;
+ if (PyModule_AddIntMacro(m, P_PID)) return -1;
+ if (PyModule_AddIntMacro(m, P_PGID)) return -1;
+ if (PyModule_AddIntMacro(m, P_ALL)) return -1;
#endif
#ifdef WEXITED
- if (ins(d, "WEXITED", (long)WEXITED)) return -1;
+ if (PyModule_AddIntMacro(m, WEXITED)) return -1;
#endif
#ifdef WNOWAIT
- if (ins(d, "WNOWAIT", (long)WNOWAIT)) return -1;
+ if (PyModule_AddIntMacro(m, WNOWAIT)) return -1;
#endif
#ifdef WSTOPPED
- if (ins(d, "WSTOPPED", (long)WSTOPPED)) return -1;
+ if (PyModule_AddIntMacro(m, WSTOPPED)) return -1;
#endif
#ifdef CLD_EXITED
- if (ins(d, "CLD_EXITED", (long)CLD_EXITED)) return -1;
+ if (PyModule_AddIntMacro(m, CLD_EXITED)) return -1;
#endif
#ifdef CLD_DUMPED
- if (ins(d, "CLD_DUMPED", (long)CLD_DUMPED)) return -1;
+ if (PyModule_AddIntMacro(m, CLD_DUMPED)) return -1;
#endif
#ifdef CLD_TRAPPED
- if (ins(d, "CLD_TRAPPED", (long)CLD_TRAPPED)) return -1;
+ if (PyModule_AddIntMacro(m, CLD_TRAPPED)) return -1;
#endif
#ifdef CLD_CONTINUED
- if (ins(d, "CLD_CONTINUED", (long)CLD_CONTINUED)) return -1;
+ if (PyModule_AddIntMacro(m, CLD_CONTINUED)) return -1;
#endif
/* constants for lockf */
#ifdef F_LOCK
- if (ins(d, "F_LOCK", (long)F_LOCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_LOCK)) return -1;
#endif
#ifdef F_TLOCK
- if (ins(d, "F_TLOCK", (long)F_TLOCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_TLOCK)) return -1;
#endif
#ifdef F_ULOCK
- if (ins(d, "F_ULOCK", (long)F_ULOCK)) return -1;
+ if (PyModule_AddIntMacro(m, F_ULOCK)) return -1;
#endif
#ifdef F_TEST
- if (ins(d, "F_TEST", (long)F_TEST)) return -1;
+ if (PyModule_AddIntMacro(m, F_TEST)) return -1;
#endif
#ifdef HAVE_SPAWNV
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- if (ins(d, "P_WAIT", (long)P_WAIT)) return -1;
- if (ins(d, "P_NOWAIT", (long)P_NOWAIT)) return -1;
- if (ins(d, "P_OVERLAY", (long)P_OVERLAY)) return -1;
- if (ins(d, "P_DEBUG", (long)P_DEBUG)) return -1;
- if (ins(d, "P_SESSION", (long)P_SESSION)) return -1;
- if (ins(d, "P_DETACH", (long)P_DETACH)) return -1;
- if (ins(d, "P_PM", (long)P_PM)) return -1;
- if (ins(d, "P_DEFAULT", (long)P_DEFAULT)) return -1;
- if (ins(d, "P_MINIMIZE", (long)P_MINIMIZE)) return -1;
- if (ins(d, "P_MAXIMIZE", (long)P_MAXIMIZE)) return -1;
- if (ins(d, "P_FULLSCREEN", (long)P_FULLSCREEN)) return -1;
- if (ins(d, "P_WINDOWED", (long)P_WINDOWED)) return -1;
- if (ins(d, "P_FOREGROUND", (long)P_FOREGROUND)) return -1;
- if (ins(d, "P_BACKGROUND", (long)P_BACKGROUND)) return -1;
- if (ins(d, "P_NOCLOSE", (long)P_NOCLOSE)) return -1;
- if (ins(d, "P_NOSESSION", (long)P_NOSESSION)) return -1;
- if (ins(d, "P_QUOTE", (long)P_QUOTE)) return -1;
- if (ins(d, "P_TILDE", (long)P_TILDE)) return -1;
- if (ins(d, "P_UNRELATED", (long)P_UNRELATED)) return -1;
- if (ins(d, "P_DEBUGDESC", (long)P_DEBUGDESC)) return -1;
-#else
- if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
- if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
- if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
- if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
- if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
-#endif
+ if (PyModule_AddIntConstant(m, "P_WAIT", _P_WAIT)) return -1;
+ if (PyModule_AddIntConstant(m, "P_NOWAIT", _P_NOWAIT)) return -1;
+ if (PyModule_AddIntConstant(m, "P_OVERLAY", _OLD_P_OVERLAY)) return -1;
+ if (PyModule_AddIntConstant(m, "P_NOWAITO", _P_NOWAITO)) return -1;
+ if (PyModule_AddIntConstant(m, "P_DETACH", _P_DETACH)) return -1;
#endif
#ifdef HAVE_SCHED_H
- if (ins(d, "SCHED_OTHER", (long)SCHED_OTHER)) return -1;
- if (ins(d, "SCHED_FIFO", (long)SCHED_FIFO)) return -1;
- if (ins(d, "SCHED_RR", (long)SCHED_RR)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_OTHER)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_FIFO)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_RR)) return -1;
#ifdef SCHED_SPORADIC
- if (ins(d, "SCHED_SPORADIC", (long)SCHED_SPORADIC) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_SPORADIC) return -1;
#endif
#ifdef SCHED_BATCH
- if (ins(d, "SCHED_BATCH", (long)SCHED_BATCH)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_BATCH)) return -1;
#endif
#ifdef SCHED_IDLE
- if (ins(d, "SCHED_IDLE", (long)SCHED_IDLE)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_IDLE)) return -1;
#endif
#ifdef SCHED_RESET_ON_FORK
- if (ins(d, "SCHED_RESET_ON_FORK", (long)SCHED_RESET_ON_FORK)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_RESET_ON_FORK)) return -1;
#endif
#ifdef SCHED_SYS
- if (ins(d, "SCHED_SYS", (long)SCHED_SYS)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_SYS)) return -1;
#endif
#ifdef SCHED_IA
- if (ins(d, "SCHED_IA", (long)SCHED_IA)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_IA)) return -1;
#endif
#ifdef SCHED_FSS
- if (ins(d, "SCHED_FSS", (long)SCHED_FSS)) return -1;
+ if (PyModule_AddIntMacro(m, SCHED_FSS)) return -1;
#endif
#ifdef SCHED_FX
- if (ins(d, "SCHED_FX", (long)SCHED_FSS)) return -1;
+ if (PyModule_AddIntConstant(m, "SCHED_FX", SCHED_FSS)) return -1;
#endif
#endif
#ifdef USE_XATTRS
- if (ins(d, "XATTR_CREATE", (long)XATTR_CREATE)) return -1;
- if (ins(d, "XATTR_REPLACE", (long)XATTR_REPLACE)) return -1;
- if (ins(d, "XATTR_SIZE_MAX", (long)XATTR_SIZE_MAX)) return -1;
+ if (PyModule_AddIntMacro(m, XATTR_CREATE)) return -1;
+ if (PyModule_AddIntMacro(m, XATTR_REPLACE)) return -1;
+ if (PyModule_AddIntMacro(m, XATTR_SIZE_MAX)) return -1;
#endif
#ifdef RTLD_LAZY
- if (PyModule_AddIntMacro(d, RTLD_LAZY)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_LAZY)) return -1;
#endif
#ifdef RTLD_NOW
- if (PyModule_AddIntMacro(d, RTLD_NOW)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_NOW)) return -1;
#endif
#ifdef RTLD_GLOBAL
- if (PyModule_AddIntMacro(d, RTLD_GLOBAL)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_GLOBAL)) return -1;
#endif
#ifdef RTLD_LOCAL
- if (PyModule_AddIntMacro(d, RTLD_LOCAL)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_LOCAL)) return -1;
#endif
#ifdef RTLD_NODELETE
- if (PyModule_AddIntMacro(d, RTLD_NODELETE)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_NODELETE)) return -1;
#endif
#ifdef RTLD_NOLOAD
- if (PyModule_AddIntMacro(d, RTLD_NOLOAD)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_NOLOAD)) return -1;
#endif
#ifdef RTLD_DEEPBIND
- if (PyModule_AddIntMacro(d, RTLD_DEEPBIND)) return -1;
+ if (PyModule_AddIntMacro(m, RTLD_DEEPBIND)) return -1;
#endif
-#if defined(PYOS_OS2)
- if (insertvalues(d)) return -1;
-#endif
return 0;
}
@@ -11921,10 +11530,6 @@ all_ins(PyObject *d)
#define INITFUNC PyInit_nt
#define MODNAME "nt"
-#elif defined(PYOS_OS2)
-#define INITFUNC PyInit_os2
-#define MODNAME "os2"
-
#else
#define INITFUNC PyInit_posix
#define MODNAME "posix"
@@ -12112,19 +11717,23 @@ INITFUNC(void)
if (!initialized) {
#if defined(HAVE_WAITID) && !defined(__APPLE__)
waitid_result_desc.name = MODNAME ".waitid_result";
- PyStructSequence_InitType(&WaitidResultType, &waitid_result_desc);
+ if (PyStructSequence_InitType2(&WaitidResultType, &waitid_result_desc) < 0)
+ return NULL;
#endif
stat_result_desc.name = MODNAME ".stat_result";
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
- PyStructSequence_InitType(&StatResultType, &stat_result_desc);
+ if (PyStructSequence_InitType2(&StatResultType, &stat_result_desc) < 0)
+ return NULL;
structseq_new = StatResultType.tp_new;
StatResultType.tp_new = statresult_new;
statvfs_result_desc.name = MODNAME ".statvfs_result";
- PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc);
+ if (PyStructSequence_InitType2(&StatVFSResultType,
+ &statvfs_result_desc) < 0)
+ return NULL;
#ifdef NEED_TICKS_PER_SECOND
# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
ticks_per_second = sysconf(_SC_CLK_TCK);
@@ -12137,12 +11746,15 @@ INITFUNC(void)
#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER)
sched_param_desc.name = MODNAME ".sched_param";
- PyStructSequence_InitType(&SchedParamType, &sched_param_desc);
+ if (PyStructSequence_InitType2(&SchedParamType, &sched_param_desc) < 0)
+ return NULL;
SchedParamType.tp_new = sched_param_new;
#endif
/* initialize TerminalSize_info */
- PyStructSequence_InitType(&TerminalSizeType, &TerminalSize_desc);
+ if (PyStructSequence_InitType2(&TerminalSizeType,
+ &TerminalSize_desc) < 0)
+ return NULL;
}
#if defined(HAVE_WAITID) && !defined(__APPLE__)
Py_INCREF((PyObject*) &WaitidResultType);
@@ -12160,11 +11772,13 @@ INITFUNC(void)
#endif
times_result_desc.name = MODNAME ".times_result";
- PyStructSequence_InitType(&TimesResultType, &times_result_desc);
+ if (PyStructSequence_InitType2(&TimesResultType, &times_result_desc) < 0)
+ return NULL;
PyModule_AddObject(m, "times_result", (PyObject *)&TimesResultType);
uname_result_desc.name = MODNAME ".uname_result";
- PyStructSequence_InitType(&UnameResultType, &uname_result_desc);
+ if (PyStructSequence_InitType2(&UnameResultType, &uname_result_desc) < 0)
+ return NULL;
PyModule_AddObject(m, "uname_result", (PyObject *)&UnameResultType);
#ifdef __APPLE__
@@ -12242,7 +11856,6 @@ INITFUNC(void)
initialized = 1;
return m;
-
}
#ifdef __cplusplus
diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
index 285fd9c..9909400 100644
--- a/Modules/pwdmodule.c
+++ b/Modules/pwdmodule.c
@@ -168,12 +168,8 @@ pwd_getpwall(PyObject *self)
struct passwd *p;
if ((d = PyList_New(0)) == NULL)
return NULL;
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- if ((p = getpwuid(0)) != NULL) {
-#else
setpwent();
while ((p = getpwent()) != NULL) {
-#endif
PyObject *v = mkpwent(p);
if (v == NULL || PyList_Append(d, v) != 0) {
Py_XDECREF(v);
@@ -220,8 +216,9 @@ PyInit_pwd(void)
return NULL;
if (!initialized) {
- PyStructSequence_InitType(&StructPwdType,
- &struct_pwd_type_desc);
+ if (PyStructSequence_InitType2(&StructPwdType,
+ &struct_pwd_type_desc) < 0)
+ return NULL;
initialized = 1;
}
Py_INCREF((PyObject *) &StructPwdType);
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 7e51d35..156dbf1 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -10,6 +10,9 @@
#define FIX_TRACE
+static XML_Memory_Handling_Suite ExpatMemoryHandler = {
+ PyObject_Malloc, PyObject_Realloc, PyObject_Free};
+
enum HandlerTypes {
StartElement,
EndElement,
@@ -404,6 +407,10 @@ static void
my_CharacterDataHandler(void *userData, const XML_Char *data, int len)
{
xmlparseobject *self = (xmlparseobject *) userData;
+
+ if (PyErr_Occurred())
+ return;
+
if (self->buffer == NULL)
call_character_handler(self, data, len);
else {
@@ -438,6 +445,9 @@ my_StartElementHandler(void *userData,
PyObject *container, *rv, *args;
int i, max;
+ if (PyErr_Occurred())
+ return;
+
if (flush_character_buffer(self) < 0)
return;
/* Set max to the number of slots filled in atts[]; max/2 is
@@ -521,6 +531,8 @@ my_##NAME##Handler PARAMS {\
INIT \
\
if (have_handler(self, NAME)) { \
+ if (PyErr_Occurred()) \
+ return RETURN; \
if (flush_character_buffer(self) < 0) \
return RETURN; \
args = Py_BuildValue PARAM_FORMAT ;\
@@ -635,6 +647,9 @@ my_ElementDeclHandler(void *userData,
PyObject *rv = NULL;
PyObject *modelobj, *nameobj;
+ if (PyErr_Occurred())
+ return;
+
if (flush_character_buffer(self) < 0)
goto finally;
modelobj = conv_content_model(model, (conv_string_to_unicode));
@@ -1002,7 +1017,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
PyObject_GC_Track(new_parser);
if (self->buffer != NULL) {
- new_parser->buffer = malloc(new_parser->buffer_size);
+ new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
if (new_parser->buffer == NULL) {
Py_DECREF(new_parser);
return PyErr_NoMemory();
@@ -1019,7 +1034,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
for (i = 0; handler_info[i].name != NULL; i++)
/* do nothing */;
- new_parser->handlers = malloc(sizeof(PyObject *) * i);
+ new_parser->handlers = PyMem_Malloc(sizeof(PyObject *) * i);
if (!new_parser->handlers) {
Py_DECREF(new_parser);
return PyErr_NoMemory();
@@ -1127,14 +1142,19 @@ PyUnknownEncodingHandler(void *encodingHandlerData,
void *data;
unsigned int kind;
+ if (PyErr_Occurred())
+ return XML_STATUS_ERROR;
+
if (template_buffer[1] == 0) {
for (i = 0; i < 256; i++)
template_buffer[i] = i;
}
u = PyUnicode_Decode((char*) template_buffer, 256, name, "replace");
- if (u == NULL || PyUnicode_READY(u))
+ if (u == NULL || PyUnicode_READY(u)) {
+ Py_XDECREF(u);
return XML_STATUS_ERROR;
+ }
if (PyUnicode_GET_LENGTH(u) != 256) {
Py_DECREF(u);
@@ -1180,28 +1200,26 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)
self->in_callback = 0;
self->ns_prefixes = 0;
self->handlers = NULL;
- if (namespace_separator != NULL) {
- self->itself = XML_ParserCreateNS(encoding, *namespace_separator);
- }
- else {
- self->itself = XML_ParserCreate(encoding);
- }
-#if ((XML_MAJOR_VERSION >= 2) && (XML_MINOR_VERSION >= 1)) || defined(XML_HAS_SET_HASH_SALT)
- /* This feature was added upstream in libexpat 2.1.0. Our expat copy
- * has a backport of this feature where we also define XML_HAS_SET_HASH_SALT
- * to indicate that we can still use it. */
- XML_SetHashSalt(self->itself,
- (unsigned long)_Py_HashSecret.prefix);
-#endif
self->intern = intern;
Py_XINCREF(self->intern);
PyObject_GC_Track(self);
+
+ /* namespace_separator is either NULL or contains one char + \0 */
+ self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler,
+ namespace_separator);
if (self->itself == NULL) {
PyErr_SetString(PyExc_RuntimeError,
"XML_ParserCreate failed");
Py_DECREF(self);
return NULL;
}
+#if ((XML_MAJOR_VERSION >= 2) && (XML_MINOR_VERSION >= 1)) || defined(XML_HAS_SET_HASH_SALT)
+ /* This feature was added upstream in libexpat 2.1.0. Our expat copy
+ * has a backport of this feature where we also define XML_HAS_SET_HASH_SALT
+ * to indicate that we can still use it. */
+ XML_SetHashSalt(self->itself,
+ (unsigned long)_Py_HashSecret.prefix);
+#endif
XML_SetUserData(self->itself, (void *)self);
XML_SetUnknownEncodingHandler(self->itself,
(XML_UnknownEncodingHandler) PyUnknownEncodingHandler, NULL);
@@ -1209,7 +1227,7 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)
for (i = 0; handler_info[i].name != NULL; i++)
/* do nothing */;
- self->handlers = malloc(sizeof(PyObject *) * i);
+ self->handlers = PyMem_Malloc(sizeof(PyObject *) * i);
if (!self->handlers) {
Py_DECREF(self);
return PyErr_NoMemory();
@@ -1236,11 +1254,11 @@ xmlparse_dealloc(xmlparseobject *self)
self->handlers[i] = NULL;
Py_XDECREF(temp);
}
- free(self->handlers);
+ PyMem_Free(self->handlers);
self->handlers = NULL;
}
if (self->buffer != NULL) {
- free(self->buffer);
+ PyMem_Free(self->buffer);
self->buffer = NULL;
}
Py_XDECREF(self->intern);
@@ -1440,7 +1458,7 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
return -1;
if (b) {
if (self->buffer == NULL) {
- self->buffer = malloc(self->buffer_size);
+ self->buffer = PyMem_Malloc(self->buffer_size);
if (self->buffer == NULL) {
PyErr_NoMemory();
return -1;
@@ -1451,7 +1469,7 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
else if (self->buffer != NULL) {
if (flush_character_buffer(self) < 0)
return -1;
- free(self->buffer);
+ PyMem_Free(self->buffer);
self->buffer = NULL;
}
return 0;
@@ -1513,9 +1531,9 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
}
}
/* free existing buffer */
- free(self->buffer);
+ PyMem_Free(self->buffer);
}
- self->buffer = malloc(new_buffer_size);
+ self->buffer = PyMem_Malloc(new_buffer_size);
if (self->buffer == NULL) {
PyErr_NoMemory();
return -1;
diff --git a/Modules/python.c b/Modules/python.c
index f781d9a..9811c01 100644
--- a/Modules/python.c
+++ b/Modules/python.c
@@ -23,9 +23,12 @@ main(int argc, char **argv)
wchar_t **argv_copy2;
int i, res;
char *oldloc;
+#ifdef __FreeBSD__
+ fp_except_t m;
+#endif
- argv_copy = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1));
- argv_copy2 = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1));
+ argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
+ argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
if (!argv_copy || !argv_copy2) {
fprintf(stderr, "out of memory\n");
return 1;
@@ -37,17 +40,21 @@ main(int argc, char **argv)
* exceptions by default. Here we disable them.
*/
#ifdef __FreeBSD__
- fp_except_t m;
-
m = fpgetmask();
fpsetmask(m & ~FP_X_OFL);
#endif
- oldloc = strdup(setlocale(LC_ALL, NULL));
+
+ oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
+ if (!oldloc) {
+ fprintf(stderr, "out of memory\n");
+ return 1;
+ }
+
setlocale(LC_ALL, "");
for (i = 0; i < argc; i++) {
argv_copy[i] = _Py_char2wchar(argv[i], NULL);
if (!argv_copy[i]) {
- free(oldloc);
+ PyMem_RawFree(oldloc);
fprintf(stderr, "Fatal Python error: "
"unable to decode the command line argument #%i\n",
i + 1);
@@ -58,13 +65,13 @@ main(int argc, char **argv)
argv_copy2[argc] = argv_copy[argc] = NULL;
setlocale(LC_ALL, oldloc);
- free(oldloc);
+ PyMem_RawFree(oldloc);
res = Py_Main(argc, argv_copy);
for (i = 0; i < argc; i++) {
- PyMem_Free(argv_copy2[i]);
+ PyMem_RawFree(argv_copy2[i]);
}
- PyMem_Free(argv_copy);
- PyMem_Free(argv_copy2);
+ PyMem_RawFree(argv_copy);
+ PyMem_RawFree(argv_copy2);
return res;
}
#endif
diff --git a/Modules/readline.c b/Modules/readline.c
index 71c2423..ab24636 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -6,6 +6,7 @@
/* Standard definitions */
#include "Python.h"
+#include <stddef.h>
#include <setjmp.h>
#include <signal.h>
#include <errno.h>
@@ -74,6 +75,55 @@ on_completion_display_matches_hook(char **matches,
(see issue #17289 for the motivation). */
static char *completer_word_break_characters;
+typedef struct {
+ PyObject *completion_display_matches_hook;
+ PyObject *startup_hook;
+ PyObject *pre_input_hook;
+ PyObject *completer;
+ PyObject *begidx;
+ PyObject *endidx;
+} readlinestate;
+
+
+#define readline_state(o) ((readlinestate *)PyModule_GetState(o))
+
+static int
+readline_clear(PyObject *m)
+{
+ readlinestate *state = readline_state(m);
+ Py_CLEAR(state->completion_display_matches_hook);
+ Py_CLEAR(state->startup_hook);
+ Py_CLEAR(state->pre_input_hook);
+ Py_CLEAR(state->completer);
+ Py_CLEAR(state->begidx);
+ Py_CLEAR(state->endidx);
+ return 0;
+}
+
+static int
+readline_traverse(PyObject *m, visitproc visit, void *arg)
+{
+ readlinestate *state = readline_state(m);
+ Py_VISIT(state->completion_display_matches_hook);
+ Py_VISIT(state->startup_hook);
+ Py_VISIT(state->pre_input_hook);
+ Py_VISIT(state->completer);
+ Py_VISIT(state->begidx);
+ Py_VISIT(state->endidx);
+ return 0;
+}
+
+static void
+readline_free(void *m)
+{
+ readline_clear((PyObject *)m);
+}
+
+static PyModuleDef readlinemodule;
+
+#define readlinestate_global ((readlinestate *)PyModule_GetState(PyState_FindModule(&readlinemodule)))
+
+
/* Exported function to send one line to readline's init file parser */
static PyObject *
@@ -84,12 +134,12 @@ parse_and_bind(PyObject *self, PyObject *args)
return NULL;
/* Make a copy -- rl_parse_and_bind() modifies its argument */
/* Bernard Herzog */
- copy = malloc(1 + strlen(s));
+ copy = PyMem_Malloc(1 + strlen(s));
if (copy == NULL)
return PyErr_NoMemory();
strcpy(copy, s);
rl_parse_and_bind(copy);
- free(copy); /* Free the copy */
+ PyMem_Free(copy); /* Free the copy */
Py_RETURN_NONE;
}
@@ -250,23 +300,21 @@ set_hook(const char *funcname, PyObject **hook_var, PyObject *args)
/* Exported functions to specify hook functions in Python */
-static PyObject *completion_display_matches_hook = NULL;
-static PyObject *startup_hook = NULL;
#ifdef HAVE_RL_PRE_INPUT_HOOK
-static PyObject *pre_input_hook = NULL;
+
#endif
static PyObject *
set_completion_display_matches_hook(PyObject *self, PyObject *args)
{
PyObject *result = set_hook("completion_display_matches_hook",
- &completion_display_matches_hook, args);
+ &readlinestate_global->completion_display_matches_hook, args);
#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK
/* We cannot set this hook globally, since it replaces the
default completion display. */
rl_completion_display_matches_hook =
- completion_display_matches_hook ?
+ readlinestate_global->completion_display_matches_hook ?
#if defined(_RL_FUNCTION_TYPEDEF)
(rl_compdisp_func_t *)on_completion_display_matches_hook : 0;
#else
@@ -287,7 +335,7 @@ once each time matches need to be displayed.");
static PyObject *
set_startup_hook(PyObject *self, PyObject *args)
{
- return set_hook("startup_hook", &startup_hook, args);
+ return set_hook("startup_hook", &readlinestate_global->startup_hook, args);
}
PyDoc_STRVAR(doc_set_startup_hook,
@@ -304,7 +352,7 @@ before readline prints the first prompt.");
static PyObject *
set_pre_input_hook(PyObject *self, PyObject *args)
{
- return set_hook("pre_input_hook", &pre_input_hook, args);
+ return set_hook("pre_input_hook", &readlinestate_global->pre_input_hook, args);
}
PyDoc_STRVAR(doc_set_pre_input_hook,
@@ -319,10 +367,10 @@ characters.");
/* Exported function to specify a word completer in Python */
-static PyObject *completer = NULL;
-static PyObject *begidx = NULL;
-static PyObject *endidx = NULL;
+
+
+
/* Get the completion type for the scope of the tab-completion */
@@ -342,8 +390,8 @@ Get the type of completion being attempted.");
static PyObject *
get_begidx(PyObject *self, PyObject *noarg)
{
- Py_INCREF(begidx);
- return begidx;
+ Py_INCREF(readlinestate_global->begidx);
+ return readlinestate_global->begidx;
}
PyDoc_STRVAR(doc_get_begidx,
@@ -356,8 +404,8 @@ get the beginning index of the readline tab-completion scope");
static PyObject *
get_endidx(PyObject *self, PyObject *noarg)
{
- Py_INCREF(endidx);
- return endidx;
+ Py_INCREF(readlinestate_global->endidx);
+ return readlinestate_global->endidx;
}
PyDoc_STRVAR(doc_get_endidx,
@@ -522,7 +570,7 @@ get the readline word delimiters for tab-completion");
static PyObject *
set_completer(PyObject *self, PyObject *args)
{
- return set_hook("completer", &completer, args);
+ return set_hook("completer", &readlinestate_global->completer, args);
}
PyDoc_STRVAR(doc_set_completer,
@@ -536,11 +584,11 @@ It should return the next possible completion starting with 'text'.");
static PyObject *
get_completer(PyObject *self, PyObject *noargs)
{
- if (completer == NULL) {
+ if (readlinestate_global->completer == NULL) {
Py_RETURN_NONE;
}
- Py_INCREF(completer);
- return completer;
+ Py_INCREF(readlinestate_global->completer);
+ return readlinestate_global->completer;
}
PyDoc_STRVAR(doc_get_completer,
@@ -744,9 +792,6 @@ on_hook(PyObject *func)
int result = 0;
if (func != NULL) {
PyObject *r;
-#ifdef WITH_THREAD
- PyGILState_STATE gilstate = PyGILState_Ensure();
-#endif
r = PyObject_CallFunction(func, NULL);
if (r == NULL)
goto error;
@@ -763,9 +808,6 @@ on_hook(PyObject *func)
PyErr_Clear();
Py_XDECREF(r);
done:
-#ifdef WITH_THREAD
- PyGILState_Release(gilstate);
-#endif
return result;
}
return result;
@@ -774,14 +816,30 @@ on_hook(PyObject *func)
static int
on_startup_hook(void)
{
- return on_hook(startup_hook);
+ int r;
+#ifdef WITH_THREAD
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+#endif
+ r = on_hook(readlinestate_global->startup_hook);
+#ifdef WITH_THREAD
+ PyGILState_Release(gilstate);
+#endif
+ return r;
}
#ifdef HAVE_RL_PRE_INPUT_HOOK
static int
on_pre_input_hook(void)
{
- return on_hook(pre_input_hook);
+ int r;
+#ifdef WITH_THREAD
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+#endif
+ r = on_hook(readlinestate_global->pre_input_hook);
+#ifdef WITH_THREAD
+ PyGILState_Release(gilstate);
+#endif
+ return r;
}
#endif
@@ -808,7 +866,7 @@ on_completion_display_matches_hook(char **matches,
if (PyList_SetItem(m, i, s) == -1)
goto error;
}
- r = PyObject_CallFunction(completion_display_matches_hook,
+ r = PyObject_CallFunction(readlinestate_global->completion_display_matches_hook,
"sOi", matches[0], m, max_length);
Py_DECREF(m); m=NULL;
@@ -838,13 +896,13 @@ static char *
on_completion(const char *text, int state)
{
char *result = NULL;
- if (completer != NULL) {
+ if (readlinestate_global->completer != NULL) {
PyObject *r;
#ifdef WITH_THREAD
PyGILState_STATE gilstate = PyGILState_Ensure();
#endif
rl_attempted_completion_over = 1;
- r = PyObject_CallFunction(completer, "si", text, state);
+ r = PyObject_CallFunction(readlinestate_global->completer, "si", text, state);
if (r == NULL)
goto error;
if (r == Py_None) {
@@ -877,24 +935,32 @@ on_completion(const char *text, int state)
static char **
flex_complete(char *text, int start, int end)
{
+ char **result;
+#ifdef WITH_THREAD
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+#endif
#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
rl_completion_append_character ='\0';
#endif
#ifdef HAVE_RL_COMPLETION_SUPPRESS_APPEND
rl_completion_suppress_append = 0;
#endif
- Py_XDECREF(begidx);
- Py_XDECREF(endidx);
- begidx = PyLong_FromLong((long) start);
- endidx = PyLong_FromLong((long) end);
- return completion_matches(text, *on_completion);
+ Py_XDECREF(readlinestate_global->begidx);
+ Py_XDECREF(readlinestate_global->endidx);
+ readlinestate_global->begidx = PyLong_FromLong((long) start);
+ readlinestate_global->endidx = PyLong_FromLong((long) end);
+ result = completion_matches(text, *on_completion);
+#ifdef WITH_THREAD
+ PyGILState_Release(gilstate);
+#endif
+ return result;
}
/* Helper to initialize GNU readline properly. */
static void
-setup_readline(void)
+setup_readline(readlinestate *mod_state)
{
#ifdef SAVE_LOCALE
char *saved_locale = strdup(setlocale(LC_CTYPE, NULL));
@@ -913,10 +979,6 @@ setup_readline(void)
using_history();
rl_readline_name = "python";
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
- /* Allow $if term= in .inputrc to work */
- rl_terminal_name = getenv("TERM");
-#endif
/* Force rebind of TAB to insert-tab */
rl_bind_key('\t', rl_insert);
/* Bind both ESC-TAB and ESC-ESC to the completion function */
@@ -935,8 +997,8 @@ setup_readline(void)
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
/* All nonalphanums except '.' */
- begidx = PyLong_FromLong(0L);
- endidx = PyLong_FromLong(0L);
+ mod_state->begidx = PyLong_FromLong(0L);
+ mod_state->endidx = PyLong_FromLong(0L);
/* Initialize (allows .inputrc to override)
*
* XXX: A bug in the readline-2.2 library causes a memory leak
@@ -1158,12 +1220,12 @@ static struct PyModuleDef readlinemodule = {
PyModuleDef_HEAD_INIT,
"readline",
doc_module,
- -1,
+ sizeof(readlinestate),
readline_methods,
NULL,
- NULL,
- NULL,
- NULL
+ readline_traverse,
+ readline_clear,
+ readline_free
};
@@ -1171,6 +1233,7 @@ PyMODINIT_FUNC
PyInit_readline(void)
{
PyObject *m;
+ readlinestate *mod_state;
#ifdef __APPLE__
if (strncmp(rl_library_version, libedit_version_tag, strlen(libedit_version_tag)) == 0) {
@@ -1187,7 +1250,8 @@ PyInit_readline(void)
if (m == NULL)
return NULL;
+ mod_state = (readlinestate *) PyModule_GetState(m);
PyOS_ReadlineFunctionPointer = call_readline;
- setup_readline();
+ setup_readline(mod_state);
return m;
}
diff --git a/Modules/resource.c b/Modules/resource.c
index b294a8c..8768315 100644
--- a/Modules/resource.c
+++ b/Modules/resource.c
@@ -263,80 +263,83 @@ PyInit_resource(void)
/* Add some symbolic constants to the module */
Py_INCREF(PyExc_OSError);
PyModule_AddObject(m, "error", PyExc_OSError);
- if (!initialized)
- PyStructSequence_InitType(&StructRUsageType,
- &struct_rusage_desc);
+ if (!initialized) {
+ if (PyStructSequence_InitType2(&StructRUsageType,
+ &struct_rusage_desc) < 0)
+ return NULL;
+ }
+
Py_INCREF(&StructRUsageType);
PyModule_AddObject(m, "struct_rusage",
(PyObject*) &StructRUsageType);
/* insert constants */
#ifdef RLIMIT_CPU
- PyModule_AddIntConstant(m, "RLIMIT_CPU", RLIMIT_CPU);
+ PyModule_AddIntMacro(m, RLIMIT_CPU);
#endif
#ifdef RLIMIT_FSIZE
- PyModule_AddIntConstant(m, "RLIMIT_FSIZE", RLIMIT_FSIZE);
+ PyModule_AddIntMacro(m, RLIMIT_FSIZE);
#endif
#ifdef RLIMIT_DATA
- PyModule_AddIntConstant(m, "RLIMIT_DATA", RLIMIT_DATA);
+ PyModule_AddIntMacro(m, RLIMIT_DATA);
#endif
#ifdef RLIMIT_STACK
- PyModule_AddIntConstant(m, "RLIMIT_STACK", RLIMIT_STACK);
+ PyModule_AddIntMacro(m, RLIMIT_STACK);
#endif
#ifdef RLIMIT_CORE
- PyModule_AddIntConstant(m, "RLIMIT_CORE", RLIMIT_CORE);
+ PyModule_AddIntMacro(m, RLIMIT_CORE);
#endif
#ifdef RLIMIT_NOFILE
- PyModule_AddIntConstant(m, "RLIMIT_NOFILE", RLIMIT_NOFILE);
+ PyModule_AddIntMacro(m, RLIMIT_NOFILE);
#endif
#ifdef RLIMIT_OFILE
- PyModule_AddIntConstant(m, "RLIMIT_OFILE", RLIMIT_OFILE);
+ PyModule_AddIntMacro(m, RLIMIT_OFILE);
#endif
#ifdef RLIMIT_VMEM
- PyModule_AddIntConstant(m, "RLIMIT_VMEM", RLIMIT_VMEM);
+ PyModule_AddIntMacro(m, RLIMIT_VMEM);
#endif
#ifdef RLIMIT_AS
- PyModule_AddIntConstant(m, "RLIMIT_AS", RLIMIT_AS);
+ PyModule_AddIntMacro(m, RLIMIT_AS);
#endif
#ifdef RLIMIT_RSS
- PyModule_AddIntConstant(m, "RLIMIT_RSS", RLIMIT_RSS);
+ PyModule_AddIntMacro(m, RLIMIT_RSS);
#endif
#ifdef RLIMIT_NPROC
- PyModule_AddIntConstant(m, "RLIMIT_NPROC", RLIMIT_NPROC);
+ PyModule_AddIntMacro(m, RLIMIT_NPROC);
#endif
#ifdef RLIMIT_MEMLOCK
- PyModule_AddIntConstant(m, "RLIMIT_MEMLOCK", RLIMIT_MEMLOCK);
+ PyModule_AddIntMacro(m, RLIMIT_MEMLOCK);
#endif
#ifdef RLIMIT_SBSIZE
- PyModule_AddIntConstant(m, "RLIMIT_SBSIZE", RLIMIT_SBSIZE);
+ PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
#endif
#ifdef RUSAGE_SELF
- PyModule_AddIntConstant(m, "RUSAGE_SELF", RUSAGE_SELF);
+ PyModule_AddIntMacro(m, RUSAGE_SELF);
#endif
#ifdef RUSAGE_CHILDREN
- PyModule_AddIntConstant(m, "RUSAGE_CHILDREN", RUSAGE_CHILDREN);
+ PyModule_AddIntMacro(m, RUSAGE_CHILDREN);
#endif
#ifdef RUSAGE_BOTH
- PyModule_AddIntConstant(m, "RUSAGE_BOTH", RUSAGE_BOTH);
+ PyModule_AddIntMacro(m, RUSAGE_BOTH);
#endif
#ifdef RUSAGE_THREAD
- PyModule_AddIntConstant(m, "RUSAGE_THREAD", RUSAGE_THREAD);
+ PyModule_AddIntMacro(m, RUSAGE_THREAD);
#endif
#if defined(HAVE_LONG_LONG)
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 92d0e67..414f05a 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -47,11 +47,6 @@ extern void bzero(void *, int);
#include <sys/types.h>
#endif
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-#include <sys/time.h>
-#include <utils.h>
-#endif
-
#ifdef MS_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <winsock.h>
@@ -304,9 +299,9 @@ select_select(PyObject *self, PyObject *args)
else
ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
- Py_DECREF(ifdlist);
- Py_DECREF(ofdlist);
- Py_DECREF(efdlist);
+ Py_XDECREF(ifdlist);
+ Py_XDECREF(ofdlist);
+ Py_XDECREF(efdlist);
}
finally:
@@ -1416,6 +1411,24 @@ Wait for events on the epoll file descriptor for a maximum time of timeout\n\
in seconds (as float). -1 makes poll wait indefinitely.\n\
Up to maxevents are returned to the caller.");
+static PyObject *
+pyepoll_enter(pyEpoll_Object *self, PyObject *args)
+{
+ if (self->epfd < 0)
+ return pyepoll_err_closed();
+
+ Py_INCREF(self);
+ return (PyObject *)self;
+}
+
+static PyObject *
+pyepoll_exit(PyObject *self, PyObject *args)
+{
+ _Py_IDENTIFIER(close);
+
+ return _PyObject_CallMethodId(self, &PyId_close, NULL);
+}
+
static PyMethodDef pyepoll_methods[] = {
{"fromfd", (PyCFunction)pyepoll_fromfd,
METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
@@ -1431,6 +1444,10 @@ static PyMethodDef pyepoll_methods[] = {
METH_VARARGS | METH_KEYWORDS, pyepoll_unregister_doc},
{"poll", (PyCFunction)pyepoll_poll,
METH_VARARGS | METH_KEYWORDS, pyepoll_poll_doc},
+ {"__enter__", (PyCFunction)pyepoll_enter, METH_NOARGS,
+ NULL},
+ {"__exit__", (PyCFunction)pyepoll_exit, METH_VARARGS,
+ NULL},
{NULL, NULL},
};
@@ -2179,7 +2196,7 @@ PyInit_select(void)
#undef PIPE_BUF
#define PIPE_BUF 512
#endif
- PyModule_AddIntConstant(m, "PIPE_BUF", PIPE_BUF);
+ PyModule_AddIntMacro(m, PIPE_BUF);
#endif
#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
@@ -2194,27 +2211,27 @@ PyInit_select(void)
#endif
if (PyType_Ready(&poll_Type) < 0)
return NULL;
- PyModule_AddIntConstant(m, "POLLIN", POLLIN);
- PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
- PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
- PyModule_AddIntConstant(m, "POLLERR", POLLERR);
- PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
- PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
+ PyModule_AddIntMacro(m, POLLIN);
+ PyModule_AddIntMacro(m, POLLPRI);
+ PyModule_AddIntMacro(m, POLLOUT);
+ PyModule_AddIntMacro(m, POLLERR);
+ PyModule_AddIntMacro(m, POLLHUP);
+ PyModule_AddIntMacro(m, POLLNVAL);
#ifdef POLLRDNORM
- PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
+ PyModule_AddIntMacro(m, POLLRDNORM);
#endif
#ifdef POLLRDBAND
- PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
+ PyModule_AddIntMacro(m, POLLRDBAND);
#endif
#ifdef POLLWRNORM
- PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
+ PyModule_AddIntMacro(m, POLLWRNORM);
#endif
#ifdef POLLWRBAND
- PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
+ PyModule_AddIntMacro(m, POLLWRBAND);
#endif
#ifdef POLLMSG
- PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
+ PyModule_AddIntMacro(m, POLLMSG);
#endif
}
#endif /* HAVE_POLL */
@@ -2232,25 +2249,25 @@ PyInit_select(void)
Py_INCREF(&pyEpoll_Type);
PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
- PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
- PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
- PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
- PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
- PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
- PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
+ PyModule_AddIntMacro(m, EPOLLIN);
+ PyModule_AddIntMacro(m, EPOLLOUT);
+ PyModule_AddIntMacro(m, EPOLLPRI);
+ PyModule_AddIntMacro(m, EPOLLERR);
+ PyModule_AddIntMacro(m, EPOLLHUP);
+ PyModule_AddIntMacro(m, EPOLLET);
#ifdef EPOLLONESHOT
/* Kernel 2.6.2+ */
- PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
+ PyModule_AddIntMacro(m, EPOLLONESHOT);
#endif
/* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
- PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
- PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
- PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
- PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
- PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
+ PyModule_AddIntMacro(m, EPOLLRDNORM);
+ PyModule_AddIntMacro(m, EPOLLRDBAND);
+ PyModule_AddIntMacro(m, EPOLLWRNORM);
+ PyModule_AddIntMacro(m, EPOLLWRBAND);
+ PyModule_AddIntMacro(m, EPOLLMSG);
#ifdef EPOLL_CLOEXEC
- PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC);
+ PyModule_AddIntMacro(m, EPOLL_CLOEXEC);
#endif
#endif /* HAVE_EPOLL */
diff --git a/Modules/sha1module.c b/Modules/sha1module.c
index d0f318d..403194c 100644
--- a/Modules/sha1module.c
+++ b/Modules/sha1module.c
@@ -92,10 +92,6 @@ typedef struct {
(y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
(y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
-#ifndef MIN
- #define MIN(x, y) ( ((x)<(y))?(x):(y) )
-#endif
-
/* SHA1 macros */
@@ -220,9 +216,9 @@ sha1_process(struct sha1_state *sha1,
in += SHA1_BLOCKSIZE;
inlen -= SHA1_BLOCKSIZE;
} else {
- n = MIN(inlen, (Py_ssize_t)(SHA1_BLOCKSIZE - sha1->curlen));
+ n = Py_MIN(inlen, (Py_ssize_t)(SHA1_BLOCKSIZE - sha1->curlen));
memcpy(sha1->buf + sha1->curlen, in, (size_t)n);
- sha1->curlen += n;
+ sha1->curlen += (SHA1_INT32)n;
in += n;
inlen -= n;
if (sha1->curlen == SHA1_BLOCKSIZE) {
@@ -415,7 +411,7 @@ SHA1_get_block_size(PyObject *self, void *closure)
static PyObject *
SHA1_get_name(PyObject *self, void *closure)
{
- return PyUnicode_FromStringAndSize("SHA1", 4);
+ return PyUnicode_FromStringAndSize("sha1", 4);
}
static PyObject *
diff --git a/Modules/sha256module.c b/Modules/sha256module.c
index 9f6b416..e60111a 100644
--- a/Modules/sha256module.c
+++ b/Modules/sha256module.c
@@ -21,13 +21,6 @@
#include "hashlib.h"
-/* Endianness testing and definitions */
-#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\
- if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}
-
-#define PCT_LITTLE_ENDIAN 1
-#define PCT_BIG_ENDIAN 0
-
/* Some useful types */
typedef unsigned char SHA_BYTE;
@@ -50,7 +43,6 @@ typedef struct {
SHA_INT32 digest[8]; /* Message digest */
SHA_INT32 count_lo, count_hi; /* 64-bit bit count */
SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */
- int Endianness;
int local; /* unprocessed amount in data */
int digestsize;
} SHAobject;
@@ -58,13 +50,11 @@ typedef struct {
/* When run on a little-endian CPU we need to perform byte reversal on an
array of longwords. */
-static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)
+#if PY_LITTLE_ENDIAN
+static void longReverse(SHA_INT32 *buffer, int byteCount)
{
SHA_INT32 value;
- if ( Endianness == PCT_BIG_ENDIAN )
- return;
-
byteCount /= sizeof(*buffer);
while (byteCount--) {
value = *buffer;
@@ -73,10 +63,10 @@ static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)
*buffer++ = ( value << 16 ) | ( value >> 16 );
}
}
+#endif
static void SHAcopy(SHAobject *src, SHAobject *dest)
{
- dest->Endianness = src->Endianness;
dest->local = src->local;
dest->digestsize = src->digestsize;
dest->count_lo = src->count_lo;
@@ -131,7 +121,9 @@ sha_transform(SHAobject *sha_info)
SHA_INT32 S[8], W[64], t0, t1;
memcpy(W, sha_info->data, sizeof(sha_info->data));
- longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);
+#if PY_LITTLE_ENDIAN
+ longReverse(W, (int)sizeof(sha_info->data));
+#endif
for (i = 16; i < 64; ++i) {
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
@@ -228,7 +220,6 @@ sha_transform(SHAobject *sha_info)
static void
sha_init(SHAobject *sha_info)
{
- TestEndianness(sha_info->Endianness)
sha_info->digest[0] = 0x6A09E667L;
sha_info->digest[1] = 0xBB67AE85L;
sha_info->digest[2] = 0x3C6EF372L;
@@ -246,7 +237,6 @@ sha_init(SHAobject *sha_info)
static void
sha224_init(SHAobject *sha_info)
{
- TestEndianness(sha_info->Endianness)
sha_info->digest[0] = 0xc1059ed8L;
sha_info->digest[1] = 0x367cd507L;
sha_info->digest[2] = 0x3070dd17L;
@@ -284,7 +274,7 @@ sha_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count)
memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);
count -= i;
buffer += i;
- sha_info->local += i;
+ sha_info->local += (int)i;
if (sha_info->local == SHA_BLOCKSIZE) {
sha_transform(sha_info);
}
@@ -299,7 +289,7 @@ sha_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count)
sha_transform(sha_info);
}
memcpy(sha_info->data, buffer, count);
- sha_info->local = count;
+ sha_info->local = (int)count;
}
/* finish computing the SHA digest */
@@ -511,9 +501,9 @@ static PyObject *
SHA256_get_name(PyObject *self, void *closure)
{
if (((SHAobject *)self)->digestsize == 32)
- return PyUnicode_FromStringAndSize("SHA256", 6);
+ return PyUnicode_FromStringAndSize("sha256", 6);
else
- return PyUnicode_FromStringAndSize("SHA224", 6);
+ return PyUnicode_FromStringAndSize("sha224", 6);
}
static PyGetSetDef SHA_getseters[] = {
diff --git a/Modules/sha512module.c b/Modules/sha512module.c
index 5536fd5..2841eab 100644
--- a/Modules/sha512module.c
+++ b/Modules/sha512module.c
@@ -22,13 +22,6 @@
#ifdef PY_LONG_LONG /* If no PY_LONG_LONG, don't compile anything! */
-/* Endianness testing and definitions */
-#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\
- if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}
-
-#define PCT_LITTLE_ENDIAN 1
-#define PCT_BIG_ENDIAN 0
-
/* Some useful types */
typedef unsigned char SHA_BYTE;
@@ -52,7 +45,6 @@ typedef struct {
SHA_INT64 digest[8]; /* Message digest */
SHA_INT32 count_lo, count_hi; /* 64-bit bit count */
SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */
- int Endianness;
int local; /* unprocessed amount in data */
int digestsize;
} SHAobject;
@@ -60,13 +52,11 @@ typedef struct {
/* When run on a little-endian CPU we need to perform byte reversal on an
array of longwords. */
-static void longReverse(SHA_INT64 *buffer, int byteCount, int Endianness)
+#if PY_LITTLE_ENDIAN
+static void longReverse(SHA_INT64 *buffer, int byteCount)
{
SHA_INT64 value;
- if ( Endianness == PCT_BIG_ENDIAN )
- return;
-
byteCount /= sizeof(*buffer);
while (byteCount--) {
value = *buffer;
@@ -83,10 +73,10 @@ static void longReverse(SHA_INT64 *buffer, int byteCount, int Endianness)
buffer++;
}
}
+#endif
static void SHAcopy(SHAobject *src, SHAobject *dest)
{
- dest->Endianness = src->Endianness;
dest->local = src->local;
dest->digestsize = src->digestsize;
dest->count_lo = src->count_lo;
@@ -141,7 +131,9 @@ sha512_transform(SHAobject *sha_info)
SHA_INT64 S[8], W[80], t0, t1;
memcpy(W, sha_info->data, sizeof(sha_info->data));
- longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);
+#if PY_LITTLE_ENDIAN
+ longReverse(W, (int)sizeof(sha_info->data));
+#endif
for (i = 16; i < 80; ++i) {
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
@@ -254,7 +246,6 @@ sha512_transform(SHAobject *sha_info)
static void
sha512_init(SHAobject *sha_info)
{
- TestEndianness(sha_info->Endianness)
sha_info->digest[0] = Py_ULL(0x6a09e667f3bcc908);
sha_info->digest[1] = Py_ULL(0xbb67ae8584caa73b);
sha_info->digest[2] = Py_ULL(0x3c6ef372fe94f82b);
@@ -272,7 +263,6 @@ sha512_init(SHAobject *sha_info)
static void
sha384_init(SHAobject *sha_info)
{
- TestEndianness(sha_info->Endianness)
sha_info->digest[0] = Py_ULL(0xcbbb9d5dc1059ed8);
sha_info->digest[1] = Py_ULL(0x629a292a367cd507);
sha_info->digest[2] = Py_ULL(0x9159015a3070dd17);
@@ -310,7 +300,7 @@ sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count)
memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);
count -= i;
buffer += i;
- sha_info->local += i;
+ sha_info->local += (int)i;
if (sha_info->local == SHA_BLOCKSIZE) {
sha512_transform(sha_info);
}
@@ -325,7 +315,7 @@ sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count)
sha512_transform(sha_info);
}
memcpy(sha_info->data, buffer, count);
- sha_info->local = count;
+ sha_info->local = (int)count;
}
/* finish computing the SHA digest */
@@ -577,9 +567,9 @@ static PyObject *
SHA512_get_name(PyObject *self, void *closure)
{
if (((SHAobject *)self)->digestsize == 64)
- return PyUnicode_FromStringAndSize("SHA512", 6);
+ return PyUnicode_FromStringAndSize("sha512", 6);
else
- return PyUnicode_FromStringAndSize("SHA384", 6);
+ return PyUnicode_FromStringAndSize("sha384", 6);
}
static PyGetSetDef SHA_getseters[] = {
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index fbe1bb7..9a0e8e3 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -9,7 +9,7 @@
#endif
#ifdef MS_WINDOWS
-#include <Windows.h>
+#include <windows.h>
#ifdef HAVE_PROCESS_H
#include <process.h>
#endif
@@ -37,11 +37,6 @@
#define SIG_ERR ((PyOS_sighandler_t)(-1))
#endif
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-#define NSIG 12
-#include <process.h>
-#endif
-
#ifndef NSIG
# if defined(_NSIG)
# define NSIG _NSIG /* For BSD/SysV */
@@ -78,10 +73,6 @@
a working implementation that works in all three cases -- the
handler ignores signals if getpid() isn't the same as in the main
thread. XXX This is a hack.
-
- GNU pth is a user-space threading library, and as such, all threads
- run within the same process. In this case, if the currently running
- thread is not the main_thread, send the signal to the main_thread.
*/
#ifdef WITH_THREAD
@@ -180,15 +171,31 @@ checksignals_witharg(void * unused)
return PyErr_CheckSignals();
}
+static int
+report_wakeup_error(void *data)
+{
+ int save_errno = errno;
+ errno = (int) (Py_intptr_t) data;
+ PyErr_SetFromErrno(PyExc_OSError);
+ PySys_WriteStderr("Exception ignored when trying to write to the "
+ "signal wakeup fd:\n");
+ PyErr_WriteUnraisable(NULL);
+ errno = save_errno;
+ return 0;
+}
+
static void
trip_signal(int sig_num)
{
unsigned char byte;
+ int rc = 0;
Handlers[sig_num].tripped = 1;
if (wakeup_fd != -1) {
byte = (unsigned char)sig_num;
- write(wakeup_fd, &byte, 1);
+ while ((rc = write(wakeup_fd, &byte, 1)) == -1 && errno == EINTR);
+ if (rc == -1)
+ Py_AddPendingCall(report_wakeup_error, (void *) (Py_intptr_t) errno);
}
if (is_tripped)
return;
@@ -203,13 +210,6 @@ signal_handler(int sig_num)
{
int save_errno = errno;
-#if defined(WITH_THREAD) && defined(WITH_PTH)
- if (PyThread_get_thread_ident() != main_thread) {
- pth_raise(*(pth_t *) main_thread, sig_num);
- }
- else
-#endif
- {
#ifdef WITH_THREAD
/* See NOTES section above */
if (getpid() == main_pid)
@@ -231,7 +231,6 @@ signal_handler(int sig_num)
* makes this true. See also issue8354. */
PyOS_setsig(sig_num, signal_handler);
#endif
- }
/* Issue #10311: asynchronously executing signal handlers should not
mutate errno under the feet of unsuspecting C code. */
@@ -983,9 +982,10 @@ PyInit_signal(void)
return NULL;
#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
- if (!initialized)
- PyStructSequence_InitType(&SiginfoType, &struct_siginfo_desc);
-
+ if (!initialized) {
+ if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
+ return NULL;
+ }
Py_INCREF((PyObject*) &SiginfoType);
PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
initialized = 1;
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 1202d38..1e2e84f 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -15,7 +15,7 @@ Limitations:
Module interface:
-- socket.error: exception raised for socket specific errors
+- socket.error: exception raised for socket specific errors, alias for OSError
- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
a subclass of socket.error
- socket.herror: exception raised for gethostby* errors,
@@ -95,9 +95,6 @@ Local naming conventions:
#include "Python.h"
#include "structmember.h"
-#undef MAX
-#define MAX(x, y) ((x) < (y) ? (y) : (x))
-
/* Socket object documentation */
PyDoc_STRVAR(sock_doc,
"socket([family[, type[, proto]]]) -> socket object\n\
@@ -223,13 +220,6 @@ if_indextoname(index) -- return the corresponding interface name\n\
#endif
-#if defined(PYOS_OS2)
-# define INCL_DOS
-# define INCL_DOSERRORS
-# define INCL_NOPMAPI
-# include <os2.h>
-#endif
-
#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
/* make sure that the reentrant (gethostbyaddr_r etc)
functions are declared correctly if compiling with
@@ -286,12 +276,7 @@ if_indextoname(index) -- return the corresponding interface name\n\
# include <unistd.h>
/* Headers needed for inet_ntoa() and inet_addr() */
-# if defined(PYOS_OS2) && defined(PYCC_VACPP)
-# include <netdb.h>
-typedef size_t socklen_t;
-# else
# include <arpa/inet.h>
-# endif
# include <fcntl.h>
@@ -395,11 +380,6 @@ dup_socket(SOCKET handle)
#define snprintf _snprintf
#endif
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-#define SOCKETCLOSE soclose
-#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
-#endif
-
#ifndef SOCKETCLOSE
#define SOCKETCLOSE close
#endif
@@ -534,42 +514,6 @@ set_error(void)
return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
#endif
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
- if (sock_errno() != NO_ERROR) {
- APIRET rc;
- ULONG msglen;
- char outbuf[100];
- int myerrorcode = sock_errno();
-
- /* Retrieve socket-related error message from MPTN.MSG file */
- rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
- myerrorcode - SOCBASEERR + 26,
- "mptn.msg",
- &msglen);
- if (rc == NO_ERROR) {
- PyObject *v;
-
- /* OS/2 doesn't guarantee a terminator */
- outbuf[msglen] = '\0';
- if (strlen(outbuf) > 0) {
- /* If non-empty msg, trim CRLF */
- char *lastc = &outbuf[ strlen(outbuf)-1 ];
- while (lastc > outbuf &&
- Py_ISSPACE(Py_CHARMASK(*lastc))) {
- /* Trim trailing whitespace (CRLF) */
- *lastc-- = '\0';
- }
- }
- v = Py_BuildValue("(is)", myerrorcode, outbuf);
- if (v != NULL) {
- PyErr_SetObject(PyExc_OSError, v);
- Py_DECREF(v);
- }
- return NULL;
- }
- }
-#endif
-
return PyErr_SetFromErrno(PyExc_OSError);
}
@@ -658,20 +602,17 @@ internal_setblocking(PySocketSockObject *s, int block)
Py_BEGIN_ALLOW_THREADS
#ifndef MS_WINDOWS
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
- block = !block;
- ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
-#elif defined(__VMS)
+#if defined(__VMS)
block = !block;
ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
-#else /* !PYOS_OS2 && !__VMS */
+#else /* !__VMS */
delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
if (block)
delay_flag &= (~O_NONBLOCK);
else
delay_flag |= O_NONBLOCK;
fcntl(s->sock_fd, F_SETFL, delay_flag);
-#endif /* !PYOS_OS2 */
+#endif /* !__VMS */
#else /* MS_WINDOWS */
block = !block;
ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
@@ -1329,11 +1270,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
}
addr->sun_family = s->sock_family;
memcpy(addr->sun_path, path, len);
-#if defined(PYOS_OS2)
- *len_ret = sizeof(*addr);
-#else
*len_ret = len + offsetof(struct sockaddr_un, sun_path);
-#endif
retval = 1;
unix_out:
Py_DECREF(args);
@@ -1658,6 +1595,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
case AF_CAN:
switch (s->sock_proto) {
case CAN_RAW:
+ /* fall-through */
+ case CAN_BCM:
{
struct sockaddr_can *addr;
PyObject *interfaceName;
@@ -2613,8 +2552,15 @@ sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
BEGIN_SELECT_LOOP(s)
Py_BEGIN_ALLOW_THREADS
timeout = internal_select_ex(s, 0, interval);
- if (!timeout)
+ if (!timeout) {
+#ifdef MS_WINDOWS
+ if (len > INT_MAX)
+ len = INT_MAX;
+ outlen = recv(s->sock_fd, cbuf, (int)len, flags);
+#else
outlen = recv(s->sock_fd, cbuf, len, flags);
+#endif
+ }
Py_END_ALLOW_THREADS
if (timeout == 1) {
@@ -2821,13 +2767,10 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
timeout = internal_select_ex(s, 0, interval);
if (!timeout) {
#ifndef MS_WINDOWS
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
- n = recvfrom(s->sock_fd, cbuf, len, flags,
- SAS2SA(&addrbuf), &addrlen);
-#else
- n = recvfrom(s->sock_fd, cbuf, len, flags,
+ if (len > INT_MAX)
+ len = INT_MAX;
+ n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
(void *) &addrbuf, &addrlen);
-#endif
#else
n = recvfrom(s->sock_fd, cbuf, len, flags,
SAS2SA(&addrbuf), &addrlen);
@@ -3305,12 +3248,17 @@ sock_send(PySocketSockObject *s, PyObject *args)
BEGIN_SELECT_LOOP(s)
Py_BEGIN_ALLOW_THREADS
timeout = internal_select_ex(s, 1, interval);
- if (!timeout)
+ if (!timeout) {
#ifdef __VMS
n = sendsegmented(s->sock_fd, buf, len, flags);
+#elif defined(MS_WINDOWS)
+ if (len > INT_MAX)
+ len = INT_MAX;
+ n = send(s->sock_fd, buf, (int)len, flags);
#else
n = send(s->sock_fd, buf, len, flags);
#endif
+ }
Py_END_ALLOW_THREADS
if (timeout == 1) {
PyBuffer_Release(&pbuf);
@@ -3360,6 +3308,10 @@ sock_sendall(PySocketSockObject *s, PyObject *args)
if (!timeout) {
#ifdef __VMS
n = sendsegmented(s->sock_fd, buf, len, flags);
+#elif defined(MS_WINDOWS)
+ if (len > INT_MAX)
+ len = INT_MAX;
+ n = send(s->sock_fd, buf, (int)len, flags);
#else
n = send(s->sock_fd, buf, len, flags);
#endif
@@ -3454,8 +3406,17 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
BEGIN_SELECT_LOOP(s)
Py_BEGIN_ALLOW_THREADS
timeout = internal_select_ex(s, 1, interval);
- if (!timeout)
- n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
+ if (!timeout) {
+#ifdef MS_WINDOWS
+ if (len > INT_MAX)
+ len = INT_MAX;
+ n = sendto(s->sock_fd, buf, (int)len, flags,
+ SAS2SA(&addrbuf), addrlen);
+#else
+ n = sendto(s->sock_fd, buf, len, flags,
+ SAS2SA(&addrbuf), addrlen);
+#endif
+ }
Py_END_ALLOW_THREADS
if (timeout == 1) {
@@ -4885,7 +4846,7 @@ socket_inet_pton(PyObject *self, PyObject *args)
char* ip;
int retval;
#ifdef ENABLE_IPV6
- char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
+ char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
#else
char packed[sizeof(struct in_addr)];
#endif
@@ -4936,7 +4897,7 @@ socket_inet_ntop(PyObject *self, PyObject *args)
int len;
const char* retval;
#ifdef ENABLE_IPV6
- char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
+ char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
#else
char ip[INET_ADDRSTRLEN + 1];
#endif
@@ -5522,32 +5483,6 @@ os_init(void)
#endif /* MS_WINDOWS */
-#ifdef PYOS_OS2
-#define OS_INIT_DEFINED
-
-/* Additional initialization for OS/2 */
-
-static int
-os_init(void)
-{
-#ifndef PYCC_GCC
- int rc = sock_init();
-
- if (rc == 0) {
- return 1; /* Success */
- }
-
- PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
-
- return 0; /* Failure */
-#else
- /* No need to initialize sockets with GCC/EMX */
- return 1; /* Success */
-#endif
-}
-
-#endif /* PYOS_OS2 */
-
#ifndef OS_INIT_DEFINED
static int
@@ -5657,184 +5592,187 @@ PyInit__socket(void)
/* Address families (we only support AF_INET and AF_UNIX) */
#ifdef AF_UNSPEC
- PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
+ PyModule_AddIntMacro(m, AF_UNSPEC);
#endif
- PyModule_AddIntConstant(m, "AF_INET", AF_INET);
+ PyModule_AddIntMacro(m, AF_INET);
#ifdef AF_INET6
- PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
+ PyModule_AddIntMacro(m, AF_INET6);
#endif /* AF_INET6 */
#if defined(AF_UNIX)
- PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
+ PyModule_AddIntMacro(m, AF_UNIX);
#endif /* AF_UNIX */
#ifdef AF_AX25
/* Amateur Radio AX.25 */
- PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
+ PyModule_AddIntMacro(m, AF_AX25);
#endif
#ifdef AF_IPX
- PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
+ PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
#endif
#ifdef AF_APPLETALK
/* Appletalk DDP */
- PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
+ PyModule_AddIntMacro(m, AF_APPLETALK);
#endif
#ifdef AF_NETROM
/* Amateur radio NetROM */
- PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
+ PyModule_AddIntMacro(m, AF_NETROM);
#endif
#ifdef AF_BRIDGE
/* Multiprotocol bridge */
- PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
+ PyModule_AddIntMacro(m, AF_BRIDGE);
#endif
#ifdef AF_ATMPVC
/* ATM PVCs */
- PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
+ PyModule_AddIntMacro(m, AF_ATMPVC);
#endif
#ifdef AF_AAL5
/* Reserved for Werner's ATM */
- PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
+ PyModule_AddIntMacro(m, AF_AAL5);
#endif
#ifdef AF_X25
/* Reserved for X.25 project */
- PyModule_AddIntConstant(m, "AF_X25", AF_X25);
+ PyModule_AddIntMacro(m, AF_X25);
#endif
#ifdef AF_INET6
- PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
+ PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
#endif
#ifdef AF_ROSE
/* Amateur Radio X.25 PLP */
- PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
+ PyModule_AddIntMacro(m, AF_ROSE);
#endif
#ifdef AF_DECnet
/* Reserved for DECnet project */
- PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
+ PyModule_AddIntMacro(m, AF_DECnet);
#endif
#ifdef AF_NETBEUI
/* Reserved for 802.2LLC project */
- PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
+ PyModule_AddIntMacro(m, AF_NETBEUI);
#endif
#ifdef AF_SECURITY
/* Security callback pseudo AF */
- PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
+ PyModule_AddIntMacro(m, AF_SECURITY);
#endif
#ifdef AF_KEY
/* PF_KEY key management API */
- PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
+ PyModule_AddIntMacro(m, AF_KEY);
#endif
#ifdef AF_NETLINK
/* */
- PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
- PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
+ PyModule_AddIntMacro(m, AF_NETLINK);
+ PyModule_AddIntMacro(m, NETLINK_ROUTE);
#ifdef NETLINK_SKIP
- PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
+ PyModule_AddIntMacro(m, NETLINK_SKIP);
#endif
#ifdef NETLINK_W1
- PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
+ PyModule_AddIntMacro(m, NETLINK_W1);
#endif
- PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
- PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
+ PyModule_AddIntMacro(m, NETLINK_USERSOCK);
+ PyModule_AddIntMacro(m, NETLINK_FIREWALL);
#ifdef NETLINK_TCPDIAG
- PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
+ PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
#endif
#ifdef NETLINK_NFLOG
- PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
+ PyModule_AddIntMacro(m, NETLINK_NFLOG);
#endif
#ifdef NETLINK_XFRM
- PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
+ PyModule_AddIntMacro(m, NETLINK_XFRM);
#endif
#ifdef NETLINK_ARPD
- PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
+ PyModule_AddIntMacro(m, NETLINK_ARPD);
#endif
#ifdef NETLINK_ROUTE6
- PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
+ PyModule_AddIntMacro(m, NETLINK_ROUTE6);
#endif
- PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
+ PyModule_AddIntMacro(m, NETLINK_IP6_FW);
#ifdef NETLINK_DNRTMSG
- PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
+ PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
#endif
#ifdef NETLINK_TAPBASE
- PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
+ PyModule_AddIntMacro(m, NETLINK_TAPBASE);
#endif
#endif /* AF_NETLINK */
#ifdef AF_ROUTE
/* Alias to emulate 4.4BSD */
- PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
+ PyModule_AddIntMacro(m, AF_ROUTE);
+#endif
+#ifdef AF_LINK
+ PyModule_AddIntMacro(m, AF_LINK);
#endif
#ifdef AF_ASH
/* Ash */
- PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
+ PyModule_AddIntMacro(m, AF_ASH);
#endif
#ifdef AF_ECONET
/* Acorn Econet */
- PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
+ PyModule_AddIntMacro(m, AF_ECONET);
#endif
#ifdef AF_ATMSVC
/* ATM SVCs */
- PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
+ PyModule_AddIntMacro(m, AF_ATMSVC);
#endif
#ifdef AF_SNA
/* Linux SNA Project (nutters!) */
- PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
+ PyModule_AddIntMacro(m, AF_SNA);
#endif
#ifdef AF_IRDA
/* IRDA sockets */
- PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
+ PyModule_AddIntMacro(m, AF_IRDA);
#endif
#ifdef AF_PPPOX
/* PPPoX sockets */
- PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
+ PyModule_AddIntMacro(m, AF_PPPOX);
#endif
#ifdef AF_WANPIPE
/* Wanpipe API Sockets */
- PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
+ PyModule_AddIntMacro(m, AF_WANPIPE);
#endif
#ifdef AF_LLC
/* Linux LLC */
- PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
+ PyModule_AddIntMacro(m, AF_LLC);
#endif
#ifdef USE_BLUETOOTH
- PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
- PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
- PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
- PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
+ PyModule_AddIntMacro(m, AF_BLUETOOTH);
+ PyModule_AddIntMacro(m, BTPROTO_L2CAP);
+ PyModule_AddIntMacro(m, BTPROTO_HCI);
+ PyModule_AddIntMacro(m, SOL_HCI);
#if !defined(__NetBSD__) && !defined(__DragonFly__)
- PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
+ PyModule_AddIntMacro(m, HCI_FILTER);
#endif
#if !defined(__FreeBSD__)
#if !defined(__NetBSD__) && !defined(__DragonFly__)
- PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
+ PyModule_AddIntMacro(m, HCI_TIME_STAMP);
#endif
- PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
- PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
+ PyModule_AddIntMacro(m, HCI_DATA_DIR);
+ PyModule_AddIntMacro(m, BTPROTO_SCO);
#endif
- PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
+ PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
#endif
#ifdef AF_CAN
/* Controller Area Network */
- PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
+ PyModule_AddIntMacro(m, AF_CAN);
#endif
#ifdef PF_CAN
/* Controller Area Network */
- PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
+ PyModule_AddIntMacro(m, PF_CAN);
#endif
/* Reliable Datagram Sockets */
#ifdef AF_RDS
- PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
+ PyModule_AddIntMacro(m, AF_RDS);
#endif
#ifdef PF_RDS
- PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
+ PyModule_AddIntMacro(m, PF_RDS);
#endif
/* Kernel event messages */
#ifdef PF_SYSTEM
- PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
+ PyModule_AddIntMacro(m, PF_SYSTEM);
#endif
#ifdef AF_SYSTEM
- PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
+ PyModule_AddIntMacro(m, AF_SYSTEM);
#endif
#ifdef AF_PACKET
@@ -5866,134 +5804,129 @@ PyInit__socket(void)
#endif
#ifdef HAVE_LINUX_TIPC_H
- PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
+ PyModule_AddIntMacro(m, AF_TIPC);
/* for addresses */
- PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
- PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
- PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
+ PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
+ PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
+ PyModule_AddIntMacro(m, TIPC_ADDR_ID);
- PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
- PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
- PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
+ PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
+ PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
+ PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
/* for setsockopt() */
- PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
- PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
- PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
- PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
- TIPC_DEST_DROPPABLE);
- PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
-
- PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
- TIPC_LOW_IMPORTANCE);
- PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
- TIPC_MEDIUM_IMPORTANCE);
- PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
- TIPC_HIGH_IMPORTANCE);
- PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
- TIPC_CRITICAL_IMPORTANCE);
+ PyModule_AddIntMacro(m, SOL_TIPC);
+ PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
+ PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
+ PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
+ PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
+
+ PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
+ PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
+ PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
+ PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
/* for subscriptions */
- PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
- PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
+ PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
+ PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
#ifdef TIPC_SUB_CANCEL
/* doesn't seem to be available everywhere */
- PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
+ PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
#endif
- PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
- PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
- PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
- PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
- PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
- PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
+ PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
+ PyModule_AddIntMacro(m, TIPC_PUBLISHED);
+ PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
+ PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
+ PyModule_AddIntMacro(m, TIPC_CFG_SRV);
+ PyModule_AddIntMacro(m, TIPC_TOP_SRV);
#endif
/* Socket types */
- PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
- PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
+ PyModule_AddIntMacro(m, SOCK_STREAM);
+ PyModule_AddIntMacro(m, SOCK_DGRAM);
/* We have incomplete socket support. */
- PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
- PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
+ PyModule_AddIntMacro(m, SOCK_RAW);
+ PyModule_AddIntMacro(m, SOCK_SEQPACKET);
#if defined(SOCK_RDM)
- PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
+ PyModule_AddIntMacro(m, SOCK_RDM);
#endif
#ifdef SOCK_CLOEXEC
- PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC);
+ PyModule_AddIntMacro(m, SOCK_CLOEXEC);
#endif
#ifdef SOCK_NONBLOCK
- PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK);
+ PyModule_AddIntMacro(m, SOCK_NONBLOCK);
#endif
#ifdef SO_DEBUG
- PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
+ PyModule_AddIntMacro(m, SO_DEBUG);
#endif
#ifdef SO_ACCEPTCONN
- PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
+ PyModule_AddIntMacro(m, SO_ACCEPTCONN);
#endif
#ifdef SO_REUSEADDR
- PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
+ PyModule_AddIntMacro(m, SO_REUSEADDR);
#endif
#ifdef SO_EXCLUSIVEADDRUSE
- PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
+ PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
#endif
#ifdef SO_KEEPALIVE
- PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
+ PyModule_AddIntMacro(m, SO_KEEPALIVE);
#endif
#ifdef SO_DONTROUTE
- PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
+ PyModule_AddIntMacro(m, SO_DONTROUTE);
#endif
#ifdef SO_BROADCAST
- PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
+ PyModule_AddIntMacro(m, SO_BROADCAST);
#endif
#ifdef SO_USELOOPBACK
- PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
+ PyModule_AddIntMacro(m, SO_USELOOPBACK);
#endif
#ifdef SO_LINGER
- PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
+ PyModule_AddIntMacro(m, SO_LINGER);
#endif
#ifdef SO_OOBINLINE
- PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
+ PyModule_AddIntMacro(m, SO_OOBINLINE);
#endif
#ifdef SO_REUSEPORT
- PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
+ PyModule_AddIntMacro(m, SO_REUSEPORT);
#endif
#ifdef SO_SNDBUF
- PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
+ PyModule_AddIntMacro(m, SO_SNDBUF);
#endif
#ifdef SO_RCVBUF
- PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
+ PyModule_AddIntMacro(m, SO_RCVBUF);
#endif
#ifdef SO_SNDLOWAT
- PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
+ PyModule_AddIntMacro(m, SO_SNDLOWAT);
#endif
#ifdef SO_RCVLOWAT
- PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
+ PyModule_AddIntMacro(m, SO_RCVLOWAT);
#endif
#ifdef SO_SNDTIMEO
- PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
+ PyModule_AddIntMacro(m, SO_SNDTIMEO);
#endif
#ifdef SO_RCVTIMEO
- PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
+ PyModule_AddIntMacro(m, SO_RCVTIMEO);
#endif
#ifdef SO_ERROR
- PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
+ PyModule_AddIntMacro(m, SO_ERROR);
#endif
#ifdef SO_TYPE
- PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
+ PyModule_AddIntMacro(m, SO_TYPE);
#endif
#ifdef SO_SETFIB
- PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
+ PyModule_AddIntMacro(m, SO_SETFIB);
#endif
#ifdef SO_PASSCRED
- PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
+ PyModule_AddIntMacro(m, SO_PASSCRED);
#endif
#ifdef SO_PEERCRED
- PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
+ PyModule_AddIntMacro(m, SO_PEERCRED);
#endif
#ifdef LOCAL_PEERCRED
- PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
+ PyModule_AddIntMacro(m, LOCAL_PEERCRED);
#endif
#ifdef SO_BINDTODEVICE
PyModule_AddIntMacro(m, SO_BINDTODEVICE);
@@ -6001,312 +5934,330 @@ PyInit__socket(void)
/* Maximum number of connections for "listen" */
#ifdef SOMAXCONN
- PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
+ PyModule_AddIntMacro(m, SOMAXCONN);
#else
PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
#endif
/* Ancilliary message types */
#ifdef SCM_RIGHTS
- PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
+ PyModule_AddIntMacro(m, SCM_RIGHTS);
#endif
#ifdef SCM_CREDENTIALS
- PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
+ PyModule_AddIntMacro(m, SCM_CREDENTIALS);
#endif
#ifdef SCM_CREDS
- PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
+ PyModule_AddIntMacro(m, SCM_CREDS);
#endif
/* Flags for send, recv */
#ifdef MSG_OOB
- PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
+ PyModule_AddIntMacro(m, MSG_OOB);
#endif
#ifdef MSG_PEEK
- PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
+ PyModule_AddIntMacro(m, MSG_PEEK);
#endif
#ifdef MSG_DONTROUTE
- PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
+ PyModule_AddIntMacro(m, MSG_DONTROUTE);
#endif
#ifdef MSG_DONTWAIT
- PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
+ PyModule_AddIntMacro(m, MSG_DONTWAIT);
#endif
#ifdef MSG_EOR
- PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
+ PyModule_AddIntMacro(m, MSG_EOR);
#endif
#ifdef MSG_TRUNC
- PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
+ PyModule_AddIntMacro(m, MSG_TRUNC);
#endif
#ifdef MSG_CTRUNC
- PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
+ PyModule_AddIntMacro(m, MSG_CTRUNC);
#endif
#ifdef MSG_WAITALL
- PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
+ PyModule_AddIntMacro(m, MSG_WAITALL);
#endif
#ifdef MSG_BTAG
- PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
+ PyModule_AddIntMacro(m, MSG_BTAG);
#endif
#ifdef MSG_ETAG
- PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
+ PyModule_AddIntMacro(m, MSG_ETAG);
#endif
#ifdef MSG_NOSIGNAL
- PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
+ PyModule_AddIntMacro(m, MSG_NOSIGNAL);
#endif
#ifdef MSG_NOTIFICATION
- PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
+ PyModule_AddIntMacro(m, MSG_NOTIFICATION);
#endif
#ifdef MSG_CMSG_CLOEXEC
- PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
+ PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
#endif
#ifdef MSG_ERRQUEUE
- PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
+ PyModule_AddIntMacro(m, MSG_ERRQUEUE);
#endif
#ifdef MSG_CONFIRM
- PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
+ PyModule_AddIntMacro(m, MSG_CONFIRM);
#endif
#ifdef MSG_MORE
- PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
+ PyModule_AddIntMacro(m, MSG_MORE);
#endif
#ifdef MSG_EOF
- PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
+ PyModule_AddIntMacro(m, MSG_EOF);
#endif
#ifdef MSG_BCAST
- PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
+ PyModule_AddIntMacro(m, MSG_BCAST);
#endif
#ifdef MSG_MCAST
- PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
+ PyModule_AddIntMacro(m, MSG_MCAST);
+#endif
+#ifdef MSG_FASTOPEN
+ PyModule_AddIntMacro(m, MSG_FASTOPEN);
#endif
/* Protocol level and numbers, usable for [gs]etsockopt */
#ifdef SOL_SOCKET
- PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
+ PyModule_AddIntMacro(m, SOL_SOCKET);
#endif
#ifdef SOL_IP
- PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
+ PyModule_AddIntMacro(m, SOL_IP);
#else
PyModule_AddIntConstant(m, "SOL_IP", 0);
#endif
#ifdef SOL_IPX
- PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
+ PyModule_AddIntMacro(m, SOL_IPX);
#endif
#ifdef SOL_AX25
- PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
+ PyModule_AddIntMacro(m, SOL_AX25);
#endif
#ifdef SOL_ATALK
- PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
+ PyModule_AddIntMacro(m, SOL_ATALK);
#endif
#ifdef SOL_NETROM
- PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
+ PyModule_AddIntMacro(m, SOL_NETROM);
#endif
#ifdef SOL_ROSE
- PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
+ PyModule_AddIntMacro(m, SOL_ROSE);
#endif
#ifdef SOL_TCP
- PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
+ PyModule_AddIntMacro(m, SOL_TCP);
#else
PyModule_AddIntConstant(m, "SOL_TCP", 6);
#endif
#ifdef SOL_UDP
- PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
+ PyModule_AddIntMacro(m, SOL_UDP);
#else
PyModule_AddIntConstant(m, "SOL_UDP", 17);
#endif
#ifdef SOL_CAN_BASE
- PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
+ PyModule_AddIntMacro(m, SOL_CAN_BASE);
#endif
#ifdef SOL_CAN_RAW
- PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
- PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
+ PyModule_AddIntMacro(m, SOL_CAN_RAW);
+ PyModule_AddIntMacro(m, CAN_RAW);
#endif
#ifdef HAVE_LINUX_CAN_H
- PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
- PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
- PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
+ PyModule_AddIntMacro(m, CAN_EFF_FLAG);
+ PyModule_AddIntMacro(m, CAN_RTR_FLAG);
+ PyModule_AddIntMacro(m, CAN_ERR_FLAG);
- PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
- PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
- PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
+ PyModule_AddIntMacro(m, CAN_SFF_MASK);
+ PyModule_AddIntMacro(m, CAN_EFF_MASK);
+ PyModule_AddIntMacro(m, CAN_ERR_MASK);
#endif
#ifdef HAVE_LINUX_CAN_RAW_H
- PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
- PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
- PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
- PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
+ PyModule_AddIntMacro(m, CAN_RAW_FILTER);
+ PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
+ PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
+ PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
+#endif
+#ifdef HAVE_LINUX_CAN_BCM_H
+ PyModule_AddIntMacro(m, CAN_BCM);
+ PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
+ PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
+ PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
+ PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
+ PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
+ PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
+ PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
+ PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
+ PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
+ PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
+ PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
+ PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
#endif
#ifdef SOL_RDS
- PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
+ PyModule_AddIntMacro(m, SOL_RDS);
#endif
#ifdef RDS_CANCEL_SENT_TO
- PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
+ PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
#endif
#ifdef RDS_GET_MR
- PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
+ PyModule_AddIntMacro(m, RDS_GET_MR);
#endif
#ifdef RDS_FREE_MR
- PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
+ PyModule_AddIntMacro(m, RDS_FREE_MR);
#endif
#ifdef RDS_RECVERR
- PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
+ PyModule_AddIntMacro(m, RDS_RECVERR);
#endif
#ifdef RDS_CONG_MONITOR
- PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
+ PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
#endif
#ifdef RDS_GET_MR_FOR_DEST
- PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
+ PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
#endif
#ifdef IPPROTO_IP
- PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
+ PyModule_AddIntMacro(m, IPPROTO_IP);
#else
PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
#endif
#ifdef IPPROTO_HOPOPTS
- PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
+ PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
#endif
#ifdef IPPROTO_ICMP
- PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
+ PyModule_AddIntMacro(m, IPPROTO_ICMP);
#else
PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
#endif
#ifdef IPPROTO_IGMP
- PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
+ PyModule_AddIntMacro(m, IPPROTO_IGMP);
#endif
#ifdef IPPROTO_GGP
- PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
+ PyModule_AddIntMacro(m, IPPROTO_GGP);
#endif
#ifdef IPPROTO_IPV4
- PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
+ PyModule_AddIntMacro(m, IPPROTO_IPV4);
#endif
#ifdef IPPROTO_IPV6
- PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
+ PyModule_AddIntMacro(m, IPPROTO_IPV6);
#endif
#ifdef IPPROTO_IPIP
- PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
+ PyModule_AddIntMacro(m, IPPROTO_IPIP);
#endif
#ifdef IPPROTO_TCP
- PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
+ PyModule_AddIntMacro(m, IPPROTO_TCP);
#else
PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
#endif
#ifdef IPPROTO_EGP
- PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
+ PyModule_AddIntMacro(m, IPPROTO_EGP);
#endif
#ifdef IPPROTO_PUP
- PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
+ PyModule_AddIntMacro(m, IPPROTO_PUP);
#endif
#ifdef IPPROTO_UDP
- PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
+ PyModule_AddIntMacro(m, IPPROTO_UDP);
#else
PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
#endif
#ifdef IPPROTO_IDP
- PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
+ PyModule_AddIntMacro(m, IPPROTO_IDP);
#endif
#ifdef IPPROTO_HELLO
- PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
+ PyModule_AddIntMacro(m, IPPROTO_HELLO);
#endif
#ifdef IPPROTO_ND
- PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
+ PyModule_AddIntMacro(m, IPPROTO_ND);
#endif
#ifdef IPPROTO_TP
- PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
+ PyModule_AddIntMacro(m, IPPROTO_TP);
#endif
#ifdef IPPROTO_IPV6
- PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
+ PyModule_AddIntMacro(m, IPPROTO_IPV6);
#endif
#ifdef IPPROTO_ROUTING
- PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
+ PyModule_AddIntMacro(m, IPPROTO_ROUTING);
#endif
#ifdef IPPROTO_FRAGMENT
- PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
+ PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
#endif
#ifdef IPPROTO_RSVP
- PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
+ PyModule_AddIntMacro(m, IPPROTO_RSVP);
#endif
#ifdef IPPROTO_GRE
- PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
+ PyModule_AddIntMacro(m, IPPROTO_GRE);
#endif
#ifdef IPPROTO_ESP
- PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
+ PyModule_AddIntMacro(m, IPPROTO_ESP);
#endif
#ifdef IPPROTO_AH
- PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
+ PyModule_AddIntMacro(m, IPPROTO_AH);
#endif
#ifdef IPPROTO_MOBILE
- PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
+ PyModule_AddIntMacro(m, IPPROTO_MOBILE);
#endif
#ifdef IPPROTO_ICMPV6
- PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
+ PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
#endif
#ifdef IPPROTO_NONE
- PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
+ PyModule_AddIntMacro(m, IPPROTO_NONE);
#endif
#ifdef IPPROTO_DSTOPTS
- PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
+ PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
#endif
#ifdef IPPROTO_XTP
- PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
+ PyModule_AddIntMacro(m, IPPROTO_XTP);
#endif
#ifdef IPPROTO_EON
- PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
+ PyModule_AddIntMacro(m, IPPROTO_EON);
#endif
#ifdef IPPROTO_PIM
- PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
+ PyModule_AddIntMacro(m, IPPROTO_PIM);
#endif
#ifdef IPPROTO_IPCOMP
- PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
+ PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
#endif
#ifdef IPPROTO_VRRP
- PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
+ PyModule_AddIntMacro(m, IPPROTO_VRRP);
#endif
#ifdef IPPROTO_SCTP
- PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
+ PyModule_AddIntMacro(m, IPPROTO_SCTP);
#endif
#ifdef IPPROTO_BIP
- PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
+ PyModule_AddIntMacro(m, IPPROTO_BIP);
#endif
/**/
#ifdef IPPROTO_RAW
- PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
+ PyModule_AddIntMacro(m, IPPROTO_RAW);
#else
PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
#endif
#ifdef IPPROTO_MAX
- PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
+ PyModule_AddIntMacro(m, IPPROTO_MAX);
#endif
#ifdef SYSPROTO_CONTROL
- PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
+ PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
#endif
/* Some port configuration */
#ifdef IPPORT_RESERVED
- PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
+ PyModule_AddIntMacro(m, IPPORT_RESERVED);
#else
PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
#endif
#ifdef IPPORT_USERRESERVED
- PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
+ PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
#else
PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
#endif
/* Some reserved IP v.4 addresses */
#ifdef INADDR_ANY
- PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
+ PyModule_AddIntMacro(m, INADDR_ANY);
#else
PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
#endif
#ifdef INADDR_BROADCAST
- PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
+ PyModule_AddIntMacro(m, INADDR_BROADCAST);
#else
PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
#endif
#ifdef INADDR_LOOPBACK
- PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
+ PyModule_AddIntMacro(m, INADDR_LOOPBACK);
#else
PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
#endif
#ifdef INADDR_UNSPEC_GROUP
- PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
+ PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
#else
PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
#endif
@@ -6317,354 +6268,353 @@ PyInit__socket(void)
PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
#endif
#ifdef INADDR_MAX_LOCAL_GROUP
- PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
- INADDR_MAX_LOCAL_GROUP);
+ PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
#else
PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
#endif
#ifdef INADDR_NONE
- PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
+ PyModule_AddIntMacro(m, INADDR_NONE);
#else
PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
#endif
/* IPv4 [gs]etsockopt options */
#ifdef IP_OPTIONS
- PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
+ PyModule_AddIntMacro(m, IP_OPTIONS);
#endif
#ifdef IP_HDRINCL
- PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
+ PyModule_AddIntMacro(m, IP_HDRINCL);
#endif
#ifdef IP_TOS
- PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
+ PyModule_AddIntMacro(m, IP_TOS);
#endif
#ifdef IP_TTL
- PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
+ PyModule_AddIntMacro(m, IP_TTL);
#endif
#ifdef IP_RECVOPTS
- PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
+ PyModule_AddIntMacro(m, IP_RECVOPTS);
#endif
#ifdef IP_RECVRETOPTS
- PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
+ PyModule_AddIntMacro(m, IP_RECVRETOPTS);
#endif
#ifdef IP_RECVDSTADDR
- PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
+ PyModule_AddIntMacro(m, IP_RECVDSTADDR);
#endif
#ifdef IP_RETOPTS
- PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
+ PyModule_AddIntMacro(m, IP_RETOPTS);
#endif
#ifdef IP_MULTICAST_IF
- PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
+ PyModule_AddIntMacro(m, IP_MULTICAST_IF);
#endif
#ifdef IP_MULTICAST_TTL
- PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
+ PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
#endif
#ifdef IP_MULTICAST_LOOP
- PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
+ PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
#endif
#ifdef IP_ADD_MEMBERSHIP
- PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
+ PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
#endif
#ifdef IP_DROP_MEMBERSHIP
- PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
+ PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
#endif
#ifdef IP_DEFAULT_MULTICAST_TTL
- PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
- IP_DEFAULT_MULTICAST_TTL);
+ PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
#endif
#ifdef IP_DEFAULT_MULTICAST_LOOP
- PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
- IP_DEFAULT_MULTICAST_LOOP);
+ PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
#endif
#ifdef IP_MAX_MEMBERSHIPS
- PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
+ PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
#endif
#ifdef IP_TRANSPARENT
- PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
+ PyModule_AddIntMacro(m, IP_TRANSPARENT);
#endif
/* IPv6 [gs]etsockopt options, defined in RFC2553 */
#ifdef IPV6_JOIN_GROUP
- PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
+ PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
#endif
#ifdef IPV6_LEAVE_GROUP
- PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
+ PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
#endif
#ifdef IPV6_MULTICAST_HOPS
- PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
+ PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
#endif
#ifdef IPV6_MULTICAST_IF
- PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
+ PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
#endif
#ifdef IPV6_MULTICAST_LOOP
- PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
+ PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
#endif
#ifdef IPV6_UNICAST_HOPS
- PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
+ PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
#endif
/* Additional IPV6 socket options, defined in RFC 3493 */
#ifdef IPV6_V6ONLY
- PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
+ PyModule_AddIntMacro(m, IPV6_V6ONLY);
#endif
/* Advanced IPV6 socket options, from RFC 3542 */
#ifdef IPV6_CHECKSUM
- PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
+ PyModule_AddIntMacro(m, IPV6_CHECKSUM);
#endif
#ifdef IPV6_DONTFRAG
- PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
+ PyModule_AddIntMacro(m, IPV6_DONTFRAG);
#endif
#ifdef IPV6_DSTOPTS
- PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
+ PyModule_AddIntMacro(m, IPV6_DSTOPTS);
#endif
#ifdef IPV6_HOPLIMIT
- PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
+ PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
#endif
#ifdef IPV6_HOPOPTS
- PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
+ PyModule_AddIntMacro(m, IPV6_HOPOPTS);
#endif
#ifdef IPV6_NEXTHOP
- PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
+ PyModule_AddIntMacro(m, IPV6_NEXTHOP);
#endif
#ifdef IPV6_PATHMTU
- PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
+ PyModule_AddIntMacro(m, IPV6_PATHMTU);
#endif
#ifdef IPV6_PKTINFO
- PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
+ PyModule_AddIntMacro(m, IPV6_PKTINFO);
#endif
#ifdef IPV6_RECVDSTOPTS
- PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
+ PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
#endif
#ifdef IPV6_RECVHOPLIMIT
- PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
+ PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
#endif
#ifdef IPV6_RECVHOPOPTS
- PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
+ PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
#endif
#ifdef IPV6_RECVPKTINFO
- PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
+ PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
#endif
#ifdef IPV6_RECVRTHDR
- PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
+ PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
#endif
#ifdef IPV6_RECVTCLASS
- PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
+ PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
#endif
#ifdef IPV6_RTHDR
- PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
+ PyModule_AddIntMacro(m, IPV6_RTHDR);
#endif
#ifdef IPV6_RTHDRDSTOPTS
- PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
+ PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
#endif
#ifdef IPV6_RTHDR_TYPE_0
- PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
+ PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
#endif
#ifdef IPV6_RECVPATHMTU
- PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
+ PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
#endif
#ifdef IPV6_TCLASS
- PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
+ PyModule_AddIntMacro(m, IPV6_TCLASS);
#endif
#ifdef IPV6_USE_MIN_MTU
- PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
+ PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
#endif
/* TCP options */
#ifdef TCP_NODELAY
- PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
+ PyModule_AddIntMacro(m, TCP_NODELAY);
#endif
#ifdef TCP_MAXSEG
- PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
+ PyModule_AddIntMacro(m, TCP_MAXSEG);
#endif
#ifdef TCP_CORK
- PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
+ PyModule_AddIntMacro(m, TCP_CORK);
#endif
#ifdef TCP_KEEPIDLE
- PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
+ PyModule_AddIntMacro(m, TCP_KEEPIDLE);
#endif
#ifdef TCP_KEEPINTVL
- PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
+ PyModule_AddIntMacro(m, TCP_KEEPINTVL);
#endif
#ifdef TCP_KEEPCNT
- PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
+ PyModule_AddIntMacro(m, TCP_KEEPCNT);
#endif
#ifdef TCP_SYNCNT
- PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
+ PyModule_AddIntMacro(m, TCP_SYNCNT);
#endif
#ifdef TCP_LINGER2
- PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
+ PyModule_AddIntMacro(m, TCP_LINGER2);
#endif
#ifdef TCP_DEFER_ACCEPT
- PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
+ PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
#endif
#ifdef TCP_WINDOW_CLAMP
- PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
+ PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
#endif
#ifdef TCP_INFO
- PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
+ PyModule_AddIntMacro(m, TCP_INFO);
#endif
#ifdef TCP_QUICKACK
- PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
+ PyModule_AddIntMacro(m, TCP_QUICKACK);
+#endif
+#ifdef TCP_FASTOPEN
+ PyModule_AddIntMacro(m, TCP_FASTOPEN);
#endif
-
/* IPX options */
#ifdef IPX_TYPE
- PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
+ PyModule_AddIntMacro(m, IPX_TYPE);
#endif
/* Reliable Datagram Sockets */
#ifdef RDS_CMSG_RDMA_ARGS
- PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
+ PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
#endif
#ifdef RDS_CMSG_RDMA_DEST
- PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
+ PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
#endif
#ifdef RDS_CMSG_RDMA_MAP
- PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
+ PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
#endif
#ifdef RDS_CMSG_RDMA_STATUS
- PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
+ PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
#endif
#ifdef RDS_CMSG_RDMA_UPDATE
- PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
+ PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
#endif
#ifdef RDS_RDMA_READWRITE
- PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
+ PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
#endif
#ifdef RDS_RDMA_FENCE
- PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
+ PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
#endif
#ifdef RDS_RDMA_INVALIDATE
- PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
+ PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
#endif
#ifdef RDS_RDMA_USE_ONCE
- PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
+ PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
#endif
#ifdef RDS_RDMA_DONTWAIT
- PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
+ PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
#endif
#ifdef RDS_RDMA_NOTIFY_ME
- PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
+ PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
#endif
#ifdef RDS_RDMA_SILENT
- PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
+ PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
#endif
/* get{addr,name}info parameters */
#ifdef EAI_ADDRFAMILY
- PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
+ PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
#endif
#ifdef EAI_AGAIN
- PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
+ PyModule_AddIntMacro(m, EAI_AGAIN);
#endif
#ifdef EAI_BADFLAGS
- PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
+ PyModule_AddIntMacro(m, EAI_BADFLAGS);
#endif
#ifdef EAI_FAIL
- PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
+ PyModule_AddIntMacro(m, EAI_FAIL);
#endif
#ifdef EAI_FAMILY
- PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
+ PyModule_AddIntMacro(m, EAI_FAMILY);
#endif
#ifdef EAI_MEMORY
- PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
+ PyModule_AddIntMacro(m, EAI_MEMORY);
#endif
#ifdef EAI_NODATA
- PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
+ PyModule_AddIntMacro(m, EAI_NODATA);
#endif
#ifdef EAI_NONAME
- PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
+ PyModule_AddIntMacro(m, EAI_NONAME);
#endif
#ifdef EAI_OVERFLOW
- PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
+ PyModule_AddIntMacro(m, EAI_OVERFLOW);
#endif
#ifdef EAI_SERVICE
- PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
+ PyModule_AddIntMacro(m, EAI_SERVICE);
#endif
#ifdef EAI_SOCKTYPE
- PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
+ PyModule_AddIntMacro(m, EAI_SOCKTYPE);
#endif
#ifdef EAI_SYSTEM
- PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
+ PyModule_AddIntMacro(m, EAI_SYSTEM);
#endif
#ifdef EAI_BADHINTS
- PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
+ PyModule_AddIntMacro(m, EAI_BADHINTS);
#endif
#ifdef EAI_PROTOCOL
- PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
+ PyModule_AddIntMacro(m, EAI_PROTOCOL);
#endif
#ifdef EAI_MAX
- PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
+ PyModule_AddIntMacro(m, EAI_MAX);
#endif
#ifdef AI_PASSIVE
- PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
+ PyModule_AddIntMacro(m, AI_PASSIVE);
#endif
#ifdef AI_CANONNAME
- PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
+ PyModule_AddIntMacro(m, AI_CANONNAME);
#endif
#ifdef AI_NUMERICHOST
- PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
+ PyModule_AddIntMacro(m, AI_NUMERICHOST);
#endif
#ifdef AI_NUMERICSERV
- PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
+ PyModule_AddIntMacro(m, AI_NUMERICSERV);
#endif
#ifdef AI_MASK
- PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
+ PyModule_AddIntMacro(m, AI_MASK);
#endif
#ifdef AI_ALL
- PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
+ PyModule_AddIntMacro(m, AI_ALL);
#endif
#ifdef AI_V4MAPPED_CFG
- PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
+ PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
#endif
#ifdef AI_ADDRCONFIG
- PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
+ PyModule_AddIntMacro(m, AI_ADDRCONFIG);
#endif
#ifdef AI_V4MAPPED
- PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
+ PyModule_AddIntMacro(m, AI_V4MAPPED);
#endif
#ifdef AI_DEFAULT
- PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
+ PyModule_AddIntMacro(m, AI_DEFAULT);
#endif
#ifdef NI_MAXHOST
- PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
+ PyModule_AddIntMacro(m, NI_MAXHOST);
#endif
#ifdef NI_MAXSERV
- PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
+ PyModule_AddIntMacro(m, NI_MAXSERV);
#endif
#ifdef NI_NOFQDN
- PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
+ PyModule_AddIntMacro(m, NI_NOFQDN);
#endif
#ifdef NI_NUMERICHOST
- PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
+ PyModule_AddIntMacro(m, NI_NUMERICHOST);
#endif
#ifdef NI_NAMEREQD
- PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
+ PyModule_AddIntMacro(m, NI_NAMEREQD);
#endif
#ifdef NI_NUMERICSERV
- PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
+ PyModule_AddIntMacro(m, NI_NUMERICSERV);
#endif
#ifdef NI_DGRAM
- PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
+ PyModule_AddIntMacro(m, NI_DGRAM);
#endif
/* shutdown() parameters */
#ifdef SHUT_RD
- PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
+ PyModule_AddIntMacro(m, SHUT_RD);
#elif defined(SD_RECEIVE)
PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
#else
PyModule_AddIntConstant(m, "SHUT_RD", 0);
#endif
#ifdef SHUT_WR
- PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
+ PyModule_AddIntMacro(m, SHUT_WR);
#elif defined(SD_SEND)
PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
#else
PyModule_AddIntConstant(m, "SHUT_WR", 1);
#endif
#ifdef SHUT_RDWR
- PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
+ PyModule_AddIntMacro(m, SHUT_RDWR);
#elif defined(SD_BOTH)
PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
#else
@@ -6684,14 +6634,14 @@ PyInit__socket(void)
PyModule_AddObject(m, names[i], tmp);
}
}
- PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
- PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
- PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
+ PyModule_AddIntMacro(m, RCVALL_OFF);
+ PyModule_AddIntMacro(m, RCVALL_ON);
+ PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
#ifdef RCVALL_IPLEVEL
- PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
+ PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
#endif
#ifdef RCVALL_MAX
- PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
+ PyModule_AddIntMacro(m, RCVALL_MAX);
#endif
#endif /* _MSTCPIP_ */
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
index 0435878..b83f9af 100644
--- a/Modules/socketmodule.h
+++ b/Modules/socketmodule.h
@@ -8,7 +8,7 @@
# include <sys/socket.h>
# endif
# include <netinet/in.h>
-# if !(defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))
+# if !defined(__CYGWIN__)
# include <netinet/tcp.h>
# endif
@@ -80,6 +80,10 @@ typedef int socklen_t;
#include <linux/can/raw.h>
#endif
+#ifdef HAVE_LINUX_CAN_BCM_H
+#include <linux/can/bcm.h>
+#endif
+
#ifdef HAVE_SYS_SYS_DOMAIN_H
#include <sys/sys_domain.h>
#endif
diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c
index 194ae19..d06f8ce 100644
--- a/Modules/spwdmodule.c
+++ b/Modules/spwdmodule.c
@@ -196,9 +196,11 @@ PyInit_spwd(void)
m=PyModule_Create(&spwdmodule);
if (m == NULL)
return NULL;
- if (!initialized)
- PyStructSequence_InitType(&StructSpwdType,
- &struct_spwd_type_desc);
+ if (!initialized) {
+ if (PyStructSequence_InitType2(&StructSpwdType,
+ &struct_spwd_type_desc) < 0)
+ return NULL;
+ }
Py_INCREF((PyObject *) &StructSpwdType);
PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType);
initialized = 1;
diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
index 02a81f1..fbc1ff6 100644
--- a/Modules/symtablemodule.c
+++ b/Modules/symtablemodule.c
@@ -69,30 +69,30 @@ PyInit__symtable(void)
m = PyModule_Create(&symtablemodule);
if (m == NULL)
return NULL;
- PyModule_AddIntConstant(m, "USE", USE);
- PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL);
- PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL);
- PyModule_AddIntConstant(m, "DEF_PARAM", DEF_PARAM);
- PyModule_AddIntConstant(m, "DEF_FREE", DEF_FREE);
- PyModule_AddIntConstant(m, "DEF_FREE_CLASS", DEF_FREE_CLASS);
- PyModule_AddIntConstant(m, "DEF_IMPORT", DEF_IMPORT);
- PyModule_AddIntConstant(m, "DEF_BOUND", DEF_BOUND);
+ PyModule_AddIntMacro(m, USE);
+ PyModule_AddIntMacro(m, DEF_GLOBAL);
+ PyModule_AddIntMacro(m, DEF_LOCAL);
+ PyModule_AddIntMacro(m, DEF_PARAM);
+ PyModule_AddIntMacro(m, DEF_FREE);
+ PyModule_AddIntMacro(m, DEF_FREE_CLASS);
+ PyModule_AddIntMacro(m, DEF_IMPORT);
+ PyModule_AddIntMacro(m, DEF_BOUND);
PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);
PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);
PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);
- PyModule_AddIntConstant(m, "OPT_IMPORT_STAR", OPT_IMPORT_STAR);
- PyModule_AddIntConstant(m, "OPT_TOPLEVEL", OPT_TOPLEVEL);
+ PyModule_AddIntMacro(m, OPT_IMPORT_STAR);
+ PyModule_AddIntMacro(m, OPT_TOPLEVEL);
- PyModule_AddIntConstant(m, "LOCAL", LOCAL);
- PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT);
- PyModule_AddIntConstant(m, "GLOBAL_IMPLICIT", GLOBAL_IMPLICIT);
- PyModule_AddIntConstant(m, "FREE", FREE);
- PyModule_AddIntConstant(m, "CELL", CELL);
+ PyModule_AddIntMacro(m, LOCAL);
+ PyModule_AddIntMacro(m, GLOBAL_EXPLICIT);
+ PyModule_AddIntMacro(m, GLOBAL_IMPLICIT);
+ PyModule_AddIntMacro(m, FREE);
+ PyModule_AddIntMacro(m, CELL);
PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET);
- PyModule_AddIntConstant(m, "SCOPE_MASK", SCOPE_MASK);
+ PyModule_AddIntMacro(m, SCOPE_MASK);
if (PyErr_Occurred()) {
Py_DECREF(m);
diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c
index 8b877cf..9d79eec 100644
--- a/Modules/syslogmodule.c
+++ b/Modules/syslogmodule.c
@@ -278,44 +278,44 @@ PyInit_syslog(void)
/* Add some symbolic constants to the module */
/* Priorities */
- PyModule_AddIntConstant(m, "LOG_EMERG", LOG_EMERG);
- PyModule_AddIntConstant(m, "LOG_ALERT", LOG_ALERT);
- PyModule_AddIntConstant(m, "LOG_CRIT", LOG_CRIT);
- PyModule_AddIntConstant(m, "LOG_ERR", LOG_ERR);
- PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
- PyModule_AddIntConstant(m, "LOG_NOTICE", LOG_NOTICE);
- PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO);
- PyModule_AddIntConstant(m, "LOG_DEBUG", LOG_DEBUG);
+ PyModule_AddIntMacro(m, LOG_EMERG);
+ PyModule_AddIntMacro(m, LOG_ALERT);
+ PyModule_AddIntMacro(m, LOG_CRIT);
+ PyModule_AddIntMacro(m, LOG_ERR);
+ PyModule_AddIntMacro(m, LOG_WARNING);
+ PyModule_AddIntMacro(m, LOG_NOTICE);
+ PyModule_AddIntMacro(m, LOG_INFO);
+ PyModule_AddIntMacro(m, LOG_DEBUG);
/* openlog() option flags */
- PyModule_AddIntConstant(m, "LOG_PID", LOG_PID);
- PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS);
- PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY);
+ PyModule_AddIntMacro(m, LOG_PID);
+ PyModule_AddIntMacro(m, LOG_CONS);
+ PyModule_AddIntMacro(m, LOG_NDELAY);
#ifdef LOG_ODELAY
- PyModule_AddIntConstant(m, "LOG_ODELAY", LOG_ODELAY);
+ PyModule_AddIntMacro(m, LOG_ODELAY);
#endif
#ifdef LOG_NOWAIT
- PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT);
+ PyModule_AddIntMacro(m, LOG_NOWAIT);
#endif
#ifdef LOG_PERROR
- PyModule_AddIntConstant(m, "LOG_PERROR", LOG_PERROR);
+ PyModule_AddIntMacro(m, LOG_PERROR);
#endif
/* Facilities */
- PyModule_AddIntConstant(m, "LOG_KERN", LOG_KERN);
- PyModule_AddIntConstant(m, "LOG_USER", LOG_USER);
- PyModule_AddIntConstant(m, "LOG_MAIL", LOG_MAIL);
- PyModule_AddIntConstant(m, "LOG_DAEMON", LOG_DAEMON);
- PyModule_AddIntConstant(m, "LOG_AUTH", LOG_AUTH);
- PyModule_AddIntConstant(m, "LOG_LPR", LOG_LPR);
- PyModule_AddIntConstant(m, "LOG_LOCAL0", LOG_LOCAL0);
- PyModule_AddIntConstant(m, "LOG_LOCAL1", LOG_LOCAL1);
- PyModule_AddIntConstant(m, "LOG_LOCAL2", LOG_LOCAL2);
- PyModule_AddIntConstant(m, "LOG_LOCAL3", LOG_LOCAL3);
- PyModule_AddIntConstant(m, "LOG_LOCAL4", LOG_LOCAL4);
- PyModule_AddIntConstant(m, "LOG_LOCAL5", LOG_LOCAL5);
- PyModule_AddIntConstant(m, "LOG_LOCAL6", LOG_LOCAL6);
- PyModule_AddIntConstant(m, "LOG_LOCAL7", LOG_LOCAL7);
+ PyModule_AddIntMacro(m, LOG_KERN);
+ PyModule_AddIntMacro(m, LOG_USER);
+ PyModule_AddIntMacro(m, LOG_MAIL);
+ PyModule_AddIntMacro(m, LOG_DAEMON);
+ PyModule_AddIntMacro(m, LOG_AUTH);
+ PyModule_AddIntMacro(m, LOG_LPR);
+ PyModule_AddIntMacro(m, LOG_LOCAL0);
+ PyModule_AddIntMacro(m, LOG_LOCAL1);
+ PyModule_AddIntMacro(m, LOG_LOCAL2);
+ PyModule_AddIntMacro(m, LOG_LOCAL3);
+ PyModule_AddIntMacro(m, LOG_LOCAL4);
+ PyModule_AddIntMacro(m, LOG_LOCAL5);
+ PyModule_AddIntMacro(m, LOG_LOCAL6);
+ PyModule_AddIntMacro(m, LOG_LOCAL7);
#ifndef LOG_SYSLOG
#define LOG_SYSLOG LOG_DAEMON
@@ -330,13 +330,13 @@ PyInit_syslog(void)
#define LOG_CRON LOG_DAEMON
#endif
- PyModule_AddIntConstant(m, "LOG_SYSLOG", LOG_SYSLOG);
- PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON);
- PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP);
- PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS);
+ PyModule_AddIntMacro(m, LOG_SYSLOG);
+ PyModule_AddIntMacro(m, LOG_CRON);
+ PyModule_AddIntMacro(m, LOG_UUCP);
+ PyModule_AddIntMacro(m, LOG_NEWS);
#ifdef LOG_AUTHPRIV
- PyModule_AddIntConstant(m, "LOG_AUTHPRIV", LOG_AUTHPRIV);
+ PyModule_AddIntMacro(m, LOG_AUTHPRIV);
#endif
return m;
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 03476d9..8d161d4 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -37,16 +37,6 @@
#endif /* MS_WINDOWS */
#endif /* !__WATCOMC__ || __QNX__ */
-#if defined(PYOS_OS2)
-#define INCL_DOS
-#define INCL_ERRORS
-#include <os2.h>
-#endif
-
-#if defined(PYCC_VACPP)
-#include <sys/time.h>
-#endif
-
#if defined(__APPLE__)
#include <mach/mach_time.h>
#endif
@@ -543,6 +533,26 @@ checktm(struct tm* buf)
/* wcsftime() doesn't format correctly time zones, see issue #10653 */
# undef HAVE_WCSFTIME
#endif
+#define STRFTIME_FORMAT_CODES \
+"Commonly used format codes:\n\
+\n\
+%Y Year with century as a decimal number.\n\
+%m Month as a decimal number [01,12].\n\
+%d Day of the month as a decimal number [01,31].\n\
+%H Hour (24-hour clock) as a decimal number [00,23].\n\
+%M Minute as a decimal number [00,59].\n\
+%S Second as a decimal number [00,61].\n\
+%z Time zone offset from UTC.\n\
+%a Locale's abbreviated weekday name.\n\
+%A Locale's full weekday name.\n\
+%b Locale's abbreviated month name.\n\
+%B Locale's full month name.\n\
+%c Locale's appropriate date and time representation.\n\
+%I Hour (12-hour clock) as a decimal number [01,12].\n\
+%p Locale's equivalent of either AM or PM.\n\
+\n\
+Other codes may be available on your platform. See documentation for\n\
+the C library strftime function.\n"
#ifdef HAVE_STRFTIME
#ifdef HAVE_WCSFTIME
@@ -687,13 +697,13 @@ time_strftime(PyObject *self, PyObject *args)
#undef time_char
#undef format_time
-
PyDoc_STRVAR(strftime_doc,
"strftime(format[, tuple]) -> string\n\
\n\
Convert a time tuple to a string according to a format specification.\n\
See the library reference manual for formatting codes. When the time tuple\n\
-is not present, current time as returned by localtime() is used.");
+is not present, current time as returned by localtime() is used.\n\
+\n" STRFTIME_FORMAT_CODES);
#endif /* HAVE_STRFTIME */
static PyObject *
@@ -716,7 +726,9 @@ PyDoc_STRVAR(strptime_doc,
"strptime(string, format) -> struct_time\n\
\n\
Parse a string to a time tuple according to a format specification.\n\
-See the library reference manual for formatting codes (same as strftime()).");
+See the library reference manual for formatting codes (same as\n\
+strftime()).\n\
+\n" STRFTIME_FORMAT_CODES);
static PyObject *
_asctime(struct tm *timeptr)
@@ -795,7 +807,16 @@ time_mktime(PyObject *self, PyObject *tup)
tt = mktime(&buf);
/* Return value of -1 does not necessarily mean an error, but tm_wday
* cannot remain set to -1 if mktime succeeded. */
- if (tt == (time_t)(-1) && buf.tm_wday == -1) {
+ if (tt == (time_t)(-1)
+#ifndef _AIX
+ /* Return value of -1 does not necessarily mean an error, but
+ * tm_wday cannot remain set to -1 if mktime succeeded. */
+ && buf.tm_wday == -1
+#else
+ /* on AIX, tm_wday is always sets, even on error */
+#endif
+ )
+ {
PyErr_SetString(PyExc_OverflowError,
"mktime argument out of range");
return NULL;
@@ -830,6 +851,8 @@ time_tzset(PyObject *self, PyObject *unused)
/* Reset timezone, altzone, daylight and tzname */
PyInit_timezone(m);
Py_DECREF(m);
+ if (PyErr_Occurred())
+ return NULL;
Py_INCREF(Py_None);
return Py_None;
@@ -1266,19 +1289,11 @@ PyInit_timezone(PyObject *m) {
#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
PyObject *otz0, *otz1;
tzset();
-#ifdef PYOS_OS2
- PyModule_AddIntConstant(m, "timezone", _timezone);
-#else /* !PYOS_OS2 */
PyModule_AddIntConstant(m, "timezone", timezone);
-#endif /* PYOS_OS2 */
#ifdef HAVE_ALTZONE
PyModule_AddIntConstant(m, "altzone", altzone);
#else
-#ifdef PYOS_OS2
- PyModule_AddIntConstant(m, "altzone", _timezone-3600);
-#else /* !PYOS_OS2 */
PyModule_AddIntConstant(m, "altzone", timezone-3600);
-#endif /* PYOS_OS2 */
#endif
PyModule_AddIntConstant(m, "daylight", daylight);
otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
@@ -1461,8 +1476,9 @@ PyInit_time(void)
PyInit_timezone(m);
if (!initialized) {
- PyStructSequence_InitType(&StructTimeType,
- &struct_time_type_desc);
+ if (PyStructSequence_InitType2(&StructTimeType,
+ &struct_time_type_desc) < 0)
+ return NULL;
#ifdef MS_WINDOWS
winver.dwOSVersionInfoSize = sizeof(winver);
@@ -1574,7 +1590,7 @@ floatsleep(double secs)
DWORD rc;
HANDLE hInterruptEvent = _PyOS_SigintEvent();
ResetEvent(hInterruptEvent);
- rc = WaitForSingleObject(hInterruptEvent, ul_millis);
+ rc = WaitForSingleObjectEx(hInterruptEvent, ul_millis, FALSE);
if (rc == WAIT_OBJECT_0) {
Py_BLOCK_THREADS
errno = EINTR;
@@ -1584,15 +1600,6 @@ floatsleep(double secs)
}
Py_END_ALLOW_THREADS
}
-#elif defined(PYOS_OS2)
- /* This Sleep *IS* Interruptable by Exceptions */
- Py_BEGIN_ALLOW_THREADS
- if (DosSleep(secs * 1000) != NO_ERROR) {
- Py_BLOCK_THREADS
- PyErr_SetFromErrno(PyExc_IOError);
- return -1;
- }
- Py_END_ALLOW_THREADS
#else
/* XXX Can't interrupt this sleep */
Py_BEGIN_ALLOW_THREADS
diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h
index 5d5dca8..93a09cd 100644
--- a/Modules/unicodedata_db.h
+++ b/Modules/unicodedata_db.h
@@ -1,6 +1,6 @@
/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */
-#define UNIDATA_VERSION "6.1.0"
+#define UNIDATA_VERSION "6.2.0"
/* a list of unique database records */
const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{0, 0, 0, 0, 0, 0},
@@ -1444,41 +1444,40 @@ static unsigned short index2[] = {
171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 171, 171, 171, 171, 171, 171,
171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 48, 48, 48, 48, 48, 48, 48, 48,
+ 171, 171, 171, 171, 171, 171, 171, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 170, 170, 170, 170, 170, 170,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48,
- 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0,
+ 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48,
+ 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0,
- 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48,
+ 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
- 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48,
+ 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0,
- 81, 81, 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 81, 81,
+ 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 148, 148, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0,
+ 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
@@ -1498,15 +1497,16 @@ static unsigned short index2[] = {
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 163, 164, 0,
- 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 163, 164, 0, 0, 0,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 83, 83, 83, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 83, 83, 83, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
48, 48, 48, 135, 135, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135,
142, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
@@ -1645,15 +1645,15 @@ static unsigned short index2[] = {
211, 211, 212, 213, 214, 215, 210, 34, 34, 34, 34, 210, 210, 210, 210,
210, 211, 211, 212, 213, 214, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 216, 217, 85, 85,
- 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 175, 175, 81, 81,
- 81, 81, 175, 175, 175, 81, 81, 82, 82, 82, 82, 81, 82, 82, 82, 175, 175,
- 81, 86, 81, 175, 175, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 218, 218, 49, 219, 26, 219, 218, 49, 26, 219, 35, 49, 49,
- 49, 35, 35, 49, 49, 49, 46, 26, 49, 219, 26, 78, 49, 49, 49, 49, 49, 26,
- 26, 218, 219, 219, 26, 49, 26, 220, 26, 49, 26, 183, 220, 49, 49, 221,
- 35, 49, 49, 44, 49, 35, 156, 156, 156, 156, 35, 26, 218, 35, 35, 49, 49,
- 222, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, 223,
+ 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 175, 175, 81,
+ 81, 81, 81, 175, 175, 175, 81, 81, 82, 82, 82, 82, 81, 82, 82, 82, 175,
+ 175, 81, 86, 81, 175, 175, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 218, 218, 49, 219, 26, 219, 218, 49, 26, 219, 35, 49,
+ 49, 49, 35, 35, 49, 49, 49, 46, 26, 49, 219, 26, 78, 49, 49, 49, 49, 49,
+ 26, 26, 218, 219, 219, 26, 49, 26, 220, 26, 49, 26, 183, 220, 49, 49,
+ 221, 35, 49, 49, 44, 49, 35, 156, 156, 156, 156, 35, 26, 218, 35, 35, 49,
+ 49, 222, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, 223,
223, 223, 37, 37, 223, 223, 223, 223, 223, 223, 37, 37, 37, 37, 223, 224,
224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225,
225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225,
@@ -2072,12 +2072,11 @@ static unsigned short index2[] = {
257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 268, 268, 268, 268, 268,
+ 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
@@ -2086,7 +2085,7 @@ static unsigned short index2[] = {
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269,
+ 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
@@ -2095,7 +2094,8 @@ static unsigned short index2[] = {
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
- 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 270,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
@@ -2105,14 +2105,13 @@ static unsigned short index2[] = {
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 170, 170, 270, 170, 270, 170, 170, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 170, 270, 170, 270, 170, 170, 270, 270, 170, 170, 170,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
- 270, 170, 170, 270, 170, 270, 170, 170, 270, 270, 270, 270, 270, 270,
- 270, 270, 270, 270, 170, 270, 170, 270, 170, 170, 270, 270, 170, 170,
- 170, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
- 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 0, 0,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 0, 0, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
@@ -2120,22 +2119,22 @@ static unsigned short index2[] = {
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
- 270, 270, 270, 270, 270, 270, 270, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 270, 270, 270, 270, 270, 270, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 271, 272, 271, 273, 273, 273, 273,
- 273, 273, 273, 273, 273, 211, 271, 271, 271, 271, 271, 271, 271, 271,
- 271, 271, 271, 271, 271, 0, 271, 271, 271, 271, 271, 0, 271, 0, 271, 271,
- 0, 271, 271, 0, 271, 271, 271, 271, 271, 271, 271, 271, 271, 273, 130,
+ 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,
+ 35, 35, 35, 35, 0, 0, 0, 0, 0, 271, 272, 271, 273, 273, 273, 273, 273,
+ 273, 273, 273, 273, 211, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+ 271, 271, 271, 271, 0, 271, 271, 271, 271, 271, 0, 271, 0, 271, 271, 0,
+ 271, 271, 0, 271, 271, 271, 271, 271, 271, 271, 271, 271, 273, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 274,
- 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
- 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 274, 274,
+ 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
@@ -2152,26 +2151,26 @@ static unsigned short index2[] = {
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 130, 195, 275, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 195, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 276, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71,
- 71, 71, 71, 71, 71, 71, 71, 277, 277, 277, 277, 277, 277, 277, 278, 279,
- 277, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 277, 280, 280, 281, 281, 278, 279, 278, 279, 278, 279, 278, 279,
- 278, 279, 278, 279, 278, 279, 278, 279, 243, 243, 278, 279, 277, 277,
- 277, 277, 281, 281, 281, 282, 277, 282, 0, 277, 282, 277, 277, 280, 283,
- 284, 283, 284, 283, 284, 285, 277, 277, 286, 287, 288, 288, 289, 0, 277,
- 290, 285, 277, 0, 0, 0, 0, 130, 130, 130, 117, 130, 0, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 276, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 277, 277, 277, 277, 277, 277, 277, 278, 279, 277, 0, 0,
+ 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277,
+ 280, 280, 281, 281, 278, 279, 278, 279, 278, 279, 278, 279, 278, 279,
+ 278, 279, 278, 279, 278, 279, 243, 243, 278, 279, 277, 277, 277, 277,
+ 281, 281, 281, 282, 277, 282, 0, 277, 282, 277, 277, 280, 283, 284, 283,
+ 284, 283, 284, 285, 277, 277, 286, 287, 288, 288, 289, 0, 277, 290, 285,
+ 277, 0, 0, 0, 0, 130, 130, 130, 117, 130, 0, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
@@ -2181,296 +2180,289 @@ static unsigned short index2[] = {
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 0, 0, 187, 0, 291, 291, 292, 293, 292, 291,
- 291, 294, 295, 291, 296, 297, 298, 297, 297, 299, 299, 299, 299, 299,
- 299, 299, 299, 299, 299, 297, 291, 300, 301, 300, 291, 291, 302, 302,
+ 130, 130, 130, 130, 0, 0, 187, 0, 291, 291, 292, 293, 292, 291, 291, 294,
+ 295, 291, 296, 297, 298, 297, 297, 299, 299, 299, 299, 299, 299, 299,
+ 299, 299, 299, 297, 291, 300, 301, 300, 291, 291, 302, 302, 302, 302,
302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
- 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 294, 291, 295, 303,
- 304, 303, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+ 302, 302, 302, 302, 302, 302, 302, 302, 294, 291, 295, 303, 304, 303,
305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
- 294, 301, 295, 301, 294, 295, 306, 307, 308, 306, 306, 309, 309, 309,
- 309, 309, 309, 309, 309, 309, 309, 310, 309, 309, 309, 309, 309, 309,
- 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 294, 301,
+ 295, 301, 294, 295, 306, 307, 308, 306, 306, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 310, 309, 309, 309, 309, 309, 309, 309, 309,
309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
- 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 310, 310, 309,
309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 310, 310, 309, 309, 309,
309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
- 309, 309, 0, 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309,
- 309, 309, 309, 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309,
- 0, 0, 0, 293, 293, 301, 303, 311, 293, 293, 0, 312, 313, 313, 313, 313,
- 312, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, 314, 314, 26, 30, 0, 0, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 0,
+ 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309, 309, 309, 309,
+ 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309, 0, 0, 0, 293,
+ 293, 301, 303, 311, 293, 293, 0, 312, 313, 313, 313, 313, 312, 312, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 314, 314, 314, 26, 30, 0, 0, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, 0, 0, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148,
148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 315, 315, 315, 315,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 315, 315, 315, 315, 315, 315, 315, 315, 315,
315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
- 315, 315, 315, 315, 315, 315, 315, 153, 153, 153, 153, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 153, 0, 0, 0, 0, 0,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 315, 315, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 153, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 86, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 86, 0, 0,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 148, 148, 148, 148, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 173, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 0, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 173, 48,
+ 48, 48, 48, 48, 48, 48, 48, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 83, 48, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 0, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0,
- 0, 48, 48, 48, 48, 48, 48, 48, 48, 83, 173, 173, 173, 173, 173, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 83, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44,
+ 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47,
+ 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107,
- 107, 107, 0, 0, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 0, 0, 107, 0, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 107, 107, 0, 104, 316, 316, 316, 316, 316, 316,
- 316, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 316, 316, 316, 316, 316, 316, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107,
+ 107, 107, 0, 104, 316, 316, 316, 316, 316, 316, 316, 316, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 316, 316, 316, 316, 316,
+ 316, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0,
+ 0, 0, 0, 0, 0, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0,
- 135, 86, 135, 81, 107, 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107,
+ 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0, 135, 86, 135, 81, 107,
+ 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 81, 175,
- 86, 0, 0, 0, 0, 142, 316, 316, 316, 316, 316, 316, 316, 316, 0, 0, 0, 0,
- 0, 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0,
- 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 81, 175, 86, 0, 0, 0, 0, 142,
+ 316, 316, 316, 316, 316, 316, 316, 316, 0, 0, 0, 0, 0, 0, 0, 0, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 316, 316, 104, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 316, 316,
+ 104, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0,
+ 138, 138, 138, 138, 138, 138, 138, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 107, 107, 107,
+ 107, 0, 0, 316, 316, 316, 316, 316, 316, 316, 316, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 0, 0, 316, 316, 316, 316, 316, 316, 316, 316,
+ 107, 0, 0, 0, 0, 0, 316, 316, 316, 316, 316, 316, 316, 316, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 316, 316, 316, 316, 316, 316,
- 316, 316, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 317, 317, 317, 317,
+ 0, 0, 0, 0, 0, 0, 0, 0, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 0, 139, 135,
- 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 317, 317, 317, 317, 317, 317, 317, 0, 139, 135, 139, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
- 142, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 153, 153, 153, 153, 153,
- 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
- 153, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48,
- 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 48,
- 48, 48, 139, 139, 139, 135, 135, 135, 135, 139, 139, 142, 141, 83, 83,
- 188, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 81, 81, 81, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135,
+ 135, 135, 135, 135, 135, 135, 135, 135, 135, 142, 83, 83, 83, 83, 83, 83,
+ 83, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 140, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 48, 48, 48, 139, 139, 139, 135,
+ 135, 135, 135, 139, 139, 142, 141, 83, 83, 188, 83, 83, 83, 83, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0,
+ 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0,
+ 0, 81, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 149, 135, 135, 135, 135,
- 139, 135, 150, 150, 135, 135, 135, 142, 142, 0, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 149, 135, 135, 135, 135, 139, 135, 150, 150, 135, 135,
+ 135, 142, 142, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 83,
+ 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139,
- 139, 135, 135, 135, 135, 135, 135, 135, 135, 135, 139, 174, 48, 48, 48,
- 48, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 135, 135, 135,
+ 135, 135, 135, 135, 135, 135, 139, 174, 48, 48, 48, 48, 83, 83, 83, 83,
+ 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 135, 139, 135, 139, 139, 135, 135, 135, 135, 135, 135,
- 174, 145, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135,
+ 139, 135, 139, 139, 135, 135, 135, 135, 135, 135, 174, 145, 0, 0, 0, 0,
+ 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173,
173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83,
- 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,
- 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 139, 139, 139, 139, 139,
139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
- 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135,
- 135, 135, 135, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170,
- 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 318, 318, 318, 318, 318, 318, 318, 319, 319, 175, 175, 175, 80, 80, 80,
+ 320, 319, 319, 319, 319, 319, 187, 187, 187, 187, 187, 187, 187, 187, 86,
+ 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, 81, 81, 86, 86, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 318, 318, 318, 318, 318, 318, 318, 319, 319,
- 175, 175, 175, 80, 80, 80, 320, 319, 319, 319, 319, 319, 187, 187, 187,
- 187, 187, 187, 187, 187, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81,
- 81, 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81,
- 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 318, 318,
- 318, 318, 318, 318, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 318, 318, 318, 318, 318, 318, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81,
- 81, 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81, 81, 81, 26, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 0,
+ 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49,
+ 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35,
+ 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 0, 49,
+ 49, 49, 49, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 0,
+ 49, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49,
- 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0,
- 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49,
- 49, 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 49,
- 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49,
- 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, 49, 49, 49, 49, 49,
- 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222,
- 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49,
@@ -2480,78 +2472,84 @@ static unsigned short index2[] = {
49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222, 35, 35,
- 35, 35, 35, 35, 49, 35, 0, 0, 322, 322, 322, 322, 322, 322, 322, 322,
+ 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 322, 322,
322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
- 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 322, 322, 322, 322, 322, 322, 130, 130, 130, 130, 0, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 130, 130, 0, 130, 0, 0,
+ 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 130, 130,
+ 130, 130, 0, 130, 0, 130, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 130, 0, 130,
+ 0, 130, 0, 130, 130, 130, 0, 130, 130, 0, 130, 0, 0, 130, 0, 130, 0, 130,
+ 0, 130, 0, 130, 0, 130, 130, 0, 130, 0, 0, 130, 130, 130, 130, 0, 130,
+ 130, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 0, 130, 130, 130,
+ 130, 0, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 130,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 0, 130, 130, 0, 130, 0, 0, 130, 0, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 0, 130, 0, 130, 0,
- 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 130, 0, 130, 0, 130, 0, 130, 130, 130, 0,
- 130, 130, 0, 130, 0, 0, 130, 0, 130, 0, 130, 0, 130, 0, 130, 0, 130, 130,
- 0, 130, 0, 0, 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130,
- 0, 130, 130, 130, 130, 0, 130, 130, 130, 130, 0, 130, 0, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 130,
- 130, 130, 0, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26,
+ 130, 130, 0, 0, 0, 0, 0, 130, 130, 130, 0, 130, 130, 130, 130, 130, 0,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 237, 237,
+ 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 0, 0, 0, 0, 0, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 323, 0, 237, 237, 237, 237, 237, 237, 237,
237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
- 323, 0, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
- 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
- 237, 237, 237, 237, 237, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 218, 218, 0, 0, 0, 0, 324,
324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
- 324, 324, 324, 218, 218, 0, 0, 0, 0, 324, 324, 324, 324, 324, 324, 324,
324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
- 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 237, 324, 324,
- 324, 324, 324, 324, 324, 324, 324, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 324, 324, 324, 237, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 264, 264, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 264,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 264, 264, 264, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
- 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 0, 0, 0,
- 0, 0, 264, 264, 264, 264, 264, 264, 264, 264, 264, 0, 0, 0, 0, 0, 0, 0,
- 264, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 264, 264, 264, 264, 0, 0, 0, 0, 0, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 0, 0, 0, 0, 0, 0, 0, 264, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 0, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0,
+ 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 0, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 0, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
@@ -2561,76 +2559,76 @@ static unsigned short index2[] = {
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 0, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26,
- 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
- 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270,
- 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
- 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 187, 187, 187, 187, 187, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
@@ -2643,8 +2641,9 @@ static unsigned short index2[] = {
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
- 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
@@ -2652,8 +2651,7 @@ static unsigned short index2[] = {
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
- 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 0,
- 0,
+ 269, 269, 269, 269, 0, 0,
};
/* decomposition data */
@@ -5863,7 +5861,7 @@ static unsigned char changes_3_2_0_data[] = {
0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 0, 0, 37, 38, 39, 40,
41, 42, 1, 1, 0, 0, 0, 4, 36, 8, 6, 7, 37, 38, 39, 40, 41, 42, 1, 1, 0,
0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h
index 3838882..084f011 100644
--- a/Modules/unicodename_db.h
+++ b/Modules/unicodename_db.h
@@ -65,9 +65,9 @@ static unsigned char lexicon[] = {
76, 85, 197, 83, 72, 65, 82, 65, 68, 193, 83, 73, 78, 72, 65, 76, 193,
75, 65, 128, 82, 85, 78, 73, 195, 83, 65, 85, 82, 65, 83, 72, 84, 82,
193, 84, 69, 84, 82, 65, 71, 82, 65, 205, 68, 69, 83, 69, 82, 69, 212,
- 84, 73, 76, 68, 69, 128, 71, 85, 82, 77, 85, 75, 72, 201, 77, 65, 128,
- 77, 65, 89, 69, 203, 77, 69, 69, 84, 69, 201, 78, 79, 84, 65, 84, 73, 79,
- 206, 83, 89, 82, 73, 65, 195, 70, 73, 86, 69, 128, 80, 65, 128, 89, 65,
+ 83, 89, 82, 73, 65, 195, 84, 73, 76, 68, 69, 128, 71, 85, 82, 77, 85, 75,
+ 72, 201, 77, 65, 128, 77, 65, 89, 69, 203, 77, 69, 69, 84, 69, 201, 78,
+ 79, 84, 65, 84, 73, 79, 206, 70, 73, 86, 69, 128, 80, 65, 128, 89, 65,
128, 76, 73, 71, 72, 212, 83, 73, 88, 128, 69, 73, 71, 72, 84, 128, 76,
69, 80, 67, 72, 193, 78, 65, 128, 83, 69, 86, 69, 78, 128, 76, 79, 78,
199, 78, 73, 78, 69, 128, 84, 85, 82, 75, 73, 195, 72, 65, 77, 90, 193,
@@ -525,79 +525,79 @@ static unsigned char lexicon[] = {
84, 85, 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85,
84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, 84, 85, 82, 84, 76,
69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69,
- 128, 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85, 82, 66, 65, 78,
- 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, 85, 79,
- 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, 89, 128,
- 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 65, 69, 128, 84, 85, 77,
- 128, 84, 85, 76, 73, 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128,
- 84, 85, 75, 128, 84, 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85,
- 71, 178, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, 128, 84, 85, 65,
- 69, 128, 84, 213, 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128,
- 84, 84, 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65,
- 128, 84, 84, 84, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84,
- 84, 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84,
- 83, 65, 128, 84, 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128,
- 84, 84, 72, 87, 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128,
- 84, 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84,
- 84, 72, 69, 128, 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69,
- 72, 69, 72, 128, 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84,
- 69, 200, 84, 84, 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84,
- 84, 65, 85, 128, 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50,
- 128, 84, 83, 87, 69, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83,
- 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 72, 85, 71, 83, 128, 84, 83,
- 72, 79, 79, 75, 128, 84, 83, 72, 79, 79, 203, 84, 83, 72, 69, 83, 128,
- 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, 69, 128, 84,
- 83, 72, 65, 128, 84, 83, 69, 82, 69, 128, 84, 83, 65, 68, 73, 128, 84,
- 83, 65, 68, 201, 84, 83, 65, 65, 68, 73, 89, 128, 84, 83, 65, 65, 128,
- 84, 83, 193, 84, 82, 89, 66, 76, 73, 79, 206, 84, 82, 85, 84, 72, 128,
- 84, 82, 85, 78, 75, 128, 84, 82, 85, 78, 67, 65, 84, 69, 196, 84, 82, 85,
- 77, 80, 69, 84, 128, 84, 82, 85, 69, 128, 84, 82, 85, 67, 75, 128, 84,
- 82, 79, 80, 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77,
- 73, 75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79,
- 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80,
- 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79,
- 78, 128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76,
- 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128,
- 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, 79, 69, 90, 69, 78, 73,
- 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82, 73, 84, 79, 211, 84,
- 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, 83, 73, 77, 79,
- 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, 79, 68, 128,
- 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 197, 84, 82, 73, 79,
- 206, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, 77, 79,
- 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, 78,
- 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, 73,
- 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68, 69, 78,
- 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71, 85, 76,
- 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 84, 82,
- 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73, 65, 78,
- 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, 65, 128,
- 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, 69, 78, 68,
- 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84,
- 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49,
- 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 65, 68, 73, 78,
- 71, 128, 84, 82, 65, 89, 128, 84, 82, 65, 80, 69, 90, 73, 85, 77, 128,
- 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80, 79,
- 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, 83, 77, 73, 212, 84, 82, 65, 78,
- 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83,
- 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, 82, 65, 77, 128, 84,
- 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82, 65,
- 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, 128, 84, 82, 65, 70, 70,
- 73, 195, 84, 82, 65, 68, 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82,
- 65, 67, 75, 128, 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82, 128,
- 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 84, 65, 204, 84, 79, 84, 128,
- 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84,
- 79, 82, 67, 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79, 81, 128,
- 84, 79, 80, 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196,
- 84, 79, 80, 128, 84, 79, 208, 84, 79, 79, 84, 72, 128, 84, 79, 79, 78,
- 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78,
- 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79,
- 78, 69, 45, 55, 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53,
- 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79,
- 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128,
- 84, 79, 78, 65, 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79,
- 128, 84, 79, 76, 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76,
- 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84,
- 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 78,
+ 128, 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85, 82, 75, 73, 83,
+ 200, 84, 85, 82, 66, 65, 78, 128, 84, 85, 82, 128, 84, 85, 80, 128, 84,
+ 85, 79, 88, 128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79,
+ 128, 84, 85, 78, 78, 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85,
+ 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 76, 73, 80, 128, 84, 85, 75,
+ 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, 128, 84, 85, 71, 82, 73, 203,
+ 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, 85, 65, 82, 69, 199, 84, 85,
+ 65, 69, 80, 128, 84, 85, 65, 69, 128, 84, 213, 84, 84, 85, 85, 128, 84,
+ 84, 85, 68, 68, 65, 71, 128, 84, 84, 85, 68, 68, 65, 65, 71, 128, 84, 84,
+ 85, 128, 84, 84, 84, 72, 65, 128, 84, 84, 84, 65, 128, 84, 84, 83, 85,
+ 128, 84, 84, 83, 79, 128, 84, 84, 83, 73, 128, 84, 84, 83, 69, 69, 128,
+ 84, 84, 83, 69, 128, 84, 84, 83, 65, 128, 84, 84, 79, 79, 128, 84, 84,
+ 73, 73, 128, 84, 84, 73, 128, 84, 84, 72, 87, 69, 128, 84, 84, 72, 85,
+ 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, 128, 84, 84, 72, 73, 128,
+ 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, 84, 84, 72, 65, 65, 128,
+ 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, 84, 84, 69, 72, 69, 200,
+ 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, 69, 69, 128, 84, 84, 65,
+ 89, 65, 78, 78, 65, 128, 84, 84, 65, 85, 128, 84, 84, 65, 73, 128, 84,
+ 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, 87, 69, 128, 84, 83, 87, 65,
+ 128, 84, 83, 86, 128, 84, 83, 83, 69, 128, 84, 83, 83, 65, 128, 84, 83,
+ 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, 72, 79, 79,
+ 203, 84, 83, 72, 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69,
+ 199, 84, 83, 72, 69, 128, 84, 83, 72, 65, 128, 84, 83, 69, 82, 69, 128,
+ 84, 83, 65, 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 65, 68, 73, 89,
+ 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 82, 89, 66, 76, 73, 79, 206,
+ 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, 78, 67, 65,
+ 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 69, 128, 84,
+ 82, 85, 67, 75, 128, 84, 82, 79, 80, 73, 67, 65, 204, 84, 82, 79, 80, 72,
+ 89, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84,
+ 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82,
+ 79, 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84,
+ 82, 79, 77, 73, 75, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82,
+ 79, 77, 73, 75, 79, 76, 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 76, 76,
+ 69, 89, 66, 85, 83, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82,
+ 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82,
+ 73, 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82,
+ 73, 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73,
+ 80, 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 197,
+ 84, 82, 73, 79, 206, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82,
+ 65, 77, 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82,
+ 71, 79, 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70,
+ 79, 76, 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68,
+ 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71,
+ 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196,
+ 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73,
+ 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, 65,
+ 128, 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, 69,
+ 78, 68, 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51,
+ 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79,
+ 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 65, 68,
+ 73, 78, 71, 128, 84, 82, 65, 89, 128, 84, 82, 65, 80, 69, 90, 73, 85, 77,
+ 128, 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80,
+ 79, 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, 83, 77, 73, 212, 84, 82, 65,
+ 78, 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, 78, 83, 77, 73, 83,
+ 83, 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, 82, 65, 77, 128,
+ 84, 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82,
+ 65, 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, 128, 84, 82, 65, 70,
+ 70, 73, 195, 84, 82, 65, 68, 197, 84, 82, 65, 67, 84, 79, 82, 128, 84,
+ 82, 65, 67, 75, 128, 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82,
+ 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 84, 65, 204, 84, 79, 84,
+ 128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 67, 85, 76, 85, 83,
+ 128, 84, 79, 82, 67, 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79,
+ 81, 128, 84, 79, 80, 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84,
+ 69, 196, 84, 79, 80, 128, 84, 79, 208, 84, 79, 79, 84, 72, 128, 84, 79,
+ 79, 78, 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84,
+ 79, 78, 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 56, 128,
+ 84, 79, 78, 69, 45, 55, 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69,
+ 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128,
+ 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69,
+ 128, 84, 79, 78, 65, 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84,
+ 79, 128, 84, 79, 76, 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, 79, 73,
+ 76, 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207,
+ 84, 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 78,
128, 84, 76, 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128,
84, 76, 72, 89, 65, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128,
84, 76, 72, 79, 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84,
@@ -4635,7 +4635,7 @@ static unsigned int lexicon_offset[] = {
557, 850, 860, 867, 873, 879, 886, 894, 898, 749, 906, 915, 503, 923,
928, 934, 17, 943, 948, 951, 955, 959, 966, 969, 976, 980, 988, 992,
1000, 1004, 1007, 1014, 1021, 192, 1024, 1029, 1039, 1048, 1055, 1061,
- 1069, 1072, 1077, 1083, 1091, 1097, 1102, 1105, 1108, 111, 1113, 1117,
+ 1067, 1075, 1078, 1083, 1089, 1097, 1102, 1105, 1108, 111, 1113, 1117,
1123, 1129, 1132, 1138, 1142, 1147, 1153, 1158, 1168, 1172, 1175, 1178,
1187, 1191, 1194, 1199, 1204, 1210, 1215, 1220, 1225, 1229, 1234, 1240,
1245, 1250, 1254, 1260, 1265, 1270, 1275, 1279, 1284, 1289, 1294, 1300,
@@ -4755,7373 +4755,7374 @@ static unsigned int lexicon_offset[] = {
8645, 8649, 8653, 8658, 8665, 8676, 8684, 8694, 8700, 8707, 8712, 8716,
8727, 8740, 8751, 8764, 8775, 8787, 8799, 8811, 8824, 8837, 8844, 8850,
8864, 8871, 8877, 8881, 8886, 8890, 8897, 8905, 8909, 8915, 8919, 8925,
- 8935, 8939, 8944, 8949, 8956, 8962, 8972, 7909, 8978, 8982, 8989, 768,
- 8993, 8997, 9002, 9007, 9012, 9016, 9022, 9030, 9036, 9040, 9046, 9056,
- 9060, 9066, 9071, 9075, 9081, 9087, 2161, 9092, 9094, 9099, 9107, 9116,
- 9120, 9126, 9131, 9136, 9141, 9146, 9152, 9157, 9162, 4006, 9167, 9172,
- 9176, 9182, 9187, 9193, 9198, 9203, 9209, 9214, 9121, 9220, 9224, 9231,
- 9237, 9242, 9246, 6183, 9251, 9260, 9265, 9270, 8218, 8225, 9275, 2853,
- 9279, 9284, 9289, 9132, 9293, 9298, 9137, 9142, 9303, 9310, 9317, 9323,
- 9329, 9335, 9340, 9345, 9350, 9147, 9153, 9356, 9362, 9367, 9375, 9158,
- 9380, 990, 9383, 9391, 9397, 9403, 9412, 9420, 9425, 9431, 9439, 9446,
- 9461, 9478, 9497, 9506, 9514, 9529, 9540, 9550, 9560, 9568, 9574, 9586,
- 9595, 9603, 9610, 9617, 9623, 9628, 9636, 9646, 9653, 9663, 9673, 9683,
- 9691, 9698, 9707, 9717, 9731, 9746, 9755, 9763, 9768, 9772, 9781, 9787,
- 9792, 9802, 9812, 9822, 9827, 9831, 9840, 9845, 9855, 9866, 9879, 9887,
- 9900, 9912, 9920, 9925, 9929, 9935, 9940, 9948, 9956, 9963, 9968, 9976,
- 9982, 9985, 9989, 9995, 10003, 10008, 10012, 10020, 10029, 10037, 10043,
- 10047, 10054, 10065, 10069, 10072, 10078, 9163, 10083, 10089, 10096,
- 10102, 10107, 10114, 10121, 10128, 10135, 10142, 10149, 10156, 10163,
- 10168, 9474, 10173, 10179, 10186, 10193, 10198, 10205, 10214, 10218,
- 10230, 8256, 10234, 10237, 10241, 10245, 10249, 10253, 10259, 10265,
- 10270, 10276, 10281, 10286, 10292, 10297, 10302, 8952, 10307, 10311,
- 10315, 10319, 10324, 10329, 10337, 10343, 10347, 10351, 10358, 10363,
- 10371, 10376, 10380, 10383, 10389, 10396, 10400, 10403, 10408, 10412,
- 4045, 10418, 10427, 36, 10435, 10441, 10446, 8967, 10451, 10456, 10460,
- 10463, 10478, 10497, 10509, 10522, 10535, 10548, 10562, 10575, 10590,
- 10597, 9168, 10603, 10617, 10622, 10628, 10633, 10641, 10646, 8040,
- 10651, 10654, 10661, 10666, 10670, 2858, 998, 10676, 10680, 10686, 10692,
- 10697, 10703, 10708, 9177, 10714, 10720, 10725, 10730, 10738, 10744,
- 10757, 10765, 10772, 9183, 10778, 10786, 10794, 10801, 10814, 10826,
- 10836, 10844, 10851, 10858, 10867, 10876, 10884, 10891, 10896, 10902,
- 9188, 10907, 10913, 9194, 10918, 10921, 10928, 10934, 10947, 8669, 10958,
- 10964, 10973, 10981, 10988, 10994, 11000, 11005, 11009, 11014, 10470,
- 11020, 9199, 11027, 11032, 11039, 11045, 11051, 11056, 11064, 11072,
- 11079, 11083, 11097, 11107, 11112, 11116, 11127, 11133, 11138, 11143,
- 9204, 9210, 11147, 11150, 11155, 11167, 11174, 11179, 11183, 11188,
- 11192, 11199, 11205, 9215, 9122, 11212, 2863, 8, 11219, 11224, 11228,
- 11234, 11242, 11252, 11257, 11262, 11269, 11276, 11280, 11291, 11301,
- 11310, 11322, 11327, 11331, 11339, 11353, 11357, 11360, 11368, 11375,
- 11383, 11387, 11398, 11402, 11409, 11414, 11418, 11424, 11429, 11433,
- 11439, 11444, 11455, 11459, 11462, 11468, 11473, 11479, 11485, 11492,
- 11503, 11513, 11523, 11532, 11539, 11548, 9225, 9232, 9238, 9243, 11554,
- 11560, 9247, 11566, 11569, 11576, 11581, 11596, 11612, 11627, 11635,
- 11641, 11646, 838, 420, 11651, 11659, 11666, 11672, 11677, 11682, 9252,
- 11684, 11688, 11693, 11697, 11707, 11712, 11716, 11725, 11729, 11732,
- 9261, 11739, 11742, 11750, 11757, 11765, 11769, 11776, 11785, 11788,
- 11792, 11796, 11802, 11806, 11810, 11814, 11820, 11830, 11834, 11842,
- 11846, 11853, 11857, 11862, 11866, 11873, 11879, 11887, 11893, 11898,
- 11908, 11913, 11918, 11922, 11930, 3905, 11938, 11943, 9266, 11947,
- 11951, 11954, 11962, 11969, 11973, 5991, 11977, 11982, 11986, 11997,
- 12007, 12012, 12018, 12022, 12025, 12033, 12038, 12043, 12050, 12055,
- 9271, 12060, 12064, 12071, 1722, 6145, 12076, 12081, 12086, 12091, 12097,
- 12102, 12108, 12113, 12118, 12123, 12128, 12133, 12138, 12143, 12148,
- 12153, 12158, 12163, 12168, 12173, 12178, 12183, 12188, 12194, 12199,
- 12204, 12209, 12214, 12219, 12225, 12230, 12235, 12241, 12246, 12252,
- 12257, 12263, 12268, 12273, 12278, 12283, 12289, 12294, 12299, 12304,
- 737, 139, 12312, 12316, 12321, 12326, 12330, 12334, 12338, 12343, 12347,
- 12352, 12356, 12359, 12363, 12367, 12373, 12378, 12388, 12394, 12402,
- 12406, 12410, 12417, 12425, 12434, 12445, 12452, 12459, 12463, 12472,
- 12481, 12489, 12498, 12507, 12516, 12525, 12535, 12545, 12555, 12565,
- 12575, 12584, 12594, 12604, 12614, 12624, 12634, 12644, 12654, 12663,
- 12673, 12683, 12693, 12703, 12713, 12723, 12732, 12742, 12752, 12762,
- 12772, 12782, 12792, 12802, 12812, 12822, 12831, 12841, 12851, 12861,
- 12871, 12881, 12891, 12901, 12911, 12921, 12931, 12940, 1256, 12946,
- 12949, 12953, 12958, 12965, 12971, 12976, 12980, 12985, 12994, 13002,
- 13007, 13011, 13015, 13021, 13026, 13032, 9280, 13037, 13042, 13051,
- 9285, 13056, 13059, 13065, 13073, 9290, 13080, 13084, 13088, 13092,
- 13102, 13108, 13114, 13119, 13128, 13136, 13143, 13150, 13155, 13162,
- 13167, 13171, 13174, 13185, 13195, 13204, 13212, 13223, 13235, 13245,
- 13250, 13254, 13259, 13264, 13268, 13274, 13282, 13289, 13300, 13305,
- 13315, 13319, 13322, 13329, 13339, 13348, 13355, 13359, 13366, 13372,
- 13377, 13382, 13386, 13395, 13400, 13406, 13410, 13415, 13419, 13428,
- 13436, 13444, 13451, 13459, 13471, 13482, 13492, 13499, 13505, 13514,
- 13525, 13534, 13546, 13558, 13570, 13580, 13589, 13598, 13606, 13613,
- 13622, 13630, 13634, 13640, 13646, 13651, 7753, 13655, 13657, 13661,
- 13666, 13672, 13681, 13685, 13693, 13700, 13709, 13718, 13727, 13736,
- 13745, 13754, 13763, 13772, 13782, 13792, 13801, 13807, 13814, 13821,
- 13827, 13841, 13848, 13856, 13865, 13871, 13880, 13889, 13900, 13910,
- 13918, 13925, 13933, 13942, 13955, 13963, 13970, 13983, 13989, 13995,
- 14005, 14014, 14023, 14028, 14032, 14038, 14044, 14051, 8966, 14056,
- 14061, 14068, 14073, 12369, 14078, 14086, 14092, 14097, 14105, 14113,
- 14120, 14128, 14134, 14142, 14150, 14156, 14161, 14167, 14174, 14180,
- 14185, 14189, 14200, 14208, 14214, 14219, 14228, 14234, 14239, 14248,
- 14262, 3853, 14266, 14271, 14276, 14282, 14287, 14292, 14296, 14301,
- 14306, 14311, 7752, 14316, 14321, 14326, 14331, 14336, 14340, 14345,
- 14350, 14355, 14360, 14366, 14372, 14377, 14381, 14386, 14391, 14396,
- 9294, 14401, 14406, 14411, 14416, 14421, 14438, 14456, 14468, 14481,
- 14498, 14514, 14531, 14541, 14560, 14571, 14582, 14593, 14604, 14616,
- 14627, 14638, 14655, 14666, 14677, 14682, 9299, 14687, 14691, 2381,
- 14695, 14698, 14704, 14712, 14720, 14725, 14733, 14741, 14748, 14753,
- 14759, 14766, 14774, 14781, 14793, 14801, 14806, 11590, 14812, 14821,
- 14830, 14838, 14845, 14851, 14859, 14866, 14872, 14879, 14885, 14894,
- 14902, 14912, 14919, 14925, 14933, 14939, 14947, 14954, 14967, 14974,
- 14983, 14992, 15001, 15009, 15019, 15026, 15031, 3560, 15038, 15043,
- 1372, 15047, 14317, 15051, 15057, 15061, 15069, 15081, 15086, 15093,
- 15099, 15104, 15111, 14322, 15115, 15119, 15123, 14327, 15127, 14332,
- 15131, 15138, 15143, 15147, 15154, 15158, 15166, 15173, 15177, 15184,
- 15201, 15210, 15214, 15217, 15225, 15231, 15236, 3638, 15240, 15242,
- 15250, 15257, 15267, 15279, 15284, 15290, 15295, 15299, 15305, 15310,
- 15316, 15319, 15326, 15334, 15341, 15347, 15353, 15358, 15365, 15371,
- 15376, 15383, 15387, 15393, 15397, 15404, 15410, 15416, 15424, 15430,
- 15435, 15441, 15449, 15457, 15463, 15469, 15474, 15481, 15486, 15490,
- 15496, 15501, 15508, 15513, 15519, 15522, 15528, 15534, 15537, 15541,
- 15553, 15559, 15564, 15571, 15577, 15583, 15594, 15604, 15613, 15621,
- 15628, 15639, 15649, 15659, 15667, 15670, 14346, 15675, 15680, 14351,
- 14486, 15688, 15701, 15716, 15727, 14503, 15745, 15758, 15771, 15782,
- 10485, 15793, 15806, 15825, 15836, 15847, 15858, 2649, 15871, 15875,
- 15883, 15898, 15913, 15924, 15931, 15937, 15945, 15949, 15955, 15958,
- 15968, 15976, 15983, 15991, 16001, 16006, 16013, 16018, 16025, 16036,
- 16046, 16052, 16057, 16062, 14356, 16066, 16072, 16078, 16083, 16088,
- 16093, 16097, 14361, 14367, 16101, 14373, 16106, 16114, 16123, 16130,
- 9143, 16134, 16136, 16141, 16146, 16152, 16157, 16162, 16167, 16172,
- 16176, 16182, 16188, 16193, 16199, 16204, 16209, 16215, 16220, 16225,
- 16230, 16235, 16241, 16246, 16251, 16257, 16263, 16268, 16273, 16280,
- 16286, 16297, 16304, 16309, 16313, 16317, 16320, 16328, 16333, 16340,
- 16347, 16353, 16358, 16363, 16370, 16380, 16385, 16392, 16398, 16408,
- 16418, 16432, 16446, 16460, 16474, 16489, 16504, 16521, 16539, 16552,
- 16558, 16563, 16568, 16572, 16577, 16585, 16591, 16596, 16601, 16605,
- 16610, 16614, 16619, 16623, 16634, 16640, 16645, 16650, 16657, 16662,
- 16666, 16671, 16676, 16682, 16689, 16695, 16700, 16704, 16710, 16715,
- 16720, 16724, 16730, 16735, 16740, 16747, 16752, 13104, 16756, 16761,
- 16765, 16770, 16776, 16782, 16789, 16799, 16807, 16814, 16819, 16823,
- 16832, 16840, 16847, 16854, 16860, 16866, 16871, 16876, 16882, 16887,
- 16893, 16898, 16904, 16910, 16917, 16923, 16928, 16933, 9341, 16942,
- 16945, 16951, 16956, 16961, 16971, 16978, 16984, 16989, 16994, 17000,
- 17005, 17011, 17016, 17022, 17028, 17033, 17041, 17048, 17053, 17058,
- 17064, 17069, 17073, 17082, 17093, 17100, 17105, 17113, 17119, 17126,
- 17132, 17137, 17141, 17147, 17152, 17157, 17162, 1440, 7777, 2877, 17166,
- 17170, 17174, 17178, 17182, 17186, 17189, 17196, 17204, 14387, 17211,
- 17221, 17229, 17236, 17244, 17254, 17263, 17276, 17281, 17286, 17294,
- 17301, 13200, 13209, 17308, 17318, 17333, 17339, 17346, 17353, 17359,
- 17367, 17377, 17387, 14392, 17396, 17402, 17408, 17416, 17424, 17429,
- 17438, 17446, 17458, 17468, 17478, 17488, 17497, 17509, 17519, 17529,
- 17540, 17545, 17557, 17569, 17581, 17593, 17605, 17617, 17629, 17641,
- 17653, 17665, 17676, 17688, 17700, 17712, 17724, 17736, 17748, 17760,
- 17772, 17784, 17796, 17807, 17819, 17831, 17843, 17855, 17867, 17879,
- 17891, 17903, 17915, 17927, 17938, 17950, 17962, 17974, 17986, 17998,
- 18010, 18022, 18034, 18046, 18058, 18069, 18081, 18093, 18105, 18117,
- 18129, 18141, 18153, 18165, 18177, 18189, 18200, 18212, 18224, 18236,
- 18248, 18260, 18272, 18284, 18296, 18308, 18320, 18331, 18343, 18355,
- 18367, 18379, 18391, 18403, 18415, 18427, 18439, 18451, 18462, 18474,
- 18486, 18498, 18510, 18523, 18536, 18549, 18562, 18575, 18588, 18601,
- 18613, 18626, 18639, 18652, 18665, 18678, 18691, 18704, 18717, 18730,
- 18743, 18755, 18768, 18781, 18794, 18807, 18820, 18833, 18846, 18859,
- 18872, 18885, 18897, 18910, 18923, 18936, 18949, 18962, 18975, 18988,
- 19001, 19014, 19027, 19039, 19052, 19065, 19078, 19091, 19104, 19117,
- 19130, 19143, 19156, 19169, 19181, 19194, 19207, 19220, 19233, 19246,
- 19259, 19272, 19285, 19298, 19311, 19323, 19334, 19347, 19360, 19373,
- 19386, 19399, 19412, 19425, 19438, 19451, 19464, 19476, 19489, 19502,
- 19515, 19528, 19541, 19554, 19567, 19580, 19593, 19606, 19618, 19631,
- 19644, 19657, 19670, 19683, 19696, 19709, 19722, 19735, 19748, 19760,
- 19773, 19786, 19799, 19812, 19825, 19838, 19851, 19864, 19877, 19890,
- 19902, 19915, 19928, 19941, 19954, 19967, 19980, 19993, 20006, 20019,
- 20032, 20044, 20057, 20070, 20083, 20096, 20109, 20122, 20135, 20148,
- 20161, 20174, 20186, 20199, 20212, 20225, 20238, 20251, 20264, 20277,
- 20290, 20303, 20316, 20328, 20341, 20354, 20367, 20380, 20393, 20406,
- 20419, 20432, 20445, 20458, 20470, 20483, 20496, 20509, 20522, 20535,
- 20548, 20561, 20574, 20587, 20600, 20612, 20625, 20638, 20651, 20664,
- 20677, 20690, 20703, 20716, 20729, 20742, 20754, 20765, 20773, 20781,
- 20788, 20794, 20798, 20804, 20810, 20818, 20824, 20829, 20833, 20842,
- 9148, 20853, 20860, 20868, 20875, 20882, 10941, 20889, 20898, 20903,
- 20908, 7805, 20915, 20920, 20923, 20928, 20936, 20943, 20950, 20957,
- 20963, 20972, 20981, 20987, 20996, 21000, 21006, 21011, 21021, 21028,
- 21034, 21042, 21048, 21055, 21065, 21074, 21078, 21085, 21089, 21094,
- 21100, 21108, 21112, 21122, 14402, 21131, 21137, 21141, 21150, 14407,
- 21156, 21163, 21174, 21182, 21191, 21199, 8931, 21207, 21212, 21218,
- 21223, 21227, 21231, 21235, 9632, 21240, 21248, 21255, 21264, 21271,
- 21278, 10871, 21285, 21291, 21295, 21301, 21308, 21314, 21322, 21328,
- 21335, 21341, 21347, 21356, 21360, 21368, 21377, 21384, 21389, 21393,
- 21404, 21409, 21414, 21419, 21432, 7995, 21436, 21442, 21450, 21454,
- 21461, 21470, 21475, 14678, 21483, 21487, 21499, 21504, 21508, 21511,
- 21517, 21523, 21528, 21532, 21535, 21546, 21551, 9376, 21558, 21563,
- 9381, 21568, 21573, 21578, 21583, 21588, 21593, 21598, 21603, 21608,
- 21613, 21618, 21623, 21629, 21634, 21639, 21644, 21649, 21654, 21659,
- 21664, 21669, 21674, 21680, 21686, 21691, 21696, 21701, 21706, 21711,
- 21716, 21721, 21726, 21731, 21737, 21742, 21747, 21752, 21758, 21764,
- 21769, 21774, 21779, 21784, 21789, 21794, 21799, 21804, 21810, 21815,
- 21820, 21825, 21830, 21836, 21841, 21846, 21850, 1368, 129, 21858, 21862,
- 21866, 21870, 21875, 21879, 13110, 12469, 21883, 21888, 21892, 21897,
- 21901, 21906, 21910, 21916, 21921, 21925, 21929, 21937, 21941, 21945,
- 21950, 21955, 21959, 21965, 21970, 21974, 21979, 21984, 21988, 21995,
- 22002, 22009, 22013, 22017, 22022, 22026, 22029, 22035, 22048, 22053,
- 22062, 22067, 9421, 22072, 22075, 2712, 2717, 22079, 22085, 22091, 7209,
- 22096, 22101, 22106, 22112, 22117, 13896, 22122, 22127, 22132, 22137,
- 22143, 22148, 22153, 22159, 22164, 22168, 22173, 22178, 22183, 22188,
- 22192, 22197, 22201, 22206, 22211, 22216, 22221, 22225, 22230, 22234,
- 22239, 22244, 22249, 22254, 2886, 22169, 22258, 22266, 22273, 9726,
- 22285, 22293, 22174, 22300, 22305, 22313, 22179, 22318, 22323, 22331,
- 22336, 22184, 22341, 22346, 22350, 22356, 22364, 22367, 22374, 22378,
- 22382, 22388, 22395, 22400, 8958, 1727, 1732, 22404, 22410, 22416, 22421,
- 22425, 22429, 22433, 22437, 22441, 22445, 22449, 22452, 22458, 22465,
- 22473, 22479, 22485, 22490, 22495, 22499, 13816, 13823, 22504, 22516,
- 22519, 22526, 16349, 22533, 22541, 22552, 22561, 22574, 22584, 22598,
- 22610, 22624, 22636, 22646, 22658, 22664, 22679, 22703, 22721, 22740,
- 22753, 22767, 22785, 22801, 22818, 22836, 22847, 22866, 22883, 22903,
- 22921, 22933, 22947, 22961, 22973, 22990, 23009, 23027, 23039, 23057,
- 23076, 14546, 23089, 23109, 23121, 10516, 23133, 23138, 23143, 23148,
- 23154, 23159, 23163, 23170, 2398, 23174, 23180, 23184, 23187, 23191,
- 23199, 23205, 22202, 23209, 23218, 23229, 23235, 23241, 23250, 23258,
- 23265, 23270, 23274, 23281, 23287, 23296, 23304, 23311, 23321, 23330,
- 23340, 23345, 23354, 23363, 23374, 23385, 3963, 23395, 23399, 23409,
- 23417, 23427, 23438, 23443, 23453, 23461, 23468, 23474, 23481, 23486,
- 22212, 23490, 23499, 23503, 23506, 23511, 23518, 23527, 23535, 23543,
- 23553, 23562, 23568, 23574, 22217, 22222, 23578, 23588, 23598, 23608,
- 23616, 23623, 23633, 23641, 23649, 23655, 23663, 930, 23672, 14737, 542,
- 23686, 23695, 23703, 23714, 23725, 23735, 23744, 23756, 23765, 23774,
- 23780, 23789, 23798, 23808, 23816, 23824, 9353, 23830, 23833, 23837,
- 23842, 23847, 9841, 22235, 22240, 23855, 23861, 23867, 23872, 23877,
- 23881, 23889, 23895, 23901, 23905, 3525, 23913, 23918, 23923, 23927,
- 23931, 9921, 23938, 23946, 23960, 23967, 23973, 9930, 9936, 23981, 23989,
- 23996, 24001, 24006, 22245, 24012, 24023, 24027, 24032, 2601, 24037,
- 24048, 24054, 24059, 24063, 24067, 24070, 24077, 24084, 24091, 24097,
- 24101, 22250, 24106, 24110, 24114, 1037, 24119, 24124, 24129, 24134,
- 24139, 24144, 24149, 24154, 24159, 24164, 24169, 24174, 24179, 24184,
- 24190, 24195, 24200, 24205, 24210, 24215, 24220, 24226, 24231, 24236,
- 24241, 24246, 24251, 24256, 24261, 24267, 24273, 24278, 24284, 24289,
- 24294, 5, 24300, 24304, 24308, 24312, 24317, 24321, 24325, 24329, 24333,
- 24338, 24342, 24347, 24351, 24354, 24358, 24363, 24367, 24372, 24376,
- 24380, 24384, 24389, 24393, 24397, 24407, 24412, 24416, 24420, 24425,
- 24430, 24439, 24444, 24449, 24453, 24457, 24470, 24482, 24491, 24500,
- 24506, 24511, 24515, 24519, 24529, 24538, 24546, 24552, 24557, 24561,
- 24568, 24578, 24587, 24595, 24603, 24610, 24618, 24627, 24636, 24644,
- 24649, 24653, 24657, 24660, 24662, 24666, 24670, 24675, 24680, 24684,
- 24688, 24691, 24695, 24698, 24702, 24705, 24708, 24712, 24718, 24722,
- 24726, 24730, 24735, 24740, 24745, 24749, 24752, 24757, 24763, 24768,
- 24774, 24779, 24783, 24787, 24791, 24796, 24800, 24805, 24809, 24813,
- 24820, 24824, 24827, 24831, 24837, 24843, 24847, 24851, 24856, 24863,
- 24869, 24873, 24882, 24886, 24890, 24893, 24899, 24904, 24910, 1489,
- 1791, 24915, 24920, 24925, 24930, 24935, 24940, 24945, 2148, 2194, 24950,
- 24953, 24957, 24961, 24966, 24970, 24974, 24977, 24982, 24987, 24991,
- 24994, 24999, 25003, 25008, 25012, 14749, 25017, 25020, 25023, 25027,
- 25032, 25036, 25049, 25053, 25056, 25064, 25073, 25080, 25085, 25091,
- 25097, 25105, 25112, 25119, 25123, 25127, 25131, 25136, 25141, 25145,
- 25153, 25158, 25170, 25181, 25186, 25190, 25194, 25200, 25205, 25210,
- 25214, 25218, 25221, 25227, 7915, 2316, 25231, 25236, 25252, 9468, 25272,
- 25281, 25297, 25301, 25304, 25310, 25320, 25326, 25335, 25350, 25362,
- 25373, 25381, 25390, 25396, 25405, 25415, 25426, 25437, 25446, 25453,
- 25462, 25470, 25477, 25485, 25492, 25499, 25512, 25519, 25525, 25530,
- 25539, 25545, 25550, 25558, 25565, 23419, 25577, 25589, 25603, 25611,
- 25618, 25630, 25639, 25648, 25656, 25664, 25672, 25679, 25688, 25696,
- 25706, 25715, 25725, 25734, 25743, 25751, 25756, 25760, 25763, 25767,
- 25771, 25775, 25779, 25783, 25789, 25795, 25803, 14794, 25810, 25815,
- 25822, 25828, 25835, 14802, 25842, 25845, 25857, 25865, 25871, 25876,
- 25880, 9871, 25891, 25901, 25910, 25917, 25921, 14807, 25924, 25931,
- 25935, 25941, 25944, 25951, 25957, 25964, 25970, 25974, 25979, 25983,
- 25992, 25999, 26005, 7956, 26012, 26020, 26027, 26033, 26038, 26044,
- 26050, 26058, 26062, 26065, 26067, 25768, 26076, 26082, 26092, 26097,
- 26104, 26110, 26115, 26120, 26125, 26129, 26134, 26141, 26150, 26154,
- 26161, 26170, 26176, 26181, 26187, 26192, 26199, 26210, 26215, 26219,
- 26229, 26235, 26239, 26244, 26254, 26263, 26267, 26274, 26282, 26289,
- 26295, 26300, 26308, 26315, 26327, 26336, 26340, 13046, 26348, 26358,
- 26362, 25060, 26373, 26378, 26382, 26389, 26396, 21961, 25693, 26401,
- 26405, 26408, 22853, 26413, 26427, 26443, 26461, 26480, 26497, 26515,
- 22872, 26532, 26552, 22889, 26564, 26576, 15732, 26588, 22909, 26602,
- 26614, 10529, 26628, 26633, 26638, 26643, 26649, 26655, 26661, 26665,
- 26672, 26677, 26687, 26693, 10176, 26699, 26701, 26706, 26714, 26718,
- 26137, 26724, 26731, 11517, 11527, 26738, 26748, 26753, 26757, 26760,
- 26766, 26774, 26786, 26796, 26812, 26825, 26839, 15750, 26853, 26860,
- 26864, 26867, 26872, 26876, 26883, 26890, 26900, 26905, 26910, 26915,
- 26923, 26931, 26940, 26945, 9565, 26949, 26952, 26955, 26960, 26967,
- 26972, 26988, 26996, 27004, 9416, 27012, 27017, 27021, 27027, 27033,
- 27036, 27042, 27054, 27062, 27069, 27075, 27082, 27093, 27107, 27120,
- 27129, 27138, 27150, 27161, 27171, 27180, 27189, 27197, 27208, 7938,
- 27215, 27221, 27226, 27232, 27239, 27249, 27259, 27268, 27274, 27281,
- 27286, 27293, 27301, 27309, 27321, 6246, 27328, 27337, 27345, 27351,
- 27357, 27362, 27366, 27369, 27375, 27382, 27387, 27392, 27396, 27408,
- 27419, 27428, 27436, 14934, 27441, 27447, 27453, 11510, 8635, 27458,
- 27462, 27465, 27468, 27474, 27482, 27490, 27494, 27498, 27503, 27506,
- 27515, 27519, 27527, 27538, 27542, 27548, 27554, 27558, 27564, 27572,
- 27594, 27618, 27625, 27632, 27638, 27646, 27652, 27657, 27668, 27686,
- 27693, 27701, 27705, 27714, 27727, 27735, 27747, 27758, 27768, 27782,
- 27791, 27799, 27811, 9485, 27822, 27833, 27845, 27855, 27864, 27869,
- 27873, 27881, 27891, 27896, 27900, 27903, 27906, 27914, 27922, 27931,
- 27941, 27950, 27956, 27970, 2663, 27992, 28003, 28012, 28022, 28034,
- 28043, 28052, 28062, 28070, 28078, 28087, 28092, 28103, 28108, 28119,
- 28123, 28133, 28142, 28150, 28160, 28170, 28178, 28187, 28194, 28202,
- 28209, 28218, 28222, 28230, 28237, 28245, 28252, 28263, 28278, 28285,
- 28291, 28301, 28310, 28316, 28320, 28327, 28331, 14018, 28337, 28341,
- 28346, 28353, 28357, 28361, 28369, 28377, 28383, 28392, 28399, 28404,
- 28409, 28419, 23488, 28423, 28426, 28431, 28436, 28441, 28446, 28451,
- 28456, 28461, 28466, 28472, 28477, 28482, 28488, 1218, 704, 28493, 28502,
- 2364, 28509, 28514, 28518, 28524, 1267, 546, 318, 28529, 28538, 28546,
- 28555, 28563, 28574, 28583, 28591, 28595, 28598, 28606, 28614, 28619,
- 14762, 28625, 28631, 28637, 5872, 28642, 28646, 28652, 28656, 28663,
- 1455, 28669, 28676, 9572, 28680, 28690, 28698, 28704, 28713, 28721,
- 28727, 28735, 28742, 11103, 28748, 28755, 28760, 28767, 1496, 2147,
- 28773, 28779, 28786, 28797, 28808, 28816, 28823, 28833, 28842, 28850,
- 28859, 28866, 28873, 28886, 28897, 1272, 28916, 28921, 28929, 3575,
- 28933, 28938, 28942, 1459, 24689, 28952, 28956, 28961, 28965, 3493,
- 28971, 28979, 28986, 28997, 29005, 29013, 3576, 279, 29018, 29026, 29034,
- 29041, 29047, 29052, 2216, 29059, 29065, 25975, 26205, 29071, 106, 29075,
- 29079, 29085, 615, 9321, 29090, 29097, 29103, 2327, 29107, 29111, 15174,
- 29114, 29119, 29126, 29132, 29137, 29145, 29152, 29158, 22338, 29162,
- 29166, 3646, 16612, 29170, 29175, 29178, 29186, 29194, 29199, 29202,
- 29209, 29219, 29231, 29236, 29240, 29248, 29255, 29261, 29268, 29275,
- 29278, 29282, 29286, 1463, 29296, 29298, 29303, 29309, 29315, 29320,
- 29325, 29330, 29335, 29340, 29345, 29350, 29355, 29360, 29365, 29370,
- 29375, 29380, 29385, 29391, 29397, 29403, 29409, 29414, 29419, 29424,
- 29430, 29435, 29440, 29445, 29451, 29456, 29462, 29467, 29472, 29477,
- 29482, 29488, 29493, 29499, 29504, 29509, 29514, 29519, 29525, 29530,
- 29536, 29541, 29546, 29551, 29556, 29561, 29566, 29571, 29576, 29581,
- 29587, 29593, 29599, 29604, 29609, 29614, 29619, 29625, 29631, 29637,
- 29643, 29649, 29655, 29660, 29666, 29671, 29676, 29681, 29686, 29692,
- 2443, 29697, 2450, 2457, 2754, 29702, 2463, 2473, 29708, 29712, 29717,
- 29722, 29728, 29733, 29738, 29742, 29747, 29753, 29758, 29763, 29768,
- 29774, 29779, 29783, 29787, 29792, 29797, 29802, 29807, 29812, 29818,
- 29824, 29829, 29833, 29838, 29844, 29848, 29853, 29858, 29863, 29868,
- 29872, 29875, 29880, 29885, 29890, 29895, 29900, 29906, 29912, 29917,
- 29922, 29926, 29931, 29936, 29941, 29946, 29951, 29955, 29960, 29965,
- 29970, 29974, 29978, 29982, 29987, 29995, 30000, 30006, 30012, 30018,
- 30023, 30027, 30030, 30035, 30040, 30044, 30049, 30053, 30058, 30062,
- 30065, 30070, 17289, 30075, 30080, 30085, 30093, 21267, 28673, 9019,
- 30098, 30103, 30107, 30112, 30116, 30120, 30125, 30129, 30132, 30135,
- 30139, 30144, 30148, 30156, 30160, 30163, 30168, 30172, 30176, 30181,
- 30186, 30190, 30196, 30201, 30206, 30213, 30220, 30224, 30227, 30233,
- 30242, 30249, 30257, 30264, 30268, 30273, 30277, 30281, 30287, 30293,
- 30297, 30303, 30308, 30313, 30320, 30326, 30332, 30338, 30344, 30351,
- 30357, 30363, 30369, 30375, 30381, 30387, 30393, 30400, 30406, 30413,
- 30419, 30425, 30431, 30437, 30443, 30449, 30455, 30461, 30467, 11411,
- 30473, 30478, 30483, 30486, 30494, 30499, 30508, 30514, 30519, 30524,
- 30529, 30533, 30538, 30543, 30548, 30553, 30558, 30565, 30572, 30578,
- 30584, 30589, 16290, 30596, 30602, 30609, 30615, 30621, 30626, 30634,
- 30639, 16069, 30643, 30648, 30653, 30659, 30664, 30669, 30673, 30678,
- 30683, 30689, 30694, 30699, 30703, 30708, 30713, 30717, 30722, 30727,
- 30732, 30736, 30741, 30746, 30751, 30755, 30759, 15280, 30763, 30772,
- 30778, 30784, 30793, 30801, 30810, 30818, 30823, 30827, 30834, 30840,
- 30844, 30847, 30852, 30861, 30869, 30874, 1495, 30880, 30883, 30887,
- 22411, 22417, 30893, 30897, 30908, 30919, 30930, 30942, 30949, 30956,
- 30961, 30965, 5909, 755, 21266, 30973, 30978, 30982, 30987, 30991, 30997,
- 31002, 31008, 31013, 31019, 31024, 31030, 31035, 31041, 31047, 31053,
- 31058, 31014, 31020, 31062, 31067, 31073, 31078, 31084, 31089, 31095,
- 31100, 31025, 10414, 31104, 31036, 31042, 31048, 2831, 3423, 31110,
- 31113, 31119, 31125, 31131, 31138, 31144, 31150, 31156, 31162, 31168,
- 31174, 31180, 31186, 31192, 31198, 31204, 31210, 31217, 31223, 31229,
- 31235, 31241, 31247, 31250, 31255, 31258, 31265, 31273, 31278, 31283,
- 31289, 31294, 31299, 31303, 31308, 31314, 31319, 31325, 31330, 31336,
- 31341, 31347, 31353, 31357, 31362, 31367, 31372, 31377, 31381, 31386,
- 31391, 31396, 31402, 31408, 31414, 31420, 31425, 31429, 31432, 31438,
- 31444, 31453, 31461, 31468, 31473, 31477, 31481, 31486, 15133, 31491,
- 31499, 31505, 3683, 1377, 31510, 31514, 8005, 31520, 31526, 31533, 8014,
- 31537, 31543, 31550, 31556, 31565, 31573, 31585, 31589, 31596, 31602,
- 31606, 31609, 31618, 31626, 31015, 31631, 31641, 31651, 31661, 31667,
- 31672, 31682, 31687, 31700, 31714, 31725, 31737, 31749, 31763, 31776,
- 31788, 31800, 14587, 31814, 31819, 31824, 31828, 31832, 31836, 1780,
- 27159, 31840, 31845, 31063, 31850, 31853, 31858, 31863, 31868, 31874,
- 31880, 10091, 31885, 31892, 15684, 31898, 31903, 31908, 31912, 31917,
- 31922, 31068, 31927, 31932, 31937, 31943, 31074, 31948, 31951, 31958,
- 31966, 31972, 31978, 31984, 31995, 32000, 32007, 32014, 32021, 32029,
- 32038, 32047, 32053, 32059, 32067, 31079, 32072, 32078, 32084, 31085,
- 32089, 32094, 32102, 32110, 32116, 32123, 32129, 32136, 32143, 32149,
- 32157, 32167, 32174, 32179, 32185, 32190, 32195, 32202, 32211, 32219,
- 32224, 32230, 32237, 32245, 32251, 32256, 32262, 32271, 27936, 32278,
- 32282, 32287, 32296, 32301, 32306, 32311, 12398, 32319, 32324, 32329,
- 32334, 32338, 32343, 32348, 32355, 32360, 32365, 32370, 31090, 21203,
- 32376, 2519, 244, 32379, 32382, 32386, 32390, 32400, 32408, 32412, 32419,
- 32426, 32430, 32433, 32439, 32447, 32455, 32459, 32463, 32466, 32473,
- 32477, 32481, 32488, 32496, 31026, 32503, 32511, 10151, 660, 308, 32523,
- 32528, 32533, 32539, 32544, 32549, 3704, 32554, 32557, 32562, 32567,
- 32572, 32577, 32582, 32589, 22512, 32594, 32599, 32604, 32609, 32614,
- 32620, 32625, 32631, 31261, 32637, 32642, 32648, 32654, 32664, 32669,
- 32674, 32678, 32683, 32688, 32693, 32698, 32711, 32716, 22289, 16692,
- 3710, 32720, 32725, 32730, 32736, 32741, 32746, 32750, 32755, 32760,
- 32766, 32771, 32776, 1382, 32780, 32785, 32790, 32795, 32799, 32804,
- 32809, 32814, 32820, 32826, 32831, 32835, 32839, 32844, 32849, 32854,
- 32858, 32866, 32870, 32876, 32880, 32887, 16485, 31037, 32893, 32900,
- 32908, 32915, 32921, 32934, 32946, 32952, 32956, 2773, 32960, 32964,
- 32468, 32973, 32984, 32989, 32994, 32999, 33003, 33008, 22422, 33012,
- 33016, 33021, 31043, 21287, 33025, 33030, 33036, 33041, 33045, 33049,
- 33052, 33056, 33062, 33073, 33085, 31049, 33090, 33093, 33097, 347,
- 33102, 33107, 33112, 33117, 33122, 33127, 33133, 33138, 33143, 33149,
- 33154, 33160, 33165, 33171, 33176, 33181, 33186, 33191, 33196, 33201,
- 33206, 33211, 33217, 33222, 33227, 33232, 33237, 33242, 33247, 33252,
- 33258, 33264, 33269, 33274, 33279, 33284, 33289, 33294, 33299, 33304,
- 33309, 33314, 33319, 33324, 33329, 33334, 33339, 33344, 33349, 33354,
- 33360, 313, 26, 33365, 33369, 33373, 33381, 33385, 33389, 33392, 33395,
- 33397, 33402, 33406, 33411, 33415, 33420, 33424, 33429, 33433, 33436,
- 33438, 33442, 33447, 33451, 33462, 33465, 33467, 33471, 33483, 33492,
- 33496, 33500, 33506, 33511, 33520, 33526, 33531, 33536, 33540, 33545,
- 33552, 33557, 33563, 33568, 33572, 33579, 25701, 25711, 33583, 33588,
- 33593, 33598, 33605, 33609, 33616, 8113, 33622, 33631, 33639, 33654,
- 33668, 33676, 33687, 33696, 33701, 7227, 33711, 33716, 33721, 33725,
- 33728, 33732, 33737, 33741, 33748, 33753, 33758, 8912, 33768, 33770,
- 33773, 33777, 33783, 33787, 33792, 33797, 33803, 33808, 33814, 33819,
- 33829, 33838, 33846, 33851, 33857, 33862, 33869, 33873, 33881, 33888,
- 33901, 33909, 33913, 33923, 33928, 33932, 33940, 33948, 33952, 33961,
- 33967, 33972, 33980, 33990, 33999, 34008, 34017, 34028, 34036, 34047,
- 34056, 34063, 34069, 34074, 34085, 34090, 34094, 34097, 34101, 34109,
- 34115, 34123, 34130, 34136, 34141, 34147, 2418, 34151, 34153, 34158,
- 34163, 34168, 34171, 34173, 34177, 34180, 34187, 34191, 9884, 34195,
- 34201, 34211, 34216, 34222, 34226, 34231, 34244, 26087, 34250, 34259,
- 17462, 34266, 34275, 31647, 34283, 34288, 34292, 34300, 34307, 34312,
- 34316, 34321, 34325, 34333, 34339, 34345, 34350, 34354, 34357, 34362,
- 34375, 34391, 22979, 34408, 34420, 34437, 34449, 34463, 22996, 23015,
- 34475, 34487, 2680, 34501, 34506, 34511, 34516, 34520, 34527, 34539,
- 34545, 34548, 34559, 34570, 34575, 32064, 695, 34579, 34583, 34587,
- 34590, 34595, 34600, 34606, 34611, 34616, 34622, 34628, 34633, 34637,
- 34642, 34647, 34652, 34656, 34659, 34665, 34670, 34675, 34680, 34684,
- 34689, 34695, 34703, 26320, 34708, 34713, 34720, 34726, 34732, 34737,
- 34745, 22521, 34752, 34757, 34762, 34767, 34771, 34774, 34779, 34783,
- 34787, 34794, 34800, 34806, 34812, 34819, 34824, 34830, 33943, 34834,
- 34838, 34843, 34856, 34861, 34867, 34875, 34882, 34890, 34900, 34906,
- 34912, 34918, 34922, 34931, 34939, 34946, 34951, 34956, 10437, 34961,
- 34969, 34976, 34982, 34992, 34997, 35003, 35011, 3608, 35018, 35025,
- 3614, 35029, 35034, 35045, 35052, 35058, 35067, 35071, 4015, 35074,
- 35081, 35087, 35093, 35101, 35111, 29042, 35118, 35126, 35131, 35137,
- 35142, 25947, 35148, 35155, 35161, 35170, 23660, 35177, 35182, 35186,
- 35194, 35202, 9600, 5895, 35209, 35213, 35215, 35219, 35224, 35226,
- 35232, 35237, 35242, 35249, 32585, 35255, 35260, 35264, 35269, 35273,
- 35282, 35286, 35292, 35299, 35305, 35312, 35317, 35326, 35331, 35335,
- 35340, 35347, 35355, 35363, 35368, 21343, 35372, 35375, 35379, 35383,
- 35387, 35390, 35392, 35400, 35404, 35411, 35415, 35419, 35427, 35434,
- 35444, 35448, 35452, 35460, 35468, 35474, 35479, 35488, 13350, 35494,
- 35503, 35508, 35515, 35523, 35531, 35539, 35546, 35553, 35560, 35567,
- 35574, 35579, 35585, 35602, 35610, 35620, 35628, 35635, 407, 35639,
- 35645, 35649, 35654, 33692, 35660, 35663, 35667, 35675, 3619, 35683,
- 35689, 35695, 35704, 35714, 35721, 35727, 3625, 3631, 35736, 35743,
- 35751, 35756, 35760, 35767, 35775, 35782, 35788, 35797, 35807, 35813,
- 35821, 35830, 35837, 35845, 35852, 22019, 35856, 35863, 35869, 35879,
- 35888, 35899, 35903, 35913, 35919, 35926, 35934, 35943, 35952, 35962,
- 35973, 35980, 35985, 35992, 3029, 36000, 36006, 36011, 36017, 36023,
- 36028, 36041, 36054, 36067, 36074, 36080, 36088, 36096, 36101, 36105,
- 1469, 36109, 36114, 36119, 36124, 36129, 36135, 36140, 36145, 36150,
- 36155, 36160, 36165, 36170, 36176, 36182, 36187, 36192, 36198, 36203,
- 36208, 36213, 36219, 36224, 36229, 36234, 36239, 36245, 36250, 36255,
- 36261, 36266, 36271, 36276, 36281, 36286, 36292, 36297, 36303, 36308,
- 36314, 36319, 36324, 36329, 36335, 36341, 36347, 36353, 36359, 36365,
- 36371, 36377, 36382, 36387, 36393, 36398, 36403, 36408, 36413, 36418,
- 36423, 36428, 36434, 36439, 36444, 36450, 36456, 101, 36461, 36463,
- 36467, 36471, 36475, 36480, 36484, 9521, 36488, 36494, 1741, 6280, 36500,
- 36503, 36508, 36512, 36517, 36521, 36525, 36530, 10238, 36534, 36538,
- 36542, 36546, 15372, 36551, 36555, 36560, 36565, 36570, 36574, 36581,
- 26111, 36587, 36590, 36594, 36599, 36605, 36609, 36617, 36623, 36628,
- 36632, 36638, 36642, 36646, 3462, 3467, 29234, 36649, 36653, 36657,
- 36661, 36669, 36676, 36680, 36687, 36692, 317, 36697, 36701, 36707,
- 36719, 36725, 36731, 36735, 36741, 36750, 36754, 36758, 36763, 36769,
- 36774, 36778, 36783, 36787, 36791, 36798, 36804, 36809, 36824, 36839,
- 36854, 36870, 36888, 10188, 36902, 36909, 36913, 36916, 36925, 36930,
- 36934, 36942, 33894, 36950, 36954, 36964, 36975, 29204, 36988, 36992,
- 37001, 37009, 9778, 14900, 37013, 22434, 37016, 30152, 37021, 9777,
- 37026, 37032, 37037, 37043, 37048, 37054, 37059, 37065, 37070, 37076,
- 37082, 37088, 37093, 37049, 37055, 37060, 37066, 37071, 37077, 37083,
- 8126, 3874, 37097, 37105, 37109, 37112, 37116, 37121, 37126, 37132,
- 37138, 37143, 37147, 25959, 37151, 37155, 37161, 37165, 9042, 37174,
- 37181, 37185, 11868, 37192, 37198, 37203, 37210, 37217, 37224, 28550,
- 8049, 37231, 37238, 37245, 37251, 37256, 37263, 37274, 37280, 37285,
- 37290, 37295, 37302, 37050, 37306, 37316, 37327, 37333, 37338, 37343,
- 37348, 37353, 37358, 37362, 37366, 37372, 37380, 2319, 865, 10254, 10266,
- 10271, 10277, 37389, 10282, 10287, 10293, 37394, 37404, 37408, 10298,
- 37413, 16890, 37416, 37421, 37425, 37430, 37435, 37442, 37449, 37453,
- 37456, 37464, 10201, 37471, 37474, 37480, 37490, 5929, 37499, 37503,
- 37511, 37515, 37525, 37531, 37542, 37548, 37554, 37559, 37565, 37571,
- 37577, 37582, 37585, 37592, 37598, 37603, 37610, 37617, 37621, 37631,
- 37644, 37653, 37662, 37673, 37686, 37697, 37706, 37717, 37722, 37731,
- 37736, 10303, 37742, 37749, 37757, 37762, 37766, 37773, 37780, 3829, 16,
- 37784, 37789, 16744, 37793, 37796, 37799, 28056, 37803, 28559, 37811,
- 37815, 37819, 37822, 37828, 37072, 37834, 37842, 37848, 37855, 28039,
- 37859, 28233, 37863, 37872, 37878, 37884, 37889, 37893, 37899, 37903,
- 37911, 37919, 26177, 37925, 37932, 37938, 37943, 37948, 37952, 37958,
- 37963, 37969, 4056, 791, 37976, 37980, 37983, 15262, 37995, 35826, 38006,
- 38009, 38016, 38020, 38026, 38030, 38036, 38041, 38047, 38052, 38057,
- 38061, 38065, 38070, 38075, 38085, 38091, 38104, 38110, 38116, 38123,
- 38128, 38134, 38139, 16630, 1472, 1019, 31193, 31199, 38144, 31205,
- 31218, 31224, 31230, 38150, 31236, 31242, 38156, 38162, 22, 38170, 38177,
- 38181, 38185, 38193, 31953, 38197, 38201, 38208, 38213, 38217, 38222,
- 38228, 38233, 38239, 38244, 38248, 38252, 38256, 38261, 38265, 38270,
- 38274, 38281, 38286, 38290, 38295, 38299, 38304, 38308, 38313, 38319,
- 15482, 15487, 38324, 38328, 38331, 38335, 21170, 38340, 38344, 38350,
- 38357, 38362, 38372, 38377, 38385, 38389, 38392, 31968, 38396, 4109,
- 38401, 38406, 38410, 38415, 38419, 38424, 13368, 38435, 38439, 38442,
- 38447, 38451, 38455, 38458, 38462, 8145, 13384, 38465, 38468, 38474,
- 38479, 38485, 38490, 38496, 38501, 38507, 38512, 38518, 38524, 38530,
- 38535, 38539, 38543, 38552, 38568, 38584, 38594, 27946, 38601, 38605,
- 38610, 38615, 38619, 38623, 35947, 38629, 38634, 38638, 38645, 38650,
- 38654, 38658, 26979, 38664, 21438, 38669, 38676, 38684, 38690, 38697,
- 38705, 38711, 38715, 38721, 38729, 38733, 38742, 9502, 38750, 38754,
- 38762, 38769, 38774, 38779, 38783, 38786, 38790, 38793, 38797, 38804,
- 38809, 38815, 26398, 31256, 38819, 38826, 38832, 38838, 38843, 38846,
- 38848, 38855, 38862, 38868, 38872, 38875, 38879, 38883, 38887, 38892,
- 38896, 38900, 38903, 38907, 38921, 23045, 38940, 38953, 38966, 38979,
- 23063, 38994, 10490, 39009, 39015, 39019, 39023, 39030, 39035, 39039,
- 39046, 39052, 39057, 39063, 39073, 39085, 39096, 39101, 39108, 39112,
- 39116, 39119, 15878, 3677, 39127, 15509, 39140, 39147, 39151, 39155,
- 39160, 39165, 39171, 39175, 39179, 39182, 7742, 15520, 39187, 39191,
- 39197, 39206, 39211, 39218, 35803, 39224, 39229, 39233, 39238, 39245,
- 39249, 39252, 39256, 39261, 14552, 39268, 39275, 1066, 39279, 39284,
- 39289, 39295, 39300, 39305, 39309, 39319, 39324, 39330, 39335, 39341,
- 39346, 39352, 39362, 39367, 39372, 39376, 7229, 7241, 39381, 39384,
- 39391, 39397, 34059, 34066, 39406, 39410, 32016, 39418, 39429, 39437,
- 35995, 39444, 39449, 39454, 39465, 39472, 39483, 32040, 21444, 39491,
- 735, 39496, 39502, 28030, 39508, 39513, 39523, 39532, 39539, 39545,
- 39549, 39552, 39559, 39565, 39572, 39578, 39588, 39596, 39602, 39608,
- 39613, 39617, 39624, 39630, 39637, 38888, 535, 13805, 39643, 39648,
- 39651, 39657, 39665, 1396, 39670, 39674, 39679, 39686, 39692, 39696,
- 39700, 39705, 39714, 39721, 39731, 39737, 28074, 39754, 39763, 39771,
- 39777, 39782, 39789, 39795, 39803, 39812, 39820, 39824, 39829, 39837,
- 32049, 39843, 39862, 15811, 39876, 39892, 39906, 39912, 39917, 39922,
- 39927, 39933, 32055, 39938, 39945, 39950, 39954, 345, 2936, 39961, 39966,
- 39971, 27305, 39792, 39975, 39980, 39988, 39992, 39995, 40001, 40007,
- 40011, 28129, 40014, 40019, 40023, 40026, 40031, 40035, 40040, 40045,
- 40049, 40054, 40058, 40062, 21166, 21177, 40066, 40071, 40077, 26936,
- 40082, 40086, 21253, 16059, 40089, 40094, 40099, 40104, 40109, 40114,
- 40119, 40124, 447, 43, 31274, 31279, 31284, 31290, 31295, 31300, 40129,
- 31304, 40133, 40137, 40141, 31309, 31315, 40155, 31326, 31331, 40163,
- 40168, 31337, 40173, 40178, 40183, 40188, 40194, 40200, 40206, 31354,
- 40219, 40225, 31358, 40229, 31363, 40234, 31368, 31373, 40237, 40242,
- 40246, 30923, 40252, 13592, 40259, 40264, 31378, 40268, 40273, 40278,
- 40283, 40287, 40292, 40297, 40303, 40308, 40313, 40319, 40325, 40330,
- 40334, 40339, 40344, 40349, 40353, 40358, 40363, 40368, 40374, 40380,
- 40386, 40391, 40395, 40400, 40404, 31382, 31387, 31392, 40408, 40412,
- 40416, 31397, 31403, 31409, 31421, 40428, 25996, 40432, 40436, 40441,
- 40446, 40451, 40456, 40460, 40464, 40474, 40479, 40484, 40488, 40492,
- 40495, 40503, 31469, 40508, 1479, 40514, 40522, 40531, 40535, 40539,
- 40547, 40553, 40561, 40577, 40581, 40585, 40590, 40605, 31506, 1749,
- 12048, 40609, 1378, 40621, 40622, 40630, 40637, 40642, 40649, 40654,
- 9372, 1114, 10325, 40661, 40666, 40669, 40672, 40681, 1286, 40686, 39036,
- 40693, 40698, 22486, 2557, 40702, 10734, 40712, 40718, 2337, 2347, 40727,
- 40736, 40746, 40757, 3293, 34212, 10377, 3807, 16668, 1291, 40762, 40770,
- 40777, 40782, 40786, 40790, 23858, 10404, 40798, 40807, 40816, 40824,
- 40831, 40842, 40847, 40860, 40873, 40885, 40897, 40909, 40922, 40933,
- 40944, 40954, 40962, 40970, 40982, 40994, 41005, 41014, 41022, 41029,
- 41041, 41048, 41057, 41064, 41077, 41082, 41092, 41097, 41103, 41108,
- 37182, 41112, 41119, 41123, 41130, 41138, 2518, 41145, 41156, 41166,
- 41175, 41183, 41193, 41201, 41211, 41220, 41225, 41231, 41237, 3709,
- 41248, 41258, 41267, 41276, 41286, 41294, 41303, 41308, 41313, 41318,
- 1705, 37, 41326, 41334, 41345, 41356, 16343, 41366, 41370, 41377, 41383,
- 41388, 41392, 41403, 41413, 41422, 41433, 16717, 16722, 41438, 41447,
- 41452, 41462, 41467, 41475, 41483, 41490, 41496, 7078, 228, 41500, 41506,
- 41511, 41514, 2117, 39152, 41522, 41526, 41529, 1512, 41535, 13967, 1296,
- 41540, 41553, 41567, 2643, 41585, 41597, 41609, 2657, 2674, 41623, 41636,
- 2689, 41650, 41662, 2704, 41676, 1302, 1308, 1314, 10652, 41681, 41686,
- 41691, 41695, 41710, 41725, 41740, 41755, 41770, 41785, 41800, 41815,
- 41830, 41845, 41860, 41875, 41890, 41905, 41920, 41935, 41950, 41965,
- 41980, 41995, 42010, 42025, 42040, 42055, 42070, 42085, 42100, 42115,
- 42130, 42145, 42160, 42175, 42190, 42205, 42220, 42235, 42250, 42265,
- 42280, 42295, 42310, 42325, 42340, 42355, 42370, 42385, 42400, 42415,
- 42430, 42445, 42460, 42475, 42490, 42505, 42520, 42535, 42550, 42565,
- 42580, 42595, 42610, 42625, 42640, 42655, 42670, 42685, 42700, 42715,
- 42730, 42745, 42760, 42775, 42790, 42805, 42820, 42835, 42850, 42865,
- 42880, 42895, 42910, 42925, 42940, 42955, 42970, 42985, 43000, 43015,
- 43030, 43045, 43060, 43075, 43090, 43105, 43120, 43135, 43150, 43165,
- 43180, 43195, 43210, 43225, 43240, 43255, 43270, 43285, 43300, 43315,
- 43330, 43345, 43360, 43375, 43390, 43405, 43420, 43435, 43450, 43465,
- 43480, 43495, 43510, 43525, 43540, 43555, 43570, 43585, 43600, 43615,
- 43630, 43645, 43660, 43675, 43690, 43705, 43720, 43735, 43750, 43765,
- 43780, 43795, 43810, 43825, 43840, 43855, 43870, 43885, 43900, 43915,
- 43930, 43945, 43960, 43975, 43990, 44005, 44020, 44035, 44050, 44065,
- 44080, 44095, 44110, 44125, 44140, 44155, 44170, 44185, 44200, 44215,
- 44230, 44245, 44260, 44275, 44290, 44305, 44320, 44335, 44350, 44365,
- 44380, 44395, 44410, 44425, 44440, 44455, 44470, 44485, 44500, 44515,
- 44530, 44545, 44560, 44575, 44590, 44605, 44620, 44635, 44650, 44665,
- 44680, 44695, 44710, 44725, 44740, 44755, 44770, 44785, 44800, 44815,
- 44830, 44845, 44860, 44875, 44890, 44905, 44920, 44935, 44950, 44965,
- 44980, 44995, 45010, 45025, 45040, 45055, 45070, 45085, 45100, 45115,
- 45130, 45145, 45160, 45175, 45190, 45205, 45220, 45235, 45250, 45265,
- 45280, 45295, 45310, 45325, 45340, 45355, 45370, 45385, 45400, 45415,
- 45430, 45445, 45460, 45475, 45490, 45505, 45520, 45535, 45550, 45565,
- 45580, 45595, 45610, 45625, 45640, 45655, 45670, 45685, 45700, 45715,
- 45730, 45745, 45760, 45775, 45790, 45805, 45820, 45835, 45850, 45865,
- 45880, 45895, 45910, 45925, 45940, 45955, 45970, 45985, 46000, 46015,
- 46030, 46045, 46060, 46075, 46090, 46105, 46120, 46135, 46150, 46165,
- 46180, 46195, 46210, 46225, 46240, 46255, 46270, 46285, 46300, 46315,
- 46330, 46345, 46360, 46375, 46390, 46405, 46420, 46435, 46450, 46465,
- 46480, 46495, 46510, 46525, 46540, 46555, 46570, 46585, 46600, 46615,
- 46630, 46645, 46660, 46675, 46690, 46705, 46720, 46735, 46750, 46765,
- 46780, 46795, 46810, 46825, 46840, 46855, 46870, 46885, 46900, 46915,
- 46930, 46945, 46960, 46975, 46990, 47005, 47020, 47035, 47050, 47065,
- 47080, 47095, 47110, 47125, 47140, 47155, 47170, 47185, 47200, 47215,
- 47230, 47245, 47260, 47275, 47290, 47305, 47320, 47335, 47350, 47365,
- 47380, 47395, 47410, 47425, 47440, 47455, 47470, 47485, 47500, 47515,
- 47530, 47545, 47560, 47575, 47590, 47605, 47620, 47635, 47650, 47665,
- 47680, 47695, 47710, 47725, 47740, 47755, 47770, 47785, 47800, 47815,
- 47830, 47845, 47860, 47875, 47890, 47905, 47920, 47935, 47950, 47965,
- 47980, 47995, 48010, 48025, 48040, 48055, 48070, 48085, 48100, 48115,
- 48130, 48145, 48160, 48175, 48190, 48205, 48220, 48235, 48250, 48265,
- 48280, 48295, 48310, 48325, 48340, 48355, 48370, 48385, 48400, 48415,
- 48430, 48445, 48460, 48475, 48490, 48505, 48520, 48535, 48550, 48565,
- 48580, 48595, 48610, 48625, 48640, 48655, 48670, 48685, 48700, 48715,
- 48730, 48745, 48760, 48775, 48790, 48805, 48820, 48835, 48850, 48865,
- 48880, 48895, 48910, 48925, 48940, 48955, 48970, 48985, 49000, 49015,
- 49030, 49045, 49060, 49075, 49090, 49105, 49120, 49135, 49150, 49165,
- 49180, 49195, 49210, 49225, 49240, 49255, 49270, 49285, 49300, 49315,
- 49330, 49345, 49360, 49375, 49390, 49405, 49420, 49435, 49450, 49465,
- 49480, 49495, 49511, 49527, 49543, 49559, 49575, 49591, 49607, 49623,
- 49639, 49655, 49671, 49687, 49703, 49719, 49735, 49751, 49767, 49783,
- 49799, 49815, 49831, 49847, 49863, 49879, 49895, 49911, 49927, 49943,
- 49959, 49975, 49991, 50007, 50023, 50039, 50055, 50071, 50087, 50103,
- 50119, 50135, 50151, 50167, 50183, 50199, 50215, 50231, 50247, 50263,
- 50279, 50295, 50311, 50327, 50343, 50359, 50375, 50391, 50407, 50423,
- 50439, 50455, 50471, 50487, 50503, 50519, 50535, 50551, 50567, 50583,
- 50599, 50615, 50631, 50647, 50663, 50679, 50695, 50711, 50727, 50743,
- 50759, 50775, 50791, 50807, 50823, 50839, 50855, 50871, 50887, 50903,
- 50919, 50935, 50951, 50967, 50983, 50999, 51015, 51031, 51047, 51063,
- 51079, 51095, 51111, 51127, 51143, 51159, 51175, 51191, 51207, 51223,
- 51239, 51255, 51271, 51287, 51303, 51319, 51335, 51351, 51367, 51383,
- 51399, 51415, 51431, 51447, 51463, 51479, 51495, 51511, 51527, 51543,
- 51559, 51575, 51591, 51607, 51623, 51639, 51655, 51671, 51687, 51703,
- 51719, 51735, 51751, 51767, 51783, 51799, 51815, 51831, 51847, 51863,
- 51879, 51895, 51911, 51927, 51943, 51959, 51975, 51991, 52007, 52023,
- 52039, 52055, 52071, 52087, 52103, 52119, 52135, 52151, 52167, 52183,
- 52199, 52215, 52231, 52247, 52263, 52279, 52295, 52311, 52327, 52343,
- 52359, 52375, 52391, 52407, 52423, 52439, 52455, 52471, 52487, 52503,
- 52519, 52535, 52551, 52567, 52583, 52599, 52615, 52631, 52647, 52663,
- 52679, 52695, 52711, 52727, 52743, 52759, 52775, 52791, 52807, 52823,
- 52839, 52855, 52871, 52887, 52903, 52919, 52935, 52951, 52967, 52983,
- 52999, 53015, 53031, 53047, 53063, 53079, 53095, 53111, 53127, 53143,
- 53159, 53175, 53191, 53207, 53223, 53239, 53255, 53271, 53287, 53303,
- 53319, 53335, 53351, 53367, 53383, 53399, 53415, 53431, 53447, 53463,
- 53479, 53495, 53511, 53527, 53543, 53559, 53575, 53591, 53607, 53623,
- 53639, 53655, 53671, 53687, 53703, 53719, 53735, 53751, 53767, 53783,
- 53799, 53815, 53831, 53847, 53863, 53879, 53895, 53911, 53927, 53943,
- 53959, 53975, 53991, 54007, 54023, 54039, 54055, 54071, 54087, 54103,
- 54119, 54135, 54151, 54167, 54183, 54199, 54215, 54231, 54247, 54263,
- 54279, 54295, 54311, 54327, 54343, 54359, 54375, 54391, 54407, 54423,
- 54439, 54455, 54471, 54487, 54503, 54519, 54535, 54551, 54567, 54583,
- 54599, 54615, 54631, 54647, 54663, 54679, 54695, 54711, 54727, 54743,
- 54759, 54775, 54791, 54807, 54823, 54839, 54855, 54871, 54887, 54903,
- 54919, 54935, 54951, 54967, 54983, 54999, 55015, 55031, 55047, 55063,
- 55079, 55095, 55111, 55127, 55143, 55159, 55175, 55191, 55207, 55223,
- 55239, 55255, 55271, 55287, 55303, 55319, 55335, 55351, 55367, 55383,
- 55399, 55415, 55431, 55447, 55463, 55479, 55495, 55511, 55527, 55543,
- 55559, 55575, 55591, 55607, 55623, 55639, 55655, 55671, 55687, 55703,
- 55719, 55735, 55751, 55767, 55783, 55799, 55815, 55831, 55847, 55863,
- 55879, 55895, 55911, 55927, 55943, 55959, 55975, 55991, 56007, 56023,
- 56039, 56055, 56071, 56087, 56103, 56119, 56135, 56151, 56167, 56183,
- 56199, 56215, 56231, 56247, 56263, 56279, 56295, 56311, 56327, 56343,
- 56359, 56375, 56391, 56407, 56423, 56439, 56455, 56471, 56487, 56503,
- 56519, 56535, 56551, 56567, 56583, 56599, 56615, 56631, 56647, 56663,
- 56679, 56695, 56711, 56727, 56743, 56759, 56775, 56791, 56807, 56823,
- 56839, 56855, 56871, 56887, 56903, 56919, 56935, 56951, 56967, 56983,
- 56999, 57015, 57031, 57047, 57063, 57079, 57095, 57111, 57127, 57143,
- 57159, 57175, 57191, 57207, 57223, 57239, 57255, 57271, 57287, 57303,
- 57319, 57335, 57351, 57367, 57383, 57399, 57415, 57431, 57447, 57463,
- 57479, 57495, 57511, 57527, 57543, 57559, 57575, 57591, 57607, 57623,
- 57639, 57655, 57671, 57687, 57703, 57719, 57735, 57751, 57767, 57783,
- 57799, 57815, 57831, 57847, 57863, 57879, 57895, 57911, 57927, 57943,
- 57959, 57975, 57991, 58007, 58023, 58039, 58055, 58071, 58087, 58103,
- 58119, 58135, 58151, 58167, 58182, 16749, 58191, 58197, 58203, 58213,
- 58221, 14881, 15432, 9953, 58234, 1520, 58242, 3761, 27415, 7183, 58248,
- 58253, 58258, 58263, 58268, 58274, 58279, 58285, 58290, 58296, 58301,
- 58306, 58311, 58316, 58322, 58327, 58332, 58337, 58342, 58347, 58352,
- 58357, 58363, 58368, 58374, 58381, 2561, 58386, 58392, 8526, 58396,
- 58401, 58408, 58416, 40, 58420, 58426, 58431, 58436, 58440, 58445, 58449,
- 58453, 10677, 58457, 58467, 58480, 58491, 58504, 58511, 58517, 58522,
- 58528, 58534, 58540, 58545, 58550, 58555, 58560, 58564, 58569, 58574,
- 58579, 58585, 58591, 58597, 58602, 58606, 58611, 58616, 58620, 58625,
- 58630, 58635, 58639, 10693, 10704, 10709, 1563, 58643, 1568, 58649,
- 16226, 58652, 58658, 1599, 58664, 1605, 1611, 10739, 58669, 58677, 58684,
- 58688, 58694, 58699, 30952, 58704, 58711, 58716, 58720, 58724, 1616,
- 16318, 58733, 58737, 16329, 1120, 58741, 58748, 58753, 58757, 16354,
- 1620, 37321, 58760, 58765, 58775, 58784, 58789, 58793, 58799, 1625,
- 39230, 58804, 58813, 58819, 58824, 10897, 10903, 58830, 58842, 58859,
- 58876, 58893, 58910, 58927, 58944, 58961, 58978, 58995, 59012, 59029,
- 59046, 59063, 59080, 59097, 59114, 59131, 59148, 59165, 59182, 59199,
- 59216, 59233, 59250, 59267, 59284, 59301, 59318, 59335, 59352, 59369,
- 59386, 59403, 59420, 59437, 59454, 59471, 59488, 59505, 59522, 59539,
- 59556, 59573, 59590, 59607, 59624, 59641, 59658, 59675, 59686, 59691,
- 1630, 59695, 59701, 59706, 59711, 9319, 1635, 59717, 59726, 27710, 59731,
- 59742, 59752, 59757, 59764, 59770, 59775, 59780, 16606, 59784, 10914,
- 1640, 10919, 59790, 59795, 59801, 59806, 59811, 59816, 59821, 59826,
- 59831, 59836, 59842, 59848, 59854, 59859, 59863, 59868, 59873, 59877,
- 59882, 59887, 59892, 59896, 59901, 59907, 59912, 59917, 59921, 59926,
- 59931, 59937, 59942, 59947, 59953, 59959, 59964, 59968, 59973, 59978,
- 59983, 59987, 59992, 59997, 60002, 60008, 60014, 60019, 60023, 60027,
- 60032, 60037, 60042, 29108, 60046, 60051, 60056, 60062, 60067, 60072,
- 60076, 60081, 60086, 60092, 60097, 60102, 60108, 60114, 60119, 60123,
- 60128, 60133, 60137, 60142, 60147, 60152, 60158, 60164, 60169, 60173,
- 60178, 60183, 60187, 60192, 60197, 60202, 60206, 60209, 31614, 60214,
- 60222, 16672, 3663, 11010, 60228, 60238, 60253, 11015, 60264, 60269,
- 60280, 60292, 60304, 60316, 2695, 60328, 60333, 60345, 60349, 60355,
- 60361, 60366, 1652, 1067, 60375, 60380, 39280, 60384, 60388, 60393,
- 60397, 16757, 60402, 60405, 60413, 60421, 1656, 11040, 11046, 1661,
- 60429, 60436, 60441, 60450, 60460, 60467, 60472, 60477, 1666, 60484,
- 60489, 16872, 60493, 60498, 60505, 60511, 60515, 60526, 60536, 16894,
- 9227, 9234, 1671, 60543, 60549, 60557, 60564, 60570, 60577, 60589, 60595,
- 60600, 60612, 60623, 60632, 60642, 3740, 30788, 30797, 16934, 1676, 1680,
- 60650, 60661, 60666, 1683, 60674, 60679, 16985, 60691, 60697, 60702,
- 60710, 1688, 60715, 60720, 60728, 60736, 60743, 60752, 60760, 60769,
- 1693, 60773, 1698, 60778, 60785, 17059, 60793, 60799, 60804, 60812,
- 60819, 60827, 22557, 60832, 11175, 60841, 60847, 60854, 60861, 60867,
- 60877, 60883, 60888, 60899, 60904, 60912, 11184, 11189, 60920, 60926,
- 60934, 3805, 17101, 39368, 60939, 60945, 60950, 60958, 60965, 12029,
- 60970, 60976, 1709, 60981, 60984, 1127, 60990, 60995, 61000, 61006,
- 61011, 61016, 61021, 61026, 61031, 61036, 1718, 9, 61042, 61046, 61051,
- 61055, 61059, 61063, 31854, 61068, 61073, 61078, 61082, 61085, 61089,
- 61093, 61098, 61102, 61107, 61111, 34591, 34596, 34601, 61114, 61121,
- 61127, 39089, 61137, 34607, 32112, 31869, 31875, 34623, 31881, 61142,
- 61147, 32145, 61151, 61154, 61158, 61165, 61168, 61173, 61177, 61181,
- 61184, 61194, 61206, 61213, 61219, 61226, 33548, 61229, 8543, 877, 61232,
- 61236, 61241, 3690, 61245, 61248, 13625, 61255, 61262, 61275, 61283,
- 61292, 61301, 61306, 61316, 61329, 61341, 61348, 61353, 61362, 61375,
- 36035, 61393, 61398, 61405, 61411, 652, 61416, 61424, 61431, 27254, 627,
- 61437, 61443, 61453, 61459, 61464, 31899, 6003, 31913, 61468, 61478,
- 61483, 61493, 61508, 61514, 61520, 31923, 61525, 31069, 61529, 61534,
- 61539, 61543, 61548, 16937, 61555, 61560, 61564, 6044, 31949, 61568,
- 61574, 312, 61584, 61591, 61598, 61603, 61612, 58769, 61618, 61626,
- 61630, 61634, 61638, 61642, 61647, 61651, 61657, 61665, 61670, 61675,
- 61679, 61684, 61688, 61692, 61698, 61704, 61709, 61713, 32073, 61718,
- 32079, 32085, 61723, 61729, 61736, 61741, 61745, 31086, 16599, 61748,
- 61752, 61757, 61764, 61770, 61774, 61779, 38799, 61785, 61789, 61793,
- 61798, 61804, 61810, 61822, 61831, 61841, 61847, 61854, 61859, 61864,
- 61868, 61871, 61877, 61884, 61889, 61894, 61901, 61908, 61914, 61919,
- 61924, 61932, 32090, 2423, 61937, 61942, 61948, 61953, 61959, 61964,
- 61969, 61974, 61980, 32111, 61985, 61991, 61997, 62003, 32175, 62008,
- 62013, 62018, 32186, 62023, 62028, 62033, 62039, 62045, 32191, 62050,
- 62055, 62060, 32246, 32252, 62065, 62070, 32257, 62075, 27937, 32279,
- 32283, 62080, 62056, 62084, 62092, 62098, 62106, 62113, 62119, 62129,
- 62135, 62142, 10624, 32297, 62148, 62161, 62170, 62176, 62185, 62191,
- 23495, 62198, 62205, 62215, 32247, 62218, 62225, 62230, 62234, 62238,
- 62243, 6120, 62247, 62252, 62257, 34685, 34690, 62261, 34704, 62266,
- 34709, 62271, 62277, 34721, 34727, 34733, 62282, 62288, 22522, 62299,
- 62302, 62314, 62322, 32320, 62326, 62335, 62345, 62354, 32330, 62359,
- 62366, 62375, 62381, 62389, 62396, 6095, 4397, 62401, 32258, 62407,
- 62410, 62416, 62423, 62428, 62433, 23405, 62437, 62443, 62449, 62454,
- 62459, 62463, 62469, 62475, 33458, 863, 35698, 36619, 36625, 32366,
- 62480, 62484, 62488, 62491, 62504, 62510, 62514, 62517, 62522, 33761,
- 62526, 31091, 21274, 62532, 6024, 6032, 9068, 62535, 62540, 62545, 62550,
- 62555, 62560, 62565, 62570, 62575, 62580, 62586, 62591, 62596, 62602,
- 62607, 62612, 62617, 62622, 62627, 62632, 62638, 62643, 62649, 62654,
- 62659, 62664, 62669, 62674, 62679, 62684, 62689, 62694, 62699, 62705,
- 62710, 62715, 62720, 62725, 62730, 62735, 62741, 62746, 62751, 62756,
- 62761, 62766, 62771, 62776, 62781, 62786, 62792, 62797, 62802, 62807,
- 62812, 62818, 62824, 62829, 62835, 62840, 62845, 62850, 62855, 62860,
- 1513, 245, 62865, 62869, 62873, 62877, 25116, 62881, 62885, 62890, 62894,
- 62899, 62903, 62908, 62913, 62918, 62922, 62926, 62931, 62935, 13362,
- 62940, 62944, 62951, 62961, 15193, 62970, 62979, 62983, 62988, 62993,
- 62997, 24907, 3019, 63001, 17350, 63007, 63016, 63024, 63030, 63042,
- 63054, 63058, 63063, 63067, 63073, 63079, 63084, 63094, 63104, 63110,
- 63115, 63119, 63124, 63130, 63139, 63148, 63156, 15547, 63160, 63169,
- 63177, 63189, 63200, 63211, 63220, 63224, 63233, 63243, 63251, 63257,
- 63262, 63268, 63273, 98, 30900, 63284, 26249, 26259, 63290, 63297, 63303,
- 63307, 63317, 63328, 63336, 63345, 63350, 63355, 63359, 17304, 63367,
- 63371, 63377, 63387, 63394, 63400, 34784, 63406, 63408, 63411, 63415,
- 63425, 63431, 63438, 13308, 63445, 63451, 63460, 63469, 63475, 63481,
- 63487, 63492, 63499, 63506, 63512, 63525, 63534, 63543, 63548, 63552,
- 63558, 63565, 63572, 63579, 63586, 63593, 63598, 63602, 63606, 63609,
- 63619, 63623, 63635, 63644, 63648, 63653, 63657, 63663, 63668, 63675,
- 63684, 63692, 63700, 63705, 63709, 63714, 63719, 63729, 63737, 63742,
- 63746, 63750, 63756, 63768, 63776, 63786, 63793, 63799, 63804, 63808,
- 63812, 63816, 63825, 63834, 63843, 63849, 63855, 63861, 63866, 63873,
- 63879, 63887, 63894, 12456, 63900, 63906, 63910, 14231, 63914, 63919,
- 63929, 63938, 63944, 63950, 63958, 63965, 63969, 63973, 63979, 63987,
- 63994, 64000, 64011, 64015, 64019, 64023, 64026, 64032, 64037, 64041,
- 64045, 64054, 64062, 64069, 64075, 64082, 24029, 38841, 64087, 64095,
- 64099, 64103, 64106, 64114, 64121, 64127, 64136, 64144, 64150, 64155,
- 64159, 64164, 64168, 64172, 64177, 64186, 64190, 64197, 64204, 64210,
- 64218, 64224, 64235, 64243, 64249, 22652, 64258, 64265, 64272, 64279,
- 64286, 64293, 41870, 13146, 64300, 64307, 64312, 34820, 6217, 64318,
- 64323, 64328, 64334, 64340, 64346, 64351, 64356, 64361, 64366, 64372,
- 64377, 64383, 64388, 64394, 64399, 64404, 64409, 64414, 64419, 64424,
- 64429, 64435, 64440, 64446, 64451, 64456, 64461, 64466, 64471, 64476,
- 64482, 64487, 64492, 64497, 64502, 64507, 64512, 64517, 64522, 64527,
- 64532, 64538, 64543, 64548, 64553, 64558, 64563, 64568, 64573, 64578,
- 64584, 64589, 64594, 64599, 64604, 64609, 64614, 64619, 64624, 64629,
- 64634, 64639, 64644, 64650, 1834, 224, 37417, 64655, 64658, 64663, 64667,
- 64670, 64675, 63696, 64686, 64696, 64703, 64719, 64728, 64738, 64748,
- 64756, 64770, 64778, 64782, 64785, 64792, 64798, 64809, 64821, 64832,
- 64841, 64848, 1297, 23294, 64858, 2590, 64862, 64871, 1133, 17277, 38054,
- 64879, 64887, 64901, 64914, 64918, 64923, 64928, 64933, 64939, 64945,
- 64950, 8535, 64955, 64959, 64967, 11041, 64972, 64978, 64987, 1721,
- 11053, 736, 64991, 65000, 65010, 27013, 65019, 65025, 16849, 65031,
- 65035, 3964, 11384, 65041, 65048, 60656, 65052, 65056, 3988, 189, 14146,
- 65062, 65074, 65078, 65084, 27730, 65088, 11372, 2730, 4, 65093, 65103,
- 65109, 65120, 65127, 65133, 65139, 65147, 65154, 65160, 65170, 65180,
- 65190, 23482, 1309, 65199, 65203, 65207, 65213, 65217, 2753, 2759, 8532,
- 2264, 65221, 65225, 65234, 65242, 65253, 65261, 65269, 65275, 65280,
- 65291, 65302, 65310, 65316, 9687, 65321, 65329, 65333, 65337, 65341,
- 65353, 28115, 65360, 65370, 65376, 65382, 9789, 65392, 65403, 65413,
- 65422, 65426, 65433, 1135, 1170, 65443, 65448, 65456, 65464, 65475,
- 65482, 65496, 14075, 393, 65506, 65510, 65518, 65527, 65535, 65541,
- 65555, 65562, 65568, 65577, 65584, 65594, 65602, 3812, 156, 65610, 65621,
- 65625, 65637, 27928, 161, 65643, 65648, 65652, 65659, 65665, 65673,
- 65680, 8818, 65687, 65696, 65704, 3878, 65717, 8199, 65721, 2798, 450,
- 65726, 65739, 65744, 1833, 668, 65748, 3895, 65756, 65762, 65766, 931,
- 65776, 65785, 65790, 14915, 14922, 45232, 65794, 3822, 13034, 65802,
- 65809, 23538, 65813, 65820, 65826, 65831, 65836, 14935, 372, 65841,
- 65853, 65859, 65867, 2810, 1753, 65875, 65877, 65882, 65887, 65892,
- 65898, 65903, 65908, 65913, 65918, 65923, 65928, 65934, 65939, 65944,
- 65949, 65954, 65959, 65964, 65969, 65974, 65980, 65985, 65990, 65995,
- 66001, 66006, 66012, 66017, 66022, 66027, 66032, 66037, 66042, 66047,
- 66053, 66058, 66064, 66069, 66074, 66079, 66084, 66089, 66094, 66099,
- 66104, 66110, 66115, 66120, 66125, 66129, 66133, 66138, 66142, 66147,
- 66152, 66158, 66163, 66167, 66172, 66176, 66179, 66181, 66185, 66188,
- 66193, 66197, 66201, 66205, 66209, 66218, 66222, 32524, 66225, 32529,
- 66232, 66237, 32534, 66246, 66255, 32540, 66260, 32545, 66269, 66274,
- 11571, 66278, 66283, 66288, 32550, 66292, 40196, 66296, 66299, 66303,
- 8211, 66309, 66314, 66318, 3705, 32555, 66321, 66325, 66328, 66333,
- 66337, 66343, 66351, 66364, 66373, 66379, 66384, 66390, 66394, 66400,
- 66408, 66413, 66417, 66424, 66430, 66438, 66447, 66455, 32558, 66462,
- 66472, 66481, 66494, 66499, 66504, 66513, 66519, 66526, 66537, 66549,
- 66556, 66565, 66574, 66583, 66590, 66596, 66603, 66611, 66618, 66626,
- 66635, 66643, 66650, 66658, 66667, 66675, 66684, 66694, 66703, 66711,
- 66718, 66726, 66735, 66743, 66752, 66762, 66771, 66779, 66788, 66798,
- 66807, 66817, 66828, 66838, 66847, 66855, 66862, 66870, 66879, 66887,
- 66896, 66906, 66915, 66923, 66932, 66942, 66951, 66961, 66972, 66982,
- 66991, 66999, 67008, 67018, 67027, 67037, 67048, 67058, 67067, 67077,
- 67088, 67098, 67109, 67121, 67132, 67142, 67151, 67159, 67166, 67174,
- 67183, 67191, 67200, 67210, 67219, 67227, 67236, 67246, 67255, 67265,
- 67276, 67286, 67295, 67303, 67312, 67322, 67331, 67341, 67352, 67362,
- 67371, 67381, 67392, 67402, 67413, 67425, 67436, 67446, 67455, 67463,
- 67472, 67482, 67491, 67501, 67512, 67522, 67531, 67541, 67552, 67562,
- 67573, 67585, 67596, 67606, 67615, 67625, 67636, 67646, 67657, 67669,
- 67680, 67690, 67701, 67713, 67724, 67736, 67749, 67761, 67772, 67782,
- 67791, 67799, 67806, 67814, 67823, 67831, 67840, 67850, 67859, 67867,
- 67876, 67886, 67895, 67905, 67916, 67926, 67935, 67943, 67952, 67962,
- 67971, 67981, 67992, 68002, 68011, 68021, 68032, 68042, 68053, 68065,
- 68076, 68086, 68095, 68103, 68112, 68122, 68131, 68141, 68152, 68162,
- 68171, 68181, 68192, 68202, 68213, 68225, 68236, 68246, 68255, 68265,
- 68276, 68286, 68297, 68309, 68320, 68330, 68341, 68353, 68364, 68376,
- 68389, 68401, 68412, 68422, 68431, 68439, 68448, 68458, 68467, 68477,
- 68488, 68498, 68507, 68517, 68528, 68538, 68549, 68561, 68572, 68582,
- 68591, 68601, 68612, 68622, 68633, 68645, 68656, 68666, 68677, 68689,
- 68700, 68712, 68725, 68737, 68748, 68758, 68767, 68777, 68788, 68798,
- 68809, 68821, 68832, 68842, 68853, 68865, 68876, 68888, 68901, 68913,
- 68924, 68934, 68945, 68957, 68968, 68980, 68993, 69005, 69016, 69028,
- 69041, 69053, 69066, 69080, 69093, 69105, 69116, 69126, 69135, 69143,
- 69150, 69155, 8058, 69162, 32568, 69167, 69172, 32573, 69178, 20916,
- 32578, 69183, 69189, 69197, 69203, 69209, 69216, 69223, 69228, 69232,
- 69235, 69239, 69248, 69254, 69266, 69277, 69281, 3081, 8033, 69286,
- 69289, 69291, 69295, 69299, 69303, 69309, 69314, 25927, 69319, 69323,
- 69326, 69331, 69335, 69342, 69348, 69352, 6170, 69356, 32595, 69361,
- 69368, 69377, 69385, 69396, 69404, 69412, 69419, 69426, 69432, 69443,
- 32600, 69448, 69459, 69471, 69479, 69490, 69499, 69510, 69515, 69523,
- 2556, 69528, 34270, 69541, 69545, 69557, 69565, 69570, 69578, 17472,
- 69589, 69595, 69602, 69610, 69616, 32610, 69621, 3914, 58217, 69628,
- 69631, 69639, 69652, 69665, 69678, 69691, 69698, 69709, 69718, 41687,
- 41692, 69723, 69727, 69735, 69742, 69751, 69759, 69765, 69774, 69782,
- 69790, 69794, 69803, 69812, 69822, 69835, 69848, 69858, 32615, 69864,
- 69871, 69877, 32621, 69882, 69885, 69889, 69897, 69906, 41425, 69914,
- 69923, 69931, 69938, 69946, 69956, 69965, 69974, 69983, 69991, 70002,
- 70012, 9359, 21554, 70021, 70026, 70031, 70035, 70039, 70044, 70050,
- 70055, 70060, 70066, 70071, 70076, 21519, 70081, 70088, 70096, 70104,
- 70109, 70116, 70123, 70128, 70132, 70136, 70144, 70152, 32638, 70158,
- 70164, 70176, 70182, 70186, 70193, 70198, 70209, 70219, 70229, 70241,
- 70247, 70257, 70267, 32665, 70276, 70285, 70291, 70303, 70314, 70321,
- 70326, 70330, 70338, 70344, 70349, 70354, 70361, 70369, 70381, 70391,
- 70400, 70409, 70416, 34132, 23834, 70422, 70427, 70431, 70435, 70440,
- 70446, 70457, 70470, 70475, 70482, 32670, 70487, 70499, 70508, 70518,
- 70529, 70542, 70549, 70558, 70567, 70575, 70580, 70586, 1058, 70591,
- 70596, 70601, 70606, 70612, 70617, 70622, 70628, 70634, 70639, 70643,
- 70648, 70653, 70658, 58729, 70663, 70668, 70673, 70678, 70684, 70690,
- 70695, 70699, 70704, 70709, 70714, 70720, 70725, 70731, 70736, 70741,
- 70746, 70751, 70755, 70761, 70766, 70775, 70780, 70785, 70790, 70795,
- 70799, 70806, 70812, 17122, 17129, 70817, 70821, 70825, 70829, 70833,
- 45487, 70837, 70767, 70839, 70849, 32679, 70852, 70861, 70867, 6143,
- 32684, 70871, 70877, 70882, 70888, 70893, 70897, 70904, 70909, 70919,
- 70928, 70932, 70938, 70944, 70950, 70954, 70962, 70969, 70977, 70985,
- 32689, 70992, 70995, 71002, 71008, 71013, 71017, 71023, 71030, 71035,
- 71039, 71048, 71056, 71062, 71067, 32694, 71074, 71081, 71087, 71092,
- 71098, 71105, 71111, 21281, 27438, 71117, 71122, 71128, 71140, 70800,
- 70807, 21457, 71150, 71155, 71162, 71168, 71175, 71181, 71192, 71197,
- 9103, 71205, 71208, 71214, 71218, 71222, 71225, 71231, 32443, 6194, 964,
- 13412, 71238, 71244, 71250, 71256, 71262, 71268, 71274, 71280, 71286,
- 71291, 71296, 71301, 71306, 71311, 71316, 71321, 71326, 71331, 71336,
- 71341, 71346, 71351, 71357, 71362, 71367, 71373, 71378, 71383, 71389,
- 71395, 71401, 71407, 71413, 71419, 71425, 71431, 71437, 71442, 71447,
- 71453, 71458, 71463, 71469, 71474, 71479, 71484, 71489, 71494, 71499,
- 71504, 71509, 71514, 71519, 71524, 71529, 71535, 71540, 71545, 71550,
- 71556, 71561, 71566, 71571, 71576, 71582, 71587, 71592, 71597, 71602,
- 71607, 71612, 71617, 71622, 71627, 71632, 71637, 71642, 71647, 71652,
- 71657, 71662, 71667, 71672, 71677, 71683, 71688, 71693, 71698, 71703,
- 71708, 71713, 71718, 1864, 142, 71723, 71727, 71731, 71736, 71744, 71748,
- 71755, 71763, 71767, 71780, 71788, 71792, 71795, 71800, 71804, 71809,
- 71813, 71821, 71825, 20924, 71830, 71834, 60930, 71838, 71841, 71849,
- 71857, 71865, 71870, 71877, 71883, 71889, 71894, 71901, 71906, 71914,
- 64906, 71921, 71926, 71931, 71935, 11638, 71939, 71944, 71949, 71953,
- 71956, 71962, 71966, 71976, 71985, 71988, 71992, 71999, 72012, 72018,
- 72026, 72037, 72048, 72059, 72070, 72079, 72085, 72094, 72102, 72112,
- 72125, 72132, 72143, 72149, 72154, 72159, 72165, 72171, 72181, 72190,
- 70489, 72198, 72204, 72212, 72218, 72226, 72229, 72233, 72237, 72240,
- 72246, 72252, 72260, 72272, 72284, 72291, 72295, 72306, 72314, 72321,
- 72333, 72341, 72349, 72356, 72362, 72372, 72381, 72386, 72396, 72405,
- 40751, 72412, 72416, 72421, 72429, 72436, 72442, 72446, 72456, 72467,
- 72475, 72482, 72494, 72506, 72515, 69531, 72522, 72533, 72547, 72555,
- 72565, 72572, 72580, 72592, 72601, 72609, 72619, 72630, 72642, 72651,
- 72661, 72668, 72677, 72692, 72700, 72710, 72719, 72727, 72740, 72755,
- 72759, 72768, 72780, 72791, 72802, 72813, 72823, 72834, 72842, 72848,
- 72858, 72866, 72872, 29007, 72877, 72883, 72888, 72895, 9701, 17492,
- 72901, 72910, 72915, 72919, 72926, 72932, 72937, 72942, 72950, 72958,
- 72962, 72965, 72968, 72970, 72977, 72983, 72994, 72999, 73003, 73010,
- 73016, 73021, 73029, 65405, 65415, 73035, 73042, 73052, 10611, 73059,
- 73064, 29203, 73073, 73078, 73085, 73095, 73103, 73111, 73120, 73126,
- 73132, 73139, 73146, 73151, 73155, 73163, 73168, 73173, 73181, 73188,
- 73193, 73199, 73202, 73206, 73215, 71775, 73224, 73228, 73234, 73245,
- 73255, 17501, 73266, 73274, 17513, 73281, 73285, 73294, 27324, 73301,
- 73305, 73310, 73327, 73339, 10569, 73351, 73356, 73361, 73366, 20997,
- 73370, 73375, 73380, 73386, 73391, 5846, 21001, 73396, 73401, 73407,
- 73414, 73419, 73424, 73430, 73436, 73442, 73447, 73453, 73457, 73471,
- 73479, 73487, 73493, 73498, 73505, 73515, 73524, 73529, 73534, 73542,
- 73547, 73553, 73558, 73567, 59786, 73572, 73575, 73593, 73612, 73625,
- 73639, 73655, 73662, 73669, 73675, 73682, 73687, 73693, 73699, 73707,
- 73713, 73718, 73723, 73739, 10582, 73753, 73760, 73768, 73774, 73778,
- 73781, 73786, 73791, 73798, 73803, 73812, 73817, 73823, 73832, 73841,
- 73846, 73850, 73858, 73867, 11667, 73876, 73884, 73889, 73895, 11678,
- 73900, 73903, 73908, 73918, 73927, 73932, 73938, 73943, 73951, 73958,
- 73969, 73979, 73984, 64834, 73989, 73995, 74000, 74007, 74016, 74024,
- 74030, 74036, 74043, 74049, 74053, 16947, 3055, 74058, 74062, 74066,
- 74072, 74081, 74087, 74094, 74098, 74119, 74141, 74157, 74174, 74193,
- 74202, 74212, 74219, 74226, 27211, 74232, 74236, 74244, 74256, 74262,
- 74270, 74274, 74282, 74289, 74293, 74299, 74305, 74310, 3563, 41887,
- 74316, 74320, 74324, 74328, 74333, 74338, 74343, 74349, 74355, 74361,
- 74368, 74374, 74381, 74387, 74393, 74398, 74404, 74409, 74413, 74418,
- 74422, 74427, 41902, 74431, 74436, 74444, 74448, 74453, 74460, 74469,
- 74475, 74479, 74486, 74490, 74493, 74500, 74509, 74514, 74518, 74526,
- 74535, 74539, 74547, 74553, 74558, 74563, 74569, 74575, 74580, 74584,
- 74590, 74595, 74599, 74603, 74606, 74611, 74619, 74629, 74634, 39387,
- 74642, 74654, 74658, 74664, 74676, 74687, 74694, 74700, 74707, 74719,
- 74726, 74732, 21075, 74736, 74742, 74749, 74755, 74761, 74766, 74771,
- 74776, 74785, 7033, 74790, 16413, 74796, 74800, 74804, 74808, 74816,
- 74825, 74829, 74836, 74845, 74858, 74864, 74423, 30067, 74869, 74871,
- 74876, 74881, 74886, 74891, 74896, 74901, 74906, 74911, 74916, 74921,
- 74926, 74931, 74936, 74941, 74947, 74952, 74957, 74962, 74967, 74972,
- 74977, 74982, 74987, 74993, 74999, 75005, 75010, 75015, 75027, 75032,
- 1870, 49, 75037, 75042, 32721, 75046, 32726, 32731, 32737, 32742, 75050,
- 32747, 22070, 75072, 75076, 75080, 75085, 75089, 32751, 75093, 75101,
- 32756, 75108, 75111, 75116, 75120, 9536, 75129, 32761, 21932, 75132,
- 75136, 1428, 75141, 32772, 75144, 75149, 25720, 25730, 35233, 75154,
- 75159, 75164, 75169, 75175, 75180, 75189, 75194, 75201, 75207, 75212,
- 75217, 75222, 75232, 75241, 75246, 75254, 75258, 75266, 32586, 37288,
- 75273, 75279, 75284, 75289, 12009, 75294, 75300, 75305, 75312, 75318,
- 75323, 75331, 75341, 75351, 75357, 75362, 75368, 17523, 75375, 36048,
- 75388, 75393, 75399, 30968, 75412, 75418, 75422, 75431, 75438, 75444,
- 75452, 75461, 75468, 75474, 75477, 75481, 25861, 75485, 75492, 75498,
- 75506, 75511, 23977, 75517, 75520, 75528, 75536, 75550, 75557, 75563,
- 75570, 75576, 32786, 75580, 75587, 75595, 75603, 75609, 32791, 75617,
- 75623, 75628, 75638, 75644, 75653, 30805, 34691, 75661, 75666, 75671,
- 75675, 75680, 75684, 75692, 14907, 39400, 75697, 75702, 32796, 62232,
- 75706, 75711, 75715, 75724, 75732, 75738, 75743, 75749, 75756, 75762,
- 75767, 75772, 75781, 75793, 75808, 33058, 75814, 16532, 32800, 75818,
- 75825, 24087, 75831, 75838, 75847, 75854, 75863, 75869, 75874, 75882,
- 75888, 32810, 75893, 75902, 74682, 75911, 75918, 75924, 75930, 75940,
- 75948, 75955, 75959, 32815, 75962, 32821, 32827, 75967, 75975, 75983,
- 75993, 76002, 76010, 76017, 76027, 32832, 76031, 76033, 76037, 76042,
- 76046, 76050, 76056, 76061, 76065, 76076, 76081, 76086, 3060, 76090,
- 76097, 76101, 76110, 76118, 76125, 76130, 76135, 62278, 76139, 76142,
- 76148, 76156, 76162, 76166, 76171, 76178, 76183, 76189, 34722, 76194,
- 76197, 76202, 76206, 76211, 76216, 76220, 76228, 76232, 25739, 25748,
- 76238, 76244, 76250, 76255, 76259, 76262, 76272, 76281, 76286, 76292,
- 76299, 76305, 76309, 76317, 76322, 34728, 76326, 76334, 76340, 76347,
- 76352, 76356, 76361, 58403, 34734, 76367, 76372, 76376, 76381, 76386,
- 76391, 76395, 76400, 76405, 76411, 76416, 76421, 76427, 76433, 76438,
- 76442, 76447, 76452, 76457, 76461, 24086, 76466, 76471, 76477, 76483,
- 76489, 76494, 76498, 76503, 76508, 76513, 76517, 76522, 76527, 76532,
- 76537, 76541, 32840, 76549, 76553, 76561, 76569, 76580, 76585, 76589,
- 22384, 76594, 76600, 76610, 76617, 76622, 76631, 76636, 76640, 76645,
- 76653, 76661, 76668, 65068, 76674, 76682, 76689, 76700, 76706, 76710,
- 76716, 32850, 76719, 76726, 76734, 76739, 39591, 76743, 76748, 76755,
- 76760, 8985, 76764, 76772, 76779, 76786, 76792, 76806, 63340, 76814,
- 76820, 76824, 76827, 76835, 76842, 76847, 76860, 76867, 76871, 76878,
- 76883, 60823, 76888, 76891, 76898, 76904, 76908, 76916, 76925, 76935,
- 76945, 76954, 76962, 76973, 76978, 76982, 76987, 76991, 35364, 76999,
- 21344, 35373, 77004, 77009, 77014, 77019, 77024, 77029, 77034, 77038,
- 77043, 77048, 77053, 77058, 77063, 77068, 77072, 77077, 77082, 77086,
- 77090, 77094, 77098, 77103, 77108, 77112, 77117, 77121, 77125, 77130,
- 77135, 77140, 77145, 77149, 77154, 77159, 77163, 77168, 77173, 77178,
- 77183, 77188, 77193, 77198, 77203, 77208, 77213, 77218, 77223, 77228,
- 77233, 77238, 77243, 77248, 77253, 77258, 77263, 77267, 77272, 77277,
- 77282, 77287, 77292, 77297, 77302, 77307, 77312, 77317, 77322, 77326,
- 77331, 77335, 77340, 77345, 77350, 77355, 77360, 77365, 77370, 77375,
- 77380, 77384, 77388, 77393, 77398, 77402, 77407, 77412, 77416, 77421,
- 77426, 77431, 77436, 77440, 77445, 77450, 77454, 77459, 77463, 77467,
- 77471, 77475, 77480, 77484, 77488, 77492, 77496, 77500, 77504, 77508,
- 77512, 77516, 77521, 77526, 77531, 77536, 77541, 77546, 77551, 77556,
- 77561, 77566, 77570, 77574, 77578, 77582, 77586, 77590, 77595, 77599,
- 77604, 77608, 77613, 77618, 77622, 77626, 77631, 77635, 77639, 77643,
- 77647, 77651, 77655, 77659, 77663, 77667, 77671, 77675, 77679, 77683,
- 77687, 77692, 77697, 77701, 77705, 77709, 77713, 77717, 77721, 77726,
- 77730, 77734, 77738, 77742, 77746, 77750, 77755, 77759, 77764, 77768,
- 77772, 77776, 77780, 77784, 77788, 77792, 77796, 77800, 77804, 77808,
- 77813, 77817, 77821, 77825, 77829, 77833, 77837, 77841, 77845, 77849,
- 77853, 77857, 77862, 77866, 77870, 77875, 77880, 77884, 77888, 77892,
- 77896, 77900, 77904, 77908, 77912, 77917, 77921, 77926, 77930, 77935,
- 77939, 77944, 77948, 77954, 77959, 77963, 77968, 77972, 77977, 77981,
- 77986, 77990, 77995, 1521, 77999, 2824, 1759, 1764, 78003, 78007, 2828,
- 78011, 1397, 78016, 1342, 78020, 2840, 78024, 78031, 78038, 78052, 2844,
- 7131, 78061, 78069, 78076, 78087, 78096, 78103, 78115, 78128, 78141,
- 78152, 78157, 78164, 78176, 78180, 2848, 11740, 78190, 78195, 78204,
- 78214, 2852, 78219, 78223, 78228, 78235, 78241, 78249, 78261, 1347,
- 13035, 78271, 78275, 78281, 78295, 78307, 78319, 78329, 78338, 78347,
- 78356, 78364, 78375, 78383, 4051, 78393, 78404, 78413, 78419, 78434,
- 78441, 78447, 35489, 78452, 2876, 13039, 78456, 78463, 8930, 78472, 2881,
- 32336, 78478, 60572, 78485, 78491, 78502, 78508, 78515, 78521, 78529,
- 78536, 78542, 78552, 78561, 78572, 78579, 78585, 78595, 78603, 78609,
- 78624, 78630, 78635, 78642, 78645, 78651, 78658, 78664, 78672, 78681,
- 78689, 78695, 78704, 41427, 78718, 78723, 78729, 14744, 78734, 78747,
- 78756, 78764, 78771, 78775, 78779, 78782, 78789, 78796, 78804, 78812,
- 78821, 78829, 14671, 78837, 78842, 78846, 78858, 78865, 78874, 748,
- 78884, 78893, 78904, 2897, 78908, 78912, 78918, 78931, 78943, 78953,
- 78962, 78974, 26352, 78985, 78993, 79002, 79013, 79024, 79034, 79044,
- 79053, 79061, 11305, 79068, 79072, 79075, 79080, 79085, 79089, 79095,
- 1352, 11811, 79102, 79113, 79122, 79130, 79139, 79147, 79163, 79174,
- 79183, 79191, 79203, 79214, 79230, 79240, 79261, 79274, 79282, 79289,
- 14855, 79302, 79307, 79313, 5908, 79319, 79322, 79329, 79339, 8176,
- 79346, 79351, 79356, 79361, 79369, 79378, 79386, 9749, 9758, 79391,
- 79402, 79407, 79413, 2913, 2918, 79419, 10872, 79425, 79432, 79439,
- 79452, 2251, 68, 79457, 79462, 79472, 79478, 79487, 79495, 79505, 79509,
- 79514, 79518, 79530, 2941, 79538, 79546, 79551, 79562, 79573, 79582,
- 79587, 79593, 79598, 79608, 79618, 79623, 79629, 79634, 79643, 21397,
- 79647, 4128, 20, 79652, 79661, 79668, 79675, 79681, 79687, 864, 79692,
- 79697, 60900, 79702, 79707, 79713, 79719, 79727, 79732, 79739, 79745,
- 79750, 38001, 41321, 79756, 2945, 32, 79766, 79779, 79784, 79792, 79797,
- 79803, 2967, 28289, 79808, 79816, 79823, 79828, 58645, 61903, 79837,
- 79841, 1704, 1813, 79846, 79851, 79858, 1817, 247, 79865, 79871, 2989,
- 79876, 79881, 79888, 1821, 79893, 79899, 79904, 79916, 6119, 79926, 1828,
- 79932, 79937, 79944, 79951, 79966, 79973, 79984, 79992, 2618, 79996,
- 80008, 80013, 80017, 80023, 28114, 2256, 80027, 80038, 80042, 80046,
- 80052, 80056, 80065, 80069, 80080, 80084, 2302, 32165, 80088, 80098,
- 3080, 9364, 80106, 80111, 80115, 80124, 80131, 80137, 3050, 17139, 80141,
- 80154, 80172, 80177, 80185, 80193, 80203, 9978, 13147, 80215, 80228,
- 80235, 80242, 80258, 80265, 80271, 1095, 80278, 80285, 80295, 80304,
- 80316, 42291, 80324, 3064, 12023, 80327, 80335, 80339, 78231, 3068,
- 80343, 21178, 12039, 3756, 80347, 3074, 80351, 80361, 80367, 80373,
- 80379, 80385, 80391, 80397, 80403, 80409, 80415, 80421, 80427, 80433,
- 80439, 80445, 80451, 80457, 80463, 80469, 80475, 80481, 80487, 80493,
- 80499, 80505, 80511, 80518, 80525, 80531, 80537, 80543, 80549, 80555,
- 80561, 1357, 16049, 12061, 80567, 80572, 80577, 80582, 80587, 80592,
- 80597, 80602, 80607, 80612, 80617, 80622, 80627, 80632, 80637, 80642,
- 80647, 80652, 80657, 80662, 80667, 80672, 80677, 80682, 80687, 80692,
- 80698, 80703, 80708, 80714, 80719, 80725, 80730, 80735, 80741, 80746,
- 80751, 80756, 80761, 80766, 80771, 80776, 80781, 80362, 80368, 80374,
- 80380, 80386, 80392, 80398, 80404, 80410, 80416, 80422, 80428, 80434,
- 80440, 80446, 80787, 80452, 80458, 80464, 80793, 80470, 80476, 80482,
- 80488, 80494, 80500, 80506, 80526, 80799, 80805, 80532, 80811, 80538,
- 80544, 80550, 80556, 80562, 3091, 3096, 80817, 80822, 80825, 80831,
- 80837, 80844, 80849, 80854, 2307,
+ 8935, 8939, 8944, 8949, 8956, 8962, 8972, 7909, 8978, 8982, 8989, 8996,
+ 768, 9000, 9004, 9009, 9014, 9019, 9023, 9029, 9037, 9043, 9047, 9053,
+ 9063, 9067, 9073, 9078, 9082, 9088, 9094, 2161, 9099, 9101, 9106, 9114,
+ 9123, 9127, 9133, 9138, 9143, 9148, 9153, 9159, 9164, 9169, 4006, 9174,
+ 9179, 9183, 9189, 9194, 9200, 9205, 9210, 9216, 9221, 9128, 9227, 9231,
+ 9238, 9244, 9249, 9253, 6183, 9258, 9267, 9272, 9277, 8218, 8225, 9282,
+ 2853, 9286, 9291, 9296, 9139, 9300, 9305, 9144, 9149, 9310, 9317, 9324,
+ 9330, 9336, 9342, 9347, 9352, 9357, 9154, 9160, 9363, 9369, 9374, 9382,
+ 9165, 9387, 990, 9390, 9398, 9404, 9410, 9419, 9427, 9432, 9438, 9446,
+ 9453, 9468, 9485, 9504, 9513, 9521, 9536, 9547, 9557, 9567, 9575, 9581,
+ 9593, 9602, 9610, 9617, 9624, 9630, 9635, 9643, 9653, 9660, 9670, 9680,
+ 9690, 9698, 9705, 9714, 9724, 9738, 9753, 9762, 9770, 9775, 9779, 9788,
+ 9794, 9799, 9809, 9819, 9829, 9834, 9838, 9847, 9852, 9862, 9873, 9886,
+ 9894, 9907, 9919, 9927, 9932, 9936, 9942, 9947, 9955, 9963, 9970, 9975,
+ 9983, 9989, 9992, 9996, 10002, 10010, 10015, 10019, 10027, 10036, 10044,
+ 10050, 10054, 10061, 10072, 10076, 10079, 10085, 9170, 10090, 10096,
+ 10103, 10109, 10114, 10121, 10128, 10135, 10142, 10149, 10156, 10163,
+ 10170, 10175, 9481, 10180, 10186, 10193, 10200, 10205, 10212, 10221,
+ 10225, 10237, 8256, 10241, 10244, 10248, 10252, 10256, 10260, 10266,
+ 10272, 10277, 10283, 10288, 10293, 10299, 10304, 10309, 8952, 10314,
+ 10318, 10322, 10326, 10331, 10336, 10344, 10350, 10354, 10358, 10365,
+ 10370, 10378, 10383, 10387, 10390, 10396, 10403, 10407, 10410, 10415,
+ 10419, 4045, 10425, 10434, 36, 10442, 10448, 10453, 8967, 10458, 10463,
+ 10467, 10470, 10485, 10504, 10516, 10529, 10542, 10555, 10569, 10582,
+ 10597, 10604, 9175, 10610, 10624, 10629, 10635, 10640, 10648, 10653,
+ 8040, 10658, 10661, 10668, 10673, 10677, 2858, 998, 10683, 10687, 10693,
+ 10699, 10704, 10710, 10715, 9184, 10721, 10727, 10732, 10737, 10745,
+ 10751, 10764, 10772, 10779, 9190, 10785, 10793, 10801, 10808, 10821,
+ 10833, 10843, 10851, 10858, 10865, 10874, 10883, 10891, 10898, 10903,
+ 10909, 9195, 10914, 10920, 9201, 10925, 10928, 10935, 10941, 10954, 8669,
+ 10965, 10971, 10980, 10988, 10995, 11001, 11007, 11012, 11016, 11021,
+ 10477, 11027, 9206, 11034, 11039, 11046, 11052, 11058, 11063, 11071,
+ 11079, 11086, 11090, 11104, 11114, 11119, 11123, 11134, 11140, 11145,
+ 11150, 9211, 9217, 11154, 11157, 11162, 11174, 11181, 11186, 11190,
+ 11195, 11199, 11206, 11212, 9222, 9129, 11219, 2863, 8, 11226, 11231,
+ 11235, 11241, 11249, 11259, 11264, 11269, 11276, 11283, 11287, 11298,
+ 11308, 11317, 11329, 11334, 11338, 11346, 11360, 11364, 11367, 11375,
+ 11382, 11390, 11394, 11405, 11409, 11416, 11421, 11425, 11431, 11436,
+ 11440, 11446, 11451, 11462, 11466, 11469, 11475, 11480, 11486, 11492,
+ 11499, 11510, 11520, 11530, 11539, 11546, 11555, 9232, 9239, 9245, 9250,
+ 11561, 11567, 9254, 11573, 11576, 11583, 11588, 11603, 11619, 11634,
+ 11642, 11648, 11653, 838, 420, 11658, 11666, 11673, 11679, 11684, 11689,
+ 9259, 11691, 11695, 11700, 11704, 11714, 11719, 11723, 11732, 11736,
+ 11739, 9268, 11746, 11749, 11757, 11764, 11772, 11776, 11783, 11792,
+ 11795, 11799, 11803, 11809, 11813, 11817, 11821, 11827, 11837, 11841,
+ 11849, 11853, 11860, 11864, 11869, 11873, 11880, 11886, 11894, 11900,
+ 11905, 11915, 11920, 11925, 11929, 11937, 3905, 11945, 11950, 9273,
+ 11954, 11958, 11961, 11969, 11976, 11980, 5991, 11984, 11989, 11993,
+ 12004, 12014, 12019, 12025, 12029, 12032, 12040, 12045, 12050, 12057,
+ 12062, 9278, 12067, 12071, 12078, 1722, 6145, 12083, 12088, 12093, 12098,
+ 12104, 12109, 12115, 12120, 12125, 12130, 12135, 12140, 12145, 12150,
+ 12155, 12160, 12165, 12170, 12175, 12180, 12185, 12190, 12195, 12201,
+ 12206, 12211, 12216, 12221, 12226, 12232, 12237, 12242, 12248, 12253,
+ 12259, 12264, 12270, 12275, 12280, 12285, 12290, 12296, 12301, 12306,
+ 12311, 737, 139, 12319, 12323, 12328, 12333, 12337, 12341, 12345, 12350,
+ 12354, 12359, 12363, 12366, 12370, 12374, 12380, 12385, 12395, 12401,
+ 12409, 12413, 12417, 12424, 12432, 12441, 12452, 12459, 12466, 12470,
+ 12479, 12488, 12496, 12505, 12514, 12523, 12532, 12542, 12552, 12562,
+ 12572, 12582, 12591, 12601, 12611, 12621, 12631, 12641, 12651, 12661,
+ 12670, 12680, 12690, 12700, 12710, 12720, 12730, 12739, 12749, 12759,
+ 12769, 12779, 12789, 12799, 12809, 12819, 12829, 12838, 12848, 12858,
+ 12868, 12878, 12888, 12898, 12908, 12918, 12928, 12938, 12947, 1256,
+ 12953, 12956, 12960, 12965, 12972, 12978, 12983, 12987, 12992, 13001,
+ 13009, 13014, 13018, 13022, 13028, 13033, 13039, 9287, 13044, 13049,
+ 13058, 9292, 13063, 13066, 13072, 13080, 9297, 13087, 13091, 13095,
+ 13099, 13109, 13115, 13121, 13126, 13135, 13143, 13150, 13157, 13162,
+ 13169, 13174, 13178, 13181, 13192, 13202, 13211, 13219, 13230, 13242,
+ 13252, 13257, 13261, 13266, 13271, 13275, 13281, 13289, 13296, 13307,
+ 13312, 13322, 13326, 13329, 13336, 13346, 13355, 13362, 13366, 13373,
+ 13379, 13384, 13389, 13393, 13402, 13407, 13413, 13417, 13422, 13426,
+ 13435, 13443, 13451, 13458, 13466, 13478, 13489, 13499, 13506, 13512,
+ 13521, 13532, 13541, 13553, 13565, 13577, 13587, 13596, 13605, 13613,
+ 13620, 13629, 13637, 13641, 13647, 13653, 13658, 7753, 13662, 13664,
+ 13668, 13673, 13679, 13688, 13692, 13700, 13707, 13716, 13725, 13734,
+ 13743, 13752, 13761, 13770, 13779, 13789, 13799, 13808, 13814, 13821,
+ 13828, 13834, 13848, 13855, 13863, 13872, 13878, 13887, 13896, 13907,
+ 13917, 13925, 13932, 13940, 13949, 13962, 13970, 13977, 13990, 13996,
+ 14002, 14012, 14021, 14030, 14035, 14039, 14045, 14051, 14058, 8966,
+ 14063, 14068, 14075, 14080, 12376, 14085, 14093, 14099, 14104, 14112,
+ 14120, 14127, 14135, 14141, 14149, 14157, 14163, 14168, 14174, 14181,
+ 14187, 14192, 14196, 14207, 14215, 14221, 14226, 14235, 14241, 14246,
+ 14255, 14269, 3853, 14273, 14278, 14283, 14289, 14294, 14299, 14303,
+ 14308, 14313, 14318, 7752, 14323, 14328, 14333, 14338, 14343, 14347,
+ 14352, 14357, 14362, 14367, 14373, 14379, 14384, 14388, 14393, 14398,
+ 14403, 9301, 14408, 14413, 14418, 14423, 14428, 14445, 14463, 14475,
+ 14488, 14505, 14521, 14538, 14548, 14567, 14578, 14589, 14600, 14611,
+ 14623, 14634, 14645, 14662, 14673, 14684, 14689, 9306, 14694, 14698,
+ 2381, 14702, 14705, 14711, 14719, 14727, 14732, 14740, 14748, 14755,
+ 14760, 14766, 14773, 14781, 14788, 14800, 14808, 14813, 11597, 14819,
+ 14828, 14837, 14845, 14852, 14858, 14866, 14873, 14879, 14886, 14892,
+ 14901, 14909, 14919, 14926, 14932, 14940, 14946, 14954, 14961, 14974,
+ 14981, 14990, 14999, 15008, 15016, 15026, 15033, 15038, 3560, 15045,
+ 15050, 1372, 15054, 14324, 15058, 15064, 15068, 15076, 15088, 15093,
+ 15100, 15106, 15111, 15118, 14329, 15122, 15126, 15130, 14334, 15134,
+ 14339, 15138, 15145, 15150, 15154, 15161, 15165, 15173, 15180, 15184,
+ 15191, 15208, 15217, 15221, 15224, 15232, 15238, 15243, 3638, 15247,
+ 15249, 15257, 15264, 15274, 15286, 15291, 15297, 15302, 15306, 15312,
+ 15317, 15323, 15326, 15333, 15341, 15348, 15354, 15360, 15365, 15372,
+ 15378, 15383, 15390, 15394, 15400, 15404, 15411, 15417, 15423, 15431,
+ 15437, 15442, 15448, 15456, 15464, 15470, 15476, 15481, 15488, 15493,
+ 15497, 15503, 15508, 15515, 15520, 15526, 15529, 15535, 15541, 15544,
+ 15548, 15560, 15566, 15571, 15578, 15584, 15590, 15601, 15611, 15620,
+ 15628, 15635, 15646, 15656, 15666, 15674, 15677, 14353, 15682, 15687,
+ 14358, 14493, 15695, 15708, 15723, 15734, 14510, 15752, 15765, 15778,
+ 15789, 10492, 15800, 15813, 15832, 15843, 15854, 15865, 2649, 15878,
+ 15882, 15890, 15905, 15920, 15931, 15938, 15944, 15952, 15956, 15962,
+ 15965, 15975, 15983, 15990, 15998, 16008, 16013, 16020, 16025, 16032,
+ 16043, 16053, 16059, 16064, 16069, 14363, 16073, 16079, 16085, 16090,
+ 16095, 16100, 16104, 14368, 14374, 16108, 14380, 16113, 16121, 16130,
+ 16137, 9150, 16141, 16143, 16148, 16153, 16159, 16164, 16169, 16174,
+ 16179, 16183, 16189, 16195, 16200, 16206, 16211, 16216, 16222, 16227,
+ 16232, 16237, 16242, 16248, 16253, 16258, 16264, 16270, 16275, 16280,
+ 16287, 16293, 16304, 16311, 16316, 16320, 16324, 16327, 16335, 16340,
+ 16347, 16354, 16360, 16365, 16370, 16377, 16387, 16392, 16399, 16405,
+ 16415, 16425, 16439, 16453, 16467, 16481, 16496, 16511, 16528, 16546,
+ 16559, 16565, 16570, 16575, 16579, 16584, 16592, 16598, 16603, 16608,
+ 16612, 16617, 16621, 16626, 16630, 16641, 16647, 16652, 16657, 16664,
+ 16669, 16673, 16678, 16683, 16689, 16696, 16702, 16707, 16711, 16717,
+ 16722, 16727, 16731, 16737, 16742, 16747, 16754, 16759, 13111, 16763,
+ 16768, 16772, 16777, 16783, 16789, 16796, 16806, 16814, 16821, 16826,
+ 16830, 16839, 16847, 16854, 16861, 16867, 16873, 16878, 16883, 16889,
+ 16894, 16900, 16905, 16911, 16917, 16924, 16930, 16935, 16940, 9348,
+ 16949, 16952, 16958, 16963, 16968, 16978, 16985, 16991, 16996, 17001,
+ 17007, 17012, 17018, 17023, 17029, 17035, 17040, 17048, 17055, 17060,
+ 17065, 17071, 17076, 17080, 17089, 17100, 17107, 17112, 17120, 17126,
+ 17133, 17139, 17144, 17148, 17154, 17159, 17164, 17169, 1440, 7777, 2877,
+ 17173, 17177, 17181, 17185, 17189, 17193, 17196, 17203, 17211, 14394,
+ 17218, 17228, 17236, 17243, 17251, 17261, 17270, 17283, 17288, 17293,
+ 17301, 17308, 13207, 13216, 17315, 17325, 17340, 17346, 17353, 17360,
+ 17366, 17374, 17384, 17394, 14399, 17403, 17409, 17415, 17423, 17431,
+ 17436, 17445, 17453, 17465, 17475, 17485, 17495, 17504, 17516, 17526,
+ 17536, 17547, 17552, 17564, 17576, 17588, 17600, 17612, 17624, 17636,
+ 17648, 17660, 17672, 17683, 17695, 17707, 17719, 17731, 17743, 17755,
+ 17767, 17779, 17791, 17803, 17814, 17826, 17838, 17850, 17862, 17874,
+ 17886, 17898, 17910, 17922, 17934, 17945, 17957, 17969, 17981, 17993,
+ 18005, 18017, 18029, 18041, 18053, 18065, 18076, 18088, 18100, 18112,
+ 18124, 18136, 18148, 18160, 18172, 18184, 18196, 18207, 18219, 18231,
+ 18243, 18255, 18267, 18279, 18291, 18303, 18315, 18327, 18338, 18350,
+ 18362, 18374, 18386, 18398, 18410, 18422, 18434, 18446, 18458, 18469,
+ 18481, 18493, 18505, 18517, 18530, 18543, 18556, 18569, 18582, 18595,
+ 18608, 18620, 18633, 18646, 18659, 18672, 18685, 18698, 18711, 18724,
+ 18737, 18750, 18762, 18775, 18788, 18801, 18814, 18827, 18840, 18853,
+ 18866, 18879, 18892, 18904, 18917, 18930, 18943, 18956, 18969, 18982,
+ 18995, 19008, 19021, 19034, 19046, 19059, 19072, 19085, 19098, 19111,
+ 19124, 19137, 19150, 19163, 19176, 19188, 19201, 19214, 19227, 19240,
+ 19253, 19266, 19279, 19292, 19305, 19318, 19330, 19341, 19354, 19367,
+ 19380, 19393, 19406, 19419, 19432, 19445, 19458, 19471, 19483, 19496,
+ 19509, 19522, 19535, 19548, 19561, 19574, 19587, 19600, 19613, 19625,
+ 19638, 19651, 19664, 19677, 19690, 19703, 19716, 19729, 19742, 19755,
+ 19767, 19780, 19793, 19806, 19819, 19832, 19845, 19858, 19871, 19884,
+ 19897, 19909, 19922, 19935, 19948, 19961, 19974, 19987, 20000, 20013,
+ 20026, 20039, 20051, 20064, 20077, 20090, 20103, 20116, 20129, 20142,
+ 20155, 20168, 20181, 20193, 20206, 20219, 20232, 20245, 20258, 20271,
+ 20284, 20297, 20310, 20323, 20335, 20348, 20361, 20374, 20387, 20400,
+ 20413, 20426, 20439, 20452, 20465, 20477, 20490, 20503, 20516, 20529,
+ 20542, 20555, 20568, 20581, 20594, 20607, 20619, 20632, 20645, 20658,
+ 20671, 20684, 20697, 20710, 20723, 20736, 20749, 20761, 20772, 20780,
+ 20788, 20795, 20801, 20805, 20811, 20817, 20825, 20831, 20836, 20840,
+ 20849, 9155, 20860, 20867, 20875, 20882, 20889, 10948, 20896, 20905,
+ 20910, 20915, 7805, 20922, 20927, 20930, 20935, 20943, 20950, 20957,
+ 20964, 20970, 20979, 20988, 20994, 21003, 21007, 21013, 21018, 21028,
+ 21035, 21041, 21049, 21055, 21062, 21072, 21081, 21085, 21092, 21096,
+ 21101, 21107, 21115, 21119, 21129, 14409, 21138, 21144, 21148, 21157,
+ 14414, 21163, 21170, 21181, 21189, 21198, 21206, 8931, 21214, 21219,
+ 21225, 21230, 21234, 21238, 21242, 9639, 21247, 21255, 21262, 21271,
+ 21278, 21285, 10878, 21292, 21298, 21302, 21308, 21315, 21321, 21329,
+ 21335, 21342, 21348, 21354, 21363, 21367, 21375, 21384, 21391, 21396,
+ 21400, 21411, 21416, 21421, 21426, 21439, 7995, 21443, 21449, 21457,
+ 21461, 21468, 21477, 21482, 14685, 21490, 21494, 21506, 21511, 21515,
+ 21518, 21524, 21530, 21535, 21539, 21542, 21553, 21558, 9383, 21565,
+ 21570, 9388, 21575, 21580, 21585, 21590, 21595, 21600, 21605, 21610,
+ 21615, 21620, 21625, 21630, 21636, 21641, 21646, 21651, 21656, 21661,
+ 21666, 21671, 21676, 21681, 21687, 21693, 21698, 21703, 21708, 21713,
+ 21718, 21723, 21728, 21733, 21738, 21744, 21749, 21754, 21759, 21765,
+ 21771, 21776, 21781, 21786, 21791, 21796, 21801, 21806, 21811, 21817,
+ 21822, 21827, 21832, 21837, 21843, 21848, 21853, 21857, 1368, 129, 21865,
+ 21869, 21873, 21877, 21882, 21886, 13117, 12476, 21890, 21895, 21899,
+ 21904, 21908, 21913, 21917, 21923, 21928, 21932, 21936, 21944, 21948,
+ 21952, 21957, 21962, 21966, 21972, 21977, 21981, 21986, 21991, 21995,
+ 22002, 22009, 22016, 22020, 22024, 22029, 22033, 22036, 22042, 22055,
+ 22060, 22069, 22074, 9428, 22079, 22082, 2712, 2717, 22086, 22092, 22098,
+ 7209, 22103, 22108, 22113, 22119, 22124, 13903, 22129, 22134, 22139,
+ 22144, 22150, 22155, 22160, 22166, 22171, 22175, 22180, 22185, 22190,
+ 22195, 22199, 22204, 22208, 22213, 22218, 22223, 22228, 22232, 22237,
+ 22241, 22246, 22251, 22256, 22261, 2886, 22176, 22265, 22273, 22280,
+ 9733, 22292, 22300, 22181, 22307, 22312, 22320, 22186, 22325, 22330,
+ 22338, 22343, 22191, 22348, 22353, 22357, 22363, 22371, 22374, 22381,
+ 22385, 22389, 22395, 22402, 22407, 8958, 1727, 1732, 22411, 22417, 22423,
+ 22428, 22432, 22436, 22440, 22444, 22448, 22452, 22456, 22459, 22465,
+ 22472, 22480, 22486, 22492, 22497, 22502, 22506, 13823, 13830, 22511,
+ 22523, 22526, 22533, 16356, 22540, 22548, 22559, 22568, 22581, 22591,
+ 22605, 22617, 22631, 22643, 22653, 22665, 22671, 22686, 22710, 22728,
+ 22747, 22760, 22774, 22792, 22808, 22825, 22843, 22854, 22873, 22890,
+ 22910, 22928, 22940, 22954, 22968, 22980, 22997, 23016, 23034, 23046,
+ 23064, 23083, 14553, 23096, 23116, 23128, 10523, 23140, 23145, 23150,
+ 23155, 23161, 23166, 23170, 23177, 2398, 23181, 23187, 23191, 23194,
+ 23198, 23206, 23212, 22209, 23216, 23225, 23236, 23242, 23248, 23257,
+ 23265, 23272, 23277, 23281, 23288, 23294, 23303, 23311, 23318, 23328,
+ 23337, 23347, 23352, 23361, 23370, 23381, 23392, 3963, 23402, 23406,
+ 23416, 23424, 23434, 23445, 23450, 23460, 23468, 23475, 23481, 23488,
+ 23493, 22219, 23497, 23506, 23510, 23513, 23518, 23525, 23534, 23542,
+ 23550, 23560, 23569, 23575, 23581, 22224, 22229, 23585, 23595, 23605,
+ 23615, 23623, 23630, 23640, 23648, 23656, 23662, 23670, 930, 23679,
+ 14744, 542, 23693, 23702, 23710, 23721, 23732, 23742, 23751, 23763,
+ 23772, 23781, 23787, 23796, 23805, 23815, 23823, 23831, 9360, 23837,
+ 23840, 23844, 23849, 23854, 9848, 22242, 22247, 23862, 23868, 23874,
+ 23879, 23884, 23888, 23896, 23902, 23908, 23912, 3525, 23920, 23925,
+ 23930, 23934, 23938, 9928, 23945, 23953, 23967, 23974, 23980, 9937, 9943,
+ 23988, 23996, 24003, 24008, 24013, 22252, 24019, 24030, 24034, 24039,
+ 2601, 24044, 24055, 24061, 24066, 24070, 24074, 24077, 24084, 24091,
+ 24098, 24104, 24108, 22257, 24113, 24117, 24121, 1037, 24126, 24131,
+ 24136, 24141, 24146, 24151, 24156, 24161, 24166, 24171, 24176, 24181,
+ 24186, 24191, 24197, 24202, 24207, 24212, 24217, 24222, 24227, 24233,
+ 24238, 24243, 24248, 24253, 24258, 24263, 24268, 24274, 24280, 24285,
+ 24291, 24296, 24301, 5, 24307, 24311, 24315, 24319, 24324, 24328, 24332,
+ 24336, 24340, 24345, 24349, 24354, 24358, 24361, 24365, 24370, 24374,
+ 24379, 24383, 24387, 24391, 24396, 24400, 24404, 24414, 24419, 24423,
+ 24427, 24432, 24437, 24446, 24451, 24456, 24460, 24464, 24477, 24489,
+ 24498, 24507, 24513, 24518, 24522, 24526, 24536, 24545, 24553, 24559,
+ 24564, 24568, 24575, 24585, 24594, 24602, 24610, 24617, 24625, 24634,
+ 24643, 24651, 24656, 24660, 24664, 24667, 24669, 24673, 24677, 24682,
+ 24687, 24691, 24695, 24698, 24702, 24705, 24709, 24712, 24715, 24719,
+ 24725, 24729, 24733, 24737, 24742, 24747, 24752, 24756, 24759, 24764,
+ 24770, 24775, 24781, 24786, 24790, 24794, 24798, 24803, 24807, 24812,
+ 24816, 24820, 24827, 24831, 24834, 24838, 24844, 24850, 24854, 24858,
+ 24863, 24870, 24876, 24880, 24889, 24893, 24897, 24900, 24906, 24911,
+ 24917, 1489, 1791, 24922, 24927, 24932, 24937, 24942, 24947, 24952, 2148,
+ 2194, 24957, 24960, 24964, 24968, 24973, 24977, 24981, 24984, 24989,
+ 24994, 24998, 25001, 25006, 25010, 25015, 25019, 14756, 25024, 25027,
+ 25030, 25034, 25039, 25043, 25056, 25060, 25063, 25071, 25080, 25087,
+ 25092, 25098, 25104, 25112, 25119, 25126, 25130, 25134, 25138, 25143,
+ 25148, 25152, 25160, 25165, 25177, 25188, 25193, 25197, 25201, 25207,
+ 25212, 25217, 25221, 25225, 25228, 25234, 7915, 2316, 25238, 25243,
+ 25259, 9475, 25279, 25288, 25304, 25308, 25311, 25317, 25327, 25333,
+ 25342, 25357, 25369, 25380, 25388, 25397, 25403, 25412, 25422, 25433,
+ 25444, 25453, 25460, 25469, 25477, 25484, 25492, 25499, 25506, 25519,
+ 25526, 25532, 25537, 25546, 25552, 25557, 25565, 25572, 23426, 25584,
+ 25596, 25610, 25618, 25625, 25637, 25646, 25655, 25663, 25671, 25679,
+ 25686, 25695, 25703, 25713, 25722, 25732, 25741, 25750, 25758, 25763,
+ 25767, 25770, 25774, 25778, 25782, 25786, 25790, 25796, 25802, 25810,
+ 14801, 25817, 25822, 25829, 25835, 25842, 14809, 25849, 25852, 25864,
+ 25872, 25878, 25883, 25887, 9878, 25898, 25908, 25917, 25924, 25928,
+ 14814, 25931, 25938, 25942, 25948, 25951, 25958, 25964, 25971, 25977,
+ 25981, 25986, 25990, 25999, 26006, 26012, 7956, 26019, 26027, 26034,
+ 26040, 26045, 26051, 26057, 26065, 26069, 26072, 26074, 25775, 26083,
+ 26089, 26099, 26104, 26111, 26117, 26122, 26127, 26132, 26136, 26141,
+ 26148, 26157, 26161, 26168, 26177, 26183, 26188, 26194, 26199, 26206,
+ 26217, 26222, 26226, 26236, 26242, 26246, 26251, 26261, 26270, 26274,
+ 26281, 26289, 26296, 26302, 26307, 26315, 26322, 26334, 26343, 26347,
+ 13053, 26355, 26365, 26369, 25067, 26380, 26385, 26389, 26396, 26403,
+ 21968, 25700, 26408, 26412, 26415, 22860, 26420, 26434, 26450, 26468,
+ 26487, 26504, 26522, 22879, 26539, 26559, 22896, 26571, 26583, 15739,
+ 26595, 22916, 26609, 26621, 10536, 26635, 26640, 26645, 26650, 26656,
+ 26662, 26668, 26672, 26679, 26684, 26694, 26700, 10183, 26706, 26708,
+ 26713, 26721, 26725, 26144, 26731, 26738, 11524, 11534, 26745, 26755,
+ 26760, 26764, 26767, 26773, 26781, 26793, 26803, 26819, 26832, 26846,
+ 15757, 26860, 26867, 26871, 26874, 26879, 26883, 26890, 26897, 26907,
+ 26912, 26917, 26922, 26930, 26938, 26947, 26952, 9572, 26956, 26959,
+ 26962, 26967, 26974, 26979, 26995, 27003, 27011, 9423, 27019, 27024,
+ 27028, 27034, 27040, 27043, 27049, 27061, 27069, 27076, 27082, 27089,
+ 27100, 27114, 27127, 27136, 27145, 27157, 27168, 27178, 27187, 27196,
+ 27204, 27215, 7938, 27222, 27228, 27233, 27239, 27246, 27256, 27266,
+ 27275, 27281, 27288, 27293, 27300, 27308, 27316, 27328, 6246, 27335,
+ 27344, 27352, 27358, 27364, 27369, 27373, 27376, 27382, 27389, 27394,
+ 27399, 27403, 27415, 27426, 27435, 27443, 14941, 27448, 27454, 27460,
+ 11517, 8635, 27465, 27469, 27472, 27475, 27481, 27489, 27497, 27501,
+ 27505, 27510, 27513, 27522, 27526, 27534, 27545, 27549, 27555, 27561,
+ 27565, 27571, 27579, 27601, 27625, 27632, 27639, 27645, 27653, 27659,
+ 27664, 27675, 27693, 27700, 27708, 27712, 27721, 27734, 27742, 27754,
+ 27765, 27775, 27789, 27798, 27806, 27818, 9492, 27829, 27840, 27852,
+ 27862, 27871, 27876, 27880, 27888, 27898, 27903, 27907, 27910, 27913,
+ 27921, 27929, 27938, 27948, 27957, 27963, 27977, 2663, 27999, 28010,
+ 28019, 28029, 28041, 28050, 28059, 28069, 28077, 28085, 28094, 28099,
+ 28110, 28115, 28126, 28130, 28140, 28149, 28157, 28167, 28177, 28185,
+ 28194, 28201, 28209, 28216, 28225, 28229, 28237, 28244, 28252, 28259,
+ 28270, 28285, 28292, 28298, 28308, 28317, 28323, 28327, 28334, 28338,
+ 14025, 28344, 28348, 28353, 28360, 28364, 28368, 28376, 28384, 28390,
+ 28399, 28406, 28411, 28416, 28426, 23495, 28430, 28433, 28438, 28443,
+ 28448, 28453, 28458, 28463, 28468, 28473, 28479, 28484, 28489, 28495,
+ 1218, 704, 28500, 28509, 2364, 28516, 28521, 28525, 28531, 1267, 546,
+ 318, 28536, 28545, 28553, 28562, 28570, 28581, 28590, 28598, 28602,
+ 28605, 28613, 28621, 28626, 14769, 28632, 28638, 28644, 5872, 28649,
+ 28653, 28659, 28663, 28670, 1455, 28676, 28683, 9579, 28687, 28697,
+ 28705, 28711, 28720, 28728, 28734, 28742, 28749, 11110, 28755, 28762,
+ 28767, 28774, 1496, 2147, 28780, 28786, 28793, 28804, 28815, 28823,
+ 28830, 28840, 28849, 28857, 28866, 28873, 28880, 28893, 28904, 1272,
+ 28923, 28928, 28936, 3575, 28940, 28945, 28949, 1459, 24696, 28959,
+ 28963, 28968, 28972, 3493, 28978, 28986, 28993, 29004, 29012, 29020,
+ 3576, 279, 29025, 29033, 29041, 29048, 29054, 29059, 2216, 29066, 29072,
+ 25982, 26212, 29078, 106, 29082, 29086, 29092, 615, 9328, 29097, 29104,
+ 29110, 2327, 29114, 29118, 15181, 29121, 29126, 29133, 29139, 29144,
+ 29152, 29159, 29165, 22345, 29169, 29173, 3646, 16619, 29177, 29182,
+ 29185, 29193, 29201, 29206, 29209, 29216, 29226, 29238, 29243, 29247,
+ 29255, 29262, 29268, 29275, 29282, 29285, 29289, 29293, 1463, 29303,
+ 29305, 29310, 29316, 29322, 29327, 29332, 29337, 29342, 29347, 29352,
+ 29357, 29362, 29367, 29372, 29377, 29382, 29387, 29392, 29398, 29404,
+ 29410, 29416, 29421, 29426, 29431, 29437, 29442, 29447, 29452, 29458,
+ 29463, 29469, 29474, 29479, 29484, 29489, 29495, 29500, 29506, 29511,
+ 29516, 29521, 29526, 29532, 29537, 29543, 29548, 29553, 29558, 29563,
+ 29568, 29573, 29578, 29583, 29588, 29594, 29600, 29606, 29611, 29616,
+ 29621, 29626, 29632, 29638, 29644, 29650, 29656, 29662, 29667, 29673,
+ 29678, 29683, 29688, 29693, 29699, 2443, 29704, 2450, 2457, 2754, 29709,
+ 2463, 2473, 29715, 29719, 29724, 29729, 29735, 29740, 29745, 29749,
+ 29754, 29760, 29765, 29770, 29775, 29781, 29786, 29790, 29794, 29799,
+ 29804, 29809, 29814, 29819, 29825, 29831, 29836, 29840, 29845, 29851,
+ 29855, 29860, 29865, 29870, 29875, 29879, 29882, 29887, 29892, 29897,
+ 29902, 29907, 29913, 29919, 29924, 29929, 29933, 29938, 29943, 29948,
+ 29953, 29958, 29962, 29967, 29972, 29977, 29981, 29985, 29989, 29994,
+ 30002, 30007, 30013, 30019, 30025, 30030, 30034, 30037, 30042, 30047,
+ 30051, 30056, 30060, 30065, 30069, 30072, 30077, 17296, 30082, 30087,
+ 30092, 30100, 21274, 28680, 9026, 30105, 30110, 30114, 30119, 30123,
+ 30127, 30132, 30136, 30139, 30142, 30146, 30151, 30155, 30163, 30167,
+ 30170, 30175, 30179, 30183, 30188, 30193, 30197, 30203, 30208, 30213,
+ 30220, 30227, 30231, 30234, 30240, 30249, 30256, 30264, 30271, 30275,
+ 30280, 30284, 30288, 30294, 30300, 30304, 30310, 30315, 30320, 30327,
+ 30333, 30339, 30345, 30351, 30358, 30364, 30370, 30376, 30382, 30388,
+ 30394, 30400, 30407, 30413, 30420, 30426, 30432, 30438, 30444, 30450,
+ 30456, 30462, 30468, 30474, 11418, 30480, 30485, 30490, 30493, 30501,
+ 30506, 30515, 30521, 30526, 30531, 30536, 30540, 30545, 30550, 30555,
+ 30560, 30565, 30572, 30579, 30585, 30591, 30596, 16297, 30603, 30609,
+ 30616, 30622, 30628, 30633, 30641, 30646, 16076, 30650, 30655, 30660,
+ 30666, 30671, 30676, 30680, 30685, 30690, 30696, 30701, 30706, 30710,
+ 30715, 30720, 30724, 30729, 30734, 30739, 30743, 30748, 30753, 30758,
+ 30762, 30766, 15287, 30770, 30779, 30785, 30791, 30800, 30808, 30817,
+ 30825, 30830, 30834, 30841, 30847, 30851, 30854, 30859, 30868, 30876,
+ 30881, 1495, 30887, 30890, 30894, 22418, 22424, 30900, 30904, 30915,
+ 30926, 30937, 30949, 30956, 30963, 30968, 30972, 5909, 755, 21273, 30980,
+ 30985, 30989, 30994, 30998, 31004, 31009, 31015, 31020, 31026, 31031,
+ 31037, 31042, 31048, 31054, 31060, 31065, 31021, 31027, 31069, 31074,
+ 31080, 31085, 31091, 31096, 31102, 31107, 31032, 10421, 31111, 31043,
+ 31049, 31055, 2831, 3423, 31117, 31120, 31126, 31132, 31138, 31145,
+ 31151, 31157, 31163, 31169, 31175, 31181, 31187, 31193, 31199, 31205,
+ 31211, 31217, 31224, 31230, 31236, 31242, 31248, 31254, 31257, 31262,
+ 31265, 31272, 31280, 31285, 31290, 31296, 31301, 31306, 31310, 31315,
+ 31321, 31326, 31332, 31337, 31343, 31348, 31354, 31360, 31364, 31369,
+ 31374, 31379, 31384, 31388, 31393, 31398, 31403, 31409, 31415, 31421,
+ 31427, 31432, 31436, 31439, 31445, 31451, 31460, 31468, 31475, 31480,
+ 31484, 31488, 31493, 15140, 31498, 31506, 31512, 3683, 1377, 31517,
+ 31521, 8005, 31527, 31533, 31540, 8014, 31544, 31550, 31557, 31563,
+ 31572, 31580, 31592, 31596, 31603, 31609, 31613, 31616, 31625, 31633,
+ 31022, 31638, 31648, 31658, 31668, 31674, 31679, 31689, 31694, 31707,
+ 31721, 31732, 31744, 31756, 31770, 31783, 31795, 31807, 14594, 31821,
+ 31826, 31831, 31835, 31839, 31843, 1780, 27166, 31847, 31852, 31070,
+ 31857, 31860, 31865, 31870, 31875, 31881, 31887, 10098, 31892, 31899,
+ 15691, 31905, 31910, 31915, 31919, 31924, 31929, 31075, 31934, 31939,
+ 31944, 31950, 31081, 31955, 31958, 31965, 31973, 31979, 31985, 31991,
+ 32002, 32007, 32014, 32021, 32028, 32036, 32045, 32054, 32060, 32066,
+ 32074, 31086, 32079, 32085, 32091, 31092, 32096, 32101, 32109, 32117,
+ 32123, 32130, 32136, 32143, 32150, 32156, 32164, 32174, 32181, 32186,
+ 32192, 32197, 32202, 32209, 32218, 32226, 32231, 32237, 32244, 32252,
+ 32258, 32263, 32269, 32278, 27943, 32285, 32289, 32294, 32303, 32308,
+ 32313, 32318, 12405, 32326, 32331, 32336, 32341, 32345, 32350, 32355,
+ 32362, 32367, 32372, 32377, 31097, 21210, 32383, 2519, 244, 32386, 32389,
+ 32393, 32397, 32407, 32415, 32419, 32426, 32433, 32437, 32440, 32446,
+ 32454, 32462, 32466, 32470, 32473, 32480, 32484, 32488, 32495, 32503,
+ 31033, 32510, 32518, 10158, 660, 308, 32530, 32535, 32540, 32546, 32551,
+ 32556, 3704, 32561, 32564, 32569, 32574, 32579, 32584, 32589, 32596,
+ 22519, 32601, 32606, 32611, 32616, 32621, 32627, 32632, 32638, 31268,
+ 32644, 32649, 32655, 32661, 32671, 32676, 32681, 32685, 32690, 32695,
+ 32700, 32705, 32718, 32723, 22296, 16699, 3710, 32727, 32732, 32737,
+ 32743, 32748, 32753, 32757, 32762, 32767, 32773, 32778, 32783, 1382,
+ 32787, 32792, 32797, 32802, 32806, 32811, 32816, 32821, 32827, 32833,
+ 32838, 32842, 32846, 32851, 32856, 32861, 32865, 32873, 32877, 32883,
+ 32887, 32894, 16492, 31044, 32900, 32907, 32915, 32922, 32928, 32941,
+ 32953, 32959, 32963, 2773, 32967, 32971, 32475, 32980, 32991, 32996,
+ 33001, 33006, 33010, 33015, 22429, 33019, 33023, 33028, 31050, 21294,
+ 33032, 33037, 33043, 33048, 33052, 33056, 33059, 33063, 33069, 33080,
+ 33092, 31056, 33097, 33100, 33104, 347, 33109, 33114, 33119, 33124,
+ 33129, 33134, 33140, 33145, 33150, 33156, 33161, 33167, 33172, 33178,
+ 33183, 33188, 33193, 33198, 33203, 33208, 33213, 33218, 33224, 33229,
+ 33234, 33239, 33244, 33249, 33254, 33259, 33265, 33271, 33276, 33281,
+ 33286, 33291, 33296, 33301, 33306, 33311, 33316, 33321, 33326, 33331,
+ 33336, 33341, 33346, 33351, 33356, 33361, 33367, 313, 26, 33372, 33376,
+ 33380, 33388, 33392, 33396, 33399, 33402, 33404, 33409, 33413, 33418,
+ 33422, 33427, 33431, 33436, 33440, 33443, 33445, 33449, 33454, 33458,
+ 33469, 33472, 33474, 33478, 33490, 33499, 33503, 33507, 33513, 33518,
+ 33527, 33533, 33538, 33543, 33547, 33552, 33559, 33564, 33570, 33575,
+ 33579, 33586, 25708, 25718, 33590, 33595, 33600, 33605, 33612, 33616,
+ 33623, 8113, 33629, 33638, 33646, 33661, 33675, 33683, 33694, 33703,
+ 33708, 7227, 33718, 33723, 33728, 33732, 33735, 33739, 33744, 33748,
+ 33755, 33760, 33765, 8912, 33775, 33777, 33780, 33784, 33790, 33794,
+ 33799, 33804, 33810, 33815, 33821, 33826, 33836, 33845, 33853, 33858,
+ 33864, 33869, 33876, 33880, 33888, 33895, 33908, 33916, 33920, 33930,
+ 33935, 33939, 33947, 33955, 33959, 33968, 33974, 33979, 33987, 33997,
+ 34006, 34015, 34024, 34035, 34043, 34054, 34063, 34070, 34076, 34081,
+ 34092, 34097, 34101, 34104, 34108, 34116, 34122, 34130, 34137, 34143,
+ 34148, 34154, 2418, 34158, 34160, 34165, 34170, 34175, 34178, 34180,
+ 34184, 34187, 34194, 34198, 9891, 34202, 34208, 34218, 34223, 34229,
+ 34233, 34238, 34251, 26094, 34257, 34266, 17469, 34273, 34282, 31654,
+ 34290, 34295, 34299, 34307, 34314, 34319, 34323, 34328, 34332, 34340,
+ 34346, 34352, 34357, 34361, 34364, 34369, 34382, 34398, 22986, 34415,
+ 34427, 34444, 34456, 34470, 23003, 23022, 34482, 34494, 2680, 34508,
+ 34513, 34518, 34523, 34527, 34534, 34546, 34552, 34555, 34566, 34577,
+ 34582, 32071, 695, 34586, 34590, 34594, 34597, 34602, 34607, 34613,
+ 34618, 34623, 34629, 34635, 34640, 34644, 34649, 34654, 34659, 34663,
+ 34666, 34672, 34677, 34682, 34687, 34691, 34696, 34702, 34710, 26327,
+ 34715, 34720, 34727, 34733, 34739, 34744, 34752, 22528, 34759, 34764,
+ 34769, 34774, 34778, 34781, 34786, 34790, 34794, 34801, 34807, 34813,
+ 34819, 34826, 34831, 34837, 33950, 34841, 34845, 34850, 34863, 34868,
+ 34874, 34882, 34889, 34897, 34907, 34913, 34919, 34925, 34929, 34938,
+ 34946, 34953, 34958, 34963, 10444, 34968, 34976, 34983, 34989, 34999,
+ 35004, 35010, 35018, 3608, 35025, 35032, 3614, 35036, 35041, 35052,
+ 35059, 35065, 35074, 35078, 4015, 35081, 35088, 35094, 35100, 35108,
+ 35118, 29049, 35125, 35133, 35138, 35144, 35149, 25954, 35155, 35162,
+ 35168, 35177, 23667, 35184, 35189, 35193, 35201, 35209, 9607, 5895,
+ 35216, 35220, 35222, 35226, 35231, 35233, 35239, 35244, 35249, 35256,
+ 32592, 35262, 35267, 35271, 35276, 35280, 35289, 35293, 35299, 35306,
+ 35312, 35319, 35324, 35333, 35338, 35342, 35347, 35354, 35362, 35370,
+ 35375, 21350, 35379, 35382, 35386, 35390, 35394, 35397, 35399, 35407,
+ 35411, 35418, 35422, 35426, 35434, 35441, 35451, 35455, 35459, 35467,
+ 35475, 35481, 35486, 35495, 13357, 35501, 35510, 35515, 35522, 35530,
+ 35538, 35546, 35553, 35560, 35567, 35574, 35581, 35586, 35592, 35609,
+ 35617, 35627, 35635, 35642, 407, 35646, 35652, 35656, 35661, 33699,
+ 35667, 35670, 35674, 35682, 3619, 35690, 35696, 35702, 35711, 35721,
+ 35728, 35734, 3625, 3631, 35743, 35750, 35758, 35763, 35767, 35774,
+ 35782, 35789, 35795, 35804, 35814, 35820, 35828, 35837, 35844, 35852,
+ 35859, 22026, 35863, 35870, 35876, 35886, 35895, 35906, 35910, 35920,
+ 35926, 35933, 35941, 35950, 35959, 35969, 35980, 35987, 35992, 35999,
+ 3029, 36007, 36013, 36018, 36024, 36030, 36035, 36048, 36061, 36074,
+ 36081, 36087, 36095, 36103, 36108, 36112, 1469, 36116, 36121, 36126,
+ 36131, 36136, 36142, 36147, 36152, 36157, 36162, 36167, 36172, 36177,
+ 36183, 36189, 36194, 36199, 36205, 36210, 36215, 36220, 36226, 36231,
+ 36236, 36241, 36246, 36252, 36257, 36262, 36268, 36273, 36278, 36283,
+ 36288, 36293, 36299, 36304, 36310, 36315, 36321, 36326, 36331, 36336,
+ 36342, 36348, 36354, 36360, 36366, 36372, 36378, 36384, 36389, 36394,
+ 36400, 36405, 36410, 36415, 36420, 36425, 36430, 36435, 36441, 36446,
+ 36451, 36457, 36463, 101, 36468, 36470, 36474, 36478, 36482, 36487,
+ 36491, 9528, 36495, 36501, 1741, 6280, 36507, 36510, 36515, 36519, 36524,
+ 36528, 36532, 36537, 10245, 36541, 36545, 36549, 36553, 15379, 36558,
+ 36562, 36567, 36572, 36577, 36581, 36588, 26118, 36594, 36597, 36601,
+ 36606, 36612, 36616, 36624, 36630, 36635, 36639, 36645, 36649, 36653,
+ 3462, 3467, 29241, 36656, 36660, 36664, 36668, 36676, 36683, 36687,
+ 36694, 36699, 317, 36704, 36708, 36714, 36726, 36732, 36738, 36742,
+ 36748, 36757, 36761, 36765, 36770, 36776, 36781, 36785, 36790, 36794,
+ 36798, 36805, 36811, 36816, 36831, 36846, 36861, 36877, 36895, 10195,
+ 36909, 36916, 36920, 36923, 36932, 36937, 36941, 36949, 33901, 36957,
+ 36961, 36971, 36982, 29211, 36995, 36999, 37008, 37016, 9785, 14907,
+ 37020, 22441, 37023, 30159, 37028, 9784, 37033, 37039, 37044, 37050,
+ 37055, 37061, 37066, 37072, 37077, 37083, 37089, 37095, 37100, 37056,
+ 37062, 37067, 37073, 37078, 37084, 37090, 8126, 3874, 37104, 37112,
+ 37116, 37119, 37123, 37128, 37133, 37139, 37145, 37150, 37154, 25966,
+ 37158, 37162, 37168, 37172, 9049, 37181, 37188, 37192, 11875, 37199,
+ 37205, 37210, 37217, 37224, 37231, 28557, 8049, 37238, 37245, 37252,
+ 37258, 37263, 37270, 37281, 37287, 37292, 37297, 37302, 37309, 37057,
+ 37313, 37323, 37334, 37340, 37345, 37350, 37355, 37360, 37365, 37369,
+ 37373, 37379, 37387, 2319, 865, 10261, 10273, 10278, 10284, 37396, 10289,
+ 10294, 10300, 37401, 37411, 37415, 10305, 37420, 16897, 37423, 37428,
+ 37432, 37437, 37442, 37449, 37456, 37460, 37463, 37471, 10208, 37478,
+ 37481, 37487, 37497, 5929, 37506, 37510, 37518, 37522, 37532, 37538,
+ 37549, 37555, 37561, 37566, 37572, 37578, 37584, 37589, 37592, 37599,
+ 37605, 37610, 37617, 37624, 37628, 37638, 37651, 37660, 37669, 37680,
+ 37693, 37704, 37713, 37724, 37729, 37738, 37743, 10310, 37749, 37756,
+ 37764, 37769, 37773, 37780, 37787, 3829, 16, 37791, 37796, 16751, 37800,
+ 37803, 37806, 28063, 37810, 28566, 37818, 37822, 37826, 37829, 37835,
+ 37079, 37841, 37849, 37855, 37862, 28046, 37866, 28240, 37870, 37879,
+ 37885, 37891, 37896, 37900, 37906, 37910, 37918, 37926, 26184, 37932,
+ 37939, 37945, 37950, 37955, 37959, 37965, 37970, 37976, 4056, 791, 37983,
+ 37987, 37990, 15269, 38002, 35833, 38013, 38016, 38023, 38027, 38033,
+ 38037, 38043, 38048, 38054, 38059, 38064, 38068, 38072, 38077, 38082,
+ 38092, 38098, 38111, 38117, 38123, 38130, 38135, 38141, 38146, 16637,
+ 1472, 1019, 31200, 31206, 38151, 31212, 31225, 31231, 31237, 38157,
+ 31243, 31249, 38163, 38169, 22, 38177, 38184, 38188, 38192, 38200, 31960,
+ 38204, 38208, 38215, 38220, 38224, 38229, 38235, 38240, 38246, 38251,
+ 38255, 38259, 38263, 38268, 38272, 38277, 38281, 38288, 38293, 38297,
+ 38302, 38306, 38311, 38315, 38320, 38326, 15489, 15494, 38331, 38335,
+ 38338, 38342, 21177, 38347, 38351, 38357, 38364, 38369, 38379, 38384,
+ 38392, 38396, 38399, 31975, 38403, 4109, 38408, 38413, 38417, 38422,
+ 38426, 38431, 13375, 38442, 38446, 38449, 38454, 38458, 38462, 38465,
+ 38469, 8145, 13391, 38472, 38475, 38481, 38486, 38492, 38497, 38503,
+ 38508, 38514, 38519, 38525, 38531, 38537, 38542, 38546, 38550, 38559,
+ 38575, 38591, 38601, 27953, 38608, 38612, 38617, 38622, 38626, 38630,
+ 35954, 38636, 38641, 38645, 38652, 38657, 38661, 38665, 26986, 38671,
+ 21445, 38676, 38683, 38691, 38697, 38704, 38712, 38718, 38722, 38728,
+ 38736, 38740, 38749, 9509, 38757, 38761, 38769, 38776, 38781, 38786,
+ 38790, 38793, 38797, 38800, 38804, 38811, 38816, 38822, 26405, 31263,
+ 38826, 38833, 38839, 38845, 38850, 38853, 38855, 38862, 38869, 38875,
+ 38879, 38882, 38886, 38890, 38894, 38899, 38903, 38907, 38910, 38914,
+ 38928, 23052, 38947, 38960, 38973, 38986, 23070, 39001, 10497, 39016,
+ 39022, 39026, 39030, 39037, 39042, 39046, 39053, 39059, 39064, 39070,
+ 39080, 39092, 39103, 39108, 39115, 39119, 39123, 39126, 15885, 3677,
+ 39134, 15516, 39147, 39154, 39158, 39162, 39167, 39172, 39178, 39182,
+ 39186, 39189, 7742, 15527, 39194, 39198, 39204, 39213, 39218, 39225,
+ 35810, 39231, 39236, 39240, 39245, 39252, 39256, 39259, 39263, 39268,
+ 14559, 39275, 39282, 1072, 39286, 39291, 39296, 39302, 39307, 39312,
+ 39316, 39326, 39331, 39337, 39342, 39348, 39353, 39359, 39369, 39374,
+ 39379, 39383, 7229, 7241, 39388, 39391, 39398, 39404, 34066, 34073,
+ 39413, 39417, 32023, 39425, 39436, 39444, 36002, 39451, 39456, 39461,
+ 39472, 39479, 39490, 32047, 21451, 39498, 735, 39503, 39509, 28037,
+ 39515, 39520, 39530, 39539, 39546, 39552, 39556, 39559, 39566, 39572,
+ 39579, 39585, 39595, 39603, 39609, 39615, 39620, 39624, 39631, 39637,
+ 39644, 38895, 535, 13812, 39650, 39655, 39658, 39664, 39672, 1396, 39677,
+ 39681, 39686, 39693, 39699, 39703, 39707, 39712, 39721, 39728, 39738,
+ 39744, 28081, 39761, 39770, 39778, 39784, 39789, 39796, 39802, 39810,
+ 39819, 39827, 39831, 39836, 39844, 32056, 39850, 39869, 15818, 39883,
+ 39899, 39913, 39919, 39924, 39929, 39934, 39940, 32062, 39945, 39952,
+ 39957, 39961, 345, 2936, 39968, 39973, 39978, 27312, 39799, 39982, 39987,
+ 39995, 39999, 40002, 40008, 40014, 40018, 28136, 40021, 40026, 40030,
+ 40033, 40038, 40042, 40047, 40052, 40056, 40061, 40065, 40069, 21173,
+ 21184, 40073, 40078, 40084, 26943, 40089, 40093, 21260, 16066, 40096,
+ 40101, 40106, 40111, 40116, 40121, 40126, 40131, 447, 43, 31281, 31286,
+ 31291, 31297, 31302, 31307, 40136, 31311, 40140, 40144, 40148, 31316,
+ 31322, 40162, 31333, 31338, 40170, 40175, 31344, 40180, 40185, 40190,
+ 40195, 40201, 40207, 40213, 31361, 40226, 40232, 31365, 40236, 31370,
+ 40241, 31375, 31380, 40244, 40249, 40253, 30930, 40259, 13599, 40266,
+ 40271, 31385, 40275, 40280, 40285, 40290, 40294, 40299, 40304, 40310,
+ 40315, 40320, 40326, 40332, 40337, 40341, 40346, 40351, 40356, 40360,
+ 40365, 40370, 40375, 40381, 40387, 40393, 40398, 40402, 40407, 40411,
+ 31389, 31394, 31399, 40415, 40419, 40423, 31404, 31410, 31416, 31428,
+ 40435, 26003, 40439, 40443, 40448, 40453, 40458, 40463, 40467, 40471,
+ 40481, 40486, 40491, 40495, 40499, 40502, 40510, 31476, 40515, 1479,
+ 40521, 40529, 40538, 40542, 40546, 40554, 40560, 40568, 40584, 40588,
+ 40592, 40597, 40612, 31513, 1749, 12055, 40616, 1378, 40628, 40629,
+ 40637, 40644, 40649, 40656, 40661, 9379, 1114, 10332, 40668, 40673,
+ 40676, 40679, 40688, 1286, 40693, 39043, 40700, 40705, 22493, 2557,
+ 40709, 10741, 40719, 40725, 2337, 2347, 40734, 40743, 40753, 40764, 3293,
+ 34219, 10384, 3807, 16675, 1291, 40769, 40777, 40784, 40789, 40793,
+ 40797, 23865, 10411, 40805, 40814, 40823, 40831, 40838, 40849, 40854,
+ 40867, 40880, 40892, 40904, 40916, 40929, 40940, 40951, 40961, 40969,
+ 40977, 40989, 41001, 41012, 41021, 41029, 41036, 41048, 41055, 41064,
+ 41071, 41084, 41089, 41099, 41104, 41110, 41115, 37189, 41119, 41126,
+ 41130, 41137, 41145, 2518, 41152, 41163, 41173, 41182, 41190, 41200,
+ 41208, 41218, 41227, 41232, 41238, 41244, 3709, 41255, 41265, 41274,
+ 41283, 41293, 41301, 41310, 41315, 41320, 41325, 1705, 37, 41333, 41341,
+ 41352, 41363, 16350, 41373, 41377, 41384, 41390, 41395, 41399, 41410,
+ 41420, 41429, 41440, 16724, 16729, 41445, 41454, 41459, 41469, 41474,
+ 41482, 41490, 41497, 41503, 7078, 228, 41507, 41513, 41518, 41521, 2117,
+ 39159, 41529, 41533, 41536, 1512, 41542, 13974, 1296, 41547, 41560,
+ 41574, 2643, 41592, 41604, 41616, 2657, 2674, 41630, 41643, 2689, 41657,
+ 41669, 2704, 41683, 1302, 1308, 1314, 10659, 41688, 41693, 41698, 41702,
+ 41717, 41732, 41747, 41762, 41777, 41792, 41807, 41822, 41837, 41852,
+ 41867, 41882, 41897, 41912, 41927, 41942, 41957, 41972, 41987, 42002,
+ 42017, 42032, 42047, 42062, 42077, 42092, 42107, 42122, 42137, 42152,
+ 42167, 42182, 42197, 42212, 42227, 42242, 42257, 42272, 42287, 42302,
+ 42317, 42332, 42347, 42362, 42377, 42392, 42407, 42422, 42437, 42452,
+ 42467, 42482, 42497, 42512, 42527, 42542, 42557, 42572, 42587, 42602,
+ 42617, 42632, 42647, 42662, 42677, 42692, 42707, 42722, 42737, 42752,
+ 42767, 42782, 42797, 42812, 42827, 42842, 42857, 42872, 42887, 42902,
+ 42917, 42932, 42947, 42962, 42977, 42992, 43007, 43022, 43037, 43052,
+ 43067, 43082, 43097, 43112, 43127, 43142, 43157, 43172, 43187, 43202,
+ 43217, 43232, 43247, 43262, 43277, 43292, 43307, 43322, 43337, 43352,
+ 43367, 43382, 43397, 43412, 43427, 43442, 43457, 43472, 43487, 43502,
+ 43517, 43532, 43547, 43562, 43577, 43592, 43607, 43622, 43637, 43652,
+ 43667, 43682, 43697, 43712, 43727, 43742, 43757, 43772, 43787, 43802,
+ 43817, 43832, 43847, 43862, 43877, 43892, 43907, 43922, 43937, 43952,
+ 43967, 43982, 43997, 44012, 44027, 44042, 44057, 44072, 44087, 44102,
+ 44117, 44132, 44147, 44162, 44177, 44192, 44207, 44222, 44237, 44252,
+ 44267, 44282, 44297, 44312, 44327, 44342, 44357, 44372, 44387, 44402,
+ 44417, 44432, 44447, 44462, 44477, 44492, 44507, 44522, 44537, 44552,
+ 44567, 44582, 44597, 44612, 44627, 44642, 44657, 44672, 44687, 44702,
+ 44717, 44732, 44747, 44762, 44777, 44792, 44807, 44822, 44837, 44852,
+ 44867, 44882, 44897, 44912, 44927, 44942, 44957, 44972, 44987, 45002,
+ 45017, 45032, 45047, 45062, 45077, 45092, 45107, 45122, 45137, 45152,
+ 45167, 45182, 45197, 45212, 45227, 45242, 45257, 45272, 45287, 45302,
+ 45317, 45332, 45347, 45362, 45377, 45392, 45407, 45422, 45437, 45452,
+ 45467, 45482, 45497, 45512, 45527, 45542, 45557, 45572, 45587, 45602,
+ 45617, 45632, 45647, 45662, 45677, 45692, 45707, 45722, 45737, 45752,
+ 45767, 45782, 45797, 45812, 45827, 45842, 45857, 45872, 45887, 45902,
+ 45917, 45932, 45947, 45962, 45977, 45992, 46007, 46022, 46037, 46052,
+ 46067, 46082, 46097, 46112, 46127, 46142, 46157, 46172, 46187, 46202,
+ 46217, 46232, 46247, 46262, 46277, 46292, 46307, 46322, 46337, 46352,
+ 46367, 46382, 46397, 46412, 46427, 46442, 46457, 46472, 46487, 46502,
+ 46517, 46532, 46547, 46562, 46577, 46592, 46607, 46622, 46637, 46652,
+ 46667, 46682, 46697, 46712, 46727, 46742, 46757, 46772, 46787, 46802,
+ 46817, 46832, 46847, 46862, 46877, 46892, 46907, 46922, 46937, 46952,
+ 46967, 46982, 46997, 47012, 47027, 47042, 47057, 47072, 47087, 47102,
+ 47117, 47132, 47147, 47162, 47177, 47192, 47207, 47222, 47237, 47252,
+ 47267, 47282, 47297, 47312, 47327, 47342, 47357, 47372, 47387, 47402,
+ 47417, 47432, 47447, 47462, 47477, 47492, 47507, 47522, 47537, 47552,
+ 47567, 47582, 47597, 47612, 47627, 47642, 47657, 47672, 47687, 47702,
+ 47717, 47732, 47747, 47762, 47777, 47792, 47807, 47822, 47837, 47852,
+ 47867, 47882, 47897, 47912, 47927, 47942, 47957, 47972, 47987, 48002,
+ 48017, 48032, 48047, 48062, 48077, 48092, 48107, 48122, 48137, 48152,
+ 48167, 48182, 48197, 48212, 48227, 48242, 48257, 48272, 48287, 48302,
+ 48317, 48332, 48347, 48362, 48377, 48392, 48407, 48422, 48437, 48452,
+ 48467, 48482, 48497, 48512, 48527, 48542, 48557, 48572, 48587, 48602,
+ 48617, 48632, 48647, 48662, 48677, 48692, 48707, 48722, 48737, 48752,
+ 48767, 48782, 48797, 48812, 48827, 48842, 48857, 48872, 48887, 48902,
+ 48917, 48932, 48947, 48962, 48977, 48992, 49007, 49022, 49037, 49052,
+ 49067, 49082, 49097, 49112, 49127, 49142, 49157, 49172, 49187, 49202,
+ 49217, 49232, 49247, 49262, 49277, 49292, 49307, 49322, 49337, 49352,
+ 49367, 49382, 49397, 49412, 49427, 49442, 49457, 49472, 49487, 49502,
+ 49518, 49534, 49550, 49566, 49582, 49598, 49614, 49630, 49646, 49662,
+ 49678, 49694, 49710, 49726, 49742, 49758, 49774, 49790, 49806, 49822,
+ 49838, 49854, 49870, 49886, 49902, 49918, 49934, 49950, 49966, 49982,
+ 49998, 50014, 50030, 50046, 50062, 50078, 50094, 50110, 50126, 50142,
+ 50158, 50174, 50190, 50206, 50222, 50238, 50254, 50270, 50286, 50302,
+ 50318, 50334, 50350, 50366, 50382, 50398, 50414, 50430, 50446, 50462,
+ 50478, 50494, 50510, 50526, 50542, 50558, 50574, 50590, 50606, 50622,
+ 50638, 50654, 50670, 50686, 50702, 50718, 50734, 50750, 50766, 50782,
+ 50798, 50814, 50830, 50846, 50862, 50878, 50894, 50910, 50926, 50942,
+ 50958, 50974, 50990, 51006, 51022, 51038, 51054, 51070, 51086, 51102,
+ 51118, 51134, 51150, 51166, 51182, 51198, 51214, 51230, 51246, 51262,
+ 51278, 51294, 51310, 51326, 51342, 51358, 51374, 51390, 51406, 51422,
+ 51438, 51454, 51470, 51486, 51502, 51518, 51534, 51550, 51566, 51582,
+ 51598, 51614, 51630, 51646, 51662, 51678, 51694, 51710, 51726, 51742,
+ 51758, 51774, 51790, 51806, 51822, 51838, 51854, 51870, 51886, 51902,
+ 51918, 51934, 51950, 51966, 51982, 51998, 52014, 52030, 52046, 52062,
+ 52078, 52094, 52110, 52126, 52142, 52158, 52174, 52190, 52206, 52222,
+ 52238, 52254, 52270, 52286, 52302, 52318, 52334, 52350, 52366, 52382,
+ 52398, 52414, 52430, 52446, 52462, 52478, 52494, 52510, 52526, 52542,
+ 52558, 52574, 52590, 52606, 52622, 52638, 52654, 52670, 52686, 52702,
+ 52718, 52734, 52750, 52766, 52782, 52798, 52814, 52830, 52846, 52862,
+ 52878, 52894, 52910, 52926, 52942, 52958, 52974, 52990, 53006, 53022,
+ 53038, 53054, 53070, 53086, 53102, 53118, 53134, 53150, 53166, 53182,
+ 53198, 53214, 53230, 53246, 53262, 53278, 53294, 53310, 53326, 53342,
+ 53358, 53374, 53390, 53406, 53422, 53438, 53454, 53470, 53486, 53502,
+ 53518, 53534, 53550, 53566, 53582, 53598, 53614, 53630, 53646, 53662,
+ 53678, 53694, 53710, 53726, 53742, 53758, 53774, 53790, 53806, 53822,
+ 53838, 53854, 53870, 53886, 53902, 53918, 53934, 53950, 53966, 53982,
+ 53998, 54014, 54030, 54046, 54062, 54078, 54094, 54110, 54126, 54142,
+ 54158, 54174, 54190, 54206, 54222, 54238, 54254, 54270, 54286, 54302,
+ 54318, 54334, 54350, 54366, 54382, 54398, 54414, 54430, 54446, 54462,
+ 54478, 54494, 54510, 54526, 54542, 54558, 54574, 54590, 54606, 54622,
+ 54638, 54654, 54670, 54686, 54702, 54718, 54734, 54750, 54766, 54782,
+ 54798, 54814, 54830, 54846, 54862, 54878, 54894, 54910, 54926, 54942,
+ 54958, 54974, 54990, 55006, 55022, 55038, 55054, 55070, 55086, 55102,
+ 55118, 55134, 55150, 55166, 55182, 55198, 55214, 55230, 55246, 55262,
+ 55278, 55294, 55310, 55326, 55342, 55358, 55374, 55390, 55406, 55422,
+ 55438, 55454, 55470, 55486, 55502, 55518, 55534, 55550, 55566, 55582,
+ 55598, 55614, 55630, 55646, 55662, 55678, 55694, 55710, 55726, 55742,
+ 55758, 55774, 55790, 55806, 55822, 55838, 55854, 55870, 55886, 55902,
+ 55918, 55934, 55950, 55966, 55982, 55998, 56014, 56030, 56046, 56062,
+ 56078, 56094, 56110, 56126, 56142, 56158, 56174, 56190, 56206, 56222,
+ 56238, 56254, 56270, 56286, 56302, 56318, 56334, 56350, 56366, 56382,
+ 56398, 56414, 56430, 56446, 56462, 56478, 56494, 56510, 56526, 56542,
+ 56558, 56574, 56590, 56606, 56622, 56638, 56654, 56670, 56686, 56702,
+ 56718, 56734, 56750, 56766, 56782, 56798, 56814, 56830, 56846, 56862,
+ 56878, 56894, 56910, 56926, 56942, 56958, 56974, 56990, 57006, 57022,
+ 57038, 57054, 57070, 57086, 57102, 57118, 57134, 57150, 57166, 57182,
+ 57198, 57214, 57230, 57246, 57262, 57278, 57294, 57310, 57326, 57342,
+ 57358, 57374, 57390, 57406, 57422, 57438, 57454, 57470, 57486, 57502,
+ 57518, 57534, 57550, 57566, 57582, 57598, 57614, 57630, 57646, 57662,
+ 57678, 57694, 57710, 57726, 57742, 57758, 57774, 57790, 57806, 57822,
+ 57838, 57854, 57870, 57886, 57902, 57918, 57934, 57950, 57966, 57982,
+ 57998, 58014, 58030, 58046, 58062, 58078, 58094, 58110, 58126, 58142,
+ 58158, 58174, 58189, 16756, 58198, 58204, 58210, 58220, 58228, 14888,
+ 15439, 9960, 58241, 1520, 58249, 3761, 27422, 7183, 58255, 58260, 58265,
+ 58270, 58275, 58281, 58286, 58292, 58297, 58303, 58308, 58313, 58318,
+ 58323, 58329, 58334, 58339, 58344, 58349, 58354, 58359, 58364, 58370,
+ 58375, 58381, 58388, 2561, 58393, 58399, 8526, 58403, 58408, 58415,
+ 58423, 40, 58427, 58433, 58438, 58443, 58447, 58452, 58456, 58460, 10684,
+ 58464, 58474, 58487, 58498, 58511, 58518, 58524, 58529, 58535, 58541,
+ 58547, 58552, 58557, 58562, 58567, 58571, 58576, 58581, 58586, 58592,
+ 58598, 58604, 58609, 58613, 58618, 58623, 58627, 58632, 58637, 58642,
+ 58646, 10700, 10711, 10716, 1563, 58650, 1568, 58656, 16233, 58659,
+ 58665, 1599, 58671, 1605, 1611, 10746, 58676, 58684, 58691, 58695, 58701,
+ 58706, 30959, 58711, 58718, 58723, 58727, 58731, 1616, 16325, 58740,
+ 58744, 16336, 1120, 58748, 58755, 58760, 58764, 16361, 1620, 37328,
+ 58767, 58772, 58782, 58791, 58796, 58800, 58806, 1625, 39237, 58811,
+ 58820, 58826, 58831, 10904, 10910, 58837, 58849, 58866, 58883, 58900,
+ 58917, 58934, 58951, 58968, 58985, 59002, 59019, 59036, 59053, 59070,
+ 59087, 59104, 59121, 59138, 59155, 59172, 59189, 59206, 59223, 59240,
+ 59257, 59274, 59291, 59308, 59325, 59342, 59359, 59376, 59393, 59410,
+ 59427, 59444, 59461, 59478, 59495, 59512, 59529, 59546, 59563, 59580,
+ 59597, 59614, 59631, 59648, 59665, 59682, 59693, 59698, 1630, 59702,
+ 59708, 59713, 59718, 9326, 1635, 59724, 59733, 27717, 59738, 59749,
+ 59759, 59764, 59771, 59777, 59782, 59787, 16613, 59791, 10921, 1640,
+ 10926, 59797, 59802, 59808, 59813, 59818, 59823, 59828, 59833, 59838,
+ 59843, 59849, 59855, 59861, 59866, 59870, 59875, 59880, 59884, 59889,
+ 59894, 59899, 59903, 59908, 59914, 59919, 59924, 59928, 59933, 59938,
+ 59944, 59949, 59954, 59960, 59966, 59971, 59975, 59980, 59985, 59990,
+ 59994, 59999, 60004, 60009, 60015, 60021, 60026, 60030, 60034, 60039,
+ 60044, 60049, 29115, 60053, 60058, 60063, 60069, 60074, 60079, 60083,
+ 60088, 60093, 60099, 60104, 60109, 60115, 60121, 60126, 60130, 60135,
+ 60140, 60144, 60149, 60154, 60159, 60165, 60171, 60176, 60180, 60185,
+ 60190, 60194, 60199, 60204, 60209, 60213, 60216, 31621, 60221, 60229,
+ 16679, 3663, 11017, 60235, 60245, 60260, 11022, 60271, 60276, 60287,
+ 60299, 60311, 60323, 2695, 60335, 60340, 60352, 60356, 60362, 60368,
+ 60373, 1652, 1073, 60382, 60387, 39287, 60391, 60395, 60400, 60404,
+ 16764, 60409, 60412, 60420, 60428, 1656, 11047, 11053, 1661, 60436,
+ 60443, 60448, 60457, 60467, 60474, 60479, 60484, 1666, 60491, 60496,
+ 16879, 60500, 60505, 60512, 60518, 60522, 60533, 60543, 16901, 9234,
+ 9241, 1671, 60550, 60556, 60564, 60571, 60577, 60584, 60596, 60602,
+ 60607, 60619, 60630, 60639, 60649, 3740, 30795, 30804, 16941, 1676, 1680,
+ 60657, 60668, 60673, 1683, 60681, 60686, 16992, 60698, 60704, 60709,
+ 60717, 1688, 60722, 60727, 60735, 60743, 60750, 60759, 60767, 60776,
+ 1693, 60780, 1698, 60785, 60792, 17066, 60800, 60806, 60811, 60819,
+ 60826, 60834, 22564, 60839, 11182, 60848, 60854, 60861, 60868, 60874,
+ 60884, 60890, 60895, 60906, 60911, 60919, 11191, 11196, 60927, 60933,
+ 60941, 3805, 17108, 39375, 60946, 60952, 60957, 60965, 60972, 12036,
+ 60977, 60983, 1709, 60988, 60991, 1127, 60997, 61002, 61007, 61013,
+ 61018, 61023, 61028, 61033, 61038, 61043, 1718, 9, 61049, 61053, 61058,
+ 61062, 61066, 61070, 31861, 61075, 61080, 61085, 61089, 61092, 61096,
+ 61100, 61105, 61109, 61114, 61118, 34598, 34603, 34608, 61121, 61128,
+ 61134, 39096, 61144, 34614, 32119, 31876, 31882, 34630, 31888, 61149,
+ 61154, 32152, 61158, 61161, 61165, 61172, 61175, 61180, 61184, 61188,
+ 61191, 61201, 61213, 61220, 61226, 61233, 33555, 61236, 8543, 877, 61239,
+ 61243, 61248, 3690, 61252, 61255, 13632, 61262, 61269, 61282, 61290,
+ 61299, 61308, 61313, 61323, 61336, 61348, 61355, 61360, 61369, 61382,
+ 36042, 61400, 61405, 61412, 61418, 652, 61423, 61431, 61438, 27261, 627,
+ 61444, 61450, 61460, 61466, 61471, 31906, 6003, 31920, 61475, 61485,
+ 61490, 61500, 61515, 61521, 61527, 31930, 61532, 31076, 61536, 61541,
+ 61546, 61550, 61555, 16944, 61562, 61567, 61571, 6044, 31956, 61575,
+ 61581, 312, 61591, 61598, 61605, 61610, 61619, 58776, 61625, 61633,
+ 61637, 61641, 61645, 61649, 61654, 61658, 61664, 61672, 61677, 61682,
+ 61686, 61691, 61695, 61699, 61705, 61711, 61716, 61720, 32080, 61725,
+ 32086, 32092, 61730, 61736, 61743, 61748, 61752, 31093, 16606, 61755,
+ 61759, 61764, 61771, 61777, 61781, 61786, 38806, 61792, 61796, 61800,
+ 61805, 61811, 61817, 61829, 61838, 61848, 61854, 61861, 61866, 61871,
+ 61875, 61878, 61884, 61891, 61896, 61901, 61908, 61915, 61921, 61926,
+ 61931, 61939, 32097, 2423, 61944, 61949, 61955, 61960, 61966, 61971,
+ 61976, 61981, 61987, 32118, 61992, 61998, 62004, 62010, 32182, 62015,
+ 62020, 62025, 32193, 62030, 62035, 62040, 62046, 62052, 32198, 62057,
+ 62062, 62067, 32253, 32259, 62072, 62077, 32264, 62082, 27944, 32286,
+ 32290, 62087, 62063, 62091, 62099, 62105, 62113, 62120, 62126, 62136,
+ 62142, 62149, 10631, 32304, 62155, 62168, 62177, 62183, 62192, 62198,
+ 23502, 62205, 62212, 62222, 32254, 62225, 62232, 62237, 62241, 62245,
+ 62250, 6120, 62254, 62259, 62264, 34692, 34697, 62268, 34711, 62273,
+ 34716, 62278, 62284, 34728, 34734, 34740, 62289, 62295, 22529, 62306,
+ 62309, 62321, 62329, 32327, 62333, 62342, 62352, 62361, 32337, 62366,
+ 62373, 62382, 62388, 62396, 62403, 6095, 4397, 62408, 32265, 62414,
+ 62417, 62423, 62430, 62435, 62440, 23412, 62444, 62450, 62456, 62461,
+ 62466, 62470, 62476, 62482, 33465, 863, 35705, 36626, 36632, 32373,
+ 62487, 62491, 62495, 62498, 62511, 62517, 62521, 62524, 62529, 33768,
+ 62533, 31098, 21281, 62539, 6024, 6032, 9075, 62542, 62547, 62552, 62557,
+ 62562, 62567, 62572, 62577, 62582, 62587, 62593, 62598, 62603, 62609,
+ 62614, 62619, 62624, 62629, 62634, 62639, 62645, 62650, 62656, 62661,
+ 62666, 62671, 62676, 62681, 62686, 62691, 62696, 62701, 62706, 62712,
+ 62717, 62722, 62727, 62732, 62737, 62742, 62748, 62753, 62758, 62763,
+ 62768, 62773, 62778, 62783, 62788, 62793, 62799, 62804, 62809, 62814,
+ 62819, 62825, 62831, 62836, 62842, 62847, 62852, 62857, 62862, 62867,
+ 1513, 245, 62872, 62876, 62880, 62884, 25123, 62888, 62892, 62897, 62901,
+ 62906, 62910, 62915, 62920, 62925, 62929, 62933, 62938, 62942, 13369,
+ 62947, 62951, 62958, 62968, 15200, 62977, 62986, 62990, 62995, 63000,
+ 63004, 24914, 3019, 63008, 17357, 63014, 63023, 63031, 63037, 63049,
+ 63061, 63065, 63070, 63074, 63080, 63086, 63091, 63101, 63111, 63117,
+ 63122, 63126, 63131, 63137, 63146, 63155, 63163, 15554, 63167, 63176,
+ 63184, 63196, 63207, 63218, 63227, 63231, 63240, 63250, 63258, 63264,
+ 63269, 63275, 63280, 98, 30907, 63291, 26256, 26266, 63297, 63304, 63310,
+ 63314, 63324, 63335, 63343, 63352, 63357, 63362, 63366, 17311, 63374,
+ 63378, 63384, 63394, 63401, 63407, 34791, 63413, 63415, 63418, 63422,
+ 63432, 63438, 63445, 13315, 63452, 63458, 63467, 63476, 63482, 63488,
+ 63494, 63499, 63506, 63513, 63519, 63532, 63541, 63550, 63555, 63559,
+ 63565, 63572, 63579, 63586, 63593, 63600, 63605, 63609, 63613, 63616,
+ 63626, 63630, 63642, 63651, 63655, 63660, 63664, 63670, 63675, 63682,
+ 63691, 63699, 63707, 63712, 63716, 63721, 63726, 63736, 63744, 63749,
+ 63753, 63757, 63763, 63775, 63783, 63793, 63800, 63806, 63811, 63815,
+ 63819, 63823, 63832, 63841, 63850, 63856, 63862, 63868, 63873, 63880,
+ 63886, 63894, 63901, 12463, 63907, 63913, 63917, 14238, 63921, 63926,
+ 63936, 63945, 63951, 63957, 63965, 63972, 63976, 63980, 63986, 63994,
+ 64001, 64007, 64018, 64022, 64026, 64030, 64033, 64039, 64044, 64048,
+ 64052, 64061, 64069, 64076, 64082, 64089, 24036, 38848, 64094, 64102,
+ 64106, 64110, 64113, 64121, 64128, 64134, 64143, 64151, 64157, 64162,
+ 64166, 64171, 64175, 64179, 64184, 64193, 64197, 64204, 64211, 64217,
+ 64225, 64231, 64242, 64250, 64256, 22659, 64265, 64272, 64279, 64286,
+ 64293, 64300, 41877, 13153, 64307, 64314, 64319, 34827, 6217, 64325,
+ 64330, 64335, 64341, 64347, 64353, 64358, 64363, 64368, 64373, 64379,
+ 64384, 64390, 64395, 64401, 64406, 64411, 64416, 64421, 64426, 64431,
+ 64436, 64442, 64447, 64453, 64458, 64463, 64468, 64473, 64478, 64483,
+ 64489, 64494, 64499, 64504, 64509, 64514, 64519, 64524, 64529, 64534,
+ 64539, 64545, 64550, 64555, 64560, 64565, 64570, 64575, 64580, 64585,
+ 64591, 64596, 64601, 64606, 64611, 64616, 64621, 64626, 64631, 64636,
+ 64641, 64646, 64651, 64657, 1834, 224, 37424, 64662, 64665, 64670, 64674,
+ 64677, 64682, 63703, 64693, 64703, 64710, 64726, 64735, 64745, 64755,
+ 64763, 64777, 64785, 64789, 64792, 64799, 64805, 64816, 64828, 64839,
+ 64848, 64855, 1297, 23301, 64865, 2590, 64869, 64878, 1133, 17284, 38061,
+ 64886, 64894, 64908, 64921, 64925, 64930, 64935, 64940, 64946, 64952,
+ 64957, 8535, 64962, 64966, 64974, 11048, 64979, 64985, 64994, 1721,
+ 11060, 736, 64998, 65007, 65017, 27020, 65026, 65032, 16856, 65038,
+ 65042, 3964, 11391, 65048, 65055, 60663, 65059, 65063, 3988, 189, 14153,
+ 65069, 65081, 65085, 65091, 27737, 65095, 11379, 2730, 4, 65100, 65110,
+ 65116, 65127, 65134, 65140, 65146, 65154, 65161, 65167, 65177, 65187,
+ 65197, 23489, 1309, 65206, 65210, 65214, 65220, 65224, 2753, 2759, 8532,
+ 2264, 65228, 65232, 65241, 65249, 65260, 65268, 65276, 65282, 65287,
+ 65298, 65309, 65317, 65323, 9694, 65328, 65336, 65340, 65344, 65348,
+ 65360, 28122, 65367, 65377, 65383, 65389, 9796, 65399, 65410, 65420,
+ 65429, 65433, 65440, 1135, 1170, 65450, 65455, 65463, 65471, 65482,
+ 65489, 65503, 14082, 393, 65513, 65517, 65525, 65534, 65542, 65548,
+ 65562, 65569, 65575, 65584, 65591, 65601, 65609, 3812, 156, 65617, 65628,
+ 65632, 65644, 27935, 161, 65650, 65655, 65659, 65666, 65672, 65680,
+ 65687, 8818, 65694, 65703, 65711, 3878, 65724, 8199, 65728, 2798, 450,
+ 65733, 65746, 65751, 1833, 668, 65755, 3895, 65763, 65769, 65773, 931,
+ 65783, 65792, 65797, 14922, 14929, 45239, 65801, 3822, 13041, 65809,
+ 65816, 23545, 65820, 65827, 65833, 65838, 65843, 14942, 372, 65848,
+ 65860, 65866, 65874, 2810, 1753, 65882, 65884, 65889, 65894, 65899,
+ 65905, 65910, 65915, 65920, 65925, 65930, 65935, 65941, 65946, 65951,
+ 65956, 65961, 65966, 65971, 65976, 65981, 65987, 65992, 65997, 66002,
+ 66008, 66013, 66019, 66024, 66029, 66034, 66039, 66044, 66049, 66054,
+ 66060, 66065, 66071, 66076, 66081, 66086, 66091, 66096, 66101, 66106,
+ 66111, 66117, 66122, 66127, 66132, 66136, 66140, 66145, 66149, 66154,
+ 66159, 66165, 66170, 66174, 66179, 66183, 66186, 66188, 66192, 66195,
+ 66200, 66204, 66208, 66212, 66216, 66225, 66229, 32531, 66232, 32536,
+ 66239, 66244, 32541, 66253, 66262, 32547, 66267, 32552, 66276, 66281,
+ 11578, 66285, 66290, 66295, 32557, 66299, 40203, 66303, 66306, 66310,
+ 8211, 66316, 66321, 66325, 3705, 32562, 66328, 66332, 66335, 66340,
+ 66344, 66350, 66358, 66371, 66380, 66386, 66391, 66397, 66401, 66407,
+ 66415, 66420, 66424, 66431, 66437, 66445, 66454, 66462, 32565, 66469,
+ 66479, 66488, 66501, 66506, 66511, 66520, 66526, 66533, 66544, 66556,
+ 66563, 66572, 66581, 66590, 66597, 66603, 66610, 66618, 66625, 66633,
+ 66642, 66650, 66657, 66665, 66674, 66682, 66691, 66701, 66710, 66718,
+ 66725, 66733, 66742, 66750, 66759, 66769, 66778, 66786, 66795, 66805,
+ 66814, 66824, 66835, 66845, 66854, 66862, 66869, 66877, 66886, 66894,
+ 66903, 66913, 66922, 66930, 66939, 66949, 66958, 66968, 66979, 66989,
+ 66998, 67006, 67015, 67025, 67034, 67044, 67055, 67065, 67074, 67084,
+ 67095, 67105, 67116, 67128, 67139, 67149, 67158, 67166, 67173, 67181,
+ 67190, 67198, 67207, 67217, 67226, 67234, 67243, 67253, 67262, 67272,
+ 67283, 67293, 67302, 67310, 67319, 67329, 67338, 67348, 67359, 67369,
+ 67378, 67388, 67399, 67409, 67420, 67432, 67443, 67453, 67462, 67470,
+ 67479, 67489, 67498, 67508, 67519, 67529, 67538, 67548, 67559, 67569,
+ 67580, 67592, 67603, 67613, 67622, 67632, 67643, 67653, 67664, 67676,
+ 67687, 67697, 67708, 67720, 67731, 67743, 67756, 67768, 67779, 67789,
+ 67798, 67806, 67813, 67821, 67830, 67838, 67847, 67857, 67866, 67874,
+ 67883, 67893, 67902, 67912, 67923, 67933, 67942, 67950, 67959, 67969,
+ 67978, 67988, 67999, 68009, 68018, 68028, 68039, 68049, 68060, 68072,
+ 68083, 68093, 68102, 68110, 68119, 68129, 68138, 68148, 68159, 68169,
+ 68178, 68188, 68199, 68209, 68220, 68232, 68243, 68253, 68262, 68272,
+ 68283, 68293, 68304, 68316, 68327, 68337, 68348, 68360, 68371, 68383,
+ 68396, 68408, 68419, 68429, 68438, 68446, 68455, 68465, 68474, 68484,
+ 68495, 68505, 68514, 68524, 68535, 68545, 68556, 68568, 68579, 68589,
+ 68598, 68608, 68619, 68629, 68640, 68652, 68663, 68673, 68684, 68696,
+ 68707, 68719, 68732, 68744, 68755, 68765, 68774, 68784, 68795, 68805,
+ 68816, 68828, 68839, 68849, 68860, 68872, 68883, 68895, 68908, 68920,
+ 68931, 68941, 68952, 68964, 68975, 68987, 69000, 69012, 69023, 69035,
+ 69048, 69060, 69073, 69087, 69100, 69112, 69123, 69133, 69142, 69150,
+ 69157, 69162, 8058, 69169, 32575, 69174, 69179, 32580, 69185, 20923,
+ 32585, 69190, 69196, 69204, 69210, 69216, 69223, 69230, 69235, 69239,
+ 69242, 69246, 69255, 69261, 69273, 69284, 69288, 3081, 8033, 69293,
+ 69296, 69298, 69302, 69306, 69310, 69316, 69321, 25934, 69326, 69330,
+ 69333, 69338, 69342, 69349, 69355, 69359, 6170, 69363, 32602, 69368,
+ 69375, 69384, 69392, 69403, 69411, 69419, 69426, 69433, 69439, 69450,
+ 32607, 69455, 69466, 69478, 69486, 69497, 69506, 69517, 69522, 69530,
+ 2556, 69535, 34277, 69548, 69552, 69564, 69572, 69577, 69585, 17479,
+ 69596, 69602, 69609, 69617, 69623, 32617, 69628, 3914, 58224, 69635,
+ 69638, 69646, 69659, 69672, 69685, 69698, 69705, 69716, 69725, 41694,
+ 41699, 69730, 69734, 69742, 69749, 69758, 69766, 69772, 69781, 69789,
+ 69797, 69801, 69810, 69819, 69829, 69842, 69855, 69865, 32622, 69871,
+ 69878, 69884, 32628, 69889, 69892, 69896, 69904, 69913, 41432, 69921,
+ 69930, 69938, 69945, 69953, 69963, 69972, 69981, 69990, 69998, 70009,
+ 70019, 9366, 21561, 70028, 70033, 70038, 70042, 70046, 70051, 70057,
+ 70062, 70067, 70073, 70078, 70083, 21526, 70088, 70095, 70103, 70111,
+ 70116, 70123, 70130, 70135, 70139, 70143, 70151, 70159, 32645, 70165,
+ 70171, 70183, 70189, 70193, 70200, 70205, 70216, 70226, 70236, 70248,
+ 70254, 70264, 70274, 32672, 70283, 70292, 70298, 70310, 70321, 70328,
+ 70333, 70337, 70345, 70351, 70356, 70361, 70368, 70376, 70388, 70398,
+ 70407, 70416, 70423, 34139, 23841, 70429, 70434, 70438, 70442, 70447,
+ 70453, 70464, 70477, 70482, 70489, 32677, 70494, 70506, 70515, 70525,
+ 70536, 70549, 70556, 70565, 70574, 70582, 70587, 70593, 1064, 70598,
+ 70603, 70608, 70613, 70619, 70624, 70629, 70635, 70641, 70646, 70650,
+ 70655, 70660, 70665, 58736, 70670, 70675, 70680, 70685, 70691, 70697,
+ 70702, 70706, 70711, 70716, 70721, 70727, 70732, 70738, 70743, 70748,
+ 70753, 70758, 70762, 70768, 70773, 70782, 70787, 70792, 70797, 70802,
+ 70806, 70813, 70819, 17129, 17136, 70824, 70828, 70832, 70836, 70840,
+ 45494, 70844, 70774, 70846, 70856, 32686, 70859, 70868, 70874, 6143,
+ 32691, 70878, 70884, 70889, 70895, 70900, 70904, 70911, 70916, 70926,
+ 70935, 70939, 70945, 70951, 70957, 70961, 70969, 70976, 70984, 70992,
+ 32696, 70999, 71002, 71009, 71015, 71020, 71024, 71030, 71037, 71042,
+ 71046, 71055, 71063, 71069, 71074, 32701, 71081, 71088, 71094, 71099,
+ 71105, 71112, 71118, 21288, 27445, 71124, 71129, 71135, 71147, 70807,
+ 70814, 21464, 71157, 71162, 71169, 71175, 71182, 71188, 71199, 71204,
+ 9110, 71212, 71215, 71221, 71225, 71229, 71232, 71238, 32450, 6194, 964,
+ 13419, 71245, 71251, 71257, 71263, 71269, 71275, 71281, 71287, 71293,
+ 71298, 71303, 71308, 71313, 71318, 71323, 71328, 71333, 71338, 71343,
+ 71348, 71353, 71358, 71364, 71369, 71374, 71380, 71385, 71390, 71396,
+ 71402, 71408, 71414, 71420, 71426, 71432, 71438, 71444, 71449, 71454,
+ 71460, 71465, 71470, 71476, 71481, 71486, 71491, 71496, 71501, 71506,
+ 71511, 71516, 71521, 71526, 71531, 71536, 71542, 71547, 71552, 71557,
+ 71563, 71568, 71573, 71578, 71583, 71589, 71594, 71599, 71604, 71609,
+ 71614, 71619, 71624, 71629, 71634, 71639, 71644, 71649, 71654, 71659,
+ 71664, 71669, 71674, 71679, 71684, 71690, 71695, 71700, 71705, 71710,
+ 71715, 71720, 71725, 1864, 142, 71730, 71734, 71738, 71743, 71751, 71755,
+ 71762, 71770, 71774, 71787, 71795, 71799, 71802, 71807, 71811, 71816,
+ 71820, 71828, 71832, 20931, 71837, 71841, 60937, 71845, 71848, 71856,
+ 71864, 71872, 71877, 71884, 71890, 71896, 71901, 71908, 71913, 71921,
+ 64913, 71928, 71933, 71938, 71942, 11645, 71946, 71951, 71956, 71960,
+ 71963, 71969, 71973, 71983, 71992, 71995, 71999, 72006, 72019, 72025,
+ 72033, 72044, 72055, 72066, 72077, 72086, 72092, 72101, 72109, 72119,
+ 72132, 72139, 72150, 72156, 72161, 72166, 72172, 72178, 72188, 72197,
+ 70496, 72205, 72211, 72219, 72225, 72233, 72236, 72240, 72244, 72247,
+ 72253, 72259, 72267, 72279, 72291, 72298, 72302, 72313, 72321, 72328,
+ 72340, 72348, 72356, 72363, 72369, 72379, 72388, 72393, 72403, 72412,
+ 40758, 72419, 72423, 72428, 72436, 72443, 72449, 72453, 72463, 72474,
+ 72482, 72489, 72501, 72513, 72522, 69538, 72529, 72540, 72554, 72562,
+ 72572, 72579, 72587, 72599, 72608, 72616, 72626, 72637, 72649, 72658,
+ 72668, 72675, 72684, 72699, 72707, 72717, 72726, 72734, 72747, 72762,
+ 72766, 72775, 72787, 72798, 72809, 72820, 72830, 72841, 72849, 72855,
+ 72865, 72873, 72879, 29014, 72884, 72890, 72895, 72902, 9708, 17499,
+ 72908, 72917, 72922, 72926, 72933, 72939, 72944, 72949, 72957, 72965,
+ 72969, 72972, 72975, 72977, 72984, 72990, 73001, 73006, 73010, 73017,
+ 73023, 73028, 73036, 65412, 65422, 73042, 73049, 73059, 10618, 73066,
+ 73071, 29210, 73080, 73085, 73092, 73102, 73110, 73118, 73127, 73133,
+ 73139, 73146, 73153, 73158, 73162, 73170, 73175, 73180, 73188, 73195,
+ 73200, 73206, 73209, 73213, 73222, 71782, 73231, 73235, 73241, 73252,
+ 73262, 17508, 73273, 73281, 17520, 73288, 73292, 73301, 27331, 73308,
+ 73312, 73317, 73334, 73346, 10576, 73358, 73363, 73368, 73373, 21004,
+ 73377, 73382, 73387, 73393, 73398, 5846, 21008, 73403, 73408, 73414,
+ 73421, 73426, 73431, 73437, 73443, 73449, 73454, 73460, 73464, 73478,
+ 73486, 73494, 73500, 73505, 73512, 73522, 73531, 73536, 73541, 73549,
+ 73554, 73560, 73565, 73574, 59793, 73579, 73582, 73600, 73619, 73632,
+ 73646, 73662, 73669, 73676, 73682, 73689, 73694, 73700, 73706, 73714,
+ 73720, 73725, 73730, 73746, 10589, 73760, 73767, 73775, 73781, 73785,
+ 73788, 73793, 73798, 73805, 73810, 73819, 73824, 73830, 73839, 73848,
+ 73853, 73857, 73865, 73874, 11674, 73883, 73891, 73896, 73902, 11685,
+ 73907, 73910, 73915, 73925, 73934, 73939, 73945, 73950, 73958, 73965,
+ 73976, 73986, 73991, 64841, 73996, 74002, 74007, 74014, 74023, 74031,
+ 74037, 74043, 74050, 74056, 74060, 16954, 3055, 74065, 74069, 74073,
+ 74079, 74088, 74094, 74101, 74105, 74126, 74148, 74164, 74181, 74200,
+ 74209, 74219, 74226, 74233, 27218, 74239, 74243, 74251, 74263, 74269,
+ 74277, 74281, 74289, 74296, 74300, 74306, 74312, 74317, 3563, 41894,
+ 74323, 74327, 74331, 74335, 74340, 74345, 74350, 74356, 74362, 74368,
+ 74375, 74381, 74388, 74394, 74400, 74405, 74411, 74416, 74420, 74425,
+ 74429, 74434, 41909, 74438, 74443, 74451, 74455, 74460, 74467, 74476,
+ 74482, 74486, 74493, 74497, 74500, 74507, 74516, 74521, 74525, 74533,
+ 74542, 74546, 74554, 74560, 74565, 74570, 74576, 74582, 74587, 74591,
+ 74597, 74602, 74606, 74610, 74613, 74618, 74626, 74636, 74641, 39394,
+ 74649, 74661, 74665, 74671, 74683, 74694, 74701, 74707, 74714, 74726,
+ 74733, 74739, 21082, 74743, 74749, 74756, 74762, 74768, 74773, 74778,
+ 74783, 74792, 7033, 74797, 16420, 74803, 74807, 74811, 74815, 74823,
+ 74832, 74836, 74843, 74852, 74865, 74871, 74430, 30074, 74876, 74878,
+ 74883, 74888, 74893, 74898, 74903, 74908, 74913, 74918, 74923, 74928,
+ 74933, 74938, 74943, 74948, 74954, 74959, 74964, 74969, 74974, 74979,
+ 74984, 74989, 74994, 75000, 75006, 75012, 75017, 75022, 75034, 75039,
+ 1870, 49, 75044, 75049, 32728, 75053, 32733, 32738, 32744, 32749, 75057,
+ 32754, 22077, 75079, 75083, 75087, 75092, 75096, 32758, 75100, 75108,
+ 32763, 75115, 75118, 75123, 75127, 9543, 75136, 32768, 21939, 75139,
+ 75143, 1428, 75148, 32779, 75151, 75156, 25727, 25737, 35240, 75161,
+ 75166, 75171, 75176, 75182, 75187, 75196, 75201, 75208, 75214, 75219,
+ 75224, 75229, 75239, 75248, 75253, 75261, 75265, 75273, 32593, 37295,
+ 75280, 75286, 75291, 75296, 12016, 75301, 75307, 75312, 75319, 75325,
+ 75330, 75338, 75348, 75358, 75364, 75369, 75375, 17530, 75382, 36055,
+ 75395, 75400, 75406, 30975, 75419, 75425, 75429, 75438, 75445, 75451,
+ 75459, 75468, 75475, 75481, 75484, 75488, 25868, 75492, 75499, 75505,
+ 75513, 75518, 23984, 75524, 75527, 75535, 75543, 75557, 75564, 75570,
+ 75577, 75583, 32793, 75587, 75594, 75602, 75610, 75616, 32798, 75624,
+ 75630, 75635, 75645, 75651, 75660, 30812, 34698, 75668, 75673, 75678,
+ 75682, 75687, 75691, 75699, 14914, 39407, 75704, 75709, 32803, 62239,
+ 75713, 75718, 75722, 75731, 75739, 75745, 75750, 75756, 75763, 75769,
+ 75774, 75779, 75788, 75800, 75815, 33065, 75821, 16539, 32807, 75825,
+ 75832, 24094, 75838, 75845, 75854, 75861, 75870, 75876, 75881, 75889,
+ 75895, 32817, 75900, 75909, 74689, 75918, 75925, 75931, 75937, 75947,
+ 75955, 75962, 75966, 32822, 75969, 32828, 32834, 75974, 75982, 75990,
+ 76000, 76009, 76017, 76024, 76034, 32839, 76038, 76040, 76044, 76049,
+ 76053, 76057, 76063, 76068, 76072, 76083, 76088, 76093, 3060, 76097,
+ 76104, 76108, 76117, 76125, 76132, 76137, 76142, 62285, 76146, 76149,
+ 76155, 76163, 76169, 76173, 76178, 76185, 76190, 76196, 34729, 76201,
+ 76204, 76209, 76213, 76218, 76223, 76227, 76235, 76239, 25746, 25755,
+ 76245, 76251, 76257, 76262, 76266, 76269, 76279, 76288, 76293, 76299,
+ 76306, 76312, 76316, 76324, 76329, 34735, 76333, 76341, 76347, 76354,
+ 76359, 76363, 76368, 58410, 34741, 76374, 76379, 76383, 76388, 76393,
+ 76398, 76402, 76407, 76412, 76418, 76423, 76428, 76434, 76440, 76445,
+ 76449, 76454, 76459, 76464, 76468, 24093, 76473, 76478, 76484, 76490,
+ 76496, 76501, 76505, 76510, 76515, 76520, 76524, 76529, 76534, 76539,
+ 76544, 76548, 32847, 76556, 76560, 76568, 76576, 76587, 76592, 76596,
+ 22391, 76601, 76607, 76617, 76624, 76629, 76638, 76643, 76647, 76652,
+ 76660, 76668, 76675, 65075, 76681, 76689, 76696, 76707, 76713, 76717,
+ 76723, 32857, 76726, 76733, 76741, 76746, 39598, 76750, 76755, 76762,
+ 76767, 8992, 76771, 76779, 76786, 76793, 76799, 76813, 63347, 76821,
+ 76827, 76831, 76834, 76842, 76849, 76854, 76867, 76874, 76878, 76885,
+ 76890, 60830, 76895, 76898, 76905, 76911, 76915, 76923, 76932, 76942,
+ 76952, 76961, 76969, 76980, 76985, 76989, 76994, 76998, 35371, 77006,
+ 21351, 35380, 77011, 77016, 77021, 77026, 77031, 77036, 77041, 77045,
+ 77050, 77055, 77060, 77065, 77070, 77075, 77079, 77084, 77089, 77093,
+ 77097, 77101, 77105, 77110, 77115, 77119, 77124, 77128, 77132, 77137,
+ 77142, 77147, 77152, 77156, 77161, 77166, 77170, 77175, 77180, 77185,
+ 77190, 77195, 77200, 77205, 77210, 77215, 77220, 77225, 77230, 77235,
+ 77240, 77245, 77250, 77255, 77260, 77265, 77270, 77274, 77279, 77284,
+ 77289, 77294, 77299, 77304, 77309, 77314, 77319, 77324, 77329, 77333,
+ 77338, 77342, 77347, 77352, 77357, 77362, 77367, 77372, 77377, 77382,
+ 77387, 77391, 77395, 77400, 77405, 77409, 77414, 77419, 77423, 77428,
+ 77433, 77438, 77443, 77447, 77452, 77457, 77461, 77466, 77470, 77474,
+ 77478, 77482, 77487, 77491, 77495, 77499, 77503, 77507, 77511, 77515,
+ 77519, 77523, 77528, 77533, 77538, 77543, 77548, 77553, 77558, 77563,
+ 77568, 77573, 77577, 77581, 77585, 77589, 77593, 77597, 77602, 77606,
+ 77611, 77615, 77620, 77625, 77629, 77633, 77638, 77642, 77646, 77650,
+ 77654, 77658, 77662, 77666, 77670, 77674, 77678, 77682, 77686, 77690,
+ 77694, 77699, 77704, 77708, 77712, 77716, 77720, 77724, 77728, 77733,
+ 77737, 77741, 77745, 77749, 77753, 77757, 77762, 77766, 77771, 77775,
+ 77779, 77783, 77787, 77791, 77795, 77799, 77803, 77807, 77811, 77815,
+ 77820, 77824, 77828, 77832, 77836, 77840, 77844, 77848, 77852, 77856,
+ 77860, 77864, 77869, 77873, 77877, 77882, 77887, 77891, 77895, 77899,
+ 77903, 77907, 77911, 77915, 77919, 77924, 77928, 77933, 77937, 77942,
+ 77946, 77951, 77955, 77961, 77966, 77970, 77975, 77979, 77984, 77988,
+ 77993, 77997, 78002, 1521, 78006, 2824, 1759, 1764, 78010, 78014, 2828,
+ 78018, 1397, 78023, 1342, 78027, 2840, 78031, 78038, 78045, 78059, 2844,
+ 7131, 78068, 78076, 78083, 78094, 78103, 78110, 78122, 78135, 78148,
+ 78159, 78164, 78171, 78183, 78187, 2848, 11747, 78197, 78202, 78211,
+ 78221, 2852, 78226, 78230, 78235, 78242, 78248, 78256, 78268, 1347,
+ 13042, 78278, 78282, 78288, 78302, 78314, 78326, 78336, 78345, 78354,
+ 78363, 78371, 78382, 78390, 4051, 78400, 78411, 78420, 78426, 78441,
+ 78448, 78454, 35496, 78459, 2876, 13046, 78463, 78470, 8930, 78479, 2881,
+ 32343, 78485, 60579, 78492, 78498, 78509, 78515, 78522, 78528, 78536,
+ 78543, 78549, 78559, 78568, 78579, 78586, 78592, 78602, 78610, 78616,
+ 78631, 78637, 78642, 78649, 78652, 78658, 78665, 78671, 78679, 78688,
+ 78696, 78702, 78711, 41434, 78725, 78730, 78736, 14751, 78741, 78754,
+ 78763, 78771, 78778, 78782, 78786, 78789, 78796, 78803, 78811, 78819,
+ 78828, 78836, 14678, 78844, 78849, 78853, 78865, 78872, 78881, 748,
+ 78891, 78900, 78911, 2897, 78915, 78919, 78925, 78938, 78950, 78960,
+ 78969, 78981, 26359, 78992, 79000, 79009, 79020, 79031, 79041, 79051,
+ 79060, 79068, 11312, 79075, 79079, 79082, 79087, 79092, 79096, 79102,
+ 1352, 11818, 79109, 79120, 79129, 79137, 79146, 79154, 79170, 79181,
+ 79190, 79198, 79210, 79221, 79237, 79247, 79268, 79281, 79289, 79296,
+ 14862, 79309, 79314, 79320, 5908, 79326, 79329, 79336, 79346, 8176,
+ 79353, 79358, 79363, 79368, 79376, 79385, 79393, 9756, 9765, 79398,
+ 79409, 79414, 79420, 2913, 2918, 79426, 10879, 79432, 79439, 79446,
+ 79459, 2251, 68, 79464, 79469, 79479, 79485, 79494, 79502, 79512, 79516,
+ 79521, 79525, 79537, 2941, 79545, 79553, 79558, 79569, 79580, 79589,
+ 79594, 79600, 79605, 79615, 79625, 79630, 79636, 79641, 79650, 21404,
+ 79654, 4128, 20, 79659, 79668, 79675, 79682, 79688, 79694, 864, 79699,
+ 79704, 60907, 79709, 79714, 79720, 79726, 79734, 79739, 79746, 79752,
+ 79757, 38008, 41328, 79763, 2945, 32, 79773, 79786, 79791, 79799, 79804,
+ 79810, 2967, 28296, 79815, 79823, 79830, 79835, 58652, 61910, 79844,
+ 79848, 1704, 1813, 79853, 79858, 79865, 1817, 247, 79872, 79878, 2989,
+ 79883, 79888, 79895, 1821, 79900, 79906, 79911, 79923, 6119, 79933, 1828,
+ 79939, 79944, 79951, 79958, 79973, 79980, 79991, 79999, 2618, 80003,
+ 80015, 80020, 80024, 80030, 28121, 2256, 80034, 80045, 80049, 80053,
+ 80059, 80063, 80072, 80076, 80087, 80091, 2302, 32172, 80095, 80105,
+ 3080, 9371, 80113, 80118, 80122, 80131, 80138, 80144, 3050, 17146, 80148,
+ 80161, 80179, 80184, 80192, 80200, 80210, 9985, 13154, 80222, 80235,
+ 80242, 80249, 80265, 80272, 80278, 1059, 80285, 80292, 80302, 80311,
+ 80323, 42298, 80331, 3064, 12030, 80334, 80342, 80346, 78238, 3068,
+ 80350, 21185, 12046, 3756, 80354, 3074, 80358, 80368, 80374, 80380,
+ 80386, 80392, 80398, 80404, 80410, 80416, 80422, 80428, 80434, 80440,
+ 80446, 80452, 80458, 80464, 80470, 80476, 80482, 80488, 80494, 80500,
+ 80506, 80512, 80518, 80525, 80532, 80538, 80544, 80550, 80556, 80562,
+ 80568, 1357, 16056, 12068, 80574, 80579, 80584, 80589, 80594, 80599,
+ 80604, 80609, 80614, 80619, 80624, 80629, 80634, 80639, 80644, 80649,
+ 80654, 80659, 80664, 80669, 80674, 80679, 80684, 80689, 80694, 80699,
+ 80705, 80710, 80715, 80721, 80726, 80732, 80737, 80742, 80748, 80753,
+ 80758, 80763, 80768, 80773, 80778, 80783, 80788, 80369, 80375, 80381,
+ 80387, 80393, 80399, 80405, 80411, 80417, 80423, 80429, 80435, 80441,
+ 80447, 80453, 80794, 80459, 80465, 80471, 80800, 80477, 80483, 80489,
+ 80495, 80501, 80507, 80513, 80533, 80806, 80812, 80539, 80818, 80545,
+ 80551, 80557, 80563, 80569, 3091, 3096, 80824, 80829, 80832, 80838,
+ 80844, 80851, 80856, 80861, 2307,
};
/* code->name phrasebook */
#define phrasebook_shift 7
#define phrasebook_short 209
static unsigned char phrasebook[] = {
- 0, 219, 18, 245, 31, 78, 223, 254, 78, 54, 50, 247, 132, 50, 225, 182,
- 50, 254, 126, 254, 57, 43, 226, 3, 44, 226, 3, 253, 216, 96, 50, 249,
- 219, 240, 167, 243, 229, 218, 129, 219, 46, 21, 210, 86, 21, 110, 21,
+ 0, 219, 19, 245, 32, 78, 223, 255, 78, 54, 50, 247, 133, 50, 225, 183,
+ 50, 254, 127, 254, 58, 43, 226, 4, 44, 226, 4, 253, 217, 96, 50, 249,
+ 220, 240, 168, 243, 230, 218, 130, 219, 47, 21, 210, 86, 21, 110, 21,
105, 21, 158, 21, 161, 21, 189, 21, 194, 21, 198, 21, 195, 21, 200, 249,
- 226, 220, 150, 233, 15, 50, 245, 98, 50, 242, 130, 50, 224, 13, 78, 249,
- 217, 253, 206, 7, 6, 1, 61, 7, 6, 1, 253, 158, 7, 6, 1, 251, 66, 7, 6, 1,
- 249, 60, 7, 6, 1, 75, 7, 6, 1, 245, 6, 7, 6, 1, 243, 202, 7, 6, 1, 242,
- 60, 7, 6, 1, 73, 7, 6, 1, 235, 144, 7, 6, 1, 235, 23, 7, 6, 1, 156, 7, 6,
- 1, 193, 7, 6, 1, 230, 25, 7, 6, 1, 76, 7, 6, 1, 226, 105, 7, 6, 1, 224,
- 96, 7, 6, 1, 153, 7, 6, 1, 222, 91, 7, 6, 1, 217, 152, 7, 6, 1, 70, 7, 6,
+ 227, 220, 151, 233, 16, 50, 245, 99, 50, 242, 131, 50, 224, 14, 78, 249,
+ 218, 253, 207, 7, 6, 1, 61, 7, 6, 1, 253, 159, 7, 6, 1, 251, 67, 7, 6, 1,
+ 249, 61, 7, 6, 1, 75, 7, 6, 1, 245, 7, 7, 6, 1, 243, 203, 7, 6, 1, 242,
+ 61, 7, 6, 1, 73, 7, 6, 1, 235, 145, 7, 6, 1, 235, 24, 7, 6, 1, 156, 7, 6,
+ 1, 193, 7, 6, 1, 230, 26, 7, 6, 1, 76, 7, 6, 1, 226, 106, 7, 6, 1, 224,
+ 97, 7, 6, 1, 153, 7, 6, 1, 222, 92, 7, 6, 1, 217, 153, 7, 6, 1, 70, 7, 6,
1, 214, 105, 7, 6, 1, 212, 98, 7, 6, 1, 211, 178, 7, 6, 1, 211, 117, 7,
- 6, 1, 210, 159, 43, 42, 127, 223, 50, 219, 46, 44, 42, 127, 250, 31, 255,
- 14, 121, 232, 213, 242, 137, 255, 14, 7, 4, 1, 61, 7, 4, 1, 253, 158, 7,
- 4, 1, 251, 66, 7, 4, 1, 249, 60, 7, 4, 1, 75, 7, 4, 1, 245, 6, 7, 4, 1,
- 243, 202, 7, 4, 1, 242, 60, 7, 4, 1, 73, 7, 4, 1, 235, 144, 7, 4, 1, 235,
- 23, 7, 4, 1, 156, 7, 4, 1, 193, 7, 4, 1, 230, 25, 7, 4, 1, 76, 7, 4, 1,
- 226, 105, 7, 4, 1, 224, 96, 7, 4, 1, 153, 7, 4, 1, 222, 91, 7, 4, 1, 217,
- 152, 7, 4, 1, 70, 7, 4, 1, 214, 105, 7, 4, 1, 212, 98, 7, 4, 1, 211, 178,
- 7, 4, 1, 211, 117, 7, 4, 1, 210, 159, 43, 249, 99, 127, 67, 232, 213, 44,
- 249, 99, 127, 182, 228, 73, 219, 18, 235, 193, 245, 31, 78, 250, 176, 50,
- 224, 228, 50, 249, 98, 50, 211, 40, 50, 251, 135, 130, 221, 173, 50, 248,
- 1, 249, 163, 50, 244, 136, 226, 154, 235, 238, 233, 42, 52, 254, 110,
- 223, 254, 78, 228, 52, 50, 219, 52, 240, 168, 223, 102, 50, 231, 232,
- 248, 71, 50, 225, 21, 50, 218, 23, 105, 218, 23, 158, 255, 3, 255, 14,
- 230, 228, 50, 225, 68, 50, 230, 224, 247, 120, 250, 183, 218, 23, 110,
- 231, 148, 226, 154, 235, 238, 222, 247, 52, 254, 110, 223, 254, 78, 212,
- 114, 244, 2, 123, 224, 21, 212, 114, 244, 2, 123, 242, 27, 212, 114, 244,
- 2, 134, 224, 19, 235, 193, 224, 13, 78, 7, 6, 1, 115, 2, 242, 136, 7, 6,
- 1, 115, 2, 142, 7, 6, 1, 115, 2, 250, 30, 7, 6, 1, 115, 2, 182, 7, 6, 1,
- 115, 2, 248, 1, 7, 6, 1, 115, 2, 222, 234, 48, 7, 6, 1, 254, 243, 7, 6,
- 1, 251, 67, 2, 250, 183, 7, 6, 1, 160, 2, 242, 136, 7, 6, 1, 160, 2, 142,
- 7, 6, 1, 160, 2, 250, 30, 7, 6, 1, 160, 2, 248, 1, 7, 6, 1, 240, 154, 2,
- 242, 136, 7, 6, 1, 240, 154, 2, 142, 7, 6, 1, 240, 154, 2, 250, 30, 7, 6,
- 1, 240, 154, 2, 248, 1, 7, 6, 1, 245, 59, 7, 6, 1, 230, 26, 2, 182, 7, 6,
- 1, 144, 2, 242, 136, 7, 6, 1, 144, 2, 142, 7, 6, 1, 144, 2, 250, 30, 7,
- 6, 1, 144, 2, 182, 7, 6, 1, 144, 2, 248, 1, 230, 84, 50, 7, 6, 1, 144, 2,
- 91, 7, 6, 1, 104, 2, 242, 136, 7, 6, 1, 104, 2, 142, 7, 6, 1, 104, 2,
- 250, 30, 7, 6, 1, 104, 2, 248, 1, 7, 6, 1, 211, 118, 2, 142, 7, 6, 1,
- 216, 151, 7, 4, 1, 220, 76, 222, 91, 7, 4, 1, 115, 2, 242, 136, 7, 4, 1,
- 115, 2, 142, 7, 4, 1, 115, 2, 250, 30, 7, 4, 1, 115, 2, 182, 7, 4, 1,
- 115, 2, 248, 1, 7, 4, 1, 115, 2, 222, 234, 48, 7, 4, 1, 254, 243, 7, 4,
- 1, 251, 67, 2, 250, 183, 7, 4, 1, 160, 2, 242, 136, 7, 4, 1, 160, 2, 142,
- 7, 4, 1, 160, 2, 250, 30, 7, 4, 1, 160, 2, 248, 1, 7, 4, 1, 240, 154, 2,
- 242, 136, 7, 4, 1, 240, 154, 2, 142, 7, 4, 1, 240, 154, 2, 250, 30, 7, 4,
- 1, 240, 154, 2, 248, 1, 7, 4, 1, 245, 59, 7, 4, 1, 230, 26, 2, 182, 7, 4,
- 1, 144, 2, 242, 136, 7, 4, 1, 144, 2, 142, 7, 4, 1, 144, 2, 250, 30, 7,
- 4, 1, 144, 2, 182, 7, 4, 1, 144, 2, 248, 1, 247, 169, 50, 7, 4, 1, 144,
- 2, 91, 7, 4, 1, 104, 2, 242, 136, 7, 4, 1, 104, 2, 142, 7, 4, 1, 104, 2,
- 250, 30, 7, 4, 1, 104, 2, 248, 1, 7, 4, 1, 211, 118, 2, 142, 7, 4, 1,
- 216, 151, 7, 4, 1, 211, 118, 2, 248, 1, 7, 6, 1, 115, 2, 231, 232, 7, 4,
- 1, 115, 2, 231, 232, 7, 6, 1, 115, 2, 251, 146, 7, 4, 1, 115, 2, 251,
- 146, 7, 6, 1, 115, 2, 226, 224, 7, 4, 1, 115, 2, 226, 224, 7, 6, 1, 251,
- 67, 2, 142, 7, 4, 1, 251, 67, 2, 142, 7, 6, 1, 251, 67, 2, 250, 30, 7, 4,
- 1, 251, 67, 2, 250, 30, 7, 6, 1, 251, 67, 2, 59, 48, 7, 4, 1, 251, 67, 2,
- 59, 48, 7, 6, 1, 251, 67, 2, 250, 234, 7, 4, 1, 251, 67, 2, 250, 234, 7,
- 6, 1, 249, 61, 2, 250, 234, 7, 4, 1, 249, 61, 2, 250, 234, 7, 6, 1, 249,
- 61, 2, 91, 7, 4, 1, 249, 61, 2, 91, 7, 6, 1, 160, 2, 231, 232, 7, 4, 1,
- 160, 2, 231, 232, 7, 6, 1, 160, 2, 251, 146, 7, 4, 1, 160, 2, 251, 146,
- 7, 6, 1, 160, 2, 59, 48, 7, 4, 1, 160, 2, 59, 48, 7, 6, 1, 160, 2, 226,
- 224, 7, 4, 1, 160, 2, 226, 224, 7, 6, 1, 160, 2, 250, 234, 7, 4, 1, 160,
- 2, 250, 234, 7, 6, 1, 243, 203, 2, 250, 30, 7, 4, 1, 243, 203, 2, 250,
- 30, 7, 6, 1, 243, 203, 2, 251, 146, 7, 4, 1, 243, 203, 2, 251, 146, 7, 6,
- 1, 243, 203, 2, 59, 48, 7, 4, 1, 243, 203, 2, 59, 48, 7, 6, 1, 243, 203,
- 2, 250, 183, 7, 4, 1, 243, 203, 2, 250, 183, 7, 6, 1, 242, 61, 2, 250,
- 30, 7, 4, 1, 242, 61, 2, 250, 30, 7, 6, 1, 242, 61, 2, 91, 7, 4, 1, 242,
- 61, 2, 91, 7, 6, 1, 240, 154, 2, 182, 7, 4, 1, 240, 154, 2, 182, 7, 6, 1,
- 240, 154, 2, 231, 232, 7, 4, 1, 240, 154, 2, 231, 232, 7, 6, 1, 240, 154,
- 2, 251, 146, 7, 4, 1, 240, 154, 2, 251, 146, 7, 6, 1, 240, 154, 2, 226,
- 224, 7, 4, 1, 240, 154, 2, 226, 224, 7, 6, 1, 240, 154, 2, 59, 48, 7, 4,
- 1, 247, 119, 73, 7, 6, 27, 236, 31, 7, 4, 27, 236, 31, 7, 6, 1, 235, 145,
- 2, 250, 30, 7, 4, 1, 235, 145, 2, 250, 30, 7, 6, 1, 235, 24, 2, 250, 183,
- 7, 4, 1, 235, 24, 2, 250, 183, 7, 4, 1, 233, 239, 7, 6, 1, 233, 149, 2,
- 142, 7, 4, 1, 233, 149, 2, 142, 7, 6, 1, 233, 149, 2, 250, 183, 7, 4, 1,
- 233, 149, 2, 250, 183, 7, 6, 1, 233, 149, 2, 250, 234, 7, 4, 1, 233, 149,
- 2, 250, 234, 7, 6, 1, 233, 149, 2, 230, 224, 247, 120, 7, 4, 1, 233, 149,
- 2, 230, 224, 247, 120, 7, 6, 1, 233, 149, 2, 91, 7, 4, 1, 233, 149, 2,
- 91, 7, 6, 1, 230, 26, 2, 142, 7, 4, 1, 230, 26, 2, 142, 7, 6, 1, 230, 26,
- 2, 250, 183, 7, 4, 1, 230, 26, 2, 250, 183, 7, 6, 1, 230, 26, 2, 250,
- 234, 7, 4, 1, 230, 26, 2, 250, 234, 7, 4, 1, 230, 26, 224, 204, 251, 78,
- 254, 57, 7, 6, 1, 245, 138, 7, 4, 1, 245, 138, 7, 6, 1, 144, 2, 231, 232,
- 7, 4, 1, 144, 2, 231, 232, 7, 6, 1, 144, 2, 251, 146, 7, 4, 1, 144, 2,
- 251, 146, 7, 6, 1, 144, 2, 52, 142, 7, 4, 1, 144, 2, 52, 142, 7, 6, 27,
- 226, 234, 7, 4, 27, 226, 234, 7, 6, 1, 223, 224, 2, 142, 7, 4, 1, 223,
- 224, 2, 142, 7, 6, 1, 223, 224, 2, 250, 183, 7, 4, 1, 223, 224, 2, 250,
- 183, 7, 6, 1, 223, 224, 2, 250, 234, 7, 4, 1, 223, 224, 2, 250, 234, 7,
- 6, 1, 222, 92, 2, 142, 7, 4, 1, 222, 92, 2, 142, 7, 6, 1, 222, 92, 2,
- 250, 30, 7, 4, 1, 222, 92, 2, 250, 30, 7, 6, 1, 222, 92, 2, 250, 183, 7,
- 4, 1, 222, 92, 2, 250, 183, 7, 6, 1, 222, 92, 2, 250, 234, 7, 4, 1, 222,
- 92, 2, 250, 234, 7, 6, 1, 217, 153, 2, 250, 183, 7, 4, 1, 217, 153, 2,
- 250, 183, 7, 6, 1, 217, 153, 2, 250, 234, 7, 4, 1, 217, 153, 2, 250, 234,
- 7, 6, 1, 217, 153, 2, 91, 7, 4, 1, 217, 153, 2, 91, 7, 6, 1, 104, 2, 182,
- 7, 4, 1, 104, 2, 182, 7, 6, 1, 104, 2, 231, 232, 7, 4, 1, 104, 2, 231,
- 232, 7, 6, 1, 104, 2, 251, 146, 7, 4, 1, 104, 2, 251, 146, 7, 6, 1, 104,
- 2, 222, 234, 48, 7, 4, 1, 104, 2, 222, 234, 48, 7, 6, 1, 104, 2, 52, 142,
- 7, 4, 1, 104, 2, 52, 142, 7, 6, 1, 104, 2, 226, 224, 7, 4, 1, 104, 2,
- 226, 224, 7, 6, 1, 212, 99, 2, 250, 30, 7, 4, 1, 212, 99, 2, 250, 30, 7,
- 6, 1, 211, 118, 2, 250, 30, 7, 4, 1, 211, 118, 2, 250, 30, 7, 6, 1, 211,
- 118, 2, 248, 1, 7, 6, 1, 210, 160, 2, 142, 7, 4, 1, 210, 160, 2, 142, 7,
- 6, 1, 210, 160, 2, 59, 48, 7, 4, 1, 210, 160, 2, 59, 48, 7, 6, 1, 210,
- 160, 2, 250, 234, 7, 4, 1, 210, 160, 2, 250, 234, 7, 4, 1, 199, 222, 91,
- 7, 4, 1, 57, 2, 91, 7, 6, 1, 57, 2, 103, 7, 6, 1, 57, 2, 216, 11, 7, 4,
- 1, 57, 2, 216, 11, 7, 6, 1, 138, 194, 7, 4, 1, 138, 194, 7, 6, 1, 204,
- 76, 7, 6, 1, 251, 67, 2, 103, 7, 4, 1, 251, 67, 2, 103, 7, 6, 1, 254,
- 219, 249, 60, 7, 6, 1, 249, 61, 2, 103, 7, 6, 1, 249, 61, 2, 216, 11, 7,
- 4, 1, 249, 61, 2, 216, 11, 7, 4, 1, 215, 94, 248, 54, 7, 6, 1, 223, 49,
- 75, 7, 6, 1, 221, 195, 7, 6, 1, 204, 75, 7, 6, 1, 245, 7, 2, 103, 7, 4,
- 1, 245, 7, 2, 103, 7, 6, 1, 243, 203, 2, 103, 7, 6, 1, 243, 107, 7, 4, 1,
- 240, 201, 7, 6, 1, 235, 185, 7, 6, 1, 240, 154, 2, 91, 7, 6, 1, 235, 24,
- 2, 103, 7, 4, 1, 235, 24, 2, 103, 7, 4, 1, 233, 149, 2, 130, 7, 4, 1,
- 233, 100, 2, 91, 7, 6, 1, 215, 94, 193, 7, 6, 1, 230, 26, 2, 43, 103, 7,
- 4, 1, 230, 26, 2, 199, 44, 233, 36, 7, 6, 1, 144, 2, 230, 224, 182, 7, 6,
- 1, 144, 2, 240, 248, 7, 4, 1, 144, 2, 240, 248, 7, 6, 1, 226, 219, 7, 4,
- 1, 226, 219, 7, 6, 1, 226, 106, 2, 103, 7, 4, 1, 226, 106, 2, 103, 7, 1,
- 210, 214, 7, 6, 1, 138, 105, 7, 4, 1, 138, 105, 7, 6, 1, 245, 75, 7, 1,
- 223, 49, 245, 76, 232, 123, 7, 4, 1, 217, 153, 2, 226, 66, 103, 7, 6, 1,
- 217, 153, 2, 103, 7, 4, 1, 217, 153, 2, 103, 7, 6, 1, 217, 153, 2, 223,
- 55, 103, 7, 6, 1, 104, 2, 240, 248, 7, 4, 1, 104, 2, 240, 248, 7, 6, 1,
- 214, 157, 7, 6, 1, 214, 106, 2, 103, 7, 6, 1, 211, 118, 2, 103, 7, 4, 1,
- 211, 118, 2, 103, 7, 6, 1, 210, 160, 2, 91, 7, 4, 1, 210, 160, 2, 91, 7,
- 6, 1, 245, 8, 7, 6, 1, 245, 9, 223, 48, 7, 4, 1, 245, 9, 223, 48, 7, 4,
- 1, 245, 9, 2, 217, 77, 7, 1, 113, 2, 91, 7, 6, 1, 138, 189, 7, 4, 1, 138,
- 189, 7, 1, 235, 193, 242, 180, 218, 130, 2, 91, 7, 1, 211, 181, 7, 1,
- 248, 47, 250, 11, 7, 1, 233, 77, 250, 11, 7, 1, 254, 137, 250, 11, 7, 1,
- 223, 55, 250, 11, 7, 6, 1, 246, 40, 2, 250, 234, 7, 6, 1, 249, 61, 2, 4,
- 1, 210, 160, 2, 250, 234, 7, 4, 1, 246, 40, 2, 250, 234, 7, 6, 1, 232,
- 188, 7, 6, 1, 233, 149, 2, 4, 1, 235, 144, 7, 4, 1, 232, 188, 7, 6, 1,
- 228, 186, 7, 6, 1, 230, 26, 2, 4, 1, 235, 144, 7, 4, 1, 228, 186, 7, 6,
- 1, 115, 2, 250, 234, 7, 4, 1, 115, 2, 250, 234, 7, 6, 1, 240, 154, 2,
- 250, 234, 7, 4, 1, 240, 154, 2, 250, 234, 7, 6, 1, 144, 2, 250, 234, 7,
- 4, 1, 144, 2, 250, 234, 7, 6, 1, 104, 2, 250, 234, 7, 4, 1, 104, 2, 250,
- 234, 7, 6, 1, 104, 2, 248, 2, 22, 231, 232, 7, 4, 1, 104, 2, 248, 2, 22,
- 231, 232, 7, 6, 1, 104, 2, 248, 2, 22, 142, 7, 4, 1, 104, 2, 248, 2, 22,
- 142, 7, 6, 1, 104, 2, 248, 2, 22, 250, 234, 7, 4, 1, 104, 2, 248, 2, 22,
- 250, 234, 7, 6, 1, 104, 2, 248, 2, 22, 242, 136, 7, 4, 1, 104, 2, 248, 2,
- 22, 242, 136, 7, 4, 1, 215, 94, 75, 7, 6, 1, 115, 2, 248, 2, 22, 231,
- 232, 7, 4, 1, 115, 2, 248, 2, 22, 231, 232, 7, 6, 1, 115, 2, 59, 77, 22,
- 231, 232, 7, 4, 1, 115, 2, 59, 77, 22, 231, 232, 7, 6, 1, 254, 244, 2,
- 231, 232, 7, 4, 1, 254, 244, 2, 231, 232, 7, 6, 1, 243, 203, 2, 91, 7, 4,
- 1, 243, 203, 2, 91, 7, 6, 1, 243, 203, 2, 250, 234, 7, 4, 1, 243, 203, 2,
- 250, 234, 7, 6, 1, 235, 24, 2, 250, 234, 7, 4, 1, 235, 24, 2, 250, 234,
- 7, 6, 1, 144, 2, 226, 224, 7, 4, 1, 144, 2, 226, 224, 7, 6, 1, 144, 2,
- 226, 225, 22, 231, 232, 7, 4, 1, 144, 2, 226, 225, 22, 231, 232, 7, 6, 1,
- 245, 9, 2, 250, 234, 7, 4, 1, 245, 9, 2, 250, 234, 7, 4, 1, 235, 145, 2,
- 250, 234, 7, 6, 1, 246, 39, 7, 6, 1, 249, 61, 2, 4, 1, 210, 159, 7, 4, 1,
- 246, 39, 7, 6, 1, 243, 203, 2, 142, 7, 4, 1, 243, 203, 2, 142, 7, 6, 1,
- 240, 199, 7, 6, 1, 211, 181, 7, 6, 1, 230, 26, 2, 242, 136, 7, 4, 1, 230,
- 26, 2, 242, 136, 7, 6, 1, 115, 2, 222, 234, 77, 22, 142, 7, 4, 1, 115, 2,
- 222, 234, 77, 22, 142, 7, 6, 1, 254, 244, 2, 142, 7, 4, 1, 254, 244, 2,
- 142, 7, 6, 1, 144, 2, 218, 103, 22, 142, 7, 4, 1, 144, 2, 218, 103, 22,
- 142, 7, 6, 1, 115, 2, 52, 242, 136, 7, 4, 1, 115, 2, 52, 242, 136, 7, 6,
- 1, 115, 2, 235, 193, 251, 146, 7, 4, 1, 115, 2, 235, 193, 251, 146, 7, 6,
- 1, 160, 2, 52, 242, 136, 7, 4, 1, 160, 2, 52, 242, 136, 7, 6, 1, 160, 2,
- 235, 193, 251, 146, 7, 4, 1, 160, 2, 235, 193, 251, 146, 7, 6, 1, 240,
- 154, 2, 52, 242, 136, 7, 4, 1, 240, 154, 2, 52, 242, 136, 7, 6, 1, 240,
- 154, 2, 235, 193, 251, 146, 7, 4, 1, 240, 154, 2, 235, 193, 251, 146, 7,
- 6, 1, 144, 2, 52, 242, 136, 7, 4, 1, 144, 2, 52, 242, 136, 7, 6, 1, 144,
- 2, 235, 193, 251, 146, 7, 4, 1, 144, 2, 235, 193, 251, 146, 7, 6, 1, 223,
- 224, 2, 52, 242, 136, 7, 4, 1, 223, 224, 2, 52, 242, 136, 7, 6, 1, 223,
- 224, 2, 235, 193, 251, 146, 7, 4, 1, 223, 224, 2, 235, 193, 251, 146, 7,
- 6, 1, 104, 2, 52, 242, 136, 7, 4, 1, 104, 2, 52, 242, 136, 7, 6, 1, 104,
- 2, 235, 193, 251, 146, 7, 4, 1, 104, 2, 235, 193, 251, 146, 7, 6, 1, 222,
- 92, 2, 249, 220, 51, 7, 4, 1, 222, 92, 2, 249, 220, 51, 7, 6, 1, 217,
- 153, 2, 249, 220, 51, 7, 4, 1, 217, 153, 2, 249, 220, 51, 7, 6, 1, 210,
- 231, 7, 4, 1, 210, 231, 7, 6, 1, 242, 61, 2, 250, 234, 7, 4, 1, 242, 61,
- 2, 250, 234, 7, 6, 1, 230, 26, 2, 199, 44, 233, 36, 7, 4, 1, 249, 61, 2,
- 249, 100, 7, 6, 1, 226, 134, 7, 4, 1, 226, 134, 7, 6, 1, 210, 160, 2,
- 103, 7, 4, 1, 210, 160, 2, 103, 7, 6, 1, 115, 2, 59, 48, 7, 4, 1, 115, 2,
- 59, 48, 7, 6, 1, 160, 2, 250, 183, 7, 4, 1, 160, 2, 250, 183, 7, 6, 1,
- 144, 2, 248, 2, 22, 231, 232, 7, 4, 1, 144, 2, 248, 2, 22, 231, 232, 7,
- 6, 1, 144, 2, 216, 89, 22, 231, 232, 7, 4, 1, 144, 2, 216, 89, 22, 231,
- 232, 7, 6, 1, 144, 2, 59, 48, 7, 4, 1, 144, 2, 59, 48, 7, 6, 1, 144, 2,
- 59, 77, 22, 231, 232, 7, 4, 1, 144, 2, 59, 77, 22, 231, 232, 7, 6, 1,
- 211, 118, 2, 231, 232, 7, 4, 1, 211, 118, 2, 231, 232, 7, 4, 1, 233, 149,
- 2, 249, 100, 7, 4, 1, 230, 26, 2, 249, 100, 7, 4, 1, 217, 153, 2, 249,
- 100, 7, 4, 1, 247, 119, 235, 144, 7, 4, 1, 248, 143, 247, 220, 7, 4, 1,
- 224, 31, 247, 220, 7, 6, 1, 115, 2, 91, 7, 6, 1, 251, 67, 2, 91, 7, 4, 1,
- 251, 67, 2, 91, 7, 6, 1, 233, 149, 2, 130, 7, 6, 1, 217, 153, 2, 247,
- 255, 91, 7, 4, 1, 222, 92, 2, 217, 250, 217, 77, 7, 4, 1, 210, 160, 2,
- 217, 250, 217, 77, 7, 6, 1, 242, 180, 218, 129, 7, 4, 1, 242, 180, 218,
- 129, 7, 6, 1, 57, 2, 91, 7, 6, 1, 104, 130, 7, 6, 1, 215, 94, 214, 105,
- 7, 6, 1, 160, 2, 91, 7, 4, 1, 160, 2, 91, 7, 6, 1, 235, 145, 2, 91, 7, 4,
- 1, 235, 145, 2, 91, 7, 6, 1, 4, 224, 97, 2, 241, 52, 217, 77, 7, 4, 1,
- 224, 97, 2, 241, 52, 217, 77, 7, 6, 1, 223, 224, 2, 91, 7, 4, 1, 223,
- 224, 2, 91, 7, 6, 1, 211, 118, 2, 91, 7, 4, 1, 211, 118, 2, 91, 7, 4, 1,
- 215, 94, 61, 7, 4, 1, 254, 143, 7, 4, 1, 215, 94, 254, 143, 7, 4, 1, 57,
- 2, 103, 7, 4, 1, 204, 76, 7, 4, 1, 251, 67, 2, 249, 100, 7, 4, 1, 249,
- 61, 2, 217, 77, 7, 4, 1, 249, 61, 2, 103, 7, 4, 1, 223, 49, 75, 7, 4, 1,
- 221, 195, 7, 4, 1, 221, 196, 2, 103, 7, 4, 1, 204, 75, 7, 4, 1, 223, 49,
- 204, 75, 7, 4, 1, 223, 49, 204, 160, 2, 103, 7, 4, 1, 250, 0, 223, 49,
- 204, 75, 7, 4, 1, 247, 119, 235, 145, 2, 91, 7, 4, 1, 243, 203, 2, 103,
- 7, 4, 1, 119, 243, 202, 7, 1, 4, 6, 243, 202, 7, 4, 1, 243, 107, 7, 4, 1,
- 223, 151, 240, 248, 7, 4, 1, 215, 94, 242, 60, 7, 4, 1, 242, 61, 2, 103,
- 7, 4, 1, 241, 208, 2, 103, 7, 4, 1, 240, 154, 2, 91, 7, 4, 1, 235, 185,
- 7, 1, 4, 6, 73, 7, 4, 1, 233, 149, 2, 230, 224, 182, 7, 4, 1, 233, 149,
- 2, 252, 41, 7, 4, 1, 233, 149, 2, 223, 55, 103, 7, 4, 1, 233, 1, 7, 4, 1,
- 215, 94, 193, 7, 4, 1, 215, 94, 232, 50, 2, 199, 233, 36, 7, 4, 1, 232,
- 50, 2, 103, 7, 4, 1, 230, 26, 2, 43, 103, 7, 4, 1, 230, 26, 2, 223, 55,
- 103, 7, 1, 4, 6, 230, 25, 7, 4, 1, 252, 134, 76, 7, 1, 4, 6, 226, 234, 7,
- 4, 1, 250, 0, 226, 201, 7, 4, 1, 225, 133, 7, 4, 1, 215, 94, 153, 7, 4,
- 1, 215, 94, 223, 224, 2, 199, 233, 36, 7, 4, 1, 215, 94, 223, 224, 2,
- 103, 7, 4, 1, 223, 224, 2, 199, 233, 36, 7, 4, 1, 223, 224, 2, 217, 77,
- 7, 4, 1, 223, 224, 2, 244, 87, 7, 4, 1, 223, 49, 223, 224, 2, 244, 87, 7,
- 1, 4, 6, 153, 7, 1, 4, 6, 235, 193, 153, 7, 4, 1, 222, 92, 2, 103, 7, 4,
- 1, 245, 75, 7, 4, 1, 247, 119, 235, 145, 2, 218, 103, 22, 103, 7, 4, 1,
- 218, 231, 223, 49, 245, 75, 7, 4, 1, 245, 76, 2, 249, 100, 7, 4, 1, 215,
- 94, 217, 152, 7, 4, 1, 217, 153, 2, 223, 55, 103, 7, 4, 1, 104, 130, 7,
- 4, 1, 214, 157, 7, 4, 1, 214, 106, 2, 103, 7, 4, 1, 215, 94, 214, 105, 7,
- 4, 1, 215, 94, 212, 98, 7, 4, 1, 215, 94, 211, 117, 7, 1, 4, 6, 211, 117,
- 7, 4, 1, 210, 160, 2, 223, 55, 103, 7, 4, 1, 210, 160, 2, 249, 100, 7, 4,
- 1, 245, 8, 7, 4, 1, 245, 9, 2, 249, 100, 7, 1, 242, 180, 218, 129, 7, 1,
- 225, 139, 213, 135, 243, 249, 7, 1, 235, 193, 242, 180, 218, 129, 7, 1,
- 218, 110, 251, 66, 7, 1, 251, 246, 250, 11, 7, 1, 4, 6, 253, 158, 7, 4,
- 1, 250, 0, 204, 75, 7, 1, 4, 6, 243, 203, 2, 103, 7, 1, 4, 6, 242, 60, 7,
- 4, 1, 235, 145, 2, 249, 127, 7, 4, 1, 215, 94, 235, 23, 7, 1, 4, 6, 156,
- 7, 4, 1, 224, 97, 2, 103, 7, 1, 242, 180, 218, 130, 2, 91, 7, 1, 223, 49,
- 242, 180, 218, 130, 2, 91, 7, 4, 1, 246, 40, 247, 220, 7, 4, 1, 248, 26,
- 247, 220, 7, 4, 1, 246, 40, 247, 221, 2, 249, 100, 7, 4, 1, 215, 185,
- 247, 220, 7, 4, 1, 216, 235, 247, 220, 7, 4, 1, 217, 29, 247, 221, 2,
- 249, 100, 7, 4, 1, 244, 134, 247, 220, 7, 4, 1, 232, 100, 247, 220, 7, 4,
- 1, 232, 51, 247, 220, 7, 1, 251, 246, 225, 181, 7, 1, 251, 254, 225, 181,
- 7, 4, 1, 215, 94, 242, 61, 2, 244, 87, 7, 4, 1, 215, 94, 242, 61, 2, 244,
- 88, 22, 217, 77, 58, 1, 4, 242, 60, 58, 1, 4, 242, 61, 2, 103, 58, 1, 4,
- 235, 144, 58, 1, 4, 153, 58, 1, 4, 215, 94, 153, 58, 1, 4, 215, 94, 223,
- 224, 2, 103, 58, 1, 4, 6, 235, 193, 153, 58, 1, 4, 212, 98, 58, 1, 4,
- 211, 117, 58, 1, 224, 190, 58, 1, 52, 224, 190, 58, 1, 215, 94, 249, 219,
- 58, 1, 254, 57, 58, 1, 223, 49, 249, 219, 58, 1, 44, 163, 222, 233, 58,
- 1, 43, 163, 222, 233, 58, 1, 242, 180, 218, 129, 58, 1, 223, 49, 242,
- 180, 218, 129, 58, 1, 43, 253, 249, 58, 1, 44, 253, 249, 58, 1, 120, 253,
- 249, 58, 1, 124, 253, 249, 58, 1, 250, 31, 255, 14, 250, 234, 58, 1, 67,
- 232, 213, 58, 1, 231, 232, 58, 1, 255, 3, 255, 14, 58, 1, 242, 137, 255,
- 14, 58, 1, 121, 67, 232, 213, 58, 1, 121, 231, 232, 58, 1, 121, 242, 137,
- 255, 14, 58, 1, 121, 255, 3, 255, 14, 58, 1, 215, 222, 249, 226, 58, 1,
- 163, 215, 222, 249, 226, 58, 1, 250, 173, 44, 163, 222, 233, 58, 1, 250,
- 173, 43, 163, 222, 233, 58, 1, 120, 217, 87, 58, 1, 124, 217, 87, 58, 1,
- 96, 50, 58, 1, 230, 182, 50, 251, 146, 59, 48, 222, 234, 48, 226, 224, 4,
- 182, 52, 255, 3, 255, 14, 58, 1, 223, 36, 103, 58, 1, 249, 131, 255, 14,
- 58, 1, 4, 243, 107, 58, 1, 4, 156, 58, 1, 4, 222, 91, 58, 1, 4, 211, 178,
- 58, 1, 4, 223, 49, 242, 180, 218, 129, 58, 1, 245, 20, 138, 130, 58, 1,
- 125, 138, 130, 58, 1, 230, 225, 138, 130, 58, 1, 121, 138, 130, 58, 1,
- 245, 19, 138, 130, 58, 1, 210, 254, 248, 44, 138, 78, 58, 1, 211, 70,
- 248, 44, 138, 78, 58, 1, 213, 133, 58, 1, 214, 186, 58, 1, 52, 254, 57,
- 58, 1, 121, 124, 253, 249, 58, 1, 121, 120, 253, 249, 58, 1, 121, 43,
- 253, 249, 58, 1, 121, 44, 253, 249, 58, 1, 121, 222, 233, 58, 1, 230,
- 224, 242, 137, 255, 14, 58, 1, 230, 224, 52, 242, 137, 255, 14, 58, 1,
- 230, 224, 52, 255, 3, 255, 14, 58, 1, 121, 182, 58, 1, 223, 157, 249,
- 226, 58, 1, 252, 58, 125, 216, 30, 58, 1, 245, 143, 125, 216, 30, 58, 1,
- 252, 58, 121, 216, 30, 58, 1, 245, 143, 121, 216, 30, 58, 1, 220, 54, 58,
- 1, 204, 220, 54, 58, 1, 121, 43, 74, 38, 242, 137, 255, 14, 38, 255, 3,
- 255, 14, 38, 250, 31, 255, 14, 38, 182, 38, 231, 232, 38, 226, 119, 38,
- 251, 146, 38, 59, 48, 38, 248, 1, 38, 241, 52, 48, 38, 222, 234, 48, 38,
- 52, 255, 3, 255, 14, 38, 250, 234, 38, 67, 232, 214, 48, 38, 52, 67, 232,
- 214, 48, 38, 52, 242, 137, 255, 14, 38, 250, 255, 38, 235, 193, 251, 146,
- 38, 215, 94, 249, 220, 48, 38, 249, 220, 48, 38, 223, 49, 249, 220, 48,
- 38, 249, 220, 77, 222, 251, 38, 242, 137, 255, 15, 51, 38, 255, 3, 255,
- 15, 51, 38, 43, 217, 88, 51, 38, 44, 217, 88, 51, 38, 43, 254, 110, 48,
- 38, 240, 248, 38, 43, 163, 222, 234, 51, 38, 120, 217, 88, 51, 38, 124,
- 217, 88, 51, 38, 96, 5, 51, 38, 230, 182, 5, 51, 38, 226, 64, 241, 52,
- 51, 38, 223, 55, 241, 52, 51, 38, 59, 51, 38, 248, 2, 51, 38, 222, 234,
- 51, 38, 249, 220, 51, 38, 250, 183, 38, 226, 224, 38, 67, 232, 214, 51,
- 38, 251, 140, 51, 38, 235, 193, 52, 254, 24, 51, 38, 250, 235, 51, 38,
- 250, 31, 255, 15, 51, 38, 251, 147, 51, 38, 235, 193, 251, 147, 51, 38,
- 216, 89, 51, 38, 231, 233, 51, 38, 121, 232, 213, 38, 52, 121, 232, 213,
- 38, 216, 89, 226, 120, 38, 219, 251, 218, 103, 226, 120, 38, 199, 218,
- 103, 226, 120, 38, 219, 251, 219, 47, 226, 120, 38, 199, 219, 47, 226,
- 120, 38, 44, 163, 222, 234, 51, 38, 235, 193, 251, 140, 51, 38, 42, 51,
- 38, 221, 180, 51, 38, 211, 179, 48, 38, 67, 182, 38, 52, 226, 119, 38,
- 242, 137, 138, 78, 38, 255, 3, 138, 78, 38, 26, 225, 175, 38, 26, 234, 2,
- 38, 26, 247, 252, 216, 18, 38, 26, 210, 219, 38, 251, 140, 48, 38, 245,
- 98, 5, 51, 38, 52, 67, 232, 214, 51, 38, 43, 254, 110, 51, 38, 228, 52,
- 216, 89, 48, 38, 241, 58, 48, 38, 254, 148, 128, 216, 42, 48, 38, 43, 44,
- 80, 51, 38, 214, 153, 80, 51, 38, 242, 142, 235, 63, 38, 44, 253, 250,
- 48, 38, 43, 163, 222, 234, 48, 38, 244, 131, 38, 211, 179, 51, 38, 43,
- 253, 250, 51, 38, 44, 253, 250, 51, 38, 44, 253, 250, 22, 120, 253, 250,
- 51, 38, 44, 163, 222, 234, 48, 38, 59, 77, 222, 251, 38, 253, 217, 51,
- 38, 52, 222, 234, 51, 38, 210, 35, 48, 38, 52, 251, 147, 51, 38, 52, 251,
- 146, 38, 52, 231, 232, 38, 52, 231, 233, 51, 38, 52, 182, 38, 52, 235,
- 193, 251, 146, 38, 52, 97, 80, 51, 38, 7, 4, 1, 61, 38, 7, 4, 1, 75, 38,
- 7, 4, 1, 73, 38, 7, 4, 1, 76, 38, 7, 4, 1, 70, 38, 7, 4, 1, 251, 66, 38,
- 7, 4, 1, 249, 60, 38, 7, 4, 1, 242, 60, 38, 7, 4, 1, 193, 38, 7, 4, 1,
- 153, 38, 7, 4, 1, 217, 152, 38, 7, 4, 1, 214, 105, 38, 7, 4, 1, 211, 178,
- 26, 6, 1, 241, 196, 26, 4, 1, 241, 196, 26, 6, 1, 254, 23, 221, 246, 26,
- 4, 1, 254, 23, 221, 246, 26, 227, 198, 50, 26, 232, 108, 227, 198, 50,
- 26, 6, 1, 226, 51, 247, 227, 26, 4, 1, 226, 51, 247, 227, 26, 210, 219,
- 26, 4, 223, 49, 232, 83, 219, 178, 87, 26, 4, 246, 118, 232, 83, 219,
- 178, 87, 26, 4, 223, 49, 246, 118, 232, 83, 219, 178, 87, 26, 224, 13,
- 78, 26, 216, 18, 26, 247, 252, 216, 18, 26, 6, 1, 254, 144, 2, 216, 18,
- 26, 254, 97, 217, 2, 26, 6, 1, 245, 101, 2, 216, 18, 26, 6, 1, 245, 64,
- 2, 216, 18, 26, 6, 1, 235, 186, 2, 216, 18, 26, 6, 1, 226, 200, 2, 216,
- 18, 26, 6, 1, 214, 158, 2, 216, 18, 26, 6, 1, 226, 202, 2, 216, 18, 26,
- 4, 1, 235, 186, 2, 247, 252, 22, 216, 18, 26, 6, 1, 254, 143, 26, 6, 1,
- 252, 26, 26, 6, 1, 243, 107, 26, 6, 1, 248, 54, 26, 6, 1, 245, 100, 26,
- 6, 1, 210, 85, 26, 6, 1, 245, 63, 26, 6, 1, 216, 179, 26, 6, 1, 235, 185,
- 26, 6, 1, 234, 222, 26, 6, 1, 233, 98, 26, 6, 1, 230, 102, 26, 6, 1, 227,
- 237, 26, 6, 1, 211, 157, 26, 6, 1, 226, 199, 26, 6, 1, 225, 108, 26, 6,
- 1, 223, 37, 26, 6, 1, 219, 177, 26, 6, 1, 217, 41, 26, 6, 1, 214, 157,
- 26, 6, 1, 225, 133, 26, 6, 1, 250, 110, 26, 6, 1, 224, 161, 26, 6, 1,
- 226, 201, 26, 6, 1, 235, 186, 2, 247, 251, 26, 6, 1, 214, 158, 2, 247,
- 251, 26, 4, 1, 254, 144, 2, 216, 18, 26, 4, 1, 245, 101, 2, 216, 18, 26,
- 4, 1, 245, 64, 2, 216, 18, 26, 4, 1, 235, 186, 2, 216, 18, 26, 4, 1, 214,
- 158, 2, 247, 252, 22, 216, 18, 26, 4, 1, 254, 143, 26, 4, 1, 252, 26, 26,
- 4, 1, 243, 107, 26, 4, 1, 248, 54, 26, 4, 1, 245, 100, 26, 4, 1, 210, 85,
- 26, 4, 1, 245, 63, 26, 4, 1, 216, 179, 26, 4, 1, 235, 185, 26, 4, 1, 234,
- 222, 26, 4, 1, 233, 98, 26, 4, 1, 230, 102, 26, 4, 1, 227, 237, 26, 4, 1,
- 211, 157, 26, 4, 1, 226, 199, 26, 4, 1, 225, 108, 26, 4, 1, 223, 37, 26,
- 4, 1, 40, 219, 177, 26, 4, 1, 219, 177, 26, 4, 1, 217, 41, 26, 4, 1, 214,
- 157, 26, 4, 1, 225, 133, 26, 4, 1, 250, 110, 26, 4, 1, 224, 161, 26, 4,
- 1, 226, 201, 26, 4, 1, 235, 186, 2, 247, 251, 26, 4, 1, 214, 158, 2, 247,
- 251, 26, 4, 1, 226, 200, 2, 216, 18, 26, 4, 1, 214, 158, 2, 216, 18, 26,
- 4, 1, 226, 202, 2, 216, 18, 26, 6, 234, 247, 87, 26, 252, 27, 87, 26,
- 216, 180, 87, 26, 214, 158, 2, 241, 52, 87, 26, 214, 158, 2, 255, 3, 22,
- 241, 52, 87, 26, 214, 158, 2, 248, 2, 22, 241, 52, 87, 26, 225, 134, 87,
- 26, 225, 109, 87, 26, 234, 247, 87, 26, 1, 254, 23, 234, 6, 26, 4, 1,
- 254, 23, 234, 6, 26, 1, 218, 137, 26, 4, 1, 218, 137, 26, 1, 247, 227,
- 26, 4, 1, 247, 227, 26, 1, 234, 6, 26, 4, 1, 234, 6, 26, 1, 221, 246, 26,
- 4, 1, 221, 246, 81, 6, 1, 220, 55, 81, 4, 1, 220, 55, 81, 6, 1, 244, 140,
- 81, 4, 1, 244, 140, 81, 6, 1, 234, 117, 81, 4, 1, 234, 117, 81, 6, 1,
- 241, 45, 81, 4, 1, 241, 45, 81, 6, 1, 243, 102, 81, 4, 1, 243, 102, 81,
- 6, 1, 220, 22, 81, 4, 1, 220, 22, 81, 6, 1, 248, 69, 81, 4, 1, 248, 69,
- 26, 234, 223, 87, 26, 223, 38, 87, 26, 232, 83, 219, 178, 87, 26, 1, 210,
- 224, 26, 6, 216, 180, 87, 26, 232, 83, 245, 101, 87, 26, 223, 49, 232,
- 83, 245, 101, 87, 26, 6, 1, 220, 7, 26, 4, 1, 220, 7, 26, 6, 232, 83,
- 219, 178, 87, 26, 6, 1, 221, 243, 26, 4, 1, 221, 243, 26, 223, 38, 2,
- 218, 103, 87, 26, 6, 223, 49, 232, 83, 219, 178, 87, 26, 6, 246, 118,
- 232, 83, 219, 178, 87, 26, 6, 223, 49, 246, 118, 232, 83, 219, 178, 87,
- 33, 6, 1, 236, 61, 2, 242, 136, 33, 6, 1, 235, 189, 33, 6, 1, 247, 162,
- 33, 6, 1, 242, 187, 33, 6, 1, 214, 202, 236, 60, 33, 6, 1, 246, 36, 33,
- 6, 1, 251, 76, 73, 33, 6, 1, 211, 8, 33, 6, 1, 235, 126, 33, 6, 1, 232,
- 187, 33, 6, 1, 228, 178, 33, 6, 1, 215, 174, 33, 6, 1, 234, 48, 33, 6, 1,
- 240, 154, 2, 242, 136, 33, 6, 1, 219, 251, 70, 33, 6, 1, 246, 32, 33, 6,
- 1, 61, 33, 6, 1, 252, 75, 33, 6, 1, 213, 255, 33, 6, 1, 242, 236, 33, 6,
- 1, 248, 90, 33, 6, 1, 236, 60, 33, 6, 1, 210, 74, 33, 6, 1, 210, 94, 33,
- 6, 1, 73, 33, 6, 1, 219, 251, 73, 33, 6, 1, 176, 33, 6, 1, 245, 174, 33,
- 6, 1, 245, 159, 33, 6, 1, 245, 150, 33, 6, 1, 76, 33, 6, 1, 225, 221, 33,
- 6, 1, 245, 92, 33, 6, 1, 245, 82, 33, 6, 1, 217, 22, 33, 6, 1, 70, 33, 6,
- 1, 245, 202, 33, 6, 1, 162, 33, 6, 1, 215, 178, 33, 6, 1, 250, 131, 33,
- 6, 1, 220, 102, 33, 6, 1, 220, 65, 33, 6, 1, 242, 3, 50, 33, 6, 1, 211,
- 27, 33, 6, 1, 219, 52, 50, 33, 6, 1, 75, 33, 6, 1, 210, 212, 33, 6, 1,
- 191, 33, 4, 1, 61, 33, 4, 1, 252, 75, 33, 4, 1, 213, 255, 33, 4, 1, 242,
- 236, 33, 4, 1, 248, 90, 33, 4, 1, 236, 60, 33, 4, 1, 210, 74, 33, 4, 1,
- 210, 94, 33, 4, 1, 73, 33, 4, 1, 219, 251, 73, 33, 4, 1, 176, 33, 4, 1,
- 245, 174, 33, 4, 1, 245, 159, 33, 4, 1, 245, 150, 33, 4, 1, 76, 33, 4, 1,
- 225, 221, 33, 4, 1, 245, 92, 33, 4, 1, 245, 82, 33, 4, 1, 217, 22, 33, 4,
- 1, 70, 33, 4, 1, 245, 202, 33, 4, 1, 162, 33, 4, 1, 215, 178, 33, 4, 1,
- 250, 131, 33, 4, 1, 220, 102, 33, 4, 1, 220, 65, 33, 4, 1, 242, 3, 50,
- 33, 4, 1, 211, 27, 33, 4, 1, 219, 52, 50, 33, 4, 1, 75, 33, 4, 1, 210,
- 212, 33, 4, 1, 191, 33, 4, 1, 236, 61, 2, 242, 136, 33, 4, 1, 235, 189,
- 33, 4, 1, 247, 162, 33, 4, 1, 242, 187, 33, 4, 1, 214, 202, 236, 60, 33,
- 4, 1, 246, 36, 33, 4, 1, 251, 76, 73, 33, 4, 1, 211, 8, 33, 4, 1, 235,
- 126, 33, 4, 1, 232, 187, 33, 4, 1, 228, 178, 33, 4, 1, 215, 174, 33, 4,
- 1, 234, 48, 33, 4, 1, 240, 154, 2, 242, 136, 33, 4, 1, 219, 251, 70, 33,
- 4, 1, 246, 32, 33, 6, 1, 226, 201, 33, 4, 1, 226, 201, 33, 6, 1, 211, 59,
- 33, 4, 1, 211, 59, 33, 6, 1, 235, 183, 75, 33, 4, 1, 235, 183, 75, 33, 6,
- 1, 232, 192, 210, 183, 33, 4, 1, 232, 192, 210, 183, 33, 6, 1, 235, 183,
- 232, 192, 210, 183, 33, 4, 1, 235, 183, 232, 192, 210, 183, 33, 6, 1,
- 251, 249, 210, 183, 33, 4, 1, 251, 249, 210, 183, 33, 6, 1, 235, 183,
- 251, 249, 210, 183, 33, 4, 1, 235, 183, 251, 249, 210, 183, 33, 6, 1,
- 233, 233, 33, 4, 1, 233, 233, 33, 6, 1, 224, 161, 33, 4, 1, 224, 161, 33,
- 6, 1, 244, 82, 33, 4, 1, 244, 82, 33, 6, 1, 235, 146, 33, 4, 1, 235, 146,
- 33, 6, 1, 235, 147, 2, 52, 242, 137, 255, 14, 33, 4, 1, 235, 147, 2, 52,
- 242, 137, 255, 14, 33, 6, 1, 214, 205, 33, 4, 1, 214, 205, 33, 6, 1, 222,
- 185, 226, 201, 33, 4, 1, 222, 185, 226, 201, 33, 6, 1, 226, 202, 2, 216,
- 65, 33, 4, 1, 226, 202, 2, 216, 65, 33, 6, 1, 226, 140, 33, 4, 1, 226,
- 140, 33, 6, 1, 234, 6, 33, 4, 1, 234, 6, 33, 216, 146, 50, 38, 33, 216,
- 65, 38, 33, 226, 65, 38, 33, 248, 154, 225, 18, 38, 33, 224, 155, 225,
- 18, 38, 33, 225, 3, 38, 33, 240, 211, 216, 146, 50, 38, 33, 230, 191, 50,
- 33, 6, 1, 219, 251, 240, 154, 2, 217, 77, 33, 4, 1, 219, 251, 240, 154,
- 2, 217, 77, 33, 6, 1, 220, 146, 50, 33, 4, 1, 220, 146, 50, 33, 6, 1,
- 245, 93, 2, 216, 114, 33, 4, 1, 245, 93, 2, 216, 114, 33, 6, 1, 242, 237,
- 2, 214, 156, 33, 4, 1, 242, 237, 2, 214, 156, 33, 6, 1, 242, 237, 2, 91,
- 33, 4, 1, 242, 237, 2, 91, 33, 6, 1, 242, 237, 2, 230, 224, 103, 33, 4,
- 1, 242, 237, 2, 230, 224, 103, 33, 6, 1, 210, 75, 2, 248, 39, 33, 4, 1,
- 210, 75, 2, 248, 39, 33, 6, 1, 210, 95, 2, 248, 39, 33, 4, 1, 210, 95, 2,
- 248, 39, 33, 6, 1, 235, 13, 2, 248, 39, 33, 4, 1, 235, 13, 2, 248, 39,
- 33, 6, 1, 235, 13, 2, 67, 91, 33, 4, 1, 235, 13, 2, 67, 91, 33, 6, 1,
- 235, 13, 2, 91, 33, 4, 1, 235, 13, 2, 91, 33, 6, 1, 252, 124, 176, 33, 4,
- 1, 252, 124, 176, 33, 6, 1, 245, 151, 2, 248, 39, 33, 4, 1, 245, 151, 2,
- 248, 39, 33, 6, 27, 245, 151, 242, 236, 33, 4, 27, 245, 151, 242, 236,
- 33, 6, 1, 225, 222, 2, 230, 224, 103, 33, 4, 1, 225, 222, 2, 230, 224,
- 103, 33, 6, 1, 255, 20, 162, 33, 4, 1, 255, 20, 162, 33, 6, 1, 245, 83,
- 2, 248, 39, 33, 4, 1, 245, 83, 2, 248, 39, 33, 6, 1, 217, 23, 2, 248, 39,
- 33, 4, 1, 217, 23, 2, 248, 39, 33, 6, 1, 218, 121, 70, 33, 4, 1, 218,
- 121, 70, 33, 6, 1, 218, 121, 104, 2, 91, 33, 4, 1, 218, 121, 104, 2, 91,
- 33, 6, 1, 242, 49, 2, 248, 39, 33, 4, 1, 242, 49, 2, 248, 39, 33, 6, 27,
- 217, 23, 215, 178, 33, 4, 27, 217, 23, 215, 178, 33, 6, 1, 250, 132, 2,
- 248, 39, 33, 4, 1, 250, 132, 2, 248, 39, 33, 6, 1, 250, 132, 2, 67, 91,
- 33, 4, 1, 250, 132, 2, 67, 91, 33, 6, 1, 220, 33, 33, 4, 1, 220, 33, 33,
- 6, 1, 255, 20, 250, 131, 33, 4, 1, 255, 20, 250, 131, 33, 6, 1, 255, 20,
- 250, 132, 2, 248, 39, 33, 4, 1, 255, 20, 250, 132, 2, 248, 39, 33, 1,
- 226, 58, 33, 6, 1, 210, 75, 2, 251, 146, 33, 4, 1, 210, 75, 2, 251, 146,
- 33, 6, 1, 235, 13, 2, 103, 33, 4, 1, 235, 13, 2, 103, 33, 6, 1, 245, 175,
- 2, 217, 77, 33, 4, 1, 245, 175, 2, 217, 77, 33, 6, 1, 245, 151, 2, 103,
- 33, 4, 1, 245, 151, 2, 103, 33, 6, 1, 245, 151, 2, 217, 77, 33, 4, 1,
- 245, 151, 2, 217, 77, 33, 6, 1, 234, 127, 250, 131, 33, 4, 1, 234, 127,
- 250, 131, 33, 6, 1, 245, 160, 2, 217, 77, 33, 4, 1, 245, 160, 2, 217, 77,
- 33, 4, 1, 226, 58, 33, 6, 1, 115, 2, 251, 146, 33, 4, 1, 115, 2, 251,
- 146, 33, 6, 1, 115, 2, 248, 1, 33, 4, 1, 115, 2, 248, 1, 33, 6, 27, 115,
- 236, 60, 33, 4, 27, 115, 236, 60, 33, 6, 1, 236, 61, 2, 251, 146, 33, 4,
- 1, 236, 61, 2, 251, 146, 33, 6, 1, 221, 195, 33, 4, 1, 221, 195, 33, 6,
- 1, 221, 196, 2, 248, 1, 33, 4, 1, 221, 196, 2, 248, 1, 33, 6, 1, 210, 75,
- 2, 248, 1, 33, 4, 1, 210, 75, 2, 248, 1, 33, 6, 1, 210, 95, 2, 248, 1,
- 33, 4, 1, 210, 95, 2, 248, 1, 33, 6, 1, 255, 20, 246, 36, 33, 4, 1, 255,
- 20, 246, 36, 33, 6, 1, 240, 154, 2, 231, 232, 33, 4, 1, 240, 154, 2, 231,
- 232, 33, 6, 1, 240, 154, 2, 248, 1, 33, 4, 1, 240, 154, 2, 248, 1, 33, 6,
- 1, 144, 2, 248, 1, 33, 4, 1, 144, 2, 248, 1, 33, 6, 1, 252, 134, 76, 33,
- 4, 1, 252, 134, 76, 33, 6, 1, 252, 134, 144, 2, 248, 1, 33, 4, 1, 252,
- 134, 144, 2, 248, 1, 33, 6, 1, 160, 2, 248, 1, 33, 4, 1, 160, 2, 248, 1,
- 33, 6, 1, 104, 2, 231, 232, 33, 4, 1, 104, 2, 231, 232, 33, 6, 1, 104, 2,
- 248, 1, 33, 4, 1, 104, 2, 248, 1, 33, 6, 1, 104, 2, 52, 142, 33, 4, 1,
- 104, 2, 52, 142, 33, 6, 1, 250, 132, 2, 248, 1, 33, 4, 1, 250, 132, 2,
- 248, 1, 33, 6, 1, 242, 237, 2, 248, 39, 33, 4, 1, 242, 237, 2, 248, 39,
- 33, 6, 1, 211, 28, 2, 248, 1, 33, 4, 1, 211, 28, 2, 248, 1, 33, 6, 1,
- 242, 237, 2, 218, 103, 22, 103, 33, 4, 1, 242, 237, 2, 218, 103, 22, 103,
- 33, 6, 1, 242, 49, 2, 103, 33, 4, 1, 242, 49, 2, 103, 33, 6, 1, 242, 49,
- 2, 91, 33, 4, 1, 242, 49, 2, 91, 33, 6, 1, 234, 14, 248, 90, 33, 4, 1,
- 234, 14, 248, 90, 33, 6, 1, 234, 14, 247, 162, 33, 4, 1, 234, 14, 247,
- 162, 33, 6, 1, 234, 14, 210, 27, 33, 4, 1, 234, 14, 210, 27, 33, 6, 1,
- 234, 14, 246, 30, 33, 4, 1, 234, 14, 246, 30, 33, 6, 1, 234, 14, 232,
- 187, 33, 4, 1, 234, 14, 232, 187, 33, 6, 1, 234, 14, 228, 178, 33, 4, 1,
- 234, 14, 228, 178, 33, 6, 1, 234, 14, 219, 109, 33, 4, 1, 234, 14, 219,
- 109, 33, 6, 1, 234, 14, 216, 60, 33, 4, 1, 234, 14, 216, 60, 33, 6, 1,
- 223, 49, 210, 94, 33, 4, 1, 223, 49, 210, 94, 33, 6, 1, 245, 175, 2, 103,
- 33, 4, 1, 245, 175, 2, 103, 33, 6, 1, 232, 254, 33, 4, 1, 232, 254, 33,
- 6, 1, 223, 39, 33, 4, 1, 223, 39, 33, 6, 1, 211, 92, 33, 4, 1, 211, 92,
- 33, 6, 1, 224, 88, 33, 4, 1, 224, 88, 33, 6, 1, 212, 22, 33, 4, 1, 212,
- 22, 33, 6, 1, 254, 166, 176, 33, 4, 1, 254, 166, 176, 33, 6, 1, 245, 175,
- 2, 230, 224, 103, 33, 4, 1, 245, 175, 2, 230, 224, 103, 33, 6, 1, 245,
- 151, 2, 230, 224, 103, 33, 4, 1, 245, 151, 2, 230, 224, 103, 33, 6, 1,
- 225, 222, 2, 248, 39, 33, 4, 1, 225, 222, 2, 248, 39, 33, 6, 1, 220, 34,
- 2, 248, 39, 33, 4, 1, 220, 34, 2, 248, 39, 150, 6, 1, 253, 164, 150, 6,
- 1, 252, 39, 150, 6, 1, 242, 203, 150, 6, 1, 248, 221, 150, 6, 1, 245,
- 213, 150, 6, 1, 210, 116, 150, 6, 1, 245, 197, 150, 6, 1, 245, 65, 150,
- 6, 1, 111, 150, 6, 1, 210, 74, 150, 6, 1, 235, 227, 150, 6, 1, 232, 190,
- 150, 6, 1, 211, 160, 150, 6, 1, 251, 33, 150, 6, 1, 234, 165, 150, 6, 1,
- 241, 68, 150, 6, 1, 235, 141, 150, 6, 1, 242, 246, 150, 6, 1, 250, 126,
- 150, 6, 1, 231, 58, 150, 6, 1, 211, 8, 150, 6, 1, 228, 39, 150, 6, 1,
- 220, 102, 150, 6, 1, 213, 138, 150, 6, 1, 250, 157, 150, 6, 1, 225, 205,
- 150, 6, 1, 235, 110, 150, 6, 1, 205, 150, 6, 1, 221, 161, 150, 6, 1, 213,
- 179, 150, 6, 1, 216, 62, 150, 6, 1, 223, 95, 150, 6, 1, 249, 238, 150, 6,
- 1, 210, 249, 150, 6, 1, 225, 46, 150, 6, 1, 234, 176, 150, 6, 1, 226,
- 222, 150, 6, 1, 244, 142, 150, 58, 1, 43, 163, 222, 233, 150, 254, 57,
- 150, 245, 154, 78, 150, 245, 31, 78, 150, 249, 219, 150, 224, 13, 78,
- 150, 255, 21, 78, 150, 4, 1, 253, 164, 150, 4, 1, 252, 39, 150, 4, 1,
- 242, 203, 150, 4, 1, 248, 221, 150, 4, 1, 245, 213, 150, 4, 1, 210, 116,
- 150, 4, 1, 245, 197, 150, 4, 1, 245, 65, 150, 4, 1, 111, 150, 4, 1, 210,
- 74, 150, 4, 1, 235, 227, 150, 4, 1, 232, 190, 150, 4, 1, 211, 160, 150,
- 4, 1, 251, 33, 150, 4, 1, 234, 165, 150, 4, 1, 241, 68, 150, 4, 1, 235,
- 141, 150, 4, 1, 242, 246, 150, 4, 1, 250, 126, 150, 4, 1, 231, 58, 150,
- 4, 1, 211, 8, 150, 4, 1, 228, 39, 150, 4, 1, 220, 102, 150, 4, 1, 213,
- 138, 150, 4, 1, 250, 157, 150, 4, 1, 225, 205, 150, 4, 1, 235, 110, 150,
- 4, 1, 205, 150, 4, 1, 221, 161, 150, 4, 1, 213, 179, 150, 4, 1, 216, 62,
- 150, 4, 1, 223, 95, 150, 4, 1, 249, 238, 150, 4, 1, 210, 249, 150, 4, 1,
- 225, 46, 150, 4, 1, 234, 176, 150, 4, 1, 226, 222, 150, 4, 1, 244, 142,
- 150, 4, 27, 245, 214, 210, 249, 150, 243, 229, 218, 129, 150, 240, 168,
- 150, 246, 95, 50, 94, 255, 15, 245, 57, 94, 255, 15, 221, 162, 94, 255,
- 15, 220, 88, 94, 255, 15, 210, 104, 224, 71, 94, 255, 15, 210, 104, 243,
- 125, 94, 255, 15, 216, 75, 94, 255, 15, 223, 47, 94, 255, 15, 210, 103,
- 94, 255, 15, 225, 245, 94, 255, 15, 211, 20, 94, 255, 15, 216, 214, 94,
- 255, 15, 243, 41, 94, 255, 15, 243, 42, 230, 69, 94, 255, 15, 243, 39,
- 94, 255, 15, 224, 72, 226, 16, 94, 255, 15, 216, 253, 243, 56, 94, 255,
- 15, 225, 226, 94, 255, 15, 253, 200, 242, 41, 94, 255, 15, 230, 79, 94,
- 255, 15, 231, 208, 94, 255, 15, 231, 49, 94, 255, 15, 231, 50, 234, 177,
- 94, 255, 15, 248, 163, 94, 255, 15, 224, 83, 94, 255, 15, 216, 253, 224,
- 67, 94, 255, 15, 211, 30, 252, 40, 210, 230, 94, 255, 15, 226, 207, 94,
- 255, 15, 236, 19, 94, 255, 15, 248, 70, 94, 255, 15, 210, 33, 94, 164,
- 231, 143, 250, 35, 94, 225, 11, 220, 36, 94, 225, 11, 241, 250, 221, 162,
- 94, 225, 11, 241, 250, 225, 239, 94, 225, 11, 241, 250, 224, 76, 94, 225,
- 11, 241, 158, 94, 225, 11, 215, 176, 94, 225, 11, 221, 162, 94, 225, 11,
- 225, 239, 94, 225, 11, 224, 76, 94, 225, 11, 241, 61, 94, 225, 11, 241,
- 62, 241, 252, 31, 214, 3, 94, 225, 11, 224, 17, 94, 225, 11, 248, 208,
- 177, 231, 171, 94, 225, 11, 231, 38, 94, 224, 141, 231, 168, 94, 225, 11,
- 223, 169, 94, 224, 141, 225, 247, 94, 225, 11, 220, 21, 247, 120, 94,
- 225, 11, 219, 159, 247, 120, 94, 224, 141, 219, 53, 225, 241, 94, 164,
- 214, 160, 247, 120, 94, 164, 232, 108, 247, 120, 94, 224, 141, 227, 195,
- 242, 40, 94, 225, 11, 224, 77, 224, 71, 94, 1, 254, 170, 94, 1, 252, 28,
- 94, 1, 242, 201, 94, 1, 248, 189, 94, 1, 241, 238, 94, 1, 214, 3, 94, 1,
- 210, 97, 94, 1, 241, 197, 94, 1, 216, 230, 94, 1, 210, 233, 94, 1, 40,
- 234, 250, 94, 1, 234, 250, 94, 1, 233, 94, 94, 1, 40, 231, 65, 94, 1,
- 231, 65, 94, 1, 40, 227, 194, 94, 1, 227, 194, 94, 1, 221, 249, 94, 1,
- 253, 162, 94, 1, 40, 225, 221, 94, 1, 225, 221, 94, 1, 40, 215, 179, 94,
- 1, 215, 179, 94, 1, 224, 39, 94, 1, 223, 67, 94, 1, 220, 20, 94, 1, 217,
- 38, 94, 27, 211, 6, 52, 214, 3, 94, 27, 211, 6, 214, 4, 210, 233, 94, 27,
- 211, 6, 52, 210, 233, 94, 224, 141, 243, 41, 94, 224, 141, 243, 39, 10,
- 54, 50, 10, 5, 221, 242, 10, 244, 30, 231, 154, 10, 5, 222, 23, 10, 5,
- 221, 245, 254, 37, 249, 109, 222, 193, 254, 37, 244, 4, 222, 193, 10,
- 223, 134, 254, 37, 225, 183, 230, 193, 50, 254, 37, 225, 183, 216, 248,
- 216, 148, 50, 254, 221, 50, 10, 249, 219, 10, 248, 150, 220, 137, 10,
- 225, 13, 213, 241, 50, 10, 5, 230, 174, 10, 5, 222, 3, 254, 172, 212, 45,
- 10, 5, 254, 172, 253, 221, 10, 5, 223, 167, 254, 171, 10, 5, 223, 175,
- 254, 152, 254, 104, 10, 5, 217, 70, 10, 4, 125, 217, 80, 10, 4, 125, 27,
- 112, 2, 233, 103, 2, 211, 43, 10, 4, 125, 210, 108, 10, 4, 244, 165, 10,
- 4, 248, 184, 10, 4, 234, 205, 10, 220, 150, 10, 215, 211, 59, 224, 141,
- 78, 10, 224, 13, 78, 10, 1, 234, 209, 211, 43, 10, 1, 242, 19, 10, 1,
- 112, 2, 231, 228, 48, 10, 1, 112, 2, 202, 48, 10, 1, 212, 31, 2, 202, 48,
- 10, 1, 112, 2, 202, 51, 10, 1, 79, 2, 202, 48, 10, 1, 254, 170, 10, 1,
- 252, 54, 10, 1, 217, 8, 231, 164, 10, 1, 217, 7, 10, 1, 216, 192, 10, 1,
- 235, 123, 10, 1, 242, 37, 10, 1, 234, 129, 10, 1, 248, 195, 10, 1, 216,
- 202, 10, 1, 223, 95, 10, 1, 210, 108, 10, 1, 221, 166, 10, 1, 220, 59,
- 10, 1, 222, 26, 10, 1, 248, 216, 10, 1, 217, 80, 10, 1, 210, 111, 10, 1,
- 254, 196, 10, 1, 242, 244, 10, 1, 234, 175, 2, 113, 170, 48, 10, 1, 234,
- 175, 2, 134, 170, 51, 10, 1, 244, 168, 79, 2, 235, 193, 214, 105, 10, 1,
- 244, 168, 79, 2, 113, 170, 48, 10, 1, 244, 168, 79, 2, 134, 170, 48, 10,
- 217, 43, 10, 1, 244, 142, 10, 1, 224, 81, 10, 1, 234, 250, 10, 1, 233,
- 102, 10, 1, 231, 78, 10, 1, 228, 62, 10, 1, 241, 218, 10, 1, 212, 30, 10,
- 1, 112, 231, 192, 10, 1, 211, 43, 10, 244, 163, 10, 248, 182, 10, 234,
- 203, 10, 244, 165, 10, 248, 184, 10, 234, 205, 10, 220, 93, 10, 218, 45,
- 10, 231, 226, 48, 10, 202, 48, 10, 202, 51, 10, 218, 65, 254, 170, 10,
- 235, 193, 248, 184, 10, 164, 228, 63, 242, 218, 10, 209, 255, 10, 25, 5,
- 4, 214, 106, 48, 10, 25, 5, 235, 193, 4, 214, 106, 48, 10, 25, 5, 59, 51,
- 10, 223, 49, 248, 184, 10, 244, 166, 2, 113, 247, 118, 10, 212, 32, 202,
- 51, 254, 37, 21, 210, 86, 254, 37, 21, 110, 254, 37, 21, 105, 254, 37,
- 21, 158, 254, 37, 21, 161, 254, 37, 21, 189, 254, 37, 21, 194, 254, 37,
- 21, 198, 254, 37, 21, 195, 254, 37, 21, 200, 10, 225, 182, 50, 10, 248,
- 83, 220, 137, 10, 216, 146, 220, 137, 10, 244, 81, 225, 9, 218, 156, 10,
- 1, 247, 119, 252, 54, 10, 1, 247, 119, 224, 81, 10, 1, 218, 23, 254, 170,
- 10, 1, 112, 212, 46, 10, 1, 112, 2, 212, 32, 202, 48, 10, 1, 112, 2, 212,
- 32, 202, 51, 10, 1, 125, 242, 19, 10, 1, 125, 202, 254, 170, 10, 1, 125,
- 202, 212, 30, 10, 1, 104, 2, 202, 48, 10, 1, 125, 202, 211, 43, 10, 1,
- 215, 148, 10, 1, 215, 146, 10, 1, 252, 64, 10, 1, 217, 8, 2, 222, 233,
- 10, 1, 217, 8, 2, 134, 170, 77, 246, 103, 10, 1, 225, 205, 10, 1, 217, 5,
- 10, 1, 252, 52, 10, 1, 122, 2, 202, 48, 10, 1, 122, 2, 113, 170, 67, 48,
- 10, 1, 227, 153, 10, 1, 246, 43, 10, 1, 122, 2, 134, 170, 48, 10, 1, 217,
- 26, 10, 1, 217, 24, 10, 1, 248, 130, 10, 1, 248, 196, 2, 222, 233, 10, 1,
- 248, 196, 2, 59, 51, 10, 1, 248, 196, 2, 59, 252, 43, 22, 4, 217, 80, 10,
- 1, 248, 201, 10, 1, 248, 132, 10, 1, 246, 70, 10, 1, 248, 196, 2, 134,
- 170, 77, 246, 103, 10, 1, 248, 196, 2, 244, 11, 170, 48, 10, 1, 222, 171,
- 10, 1, 223, 96, 2, 4, 214, 105, 10, 1, 223, 96, 2, 222, 233, 10, 1, 223,
- 96, 2, 59, 51, 10, 1, 223, 96, 2, 4, 214, 106, 51, 10, 1, 223, 96, 2, 59,
- 252, 43, 22, 59, 48, 10, 1, 223, 96, 2, 113, 170, 48, 10, 1, 235, 120,
- 10, 1, 223, 96, 2, 244, 11, 170, 48, 10, 1, 221, 167, 2, 59, 252, 43, 22,
- 59, 48, 10, 1, 221, 167, 2, 134, 170, 51, 10, 1, 221, 167, 2, 134, 170,
- 252, 43, 22, 134, 170, 48, 10, 1, 222, 27, 2, 113, 170, 51, 10, 1, 222,
- 27, 2, 134, 170, 48, 10, 1, 217, 81, 2, 134, 170, 48, 10, 1, 254, 197, 2,
- 134, 170, 48, 10, 1, 247, 119, 244, 142, 10, 1, 244, 143, 2, 59, 230,
- 109, 51, 10, 1, 244, 143, 2, 59, 51, 10, 1, 213, 248, 10, 1, 244, 143, 2,
- 134, 170, 51, 10, 1, 225, 203, 10, 1, 224, 82, 2, 59, 48, 10, 1, 224, 82,
- 2, 134, 170, 48, 10, 1, 234, 174, 10, 1, 217, 250, 234, 250, 10, 1, 234,
- 251, 2, 222, 233, 10, 1, 234, 251, 2, 59, 48, 10, 1, 229, 79, 10, 1, 234,
- 251, 2, 134, 170, 51, 10, 1, 243, 122, 10, 1, 243, 123, 2, 222, 233, 10,
- 1, 229, 2, 10, 1, 243, 123, 2, 113, 170, 51, 10, 1, 242, 101, 10, 1, 243,
- 123, 2, 134, 170, 48, 10, 1, 233, 103, 2, 4, 214, 105, 10, 1, 233, 103,
- 2, 59, 48, 10, 1, 233, 103, 2, 134, 170, 48, 10, 1, 233, 103, 2, 134,
- 170, 51, 10, 1, 228, 63, 2, 59, 51, 10, 1, 228, 63, 242, 218, 10, 1, 222,
- 214, 10, 1, 228, 63, 2, 222, 233, 10, 1, 228, 63, 2, 134, 170, 48, 10, 1,
- 241, 219, 247, 141, 10, 1, 217, 27, 2, 59, 48, 10, 1, 241, 219, 2, 79,
- 48, 10, 1, 241, 219, 242, 171, 10, 1, 241, 219, 242, 172, 2, 202, 48, 10,
- 1, 217, 8, 231, 165, 242, 171, 10, 1, 212, 31, 2, 222, 233, 10, 1, 234,
- 73, 226, 234, 10, 1, 226, 234, 10, 1, 70, 10, 1, 210, 212, 10, 1, 234,
- 73, 210, 212, 10, 1, 212, 31, 2, 113, 170, 48, 10, 1, 213, 255, 10, 1,
- 244, 168, 211, 43, 10, 1, 79, 2, 217, 77, 10, 1, 79, 2, 4, 214, 105, 10,
- 1, 212, 31, 2, 59, 48, 10, 1, 75, 10, 1, 79, 2, 134, 170, 51, 10, 1, 79,
- 252, 132, 10, 1, 79, 252, 133, 2, 202, 48, 10, 243, 229, 218, 129, 10, 1,
- 254, 243, 10, 4, 125, 27, 222, 27, 2, 233, 103, 2, 112, 231, 192, 10, 4,
- 125, 27, 224, 82, 2, 233, 103, 2, 112, 231, 192, 10, 4, 125, 66, 65, 17,
- 10, 4, 125, 233, 103, 254, 170, 10, 4, 125, 235, 123, 10, 4, 125, 134,
- 247, 118, 10, 4, 125, 221, 166, 10, 245, 143, 64, 253, 166, 10, 218, 152,
- 64, 222, 138, 245, 175, 241, 155, 10, 4, 125, 222, 183, 210, 86, 10, 4,
- 125, 214, 159, 223, 115, 210, 86, 10, 4, 125, 247, 119, 241, 236, 64,
- 234, 129, 10, 4, 125, 66, 53, 17, 10, 4, 121, 221, 166, 10, 4, 125, 231,
- 227, 10, 4, 212, 30, 10, 4, 211, 43, 10, 4, 125, 211, 43, 10, 4, 125,
- 228, 62, 10, 225, 41, 64, 222, 13, 10, 245, 152, 250, 175, 121, 218, 129,
- 10, 245, 152, 250, 175, 125, 218, 129, 10, 222, 183, 125, 218, 130, 2,
- 244, 104, 250, 174, 10, 4, 121, 231, 78, 10, 1, 248, 196, 2, 235, 193,
- 214, 105, 10, 1, 223, 96, 2, 235, 193, 214, 105, 245, 22, 254, 37, 21,
- 210, 86, 245, 22, 254, 37, 21, 110, 245, 22, 254, 37, 21, 105, 245, 22,
- 254, 37, 21, 158, 245, 22, 254, 37, 21, 161, 245, 22, 254, 37, 21, 189,
- 245, 22, 254, 37, 21, 194, 245, 22, 254, 37, 21, 198, 245, 22, 254, 37,
- 21, 195, 245, 22, 254, 37, 21, 200, 10, 1, 220, 60, 2, 59, 51, 10, 1,
- 248, 217, 2, 59, 51, 10, 1, 242, 245, 2, 59, 51, 10, 5, 219, 158, 254,
- 126, 10, 5, 219, 158, 224, 235, 231, 58, 10, 1, 241, 219, 2, 235, 193,
- 214, 105, 188, 245, 143, 64, 226, 14, 188, 218, 19, 243, 229, 218, 129,
- 188, 218, 67, 243, 229, 218, 129, 188, 218, 19, 249, 226, 188, 218, 67,
- 249, 226, 188, 203, 249, 226, 188, 249, 227, 219, 106, 233, 46, 188, 249,
- 227, 219, 106, 222, 251, 188, 218, 19, 249, 227, 219, 106, 233, 46, 188,
- 218, 67, 249, 227, 219, 106, 222, 251, 188, 249, 180, 188, 242, 1, 226,
- 250, 188, 242, 1, 231, 36, 188, 242, 1, 253, 218, 188, 255, 21, 78, 188,
- 1, 254, 174, 188, 1, 218, 23, 254, 174, 188, 1, 252, 25, 188, 1, 243,
- 113, 188, 1, 243, 114, 243, 91, 188, 1, 248, 192, 188, 1, 247, 119, 248,
- 193, 222, 229, 188, 1, 241, 238, 188, 1, 212, 30, 188, 1, 210, 108, 188,
- 1, 241, 195, 188, 1, 216, 226, 188, 1, 216, 227, 243, 91, 188, 1, 210,
- 199, 188, 1, 210, 200, 241, 238, 188, 1, 234, 225, 188, 1, 233, 101, 188,
- 1, 230, 190, 188, 1, 227, 194, 188, 1, 220, 143, 188, 1, 40, 220, 143,
- 188, 1, 75, 188, 1, 225, 221, 188, 1, 223, 49, 225, 221, 188, 1, 222, 24,
- 188, 1, 224, 75, 188, 1, 222, 229, 188, 1, 220, 20, 188, 1, 217, 36, 188,
- 1, 225, 169, 252, 12, 188, 1, 225, 169, 242, 242, 188, 1, 225, 169, 248,
- 20, 188, 224, 151, 48, 188, 224, 151, 51, 188, 224, 151, 246, 117, 188,
- 210, 17, 48, 188, 210, 17, 51, 188, 210, 17, 246, 117, 188, 223, 131, 48,
- 188, 223, 131, 51, 188, 246, 118, 210, 24, 241, 44, 188, 246, 118, 210,
- 24, 254, 105, 188, 241, 241, 48, 188, 241, 241, 51, 188, 241, 240, 246,
- 117, 188, 245, 79, 48, 188, 245, 79, 51, 188, 222, 107, 188, 244, 136,
- 247, 120, 188, 223, 248, 188, 222, 134, 188, 113, 67, 170, 48, 188, 113,
- 67, 170, 51, 188, 134, 170, 48, 188, 134, 170, 51, 188, 226, 248, 232,
- 214, 48, 188, 226, 248, 232, 214, 51, 188, 230, 56, 188, 252, 131, 188,
- 1, 219, 49, 210, 80, 188, 1, 219, 49, 234, 122, 188, 1, 219, 49, 244,
- 154, 10, 1, 252, 55, 2, 134, 170, 240, 250, 51, 10, 1, 252, 55, 2, 59,
- 252, 43, 22, 134, 170, 48, 10, 1, 252, 55, 2, 134, 170, 225, 7, 214, 153,
- 51, 10, 1, 252, 55, 2, 134, 170, 225, 7, 214, 153, 252, 43, 22, 113, 170,
- 48, 10, 1, 252, 55, 2, 113, 170, 252, 43, 22, 59, 48, 10, 1, 252, 55, 2,
- 235, 193, 4, 214, 106, 51, 10, 1, 252, 55, 2, 4, 214, 105, 10, 1, 122, 2,
- 113, 170, 48, 10, 1, 122, 2, 134, 170, 225, 7, 214, 153, 51, 10, 1, 248,
- 196, 2, 113, 170, 213, 189, 252, 43, 22, 4, 217, 80, 10, 1, 248, 196, 2,
- 235, 193, 4, 214, 106, 51, 10, 1, 223, 96, 2, 91, 10, 1, 221, 167, 2,
- 244, 11, 170, 48, 10, 1, 254, 197, 2, 113, 170, 48, 10, 1, 254, 197, 2,
- 134, 170, 225, 7, 246, 104, 48, 10, 1, 254, 197, 2, 113, 170, 213, 189,
- 48, 10, 1, 244, 143, 2, 113, 170, 51, 10, 1, 244, 143, 2, 134, 170, 225,
- 7, 214, 153, 51, 10, 1, 234, 175, 2, 59, 48, 10, 1, 234, 175, 2, 134,
- 170, 48, 10, 1, 234, 175, 2, 134, 170, 225, 7, 214, 153, 51, 10, 1, 66,
- 2, 59, 48, 10, 1, 66, 2, 59, 51, 10, 1, 228, 63, 2, 113, 170, 51, 10, 1,
- 228, 63, 2, 4, 217, 80, 10, 1, 228, 63, 2, 4, 214, 105, 10, 1, 233, 103,
- 2, 130, 10, 1, 223, 96, 2, 113, 170, 213, 189, 48, 10, 1, 223, 96, 2,
- 202, 48, 10, 1, 221, 167, 2, 113, 170, 213, 189, 48, 10, 1, 122, 2, 4,
- 10, 1, 217, 81, 51, 10, 1, 122, 2, 4, 10, 1, 217, 81, 22, 113, 247, 118,
- 10, 1, 221, 167, 2, 4, 10, 1, 217, 81, 22, 113, 247, 118, 10, 1, 223, 96,
- 2, 4, 10, 1, 217, 81, 22, 113, 247, 118, 10, 1, 122, 2, 4, 10, 1, 217,
- 81, 48, 10, 1, 112, 2, 245, 22, 254, 37, 21, 113, 48, 10, 1, 112, 2, 245,
- 22, 254, 37, 21, 134, 48, 10, 1, 244, 168, 79, 2, 245, 22, 254, 37, 21,
- 113, 48, 10, 1, 244, 168, 79, 2, 245, 22, 254, 37, 21, 134, 48, 10, 1,
- 244, 168, 79, 2, 245, 22, 254, 37, 21, 244, 11, 51, 10, 1, 212, 31, 2,
- 245, 22, 254, 37, 21, 113, 48, 10, 1, 212, 31, 2, 245, 22, 254, 37, 21,
- 134, 48, 10, 1, 79, 252, 133, 2, 245, 22, 254, 37, 21, 113, 48, 10, 1,
- 79, 252, 133, 2, 245, 22, 254, 37, 21, 134, 48, 10, 1, 122, 2, 245, 22,
- 254, 37, 21, 244, 11, 51, 10, 1, 221, 167, 2, 245, 22, 254, 37, 21, 244,
- 11, 48, 10, 1, 221, 167, 2, 235, 193, 214, 105, 10, 1, 234, 251, 2, 113,
- 170, 48, 216, 205, 1, 242, 46, 216, 205, 1, 220, 68, 216, 205, 1, 228,
- 61, 216, 205, 1, 223, 184, 216, 205, 1, 252, 189, 216, 205, 1, 232, 251,
- 216, 205, 1, 235, 8, 216, 205, 1, 254, 159, 216, 205, 1, 214, 25, 216,
- 205, 1, 231, 77, 216, 205, 1, 244, 194, 216, 205, 1, 248, 23, 216, 205,
- 1, 216, 207, 216, 205, 1, 233, 131, 216, 205, 1, 243, 131, 216, 205, 1,
- 242, 177, 216, 205, 1, 221, 165, 216, 205, 1, 248, 148, 216, 205, 1, 210,
- 100, 216, 205, 1, 217, 37, 216, 205, 1, 211, 103, 216, 205, 1, 225, 233,
- 216, 205, 1, 235, 128, 216, 205, 1, 250, 134, 216, 205, 1, 215, 155, 216,
- 205, 1, 241, 188, 216, 205, 1, 234, 131, 216, 205, 1, 216, 206, 216, 205,
- 1, 210, 115, 216, 205, 1, 220, 58, 216, 205, 1, 222, 30, 216, 205, 1,
- 248, 219, 216, 205, 1, 111, 216, 205, 1, 210, 23, 216, 205, 1, 254, 193,
- 216, 205, 1, 242, 243, 216, 205, 1, 224, 85, 216, 205, 1, 212, 63, 216,
- 205, 255, 22, 216, 205, 255, 38, 216, 205, 240, 114, 216, 205, 245, 208,
- 216, 205, 214, 222, 216, 205, 226, 182, 216, 205, 245, 216, 216, 205,
- 245, 16, 216, 205, 226, 247, 216, 205, 226, 255, 216, 205, 218, 45, 216,
- 205, 1, 229, 225, 228, 137, 21, 210, 86, 228, 137, 21, 110, 228, 137, 21,
- 105, 228, 137, 21, 158, 228, 137, 21, 161, 228, 137, 21, 189, 228, 137,
- 21, 194, 228, 137, 21, 198, 228, 137, 21, 195, 228, 137, 21, 200, 228,
- 137, 1, 61, 228, 137, 1, 245, 209, 228, 137, 1, 73, 228, 137, 1, 75, 228,
- 137, 1, 70, 228, 137, 1, 226, 183, 228, 137, 1, 76, 228, 137, 1, 248,
- 209, 228, 137, 1, 230, 25, 228, 137, 1, 252, 191, 228, 137, 1, 190, 228,
- 137, 1, 217, 105, 228, 137, 1, 235, 141, 228, 137, 1, 250, 157, 228, 137,
- 1, 248, 221, 228, 137, 1, 205, 228, 137, 1, 222, 179, 228, 137, 1, 206,
- 228, 137, 1, 243, 79, 228, 137, 1, 244, 196, 228, 137, 1, 176, 228, 137,
- 1, 233, 135, 228, 137, 1, 229, 229, 211, 223, 228, 137, 1, 184, 228, 137,
- 1, 227, 165, 228, 137, 1, 197, 228, 137, 1, 162, 228, 137, 1, 212, 65,
- 228, 137, 1, 191, 228, 137, 1, 227, 166, 211, 223, 228, 137, 1, 235, 61,
- 235, 141, 228, 137, 1, 235, 61, 250, 157, 228, 137, 1, 235, 61, 205, 228,
- 137, 38, 219, 251, 125, 216, 30, 228, 137, 38, 219, 251, 121, 216, 30,
- 228, 137, 38, 219, 251, 222, 228, 216, 30, 228, 137, 38, 199, 248, 38,
- 216, 30, 228, 137, 38, 199, 125, 216, 30, 228, 137, 38, 199, 121, 216,
- 30, 228, 137, 38, 199, 222, 228, 216, 30, 228, 137, 38, 229, 193, 78,
- 228, 137, 38, 52, 59, 48, 228, 137, 125, 138, 254, 57, 228, 137, 121,
- 138, 254, 57, 228, 137, 16, 226, 184, 248, 50, 228, 137, 16, 243, 78,
- 228, 137, 249, 219, 228, 137, 245, 31, 78, 228, 137, 233, 108, 221, 252,
- 1, 254, 176, 221, 252, 1, 251, 228, 221, 252, 1, 243, 112, 221, 252, 1,
- 248, 194, 221, 252, 1, 235, 152, 221, 252, 1, 252, 189, 221, 252, 1, 210,
- 89, 221, 252, 1, 235, 160, 221, 252, 1, 216, 67, 221, 252, 1, 210, 182,
- 221, 252, 1, 235, 9, 221, 252, 1, 233, 128, 221, 252, 1, 230, 190, 221,
- 252, 1, 227, 194, 221, 252, 1, 219, 156, 221, 252, 1, 235, 255, 221, 252,
- 1, 244, 121, 221, 252, 1, 215, 181, 221, 252, 1, 224, 10, 221, 252, 1,
- 222, 229, 221, 252, 1, 220, 85, 221, 252, 1, 217, 100, 221, 252, 164,
- 235, 255, 221, 252, 164, 235, 254, 221, 252, 164, 226, 243, 221, 252,
- 164, 248, 207, 221, 252, 58, 1, 245, 105, 210, 182, 221, 252, 164, 245,
- 105, 210, 182, 221, 252, 25, 5, 199, 75, 221, 252, 25, 5, 75, 221, 252,
- 25, 5, 226, 118, 255, 73, 221, 252, 25, 5, 199, 255, 73, 221, 252, 25, 5,
- 255, 73, 221, 252, 25, 5, 226, 118, 61, 221, 252, 25, 5, 199, 61, 221,
- 252, 25, 5, 61, 221, 252, 58, 1, 219, 251, 61, 221, 252, 25, 5, 219, 251,
- 61, 221, 252, 25, 5, 199, 70, 221, 252, 25, 5, 70, 221, 252, 58, 1, 73,
- 221, 252, 25, 5, 199, 73, 221, 252, 25, 5, 73, 221, 252, 25, 5, 76, 221,
- 252, 25, 5, 218, 45, 221, 252, 164, 229, 92, 221, 252, 224, 141, 229, 92,
- 221, 252, 224, 141, 254, 218, 221, 252, 224, 141, 254, 114, 221, 252,
- 224, 141, 252, 114, 221, 252, 224, 141, 253, 201, 221, 252, 224, 141,
- 220, 8, 221, 252, 255, 21, 78, 221, 252, 224, 141, 231, 68, 224, 45, 221,
- 252, 224, 141, 210, 31, 221, 252, 224, 141, 224, 45, 221, 252, 224, 141,
- 210, 114, 221, 252, 224, 141, 215, 90, 221, 252, 224, 141, 254, 9, 221,
- 252, 224, 141, 219, 53, 231, 145, 221, 252, 224, 141, 254, 100, 231, 182,
- 1, 242, 24, 231, 182, 1, 255, 25, 231, 182, 1, 254, 216, 231, 182, 1,
- 254, 255, 231, 182, 1, 254, 209, 231, 182, 1, 214, 124, 231, 182, 1, 253,
- 160, 231, 182, 1, 235, 160, 231, 182, 1, 253, 198, 231, 182, 1, 254, 181,
- 231, 182, 1, 254, 186, 231, 182, 1, 254, 178, 231, 182, 1, 254, 136, 231,
- 182, 1, 254, 123, 231, 182, 1, 253, 237, 231, 182, 1, 235, 255, 231, 182,
- 1, 254, 72, 231, 182, 1, 253, 208, 231, 182, 1, 254, 45, 231, 182, 1,
- 254, 41, 231, 182, 1, 253, 231, 231, 182, 1, 253, 206, 231, 182, 1, 246,
- 55, 231, 182, 1, 235, 2, 231, 182, 1, 254, 196, 231, 182, 254, 222, 78,
- 231, 182, 213, 136, 78, 231, 182, 243, 53, 78, 231, 182, 224, 140, 10, 1,
- 252, 55, 2, 4, 214, 106, 51, 10, 1, 151, 2, 113, 170, 48, 10, 1, 217, 81,
- 2, 113, 170, 48, 10, 1, 244, 143, 2, 59, 252, 43, 22, 134, 170, 48, 10,
- 1, 224, 82, 2, 59, 51, 10, 1, 233, 103, 2, 52, 130, 10, 1, 66, 2, 134,
- 170, 48, 10, 1, 79, 2, 113, 170, 252, 43, 22, 202, 48, 10, 1, 79, 2, 113,
- 170, 252, 43, 22, 59, 48, 10, 1, 223, 96, 2, 232, 123, 10, 1, 212, 31, 2,
- 59, 211, 231, 10, 1, 222, 201, 211, 43, 10, 249, 99, 244, 165, 10, 249,
- 99, 248, 184, 10, 249, 99, 234, 205, 10, 249, 99, 244, 163, 10, 249, 99,
- 248, 182, 10, 249, 99, 234, 203, 10, 138, 123, 59, 48, 10, 138, 113, 170,
- 48, 10, 138, 232, 124, 48, 10, 138, 123, 59, 51, 10, 138, 113, 170, 51,
- 10, 138, 232, 124, 51, 10, 204, 244, 163, 10, 204, 248, 182, 10, 204,
- 234, 203, 10, 4, 125, 212, 30, 10, 244, 166, 2, 222, 233, 10, 244, 166,
- 2, 59, 48, 10, 234, 206, 2, 59, 51, 10, 43, 253, 250, 48, 10, 44, 253,
- 250, 48, 10, 43, 253, 250, 51, 10, 44, 253, 250, 51, 10, 52, 44, 253,
- 250, 48, 10, 52, 44, 253, 250, 77, 2, 247, 120, 10, 44, 253, 250, 77, 2,
- 247, 120, 10, 248, 185, 2, 247, 120, 84, 5, 235, 193, 250, 255, 84, 5,
- 250, 255, 84, 5, 254, 75, 84, 5, 213, 147, 84, 1, 219, 251, 61, 84, 1,
- 61, 84, 1, 255, 73, 84, 1, 73, 84, 1, 236, 33, 84, 1, 70, 84, 1, 214,
- 118, 84, 1, 149, 153, 84, 1, 149, 156, 84, 1, 251, 2, 75, 84, 1, 219,
- 251, 75, 84, 1, 75, 84, 1, 254, 201, 84, 1, 251, 2, 76, 84, 1, 219, 251,
- 76, 84, 1, 76, 84, 1, 253, 192, 84, 1, 176, 84, 1, 234, 132, 84, 1, 243,
- 135, 84, 1, 242, 249, 84, 1, 229, 77, 84, 1, 251, 33, 84, 1, 250, 157,
- 84, 1, 235, 141, 84, 1, 235, 114, 84, 1, 227, 165, 84, 1, 215, 156, 84,
- 1, 215, 144, 84, 1, 248, 135, 84, 1, 248, 119, 84, 1, 228, 110, 84, 1,
- 217, 105, 84, 1, 216, 208, 84, 1, 248, 221, 84, 1, 248, 25, 84, 1, 197,
- 84, 1, 228, 92, 84, 1, 190, 84, 1, 225, 147, 84, 1, 252, 191, 84, 1, 252,
- 18, 84, 1, 184, 84, 1, 191, 84, 1, 205, 84, 1, 222, 179, 84, 1, 233, 135,
- 84, 1, 232, 184, 84, 1, 232, 175, 84, 1, 214, 27, 84, 1, 220, 102, 84, 1,
- 218, 223, 84, 1, 206, 84, 1, 162, 84, 25, 5, 226, 234, 84, 25, 5, 226,
- 181, 84, 5, 227, 205, 84, 5, 253, 175, 84, 25, 5, 255, 73, 84, 25, 5, 73,
- 84, 25, 5, 236, 33, 84, 25, 5, 70, 84, 25, 5, 214, 118, 84, 25, 5, 149,
- 153, 84, 25, 5, 149, 222, 180, 84, 25, 5, 251, 2, 75, 84, 25, 5, 219,
- 251, 75, 84, 25, 5, 75, 84, 25, 5, 254, 201, 84, 25, 5, 251, 2, 76, 84,
- 25, 5, 219, 251, 76, 84, 25, 5, 76, 84, 25, 5, 253, 192, 84, 5, 213, 152,
- 84, 25, 5, 224, 185, 75, 84, 25, 5, 253, 171, 84, 226, 204, 84, 218, 111,
- 5, 214, 216, 84, 218, 111, 5, 254, 77, 84, 242, 137, 255, 14, 84, 255, 3,
- 255, 14, 84, 25, 5, 251, 2, 199, 75, 84, 25, 5, 214, 214, 84, 25, 5, 214,
- 117, 84, 1, 224, 88, 84, 1, 234, 115, 84, 1, 242, 226, 84, 1, 210, 116,
- 84, 1, 248, 124, 84, 1, 223, 39, 84, 1, 244, 196, 84, 1, 210, 168, 84, 1,
- 149, 222, 180, 84, 1, 149, 232, 185, 84, 25, 5, 149, 156, 84, 25, 5, 149,
- 232, 185, 84, 248, 178, 84, 52, 248, 178, 84, 21, 210, 86, 84, 21, 110,
- 84, 21, 105, 84, 21, 158, 84, 21, 161, 84, 21, 189, 84, 21, 194, 84, 21,
- 198, 84, 21, 195, 84, 21, 200, 84, 255, 21, 50, 84, 5, 125, 219, 17, 247,
- 120, 84, 1, 251, 2, 61, 84, 1, 226, 234, 84, 1, 226, 181, 84, 1, 253,
- 171, 84, 1, 214, 214, 84, 1, 214, 117, 84, 1, 210, 82, 84, 1, 114, 191,
- 84, 1, 243, 29, 84, 1, 235, 96, 84, 1, 242, 180, 218, 129, 84, 1, 248,
- 125, 84, 1, 252, 111, 146, 5, 250, 255, 146, 5, 254, 75, 146, 5, 213,
- 147, 146, 1, 61, 146, 1, 255, 73, 146, 1, 73, 146, 1, 236, 33, 146, 1,
- 70, 146, 1, 214, 118, 146, 1, 149, 153, 146, 1, 149, 156, 146, 1, 75,
- 146, 1, 254, 201, 146, 1, 76, 146, 1, 253, 192, 146, 1, 176, 146, 1, 234,
- 132, 146, 1, 243, 135, 146, 1, 242, 249, 146, 1, 229, 77, 146, 1, 251,
- 33, 146, 1, 250, 157, 146, 1, 235, 141, 146, 1, 235, 114, 146, 1, 227,
- 165, 146, 1, 215, 156, 146, 1, 215, 144, 146, 1, 248, 135, 146, 1, 248,
- 119, 146, 1, 228, 110, 146, 1, 217, 105, 146, 1, 216, 208, 146, 1, 248,
- 221, 146, 1, 248, 25, 146, 1, 197, 146, 1, 190, 146, 1, 225, 147, 146, 1,
- 252, 191, 146, 1, 252, 18, 146, 1, 184, 146, 1, 191, 146, 1, 205, 146, 1,
- 233, 135, 146, 1, 220, 102, 146, 1, 218, 223, 146, 1, 206, 146, 1, 162,
- 146, 5, 227, 205, 146, 5, 253, 175, 146, 25, 5, 255, 73, 146, 25, 5, 73,
- 146, 25, 5, 236, 33, 146, 25, 5, 70, 146, 25, 5, 214, 118, 146, 25, 5,
- 149, 153, 146, 25, 5, 149, 222, 180, 146, 25, 5, 75, 146, 25, 5, 254,
- 201, 146, 25, 5, 76, 146, 25, 5, 253, 192, 146, 5, 213, 152, 146, 1, 234,
- 124, 217, 105, 146, 253, 193, 233, 23, 78, 146, 1, 222, 179, 146, 1, 223,
- 39, 146, 1, 210, 168, 146, 1, 149, 222, 180, 146, 1, 149, 232, 185, 146,
- 25, 5, 149, 156, 146, 25, 5, 149, 232, 185, 146, 21, 210, 86, 146, 21,
- 110, 146, 21, 105, 146, 21, 158, 146, 21, 161, 146, 21, 189, 146, 21,
- 194, 146, 21, 198, 146, 21, 195, 146, 21, 200, 146, 1, 223, 188, 2, 230,
- 224, 247, 254, 146, 1, 223, 188, 2, 232, 108, 247, 254, 146, 222, 118,
- 78, 146, 222, 118, 50, 146, 249, 98, 227, 197, 110, 146, 249, 98, 227,
- 197, 105, 146, 249, 98, 227, 197, 158, 146, 249, 98, 227, 197, 161, 146,
- 249, 98, 227, 197, 123, 233, 16, 216, 201, 216, 196, 248, 48, 146, 249,
- 98, 248, 49, 219, 119, 146, 235, 161, 146, 243, 103, 78, 183, 5, 254,
- 254, 251, 243, 183, 5, 251, 243, 183, 5, 213, 147, 183, 1, 61, 183, 1,
- 255, 73, 183, 1, 73, 183, 1, 236, 33, 183, 1, 70, 183, 1, 214, 118, 183,
- 1, 245, 209, 183, 1, 254, 201, 183, 1, 226, 183, 183, 1, 253, 192, 183,
- 1, 176, 183, 1, 234, 132, 183, 1, 243, 135, 183, 1, 242, 249, 183, 1,
- 229, 77, 183, 1, 251, 33, 183, 1, 250, 157, 183, 1, 235, 141, 183, 1,
- 235, 114, 183, 1, 227, 165, 183, 1, 215, 156, 183, 1, 215, 144, 183, 1,
- 248, 135, 183, 1, 248, 119, 183, 1, 228, 110, 183, 1, 217, 105, 183, 1,
- 216, 208, 183, 1, 248, 221, 183, 1, 248, 25, 183, 1, 197, 183, 1, 190,
- 183, 1, 225, 147, 183, 1, 252, 191, 183, 1, 252, 18, 183, 1, 184, 183, 1,
- 191, 183, 1, 205, 183, 1, 233, 135, 183, 1, 232, 184, 183, 1, 214, 27,
- 183, 1, 220, 102, 183, 1, 206, 183, 1, 162, 183, 5, 227, 205, 183, 25, 5,
- 255, 73, 183, 25, 5, 73, 183, 25, 5, 236, 33, 183, 25, 5, 70, 183, 25, 5,
- 214, 118, 183, 25, 5, 245, 209, 183, 25, 5, 254, 201, 183, 25, 5, 226,
- 183, 183, 25, 5, 253, 192, 183, 5, 213, 152, 183, 5, 214, 218, 183, 1,
- 234, 115, 183, 1, 242, 226, 183, 1, 210, 116, 183, 1, 222, 179, 183, 1,
- 244, 196, 183, 21, 210, 86, 183, 21, 110, 183, 21, 105, 183, 21, 158,
- 183, 21, 161, 183, 21, 189, 183, 21, 194, 183, 21, 198, 183, 21, 195,
- 183, 21, 200, 183, 216, 74, 183, 254, 253, 183, 235, 178, 183, 214, 146,
- 183, 245, 181, 226, 188, 183, 5, 211, 78, 171, 5, 250, 255, 171, 5, 254,
- 75, 171, 5, 213, 147, 171, 1, 61, 171, 1, 255, 73, 171, 1, 73, 171, 1,
- 236, 33, 171, 1, 70, 171, 1, 214, 118, 171, 1, 149, 153, 171, 1, 149,
- 156, 171, 25, 251, 2, 75, 171, 1, 75, 171, 1, 254, 201, 171, 25, 251, 2,
- 76, 171, 1, 76, 171, 1, 253, 192, 171, 1, 176, 171, 1, 234, 132, 171, 1,
- 243, 135, 171, 1, 242, 249, 171, 1, 229, 77, 171, 1, 251, 33, 171, 1,
- 250, 157, 171, 1, 235, 141, 171, 1, 235, 114, 171, 1, 227, 165, 171, 1,
- 215, 156, 171, 1, 215, 144, 171, 1, 248, 135, 171, 1, 248, 119, 171, 1,
- 228, 110, 171, 1, 217, 105, 171, 1, 216, 208, 171, 1, 248, 221, 171, 1,
- 248, 25, 171, 1, 197, 171, 1, 190, 171, 1, 225, 147, 171, 1, 252, 191,
- 171, 1, 252, 18, 171, 1, 184, 171, 1, 191, 171, 1, 205, 171, 1, 233, 135,
- 171, 1, 232, 184, 171, 1, 214, 27, 171, 1, 220, 102, 171, 1, 218, 223,
- 171, 1, 206, 171, 1, 162, 171, 5, 227, 205, 171, 5, 253, 175, 171, 25, 5,
- 255, 73, 171, 25, 5, 73, 171, 25, 5, 236, 33, 171, 25, 5, 70, 171, 25, 5,
- 214, 118, 171, 25, 5, 149, 153, 171, 25, 5, 149, 222, 180, 171, 25, 5,
- 251, 2, 75, 171, 25, 5, 75, 171, 25, 5, 254, 201, 171, 25, 5, 251, 2, 76,
- 171, 25, 5, 76, 171, 25, 5, 253, 192, 171, 5, 213, 152, 171, 226, 204,
- 171, 1, 149, 222, 180, 171, 1, 149, 232, 185, 171, 25, 5, 149, 156, 171,
- 25, 5, 149, 232, 185, 171, 21, 210, 86, 171, 21, 110, 171, 21, 105, 171,
+ 6, 1, 210, 159, 43, 42, 127, 223, 51, 219, 47, 44, 42, 127, 250, 32, 255,
+ 15, 121, 232, 214, 242, 138, 255, 15, 7, 4, 1, 61, 7, 4, 1, 253, 159, 7,
+ 4, 1, 251, 67, 7, 4, 1, 249, 61, 7, 4, 1, 75, 7, 4, 1, 245, 7, 7, 4, 1,
+ 243, 203, 7, 4, 1, 242, 61, 7, 4, 1, 73, 7, 4, 1, 235, 145, 7, 4, 1, 235,
+ 24, 7, 4, 1, 156, 7, 4, 1, 193, 7, 4, 1, 230, 26, 7, 4, 1, 76, 7, 4, 1,
+ 226, 106, 7, 4, 1, 224, 97, 7, 4, 1, 153, 7, 4, 1, 222, 92, 7, 4, 1, 217,
+ 153, 7, 4, 1, 70, 7, 4, 1, 214, 105, 7, 4, 1, 212, 98, 7, 4, 1, 211, 178,
+ 7, 4, 1, 211, 117, 7, 4, 1, 210, 159, 43, 249, 100, 127, 67, 232, 214,
+ 44, 249, 100, 127, 183, 228, 74, 219, 19, 235, 194, 245, 32, 78, 250,
+ 177, 50, 224, 229, 50, 249, 99, 50, 211, 40, 50, 251, 136, 130, 221, 174,
+ 50, 248, 2, 249, 164, 50, 244, 137, 226, 155, 235, 239, 233, 43, 52, 254,
+ 111, 223, 255, 78, 228, 53, 50, 219, 53, 240, 169, 223, 103, 50, 231,
+ 233, 248, 72, 50, 225, 22, 50, 218, 24, 105, 218, 24, 158, 255, 4, 255,
+ 15, 230, 229, 50, 225, 69, 50, 230, 225, 247, 121, 250, 184, 218, 24,
+ 110, 231, 149, 226, 155, 235, 239, 222, 248, 52, 254, 111, 223, 255, 78,
+ 212, 114, 244, 3, 123, 224, 22, 212, 114, 244, 3, 123, 242, 28, 212, 114,
+ 244, 3, 134, 224, 20, 235, 194, 224, 14, 78, 7, 6, 1, 115, 2, 242, 137,
+ 7, 6, 1, 115, 2, 142, 7, 6, 1, 115, 2, 250, 31, 7, 6, 1, 115, 2, 183, 7,
+ 6, 1, 115, 2, 248, 2, 7, 6, 1, 115, 2, 222, 235, 48, 7, 6, 1, 254, 244,
+ 7, 6, 1, 251, 68, 2, 250, 184, 7, 6, 1, 160, 2, 242, 137, 7, 6, 1, 160,
+ 2, 142, 7, 6, 1, 160, 2, 250, 31, 7, 6, 1, 160, 2, 248, 2, 7, 6, 1, 240,
+ 155, 2, 242, 137, 7, 6, 1, 240, 155, 2, 142, 7, 6, 1, 240, 155, 2, 250,
+ 31, 7, 6, 1, 240, 155, 2, 248, 2, 7, 6, 1, 245, 60, 7, 6, 1, 230, 27, 2,
+ 183, 7, 6, 1, 144, 2, 242, 137, 7, 6, 1, 144, 2, 142, 7, 6, 1, 144, 2,
+ 250, 31, 7, 6, 1, 144, 2, 183, 7, 6, 1, 144, 2, 248, 2, 230, 85, 50, 7,
+ 6, 1, 144, 2, 91, 7, 6, 1, 104, 2, 242, 137, 7, 6, 1, 104, 2, 142, 7, 6,
+ 1, 104, 2, 250, 31, 7, 6, 1, 104, 2, 248, 2, 7, 6, 1, 211, 118, 2, 142,
+ 7, 6, 1, 216, 152, 7, 4, 1, 220, 77, 222, 92, 7, 4, 1, 115, 2, 242, 137,
+ 7, 4, 1, 115, 2, 142, 7, 4, 1, 115, 2, 250, 31, 7, 4, 1, 115, 2, 183, 7,
+ 4, 1, 115, 2, 248, 2, 7, 4, 1, 115, 2, 222, 235, 48, 7, 4, 1, 254, 244,
+ 7, 4, 1, 251, 68, 2, 250, 184, 7, 4, 1, 160, 2, 242, 137, 7, 4, 1, 160,
+ 2, 142, 7, 4, 1, 160, 2, 250, 31, 7, 4, 1, 160, 2, 248, 2, 7, 4, 1, 240,
+ 155, 2, 242, 137, 7, 4, 1, 240, 155, 2, 142, 7, 4, 1, 240, 155, 2, 250,
+ 31, 7, 4, 1, 240, 155, 2, 248, 2, 7, 4, 1, 245, 60, 7, 4, 1, 230, 27, 2,
+ 183, 7, 4, 1, 144, 2, 242, 137, 7, 4, 1, 144, 2, 142, 7, 4, 1, 144, 2,
+ 250, 31, 7, 4, 1, 144, 2, 183, 7, 4, 1, 144, 2, 248, 2, 247, 170, 50, 7,
+ 4, 1, 144, 2, 91, 7, 4, 1, 104, 2, 242, 137, 7, 4, 1, 104, 2, 142, 7, 4,
+ 1, 104, 2, 250, 31, 7, 4, 1, 104, 2, 248, 2, 7, 4, 1, 211, 118, 2, 142,
+ 7, 4, 1, 216, 152, 7, 4, 1, 211, 118, 2, 248, 2, 7, 6, 1, 115, 2, 231,
+ 233, 7, 4, 1, 115, 2, 231, 233, 7, 6, 1, 115, 2, 251, 147, 7, 4, 1, 115,
+ 2, 251, 147, 7, 6, 1, 115, 2, 226, 225, 7, 4, 1, 115, 2, 226, 225, 7, 6,
+ 1, 251, 68, 2, 142, 7, 4, 1, 251, 68, 2, 142, 7, 6, 1, 251, 68, 2, 250,
+ 31, 7, 4, 1, 251, 68, 2, 250, 31, 7, 6, 1, 251, 68, 2, 59, 48, 7, 4, 1,
+ 251, 68, 2, 59, 48, 7, 6, 1, 251, 68, 2, 250, 235, 7, 4, 1, 251, 68, 2,
+ 250, 235, 7, 6, 1, 249, 62, 2, 250, 235, 7, 4, 1, 249, 62, 2, 250, 235,
+ 7, 6, 1, 249, 62, 2, 91, 7, 4, 1, 249, 62, 2, 91, 7, 6, 1, 160, 2, 231,
+ 233, 7, 4, 1, 160, 2, 231, 233, 7, 6, 1, 160, 2, 251, 147, 7, 4, 1, 160,
+ 2, 251, 147, 7, 6, 1, 160, 2, 59, 48, 7, 4, 1, 160, 2, 59, 48, 7, 6, 1,
+ 160, 2, 226, 225, 7, 4, 1, 160, 2, 226, 225, 7, 6, 1, 160, 2, 250, 235,
+ 7, 4, 1, 160, 2, 250, 235, 7, 6, 1, 243, 204, 2, 250, 31, 7, 4, 1, 243,
+ 204, 2, 250, 31, 7, 6, 1, 243, 204, 2, 251, 147, 7, 4, 1, 243, 204, 2,
+ 251, 147, 7, 6, 1, 243, 204, 2, 59, 48, 7, 4, 1, 243, 204, 2, 59, 48, 7,
+ 6, 1, 243, 204, 2, 250, 184, 7, 4, 1, 243, 204, 2, 250, 184, 7, 6, 1,
+ 242, 62, 2, 250, 31, 7, 4, 1, 242, 62, 2, 250, 31, 7, 6, 1, 242, 62, 2,
+ 91, 7, 4, 1, 242, 62, 2, 91, 7, 6, 1, 240, 155, 2, 183, 7, 4, 1, 240,
+ 155, 2, 183, 7, 6, 1, 240, 155, 2, 231, 233, 7, 4, 1, 240, 155, 2, 231,
+ 233, 7, 6, 1, 240, 155, 2, 251, 147, 7, 4, 1, 240, 155, 2, 251, 147, 7,
+ 6, 1, 240, 155, 2, 226, 225, 7, 4, 1, 240, 155, 2, 226, 225, 7, 6, 1,
+ 240, 155, 2, 59, 48, 7, 4, 1, 247, 120, 73, 7, 6, 27, 236, 32, 7, 4, 27,
+ 236, 32, 7, 6, 1, 235, 146, 2, 250, 31, 7, 4, 1, 235, 146, 2, 250, 31, 7,
+ 6, 1, 235, 25, 2, 250, 184, 7, 4, 1, 235, 25, 2, 250, 184, 7, 4, 1, 233,
+ 240, 7, 6, 1, 233, 150, 2, 142, 7, 4, 1, 233, 150, 2, 142, 7, 6, 1, 233,
+ 150, 2, 250, 184, 7, 4, 1, 233, 150, 2, 250, 184, 7, 6, 1, 233, 150, 2,
+ 250, 235, 7, 4, 1, 233, 150, 2, 250, 235, 7, 6, 1, 233, 150, 2, 230, 225,
+ 247, 121, 7, 4, 1, 233, 150, 2, 230, 225, 247, 121, 7, 6, 1, 233, 150, 2,
+ 91, 7, 4, 1, 233, 150, 2, 91, 7, 6, 1, 230, 27, 2, 142, 7, 4, 1, 230, 27,
+ 2, 142, 7, 6, 1, 230, 27, 2, 250, 184, 7, 4, 1, 230, 27, 2, 250, 184, 7,
+ 6, 1, 230, 27, 2, 250, 235, 7, 4, 1, 230, 27, 2, 250, 235, 7, 4, 1, 230,
+ 27, 224, 205, 251, 79, 254, 58, 7, 6, 1, 245, 139, 7, 4, 1, 245, 139, 7,
+ 6, 1, 144, 2, 231, 233, 7, 4, 1, 144, 2, 231, 233, 7, 6, 1, 144, 2, 251,
+ 147, 7, 4, 1, 144, 2, 251, 147, 7, 6, 1, 144, 2, 52, 142, 7, 4, 1, 144,
+ 2, 52, 142, 7, 6, 27, 226, 235, 7, 4, 27, 226, 235, 7, 6, 1, 223, 225, 2,
+ 142, 7, 4, 1, 223, 225, 2, 142, 7, 6, 1, 223, 225, 2, 250, 184, 7, 4, 1,
+ 223, 225, 2, 250, 184, 7, 6, 1, 223, 225, 2, 250, 235, 7, 4, 1, 223, 225,
+ 2, 250, 235, 7, 6, 1, 222, 93, 2, 142, 7, 4, 1, 222, 93, 2, 142, 7, 6, 1,
+ 222, 93, 2, 250, 31, 7, 4, 1, 222, 93, 2, 250, 31, 7, 6, 1, 222, 93, 2,
+ 250, 184, 7, 4, 1, 222, 93, 2, 250, 184, 7, 6, 1, 222, 93, 2, 250, 235,
+ 7, 4, 1, 222, 93, 2, 250, 235, 7, 6, 1, 217, 154, 2, 250, 184, 7, 4, 1,
+ 217, 154, 2, 250, 184, 7, 6, 1, 217, 154, 2, 250, 235, 7, 4, 1, 217, 154,
+ 2, 250, 235, 7, 6, 1, 217, 154, 2, 91, 7, 4, 1, 217, 154, 2, 91, 7, 6, 1,
+ 104, 2, 183, 7, 4, 1, 104, 2, 183, 7, 6, 1, 104, 2, 231, 233, 7, 4, 1,
+ 104, 2, 231, 233, 7, 6, 1, 104, 2, 251, 147, 7, 4, 1, 104, 2, 251, 147,
+ 7, 6, 1, 104, 2, 222, 235, 48, 7, 4, 1, 104, 2, 222, 235, 48, 7, 6, 1,
+ 104, 2, 52, 142, 7, 4, 1, 104, 2, 52, 142, 7, 6, 1, 104, 2, 226, 225, 7,
+ 4, 1, 104, 2, 226, 225, 7, 6, 1, 212, 99, 2, 250, 31, 7, 4, 1, 212, 99,
+ 2, 250, 31, 7, 6, 1, 211, 118, 2, 250, 31, 7, 4, 1, 211, 118, 2, 250, 31,
+ 7, 6, 1, 211, 118, 2, 248, 2, 7, 6, 1, 210, 160, 2, 142, 7, 4, 1, 210,
+ 160, 2, 142, 7, 6, 1, 210, 160, 2, 59, 48, 7, 4, 1, 210, 160, 2, 59, 48,
+ 7, 6, 1, 210, 160, 2, 250, 235, 7, 4, 1, 210, 160, 2, 250, 235, 7, 4, 1,
+ 199, 222, 92, 7, 4, 1, 57, 2, 91, 7, 6, 1, 57, 2, 103, 7, 6, 1, 57, 2,
+ 216, 12, 7, 4, 1, 57, 2, 216, 12, 7, 6, 1, 138, 194, 7, 4, 1, 138, 194,
+ 7, 6, 1, 204, 76, 7, 6, 1, 251, 68, 2, 103, 7, 4, 1, 251, 68, 2, 103, 7,
+ 6, 1, 254, 220, 249, 61, 7, 6, 1, 249, 62, 2, 103, 7, 6, 1, 249, 62, 2,
+ 216, 12, 7, 4, 1, 249, 62, 2, 216, 12, 7, 4, 1, 215, 94, 248, 55, 7, 6,
+ 1, 223, 50, 75, 7, 6, 1, 221, 196, 7, 6, 1, 204, 75, 7, 6, 1, 245, 8, 2,
+ 103, 7, 4, 1, 245, 8, 2, 103, 7, 6, 1, 243, 204, 2, 103, 7, 6, 1, 243,
+ 108, 7, 4, 1, 240, 202, 7, 6, 1, 235, 186, 7, 6, 1, 240, 155, 2, 91, 7,
+ 6, 1, 235, 25, 2, 103, 7, 4, 1, 235, 25, 2, 103, 7, 4, 1, 233, 150, 2,
+ 130, 7, 4, 1, 233, 101, 2, 91, 7, 6, 1, 215, 94, 193, 7, 6, 1, 230, 27,
+ 2, 43, 103, 7, 4, 1, 230, 27, 2, 199, 44, 233, 37, 7, 6, 1, 144, 2, 230,
+ 225, 183, 7, 6, 1, 144, 2, 240, 249, 7, 4, 1, 144, 2, 240, 249, 7, 6, 1,
+ 226, 220, 7, 4, 1, 226, 220, 7, 6, 1, 226, 107, 2, 103, 7, 4, 1, 226,
+ 107, 2, 103, 7, 1, 210, 214, 7, 6, 1, 138, 105, 7, 4, 1, 138, 105, 7, 6,
+ 1, 245, 76, 7, 1, 223, 50, 245, 77, 232, 124, 7, 4, 1, 217, 154, 2, 226,
+ 67, 103, 7, 6, 1, 217, 154, 2, 103, 7, 4, 1, 217, 154, 2, 103, 7, 6, 1,
+ 217, 154, 2, 223, 56, 103, 7, 6, 1, 104, 2, 240, 249, 7, 4, 1, 104, 2,
+ 240, 249, 7, 6, 1, 214, 157, 7, 6, 1, 214, 106, 2, 103, 7, 6, 1, 211,
+ 118, 2, 103, 7, 4, 1, 211, 118, 2, 103, 7, 6, 1, 210, 160, 2, 91, 7, 4,
+ 1, 210, 160, 2, 91, 7, 6, 1, 245, 9, 7, 6, 1, 245, 10, 223, 49, 7, 4, 1,
+ 245, 10, 223, 49, 7, 4, 1, 245, 10, 2, 217, 78, 7, 1, 113, 2, 91, 7, 6,
+ 1, 138, 189, 7, 4, 1, 138, 189, 7, 1, 235, 194, 242, 181, 218, 131, 2,
+ 91, 7, 1, 211, 181, 7, 1, 248, 48, 250, 12, 7, 1, 233, 78, 250, 12, 7, 1,
+ 254, 138, 250, 12, 7, 1, 223, 56, 250, 12, 7, 6, 1, 246, 41, 2, 250, 235,
+ 7, 6, 1, 249, 62, 2, 4, 1, 210, 160, 2, 250, 235, 7, 4, 1, 246, 41, 2,
+ 250, 235, 7, 6, 1, 232, 189, 7, 6, 1, 233, 150, 2, 4, 1, 235, 145, 7, 4,
+ 1, 232, 189, 7, 6, 1, 228, 187, 7, 6, 1, 230, 27, 2, 4, 1, 235, 145, 7,
+ 4, 1, 228, 187, 7, 6, 1, 115, 2, 250, 235, 7, 4, 1, 115, 2, 250, 235, 7,
+ 6, 1, 240, 155, 2, 250, 235, 7, 4, 1, 240, 155, 2, 250, 235, 7, 6, 1,
+ 144, 2, 250, 235, 7, 4, 1, 144, 2, 250, 235, 7, 6, 1, 104, 2, 250, 235,
+ 7, 4, 1, 104, 2, 250, 235, 7, 6, 1, 104, 2, 248, 3, 22, 231, 233, 7, 4,
+ 1, 104, 2, 248, 3, 22, 231, 233, 7, 6, 1, 104, 2, 248, 3, 22, 142, 7, 4,
+ 1, 104, 2, 248, 3, 22, 142, 7, 6, 1, 104, 2, 248, 3, 22, 250, 235, 7, 4,
+ 1, 104, 2, 248, 3, 22, 250, 235, 7, 6, 1, 104, 2, 248, 3, 22, 242, 137,
+ 7, 4, 1, 104, 2, 248, 3, 22, 242, 137, 7, 4, 1, 215, 94, 75, 7, 6, 1,
+ 115, 2, 248, 3, 22, 231, 233, 7, 4, 1, 115, 2, 248, 3, 22, 231, 233, 7,
+ 6, 1, 115, 2, 59, 77, 22, 231, 233, 7, 4, 1, 115, 2, 59, 77, 22, 231,
+ 233, 7, 6, 1, 254, 245, 2, 231, 233, 7, 4, 1, 254, 245, 2, 231, 233, 7,
+ 6, 1, 243, 204, 2, 91, 7, 4, 1, 243, 204, 2, 91, 7, 6, 1, 243, 204, 2,
+ 250, 235, 7, 4, 1, 243, 204, 2, 250, 235, 7, 6, 1, 235, 25, 2, 250, 235,
+ 7, 4, 1, 235, 25, 2, 250, 235, 7, 6, 1, 144, 2, 226, 225, 7, 4, 1, 144,
+ 2, 226, 225, 7, 6, 1, 144, 2, 226, 226, 22, 231, 233, 7, 4, 1, 144, 2,
+ 226, 226, 22, 231, 233, 7, 6, 1, 245, 10, 2, 250, 235, 7, 4, 1, 245, 10,
+ 2, 250, 235, 7, 4, 1, 235, 146, 2, 250, 235, 7, 6, 1, 246, 40, 7, 6, 1,
+ 249, 62, 2, 4, 1, 210, 159, 7, 4, 1, 246, 40, 7, 6, 1, 243, 204, 2, 142,
+ 7, 4, 1, 243, 204, 2, 142, 7, 6, 1, 240, 200, 7, 6, 1, 211, 181, 7, 6, 1,
+ 230, 27, 2, 242, 137, 7, 4, 1, 230, 27, 2, 242, 137, 7, 6, 1, 115, 2,
+ 222, 235, 77, 22, 142, 7, 4, 1, 115, 2, 222, 235, 77, 22, 142, 7, 6, 1,
+ 254, 245, 2, 142, 7, 4, 1, 254, 245, 2, 142, 7, 6, 1, 144, 2, 218, 104,
+ 22, 142, 7, 4, 1, 144, 2, 218, 104, 22, 142, 7, 6, 1, 115, 2, 52, 242,
+ 137, 7, 4, 1, 115, 2, 52, 242, 137, 7, 6, 1, 115, 2, 235, 194, 251, 147,
+ 7, 4, 1, 115, 2, 235, 194, 251, 147, 7, 6, 1, 160, 2, 52, 242, 137, 7, 4,
+ 1, 160, 2, 52, 242, 137, 7, 6, 1, 160, 2, 235, 194, 251, 147, 7, 4, 1,
+ 160, 2, 235, 194, 251, 147, 7, 6, 1, 240, 155, 2, 52, 242, 137, 7, 4, 1,
+ 240, 155, 2, 52, 242, 137, 7, 6, 1, 240, 155, 2, 235, 194, 251, 147, 7,
+ 4, 1, 240, 155, 2, 235, 194, 251, 147, 7, 6, 1, 144, 2, 52, 242, 137, 7,
+ 4, 1, 144, 2, 52, 242, 137, 7, 6, 1, 144, 2, 235, 194, 251, 147, 7, 4, 1,
+ 144, 2, 235, 194, 251, 147, 7, 6, 1, 223, 225, 2, 52, 242, 137, 7, 4, 1,
+ 223, 225, 2, 52, 242, 137, 7, 6, 1, 223, 225, 2, 235, 194, 251, 147, 7,
+ 4, 1, 223, 225, 2, 235, 194, 251, 147, 7, 6, 1, 104, 2, 52, 242, 137, 7,
+ 4, 1, 104, 2, 52, 242, 137, 7, 6, 1, 104, 2, 235, 194, 251, 147, 7, 4, 1,
+ 104, 2, 235, 194, 251, 147, 7, 6, 1, 222, 93, 2, 249, 221, 51, 7, 4, 1,
+ 222, 93, 2, 249, 221, 51, 7, 6, 1, 217, 154, 2, 249, 221, 51, 7, 4, 1,
+ 217, 154, 2, 249, 221, 51, 7, 6, 1, 210, 231, 7, 4, 1, 210, 231, 7, 6, 1,
+ 242, 62, 2, 250, 235, 7, 4, 1, 242, 62, 2, 250, 235, 7, 6, 1, 230, 27, 2,
+ 199, 44, 233, 37, 7, 4, 1, 249, 62, 2, 249, 101, 7, 6, 1, 226, 135, 7, 4,
+ 1, 226, 135, 7, 6, 1, 210, 160, 2, 103, 7, 4, 1, 210, 160, 2, 103, 7, 6,
+ 1, 115, 2, 59, 48, 7, 4, 1, 115, 2, 59, 48, 7, 6, 1, 160, 2, 250, 184, 7,
+ 4, 1, 160, 2, 250, 184, 7, 6, 1, 144, 2, 248, 3, 22, 231, 233, 7, 4, 1,
+ 144, 2, 248, 3, 22, 231, 233, 7, 6, 1, 144, 2, 216, 90, 22, 231, 233, 7,
+ 4, 1, 144, 2, 216, 90, 22, 231, 233, 7, 6, 1, 144, 2, 59, 48, 7, 4, 1,
+ 144, 2, 59, 48, 7, 6, 1, 144, 2, 59, 77, 22, 231, 233, 7, 4, 1, 144, 2,
+ 59, 77, 22, 231, 233, 7, 6, 1, 211, 118, 2, 231, 233, 7, 4, 1, 211, 118,
+ 2, 231, 233, 7, 4, 1, 233, 150, 2, 249, 101, 7, 4, 1, 230, 27, 2, 249,
+ 101, 7, 4, 1, 217, 154, 2, 249, 101, 7, 4, 1, 247, 120, 235, 145, 7, 4,
+ 1, 248, 144, 247, 221, 7, 4, 1, 224, 32, 247, 221, 7, 6, 1, 115, 2, 91,
+ 7, 6, 1, 251, 68, 2, 91, 7, 4, 1, 251, 68, 2, 91, 7, 6, 1, 233, 150, 2,
+ 130, 7, 6, 1, 217, 154, 2, 248, 0, 91, 7, 4, 1, 222, 93, 2, 217, 251,
+ 217, 78, 7, 4, 1, 210, 160, 2, 217, 251, 217, 78, 7, 6, 1, 242, 181, 218,
+ 130, 7, 4, 1, 242, 181, 218, 130, 7, 6, 1, 57, 2, 91, 7, 6, 1, 104, 130,
+ 7, 6, 1, 215, 94, 214, 105, 7, 6, 1, 160, 2, 91, 7, 4, 1, 160, 2, 91, 7,
+ 6, 1, 235, 146, 2, 91, 7, 4, 1, 235, 146, 2, 91, 7, 6, 1, 4, 224, 98, 2,
+ 241, 53, 217, 78, 7, 4, 1, 224, 98, 2, 241, 53, 217, 78, 7, 6, 1, 223,
+ 225, 2, 91, 7, 4, 1, 223, 225, 2, 91, 7, 6, 1, 211, 118, 2, 91, 7, 4, 1,
+ 211, 118, 2, 91, 7, 4, 1, 215, 94, 61, 7, 4, 1, 254, 144, 7, 4, 1, 215,
+ 94, 254, 144, 7, 4, 1, 57, 2, 103, 7, 4, 1, 204, 76, 7, 4, 1, 251, 68, 2,
+ 249, 101, 7, 4, 1, 249, 62, 2, 217, 78, 7, 4, 1, 249, 62, 2, 103, 7, 4,
+ 1, 223, 50, 75, 7, 4, 1, 221, 196, 7, 4, 1, 221, 197, 2, 103, 7, 4, 1,
+ 204, 75, 7, 4, 1, 223, 50, 204, 75, 7, 4, 1, 223, 50, 204, 160, 2, 103,
+ 7, 4, 1, 250, 1, 223, 50, 204, 75, 7, 4, 1, 247, 120, 235, 146, 2, 91, 7,
+ 4, 1, 243, 204, 2, 103, 7, 4, 1, 119, 243, 203, 7, 1, 4, 6, 243, 203, 7,
+ 4, 1, 243, 108, 7, 4, 1, 223, 152, 240, 249, 7, 4, 1, 215, 94, 242, 61,
+ 7, 4, 1, 242, 62, 2, 103, 7, 4, 1, 241, 209, 2, 103, 7, 4, 1, 240, 155,
+ 2, 91, 7, 4, 1, 235, 186, 7, 1, 4, 6, 73, 7, 4, 1, 233, 150, 2, 230, 225,
+ 183, 7, 4, 1, 233, 150, 2, 252, 42, 7, 4, 1, 233, 150, 2, 223, 56, 103,
+ 7, 4, 1, 233, 2, 7, 4, 1, 215, 94, 193, 7, 4, 1, 215, 94, 232, 51, 2,
+ 199, 233, 37, 7, 4, 1, 232, 51, 2, 103, 7, 4, 1, 230, 27, 2, 43, 103, 7,
+ 4, 1, 230, 27, 2, 223, 56, 103, 7, 1, 4, 6, 230, 26, 7, 4, 1, 252, 135,
+ 76, 7, 1, 4, 6, 226, 235, 7, 4, 1, 250, 1, 226, 202, 7, 4, 1, 225, 134,
+ 7, 4, 1, 215, 94, 153, 7, 4, 1, 215, 94, 223, 225, 2, 199, 233, 37, 7, 4,
+ 1, 215, 94, 223, 225, 2, 103, 7, 4, 1, 223, 225, 2, 199, 233, 37, 7, 4,
+ 1, 223, 225, 2, 217, 78, 7, 4, 1, 223, 225, 2, 244, 88, 7, 4, 1, 223, 50,
+ 223, 225, 2, 244, 88, 7, 1, 4, 6, 153, 7, 1, 4, 6, 235, 194, 153, 7, 4,
+ 1, 222, 93, 2, 103, 7, 4, 1, 245, 76, 7, 4, 1, 247, 120, 235, 146, 2,
+ 218, 104, 22, 103, 7, 4, 1, 218, 232, 223, 50, 245, 76, 7, 4, 1, 245, 77,
+ 2, 249, 101, 7, 4, 1, 215, 94, 217, 153, 7, 4, 1, 217, 154, 2, 223, 56,
+ 103, 7, 4, 1, 104, 130, 7, 4, 1, 214, 157, 7, 4, 1, 214, 106, 2, 103, 7,
+ 4, 1, 215, 94, 214, 105, 7, 4, 1, 215, 94, 212, 98, 7, 4, 1, 215, 94,
+ 211, 117, 7, 1, 4, 6, 211, 117, 7, 4, 1, 210, 160, 2, 223, 56, 103, 7, 4,
+ 1, 210, 160, 2, 249, 101, 7, 4, 1, 245, 9, 7, 4, 1, 245, 10, 2, 249, 101,
+ 7, 1, 242, 181, 218, 130, 7, 1, 225, 140, 213, 135, 243, 250, 7, 1, 235,
+ 194, 242, 181, 218, 130, 7, 1, 218, 111, 251, 67, 7, 1, 251, 247, 250,
+ 12, 7, 1, 4, 6, 253, 159, 7, 4, 1, 250, 1, 204, 75, 7, 1, 4, 6, 243, 204,
+ 2, 103, 7, 1, 4, 6, 242, 61, 7, 4, 1, 235, 146, 2, 249, 128, 7, 4, 1,
+ 215, 94, 235, 24, 7, 1, 4, 6, 156, 7, 4, 1, 224, 98, 2, 103, 7, 1, 242,
+ 181, 218, 131, 2, 91, 7, 1, 223, 50, 242, 181, 218, 131, 2, 91, 7, 4, 1,
+ 246, 41, 247, 221, 7, 4, 1, 248, 27, 247, 221, 7, 4, 1, 246, 41, 247,
+ 222, 2, 249, 101, 7, 4, 1, 215, 186, 247, 221, 7, 4, 1, 216, 236, 247,
+ 221, 7, 4, 1, 217, 30, 247, 222, 2, 249, 101, 7, 4, 1, 244, 135, 247,
+ 221, 7, 4, 1, 232, 101, 247, 221, 7, 4, 1, 232, 52, 247, 221, 7, 1, 251,
+ 247, 225, 182, 7, 1, 251, 255, 225, 182, 7, 4, 1, 215, 94, 242, 62, 2,
+ 244, 88, 7, 4, 1, 215, 94, 242, 62, 2, 244, 89, 22, 217, 78, 58, 1, 4,
+ 242, 61, 58, 1, 4, 242, 62, 2, 103, 58, 1, 4, 235, 145, 58, 1, 4, 153,
+ 58, 1, 4, 215, 94, 153, 58, 1, 4, 215, 94, 223, 225, 2, 103, 58, 1, 4, 6,
+ 235, 194, 153, 58, 1, 4, 212, 98, 58, 1, 4, 211, 117, 58, 1, 224, 191,
+ 58, 1, 52, 224, 191, 58, 1, 215, 94, 249, 220, 58, 1, 254, 58, 58, 1,
+ 223, 50, 249, 220, 58, 1, 44, 163, 222, 234, 58, 1, 43, 163, 222, 234,
+ 58, 1, 242, 181, 218, 130, 58, 1, 223, 50, 242, 181, 218, 130, 58, 1, 43,
+ 253, 250, 58, 1, 44, 253, 250, 58, 1, 120, 253, 250, 58, 1, 124, 253,
+ 250, 58, 1, 250, 32, 255, 15, 250, 235, 58, 1, 67, 232, 214, 58, 1, 231,
+ 233, 58, 1, 255, 4, 255, 15, 58, 1, 242, 138, 255, 15, 58, 1, 121, 67,
+ 232, 214, 58, 1, 121, 231, 233, 58, 1, 121, 242, 138, 255, 15, 58, 1,
+ 121, 255, 4, 255, 15, 58, 1, 215, 223, 249, 227, 58, 1, 163, 215, 223,
+ 249, 227, 58, 1, 250, 174, 44, 163, 222, 234, 58, 1, 250, 174, 43, 163,
+ 222, 234, 58, 1, 120, 217, 88, 58, 1, 124, 217, 88, 58, 1, 96, 50, 58, 1,
+ 230, 183, 50, 251, 147, 59, 48, 222, 235, 48, 226, 225, 4, 183, 52, 255,
+ 4, 255, 15, 58, 1, 223, 37, 103, 58, 1, 249, 132, 255, 15, 58, 1, 4, 243,
+ 108, 58, 1, 4, 156, 58, 1, 4, 222, 92, 58, 1, 4, 211, 178, 58, 1, 4, 223,
+ 50, 242, 181, 218, 130, 58, 1, 245, 21, 138, 130, 58, 1, 125, 138, 130,
+ 58, 1, 230, 226, 138, 130, 58, 1, 121, 138, 130, 58, 1, 245, 20, 138,
+ 130, 58, 1, 210, 254, 248, 45, 138, 78, 58, 1, 211, 70, 248, 45, 138, 78,
+ 58, 1, 213, 133, 58, 1, 214, 186, 58, 1, 52, 254, 58, 58, 1, 121, 124,
+ 253, 250, 58, 1, 121, 120, 253, 250, 58, 1, 121, 43, 253, 250, 58, 1,
+ 121, 44, 253, 250, 58, 1, 121, 222, 234, 58, 1, 230, 225, 242, 138, 255,
+ 15, 58, 1, 230, 225, 52, 242, 138, 255, 15, 58, 1, 230, 225, 52, 255, 4,
+ 255, 15, 58, 1, 121, 183, 58, 1, 223, 158, 249, 227, 58, 1, 252, 59, 125,
+ 216, 31, 58, 1, 245, 144, 125, 216, 31, 58, 1, 252, 59, 121, 216, 31, 58,
+ 1, 245, 144, 121, 216, 31, 58, 1, 220, 55, 58, 1, 204, 220, 55, 58, 1,
+ 121, 43, 74, 38, 242, 138, 255, 15, 38, 255, 4, 255, 15, 38, 250, 32,
+ 255, 15, 38, 183, 38, 231, 233, 38, 226, 120, 38, 251, 147, 38, 59, 48,
+ 38, 248, 2, 38, 241, 53, 48, 38, 222, 235, 48, 38, 52, 255, 4, 255, 15,
+ 38, 250, 235, 38, 67, 232, 215, 48, 38, 52, 67, 232, 215, 48, 38, 52,
+ 242, 138, 255, 15, 38, 251, 0, 38, 235, 194, 251, 147, 38, 215, 94, 249,
+ 221, 48, 38, 249, 221, 48, 38, 223, 50, 249, 221, 48, 38, 249, 221, 77,
+ 222, 252, 38, 242, 138, 255, 16, 51, 38, 255, 4, 255, 16, 51, 38, 43,
+ 217, 89, 51, 38, 44, 217, 89, 51, 38, 43, 254, 111, 48, 38, 240, 249, 38,
+ 43, 163, 222, 235, 51, 38, 120, 217, 89, 51, 38, 124, 217, 89, 51, 38,
+ 96, 5, 51, 38, 230, 183, 5, 51, 38, 226, 65, 241, 53, 51, 38, 223, 56,
+ 241, 53, 51, 38, 59, 51, 38, 248, 3, 51, 38, 222, 235, 51, 38, 249, 221,
+ 51, 38, 250, 184, 38, 226, 225, 38, 67, 232, 215, 51, 38, 251, 141, 51,
+ 38, 235, 194, 52, 254, 25, 51, 38, 250, 236, 51, 38, 250, 32, 255, 16,
+ 51, 38, 251, 148, 51, 38, 235, 194, 251, 148, 51, 38, 216, 90, 51, 38,
+ 231, 234, 51, 38, 121, 232, 214, 38, 52, 121, 232, 214, 38, 216, 90, 226,
+ 121, 38, 219, 252, 218, 104, 226, 121, 38, 199, 218, 104, 226, 121, 38,
+ 219, 252, 219, 48, 226, 121, 38, 199, 219, 48, 226, 121, 38, 44, 163,
+ 222, 235, 51, 38, 235, 194, 251, 141, 51, 38, 42, 51, 38, 221, 181, 51,
+ 38, 211, 179, 48, 38, 67, 183, 38, 52, 226, 120, 38, 242, 138, 138, 78,
+ 38, 255, 4, 138, 78, 38, 26, 225, 176, 38, 26, 234, 3, 38, 26, 247, 253,
+ 216, 19, 38, 26, 210, 219, 38, 251, 141, 48, 38, 245, 99, 5, 51, 38, 52,
+ 67, 232, 215, 51, 38, 43, 254, 111, 51, 38, 228, 53, 216, 90, 48, 38,
+ 241, 59, 48, 38, 254, 149, 128, 216, 43, 48, 38, 43, 44, 80, 51, 38, 214,
+ 153, 80, 51, 38, 242, 143, 235, 64, 38, 44, 253, 251, 48, 38, 43, 163,
+ 222, 235, 48, 38, 244, 132, 38, 211, 179, 51, 38, 43, 253, 251, 51, 38,
+ 44, 253, 251, 51, 38, 44, 253, 251, 22, 120, 253, 251, 51, 38, 44, 163,
+ 222, 235, 48, 38, 59, 77, 222, 252, 38, 253, 218, 51, 38, 52, 222, 235,
+ 51, 38, 210, 35, 48, 38, 52, 251, 148, 51, 38, 52, 251, 147, 38, 52, 231,
+ 233, 38, 52, 231, 234, 51, 38, 52, 183, 38, 52, 235, 194, 251, 147, 38,
+ 52, 97, 80, 51, 38, 7, 4, 1, 61, 38, 7, 4, 1, 75, 38, 7, 4, 1, 73, 38, 7,
+ 4, 1, 76, 38, 7, 4, 1, 70, 38, 7, 4, 1, 251, 67, 38, 7, 4, 1, 249, 61,
+ 38, 7, 4, 1, 242, 61, 38, 7, 4, 1, 193, 38, 7, 4, 1, 153, 38, 7, 4, 1,
+ 217, 153, 38, 7, 4, 1, 214, 105, 38, 7, 4, 1, 211, 178, 26, 6, 1, 241,
+ 197, 26, 4, 1, 241, 197, 26, 6, 1, 254, 24, 221, 247, 26, 4, 1, 254, 24,
+ 221, 247, 26, 227, 199, 50, 26, 232, 109, 227, 199, 50, 26, 6, 1, 226,
+ 52, 247, 228, 26, 4, 1, 226, 52, 247, 228, 26, 210, 219, 26, 4, 223, 50,
+ 232, 84, 219, 179, 87, 26, 4, 246, 119, 232, 84, 219, 179, 87, 26, 4,
+ 223, 50, 246, 119, 232, 84, 219, 179, 87, 26, 224, 14, 78, 26, 216, 19,
+ 26, 247, 253, 216, 19, 26, 6, 1, 254, 145, 2, 216, 19, 26, 254, 98, 217,
+ 3, 26, 6, 1, 245, 102, 2, 216, 19, 26, 6, 1, 245, 65, 2, 216, 19, 26, 6,
+ 1, 235, 187, 2, 216, 19, 26, 6, 1, 226, 201, 2, 216, 19, 26, 6, 1, 214,
+ 158, 2, 216, 19, 26, 6, 1, 226, 203, 2, 216, 19, 26, 4, 1, 235, 187, 2,
+ 247, 253, 22, 216, 19, 26, 6, 1, 254, 144, 26, 6, 1, 252, 27, 26, 6, 1,
+ 243, 108, 26, 6, 1, 248, 55, 26, 6, 1, 245, 101, 26, 6, 1, 210, 85, 26,
+ 6, 1, 245, 64, 26, 6, 1, 216, 180, 26, 6, 1, 235, 186, 26, 6, 1, 234,
+ 223, 26, 6, 1, 233, 99, 26, 6, 1, 230, 103, 26, 6, 1, 227, 238, 26, 6, 1,
+ 211, 157, 26, 6, 1, 226, 200, 26, 6, 1, 225, 109, 26, 6, 1, 223, 38, 26,
+ 6, 1, 219, 178, 26, 6, 1, 217, 42, 26, 6, 1, 214, 157, 26, 6, 1, 225,
+ 134, 26, 6, 1, 250, 111, 26, 6, 1, 224, 162, 26, 6, 1, 226, 202, 26, 6,
+ 1, 235, 187, 2, 247, 252, 26, 6, 1, 214, 158, 2, 247, 252, 26, 4, 1, 254,
+ 145, 2, 216, 19, 26, 4, 1, 245, 102, 2, 216, 19, 26, 4, 1, 245, 65, 2,
+ 216, 19, 26, 4, 1, 235, 187, 2, 216, 19, 26, 4, 1, 214, 158, 2, 247, 253,
+ 22, 216, 19, 26, 4, 1, 254, 144, 26, 4, 1, 252, 27, 26, 4, 1, 243, 108,
+ 26, 4, 1, 248, 55, 26, 4, 1, 245, 101, 26, 4, 1, 210, 85, 26, 4, 1, 245,
+ 64, 26, 4, 1, 216, 180, 26, 4, 1, 235, 186, 26, 4, 1, 234, 223, 26, 4, 1,
+ 233, 99, 26, 4, 1, 230, 103, 26, 4, 1, 227, 238, 26, 4, 1, 211, 157, 26,
+ 4, 1, 226, 200, 26, 4, 1, 225, 109, 26, 4, 1, 223, 38, 26, 4, 1, 40, 219,
+ 178, 26, 4, 1, 219, 178, 26, 4, 1, 217, 42, 26, 4, 1, 214, 157, 26, 4, 1,
+ 225, 134, 26, 4, 1, 250, 111, 26, 4, 1, 224, 162, 26, 4, 1, 226, 202, 26,
+ 4, 1, 235, 187, 2, 247, 252, 26, 4, 1, 214, 158, 2, 247, 252, 26, 4, 1,
+ 226, 201, 2, 216, 19, 26, 4, 1, 214, 158, 2, 216, 19, 26, 4, 1, 226, 203,
+ 2, 216, 19, 26, 6, 234, 248, 87, 26, 252, 28, 87, 26, 216, 181, 87, 26,
+ 214, 158, 2, 241, 53, 87, 26, 214, 158, 2, 255, 4, 22, 241, 53, 87, 26,
+ 214, 158, 2, 248, 3, 22, 241, 53, 87, 26, 225, 135, 87, 26, 225, 110, 87,
+ 26, 234, 248, 87, 26, 1, 254, 24, 234, 7, 26, 4, 1, 254, 24, 234, 7, 26,
+ 1, 218, 138, 26, 4, 1, 218, 138, 26, 1, 247, 228, 26, 4, 1, 247, 228, 26,
+ 1, 234, 7, 26, 4, 1, 234, 7, 26, 1, 221, 247, 26, 4, 1, 221, 247, 81, 6,
+ 1, 220, 56, 81, 4, 1, 220, 56, 81, 6, 1, 244, 141, 81, 4, 1, 244, 141,
+ 81, 6, 1, 234, 118, 81, 4, 1, 234, 118, 81, 6, 1, 241, 46, 81, 4, 1, 241,
+ 46, 81, 6, 1, 243, 103, 81, 4, 1, 243, 103, 81, 6, 1, 220, 23, 81, 4, 1,
+ 220, 23, 81, 6, 1, 248, 70, 81, 4, 1, 248, 70, 26, 234, 224, 87, 26, 223,
+ 39, 87, 26, 232, 84, 219, 179, 87, 26, 1, 210, 224, 26, 6, 216, 181, 87,
+ 26, 232, 84, 245, 102, 87, 26, 223, 50, 232, 84, 245, 102, 87, 26, 6, 1,
+ 220, 8, 26, 4, 1, 220, 8, 26, 6, 232, 84, 219, 179, 87, 26, 6, 1, 221,
+ 244, 26, 4, 1, 221, 244, 26, 223, 39, 2, 218, 104, 87, 26, 6, 223, 50,
+ 232, 84, 219, 179, 87, 26, 6, 246, 119, 232, 84, 219, 179, 87, 26, 6,
+ 223, 50, 246, 119, 232, 84, 219, 179, 87, 33, 6, 1, 236, 62, 2, 242, 137,
+ 33, 6, 1, 235, 190, 33, 6, 1, 247, 163, 33, 6, 1, 242, 188, 33, 6, 1,
+ 214, 202, 236, 61, 33, 6, 1, 246, 37, 33, 6, 1, 251, 77, 73, 33, 6, 1,
+ 211, 8, 33, 6, 1, 235, 127, 33, 6, 1, 232, 188, 33, 6, 1, 228, 179, 33,
+ 6, 1, 215, 175, 33, 6, 1, 234, 49, 33, 6, 1, 240, 155, 2, 242, 137, 33,
+ 6, 1, 219, 252, 70, 33, 6, 1, 246, 33, 33, 6, 1, 61, 33, 6, 1, 252, 76,
+ 33, 6, 1, 213, 255, 33, 6, 1, 242, 237, 33, 6, 1, 248, 91, 33, 6, 1, 236,
+ 61, 33, 6, 1, 210, 74, 33, 6, 1, 210, 94, 33, 6, 1, 73, 33, 6, 1, 219,
+ 252, 73, 33, 6, 1, 176, 33, 6, 1, 245, 175, 33, 6, 1, 245, 160, 33, 6, 1,
+ 245, 151, 33, 6, 1, 76, 33, 6, 1, 225, 222, 33, 6, 1, 245, 93, 33, 6, 1,
+ 245, 83, 33, 6, 1, 217, 23, 33, 6, 1, 70, 33, 6, 1, 245, 203, 33, 6, 1,
+ 162, 33, 6, 1, 215, 179, 33, 6, 1, 250, 132, 33, 6, 1, 220, 103, 33, 6,
+ 1, 220, 66, 33, 6, 1, 242, 4, 50, 33, 6, 1, 211, 27, 33, 6, 1, 219, 53,
+ 50, 33, 6, 1, 75, 33, 6, 1, 210, 212, 33, 6, 1, 191, 33, 4, 1, 61, 33, 4,
+ 1, 252, 76, 33, 4, 1, 213, 255, 33, 4, 1, 242, 237, 33, 4, 1, 248, 91,
+ 33, 4, 1, 236, 61, 33, 4, 1, 210, 74, 33, 4, 1, 210, 94, 33, 4, 1, 73,
+ 33, 4, 1, 219, 252, 73, 33, 4, 1, 176, 33, 4, 1, 245, 175, 33, 4, 1, 245,
+ 160, 33, 4, 1, 245, 151, 33, 4, 1, 76, 33, 4, 1, 225, 222, 33, 4, 1, 245,
+ 93, 33, 4, 1, 245, 83, 33, 4, 1, 217, 23, 33, 4, 1, 70, 33, 4, 1, 245,
+ 203, 33, 4, 1, 162, 33, 4, 1, 215, 179, 33, 4, 1, 250, 132, 33, 4, 1,
+ 220, 103, 33, 4, 1, 220, 66, 33, 4, 1, 242, 4, 50, 33, 4, 1, 211, 27, 33,
+ 4, 1, 219, 53, 50, 33, 4, 1, 75, 33, 4, 1, 210, 212, 33, 4, 1, 191, 33,
+ 4, 1, 236, 62, 2, 242, 137, 33, 4, 1, 235, 190, 33, 4, 1, 247, 163, 33,
+ 4, 1, 242, 188, 33, 4, 1, 214, 202, 236, 61, 33, 4, 1, 246, 37, 33, 4, 1,
+ 251, 77, 73, 33, 4, 1, 211, 8, 33, 4, 1, 235, 127, 33, 4, 1, 232, 188,
+ 33, 4, 1, 228, 179, 33, 4, 1, 215, 175, 33, 4, 1, 234, 49, 33, 4, 1, 240,
+ 155, 2, 242, 137, 33, 4, 1, 219, 252, 70, 33, 4, 1, 246, 33, 33, 6, 1,
+ 226, 202, 33, 4, 1, 226, 202, 33, 6, 1, 211, 59, 33, 4, 1, 211, 59, 33,
+ 6, 1, 235, 184, 75, 33, 4, 1, 235, 184, 75, 33, 6, 1, 232, 193, 210, 183,
+ 33, 4, 1, 232, 193, 210, 183, 33, 6, 1, 235, 184, 232, 193, 210, 183, 33,
+ 4, 1, 235, 184, 232, 193, 210, 183, 33, 6, 1, 251, 250, 210, 183, 33, 4,
+ 1, 251, 250, 210, 183, 33, 6, 1, 235, 184, 251, 250, 210, 183, 33, 4, 1,
+ 235, 184, 251, 250, 210, 183, 33, 6, 1, 233, 234, 33, 4, 1, 233, 234, 33,
+ 6, 1, 224, 162, 33, 4, 1, 224, 162, 33, 6, 1, 244, 83, 33, 4, 1, 244, 83,
+ 33, 6, 1, 235, 147, 33, 4, 1, 235, 147, 33, 6, 1, 235, 148, 2, 52, 242,
+ 138, 255, 15, 33, 4, 1, 235, 148, 2, 52, 242, 138, 255, 15, 33, 6, 1,
+ 214, 205, 33, 4, 1, 214, 205, 33, 6, 1, 222, 186, 226, 202, 33, 4, 1,
+ 222, 186, 226, 202, 33, 6, 1, 226, 203, 2, 216, 66, 33, 4, 1, 226, 203,
+ 2, 216, 66, 33, 6, 1, 226, 141, 33, 4, 1, 226, 141, 33, 6, 1, 234, 7, 33,
+ 4, 1, 234, 7, 33, 216, 147, 50, 38, 33, 216, 66, 38, 33, 226, 66, 38, 33,
+ 248, 155, 225, 19, 38, 33, 224, 156, 225, 19, 38, 33, 225, 4, 38, 33,
+ 240, 212, 216, 147, 50, 38, 33, 230, 192, 50, 33, 6, 1, 219, 252, 240,
+ 155, 2, 217, 78, 33, 4, 1, 219, 252, 240, 155, 2, 217, 78, 33, 6, 1, 220,
+ 147, 50, 33, 4, 1, 220, 147, 50, 33, 6, 1, 245, 94, 2, 216, 115, 33, 4,
+ 1, 245, 94, 2, 216, 115, 33, 6, 1, 242, 238, 2, 214, 156, 33, 4, 1, 242,
+ 238, 2, 214, 156, 33, 6, 1, 242, 238, 2, 91, 33, 4, 1, 242, 238, 2, 91,
+ 33, 6, 1, 242, 238, 2, 230, 225, 103, 33, 4, 1, 242, 238, 2, 230, 225,
+ 103, 33, 6, 1, 210, 75, 2, 248, 40, 33, 4, 1, 210, 75, 2, 248, 40, 33, 6,
+ 1, 210, 95, 2, 248, 40, 33, 4, 1, 210, 95, 2, 248, 40, 33, 6, 1, 235, 14,
+ 2, 248, 40, 33, 4, 1, 235, 14, 2, 248, 40, 33, 6, 1, 235, 14, 2, 67, 91,
+ 33, 4, 1, 235, 14, 2, 67, 91, 33, 6, 1, 235, 14, 2, 91, 33, 4, 1, 235,
+ 14, 2, 91, 33, 6, 1, 252, 125, 176, 33, 4, 1, 252, 125, 176, 33, 6, 1,
+ 245, 152, 2, 248, 40, 33, 4, 1, 245, 152, 2, 248, 40, 33, 6, 27, 245,
+ 152, 242, 237, 33, 4, 27, 245, 152, 242, 237, 33, 6, 1, 225, 223, 2, 230,
+ 225, 103, 33, 4, 1, 225, 223, 2, 230, 225, 103, 33, 6, 1, 255, 21, 162,
+ 33, 4, 1, 255, 21, 162, 33, 6, 1, 245, 84, 2, 248, 40, 33, 4, 1, 245, 84,
+ 2, 248, 40, 33, 6, 1, 217, 24, 2, 248, 40, 33, 4, 1, 217, 24, 2, 248, 40,
+ 33, 6, 1, 218, 122, 70, 33, 4, 1, 218, 122, 70, 33, 6, 1, 218, 122, 104,
+ 2, 91, 33, 4, 1, 218, 122, 104, 2, 91, 33, 6, 1, 242, 50, 2, 248, 40, 33,
+ 4, 1, 242, 50, 2, 248, 40, 33, 6, 27, 217, 24, 215, 179, 33, 4, 27, 217,
+ 24, 215, 179, 33, 6, 1, 250, 133, 2, 248, 40, 33, 4, 1, 250, 133, 2, 248,
+ 40, 33, 6, 1, 250, 133, 2, 67, 91, 33, 4, 1, 250, 133, 2, 67, 91, 33, 6,
+ 1, 220, 34, 33, 4, 1, 220, 34, 33, 6, 1, 255, 21, 250, 132, 33, 4, 1,
+ 255, 21, 250, 132, 33, 6, 1, 255, 21, 250, 133, 2, 248, 40, 33, 4, 1,
+ 255, 21, 250, 133, 2, 248, 40, 33, 1, 226, 59, 33, 6, 1, 210, 75, 2, 251,
+ 147, 33, 4, 1, 210, 75, 2, 251, 147, 33, 6, 1, 235, 14, 2, 103, 33, 4, 1,
+ 235, 14, 2, 103, 33, 6, 1, 245, 176, 2, 217, 78, 33, 4, 1, 245, 176, 2,
+ 217, 78, 33, 6, 1, 245, 152, 2, 103, 33, 4, 1, 245, 152, 2, 103, 33, 6,
+ 1, 245, 152, 2, 217, 78, 33, 4, 1, 245, 152, 2, 217, 78, 33, 6, 1, 234,
+ 128, 250, 132, 33, 4, 1, 234, 128, 250, 132, 33, 6, 1, 245, 161, 2, 217,
+ 78, 33, 4, 1, 245, 161, 2, 217, 78, 33, 4, 1, 226, 59, 33, 6, 1, 115, 2,
+ 251, 147, 33, 4, 1, 115, 2, 251, 147, 33, 6, 1, 115, 2, 248, 2, 33, 4, 1,
+ 115, 2, 248, 2, 33, 6, 27, 115, 236, 61, 33, 4, 27, 115, 236, 61, 33, 6,
+ 1, 236, 62, 2, 251, 147, 33, 4, 1, 236, 62, 2, 251, 147, 33, 6, 1, 221,
+ 196, 33, 4, 1, 221, 196, 33, 6, 1, 221, 197, 2, 248, 2, 33, 4, 1, 221,
+ 197, 2, 248, 2, 33, 6, 1, 210, 75, 2, 248, 2, 33, 4, 1, 210, 75, 2, 248,
+ 2, 33, 6, 1, 210, 95, 2, 248, 2, 33, 4, 1, 210, 95, 2, 248, 2, 33, 6, 1,
+ 255, 21, 246, 37, 33, 4, 1, 255, 21, 246, 37, 33, 6, 1, 240, 155, 2, 231,
+ 233, 33, 4, 1, 240, 155, 2, 231, 233, 33, 6, 1, 240, 155, 2, 248, 2, 33,
+ 4, 1, 240, 155, 2, 248, 2, 33, 6, 1, 144, 2, 248, 2, 33, 4, 1, 144, 2,
+ 248, 2, 33, 6, 1, 252, 135, 76, 33, 4, 1, 252, 135, 76, 33, 6, 1, 252,
+ 135, 144, 2, 248, 2, 33, 4, 1, 252, 135, 144, 2, 248, 2, 33, 6, 1, 160,
+ 2, 248, 2, 33, 4, 1, 160, 2, 248, 2, 33, 6, 1, 104, 2, 231, 233, 33, 4,
+ 1, 104, 2, 231, 233, 33, 6, 1, 104, 2, 248, 2, 33, 4, 1, 104, 2, 248, 2,
+ 33, 6, 1, 104, 2, 52, 142, 33, 4, 1, 104, 2, 52, 142, 33, 6, 1, 250, 133,
+ 2, 248, 2, 33, 4, 1, 250, 133, 2, 248, 2, 33, 6, 1, 242, 238, 2, 248, 40,
+ 33, 4, 1, 242, 238, 2, 248, 40, 33, 6, 1, 211, 28, 2, 248, 2, 33, 4, 1,
+ 211, 28, 2, 248, 2, 33, 6, 1, 242, 238, 2, 218, 104, 22, 103, 33, 4, 1,
+ 242, 238, 2, 218, 104, 22, 103, 33, 6, 1, 242, 50, 2, 103, 33, 4, 1, 242,
+ 50, 2, 103, 33, 6, 1, 242, 50, 2, 91, 33, 4, 1, 242, 50, 2, 91, 33, 6, 1,
+ 234, 15, 248, 91, 33, 4, 1, 234, 15, 248, 91, 33, 6, 1, 234, 15, 247,
+ 163, 33, 4, 1, 234, 15, 247, 163, 33, 6, 1, 234, 15, 210, 27, 33, 4, 1,
+ 234, 15, 210, 27, 33, 6, 1, 234, 15, 246, 31, 33, 4, 1, 234, 15, 246, 31,
+ 33, 6, 1, 234, 15, 232, 188, 33, 4, 1, 234, 15, 232, 188, 33, 6, 1, 234,
+ 15, 228, 179, 33, 4, 1, 234, 15, 228, 179, 33, 6, 1, 234, 15, 219, 110,
+ 33, 4, 1, 234, 15, 219, 110, 33, 6, 1, 234, 15, 216, 61, 33, 4, 1, 234,
+ 15, 216, 61, 33, 6, 1, 223, 50, 210, 94, 33, 4, 1, 223, 50, 210, 94, 33,
+ 6, 1, 245, 176, 2, 103, 33, 4, 1, 245, 176, 2, 103, 33, 6, 1, 232, 255,
+ 33, 4, 1, 232, 255, 33, 6, 1, 223, 40, 33, 4, 1, 223, 40, 33, 6, 1, 211,
+ 92, 33, 4, 1, 211, 92, 33, 6, 1, 224, 89, 33, 4, 1, 224, 89, 33, 6, 1,
+ 212, 22, 33, 4, 1, 212, 22, 33, 6, 1, 254, 167, 176, 33, 4, 1, 254, 167,
+ 176, 33, 6, 1, 245, 176, 2, 230, 225, 103, 33, 4, 1, 245, 176, 2, 230,
+ 225, 103, 33, 6, 1, 245, 152, 2, 230, 225, 103, 33, 4, 1, 245, 152, 2,
+ 230, 225, 103, 33, 6, 1, 225, 223, 2, 248, 40, 33, 4, 1, 225, 223, 2,
+ 248, 40, 33, 6, 1, 220, 35, 2, 248, 40, 33, 4, 1, 220, 35, 2, 248, 40,
+ 150, 6, 1, 253, 165, 150, 6, 1, 252, 40, 150, 6, 1, 242, 204, 150, 6, 1,
+ 248, 222, 150, 6, 1, 245, 214, 150, 6, 1, 210, 116, 150, 6, 1, 245, 198,
+ 150, 6, 1, 245, 66, 150, 6, 1, 111, 150, 6, 1, 210, 74, 150, 6, 1, 235,
+ 228, 150, 6, 1, 232, 191, 150, 6, 1, 211, 160, 150, 6, 1, 251, 34, 150,
+ 6, 1, 234, 166, 150, 6, 1, 241, 69, 150, 6, 1, 235, 142, 150, 6, 1, 242,
+ 247, 150, 6, 1, 250, 127, 150, 6, 1, 231, 59, 150, 6, 1, 211, 8, 150, 6,
+ 1, 228, 40, 150, 6, 1, 220, 103, 150, 6, 1, 213, 138, 150, 6, 1, 250,
+ 158, 150, 6, 1, 225, 206, 150, 6, 1, 235, 111, 150, 6, 1, 205, 150, 6, 1,
+ 221, 162, 150, 6, 1, 213, 179, 150, 6, 1, 216, 63, 150, 6, 1, 223, 96,
+ 150, 6, 1, 249, 239, 150, 6, 1, 210, 249, 150, 6, 1, 225, 47, 150, 6, 1,
+ 234, 177, 150, 6, 1, 226, 223, 150, 6, 1, 244, 143, 150, 58, 1, 43, 163,
+ 222, 234, 150, 254, 58, 150, 245, 155, 78, 150, 245, 32, 78, 150, 249,
+ 220, 150, 224, 14, 78, 150, 255, 22, 78, 150, 4, 1, 253, 165, 150, 4, 1,
+ 252, 40, 150, 4, 1, 242, 204, 150, 4, 1, 248, 222, 150, 4, 1, 245, 214,
+ 150, 4, 1, 210, 116, 150, 4, 1, 245, 198, 150, 4, 1, 245, 66, 150, 4, 1,
+ 111, 150, 4, 1, 210, 74, 150, 4, 1, 235, 228, 150, 4, 1, 232, 191, 150,
+ 4, 1, 211, 160, 150, 4, 1, 251, 34, 150, 4, 1, 234, 166, 150, 4, 1, 241,
+ 69, 150, 4, 1, 235, 142, 150, 4, 1, 242, 247, 150, 4, 1, 250, 127, 150,
+ 4, 1, 231, 59, 150, 4, 1, 211, 8, 150, 4, 1, 228, 40, 150, 4, 1, 220,
+ 103, 150, 4, 1, 213, 138, 150, 4, 1, 250, 158, 150, 4, 1, 225, 206, 150,
+ 4, 1, 235, 111, 150, 4, 1, 205, 150, 4, 1, 221, 162, 150, 4, 1, 213, 179,
+ 150, 4, 1, 216, 63, 150, 4, 1, 223, 96, 150, 4, 1, 249, 239, 150, 4, 1,
+ 210, 249, 150, 4, 1, 225, 47, 150, 4, 1, 234, 177, 150, 4, 1, 226, 223,
+ 150, 4, 1, 244, 143, 150, 4, 27, 245, 215, 210, 249, 150, 243, 230, 218,
+ 130, 150, 240, 169, 150, 246, 96, 50, 94, 255, 16, 245, 58, 94, 255, 16,
+ 221, 163, 94, 255, 16, 220, 89, 94, 255, 16, 210, 104, 224, 72, 94, 255,
+ 16, 210, 104, 243, 126, 94, 255, 16, 216, 76, 94, 255, 16, 223, 48, 94,
+ 255, 16, 210, 103, 94, 255, 16, 225, 246, 94, 255, 16, 211, 20, 94, 255,
+ 16, 216, 215, 94, 255, 16, 243, 42, 94, 255, 16, 243, 43, 230, 70, 94,
+ 255, 16, 243, 40, 94, 255, 16, 224, 73, 226, 17, 94, 255, 16, 216, 254,
+ 243, 57, 94, 255, 16, 225, 227, 94, 255, 16, 253, 201, 242, 42, 94, 255,
+ 16, 230, 80, 94, 255, 16, 231, 209, 94, 255, 16, 231, 50, 94, 255, 16,
+ 231, 51, 234, 178, 94, 255, 16, 248, 164, 94, 255, 16, 224, 84, 94, 255,
+ 16, 216, 254, 224, 68, 94, 255, 16, 211, 30, 252, 41, 210, 230, 94, 255,
+ 16, 226, 208, 94, 255, 16, 236, 20, 94, 255, 16, 248, 71, 94, 255, 16,
+ 210, 33, 94, 164, 231, 144, 250, 36, 94, 225, 12, 220, 37, 94, 225, 12,
+ 241, 251, 221, 163, 94, 225, 12, 241, 251, 225, 240, 94, 225, 12, 241,
+ 251, 224, 77, 94, 225, 12, 241, 159, 94, 225, 12, 215, 177, 94, 225, 12,
+ 221, 163, 94, 225, 12, 225, 240, 94, 225, 12, 224, 77, 94, 225, 12, 241,
+ 62, 94, 225, 12, 241, 63, 241, 253, 31, 214, 3, 94, 225, 12, 224, 18, 94,
+ 225, 12, 248, 209, 177, 231, 172, 94, 225, 12, 231, 39, 94, 224, 142,
+ 231, 169, 94, 225, 12, 223, 170, 94, 224, 142, 225, 248, 94, 225, 12,
+ 220, 22, 247, 121, 94, 225, 12, 219, 160, 247, 121, 94, 224, 142, 219,
+ 54, 225, 242, 94, 164, 214, 160, 247, 121, 94, 164, 232, 109, 247, 121,
+ 94, 224, 142, 227, 196, 242, 41, 94, 225, 12, 224, 78, 224, 72, 94, 1,
+ 254, 171, 94, 1, 252, 29, 94, 1, 242, 202, 94, 1, 248, 190, 94, 1, 241,
+ 239, 94, 1, 214, 3, 94, 1, 210, 97, 94, 1, 241, 198, 94, 1, 216, 231, 94,
+ 1, 210, 233, 94, 1, 40, 234, 251, 94, 1, 234, 251, 94, 1, 233, 95, 94, 1,
+ 40, 231, 66, 94, 1, 231, 66, 94, 1, 40, 227, 195, 94, 1, 227, 195, 94, 1,
+ 221, 250, 94, 1, 253, 163, 94, 1, 40, 225, 222, 94, 1, 225, 222, 94, 1,
+ 40, 215, 180, 94, 1, 215, 180, 94, 1, 224, 40, 94, 1, 223, 68, 94, 1,
+ 220, 21, 94, 1, 217, 39, 94, 27, 211, 6, 52, 214, 3, 94, 27, 211, 6, 214,
+ 4, 210, 233, 94, 27, 211, 6, 52, 210, 233, 94, 224, 142, 243, 42, 94,
+ 224, 142, 243, 40, 10, 54, 50, 10, 5, 221, 243, 10, 244, 31, 231, 155,
+ 10, 5, 222, 24, 10, 5, 221, 246, 254, 38, 249, 110, 222, 194, 254, 38,
+ 244, 5, 222, 194, 10, 223, 135, 254, 38, 225, 184, 230, 194, 50, 254, 38,
+ 225, 184, 216, 249, 216, 149, 50, 254, 222, 50, 10, 249, 220, 10, 248,
+ 151, 220, 138, 10, 225, 14, 213, 241, 50, 10, 5, 230, 175, 10, 5, 222, 4,
+ 254, 173, 212, 45, 10, 5, 254, 173, 253, 222, 10, 5, 223, 168, 254, 172,
+ 10, 5, 223, 176, 254, 153, 254, 105, 10, 5, 217, 71, 10, 4, 125, 217, 81,
+ 10, 4, 125, 27, 112, 2, 233, 104, 2, 211, 43, 10, 4, 125, 210, 108, 10,
+ 4, 244, 166, 10, 4, 248, 185, 10, 4, 234, 206, 10, 220, 151, 10, 215,
+ 212, 59, 224, 142, 78, 10, 224, 14, 78, 10, 1, 234, 210, 211, 43, 10, 1,
+ 242, 20, 10, 1, 112, 2, 231, 229, 48, 10, 1, 112, 2, 202, 48, 10, 1, 212,
+ 31, 2, 202, 48, 10, 1, 112, 2, 202, 51, 10, 1, 79, 2, 202, 48, 10, 1,
+ 254, 171, 10, 1, 252, 55, 10, 1, 217, 9, 231, 165, 10, 1, 217, 8, 10, 1,
+ 216, 193, 10, 1, 235, 124, 10, 1, 242, 38, 10, 1, 234, 130, 10, 1, 248,
+ 196, 10, 1, 216, 203, 10, 1, 223, 96, 10, 1, 210, 108, 10, 1, 221, 167,
+ 10, 1, 220, 60, 10, 1, 222, 27, 10, 1, 248, 217, 10, 1, 217, 81, 10, 1,
+ 210, 111, 10, 1, 254, 197, 10, 1, 242, 245, 10, 1, 234, 176, 2, 113, 170,
+ 48, 10, 1, 234, 176, 2, 134, 170, 51, 10, 1, 244, 169, 79, 2, 235, 194,
+ 214, 105, 10, 1, 244, 169, 79, 2, 113, 170, 48, 10, 1, 244, 169, 79, 2,
+ 134, 170, 48, 10, 217, 44, 10, 1, 244, 143, 10, 1, 224, 82, 10, 1, 234,
+ 251, 10, 1, 233, 103, 10, 1, 231, 79, 10, 1, 228, 63, 10, 1, 241, 219,
+ 10, 1, 212, 30, 10, 1, 112, 231, 193, 10, 1, 211, 43, 10, 244, 164, 10,
+ 248, 183, 10, 234, 204, 10, 244, 166, 10, 248, 185, 10, 234, 206, 10,
+ 220, 94, 10, 218, 46, 10, 231, 227, 48, 10, 202, 48, 10, 202, 51, 10,
+ 218, 66, 254, 171, 10, 235, 194, 248, 185, 10, 164, 228, 64, 242, 219,
+ 10, 209, 255, 10, 25, 5, 4, 214, 106, 48, 10, 25, 5, 235, 194, 4, 214,
+ 106, 48, 10, 25, 5, 59, 51, 10, 223, 50, 248, 185, 10, 244, 167, 2, 113,
+ 247, 119, 10, 212, 32, 202, 51, 254, 38, 21, 210, 86, 254, 38, 21, 110,
+ 254, 38, 21, 105, 254, 38, 21, 158, 254, 38, 21, 161, 254, 38, 21, 189,
+ 254, 38, 21, 194, 254, 38, 21, 198, 254, 38, 21, 195, 254, 38, 21, 200,
+ 10, 225, 183, 50, 10, 248, 84, 220, 138, 10, 216, 147, 220, 138, 10, 244,
+ 82, 225, 10, 218, 157, 10, 1, 247, 120, 252, 55, 10, 1, 247, 120, 224,
+ 82, 10, 1, 218, 24, 254, 171, 10, 1, 112, 212, 46, 10, 1, 112, 2, 212,
+ 32, 202, 48, 10, 1, 112, 2, 212, 32, 202, 51, 10, 1, 125, 242, 20, 10, 1,
+ 125, 202, 254, 171, 10, 1, 125, 202, 212, 30, 10, 1, 104, 2, 202, 48, 10,
+ 1, 125, 202, 211, 43, 10, 1, 215, 149, 10, 1, 215, 147, 10, 1, 252, 65,
+ 10, 1, 217, 9, 2, 222, 234, 10, 1, 217, 9, 2, 134, 170, 77, 246, 104, 10,
+ 1, 225, 206, 10, 1, 217, 6, 10, 1, 252, 53, 10, 1, 122, 2, 202, 48, 10,
+ 1, 122, 2, 113, 170, 67, 48, 10, 1, 227, 154, 10, 1, 246, 44, 10, 1, 122,
+ 2, 134, 170, 48, 10, 1, 217, 27, 10, 1, 217, 25, 10, 1, 248, 131, 10, 1,
+ 248, 197, 2, 222, 234, 10, 1, 248, 197, 2, 59, 51, 10, 1, 248, 197, 2,
+ 59, 252, 44, 22, 4, 217, 81, 10, 1, 248, 202, 10, 1, 248, 133, 10, 1,
+ 246, 71, 10, 1, 248, 197, 2, 134, 170, 77, 246, 104, 10, 1, 248, 197, 2,
+ 244, 12, 170, 48, 10, 1, 222, 172, 10, 1, 223, 97, 2, 4, 214, 105, 10, 1,
+ 223, 97, 2, 222, 234, 10, 1, 223, 97, 2, 59, 51, 10, 1, 223, 97, 2, 4,
+ 214, 106, 51, 10, 1, 223, 97, 2, 59, 252, 44, 22, 59, 48, 10, 1, 223, 97,
+ 2, 113, 170, 48, 10, 1, 235, 121, 10, 1, 223, 97, 2, 244, 12, 170, 48,
+ 10, 1, 221, 168, 2, 59, 252, 44, 22, 59, 48, 10, 1, 221, 168, 2, 134,
+ 170, 51, 10, 1, 221, 168, 2, 134, 170, 252, 44, 22, 134, 170, 48, 10, 1,
+ 222, 28, 2, 113, 170, 51, 10, 1, 222, 28, 2, 134, 170, 48, 10, 1, 217,
+ 82, 2, 134, 170, 48, 10, 1, 254, 198, 2, 134, 170, 48, 10, 1, 247, 120,
+ 244, 143, 10, 1, 244, 144, 2, 59, 230, 110, 51, 10, 1, 244, 144, 2, 59,
+ 51, 10, 1, 213, 248, 10, 1, 244, 144, 2, 134, 170, 51, 10, 1, 225, 204,
+ 10, 1, 224, 83, 2, 59, 48, 10, 1, 224, 83, 2, 134, 170, 48, 10, 1, 234,
+ 175, 10, 1, 217, 251, 234, 251, 10, 1, 234, 252, 2, 222, 234, 10, 1, 234,
+ 252, 2, 59, 48, 10, 1, 229, 80, 10, 1, 234, 252, 2, 134, 170, 51, 10, 1,
+ 243, 123, 10, 1, 243, 124, 2, 222, 234, 10, 1, 229, 3, 10, 1, 243, 124,
+ 2, 113, 170, 51, 10, 1, 242, 102, 10, 1, 243, 124, 2, 134, 170, 48, 10,
+ 1, 233, 104, 2, 4, 214, 105, 10, 1, 233, 104, 2, 59, 48, 10, 1, 233, 104,
+ 2, 134, 170, 48, 10, 1, 233, 104, 2, 134, 170, 51, 10, 1, 228, 64, 2, 59,
+ 51, 10, 1, 228, 64, 242, 219, 10, 1, 222, 215, 10, 1, 228, 64, 2, 222,
+ 234, 10, 1, 228, 64, 2, 134, 170, 48, 10, 1, 241, 220, 247, 142, 10, 1,
+ 217, 28, 2, 59, 48, 10, 1, 241, 220, 2, 79, 48, 10, 1, 241, 220, 242,
+ 172, 10, 1, 241, 220, 242, 173, 2, 202, 48, 10, 1, 217, 9, 231, 166, 242,
+ 172, 10, 1, 212, 31, 2, 222, 234, 10, 1, 234, 74, 226, 235, 10, 1, 226,
+ 235, 10, 1, 70, 10, 1, 210, 212, 10, 1, 234, 74, 210, 212, 10, 1, 212,
+ 31, 2, 113, 170, 48, 10, 1, 213, 255, 10, 1, 244, 169, 211, 43, 10, 1,
+ 79, 2, 217, 78, 10, 1, 79, 2, 4, 214, 105, 10, 1, 212, 31, 2, 59, 48, 10,
+ 1, 75, 10, 1, 79, 2, 134, 170, 51, 10, 1, 79, 252, 133, 10, 1, 79, 252,
+ 134, 2, 202, 48, 10, 243, 230, 218, 130, 10, 1, 254, 244, 10, 4, 125, 27,
+ 222, 28, 2, 233, 104, 2, 112, 231, 193, 10, 4, 125, 27, 224, 83, 2, 233,
+ 104, 2, 112, 231, 193, 10, 4, 125, 66, 65, 17, 10, 4, 125, 233, 104, 254,
+ 171, 10, 4, 125, 235, 124, 10, 4, 125, 134, 247, 119, 10, 4, 125, 221,
+ 167, 10, 245, 144, 64, 253, 167, 10, 218, 153, 64, 222, 139, 245, 176,
+ 241, 156, 10, 4, 125, 222, 184, 210, 86, 10, 4, 125, 214, 159, 223, 116,
+ 210, 86, 10, 4, 125, 247, 120, 241, 237, 64, 234, 130, 10, 4, 125, 66,
+ 53, 17, 10, 4, 121, 221, 167, 10, 4, 125, 231, 228, 10, 4, 212, 30, 10,
+ 4, 211, 43, 10, 4, 125, 211, 43, 10, 4, 125, 228, 63, 10, 225, 42, 64,
+ 222, 14, 10, 245, 153, 250, 176, 121, 218, 130, 10, 245, 153, 250, 176,
+ 125, 218, 130, 10, 222, 184, 125, 218, 131, 2, 244, 105, 250, 175, 10, 4,
+ 121, 231, 79, 10, 1, 248, 197, 2, 235, 194, 214, 105, 10, 1, 223, 97, 2,
+ 235, 194, 214, 105, 245, 23, 254, 38, 21, 210, 86, 245, 23, 254, 38, 21,
+ 110, 245, 23, 254, 38, 21, 105, 245, 23, 254, 38, 21, 158, 245, 23, 254,
+ 38, 21, 161, 245, 23, 254, 38, 21, 189, 245, 23, 254, 38, 21, 194, 245,
+ 23, 254, 38, 21, 198, 245, 23, 254, 38, 21, 195, 245, 23, 254, 38, 21,
+ 200, 10, 1, 220, 61, 2, 59, 51, 10, 1, 248, 218, 2, 59, 51, 10, 1, 242,
+ 246, 2, 59, 51, 10, 5, 219, 159, 254, 127, 10, 5, 219, 159, 224, 236,
+ 231, 59, 10, 1, 241, 220, 2, 235, 194, 214, 105, 182, 245, 144, 64, 226,
+ 15, 182, 218, 20, 243, 230, 218, 130, 182, 218, 68, 243, 230, 218, 130,
+ 182, 218, 20, 249, 227, 182, 218, 68, 249, 227, 182, 203, 249, 227, 182,
+ 249, 228, 219, 107, 233, 47, 182, 249, 228, 219, 107, 222, 252, 182, 218,
+ 20, 249, 228, 219, 107, 233, 47, 182, 218, 68, 249, 228, 219, 107, 222,
+ 252, 182, 249, 181, 182, 242, 2, 226, 251, 182, 242, 2, 231, 37, 182,
+ 242, 2, 253, 219, 182, 255, 22, 78, 182, 1, 254, 175, 182, 1, 218, 24,
+ 254, 175, 182, 1, 252, 26, 182, 1, 243, 114, 182, 1, 243, 115, 243, 92,
+ 182, 1, 248, 193, 182, 1, 247, 120, 248, 194, 222, 230, 182, 1, 241, 239,
+ 182, 1, 212, 30, 182, 1, 210, 108, 182, 1, 241, 196, 182, 1, 216, 227,
+ 182, 1, 216, 228, 243, 92, 182, 1, 210, 199, 182, 1, 210, 200, 241, 239,
+ 182, 1, 234, 226, 182, 1, 233, 102, 182, 1, 230, 191, 182, 1, 227, 195,
+ 182, 1, 220, 144, 182, 1, 40, 220, 144, 182, 1, 75, 182, 1, 225, 222,
+ 182, 1, 223, 50, 225, 222, 182, 1, 222, 25, 182, 1, 224, 76, 182, 1, 222,
+ 230, 182, 1, 220, 21, 182, 1, 217, 37, 182, 1, 225, 170, 252, 13, 182, 1,
+ 225, 170, 242, 243, 182, 1, 225, 170, 248, 21, 182, 224, 152, 48, 182,
+ 224, 152, 51, 182, 224, 152, 246, 118, 182, 210, 17, 48, 182, 210, 17,
+ 51, 182, 210, 17, 246, 118, 182, 223, 132, 48, 182, 223, 132, 51, 182,
+ 246, 119, 210, 24, 241, 45, 182, 246, 119, 210, 24, 254, 106, 182, 241,
+ 242, 48, 182, 241, 242, 51, 182, 241, 241, 246, 118, 182, 245, 80, 48,
+ 182, 245, 80, 51, 182, 222, 108, 182, 244, 137, 247, 121, 182, 223, 249,
+ 182, 222, 135, 182, 113, 67, 170, 48, 182, 113, 67, 170, 51, 182, 134,
+ 170, 48, 182, 134, 170, 51, 182, 226, 249, 232, 215, 48, 182, 226, 249,
+ 232, 215, 51, 182, 230, 57, 182, 252, 132, 182, 1, 219, 50, 210, 80, 182,
+ 1, 219, 50, 234, 123, 182, 1, 219, 50, 244, 155, 10, 1, 252, 56, 2, 134,
+ 170, 240, 251, 51, 10, 1, 252, 56, 2, 59, 252, 44, 22, 134, 170, 48, 10,
+ 1, 252, 56, 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, 252, 56, 2, 134,
+ 170, 225, 8, 214, 153, 252, 44, 22, 113, 170, 48, 10, 1, 252, 56, 2, 113,
+ 170, 252, 44, 22, 59, 48, 10, 1, 252, 56, 2, 235, 194, 4, 214, 106, 51,
+ 10, 1, 252, 56, 2, 4, 214, 105, 10, 1, 122, 2, 113, 170, 48, 10, 1, 122,
+ 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, 248, 197, 2, 113, 170, 213,
+ 189, 252, 44, 22, 4, 217, 81, 10, 1, 248, 197, 2, 235, 194, 4, 214, 106,
+ 51, 10, 1, 223, 97, 2, 91, 10, 1, 221, 168, 2, 244, 12, 170, 48, 10, 1,
+ 254, 198, 2, 113, 170, 48, 10, 1, 254, 198, 2, 134, 170, 225, 8, 246,
+ 105, 48, 10, 1, 254, 198, 2, 113, 170, 213, 189, 48, 10, 1, 244, 144, 2,
+ 113, 170, 51, 10, 1, 244, 144, 2, 134, 170, 225, 8, 214, 153, 51, 10, 1,
+ 234, 176, 2, 59, 48, 10, 1, 234, 176, 2, 134, 170, 48, 10, 1, 234, 176,
+ 2, 134, 170, 225, 8, 214, 153, 51, 10, 1, 66, 2, 59, 48, 10, 1, 66, 2,
+ 59, 51, 10, 1, 228, 64, 2, 113, 170, 51, 10, 1, 228, 64, 2, 4, 217, 81,
+ 10, 1, 228, 64, 2, 4, 214, 105, 10, 1, 233, 104, 2, 130, 10, 1, 223, 97,
+ 2, 113, 170, 213, 189, 48, 10, 1, 223, 97, 2, 202, 48, 10, 1, 221, 168,
+ 2, 113, 170, 213, 189, 48, 10, 1, 122, 2, 4, 10, 1, 217, 82, 51, 10, 1,
+ 122, 2, 4, 10, 1, 217, 82, 22, 113, 247, 119, 10, 1, 221, 168, 2, 4, 10,
+ 1, 217, 82, 22, 113, 247, 119, 10, 1, 223, 97, 2, 4, 10, 1, 217, 82, 22,
+ 113, 247, 119, 10, 1, 122, 2, 4, 10, 1, 217, 82, 48, 10, 1, 112, 2, 245,
+ 23, 254, 38, 21, 113, 48, 10, 1, 112, 2, 245, 23, 254, 38, 21, 134, 48,
+ 10, 1, 244, 169, 79, 2, 245, 23, 254, 38, 21, 113, 48, 10, 1, 244, 169,
+ 79, 2, 245, 23, 254, 38, 21, 134, 48, 10, 1, 244, 169, 79, 2, 245, 23,
+ 254, 38, 21, 244, 12, 51, 10, 1, 212, 31, 2, 245, 23, 254, 38, 21, 113,
+ 48, 10, 1, 212, 31, 2, 245, 23, 254, 38, 21, 134, 48, 10, 1, 79, 252,
+ 134, 2, 245, 23, 254, 38, 21, 113, 48, 10, 1, 79, 252, 134, 2, 245, 23,
+ 254, 38, 21, 134, 48, 10, 1, 122, 2, 245, 23, 254, 38, 21, 244, 12, 51,
+ 10, 1, 221, 168, 2, 245, 23, 254, 38, 21, 244, 12, 48, 10, 1, 221, 168,
+ 2, 235, 194, 214, 105, 10, 1, 234, 252, 2, 113, 170, 48, 216, 206, 1,
+ 242, 47, 216, 206, 1, 220, 69, 216, 206, 1, 228, 62, 216, 206, 1, 223,
+ 185, 216, 206, 1, 252, 190, 216, 206, 1, 232, 252, 216, 206, 1, 235, 9,
+ 216, 206, 1, 254, 160, 216, 206, 1, 214, 25, 216, 206, 1, 231, 78, 216,
+ 206, 1, 244, 195, 216, 206, 1, 248, 24, 216, 206, 1, 216, 208, 216, 206,
+ 1, 233, 132, 216, 206, 1, 243, 132, 216, 206, 1, 242, 178, 216, 206, 1,
+ 221, 166, 216, 206, 1, 248, 149, 216, 206, 1, 210, 100, 216, 206, 1, 217,
+ 38, 216, 206, 1, 211, 103, 216, 206, 1, 225, 234, 216, 206, 1, 235, 129,
+ 216, 206, 1, 250, 135, 216, 206, 1, 215, 156, 216, 206, 1, 241, 189, 216,
+ 206, 1, 234, 132, 216, 206, 1, 216, 207, 216, 206, 1, 210, 115, 216, 206,
+ 1, 220, 59, 216, 206, 1, 222, 31, 216, 206, 1, 248, 220, 216, 206, 1,
+ 111, 216, 206, 1, 210, 23, 216, 206, 1, 254, 194, 216, 206, 1, 242, 244,
+ 216, 206, 1, 224, 86, 216, 206, 1, 212, 63, 216, 206, 255, 23, 216, 206,
+ 255, 39, 216, 206, 240, 115, 216, 206, 245, 209, 216, 206, 214, 222, 216,
+ 206, 226, 183, 216, 206, 245, 217, 216, 206, 245, 17, 216, 206, 226, 248,
+ 216, 206, 227, 0, 216, 206, 218, 46, 216, 206, 1, 229, 226, 228, 138, 21,
+ 210, 86, 228, 138, 21, 110, 228, 138, 21, 105, 228, 138, 21, 158, 228,
+ 138, 21, 161, 228, 138, 21, 189, 228, 138, 21, 194, 228, 138, 21, 198,
+ 228, 138, 21, 195, 228, 138, 21, 200, 228, 138, 1, 61, 228, 138, 1, 245,
+ 210, 228, 138, 1, 73, 228, 138, 1, 75, 228, 138, 1, 70, 228, 138, 1, 226,
+ 184, 228, 138, 1, 76, 228, 138, 1, 248, 210, 228, 138, 1, 230, 26, 228,
+ 138, 1, 252, 192, 228, 138, 1, 190, 228, 138, 1, 217, 106, 228, 138, 1,
+ 235, 142, 228, 138, 1, 250, 158, 228, 138, 1, 248, 222, 228, 138, 1, 205,
+ 228, 138, 1, 222, 180, 228, 138, 1, 206, 228, 138, 1, 243, 80, 228, 138,
+ 1, 244, 197, 228, 138, 1, 176, 228, 138, 1, 233, 136, 228, 138, 1, 229,
+ 230, 211, 223, 228, 138, 1, 185, 228, 138, 1, 227, 166, 228, 138, 1, 197,
+ 228, 138, 1, 162, 228, 138, 1, 212, 65, 228, 138, 1, 191, 228, 138, 1,
+ 227, 167, 211, 223, 228, 138, 1, 235, 62, 235, 142, 228, 138, 1, 235, 62,
+ 250, 158, 228, 138, 1, 235, 62, 205, 228, 138, 38, 219, 252, 125, 216,
+ 31, 228, 138, 38, 219, 252, 121, 216, 31, 228, 138, 38, 219, 252, 222,
+ 229, 216, 31, 228, 138, 38, 199, 248, 39, 216, 31, 228, 138, 38, 199,
+ 125, 216, 31, 228, 138, 38, 199, 121, 216, 31, 228, 138, 38, 199, 222,
+ 229, 216, 31, 228, 138, 38, 229, 194, 78, 228, 138, 38, 52, 59, 48, 228,
+ 138, 125, 138, 254, 58, 228, 138, 121, 138, 254, 58, 228, 138, 16, 226,
+ 185, 248, 51, 228, 138, 16, 243, 79, 228, 138, 249, 220, 228, 138, 245,
+ 32, 78, 228, 138, 233, 109, 221, 253, 1, 254, 177, 221, 253, 1, 251, 229,
+ 221, 253, 1, 243, 113, 221, 253, 1, 248, 195, 221, 253, 1, 235, 153, 221,
+ 253, 1, 252, 190, 221, 253, 1, 210, 89, 221, 253, 1, 235, 161, 221, 253,
+ 1, 216, 68, 221, 253, 1, 210, 182, 221, 253, 1, 235, 10, 221, 253, 1,
+ 233, 129, 221, 253, 1, 230, 191, 221, 253, 1, 227, 195, 221, 253, 1, 219,
+ 157, 221, 253, 1, 236, 0, 221, 253, 1, 244, 122, 221, 253, 1, 215, 182,
+ 221, 253, 1, 224, 11, 221, 253, 1, 222, 230, 221, 253, 1, 220, 86, 221,
+ 253, 1, 217, 101, 221, 253, 164, 236, 0, 221, 253, 164, 235, 255, 221,
+ 253, 164, 226, 244, 221, 253, 164, 248, 208, 221, 253, 58, 1, 245, 106,
+ 210, 182, 221, 253, 164, 245, 106, 210, 182, 221, 253, 25, 5, 199, 75,
+ 221, 253, 25, 5, 75, 221, 253, 25, 5, 226, 119, 255, 74, 221, 253, 25, 5,
+ 199, 255, 74, 221, 253, 25, 5, 255, 74, 221, 253, 25, 5, 226, 119, 61,
+ 221, 253, 25, 5, 199, 61, 221, 253, 25, 5, 61, 221, 253, 58, 1, 219, 252,
+ 61, 221, 253, 25, 5, 219, 252, 61, 221, 253, 25, 5, 199, 70, 221, 253,
+ 25, 5, 70, 221, 253, 58, 1, 73, 221, 253, 25, 5, 199, 73, 221, 253, 25,
+ 5, 73, 221, 253, 25, 5, 76, 221, 253, 25, 5, 218, 46, 221, 253, 164, 229,
+ 93, 221, 253, 224, 142, 229, 93, 221, 253, 224, 142, 254, 219, 221, 253,
+ 224, 142, 254, 115, 221, 253, 224, 142, 252, 115, 221, 253, 224, 142,
+ 253, 202, 221, 253, 224, 142, 220, 9, 221, 253, 255, 22, 78, 221, 253,
+ 224, 142, 231, 69, 224, 46, 221, 253, 224, 142, 210, 31, 221, 253, 224,
+ 142, 224, 46, 221, 253, 224, 142, 210, 114, 221, 253, 224, 142, 215, 90,
+ 221, 253, 224, 142, 254, 10, 221, 253, 224, 142, 219, 54, 231, 146, 221,
+ 253, 224, 142, 254, 101, 231, 183, 1, 242, 25, 231, 183, 1, 255, 26, 231,
+ 183, 1, 254, 217, 231, 183, 1, 255, 0, 231, 183, 1, 254, 210, 231, 183,
+ 1, 214, 124, 231, 183, 1, 253, 161, 231, 183, 1, 235, 161, 231, 183, 1,
+ 253, 199, 231, 183, 1, 254, 182, 231, 183, 1, 254, 187, 231, 183, 1, 254,
+ 179, 231, 183, 1, 254, 137, 231, 183, 1, 254, 124, 231, 183, 1, 253, 238,
+ 231, 183, 1, 236, 0, 231, 183, 1, 254, 73, 231, 183, 1, 253, 209, 231,
+ 183, 1, 254, 46, 231, 183, 1, 254, 42, 231, 183, 1, 253, 232, 231, 183,
+ 1, 253, 207, 231, 183, 1, 246, 56, 231, 183, 1, 235, 3, 231, 183, 1, 254,
+ 197, 231, 183, 254, 223, 78, 231, 183, 213, 136, 78, 231, 183, 243, 54,
+ 78, 231, 183, 224, 141, 10, 1, 252, 56, 2, 4, 214, 106, 51, 10, 1, 151,
+ 2, 113, 170, 48, 10, 1, 217, 82, 2, 113, 170, 48, 10, 1, 244, 144, 2, 59,
+ 252, 44, 22, 134, 170, 48, 10, 1, 224, 83, 2, 59, 51, 10, 1, 233, 104, 2,
+ 52, 130, 10, 1, 66, 2, 134, 170, 48, 10, 1, 79, 2, 113, 170, 252, 44, 22,
+ 202, 48, 10, 1, 79, 2, 113, 170, 252, 44, 22, 59, 48, 10, 1, 223, 97, 2,
+ 232, 124, 10, 1, 212, 31, 2, 59, 211, 231, 10, 1, 222, 202, 211, 43, 10,
+ 249, 100, 244, 166, 10, 249, 100, 248, 185, 10, 249, 100, 234, 206, 10,
+ 249, 100, 244, 164, 10, 249, 100, 248, 183, 10, 249, 100, 234, 204, 10,
+ 138, 123, 59, 48, 10, 138, 113, 170, 48, 10, 138, 232, 125, 48, 10, 138,
+ 123, 59, 51, 10, 138, 113, 170, 51, 10, 138, 232, 125, 51, 10, 204, 244,
+ 164, 10, 204, 248, 183, 10, 204, 234, 204, 10, 4, 125, 212, 30, 10, 244,
+ 167, 2, 222, 234, 10, 244, 167, 2, 59, 48, 10, 234, 207, 2, 59, 51, 10,
+ 43, 253, 251, 48, 10, 44, 253, 251, 48, 10, 43, 253, 251, 51, 10, 44,
+ 253, 251, 51, 10, 52, 44, 253, 251, 48, 10, 52, 44, 253, 251, 77, 2, 247,
+ 121, 10, 44, 253, 251, 77, 2, 247, 121, 10, 248, 186, 2, 247, 121, 84, 5,
+ 235, 194, 251, 0, 84, 5, 251, 0, 84, 5, 254, 76, 84, 5, 213, 147, 84, 1,
+ 219, 252, 61, 84, 1, 61, 84, 1, 255, 74, 84, 1, 73, 84, 1, 236, 34, 84,
+ 1, 70, 84, 1, 214, 118, 84, 1, 149, 153, 84, 1, 149, 156, 84, 1, 251, 3,
+ 75, 84, 1, 219, 252, 75, 84, 1, 75, 84, 1, 254, 202, 84, 1, 251, 3, 76,
+ 84, 1, 219, 252, 76, 84, 1, 76, 84, 1, 253, 193, 84, 1, 176, 84, 1, 234,
+ 133, 84, 1, 243, 136, 84, 1, 242, 250, 84, 1, 229, 78, 84, 1, 251, 34,
+ 84, 1, 250, 158, 84, 1, 235, 142, 84, 1, 235, 115, 84, 1, 227, 166, 84,
+ 1, 215, 157, 84, 1, 215, 145, 84, 1, 248, 136, 84, 1, 248, 120, 84, 1,
+ 228, 111, 84, 1, 217, 106, 84, 1, 216, 209, 84, 1, 248, 222, 84, 1, 248,
+ 26, 84, 1, 197, 84, 1, 228, 93, 84, 1, 190, 84, 1, 225, 148, 84, 1, 252,
+ 192, 84, 1, 252, 19, 84, 1, 185, 84, 1, 191, 84, 1, 205, 84, 1, 222, 180,
+ 84, 1, 233, 136, 84, 1, 232, 185, 84, 1, 232, 176, 84, 1, 214, 27, 84, 1,
+ 220, 103, 84, 1, 218, 224, 84, 1, 206, 84, 1, 162, 84, 25, 5, 226, 235,
+ 84, 25, 5, 226, 182, 84, 5, 227, 206, 84, 5, 253, 176, 84, 25, 5, 255,
+ 74, 84, 25, 5, 73, 84, 25, 5, 236, 34, 84, 25, 5, 70, 84, 25, 5, 214,
+ 118, 84, 25, 5, 149, 153, 84, 25, 5, 149, 222, 181, 84, 25, 5, 251, 3,
+ 75, 84, 25, 5, 219, 252, 75, 84, 25, 5, 75, 84, 25, 5, 254, 202, 84, 25,
+ 5, 251, 3, 76, 84, 25, 5, 219, 252, 76, 84, 25, 5, 76, 84, 25, 5, 253,
+ 193, 84, 5, 213, 152, 84, 25, 5, 224, 186, 75, 84, 25, 5, 253, 172, 84,
+ 226, 205, 84, 218, 112, 5, 214, 216, 84, 218, 112, 5, 254, 78, 84, 242,
+ 138, 255, 15, 84, 255, 4, 255, 15, 84, 25, 5, 251, 3, 199, 75, 84, 25, 5,
+ 214, 214, 84, 25, 5, 214, 117, 84, 1, 224, 89, 84, 1, 234, 116, 84, 1,
+ 242, 227, 84, 1, 210, 116, 84, 1, 248, 125, 84, 1, 223, 40, 84, 1, 244,
+ 197, 84, 1, 210, 168, 84, 1, 149, 222, 181, 84, 1, 149, 232, 186, 84, 25,
+ 5, 149, 156, 84, 25, 5, 149, 232, 186, 84, 248, 179, 84, 52, 248, 179,
+ 84, 21, 210, 86, 84, 21, 110, 84, 21, 105, 84, 21, 158, 84, 21, 161, 84,
+ 21, 189, 84, 21, 194, 84, 21, 198, 84, 21, 195, 84, 21, 200, 84, 255, 22,
+ 50, 84, 5, 125, 219, 18, 247, 121, 84, 1, 251, 3, 61, 84, 1, 226, 235,
+ 84, 1, 226, 182, 84, 1, 253, 172, 84, 1, 214, 214, 84, 1, 214, 117, 84,
+ 1, 210, 82, 84, 1, 114, 191, 84, 1, 243, 30, 84, 1, 235, 97, 84, 1, 242,
+ 181, 218, 130, 84, 1, 248, 126, 84, 1, 252, 112, 146, 5, 251, 0, 146, 5,
+ 254, 76, 146, 5, 213, 147, 146, 1, 61, 146, 1, 255, 74, 146, 1, 73, 146,
+ 1, 236, 34, 146, 1, 70, 146, 1, 214, 118, 146, 1, 149, 153, 146, 1, 149,
+ 156, 146, 1, 75, 146, 1, 254, 202, 146, 1, 76, 146, 1, 253, 193, 146, 1,
+ 176, 146, 1, 234, 133, 146, 1, 243, 136, 146, 1, 242, 250, 146, 1, 229,
+ 78, 146, 1, 251, 34, 146, 1, 250, 158, 146, 1, 235, 142, 146, 1, 235,
+ 115, 146, 1, 227, 166, 146, 1, 215, 157, 146, 1, 215, 145, 146, 1, 248,
+ 136, 146, 1, 248, 120, 146, 1, 228, 111, 146, 1, 217, 106, 146, 1, 216,
+ 209, 146, 1, 248, 222, 146, 1, 248, 26, 146, 1, 197, 146, 1, 190, 146, 1,
+ 225, 148, 146, 1, 252, 192, 146, 1, 252, 19, 146, 1, 185, 146, 1, 191,
+ 146, 1, 205, 146, 1, 233, 136, 146, 1, 220, 103, 146, 1, 218, 224, 146,
+ 1, 206, 146, 1, 162, 146, 5, 227, 206, 146, 5, 253, 176, 146, 25, 5, 255,
+ 74, 146, 25, 5, 73, 146, 25, 5, 236, 34, 146, 25, 5, 70, 146, 25, 5, 214,
+ 118, 146, 25, 5, 149, 153, 146, 25, 5, 149, 222, 181, 146, 25, 5, 75,
+ 146, 25, 5, 254, 202, 146, 25, 5, 76, 146, 25, 5, 253, 193, 146, 5, 213,
+ 152, 146, 1, 234, 125, 217, 106, 146, 253, 194, 233, 24, 78, 146, 1, 222,
+ 180, 146, 1, 223, 40, 146, 1, 210, 168, 146, 1, 149, 222, 181, 146, 1,
+ 149, 232, 186, 146, 25, 5, 149, 156, 146, 25, 5, 149, 232, 186, 146, 21,
+ 210, 86, 146, 21, 110, 146, 21, 105, 146, 21, 158, 146, 21, 161, 146, 21,
+ 189, 146, 21, 194, 146, 21, 198, 146, 21, 195, 146, 21, 200, 146, 1, 223,
+ 189, 2, 230, 225, 247, 255, 146, 1, 223, 189, 2, 232, 109, 247, 255, 146,
+ 222, 119, 78, 146, 222, 119, 50, 146, 249, 99, 227, 198, 110, 146, 249,
+ 99, 227, 198, 105, 146, 249, 99, 227, 198, 158, 146, 249, 99, 227, 198,
+ 161, 146, 249, 99, 227, 198, 123, 233, 17, 216, 202, 216, 197, 248, 49,
+ 146, 249, 99, 248, 50, 219, 120, 146, 235, 162, 146, 243, 104, 78, 184,
+ 5, 254, 255, 251, 244, 184, 5, 251, 244, 184, 5, 213, 147, 184, 1, 61,
+ 184, 1, 255, 74, 184, 1, 73, 184, 1, 236, 34, 184, 1, 70, 184, 1, 214,
+ 118, 184, 1, 245, 210, 184, 1, 254, 202, 184, 1, 226, 184, 184, 1, 253,
+ 193, 184, 1, 176, 184, 1, 234, 133, 184, 1, 243, 136, 184, 1, 242, 250,
+ 184, 1, 229, 78, 184, 1, 251, 34, 184, 1, 250, 158, 184, 1, 235, 142,
+ 184, 1, 235, 115, 184, 1, 227, 166, 184, 1, 215, 157, 184, 1, 215, 145,
+ 184, 1, 248, 136, 184, 1, 248, 120, 184, 1, 228, 111, 184, 1, 217, 106,
+ 184, 1, 216, 209, 184, 1, 248, 222, 184, 1, 248, 26, 184, 1, 197, 184, 1,
+ 190, 184, 1, 225, 148, 184, 1, 252, 192, 184, 1, 252, 19, 184, 1, 185,
+ 184, 1, 191, 184, 1, 205, 184, 1, 233, 136, 184, 1, 232, 185, 184, 1,
+ 214, 27, 184, 1, 220, 103, 184, 1, 206, 184, 1, 162, 184, 5, 227, 206,
+ 184, 25, 5, 255, 74, 184, 25, 5, 73, 184, 25, 5, 236, 34, 184, 25, 5, 70,
+ 184, 25, 5, 214, 118, 184, 25, 5, 245, 210, 184, 25, 5, 254, 202, 184,
+ 25, 5, 226, 184, 184, 25, 5, 253, 193, 184, 5, 213, 152, 184, 5, 214,
+ 218, 184, 1, 234, 116, 184, 1, 242, 227, 184, 1, 210, 116, 184, 1, 222,
+ 180, 184, 1, 244, 197, 184, 21, 210, 86, 184, 21, 110, 184, 21, 105, 184,
+ 21, 158, 184, 21, 161, 184, 21, 189, 184, 21, 194, 184, 21, 198, 184, 21,
+ 195, 184, 21, 200, 184, 216, 75, 184, 254, 254, 184, 235, 179, 184, 214,
+ 146, 184, 245, 182, 226, 189, 184, 5, 211, 78, 171, 5, 251, 0, 171, 5,
+ 254, 76, 171, 5, 213, 147, 171, 1, 61, 171, 1, 255, 74, 171, 1, 73, 171,
+ 1, 236, 34, 171, 1, 70, 171, 1, 214, 118, 171, 1, 149, 153, 171, 1, 149,
+ 156, 171, 25, 251, 3, 75, 171, 1, 75, 171, 1, 254, 202, 171, 25, 251, 3,
+ 76, 171, 1, 76, 171, 1, 253, 193, 171, 1, 176, 171, 1, 234, 133, 171, 1,
+ 243, 136, 171, 1, 242, 250, 171, 1, 229, 78, 171, 1, 251, 34, 171, 1,
+ 250, 158, 171, 1, 235, 142, 171, 1, 235, 115, 171, 1, 227, 166, 171, 1,
+ 215, 157, 171, 1, 215, 145, 171, 1, 248, 136, 171, 1, 248, 120, 171, 1,
+ 228, 111, 171, 1, 217, 106, 171, 1, 216, 209, 171, 1, 248, 222, 171, 1,
+ 248, 26, 171, 1, 197, 171, 1, 190, 171, 1, 225, 148, 171, 1, 252, 192,
+ 171, 1, 252, 19, 171, 1, 185, 171, 1, 191, 171, 1, 205, 171, 1, 233, 136,
+ 171, 1, 232, 185, 171, 1, 214, 27, 171, 1, 220, 103, 171, 1, 218, 224,
+ 171, 1, 206, 171, 1, 162, 171, 5, 227, 206, 171, 5, 253, 176, 171, 25, 5,
+ 255, 74, 171, 25, 5, 73, 171, 25, 5, 236, 34, 171, 25, 5, 70, 171, 25, 5,
+ 214, 118, 171, 25, 5, 149, 153, 171, 25, 5, 149, 222, 181, 171, 25, 5,
+ 251, 3, 75, 171, 25, 5, 75, 171, 25, 5, 254, 202, 171, 25, 5, 251, 3, 76,
+ 171, 25, 5, 76, 171, 25, 5, 253, 193, 171, 5, 213, 152, 171, 226, 205,
+ 171, 1, 149, 222, 181, 171, 1, 149, 232, 186, 171, 25, 5, 149, 156, 171,
+ 25, 5, 149, 232, 186, 171, 21, 210, 86, 171, 21, 110, 171, 21, 105, 171,
21, 158, 171, 21, 161, 171, 21, 189, 171, 21, 194, 171, 21, 198, 171, 21,
- 195, 171, 21, 200, 171, 255, 21, 50, 171, 222, 118, 50, 157, 5, 250, 255,
- 157, 5, 254, 75, 157, 5, 213, 147, 157, 1, 61, 157, 1, 255, 73, 157, 1,
- 73, 157, 1, 236, 33, 157, 1, 70, 157, 1, 214, 118, 157, 1, 149, 153, 157,
- 1, 149, 156, 157, 1, 75, 157, 1, 254, 201, 157, 1, 76, 157, 1, 253, 192,
- 157, 1, 176, 157, 1, 234, 132, 157, 1, 243, 135, 157, 1, 242, 249, 157,
- 1, 229, 77, 157, 1, 251, 33, 157, 1, 250, 157, 157, 1, 235, 141, 157, 1,
- 235, 114, 157, 1, 227, 165, 157, 1, 215, 156, 157, 1, 215, 144, 157, 1,
- 248, 135, 157, 1, 248, 119, 157, 1, 228, 110, 157, 1, 217, 105, 157, 1,
- 216, 208, 157, 1, 248, 221, 157, 1, 248, 25, 157, 1, 197, 157, 1, 190,
- 157, 1, 225, 147, 157, 1, 252, 191, 157, 1, 252, 18, 157, 1, 184, 157, 1,
- 191, 157, 1, 205, 157, 1, 233, 135, 157, 1, 232, 184, 157, 1, 214, 27,
- 157, 1, 220, 102, 157, 1, 218, 223, 157, 1, 206, 157, 1, 162, 157, 5,
- 227, 205, 157, 5, 253, 175, 157, 25, 5, 255, 73, 157, 25, 5, 73, 157, 25,
- 5, 236, 33, 157, 25, 5, 70, 157, 25, 5, 214, 118, 157, 25, 5, 149, 153,
- 157, 25, 5, 149, 222, 180, 157, 25, 5, 75, 157, 25, 5, 254, 201, 157, 25,
- 5, 76, 157, 25, 5, 253, 192, 157, 5, 213, 152, 157, 254, 202, 233, 23,
- 78, 157, 253, 193, 233, 23, 78, 157, 1, 222, 179, 157, 1, 223, 39, 157,
- 1, 210, 168, 157, 1, 149, 222, 180, 157, 1, 149, 232, 185, 157, 25, 5,
- 149, 156, 157, 25, 5, 149, 232, 185, 157, 21, 210, 86, 157, 21, 110, 157,
+ 195, 171, 21, 200, 171, 255, 22, 50, 171, 222, 119, 50, 157, 5, 251, 0,
+ 157, 5, 254, 76, 157, 5, 213, 147, 157, 1, 61, 157, 1, 255, 74, 157, 1,
+ 73, 157, 1, 236, 34, 157, 1, 70, 157, 1, 214, 118, 157, 1, 149, 153, 157,
+ 1, 149, 156, 157, 1, 75, 157, 1, 254, 202, 157, 1, 76, 157, 1, 253, 193,
+ 157, 1, 176, 157, 1, 234, 133, 157, 1, 243, 136, 157, 1, 242, 250, 157,
+ 1, 229, 78, 157, 1, 251, 34, 157, 1, 250, 158, 157, 1, 235, 142, 157, 1,
+ 235, 115, 157, 1, 227, 166, 157, 1, 215, 157, 157, 1, 215, 145, 157, 1,
+ 248, 136, 157, 1, 248, 120, 157, 1, 228, 111, 157, 1, 217, 106, 157, 1,
+ 216, 209, 157, 1, 248, 222, 157, 1, 248, 26, 157, 1, 197, 157, 1, 190,
+ 157, 1, 225, 148, 157, 1, 252, 192, 157, 1, 252, 19, 157, 1, 185, 157, 1,
+ 191, 157, 1, 205, 157, 1, 233, 136, 157, 1, 232, 185, 157, 1, 214, 27,
+ 157, 1, 220, 103, 157, 1, 218, 224, 157, 1, 206, 157, 1, 162, 157, 5,
+ 227, 206, 157, 5, 253, 176, 157, 25, 5, 255, 74, 157, 25, 5, 73, 157, 25,
+ 5, 236, 34, 157, 25, 5, 70, 157, 25, 5, 214, 118, 157, 25, 5, 149, 153,
+ 157, 25, 5, 149, 222, 181, 157, 25, 5, 75, 157, 25, 5, 254, 202, 157, 25,
+ 5, 76, 157, 25, 5, 253, 193, 157, 5, 213, 152, 157, 254, 203, 233, 24,
+ 78, 157, 253, 194, 233, 24, 78, 157, 1, 222, 180, 157, 1, 223, 40, 157,
+ 1, 210, 168, 157, 1, 149, 222, 181, 157, 1, 149, 232, 186, 157, 25, 5,
+ 149, 156, 157, 25, 5, 149, 232, 186, 157, 21, 210, 86, 157, 21, 110, 157,
21, 105, 157, 21, 158, 157, 21, 161, 157, 21, 189, 157, 21, 194, 157, 21,
- 198, 157, 21, 195, 157, 21, 200, 157, 235, 161, 157, 1, 212, 65, 157,
- 244, 2, 123, 224, 21, 157, 244, 2, 123, 242, 27, 157, 244, 2, 134, 224,
- 19, 157, 244, 2, 123, 219, 117, 157, 244, 2, 123, 245, 188, 157, 244, 2,
- 134, 219, 116, 36, 5, 254, 75, 36, 5, 213, 147, 36, 1, 61, 36, 1, 255,
- 73, 36, 1, 73, 36, 1, 236, 33, 36, 1, 70, 36, 1, 214, 118, 36, 1, 75, 36,
- 1, 245, 209, 36, 1, 254, 201, 36, 1, 76, 36, 1, 226, 183, 36, 1, 253,
- 192, 36, 1, 176, 36, 1, 229, 77, 36, 1, 251, 33, 36, 1, 235, 141, 36, 1,
- 227, 165, 36, 1, 215, 156, 36, 1, 228, 110, 36, 1, 217, 105, 36, 1, 197,
- 36, 1, 228, 92, 36, 1, 190, 36, 1, 184, 36, 1, 191, 36, 1, 205, 36, 1,
- 222, 179, 36, 1, 233, 135, 36, 1, 232, 184, 36, 1, 232, 175, 36, 1, 214,
- 27, 36, 1, 220, 102, 36, 1, 218, 223, 36, 1, 206, 36, 1, 162, 36, 25, 5,
- 255, 73, 36, 25, 5, 73, 36, 25, 5, 236, 33, 36, 25, 5, 70, 36, 25, 5,
- 214, 118, 36, 25, 5, 75, 36, 25, 5, 245, 209, 36, 25, 5, 254, 201, 36,
- 25, 5, 76, 36, 25, 5, 226, 183, 36, 25, 5, 253, 192, 36, 5, 213, 152, 36,
- 226, 204, 36, 253, 193, 233, 23, 78, 36, 21, 210, 86, 36, 21, 110, 36,
+ 198, 157, 21, 195, 157, 21, 200, 157, 235, 162, 157, 1, 212, 65, 157,
+ 244, 3, 123, 224, 22, 157, 244, 3, 123, 242, 28, 157, 244, 3, 134, 224,
+ 20, 157, 244, 3, 123, 219, 118, 157, 244, 3, 123, 245, 189, 157, 244, 3,
+ 134, 219, 117, 36, 5, 254, 76, 36, 5, 213, 147, 36, 1, 61, 36, 1, 255,
+ 74, 36, 1, 73, 36, 1, 236, 34, 36, 1, 70, 36, 1, 214, 118, 36, 1, 75, 36,
+ 1, 245, 210, 36, 1, 254, 202, 36, 1, 76, 36, 1, 226, 184, 36, 1, 253,
+ 193, 36, 1, 176, 36, 1, 229, 78, 36, 1, 251, 34, 36, 1, 235, 142, 36, 1,
+ 227, 166, 36, 1, 215, 157, 36, 1, 228, 111, 36, 1, 217, 106, 36, 1, 197,
+ 36, 1, 228, 93, 36, 1, 190, 36, 1, 185, 36, 1, 191, 36, 1, 205, 36, 1,
+ 222, 180, 36, 1, 233, 136, 36, 1, 232, 185, 36, 1, 232, 176, 36, 1, 214,
+ 27, 36, 1, 220, 103, 36, 1, 218, 224, 36, 1, 206, 36, 1, 162, 36, 25, 5,
+ 255, 74, 36, 25, 5, 73, 36, 25, 5, 236, 34, 36, 25, 5, 70, 36, 25, 5,
+ 214, 118, 36, 25, 5, 75, 36, 25, 5, 245, 210, 36, 25, 5, 254, 202, 36,
+ 25, 5, 76, 36, 25, 5, 226, 184, 36, 25, 5, 253, 193, 36, 5, 213, 152, 36,
+ 226, 205, 36, 253, 194, 233, 24, 78, 36, 21, 210, 86, 36, 21, 110, 36,
21, 105, 36, 21, 158, 36, 21, 161, 36, 21, 189, 36, 21, 194, 36, 21, 198,
- 36, 21, 195, 36, 21, 200, 36, 54, 216, 247, 36, 54, 123, 240, 210, 36,
- 54, 123, 216, 147, 36, 248, 146, 50, 36, 230, 135, 50, 36, 211, 45, 50,
- 36, 248, 87, 50, 36, 249, 139, 50, 36, 253, 238, 77, 50, 36, 222, 118,
- 50, 36, 54, 50, 148, 5, 250, 255, 148, 5, 254, 75, 148, 5, 213, 147, 148,
- 1, 61, 148, 1, 255, 73, 148, 1, 73, 148, 1, 236, 33, 148, 1, 70, 148, 1,
+ 36, 21, 195, 36, 21, 200, 36, 54, 216, 248, 36, 54, 123, 240, 211, 36,
+ 54, 123, 216, 148, 36, 248, 147, 50, 36, 230, 136, 50, 36, 211, 45, 50,
+ 36, 248, 88, 50, 36, 249, 140, 50, 36, 253, 239, 77, 50, 36, 222, 119,
+ 50, 36, 54, 50, 148, 5, 251, 0, 148, 5, 254, 76, 148, 5, 213, 147, 148,
+ 1, 61, 148, 1, 255, 74, 148, 1, 73, 148, 1, 236, 34, 148, 1, 70, 148, 1,
214, 118, 148, 1, 149, 153, 148, 1, 149, 156, 148, 1, 75, 148, 1, 245,
- 209, 148, 1, 254, 201, 148, 1, 76, 148, 1, 226, 183, 148, 1, 253, 192,
- 148, 1, 176, 148, 1, 234, 132, 148, 1, 243, 135, 148, 1, 242, 249, 148,
- 1, 229, 77, 148, 1, 251, 33, 148, 1, 250, 157, 148, 1, 235, 141, 148, 1,
- 235, 114, 148, 1, 227, 165, 148, 1, 215, 156, 148, 1, 215, 144, 148, 1,
- 248, 135, 148, 1, 248, 119, 148, 1, 228, 110, 148, 1, 217, 105, 148, 1,
- 216, 208, 148, 1, 248, 221, 148, 1, 248, 25, 148, 1, 197, 148, 1, 190,
- 148, 1, 225, 147, 148, 1, 252, 191, 148, 1, 252, 18, 148, 1, 184, 148, 1,
- 191, 148, 1, 205, 148, 1, 222, 179, 148, 1, 233, 135, 148, 1, 232, 184,
- 148, 1, 214, 27, 148, 1, 220, 102, 148, 1, 218, 223, 148, 1, 206, 148, 1,
- 162, 148, 5, 253, 175, 148, 25, 5, 255, 73, 148, 25, 5, 73, 148, 25, 5,
- 236, 33, 148, 25, 5, 70, 148, 25, 5, 214, 118, 148, 25, 5, 149, 153, 148,
- 25, 5, 149, 222, 180, 148, 25, 5, 75, 148, 25, 5, 245, 209, 148, 25, 5,
- 254, 201, 148, 25, 5, 76, 148, 25, 5, 226, 183, 148, 25, 5, 253, 192,
- 148, 5, 213, 152, 148, 233, 23, 78, 148, 254, 202, 233, 23, 78, 148, 1,
- 215, 183, 148, 1, 246, 38, 148, 1, 149, 222, 180, 148, 1, 149, 232, 185,
- 148, 25, 5, 149, 156, 148, 25, 5, 149, 232, 185, 148, 21, 210, 86, 148,
+ 210, 148, 1, 254, 202, 148, 1, 76, 148, 1, 226, 184, 148, 1, 253, 193,
+ 148, 1, 176, 148, 1, 234, 133, 148, 1, 243, 136, 148, 1, 242, 250, 148,
+ 1, 229, 78, 148, 1, 251, 34, 148, 1, 250, 158, 148, 1, 235, 142, 148, 1,
+ 235, 115, 148, 1, 227, 166, 148, 1, 215, 157, 148, 1, 215, 145, 148, 1,
+ 248, 136, 148, 1, 248, 120, 148, 1, 228, 111, 148, 1, 217, 106, 148, 1,
+ 216, 209, 148, 1, 248, 222, 148, 1, 248, 26, 148, 1, 197, 148, 1, 190,
+ 148, 1, 225, 148, 148, 1, 252, 192, 148, 1, 252, 19, 148, 1, 185, 148, 1,
+ 191, 148, 1, 205, 148, 1, 222, 180, 148, 1, 233, 136, 148, 1, 232, 185,
+ 148, 1, 214, 27, 148, 1, 220, 103, 148, 1, 218, 224, 148, 1, 206, 148, 1,
+ 162, 148, 5, 253, 176, 148, 25, 5, 255, 74, 148, 25, 5, 73, 148, 25, 5,
+ 236, 34, 148, 25, 5, 70, 148, 25, 5, 214, 118, 148, 25, 5, 149, 153, 148,
+ 25, 5, 149, 222, 181, 148, 25, 5, 75, 148, 25, 5, 245, 210, 148, 25, 5,
+ 254, 202, 148, 25, 5, 76, 148, 25, 5, 226, 184, 148, 25, 5, 253, 193,
+ 148, 5, 213, 152, 148, 233, 24, 78, 148, 254, 203, 233, 24, 78, 148, 1,
+ 215, 184, 148, 1, 246, 39, 148, 1, 149, 222, 181, 148, 1, 149, 232, 186,
+ 148, 25, 5, 149, 156, 148, 25, 5, 149, 232, 186, 148, 21, 210, 86, 148,
21, 110, 148, 21, 105, 148, 21, 158, 148, 21, 161, 148, 21, 189, 148, 21,
- 194, 148, 21, 198, 148, 21, 195, 148, 21, 200, 148, 244, 2, 21, 210, 87,
- 31, 226, 237, 224, 223, 64, 161, 148, 244, 2, 21, 123, 31, 226, 237, 224,
- 223, 64, 161, 148, 244, 2, 21, 113, 31, 226, 237, 224, 223, 64, 161, 148,
- 244, 2, 21, 134, 31, 226, 237, 224, 223, 64, 161, 148, 244, 2, 21, 123,
- 31, 245, 42, 224, 223, 64, 161, 148, 244, 2, 21, 113, 31, 245, 42, 224,
- 223, 64, 161, 148, 244, 2, 21, 134, 31, 245, 42, 224, 223, 64, 161, 148,
- 5, 215, 84, 165, 5, 254, 75, 165, 5, 213, 147, 165, 1, 61, 165, 1, 255,
- 73, 165, 1, 73, 165, 1, 236, 33, 165, 1, 70, 165, 1, 214, 118, 165, 1,
- 149, 153, 165, 1, 149, 156, 165, 1, 75, 165, 1, 245, 209, 165, 1, 254,
- 201, 165, 1, 76, 165, 1, 226, 183, 165, 1, 253, 192, 165, 1, 176, 165, 1,
- 234, 132, 165, 1, 243, 135, 165, 1, 242, 249, 165, 1, 229, 77, 165, 1,
- 251, 33, 165, 1, 250, 157, 165, 1, 235, 141, 165, 1, 235, 114, 165, 1,
- 227, 165, 165, 1, 215, 156, 165, 1, 215, 144, 165, 1, 248, 135, 165, 1,
- 248, 119, 165, 1, 228, 110, 165, 1, 217, 105, 165, 1, 216, 208, 165, 1,
- 248, 221, 165, 1, 248, 25, 165, 1, 197, 165, 1, 190, 165, 1, 225, 147,
- 165, 1, 252, 191, 165, 1, 252, 18, 165, 1, 184, 165, 1, 191, 165, 1, 205,
- 165, 1, 222, 179, 165, 1, 233, 135, 165, 1, 232, 184, 165, 1, 214, 27,
- 165, 1, 220, 102, 165, 1, 218, 223, 165, 1, 206, 165, 1, 162, 165, 5,
- 227, 205, 165, 5, 253, 175, 165, 25, 5, 255, 73, 165, 25, 5, 73, 165, 25,
- 5, 236, 33, 165, 25, 5, 70, 165, 25, 5, 214, 118, 165, 25, 5, 149, 153,
- 165, 25, 5, 149, 222, 180, 165, 25, 5, 75, 165, 25, 5, 245, 209, 165, 25,
- 5, 254, 201, 165, 25, 5, 76, 165, 25, 5, 226, 183, 165, 25, 5, 253, 192,
- 165, 5, 213, 152, 165, 233, 23, 78, 165, 254, 202, 233, 23, 78, 165, 1,
- 244, 196, 165, 1, 149, 222, 180, 165, 1, 149, 232, 185, 165, 25, 5, 149,
- 156, 165, 25, 5, 149, 232, 185, 165, 21, 210, 86, 165, 21, 110, 165, 21,
+ 194, 148, 21, 198, 148, 21, 195, 148, 21, 200, 148, 244, 3, 21, 210, 87,
+ 31, 226, 238, 224, 224, 64, 161, 148, 244, 3, 21, 123, 31, 226, 238, 224,
+ 224, 64, 161, 148, 244, 3, 21, 113, 31, 226, 238, 224, 224, 64, 161, 148,
+ 244, 3, 21, 134, 31, 226, 238, 224, 224, 64, 161, 148, 244, 3, 21, 123,
+ 31, 245, 43, 224, 224, 64, 161, 148, 244, 3, 21, 113, 31, 245, 43, 224,
+ 224, 64, 161, 148, 244, 3, 21, 134, 31, 245, 43, 224, 224, 64, 161, 148,
+ 5, 215, 84, 165, 5, 254, 76, 165, 5, 213, 147, 165, 1, 61, 165, 1, 255,
+ 74, 165, 1, 73, 165, 1, 236, 34, 165, 1, 70, 165, 1, 214, 118, 165, 1,
+ 149, 153, 165, 1, 149, 156, 165, 1, 75, 165, 1, 245, 210, 165, 1, 254,
+ 202, 165, 1, 76, 165, 1, 226, 184, 165, 1, 253, 193, 165, 1, 176, 165, 1,
+ 234, 133, 165, 1, 243, 136, 165, 1, 242, 250, 165, 1, 229, 78, 165, 1,
+ 251, 34, 165, 1, 250, 158, 165, 1, 235, 142, 165, 1, 235, 115, 165, 1,
+ 227, 166, 165, 1, 215, 157, 165, 1, 215, 145, 165, 1, 248, 136, 165, 1,
+ 248, 120, 165, 1, 228, 111, 165, 1, 217, 106, 165, 1, 216, 209, 165, 1,
+ 248, 222, 165, 1, 248, 26, 165, 1, 197, 165, 1, 190, 165, 1, 225, 148,
+ 165, 1, 252, 192, 165, 1, 252, 19, 165, 1, 185, 165, 1, 191, 165, 1, 205,
+ 165, 1, 222, 180, 165, 1, 233, 136, 165, 1, 232, 185, 165, 1, 214, 27,
+ 165, 1, 220, 103, 165, 1, 218, 224, 165, 1, 206, 165, 1, 162, 165, 5,
+ 227, 206, 165, 5, 253, 176, 165, 25, 5, 255, 74, 165, 25, 5, 73, 165, 25,
+ 5, 236, 34, 165, 25, 5, 70, 165, 25, 5, 214, 118, 165, 25, 5, 149, 153,
+ 165, 25, 5, 149, 222, 181, 165, 25, 5, 75, 165, 25, 5, 245, 210, 165, 25,
+ 5, 254, 202, 165, 25, 5, 76, 165, 25, 5, 226, 184, 165, 25, 5, 253, 193,
+ 165, 5, 213, 152, 165, 233, 24, 78, 165, 254, 203, 233, 24, 78, 165, 1,
+ 244, 197, 165, 1, 149, 222, 181, 165, 1, 149, 232, 186, 165, 25, 5, 149,
+ 156, 165, 25, 5, 149, 232, 186, 165, 21, 210, 86, 165, 21, 110, 165, 21,
105, 165, 21, 158, 165, 21, 161, 165, 21, 189, 165, 21, 194, 165, 21,
- 198, 165, 21, 195, 165, 21, 200, 165, 5, 235, 102, 165, 5, 214, 161, 136,
- 5, 254, 75, 136, 5, 213, 147, 136, 1, 61, 136, 1, 255, 73, 136, 1, 73,
- 136, 1, 236, 33, 136, 1, 70, 136, 1, 214, 118, 136, 1, 149, 153, 136, 1,
- 149, 156, 136, 1, 75, 136, 1, 245, 209, 136, 1, 254, 201, 136, 1, 76,
- 136, 1, 226, 183, 136, 1, 253, 192, 136, 1, 176, 136, 1, 234, 132, 136,
- 1, 243, 135, 136, 1, 242, 249, 136, 1, 229, 77, 136, 1, 251, 33, 136, 1,
- 250, 157, 136, 1, 235, 141, 136, 1, 235, 114, 136, 1, 227, 165, 136, 1,
- 215, 156, 136, 1, 215, 144, 136, 1, 248, 135, 136, 1, 248, 119, 136, 1,
- 228, 110, 136, 1, 217, 105, 136, 1, 216, 208, 136, 1, 248, 221, 136, 1,
- 248, 25, 136, 1, 197, 136, 1, 228, 92, 136, 1, 190, 136, 1, 225, 147,
- 136, 1, 252, 191, 136, 1, 252, 18, 136, 1, 184, 136, 1, 191, 136, 1, 205,
- 136, 1, 222, 179, 136, 1, 233, 135, 136, 1, 232, 184, 136, 1, 232, 175,
- 136, 1, 214, 27, 136, 1, 220, 102, 136, 1, 218, 223, 136, 1, 206, 136, 1,
- 162, 136, 1, 215, 125, 136, 5, 253, 175, 136, 25, 5, 255, 73, 136, 25, 5,
- 73, 136, 25, 5, 236, 33, 136, 25, 5, 70, 136, 25, 5, 214, 118, 136, 25,
- 5, 149, 153, 136, 25, 5, 149, 222, 180, 136, 25, 5, 75, 136, 25, 5, 245,
- 209, 136, 25, 5, 254, 201, 136, 25, 5, 76, 136, 25, 5, 226, 183, 136, 25,
- 5, 253, 192, 136, 5, 213, 152, 136, 1, 59, 223, 73, 136, 253, 193, 233,
- 23, 78, 136, 1, 149, 222, 180, 136, 1, 149, 232, 185, 136, 25, 5, 149,
- 156, 136, 25, 5, 149, 232, 185, 136, 21, 210, 86, 136, 21, 110, 136, 21,
+ 198, 165, 21, 195, 165, 21, 200, 165, 5, 235, 103, 165, 5, 214, 161, 136,
+ 5, 254, 76, 136, 5, 213, 147, 136, 1, 61, 136, 1, 255, 74, 136, 1, 73,
+ 136, 1, 236, 34, 136, 1, 70, 136, 1, 214, 118, 136, 1, 149, 153, 136, 1,
+ 149, 156, 136, 1, 75, 136, 1, 245, 210, 136, 1, 254, 202, 136, 1, 76,
+ 136, 1, 226, 184, 136, 1, 253, 193, 136, 1, 176, 136, 1, 234, 133, 136,
+ 1, 243, 136, 136, 1, 242, 250, 136, 1, 229, 78, 136, 1, 251, 34, 136, 1,
+ 250, 158, 136, 1, 235, 142, 136, 1, 235, 115, 136, 1, 227, 166, 136, 1,
+ 215, 157, 136, 1, 215, 145, 136, 1, 248, 136, 136, 1, 248, 120, 136, 1,
+ 228, 111, 136, 1, 217, 106, 136, 1, 216, 209, 136, 1, 248, 222, 136, 1,
+ 248, 26, 136, 1, 197, 136, 1, 228, 93, 136, 1, 190, 136, 1, 225, 148,
+ 136, 1, 252, 192, 136, 1, 252, 19, 136, 1, 185, 136, 1, 191, 136, 1, 205,
+ 136, 1, 222, 180, 136, 1, 233, 136, 136, 1, 232, 185, 136, 1, 232, 176,
+ 136, 1, 214, 27, 136, 1, 220, 103, 136, 1, 218, 224, 136, 1, 206, 136, 1,
+ 162, 136, 1, 215, 126, 136, 5, 253, 176, 136, 25, 5, 255, 74, 136, 25, 5,
+ 73, 136, 25, 5, 236, 34, 136, 25, 5, 70, 136, 25, 5, 214, 118, 136, 25,
+ 5, 149, 153, 136, 25, 5, 149, 222, 181, 136, 25, 5, 75, 136, 25, 5, 245,
+ 210, 136, 25, 5, 254, 202, 136, 25, 5, 76, 136, 25, 5, 226, 184, 136, 25,
+ 5, 253, 193, 136, 5, 213, 152, 136, 1, 59, 223, 74, 136, 253, 194, 233,
+ 24, 78, 136, 1, 149, 222, 181, 136, 1, 149, 232, 186, 136, 25, 5, 149,
+ 156, 136, 25, 5, 149, 232, 186, 136, 21, 210, 86, 136, 21, 110, 136, 21,
105, 136, 21, 158, 136, 21, 161, 136, 21, 189, 136, 21, 194, 136, 21,
- 198, 136, 21, 195, 136, 21, 200, 136, 54, 216, 247, 136, 54, 123, 240,
- 210, 136, 54, 123, 216, 147, 136, 244, 2, 123, 224, 21, 136, 244, 2, 123,
- 242, 27, 136, 244, 2, 134, 224, 19, 136, 248, 150, 78, 136, 1, 250, 99,
- 228, 111, 136, 1, 250, 99, 230, 25, 136, 1, 250, 99, 222, 180, 136, 1,
- 250, 99, 156, 136, 1, 250, 99, 232, 185, 136, 1, 250, 99, 235, 23, 175,
- 5, 254, 74, 175, 5, 213, 146, 175, 1, 253, 165, 175, 1, 255, 27, 175, 1,
- 254, 223, 175, 1, 254, 238, 175, 1, 235, 151, 175, 1, 236, 32, 175, 1,
- 214, 110, 175, 1, 214, 112, 175, 1, 235, 173, 175, 1, 235, 174, 175, 1,
- 236, 18, 175, 1, 236, 20, 175, 1, 245, 17, 175, 1, 245, 204, 175, 1, 254,
- 188, 175, 1, 226, 108, 175, 1, 226, 177, 175, 1, 253, 178, 175, 1, 254,
- 146, 234, 187, 175, 1, 231, 209, 234, 187, 175, 1, 254, 146, 243, 82,
- 175, 1, 231, 209, 243, 82, 175, 1, 234, 229, 229, 222, 175, 1, 221, 236,
- 243, 82, 175, 1, 254, 146, 250, 216, 175, 1, 231, 209, 250, 216, 175, 1,
- 254, 146, 235, 127, 175, 1, 231, 209, 235, 127, 175, 1, 217, 98, 229,
- 222, 175, 1, 217, 98, 221, 235, 229, 223, 175, 1, 221, 236, 235, 127,
- 175, 1, 254, 146, 215, 152, 175, 1, 231, 209, 215, 152, 175, 1, 254, 146,
- 248, 126, 175, 1, 231, 209, 248, 126, 175, 1, 230, 53, 229, 180, 175, 1,
- 221, 236, 248, 126, 175, 1, 254, 146, 217, 30, 175, 1, 231, 209, 217, 30,
- 175, 1, 254, 146, 248, 144, 175, 1, 231, 209, 248, 144, 175, 1, 248, 174,
- 229, 180, 175, 1, 221, 236, 248, 144, 175, 1, 254, 146, 225, 228, 175, 1,
- 231, 209, 225, 228, 175, 1, 254, 146, 252, 112, 175, 1, 231, 209, 252,
- 112, 175, 1, 231, 131, 175, 1, 254, 131, 252, 112, 175, 1, 211, 51, 175,
- 1, 223, 133, 175, 1, 248, 174, 233, 67, 175, 1, 214, 1, 175, 1, 217, 98,
- 221, 210, 175, 1, 230, 53, 221, 210, 175, 1, 248, 174, 221, 210, 175, 1,
- 241, 242, 175, 1, 230, 53, 233, 67, 175, 1, 244, 156, 175, 5, 254, 177,
- 175, 25, 5, 254, 233, 175, 25, 5, 234, 155, 254, 240, 175, 25, 5, 247,
- 228, 254, 240, 175, 25, 5, 234, 155, 235, 170, 175, 25, 5, 247, 228, 235,
- 170, 175, 25, 5, 234, 155, 226, 88, 175, 25, 5, 247, 228, 226, 88, 175,
- 25, 5, 243, 124, 175, 25, 5, 234, 15, 175, 25, 5, 247, 228, 234, 15, 175,
- 25, 5, 234, 17, 248, 67, 175, 25, 5, 234, 16, 242, 47, 254, 233, 175, 25,
- 5, 234, 16, 242, 47, 247, 228, 254, 233, 175, 25, 5, 234, 16, 242, 47,
- 243, 81, 175, 25, 5, 243, 81, 175, 25, 5, 247, 228, 243, 124, 175, 25, 5,
- 247, 228, 243, 81, 175, 224, 141, 233, 207, 168, 135, 234, 29, 234, 246,
- 168, 135, 234, 106, 234, 128, 168, 135, 234, 106, 234, 99, 168, 135, 234,
- 106, 234, 95, 168, 135, 234, 106, 234, 103, 168, 135, 234, 106, 223, 154,
- 168, 135, 229, 5, 228, 248, 168, 135, 250, 87, 250, 147, 168, 135, 250,
- 87, 250, 95, 168, 135, 250, 87, 250, 146, 168, 135, 219, 59, 219, 58,
- 168, 135, 250, 87, 250, 83, 168, 135, 210, 245, 210, 252, 168, 135, 247,
- 146, 250, 154, 168, 135, 216, 42, 225, 238, 168, 135, 216, 157, 216, 200,
- 168, 135, 216, 157, 229, 201, 168, 135, 216, 157, 225, 111, 168, 135,
- 228, 75, 229, 98, 168, 135, 247, 146, 248, 68, 168, 135, 216, 42, 217,
- 55, 168, 135, 216, 157, 216, 131, 168, 135, 216, 157, 216, 204, 168, 135,
- 216, 157, 216, 154, 168, 135, 228, 75, 227, 237, 168, 135, 251, 206, 252,
- 164, 168, 135, 225, 17, 225, 42, 168, 135, 225, 122, 225, 113, 168, 135,
- 244, 44, 244, 196, 168, 135, 225, 122, 225, 141, 168, 135, 244, 44, 244,
- 173, 168, 135, 225, 122, 221, 247, 168, 135, 230, 162, 184, 168, 135,
- 210, 245, 211, 79, 168, 135, 222, 212, 222, 139, 168, 135, 222, 140, 168,
- 135, 232, 157, 232, 206, 168, 135, 232, 98, 168, 135, 211, 228, 212, 61,
- 168, 135, 219, 59, 222, 6, 168, 135, 219, 59, 222, 114, 168, 135, 219,
- 59, 218, 82, 168, 135, 241, 69, 241, 159, 168, 135, 232, 157, 250, 68,
- 168, 135, 144, 254, 115, 168, 135, 241, 69, 228, 70, 168, 135, 226, 68,
- 168, 135, 221, 230, 61, 168, 135, 231, 204, 242, 17, 168, 135, 221, 230,
- 255, 73, 168, 135, 221, 230, 254, 136, 168, 135, 221, 230, 73, 168, 135,
- 221, 230, 236, 33, 168, 135, 221, 230, 214, 214, 168, 135, 221, 230, 214,
- 212, 168, 135, 221, 230, 70, 168, 135, 221, 230, 214, 118, 168, 135, 225,
- 124, 168, 249, 98, 16, 252, 165, 168, 135, 221, 230, 75, 168, 135, 221,
- 230, 254, 243, 168, 135, 221, 230, 76, 168, 135, 221, 230, 254, 202, 231,
- 198, 168, 135, 221, 230, 254, 202, 231, 199, 168, 135, 233, 106, 168,
- 135, 231, 195, 168, 135, 231, 196, 168, 135, 231, 204, 245, 180, 168,
- 135, 231, 204, 216, 156, 168, 135, 231, 204, 215, 228, 168, 135, 231,
- 204, 250, 135, 168, 135, 216, 198, 168, 135, 228, 205, 168, 135, 211, 73,
- 168, 135, 244, 35, 168, 21, 210, 86, 168, 21, 110, 168, 21, 105, 168, 21,
- 158, 168, 21, 161, 168, 21, 189, 168, 21, 194, 168, 21, 198, 168, 21,
- 195, 168, 21, 200, 168, 135, 254, 111, 168, 135, 234, 104, 209, 209, 1,
- 234, 28, 209, 209, 1, 234, 106, 218, 35, 209, 209, 1, 234, 106, 217, 62,
- 209, 209, 1, 229, 4, 209, 209, 1, 249, 238, 209, 209, 1, 219, 59, 217,
- 62, 209, 209, 1, 227, 134, 209, 209, 1, 247, 145, 209, 209, 1, 111, 209,
- 209, 1, 216, 157, 218, 35, 209, 209, 1, 216, 157, 217, 62, 209, 209, 1,
- 228, 74, 209, 209, 1, 251, 205, 209, 209, 1, 225, 16, 209, 209, 1, 225,
- 122, 218, 35, 209, 209, 1, 244, 44, 217, 62, 209, 209, 1, 225, 122, 217,
- 62, 209, 209, 1, 244, 44, 218, 35, 209, 209, 1, 230, 161, 209, 209, 1,
- 210, 244, 209, 209, 1, 232, 157, 232, 206, 209, 209, 1, 232, 157, 232,
- 121, 209, 209, 1, 211, 227, 209, 209, 1, 219, 59, 218, 35, 209, 209, 1,
- 241, 69, 218, 35, 209, 209, 1, 76, 209, 209, 1, 241, 69, 217, 62, 209,
- 209, 245, 163, 209, 209, 25, 5, 61, 209, 209, 25, 5, 231, 204, 234, 234,
- 209, 209, 25, 5, 255, 73, 209, 209, 25, 5, 254, 136, 209, 209, 25, 5, 73,
- 209, 209, 25, 5, 236, 33, 209, 209, 25, 5, 211, 117, 209, 209, 25, 5,
- 210, 169, 209, 209, 25, 5, 70, 209, 209, 25, 5, 214, 118, 209, 209, 25,
- 5, 231, 204, 234, 13, 209, 209, 220, 145, 5, 232, 156, 209, 209, 220,
- 145, 5, 227, 134, 209, 209, 25, 5, 75, 209, 209, 25, 5, 245, 195, 209,
- 209, 25, 5, 76, 209, 209, 25, 5, 253, 167, 209, 209, 25, 5, 254, 201,
- 209, 209, 234, 29, 233, 135, 209, 209, 138, 231, 204, 245, 180, 209, 209,
- 138, 231, 204, 216, 156, 209, 209, 138, 231, 204, 216, 117, 209, 209,
- 138, 231, 204, 250, 223, 209, 209, 251, 4, 78, 209, 209, 228, 214, 209,
+ 198, 136, 21, 195, 136, 21, 200, 136, 54, 216, 248, 136, 54, 123, 240,
+ 211, 136, 54, 123, 216, 148, 136, 244, 3, 123, 224, 22, 136, 244, 3, 123,
+ 242, 28, 136, 244, 3, 134, 224, 20, 136, 248, 151, 78, 136, 1, 250, 100,
+ 228, 112, 136, 1, 250, 100, 230, 26, 136, 1, 250, 100, 222, 181, 136, 1,
+ 250, 100, 156, 136, 1, 250, 100, 232, 186, 136, 1, 250, 100, 235, 24,
+ 175, 5, 254, 75, 175, 5, 213, 146, 175, 1, 253, 166, 175, 1, 255, 28,
+ 175, 1, 254, 224, 175, 1, 254, 239, 175, 1, 235, 152, 175, 1, 236, 33,
+ 175, 1, 214, 110, 175, 1, 214, 112, 175, 1, 235, 174, 175, 1, 235, 175,
+ 175, 1, 236, 19, 175, 1, 236, 21, 175, 1, 245, 18, 175, 1, 245, 205, 175,
+ 1, 254, 189, 175, 1, 226, 109, 175, 1, 226, 178, 175, 1, 253, 179, 175,
+ 1, 254, 147, 234, 188, 175, 1, 231, 210, 234, 188, 175, 1, 254, 147, 243,
+ 83, 175, 1, 231, 210, 243, 83, 175, 1, 234, 230, 229, 223, 175, 1, 221,
+ 237, 243, 83, 175, 1, 254, 147, 250, 217, 175, 1, 231, 210, 250, 217,
+ 175, 1, 254, 147, 235, 128, 175, 1, 231, 210, 235, 128, 175, 1, 217, 99,
+ 229, 223, 175, 1, 217, 99, 221, 236, 229, 224, 175, 1, 221, 237, 235,
+ 128, 175, 1, 254, 147, 215, 153, 175, 1, 231, 210, 215, 153, 175, 1, 254,
+ 147, 248, 127, 175, 1, 231, 210, 248, 127, 175, 1, 230, 54, 229, 181,
+ 175, 1, 221, 237, 248, 127, 175, 1, 254, 147, 217, 31, 175, 1, 231, 210,
+ 217, 31, 175, 1, 254, 147, 248, 145, 175, 1, 231, 210, 248, 145, 175, 1,
+ 248, 175, 229, 181, 175, 1, 221, 237, 248, 145, 175, 1, 254, 147, 225,
+ 229, 175, 1, 231, 210, 225, 229, 175, 1, 254, 147, 252, 113, 175, 1, 231,
+ 210, 252, 113, 175, 1, 231, 132, 175, 1, 254, 132, 252, 113, 175, 1, 211,
+ 51, 175, 1, 223, 134, 175, 1, 248, 175, 233, 68, 175, 1, 214, 1, 175, 1,
+ 217, 99, 221, 211, 175, 1, 230, 54, 221, 211, 175, 1, 248, 175, 221, 211,
+ 175, 1, 241, 243, 175, 1, 230, 54, 233, 68, 175, 1, 244, 157, 175, 5,
+ 254, 178, 175, 25, 5, 254, 234, 175, 25, 5, 234, 156, 254, 241, 175, 25,
+ 5, 247, 229, 254, 241, 175, 25, 5, 234, 156, 235, 171, 175, 25, 5, 247,
+ 229, 235, 171, 175, 25, 5, 234, 156, 226, 89, 175, 25, 5, 247, 229, 226,
+ 89, 175, 25, 5, 243, 125, 175, 25, 5, 234, 16, 175, 25, 5, 247, 229, 234,
+ 16, 175, 25, 5, 234, 18, 248, 68, 175, 25, 5, 234, 17, 242, 48, 254, 234,
+ 175, 25, 5, 234, 17, 242, 48, 247, 229, 254, 234, 175, 25, 5, 234, 17,
+ 242, 48, 243, 82, 175, 25, 5, 243, 82, 175, 25, 5, 247, 229, 243, 125,
+ 175, 25, 5, 247, 229, 243, 82, 175, 224, 142, 233, 208, 168, 135, 234,
+ 30, 234, 247, 168, 135, 234, 107, 234, 129, 168, 135, 234, 107, 234, 100,
+ 168, 135, 234, 107, 234, 96, 168, 135, 234, 107, 234, 104, 168, 135, 234,
+ 107, 223, 155, 168, 135, 229, 6, 228, 249, 168, 135, 250, 88, 250, 148,
+ 168, 135, 250, 88, 250, 96, 168, 135, 250, 88, 250, 147, 168, 135, 219,
+ 60, 219, 59, 168, 135, 250, 88, 250, 84, 168, 135, 210, 245, 210, 252,
+ 168, 135, 247, 147, 250, 155, 168, 135, 216, 43, 225, 239, 168, 135, 216,
+ 158, 216, 201, 168, 135, 216, 158, 229, 202, 168, 135, 216, 158, 225,
+ 112, 168, 135, 228, 76, 229, 99, 168, 135, 247, 147, 248, 69, 168, 135,
+ 216, 43, 217, 56, 168, 135, 216, 158, 216, 132, 168, 135, 216, 158, 216,
+ 205, 168, 135, 216, 158, 216, 155, 168, 135, 228, 76, 227, 238, 168, 135,
+ 251, 207, 252, 165, 168, 135, 225, 18, 225, 43, 168, 135, 225, 123, 225,
+ 114, 168, 135, 244, 45, 244, 197, 168, 135, 225, 123, 225, 142, 168, 135,
+ 244, 45, 244, 174, 168, 135, 225, 123, 221, 248, 168, 135, 230, 163, 185,
+ 168, 135, 210, 245, 211, 79, 168, 135, 222, 213, 222, 140, 168, 135, 222,
+ 141, 168, 135, 232, 158, 232, 207, 168, 135, 232, 99, 168, 135, 211, 228,
+ 212, 61, 168, 135, 219, 60, 222, 7, 168, 135, 219, 60, 222, 115, 168,
+ 135, 219, 60, 218, 83, 168, 135, 241, 70, 241, 160, 168, 135, 232, 158,
+ 250, 69, 168, 135, 144, 254, 116, 168, 135, 241, 70, 228, 71, 168, 135,
+ 226, 69, 168, 135, 221, 231, 61, 168, 135, 231, 205, 242, 18, 168, 135,
+ 221, 231, 255, 74, 168, 135, 221, 231, 254, 137, 168, 135, 221, 231, 73,
+ 168, 135, 221, 231, 236, 34, 168, 135, 221, 231, 214, 214, 168, 135, 221,
+ 231, 214, 212, 168, 135, 221, 231, 70, 168, 135, 221, 231, 214, 118, 168,
+ 135, 225, 125, 168, 249, 99, 16, 252, 166, 168, 135, 221, 231, 75, 168,
+ 135, 221, 231, 254, 244, 168, 135, 221, 231, 76, 168, 135, 221, 231, 254,
+ 203, 231, 199, 168, 135, 221, 231, 254, 203, 231, 200, 168, 135, 233,
+ 107, 168, 135, 231, 196, 168, 135, 231, 197, 168, 135, 231, 205, 245,
+ 181, 168, 135, 231, 205, 216, 157, 168, 135, 231, 205, 215, 229, 168,
+ 135, 231, 205, 250, 136, 168, 135, 216, 199, 168, 135, 228, 206, 168,
+ 135, 211, 73, 168, 135, 244, 36, 168, 21, 210, 86, 168, 21, 110, 168, 21,
+ 105, 168, 21, 158, 168, 21, 161, 168, 21, 189, 168, 21, 194, 168, 21,
+ 198, 168, 21, 195, 168, 21, 200, 168, 135, 254, 112, 168, 135, 234, 105,
+ 209, 209, 1, 234, 29, 209, 209, 1, 234, 107, 218, 36, 209, 209, 1, 234,
+ 107, 217, 63, 209, 209, 1, 229, 5, 209, 209, 1, 249, 239, 209, 209, 1,
+ 219, 60, 217, 63, 209, 209, 1, 227, 135, 209, 209, 1, 247, 146, 209, 209,
+ 1, 111, 209, 209, 1, 216, 158, 218, 36, 209, 209, 1, 216, 158, 217, 63,
+ 209, 209, 1, 228, 75, 209, 209, 1, 251, 206, 209, 209, 1, 225, 17, 209,
+ 209, 1, 225, 123, 218, 36, 209, 209, 1, 244, 45, 217, 63, 209, 209, 1,
+ 225, 123, 217, 63, 209, 209, 1, 244, 45, 218, 36, 209, 209, 1, 230, 162,
+ 209, 209, 1, 210, 244, 209, 209, 1, 232, 158, 232, 207, 209, 209, 1, 232,
+ 158, 232, 122, 209, 209, 1, 211, 227, 209, 209, 1, 219, 60, 218, 36, 209,
+ 209, 1, 241, 70, 218, 36, 209, 209, 1, 76, 209, 209, 1, 241, 70, 217, 63,
+ 209, 209, 245, 164, 209, 209, 25, 5, 61, 209, 209, 25, 5, 231, 205, 234,
+ 235, 209, 209, 25, 5, 255, 74, 209, 209, 25, 5, 254, 137, 209, 209, 25,
+ 5, 73, 209, 209, 25, 5, 236, 34, 209, 209, 25, 5, 211, 117, 209, 209, 25,
+ 5, 210, 169, 209, 209, 25, 5, 70, 209, 209, 25, 5, 214, 118, 209, 209,
+ 25, 5, 231, 205, 234, 14, 209, 209, 220, 146, 5, 232, 157, 209, 209, 220,
+ 146, 5, 227, 135, 209, 209, 25, 5, 75, 209, 209, 25, 5, 245, 196, 209,
+ 209, 25, 5, 76, 209, 209, 25, 5, 253, 168, 209, 209, 25, 5, 254, 202,
+ 209, 209, 234, 30, 233, 136, 209, 209, 138, 231, 205, 245, 181, 209, 209,
+ 138, 231, 205, 216, 157, 209, 209, 138, 231, 205, 216, 118, 209, 209,
+ 138, 231, 205, 250, 224, 209, 209, 251, 5, 78, 209, 209, 228, 215, 209,
209, 21, 210, 86, 209, 209, 21, 110, 209, 209, 21, 105, 209, 209, 21,
158, 209, 209, 21, 161, 209, 209, 21, 189, 209, 209, 21, 194, 209, 209,
- 21, 198, 209, 209, 21, 195, 209, 209, 21, 200, 209, 209, 241, 69, 228,
- 74, 209, 209, 241, 69, 230, 161, 209, 209, 1, 234, 107, 242, 174, 209,
- 209, 1, 234, 107, 227, 134, 63, 3, 226, 204, 63, 164, 242, 115, 211, 0,
- 230, 248, 215, 189, 61, 63, 164, 242, 115, 211, 0, 230, 248, 255, 159,
- 222, 216, 252, 77, 184, 63, 164, 242, 115, 211, 0, 230, 248, 255, 159,
- 242, 115, 215, 173, 184, 63, 164, 65, 211, 0, 230, 248, 231, 93, 184, 63,
- 164, 249, 252, 211, 0, 230, 248, 220, 109, 184, 63, 164, 250, 239, 211,
- 0, 230, 248, 225, 112, 220, 96, 184, 63, 164, 211, 0, 230, 248, 215, 173,
- 220, 96, 184, 63, 164, 221, 208, 220, 95, 63, 164, 251, 128, 211, 0, 230,
- 247, 63, 164, 251, 223, 220, 3, 211, 0, 230, 247, 63, 164, 235, 197, 215,
- 172, 63, 164, 248, 61, 215, 173, 251, 127, 63, 164, 220, 95, 63, 164,
- 227, 139, 220, 95, 63, 164, 215, 173, 220, 95, 63, 164, 227, 139, 215,
- 173, 220, 95, 63, 164, 222, 236, 250, 122, 218, 236, 220, 95, 63, 164,
- 223, 42, 242, 146, 220, 95, 63, 164, 250, 239, 255, 163, 222, 144, 231,
- 92, 199, 251, 7, 63, 164, 242, 115, 215, 172, 63, 232, 144, 5, 250, 155,
- 222, 143, 63, 232, 144, 5, 232, 252, 222, 143, 63, 253, 212, 5, 220, 105,
- 243, 65, 255, 164, 222, 143, 63, 253, 212, 5, 255, 161, 190, 63, 253,
- 212, 5, 221, 182, 215, 168, 63, 5, 223, 130, 247, 159, 243, 64, 63, 5,
- 223, 130, 247, 159, 242, 176, 63, 5, 223, 130, 247, 159, 242, 116, 63, 5,
- 223, 130, 229, 219, 243, 64, 63, 5, 223, 130, 229, 219, 242, 176, 63, 5,
- 223, 130, 247, 159, 223, 130, 229, 218, 63, 21, 210, 86, 63, 21, 110, 63,
+ 21, 198, 209, 209, 21, 195, 209, 209, 21, 200, 209, 209, 241, 70, 228,
+ 75, 209, 209, 241, 70, 230, 162, 209, 209, 1, 234, 108, 242, 175, 209,
+ 209, 1, 234, 108, 227, 135, 63, 3, 226, 205, 63, 164, 242, 116, 211, 0,
+ 230, 249, 215, 190, 61, 63, 164, 242, 116, 211, 0, 230, 249, 255, 160,
+ 222, 217, 252, 78, 185, 63, 164, 242, 116, 211, 0, 230, 249, 255, 160,
+ 242, 116, 215, 174, 185, 63, 164, 65, 211, 0, 230, 249, 231, 94, 185, 63,
+ 164, 249, 253, 211, 0, 230, 249, 220, 110, 185, 63, 164, 250, 240, 211,
+ 0, 230, 249, 225, 113, 220, 97, 185, 63, 164, 211, 0, 230, 249, 215, 174,
+ 220, 97, 185, 63, 164, 221, 209, 220, 96, 63, 164, 251, 129, 211, 0, 230,
+ 248, 63, 164, 251, 224, 220, 4, 211, 0, 230, 248, 63, 164, 235, 198, 215,
+ 173, 63, 164, 248, 62, 215, 174, 251, 128, 63, 164, 220, 96, 63, 164,
+ 227, 140, 220, 96, 63, 164, 215, 174, 220, 96, 63, 164, 227, 140, 215,
+ 174, 220, 96, 63, 164, 222, 237, 250, 123, 218, 237, 220, 96, 63, 164,
+ 223, 43, 242, 147, 220, 96, 63, 164, 250, 240, 255, 164, 222, 145, 231,
+ 93, 199, 251, 8, 63, 164, 242, 116, 215, 173, 63, 232, 145, 5, 250, 156,
+ 222, 144, 63, 232, 145, 5, 232, 253, 222, 144, 63, 253, 213, 5, 220, 106,
+ 243, 66, 255, 165, 222, 144, 63, 253, 213, 5, 255, 162, 190, 63, 253,
+ 213, 5, 221, 183, 215, 169, 63, 5, 223, 131, 247, 160, 243, 65, 63, 5,
+ 223, 131, 247, 160, 242, 177, 63, 5, 223, 131, 247, 160, 242, 117, 63, 5,
+ 223, 131, 229, 220, 243, 65, 63, 5, 223, 131, 229, 220, 242, 177, 63, 5,
+ 223, 131, 247, 160, 223, 131, 229, 219, 63, 21, 210, 86, 63, 21, 110, 63,
21, 105, 63, 21, 158, 63, 21, 161, 63, 21, 189, 63, 21, 194, 63, 21, 198,
63, 21, 195, 63, 21, 200, 63, 21, 163, 110, 63, 21, 163, 105, 63, 21,
163, 158, 63, 21, 163, 161, 63, 21, 163, 189, 63, 21, 163, 194, 63, 21,
163, 198, 63, 21, 163, 195, 63, 21, 163, 200, 63, 21, 163, 210, 86, 63,
- 164, 251, 130, 222, 143, 63, 164, 229, 68, 251, 68, 227, 149, 210, 25,
- 63, 164, 250, 239, 255, 163, 222, 144, 251, 69, 230, 202, 251, 7, 63,
- 164, 229, 68, 251, 68, 220, 106, 222, 143, 63, 164, 250, 132, 230, 247,
- 63, 164, 215, 184, 255, 160, 63, 164, 242, 100, 222, 144, 242, 63, 63,
- 164, 242, 100, 222, 144, 242, 69, 63, 164, 254, 116, 234, 123, 242, 63,
- 63, 164, 254, 116, 234, 123, 242, 69, 63, 5, 211, 65, 215, 171, 63, 5,
- 231, 167, 215, 171, 63, 1, 176, 63, 1, 234, 132, 63, 1, 243, 135, 63, 1,
- 242, 249, 63, 1, 229, 77, 63, 1, 251, 33, 63, 1, 250, 157, 63, 1, 235,
- 141, 63, 1, 227, 165, 63, 1, 215, 156, 63, 1, 215, 144, 63, 1, 248, 135,
- 63, 1, 248, 119, 63, 1, 228, 110, 63, 1, 217, 105, 63, 1, 216, 208, 63,
- 1, 248, 221, 63, 1, 248, 25, 63, 1, 197, 63, 1, 190, 63, 1, 225, 147, 63,
- 1, 252, 191, 63, 1, 252, 18, 63, 1, 184, 63, 1, 215, 183, 63, 1, 215,
- 175, 63, 1, 246, 38, 63, 1, 246, 33, 63, 1, 212, 65, 63, 1, 210, 82, 63,
- 1, 210, 116, 63, 1, 255, 166, 63, 1, 191, 63, 1, 205, 63, 1, 233, 135,
- 63, 1, 220, 102, 63, 1, 218, 223, 63, 1, 206, 63, 1, 162, 63, 1, 61, 63,
- 1, 233, 231, 63, 1, 244, 77, 205, 63, 1, 234, 46, 63, 1, 222, 179, 63,
- 25, 5, 255, 73, 63, 25, 5, 73, 63, 25, 5, 236, 33, 63, 25, 5, 70, 63, 25,
- 5, 214, 118, 63, 25, 5, 149, 153, 63, 25, 5, 149, 222, 180, 63, 25, 5,
- 149, 156, 63, 25, 5, 149, 232, 185, 63, 25, 5, 75, 63, 25, 5, 245, 209,
- 63, 25, 5, 76, 63, 25, 5, 226, 183, 63, 5, 222, 221, 218, 84, 229, 78,
- 222, 211, 63, 5, 222, 216, 252, 76, 63, 25, 5, 223, 49, 73, 63, 25, 5,
- 223, 49, 236, 33, 63, 5, 227, 149, 210, 26, 229, 226, 248, 221, 63, 5,
- 219, 71, 233, 60, 63, 164, 242, 29, 63, 164, 226, 57, 63, 5, 233, 63,
- 222, 143, 63, 5, 211, 70, 222, 143, 63, 5, 233, 64, 215, 184, 251, 7, 63,
- 5, 231, 95, 251, 7, 63, 5, 242, 119, 251, 8, 223, 40, 63, 5, 242, 119,
- 231, 85, 223, 40, 63, 5, 235, 193, 231, 95, 251, 7, 63, 218, 73, 5, 233,
- 64, 215, 184, 251, 7, 63, 218, 73, 5, 231, 95, 251, 7, 63, 218, 73, 5,
- 235, 193, 231, 95, 251, 7, 63, 218, 73, 1, 176, 63, 218, 73, 1, 234, 132,
- 63, 218, 73, 1, 243, 135, 63, 218, 73, 1, 242, 249, 63, 218, 73, 1, 229,
- 77, 63, 218, 73, 1, 251, 33, 63, 218, 73, 1, 250, 157, 63, 218, 73, 1,
- 235, 141, 63, 218, 73, 1, 227, 165, 63, 218, 73, 1, 215, 156, 63, 218,
- 73, 1, 215, 144, 63, 218, 73, 1, 248, 135, 63, 218, 73, 1, 248, 119, 63,
- 218, 73, 1, 228, 110, 63, 218, 73, 1, 217, 105, 63, 218, 73, 1, 216, 208,
- 63, 218, 73, 1, 248, 221, 63, 218, 73, 1, 248, 25, 63, 218, 73, 1, 197,
- 63, 218, 73, 1, 190, 63, 218, 73, 1, 225, 147, 63, 218, 73, 1, 252, 191,
- 63, 218, 73, 1, 252, 18, 63, 218, 73, 1, 184, 63, 218, 73, 1, 215, 183,
- 63, 218, 73, 1, 215, 175, 63, 218, 73, 1, 246, 38, 63, 218, 73, 1, 246,
- 33, 63, 218, 73, 1, 212, 65, 63, 218, 73, 1, 210, 82, 63, 218, 73, 1,
- 210, 116, 63, 218, 73, 1, 255, 166, 63, 218, 73, 1, 191, 63, 218, 73, 1,
- 205, 63, 218, 73, 1, 233, 135, 63, 218, 73, 1, 220, 102, 63, 218, 73, 1,
- 218, 223, 63, 218, 73, 1, 206, 63, 218, 73, 1, 162, 63, 218, 73, 1, 61,
- 63, 218, 73, 1, 233, 231, 63, 218, 73, 1, 244, 77, 212, 65, 63, 218, 73,
- 1, 244, 77, 191, 63, 218, 73, 1, 244, 77, 205, 63, 233, 218, 222, 141,
- 234, 132, 63, 233, 218, 222, 141, 234, 133, 251, 69, 230, 202, 251, 7,
- 63, 250, 252, 5, 114, 252, 70, 63, 250, 252, 5, 192, 252, 70, 63, 250,
- 252, 5, 250, 253, 217, 20, 63, 250, 252, 5, 221, 207, 255, 165, 63, 16,
- 246, 91, 251, 125, 63, 16, 223, 129, 222, 222, 63, 16, 226, 77, 243, 63,
- 63, 16, 223, 129, 222, 223, 223, 42, 242, 145, 63, 16, 225, 112, 190, 63,
- 16, 228, 59, 251, 125, 63, 16, 228, 59, 251, 126, 227, 139, 255, 162, 63,
- 16, 228, 59, 251, 126, 242, 117, 255, 162, 63, 16, 228, 59, 251, 126,
- 251, 69, 255, 162, 63, 5, 223, 130, 229, 219, 223, 130, 247, 158, 63, 5,
- 223, 130, 229, 219, 242, 116, 63, 164, 251, 129, 220, 3, 242, 215, 230,
- 248, 223, 41, 63, 164, 230, 163, 211, 0, 242, 215, 230, 248, 223, 41, 63,
- 164, 227, 139, 215, 172, 63, 164, 65, 251, 152, 222, 213, 211, 0, 230,
- 248, 231, 93, 184, 63, 164, 249, 252, 251, 152, 222, 213, 211, 0, 230,
- 248, 220, 109, 184, 222, 250, 217, 255, 50, 233, 45, 217, 255, 50, 222,
- 250, 217, 255, 5, 2, 247, 118, 233, 45, 217, 255, 5, 2, 247, 118, 63,
- 164, 233, 55, 231, 96, 222, 143, 63, 164, 215, 250, 231, 96, 222, 143,
- 68, 1, 176, 68, 1, 234, 132, 68, 1, 243, 135, 68, 1, 242, 249, 68, 1,
- 229, 77, 68, 1, 251, 33, 68, 1, 250, 157, 68, 1, 235, 141, 68, 1, 235,
- 114, 68, 1, 227, 165, 68, 1, 228, 76, 68, 1, 215, 156, 68, 1, 215, 144,
- 68, 1, 248, 135, 68, 1, 248, 119, 68, 1, 228, 110, 68, 1, 217, 105, 68,
- 1, 216, 208, 68, 1, 248, 221, 68, 1, 248, 25, 68, 1, 197, 68, 1, 190, 68,
- 1, 225, 147, 68, 1, 252, 191, 68, 1, 252, 18, 68, 1, 184, 68, 1, 191, 68,
- 1, 205, 68, 1, 233, 135, 68, 1, 212, 65, 68, 1, 206, 68, 1, 162, 68, 1,
- 232, 184, 68, 1, 61, 68, 1, 220, 86, 61, 68, 1, 73, 68, 1, 236, 33, 68,
- 1, 70, 68, 1, 214, 118, 68, 1, 75, 68, 1, 230, 151, 75, 68, 1, 76, 68, 1,
- 253, 192, 68, 25, 5, 217, 64, 255, 73, 68, 25, 5, 255, 73, 68, 25, 5, 73,
- 68, 25, 5, 236, 33, 68, 25, 5, 70, 68, 25, 5, 214, 118, 68, 25, 5, 75,
- 68, 25, 5, 254, 201, 68, 25, 5, 230, 151, 236, 33, 68, 25, 5, 230, 151,
- 76, 68, 25, 5, 160, 48, 68, 5, 254, 75, 68, 5, 59, 51, 68, 5, 213, 147,
- 68, 5, 213, 152, 68, 5, 253, 235, 68, 116, 5, 147, 191, 68, 116, 5, 147,
- 205, 68, 116, 5, 147, 212, 65, 68, 116, 5, 147, 162, 68, 1, 242, 132,
- 206, 68, 21, 210, 86, 68, 21, 110, 68, 21, 105, 68, 21, 158, 68, 21, 161,
- 68, 21, 189, 68, 21, 194, 68, 21, 198, 68, 21, 195, 68, 21, 200, 68, 5,
- 232, 192, 221, 172, 68, 5, 221, 172, 68, 16, 232, 153, 68, 16, 249, 213,
- 68, 16, 254, 220, 68, 16, 243, 48, 68, 1, 220, 102, 68, 1, 218, 223, 68,
- 1, 149, 153, 68, 1, 149, 222, 180, 68, 1, 149, 156, 68, 1, 149, 232, 185,
- 68, 25, 5, 149, 153, 68, 25, 5, 149, 222, 180, 68, 25, 5, 149, 156, 68,
- 25, 5, 149, 232, 185, 68, 1, 230, 151, 229, 77, 68, 1, 230, 151, 235,
- 114, 68, 1, 230, 151, 252, 111, 68, 1, 230, 151, 252, 106, 68, 116, 5,
- 230, 151, 147, 197, 68, 116, 5, 230, 151, 147, 184, 68, 116, 5, 230, 151,
- 147, 233, 135, 68, 1, 220, 108, 234, 213, 220, 102, 68, 25, 5, 220, 108,
- 234, 213, 245, 55, 68, 138, 164, 220, 108, 234, 213, 241, 247, 68, 138,
- 164, 220, 108, 234, 213, 234, 183, 225, 121, 68, 1, 212, 7, 224, 108,
- 234, 213, 216, 208, 68, 1, 212, 7, 224, 108, 234, 213, 224, 114, 68, 25,
- 5, 212, 7, 224, 108, 234, 213, 245, 55, 68, 25, 5, 212, 7, 224, 108, 234,
- 213, 214, 214, 68, 5, 212, 7, 224, 108, 234, 213, 216, 29, 68, 5, 212, 7,
- 224, 108, 234, 213, 216, 28, 68, 5, 212, 7, 224, 108, 234, 213, 216, 27,
- 68, 5, 212, 7, 224, 108, 234, 213, 216, 26, 68, 5, 212, 7, 224, 108, 234,
- 213, 216, 25, 68, 1, 245, 219, 224, 108, 234, 213, 228, 110, 68, 1, 245,
- 219, 224, 108, 234, 213, 210, 176, 68, 1, 245, 219, 224, 108, 234, 213,
- 242, 217, 68, 25, 5, 243, 59, 234, 213, 73, 68, 25, 5, 234, 188, 226,
- 234, 68, 25, 5, 234, 188, 70, 68, 25, 5, 234, 188, 245, 209, 68, 1, 220,
- 86, 176, 68, 1, 220, 86, 234, 132, 68, 1, 220, 86, 243, 135, 68, 1, 220,
- 86, 251, 33, 68, 1, 220, 86, 210, 116, 68, 1, 220, 86, 227, 165, 68, 1,
- 220, 86, 248, 221, 68, 1, 220, 86, 197, 68, 1, 220, 86, 225, 147, 68, 1,
- 220, 86, 244, 196, 68, 1, 220, 86, 252, 191, 68, 1, 220, 86, 216, 208,
- 68, 1, 220, 86, 162, 68, 116, 5, 220, 86, 147, 212, 65, 68, 25, 5, 220,
- 86, 255, 73, 68, 25, 5, 220, 86, 75, 68, 25, 5, 220, 86, 160, 48, 68, 25,
- 5, 220, 86, 40, 211, 117, 68, 5, 220, 86, 216, 28, 68, 5, 220, 86, 216,
- 27, 68, 5, 220, 86, 216, 25, 68, 5, 220, 86, 216, 24, 68, 5, 220, 86,
- 249, 152, 216, 28, 68, 5, 220, 86, 249, 152, 216, 27, 68, 5, 220, 86,
- 249, 152, 245, 153, 216, 30, 68, 1, 222, 128, 226, 63, 244, 196, 68, 5,
- 222, 128, 226, 63, 216, 25, 68, 220, 86, 21, 210, 86, 68, 220, 86, 21,
- 110, 68, 220, 86, 21, 105, 68, 220, 86, 21, 158, 68, 220, 86, 21, 161,
- 68, 220, 86, 21, 189, 68, 220, 86, 21, 194, 68, 220, 86, 21, 198, 68,
- 220, 86, 21, 195, 68, 220, 86, 21, 200, 68, 5, 234, 126, 216, 29, 68, 5,
- 234, 126, 216, 27, 68, 25, 5, 254, 190, 61, 68, 25, 5, 254, 190, 254,
- 201, 68, 16, 220, 86, 110, 68, 16, 220, 86, 245, 30, 98, 6, 1, 254, 123,
- 98, 6, 1, 252, 152, 98, 6, 1, 243, 106, 98, 6, 1, 247, 128, 98, 6, 1,
- 245, 150, 98, 6, 1, 213, 160, 98, 6, 1, 210, 89, 98, 6, 1, 217, 60, 98,
- 6, 1, 235, 255, 98, 6, 1, 234, 234, 98, 6, 1, 233, 81, 98, 6, 1, 231,
- 185, 98, 6, 1, 229, 195, 98, 6, 1, 226, 196, 98, 6, 1, 226, 17, 98, 6, 1,
- 210, 78, 98, 6, 1, 223, 171, 98, 6, 1, 221, 243, 98, 6, 1, 217, 50, 98,
- 6, 1, 214, 190, 98, 6, 1, 225, 140, 98, 6, 1, 234, 121, 98, 6, 1, 242,
- 241, 98, 6, 1, 224, 73, 98, 6, 1, 220, 20, 98, 6, 1, 250, 97, 98, 6, 1,
- 251, 7, 98, 6, 1, 235, 100, 98, 6, 1, 250, 40, 98, 6, 1, 250, 143, 98, 6,
- 1, 211, 163, 98, 6, 1, 235, 111, 98, 6, 1, 242, 43, 98, 6, 1, 241, 238,
- 98, 6, 1, 241, 175, 98, 6, 1, 212, 22, 98, 6, 1, 242, 4, 98, 6, 1, 241,
- 65, 98, 6, 1, 210, 246, 98, 6, 1, 254, 232, 98, 1, 254, 123, 98, 1, 252,
- 152, 98, 1, 243, 106, 98, 1, 247, 128, 98, 1, 245, 150, 98, 1, 213, 160,
- 98, 1, 210, 89, 98, 1, 217, 60, 98, 1, 235, 255, 98, 1, 234, 234, 98, 1,
- 233, 81, 98, 1, 231, 185, 98, 1, 229, 195, 98, 1, 226, 196, 98, 1, 226,
- 17, 98, 1, 210, 78, 98, 1, 223, 171, 98, 1, 221, 243, 98, 1, 217, 50, 98,
- 1, 214, 190, 98, 1, 225, 140, 98, 1, 234, 121, 98, 1, 242, 241, 98, 1,
- 224, 73, 98, 1, 220, 20, 98, 1, 250, 97, 98, 1, 251, 7, 98, 1, 235, 100,
- 98, 1, 250, 40, 98, 1, 250, 143, 98, 1, 211, 163, 98, 1, 235, 111, 98, 1,
- 242, 43, 98, 1, 241, 238, 98, 1, 241, 175, 98, 1, 212, 22, 98, 1, 242, 4,
- 98, 1, 241, 65, 98, 1, 244, 121, 98, 1, 210, 246, 98, 1, 245, 165, 98, 1,
- 215, 94, 243, 106, 98, 1, 254, 196, 98, 226, 15, 220, 137, 58, 1, 98,
- 229, 195, 98, 1, 254, 232, 98, 1, 242, 3, 50, 98, 1, 233, 127, 50, 24,
- 100, 234, 58, 24, 100, 218, 215, 24, 100, 228, 226, 24, 100, 216, 101,
- 24, 100, 218, 204, 24, 100, 223, 26, 24, 100, 230, 217, 24, 100, 225, 95,
- 24, 100, 218, 212, 24, 100, 219, 148, 24, 100, 218, 209, 24, 100, 236,
- 56, 24, 100, 250, 46, 24, 100, 218, 219, 24, 100, 250, 106, 24, 100, 234,
- 110, 24, 100, 216, 173, 24, 100, 225, 131, 24, 100, 241, 172, 24, 100,
- 228, 222, 24, 100, 218, 213, 24, 100, 228, 216, 24, 100, 228, 220, 24,
- 100, 216, 98, 24, 100, 223, 14, 24, 100, 218, 211, 24, 100, 223, 24, 24,
- 100, 234, 218, 24, 100, 230, 210, 24, 100, 234, 221, 24, 100, 225, 90,
- 24, 100, 225, 88, 24, 100, 225, 76, 24, 100, 225, 84, 24, 100, 225, 82,
- 24, 100, 225, 79, 24, 100, 225, 81, 24, 100, 225, 78, 24, 100, 225, 83,
- 24, 100, 225, 93, 24, 100, 225, 94, 24, 100, 225, 77, 24, 100, 225, 87,
- 24, 100, 234, 219, 24, 100, 234, 217, 24, 100, 219, 141, 24, 100, 219,
- 139, 24, 100, 219, 131, 24, 100, 219, 134, 24, 100, 219, 140, 24, 100,
- 219, 136, 24, 100, 219, 135, 24, 100, 219, 133, 24, 100, 219, 144, 24,
- 100, 219, 146, 24, 100, 219, 147, 24, 100, 219, 142, 24, 100, 219, 132,
- 24, 100, 219, 137, 24, 100, 219, 145, 24, 100, 250, 90, 24, 100, 250, 88,
- 24, 100, 250, 168, 24, 100, 250, 166, 24, 100, 226, 32, 24, 100, 236, 51,
- 24, 100, 236, 42, 24, 100, 236, 50, 24, 100, 236, 47, 24, 100, 236, 45,
- 24, 100, 236, 49, 24, 100, 218, 216, 24, 100, 236, 54, 24, 100, 236, 55,
- 24, 100, 236, 43, 24, 100, 236, 48, 24, 100, 211, 26, 24, 100, 250, 45,
- 24, 100, 250, 91, 24, 100, 250, 89, 24, 100, 250, 169, 24, 100, 250, 167,
- 24, 100, 250, 104, 24, 100, 250, 105, 24, 100, 250, 92, 24, 100, 250,
- 170, 24, 100, 225, 129, 24, 100, 234, 220, 24, 100, 218, 217, 24, 100,
- 211, 32, 24, 100, 234, 49, 24, 100, 228, 218, 24, 100, 228, 224, 24, 100,
- 228, 223, 24, 100, 216, 95, 24, 100, 244, 103, 24, 143, 244, 103, 24,
- 143, 61, 24, 143, 254, 243, 24, 143, 191, 24, 143, 211, 92, 24, 143, 245,
- 117, 24, 143, 75, 24, 143, 211, 36, 24, 143, 211, 47, 24, 143, 76, 24,
- 143, 212, 65, 24, 143, 212, 62, 24, 143, 226, 234, 24, 143, 210, 244, 24,
- 143, 70, 24, 143, 212, 11, 24, 143, 212, 22, 24, 143, 211, 250, 24, 143,
- 210, 212, 24, 143, 245, 55, 24, 143, 211, 8, 24, 143, 73, 24, 143, 255,
- 157, 24, 143, 255, 156, 24, 143, 211, 106, 24, 143, 211, 104, 24, 143,
- 245, 115, 24, 143, 245, 114, 24, 143, 245, 116, 24, 143, 211, 35, 24,
- 143, 211, 34, 24, 143, 227, 84, 24, 143, 227, 85, 24, 143, 227, 78, 24,
- 143, 227, 83, 24, 143, 227, 81, 24, 143, 210, 238, 24, 143, 210, 237, 24,
- 143, 210, 236, 24, 143, 210, 239, 24, 143, 210, 240, 24, 143, 215, 30,
- 24, 143, 215, 29, 24, 143, 215, 27, 24, 143, 215, 24, 24, 143, 215, 25,
- 24, 143, 210, 211, 24, 143, 210, 208, 24, 143, 210, 209, 24, 143, 210,
- 203, 24, 143, 210, 204, 24, 143, 210, 205, 24, 143, 210, 207, 24, 143,
- 245, 49, 24, 143, 245, 51, 24, 143, 211, 7, 24, 143, 240, 153, 24, 143,
- 240, 145, 24, 143, 240, 148, 24, 143, 240, 146, 24, 143, 240, 150, 24,
- 143, 240, 152, 24, 143, 254, 34, 24, 143, 254, 31, 24, 143, 254, 29, 24,
- 143, 254, 30, 24, 143, 218, 220, 24, 143, 255, 158, 24, 143, 211, 105,
- 24, 143, 211, 33, 24, 143, 227, 80, 24, 143, 227, 79, 24, 90, 234, 58,
- 24, 90, 218, 215, 24, 90, 234, 51, 24, 90, 228, 226, 24, 90, 228, 224,
- 24, 90, 228, 223, 24, 90, 216, 101, 24, 90, 223, 26, 24, 90, 223, 21, 24,
- 90, 223, 18, 24, 90, 223, 11, 24, 90, 223, 6, 24, 90, 223, 1, 24, 90,
- 223, 12, 24, 90, 223, 24, 24, 90, 230, 217, 24, 90, 225, 95, 24, 90, 225,
- 84, 24, 90, 219, 148, 24, 90, 218, 209, 24, 90, 236, 56, 24, 90, 250, 46,
- 24, 90, 250, 106, 24, 90, 234, 110, 24, 90, 216, 173, 24, 90, 225, 131,
- 24, 90, 241, 172, 24, 90, 234, 52, 24, 90, 234, 50, 24, 90, 228, 222, 24,
- 90, 228, 216, 24, 90, 228, 218, 24, 90, 228, 221, 24, 90, 228, 217, 24,
- 90, 216, 98, 24, 90, 216, 95, 24, 90, 223, 19, 24, 90, 223, 14, 24, 90,
- 223, 0, 24, 90, 222, 255, 24, 90, 218, 211, 24, 90, 223, 16, 24, 90, 223,
- 15, 24, 90, 223, 8, 24, 90, 223, 10, 24, 90, 223, 23, 24, 90, 223, 3, 24,
- 90, 223, 13, 24, 90, 223, 22, 24, 90, 222, 254, 24, 90, 230, 213, 24, 90,
- 230, 208, 24, 90, 230, 210, 24, 90, 230, 207, 24, 90, 230, 205, 24, 90,
- 230, 211, 24, 90, 230, 216, 24, 90, 230, 214, 24, 90, 234, 221, 24, 90,
- 225, 86, 24, 90, 225, 87, 24, 90, 225, 92, 24, 90, 234, 219, 24, 90, 219,
- 141, 24, 90, 219, 131, 24, 90, 219, 134, 24, 90, 219, 136, 24, 90, 226,
- 32, 24, 90, 236, 51, 24, 90, 236, 44, 24, 90, 218, 216, 24, 90, 236, 52,
- 24, 90, 211, 26, 24, 90, 211, 22, 24, 90, 211, 23, 24, 90, 225, 129, 24,
- 90, 234, 220, 24, 90, 241, 170, 24, 90, 241, 168, 24, 90, 241, 171, 24,
- 90, 241, 169, 24, 90, 211, 32, 24, 90, 234, 54, 24, 90, 234, 53, 24, 90,
- 234, 57, 24, 90, 234, 55, 24, 90, 234, 56, 24, 90, 218, 213, 29, 3, 162,
- 29, 3, 240, 222, 29, 3, 241, 180, 29, 3, 242, 46, 29, 3, 241, 220, 29, 3,
- 241, 238, 29, 3, 241, 68, 29, 3, 241, 67, 29, 3, 233, 135, 29, 3, 232,
- 98, 29, 3, 232, 241, 29, 3, 233, 134, 29, 3, 233, 50, 29, 3, 233, 58, 29,
- 3, 232, 156, 29, 3, 232, 70, 29, 3, 241, 189, 29, 3, 241, 183, 29, 3,
- 241, 185, 29, 3, 241, 188, 29, 3, 241, 186, 29, 3, 241, 187, 29, 3, 241,
- 184, 29, 3, 241, 182, 29, 3, 184, 29, 3, 230, 102, 29, 3, 230, 230, 29,
- 3, 231, 237, 29, 3, 231, 80, 29, 3, 231, 91, 29, 3, 230, 161, 29, 3, 230,
- 42, 29, 3, 217, 163, 29, 3, 217, 157, 29, 3, 217, 159, 29, 3, 217, 162,
- 29, 3, 217, 160, 29, 3, 217, 161, 29, 3, 217, 158, 29, 3, 217, 156, 29,
- 3, 205, 29, 3, 222, 140, 29, 3, 223, 35, 29, 3, 223, 184, 29, 3, 223,
- 108, 29, 3, 223, 128, 29, 3, 222, 211, 29, 3, 222, 109, 29, 3, 206, 29,
- 3, 218, 83, 29, 3, 219, 191, 29, 3, 222, 31, 29, 3, 221, 170, 29, 3, 221,
- 181, 29, 3, 219, 58, 29, 3, 217, 253, 29, 3, 220, 102, 29, 3, 219, 225,
- 29, 3, 220, 32, 29, 3, 220, 98, 29, 3, 220, 61, 29, 3, 220, 63, 29, 3,
- 220, 7, 29, 3, 219, 208, 29, 3, 224, 88, 29, 3, 224, 30, 29, 3, 224, 53,
- 29, 3, 224, 87, 29, 3, 224, 68, 29, 3, 224, 69, 29, 3, 224, 42, 29, 3,
- 224, 41, 29, 3, 223, 242, 29, 3, 223, 238, 29, 3, 223, 241, 29, 3, 223,
- 239, 29, 3, 223, 240, 29, 3, 224, 65, 29, 3, 224, 59, 29, 3, 224, 61, 29,
- 3, 224, 64, 29, 3, 224, 62, 29, 3, 224, 63, 29, 3, 224, 60, 29, 3, 224,
- 58, 29, 3, 224, 54, 29, 3, 224, 57, 29, 3, 224, 55, 29, 3, 224, 56, 29,
- 3, 252, 191, 29, 3, 251, 125, 29, 3, 252, 6, 29, 3, 252, 189, 29, 3, 252,
- 66, 29, 3, 252, 75, 29, 3, 251, 205, 29, 3, 251, 83, 29, 3, 214, 27, 29,
- 3, 212, 116, 29, 3, 213, 176, 29, 3, 214, 26, 29, 3, 213, 250, 29, 3,
- 213, 255, 29, 3, 213, 138, 29, 3, 212, 107, 29, 3, 217, 105, 29, 3, 215,
- 118, 29, 3, 216, 117, 29, 3, 217, 101, 29, 3, 217, 11, 29, 3, 217, 22,
- 29, 3, 111, 29, 3, 215, 80, 29, 3, 251, 33, 29, 3, 249, 112, 29, 3, 250,
- 51, 29, 3, 251, 32, 29, 3, 250, 182, 29, 3, 250, 190, 29, 3, 249, 238,
- 29, 3, 249, 81, 29, 3, 211, 165, 29, 3, 211, 141, 29, 3, 211, 157, 29, 3,
- 211, 164, 29, 3, 211, 161, 29, 3, 211, 162, 29, 3, 211, 148, 29, 3, 211,
- 147, 29, 3, 211, 136, 29, 3, 211, 132, 29, 3, 211, 135, 29, 3, 211, 133,
- 29, 3, 211, 134, 29, 3, 197, 29, 3, 227, 237, 29, 3, 228, 233, 29, 3,
- 229, 225, 29, 3, 229, 103, 29, 3, 229, 107, 29, 3, 228, 74, 29, 3, 227,
- 174, 29, 3, 227, 165, 29, 3, 227, 128, 29, 3, 227, 148, 29, 3, 227, 164,
- 29, 3, 227, 155, 29, 3, 227, 156, 29, 3, 227, 134, 29, 3, 227, 119, 29,
- 3, 242, 180, 61, 29, 3, 242, 180, 70, 29, 3, 242, 180, 73, 29, 3, 242,
- 180, 255, 73, 29, 3, 242, 180, 245, 209, 29, 3, 242, 180, 75, 29, 3, 242,
- 180, 76, 29, 3, 242, 180, 212, 65, 29, 3, 176, 29, 3, 233, 217, 29, 3,
- 234, 92, 29, 3, 235, 10, 29, 3, 234, 181, 29, 3, 234, 182, 29, 3, 234,
- 28, 29, 3, 234, 27, 29, 3, 233, 182, 29, 3, 233, 176, 29, 3, 233, 181,
- 29, 3, 233, 177, 29, 3, 233, 178, 29, 3, 233, 171, 29, 3, 233, 165, 29,
- 3, 233, 167, 29, 3, 233, 170, 29, 3, 233, 168, 29, 3, 233, 169, 29, 3,
- 233, 166, 29, 3, 233, 164, 29, 3, 233, 160, 29, 3, 233, 163, 29, 3, 233,
- 161, 29, 3, 233, 162, 29, 3, 212, 65, 29, 3, 211, 195, 29, 3, 211, 250,
- 29, 3, 212, 64, 29, 3, 212, 17, 29, 3, 212, 22, 29, 3, 211, 227, 29, 3,
- 211, 226, 29, 3, 225, 139, 61, 29, 3, 225, 139, 70, 29, 3, 225, 139, 73,
- 29, 3, 225, 139, 255, 73, 29, 3, 225, 139, 245, 209, 29, 3, 225, 139, 75,
- 29, 3, 225, 139, 76, 29, 3, 210, 116, 29, 3, 210, 13, 29, 3, 210, 44, 29,
- 3, 210, 115, 29, 3, 210, 92, 29, 3, 210, 94, 29, 3, 210, 23, 29, 3, 210,
- 0, 29, 3, 210, 82, 29, 3, 210, 62, 29, 3, 210, 69, 29, 3, 210, 81, 29, 3,
- 210, 73, 29, 3, 210, 74, 29, 3, 210, 67, 29, 3, 210, 53, 29, 3, 191, 29,
- 3, 210, 212, 29, 3, 211, 8, 29, 3, 211, 103, 29, 3, 211, 44, 29, 3, 211,
- 47, 29, 3, 210, 244, 29, 3, 210, 235, 29, 3, 248, 221, 29, 3, 246, 78,
- 29, 3, 248, 3, 29, 3, 248, 220, 29, 3, 248, 77, 29, 3, 248, 90, 29, 3,
- 247, 145, 29, 3, 246, 47, 29, 3, 248, 135, 29, 3, 248, 100, 29, 3, 248,
- 112, 29, 3, 248, 134, 29, 3, 248, 122, 29, 3, 248, 123, 29, 3, 248, 105,
- 29, 3, 248, 91, 29, 3, 235, 141, 29, 3, 235, 51, 29, 3, 235, 108, 29, 3,
- 235, 140, 29, 3, 235, 124, 29, 3, 235, 126, 29, 3, 235, 68, 29, 3, 235,
- 31, 29, 3, 243, 135, 29, 3, 242, 113, 29, 3, 242, 214, 29, 3, 243, 132,
- 29, 3, 243, 55, 29, 3, 243, 62, 29, 3, 242, 174, 29, 3, 242, 173, 29, 3,
- 242, 78, 29, 3, 242, 74, 29, 3, 242, 77, 29, 3, 242, 75, 29, 3, 242, 76,
- 29, 3, 243, 29, 29, 3, 243, 9, 29, 3, 243, 19, 29, 3, 243, 28, 29, 3,
- 243, 23, 29, 3, 243, 24, 29, 3, 243, 13, 29, 3, 242, 254, 29, 3, 216,
- 208, 29, 3, 216, 136, 29, 3, 216, 175, 29, 3, 216, 207, 29, 3, 216, 194,
- 29, 3, 216, 195, 29, 3, 216, 156, 29, 3, 216, 128, 29, 3, 250, 157, 29,
- 3, 250, 69, 29, 3, 250, 110, 29, 3, 250, 156, 29, 3, 250, 128, 29, 3,
- 250, 131, 29, 3, 250, 86, 29, 3, 250, 58, 29, 3, 225, 147, 29, 3, 225,
- 114, 29, 3, 225, 133, 29, 3, 225, 146, 29, 3, 225, 135, 29, 3, 225, 136,
- 29, 3, 225, 121, 29, 3, 225, 110, 29, 3, 215, 183, 29, 3, 215, 163, 29,
- 3, 215, 167, 29, 3, 215, 182, 29, 3, 215, 177, 29, 3, 215, 178, 29, 3,
- 215, 166, 29, 3, 215, 161, 29, 3, 215, 39, 29, 3, 215, 31, 29, 3, 215,
- 35, 29, 3, 215, 38, 29, 3, 215, 36, 29, 3, 215, 37, 29, 3, 215, 33, 29,
- 3, 215, 32, 29, 3, 244, 196, 29, 3, 243, 234, 29, 3, 244, 121, 29, 3,
- 244, 195, 29, 3, 244, 147, 29, 3, 244, 154, 29, 3, 244, 43, 29, 3, 243,
- 213, 29, 3, 190, 29, 3, 224, 150, 29, 3, 225, 108, 29, 3, 226, 89, 29, 3,
- 225, 211, 29, 3, 225, 221, 29, 3, 225, 16, 29, 3, 224, 114, 29, 3, 222,
- 99, 29, 3, 230, 31, 29, 3, 243, 207, 29, 38, 243, 53, 22, 25, 233, 23,
- 78, 29, 38, 25, 233, 23, 78, 29, 38, 243, 53, 78, 29, 221, 173, 78, 29,
- 211, 208, 29, 243, 229, 218, 129, 29, 249, 219, 29, 220, 150, 29, 249,
- 226, 29, 224, 199, 249, 226, 29, 224, 13, 78, 29, 226, 15, 220, 137, 29,
- 21, 110, 29, 21, 105, 29, 21, 158, 29, 21, 161, 29, 21, 189, 29, 21, 194,
- 29, 21, 198, 29, 21, 195, 29, 21, 200, 29, 54, 216, 247, 29, 54, 215, 73,
- 29, 54, 216, 162, 29, 54, 244, 15, 29, 54, 244, 114, 29, 54, 219, 111,
- 29, 54, 220, 116, 29, 54, 245, 184, 29, 54, 228, 195, 29, 54, 240, 210,
- 29, 54, 216, 248, 216, 147, 29, 3, 221, 177, 230, 42, 29, 3, 230, 38, 29,
- 3, 230, 39, 29, 3, 230, 40, 29, 3, 221, 177, 251, 83, 29, 3, 251, 80, 29,
- 3, 251, 81, 29, 3, 251, 82, 29, 3, 221, 177, 243, 213, 29, 3, 243, 209,
- 29, 3, 243, 210, 29, 3, 243, 211, 29, 3, 221, 177, 224, 114, 29, 3, 224,
- 110, 29, 3, 224, 111, 29, 3, 224, 112, 29, 216, 31, 164, 210, 247, 29,
- 216, 31, 164, 248, 41, 29, 216, 31, 164, 222, 238, 29, 216, 31, 164, 219,
- 251, 222, 238, 29, 216, 31, 164, 247, 235, 29, 216, 31, 164, 234, 164,
- 29, 216, 31, 164, 250, 94, 29, 216, 31, 164, 241, 177, 29, 216, 31, 164,
- 248, 40, 29, 216, 31, 164, 233, 194, 169, 1, 61, 169, 1, 75, 169, 1, 73,
- 169, 1, 76, 169, 1, 70, 169, 1, 214, 105, 169, 1, 243, 135, 169, 1, 176,
- 169, 1, 243, 62, 169, 1, 242, 214, 169, 1, 242, 174, 169, 1, 242, 113,
- 169, 1, 242, 79, 169, 1, 162, 169, 1, 241, 238, 169, 1, 241, 180, 169, 1,
- 241, 68, 169, 1, 240, 222, 169, 1, 240, 201, 169, 1, 233, 135, 169, 1,
- 233, 58, 169, 1, 232, 241, 169, 1, 232, 156, 169, 1, 232, 98, 169, 1,
- 232, 71, 169, 1, 184, 169, 1, 231, 91, 169, 1, 230, 230, 169, 1, 230,
- 161, 169, 1, 230, 102, 169, 1, 197, 169, 1, 241, 90, 169, 1, 229, 213,
- 169, 1, 229, 107, 169, 1, 228, 233, 169, 1, 228, 74, 169, 1, 227, 237,
- 169, 1, 227, 176, 169, 1, 224, 29, 169, 1, 224, 16, 169, 1, 224, 9, 169,
- 1, 224, 1, 169, 1, 223, 246, 169, 1, 223, 244, 169, 1, 206, 169, 1, 222,
- 91, 169, 1, 221, 181, 169, 1, 219, 191, 169, 1, 219, 58, 169, 1, 218, 83,
- 169, 1, 218, 2, 169, 1, 248, 221, 169, 1, 217, 105, 169, 1, 248, 90, 169,
- 1, 217, 22, 169, 1, 248, 3, 169, 1, 216, 117, 169, 1, 247, 145, 169, 1,
- 246, 78, 169, 1, 246, 50, 169, 1, 247, 156, 169, 1, 216, 59, 169, 1, 216,
- 58, 169, 1, 216, 47, 169, 1, 216, 46, 169, 1, 216, 45, 169, 1, 216, 44,
- 169, 1, 215, 183, 169, 1, 215, 178, 169, 1, 215, 167, 169, 1, 215, 166,
- 169, 1, 215, 163, 169, 1, 215, 162, 169, 1, 212, 65, 169, 1, 212, 22,
- 169, 1, 211, 250, 169, 1, 211, 227, 169, 1, 211, 195, 169, 1, 211, 183,
- 169, 1, 191, 169, 1, 211, 47, 169, 1, 211, 8, 169, 1, 210, 244, 169, 1,
- 210, 212, 169, 1, 210, 177, 18, 19, 240, 168, 18, 19, 75, 18, 19, 255,
- 37, 18, 19, 73, 18, 19, 236, 33, 18, 19, 76, 18, 19, 226, 183, 18, 19,
- 211, 116, 226, 183, 18, 19, 72, 245, 209, 18, 19, 72, 73, 18, 19, 61, 18,
- 19, 255, 73, 18, 19, 212, 22, 18, 19, 159, 212, 22, 18, 19, 211, 250, 18,
- 19, 159, 211, 250, 18, 19, 211, 242, 18, 19, 159, 211, 242, 18, 19, 211,
- 227, 18, 19, 159, 211, 227, 18, 19, 211, 215, 18, 19, 159, 211, 215, 18,
- 19, 229, 190, 211, 215, 18, 19, 212, 65, 18, 19, 159, 212, 65, 18, 19,
- 212, 64, 18, 19, 159, 212, 64, 18, 19, 229, 190, 212, 64, 18, 19, 254,
- 201, 18, 19, 211, 116, 212, 98, 18, 19, 242, 180, 218, 129, 18, 19, 40,
- 142, 18, 19, 40, 242, 136, 18, 19, 40, 251, 175, 163, 222, 233, 18, 19,
- 40, 216, 14, 163, 222, 233, 18, 19, 40, 44, 163, 222, 233, 18, 19, 40,
- 222, 233, 18, 19, 40, 52, 142, 18, 19, 40, 52, 219, 251, 67, 218, 90, 18,
- 19, 40, 230, 224, 247, 120, 18, 19, 40, 219, 251, 203, 91, 18, 19, 40,
- 225, 22, 18, 19, 40, 124, 217, 87, 18, 19, 245, 150, 18, 19, 235, 255,
- 18, 19, 226, 196, 18, 19, 254, 123, 18, 19, 225, 221, 18, 19, 226, 87,
- 18, 19, 225, 108, 18, 19, 225, 71, 18, 19, 225, 16, 18, 19, 224, 249, 18,
- 19, 211, 116, 224, 249, 18, 19, 72, 241, 220, 18, 19, 72, 241, 180, 18,
- 19, 190, 18, 19, 226, 89, 18, 19, 224, 112, 18, 19, 159, 224, 112, 18,
- 19, 224, 110, 18, 19, 159, 224, 110, 18, 19, 224, 109, 18, 19, 159, 224,
- 109, 18, 19, 224, 107, 18, 19, 159, 224, 107, 18, 19, 224, 106, 18, 19,
- 159, 224, 106, 18, 19, 224, 114, 18, 19, 159, 224, 114, 18, 19, 224, 113,
- 18, 19, 159, 224, 113, 18, 19, 211, 116, 224, 113, 18, 19, 226, 105, 18,
- 19, 159, 226, 105, 18, 19, 72, 242, 60, 18, 19, 217, 22, 18, 19, 217, 99,
- 18, 19, 216, 117, 18, 19, 216, 103, 18, 19, 111, 18, 19, 216, 17, 18, 19,
- 211, 116, 216, 17, 18, 19, 72, 248, 77, 18, 19, 72, 248, 3, 18, 19, 217,
- 105, 18, 19, 217, 101, 18, 19, 215, 78, 18, 19, 159, 215, 78, 18, 19,
- 215, 62, 18, 19, 159, 215, 62, 18, 19, 215, 61, 18, 19, 159, 215, 61, 18,
- 19, 105, 18, 19, 159, 105, 18, 19, 215, 54, 18, 19, 159, 215, 54, 18, 19,
- 215, 80, 18, 19, 159, 215, 80, 18, 19, 215, 79, 18, 19, 159, 215, 79, 18,
- 19, 229, 190, 215, 79, 18, 19, 217, 152, 18, 19, 215, 151, 18, 19, 215,
- 135, 18, 19, 215, 133, 18, 19, 215, 156, 18, 19, 234, 182, 18, 19, 235,
- 7, 18, 19, 234, 92, 18, 19, 234, 83, 18, 19, 234, 28, 18, 19, 234, 10,
- 18, 19, 211, 116, 234, 10, 18, 19, 176, 18, 19, 235, 10, 18, 19, 233,
- 178, 18, 19, 159, 233, 178, 18, 19, 233, 176, 18, 19, 159, 233, 176, 18,
- 19, 233, 175, 18, 19, 159, 233, 175, 18, 19, 233, 174, 18, 19, 159, 233,
- 174, 18, 19, 233, 173, 18, 19, 159, 233, 173, 18, 19, 233, 182, 18, 19,
- 159, 233, 182, 18, 19, 233, 181, 18, 19, 159, 233, 181, 18, 19, 229, 190,
- 233, 181, 18, 19, 235, 23, 18, 19, 233, 183, 18, 19, 219, 27, 234, 176,
- 18, 19, 219, 27, 234, 84, 18, 19, 219, 27, 234, 23, 18, 19, 219, 27, 234,
- 248, 18, 19, 250, 190, 18, 19, 251, 31, 18, 19, 250, 51, 18, 19, 250, 41,
- 18, 19, 249, 238, 18, 19, 249, 174, 18, 19, 211, 116, 249, 174, 18, 19,
- 251, 33, 18, 19, 251, 32, 18, 19, 249, 79, 18, 19, 159, 249, 79, 18, 19,
- 249, 77, 18, 19, 159, 249, 77, 18, 19, 249, 76, 18, 19, 159, 249, 76, 18,
- 19, 249, 75, 18, 19, 159, 249, 75, 18, 19, 249, 74, 18, 19, 159, 249, 74,
- 18, 19, 249, 81, 18, 19, 159, 249, 81, 18, 19, 249, 80, 18, 19, 159, 249,
- 80, 18, 19, 229, 190, 249, 80, 18, 19, 251, 66, 18, 19, 221, 209, 216,
- 210, 18, 19, 231, 91, 18, 19, 231, 236, 18, 19, 230, 230, 18, 19, 230,
- 201, 18, 19, 230, 161, 18, 19, 230, 132, 18, 19, 211, 116, 230, 132, 18,
- 19, 184, 18, 19, 231, 237, 18, 19, 230, 40, 18, 19, 159, 230, 40, 18, 19,
- 230, 38, 18, 19, 159, 230, 38, 18, 19, 230, 37, 18, 19, 159, 230, 37, 18,
- 19, 230, 36, 18, 19, 159, 230, 36, 18, 19, 230, 35, 18, 19, 159, 230, 35,
- 18, 19, 230, 42, 18, 19, 159, 230, 42, 18, 19, 230, 41, 18, 19, 159, 230,
- 41, 18, 19, 229, 190, 230, 41, 18, 19, 193, 18, 19, 159, 193, 18, 19,
- 230, 234, 18, 19, 253, 205, 193, 18, 19, 221, 209, 193, 18, 19, 229, 107,
- 18, 19, 229, 224, 18, 19, 228, 233, 18, 19, 228, 208, 18, 19, 228, 74,
- 18, 19, 228, 64, 18, 19, 211, 116, 228, 64, 18, 19, 197, 18, 19, 229,
- 225, 18, 19, 227, 172, 18, 19, 159, 227, 172, 18, 19, 227, 174, 18, 19,
- 159, 227, 174, 18, 19, 227, 173, 18, 19, 159, 227, 173, 18, 19, 229, 190,
- 227, 173, 18, 19, 230, 25, 18, 19, 72, 229, 79, 18, 19, 228, 238, 18, 19,
- 233, 58, 18, 19, 233, 133, 18, 19, 232, 241, 18, 19, 232, 227, 18, 19,
- 232, 156, 18, 19, 232, 127, 18, 19, 211, 116, 232, 127, 18, 19, 233, 135,
- 18, 19, 233, 134, 18, 19, 232, 68, 18, 19, 159, 232, 68, 18, 19, 232, 67,
- 18, 19, 159, 232, 67, 18, 19, 232, 66, 18, 19, 159, 232, 66, 18, 19, 232,
- 65, 18, 19, 159, 232, 65, 18, 19, 232, 64, 18, 19, 159, 232, 64, 18, 19,
- 232, 70, 18, 19, 159, 232, 70, 18, 19, 232, 69, 18, 19, 159, 232, 69, 18,
- 19, 156, 18, 19, 159, 156, 18, 19, 147, 156, 18, 19, 221, 181, 18, 19,
- 222, 29, 18, 19, 219, 191, 18, 19, 219, 175, 18, 19, 219, 58, 18, 19,
- 219, 40, 18, 19, 211, 116, 219, 40, 18, 19, 206, 18, 19, 222, 31, 18, 19,
- 217, 249, 18, 19, 159, 217, 249, 18, 19, 217, 243, 18, 19, 159, 217, 243,
- 18, 19, 217, 242, 18, 19, 159, 217, 242, 18, 19, 217, 238, 18, 19, 159,
- 217, 238, 18, 19, 217, 237, 18, 19, 159, 217, 237, 18, 19, 217, 253, 18,
- 19, 159, 217, 253, 18, 19, 217, 252, 18, 19, 159, 217, 252, 18, 19, 229,
- 190, 217, 252, 18, 19, 222, 91, 18, 19, 253, 205, 222, 91, 18, 19, 217,
- 254, 18, 19, 251, 218, 222, 91, 18, 19, 230, 127, 219, 108, 18, 19, 229,
- 190, 219, 99, 18, 19, 229, 190, 222, 89, 18, 19, 229, 190, 218, 235, 18,
- 19, 229, 190, 218, 86, 18, 19, 229, 190, 219, 98, 18, 19, 229, 190, 221,
- 184, 18, 19, 220, 63, 18, 19, 220, 32, 18, 19, 220, 27, 18, 19, 220, 7,
- 18, 19, 220, 1, 18, 19, 220, 102, 18, 19, 220, 98, 18, 19, 219, 206, 18,
- 19, 159, 219, 206, 18, 19, 219, 205, 18, 19, 159, 219, 205, 18, 19, 219,
- 204, 18, 19, 159, 219, 204, 18, 19, 219, 203, 18, 19, 159, 219, 203, 18,
- 19, 219, 202, 18, 19, 159, 219, 202, 18, 19, 219, 208, 18, 19, 159, 219,
- 208, 18, 19, 219, 207, 18, 19, 159, 219, 207, 18, 19, 220, 104, 18, 19,
- 211, 47, 18, 19, 211, 101, 18, 19, 211, 8, 18, 19, 210, 255, 18, 19, 210,
- 244, 18, 19, 210, 229, 18, 19, 211, 116, 210, 229, 18, 19, 191, 18, 19,
- 211, 103, 18, 19, 210, 174, 18, 19, 159, 210, 174, 18, 19, 210, 173, 18,
- 19, 159, 210, 173, 18, 19, 210, 172, 18, 19, 159, 210, 172, 18, 19, 210,
- 171, 18, 19, 159, 210, 171, 18, 19, 210, 170, 18, 19, 159, 210, 170, 18,
- 19, 210, 176, 18, 19, 159, 210, 176, 18, 19, 210, 175, 18, 19, 159, 210,
- 175, 18, 19, 229, 190, 210, 175, 18, 19, 211, 117, 18, 19, 252, 4, 211,
- 117, 18, 19, 159, 211, 117, 18, 19, 221, 209, 211, 8, 18, 19, 223, 128,
- 18, 19, 223, 223, 223, 128, 18, 19, 159, 233, 58, 18, 19, 223, 183, 18,
- 19, 223, 35, 18, 19, 222, 239, 18, 19, 222, 211, 18, 19, 222, 197, 18,
- 19, 159, 232, 156, 18, 19, 205, 18, 19, 223, 184, 18, 19, 159, 233, 135,
- 18, 19, 222, 108, 18, 19, 159, 222, 108, 18, 19, 153, 18, 19, 159, 153,
- 18, 19, 147, 153, 18, 19, 244, 154, 18, 19, 244, 193, 18, 19, 244, 121,
- 18, 19, 244, 108, 18, 19, 244, 43, 18, 19, 244, 34, 18, 19, 244, 196, 18,
- 19, 244, 195, 18, 19, 243, 212, 18, 19, 159, 243, 212, 18, 19, 245, 6,
- 18, 19, 216, 195, 18, 19, 230, 23, 216, 195, 18, 19, 216, 175, 18, 19,
- 230, 23, 216, 175, 18, 19, 216, 171, 18, 19, 230, 23, 216, 171, 18, 19,
- 216, 156, 18, 19, 216, 153, 18, 19, 216, 208, 18, 19, 216, 207, 18, 19,
- 216, 127, 18, 19, 159, 216, 127, 18, 19, 216, 210, 18, 19, 215, 142, 18,
- 19, 215, 140, 18, 19, 215, 139, 18, 19, 215, 144, 18, 19, 215, 145, 18,
- 19, 215, 52, 18, 19, 215, 51, 18, 19, 215, 50, 18, 19, 215, 53, 18, 19,
- 227, 193, 241, 238, 18, 19, 227, 193, 241, 180, 18, 19, 227, 193, 241,
- 161, 18, 19, 227, 193, 241, 68, 18, 19, 227, 193, 241, 53, 18, 19, 227,
- 193, 162, 18, 19, 227, 193, 242, 46, 18, 19, 227, 193, 242, 60, 18, 19,
- 227, 192, 242, 60, 18, 19, 241, 154, 18, 19, 224, 84, 18, 19, 224, 53,
- 18, 19, 224, 48, 18, 19, 224, 42, 18, 19, 224, 37, 18, 19, 224, 88, 18,
- 19, 224, 87, 18, 19, 224, 96, 18, 19, 216, 55, 18, 19, 216, 53, 18, 19,
- 216, 52, 18, 19, 216, 56, 18, 19, 159, 223, 128, 18, 19, 159, 223, 35,
- 18, 19, 159, 222, 211, 18, 19, 159, 205, 18, 19, 229, 75, 18, 19, 229,
- 27, 18, 19, 229, 23, 18, 19, 229, 4, 18, 19, 228, 255, 18, 19, 229, 77,
- 18, 19, 229, 76, 18, 19, 229, 79, 18, 19, 228, 103, 18, 19, 221, 209,
- 220, 63, 18, 19, 221, 209, 220, 32, 18, 19, 221, 209, 220, 7, 18, 19,
- 221, 209, 220, 102, 18, 19, 211, 213, 216, 195, 18, 19, 211, 213, 216,
- 175, 18, 19, 211, 213, 216, 156, 18, 19, 211, 213, 216, 208, 18, 19, 211,
- 213, 216, 210, 18, 19, 232, 248, 18, 19, 232, 247, 18, 19, 232, 246, 18,
- 19, 232, 245, 18, 19, 232, 254, 18, 19, 232, 253, 18, 19, 232, 255, 18,
- 19, 216, 209, 216, 195, 18, 19, 216, 209, 216, 175, 18, 19, 216, 209,
- 216, 171, 18, 19, 216, 209, 216, 156, 18, 19, 216, 209, 216, 153, 18, 19,
- 216, 209, 216, 208, 18, 19, 216, 209, 216, 207, 18, 19, 216, 209, 216,
- 210, 18, 19, 254, 189, 253, 158, 18, 19, 251, 218, 75, 18, 19, 251, 218,
- 73, 18, 19, 251, 218, 76, 18, 19, 251, 218, 61, 18, 19, 251, 218, 212,
- 22, 18, 19, 251, 218, 211, 250, 18, 19, 251, 218, 211, 227, 18, 19, 251,
- 218, 212, 65, 18, 19, 251, 218, 229, 107, 18, 19, 251, 218, 228, 233, 18,
- 19, 251, 218, 228, 74, 18, 19, 251, 218, 197, 18, 19, 251, 218, 234, 182,
- 18, 19, 251, 218, 234, 92, 18, 19, 251, 218, 234, 28, 18, 19, 251, 218,
- 176, 18, 19, 221, 209, 241, 238, 18, 19, 221, 209, 241, 180, 18, 19, 221,
- 209, 241, 68, 18, 19, 221, 209, 162, 18, 19, 72, 242, 220, 18, 19, 72,
- 242, 224, 18, 19, 72, 242, 236, 18, 19, 72, 242, 235, 18, 19, 72, 242,
- 225, 18, 19, 72, 242, 249, 18, 19, 72, 222, 140, 18, 19, 72, 222, 211,
- 18, 19, 72, 223, 128, 18, 19, 72, 223, 108, 18, 19, 72, 223, 35, 18, 19,
- 72, 205, 18, 19, 72, 211, 195, 18, 19, 72, 211, 227, 18, 19, 72, 212, 22,
- 18, 19, 72, 212, 17, 18, 19, 72, 211, 250, 18, 19, 72, 212, 65, 18, 19,
- 72, 240, 194, 18, 19, 72, 240, 195, 18, 19, 72, 240, 198, 18, 19, 72,
- 240, 197, 18, 19, 72, 240, 196, 18, 19, 72, 240, 200, 18, 19, 72, 216,
- 136, 18, 19, 72, 216, 156, 18, 19, 72, 216, 195, 18, 19, 72, 216, 194,
- 18, 19, 72, 216, 175, 18, 19, 72, 216, 208, 18, 19, 72, 215, 123, 18, 19,
- 72, 215, 133, 18, 19, 72, 215, 151, 18, 19, 72, 215, 150, 18, 19, 72,
- 215, 135, 18, 19, 72, 215, 156, 18, 19, 72, 224, 150, 18, 19, 72, 225,
- 16, 18, 19, 72, 225, 221, 18, 19, 72, 225, 211, 18, 19, 72, 225, 108, 18,
- 19, 72, 190, 18, 19, 72, 226, 105, 18, 19, 72, 242, 113, 18, 19, 72, 242,
- 174, 18, 19, 72, 243, 62, 18, 19, 72, 243, 55, 18, 19, 72, 242, 214, 18,
- 19, 72, 243, 135, 18, 19, 72, 234, 100, 18, 19, 72, 234, 105, 18, 19, 72,
- 234, 119, 18, 19, 72, 234, 118, 18, 19, 72, 234, 112, 18, 19, 72, 234,
- 132, 18, 19, 72, 234, 41, 18, 19, 72, 234, 42, 18, 19, 72, 234, 45, 18,
- 19, 72, 234, 44, 18, 19, 72, 234, 43, 18, 19, 72, 234, 46, 18, 19, 72,
- 234, 47, 18, 19, 72, 227, 237, 18, 19, 72, 228, 74, 18, 19, 72, 229, 107,
- 18, 19, 72, 229, 103, 18, 19, 72, 228, 233, 18, 19, 72, 197, 18, 19, 72,
- 230, 102, 18, 19, 72, 230, 161, 18, 19, 72, 231, 91, 18, 19, 72, 231, 80,
- 18, 19, 72, 230, 230, 18, 19, 72, 184, 18, 19, 72, 210, 212, 18, 19, 72,
- 210, 244, 18, 19, 72, 211, 47, 18, 19, 72, 211, 44, 18, 19, 72, 211, 8,
- 18, 19, 72, 191, 18, 19, 72, 235, 51, 18, 19, 221, 209, 235, 51, 18, 19,
- 72, 235, 68, 18, 19, 72, 235, 126, 18, 19, 72, 235, 124, 18, 19, 72, 235,
- 108, 18, 19, 221, 209, 235, 108, 18, 19, 72, 235, 141, 18, 19, 72, 235,
- 81, 18, 19, 72, 235, 85, 18, 19, 72, 235, 95, 18, 19, 72, 235, 94, 18,
- 19, 72, 235, 93, 18, 19, 72, 235, 96, 18, 19, 72, 232, 98, 18, 19, 72,
- 232, 156, 18, 19, 72, 233, 58, 18, 19, 72, 233, 50, 18, 19, 72, 232, 241,
- 18, 19, 72, 233, 135, 18, 19, 72, 247, 149, 18, 19, 72, 247, 150, 18, 19,
- 72, 247, 155, 18, 19, 72, 247, 154, 18, 19, 72, 247, 151, 18, 19, 72,
- 247, 156, 18, 19, 72, 232, 244, 18, 19, 72, 232, 246, 18, 19, 72, 232,
- 250, 18, 19, 72, 232, 249, 18, 19, 72, 232, 248, 18, 19, 72, 232, 254,
- 18, 19, 72, 216, 50, 18, 19, 72, 216, 52, 18, 19, 72, 216, 55, 18, 19,
- 72, 216, 54, 18, 19, 72, 216, 53, 18, 19, 72, 216, 56, 18, 19, 72, 216,
- 45, 18, 19, 72, 216, 46, 18, 19, 72, 216, 58, 18, 19, 72, 216, 57, 18,
- 19, 72, 216, 47, 18, 19, 72, 216, 59, 18, 19, 72, 210, 13, 18, 19, 72,
- 210, 23, 18, 19, 72, 210, 94, 18, 19, 72, 210, 92, 18, 19, 72, 210, 44,
- 18, 19, 72, 210, 116, 18, 19, 72, 210, 159, 18, 19, 72, 65, 210, 159, 18,
- 19, 72, 246, 28, 18, 19, 72, 246, 29, 18, 19, 72, 246, 36, 18, 19, 72,
- 246, 35, 18, 19, 72, 246, 31, 18, 19, 72, 246, 38, 18, 19, 72, 218, 83,
- 18, 19, 72, 219, 58, 18, 19, 72, 221, 181, 18, 19, 72, 221, 170, 18, 19,
- 72, 219, 191, 18, 19, 72, 206, 18, 19, 72, 219, 225, 18, 19, 72, 220, 7,
- 18, 19, 72, 220, 63, 18, 19, 72, 220, 61, 18, 19, 72, 220, 32, 18, 19,
- 72, 220, 102, 18, 19, 72, 220, 104, 18, 19, 72, 215, 163, 18, 19, 72,
- 215, 166, 18, 19, 72, 215, 178, 18, 19, 72, 215, 177, 18, 19, 72, 215,
- 167, 18, 19, 72, 215, 183, 18, 19, 72, 250, 69, 18, 19, 72, 250, 86, 18,
- 19, 72, 250, 131, 18, 19, 72, 250, 128, 18, 19, 72, 250, 110, 18, 19, 72,
- 250, 157, 18, 19, 72, 215, 126, 18, 19, 72, 215, 127, 18, 19, 72, 215,
- 130, 18, 19, 72, 215, 129, 18, 19, 72, 215, 128, 18, 19, 72, 215, 131,
- 18, 19, 250, 111, 50, 18, 19, 243, 229, 218, 129, 18, 19, 224, 80, 18,
- 19, 229, 73, 18, 19, 228, 100, 18, 19, 228, 99, 18, 19, 228, 98, 18, 19,
- 228, 97, 18, 19, 228, 102, 18, 19, 228, 101, 18, 19, 211, 213, 216, 125,
- 18, 19, 211, 213, 216, 124, 18, 19, 211, 213, 216, 123, 18, 19, 211, 213,
- 216, 122, 18, 19, 211, 213, 216, 121, 18, 19, 211, 213, 216, 128, 18, 19,
- 211, 213, 216, 127, 18, 19, 211, 213, 40, 216, 210, 18, 19, 251, 218,
- 212, 98, 226, 226, 219, 19, 78, 226, 226, 1, 252, 48, 226, 226, 1, 232,
- 87, 226, 226, 1, 244, 151, 226, 226, 1, 222, 15, 226, 226, 1, 228, 193,
- 226, 226, 1, 214, 226, 226, 226, 1, 248, 197, 226, 226, 1, 216, 80, 226,
- 226, 1, 249, 229, 226, 226, 1, 250, 180, 226, 226, 1, 230, 91, 226, 226,
- 1, 242, 156, 226, 226, 1, 229, 63, 226, 226, 1, 218, 122, 226, 226, 1,
- 222, 135, 226, 226, 1, 254, 198, 226, 226, 1, 226, 187, 226, 226, 1, 214,
- 150, 226, 226, 1, 245, 231, 226, 226, 1, 235, 188, 226, 226, 1, 245, 232,
- 226, 226, 1, 226, 158, 226, 226, 1, 214, 206, 226, 226, 1, 236, 39, 226,
- 226, 1, 245, 229, 226, 226, 1, 225, 202, 226, 226, 244, 150, 78, 226,
- 226, 223, 49, 244, 150, 78, 178, 1, 244, 141, 244, 133, 244, 155, 245, 6,
- 178, 1, 214, 105, 178, 1, 214, 135, 214, 151, 70, 178, 1, 210, 214, 178,
- 1, 211, 117, 178, 1, 212, 98, 178, 1, 216, 130, 216, 129, 216, 151, 178,
- 1, 245, 59, 178, 1, 254, 93, 61, 178, 1, 226, 143, 76, 178, 1, 255, 17,
- 61, 178, 1, 254, 227, 178, 1, 232, 133, 76, 178, 1, 219, 244, 76, 178, 1,
- 76, 178, 1, 226, 234, 178, 1, 226, 196, 178, 1, 223, 164, 223, 177, 223,
- 94, 153, 178, 1, 234, 193, 178, 1, 250, 177, 178, 1, 234, 194, 235, 23,
- 178, 1, 243, 202, 178, 1, 245, 138, 178, 1, 243, 58, 242, 66, 243, 202,
- 178, 1, 243, 96, 178, 1, 211, 188, 211, 182, 212, 98, 178, 1, 242, 38,
- 242, 60, 178, 1, 242, 42, 242, 60, 178, 1, 232, 135, 242, 60, 178, 1,
- 219, 247, 242, 60, 178, 1, 229, 185, 227, 157, 229, 186, 230, 25, 178, 1,
- 219, 245, 230, 25, 178, 1, 246, 115, 178, 1, 235, 168, 235, 172, 235,
- 162, 73, 178, 1, 75, 178, 1, 235, 117, 235, 144, 178, 1, 243, 43, 178, 1,
- 232, 136, 254, 243, 178, 1, 219, 249, 61, 178, 1, 235, 154, 245, 113,
- 178, 1, 225, 164, 225, 186, 226, 105, 178, 1, 254, 163, 245, 111, 178, 1,
- 219, 24, 222, 91, 178, 1, 219, 179, 232, 132, 222, 91, 178, 1, 219, 243,
- 222, 91, 178, 1, 251, 66, 178, 1, 210, 159, 178, 1, 216, 63, 216, 73,
- 215, 41, 217, 152, 178, 1, 219, 242, 217, 152, 178, 1, 249, 60, 178, 1,
- 252, 31, 252, 34, 251, 224, 253, 158, 178, 1, 219, 248, 253, 158, 178, 1,
- 246, 114, 178, 1, 226, 171, 178, 1, 245, 196, 245, 198, 75, 178, 1, 231,
- 178, 231, 186, 193, 178, 1, 232, 134, 193, 178, 1, 219, 246, 193, 178, 1,
- 233, 73, 233, 114, 232, 143, 156, 178, 1, 246, 116, 178, 1, 235, 230,
- 178, 1, 235, 231, 178, 1, 248, 210, 248, 215, 249, 60, 178, 1, 226, 138,
- 245, 58, 76, 178, 1, 245, 227, 178, 1, 235, 187, 178, 1, 249, 78, 178, 1,
- 251, 17, 178, 1, 250, 189, 178, 1, 218, 161, 178, 1, 232, 131, 178, 1,
- 219, 241, 178, 1, 240, 110, 178, 1, 224, 96, 178, 1, 211, 178, 178, 219,
- 155, 224, 140, 178, 230, 85, 224, 140, 178, 249, 131, 224, 140, 178, 254,
- 6, 87, 178, 215, 82, 87, 178, 252, 46, 87, 217, 83, 1, 61, 217, 83, 1,
- 73, 217, 83, 1, 70, 217, 83, 1, 176, 217, 83, 1, 243, 135, 217, 83, 1,
- 229, 77, 217, 83, 1, 217, 105, 217, 83, 1, 248, 221, 217, 83, 1, 197,
- 217, 83, 1, 190, 217, 83, 1, 252, 191, 217, 83, 1, 184, 217, 83, 1, 191,
- 217, 83, 1, 233, 135, 217, 83, 1, 212, 65, 217, 83, 1, 206, 217, 83, 1,
- 162, 217, 83, 25, 5, 73, 217, 83, 25, 5, 70, 217, 83, 5, 213, 152, 242,
- 7, 1, 61, 242, 7, 1, 73, 242, 7, 1, 70, 242, 7, 1, 176, 242, 7, 1, 243,
- 135, 242, 7, 1, 229, 77, 242, 7, 1, 217, 105, 242, 7, 1, 248, 221, 242,
- 7, 1, 197, 242, 7, 1, 190, 242, 7, 1, 252, 191, 242, 7, 1, 184, 242, 7,
- 1, 191, 242, 7, 1, 205, 242, 7, 1, 233, 135, 242, 7, 1, 212, 65, 242, 7,
- 1, 206, 242, 7, 1, 162, 242, 7, 25, 5, 73, 242, 7, 25, 5, 70, 242, 7, 5,
- 226, 49, 225, 126, 219, 155, 224, 140, 225, 126, 52, 224, 140, 251, 120,
- 1, 61, 251, 120, 1, 73, 251, 120, 1, 70, 251, 120, 1, 176, 251, 120, 1,
- 243, 135, 251, 120, 1, 229, 77, 251, 120, 1, 217, 105, 251, 120, 1, 248,
- 221, 251, 120, 1, 197, 251, 120, 1, 190, 251, 120, 1, 252, 191, 251, 120,
- 1, 184, 251, 120, 1, 191, 251, 120, 1, 205, 251, 120, 1, 233, 135, 251,
- 120, 1, 212, 65, 251, 120, 1, 206, 251, 120, 1, 162, 251, 120, 25, 5, 73,
- 251, 120, 25, 5, 70, 217, 82, 1, 61, 217, 82, 1, 73, 217, 82, 1, 70, 217,
- 82, 1, 176, 217, 82, 1, 243, 135, 217, 82, 1, 229, 77, 217, 82, 1, 217,
- 105, 217, 82, 1, 248, 221, 217, 82, 1, 197, 217, 82, 1, 190, 217, 82, 1,
- 252, 191, 217, 82, 1, 184, 217, 82, 1, 191, 217, 82, 1, 233, 135, 217,
- 82, 1, 212, 65, 217, 82, 1, 206, 217, 82, 25, 5, 73, 217, 82, 25, 5, 70,
- 69, 1, 176, 69, 1, 234, 132, 69, 1, 234, 28, 69, 1, 234, 105, 69, 1, 229,
- 4, 69, 1, 251, 33, 69, 1, 250, 157, 69, 1, 249, 238, 69, 1, 250, 86, 69,
- 1, 227, 134, 69, 1, 248, 221, 69, 1, 215, 144, 69, 1, 247, 145, 69, 1,
- 215, 139, 69, 1, 228, 80, 69, 1, 217, 105, 69, 1, 216, 208, 69, 1, 111,
- 69, 1, 216, 156, 69, 1, 228, 74, 69, 1, 252, 191, 69, 1, 225, 147, 69, 1,
- 225, 16, 69, 1, 225, 121, 69, 1, 230, 161, 69, 1, 210, 244, 69, 1, 222,
- 211, 69, 1, 232, 156, 69, 1, 213, 138, 69, 1, 220, 102, 69, 1, 218, 184,
- 69, 1, 206, 69, 1, 162, 69, 1, 233, 135, 69, 1, 224, 88, 69, 235, 243,
- 25, 224, 74, 69, 235, 243, 25, 224, 87, 69, 235, 243, 25, 224, 53, 69,
- 235, 243, 25, 224, 48, 69, 235, 243, 25, 224, 30, 69, 235, 243, 25, 224,
- 2, 69, 235, 243, 25, 223, 246, 69, 235, 243, 25, 223, 245, 69, 235, 243,
- 25, 222, 100, 69, 235, 243, 25, 222, 93, 69, 235, 243, 25, 232, 62, 69,
- 235, 243, 25, 232, 52, 69, 235, 243, 25, 224, 69, 69, 235, 243, 25, 224,
- 80, 69, 235, 243, 25, 224, 38, 215, 49, 110, 69, 235, 243, 25, 224, 38,
- 215, 49, 105, 69, 235, 243, 25, 224, 70, 69, 25, 235, 229, 254, 45, 69,
- 25, 235, 229, 255, 73, 69, 25, 5, 255, 73, 69, 25, 5, 73, 69, 25, 5, 236,
- 33, 69, 25, 5, 211, 117, 69, 25, 5, 210, 169, 69, 25, 5, 70, 69, 25, 5,
- 214, 118, 69, 25, 5, 214, 229, 69, 25, 5, 226, 234, 69, 25, 5, 191, 69,
- 25, 5, 236, 60, 69, 25, 5, 75, 69, 25, 5, 254, 243, 69, 25, 5, 254, 201,
- 69, 25, 5, 226, 183, 69, 25, 5, 253, 192, 69, 5, 228, 206, 69, 5, 223,
- 126, 69, 5, 210, 180, 69, 5, 230, 52, 69, 5, 215, 213, 69, 5, 252, 143,
- 69, 5, 222, 206, 69, 5, 216, 40, 69, 5, 234, 241, 69, 5, 254, 203, 69, 5,
- 221, 244, 221, 238, 69, 5, 213, 149, 69, 5, 249, 232, 69, 5, 252, 117,
- 69, 5, 234, 125, 69, 5, 252, 137, 69, 5, 251, 9, 225, 72, 233, 187, 69,
- 5, 233, 30, 216, 17, 69, 5, 252, 20, 69, 5, 225, 123, 230, 99, 69, 5,
- 234, 9, 69, 249, 98, 16, 223, 28, 69, 5, 253, 174, 69, 5, 253, 195, 69,
- 21, 210, 86, 69, 21, 110, 69, 21, 105, 69, 21, 158, 69, 21, 161, 69, 21,
- 189, 69, 21, 194, 69, 21, 198, 69, 21, 195, 69, 21, 200, 69, 16, 233, 30,
- 253, 197, 219, 43, 69, 16, 233, 30, 253, 197, 230, 71, 69, 16, 233, 30,
- 253, 197, 225, 71, 69, 16, 233, 30, 253, 197, 252, 49, 69, 16, 233, 30,
- 253, 197, 251, 103, 69, 16, 233, 30, 253, 197, 224, 215, 69, 16, 233, 30,
- 253, 197, 224, 209, 69, 16, 233, 30, 253, 197, 224, 207, 69, 16, 233, 30,
- 253, 197, 224, 213, 69, 16, 233, 30, 253, 197, 224, 211, 83, 251, 236,
- 83, 245, 163, 83, 249, 219, 83, 243, 229, 218, 129, 83, 249, 226, 83,
- 244, 11, 247, 118, 83, 216, 39, 219, 52, 240, 168, 83, 219, 190, 3, 251,
- 172, 231, 154, 83, 231, 183, 249, 219, 83, 231, 183, 243, 229, 218, 129,
- 83, 228, 191, 83, 243, 253, 45, 221, 157, 110, 83, 243, 253, 45, 221,
- 157, 105, 83, 243, 253, 45, 221, 157, 158, 83, 25, 220, 137, 83, 21, 210,
- 86, 83, 21, 110, 83, 21, 105, 83, 21, 158, 83, 21, 161, 83, 21, 189, 83,
- 21, 194, 83, 21, 198, 83, 21, 195, 83, 21, 200, 83, 1, 61, 83, 1, 75, 83,
- 1, 73, 83, 1, 76, 83, 1, 70, 83, 1, 226, 234, 83, 1, 214, 214, 83, 1,
- 245, 209, 83, 1, 197, 83, 1, 254, 115, 83, 1, 252, 191, 83, 1, 190, 83,
- 1, 224, 88, 83, 1, 243, 135, 83, 1, 184, 83, 1, 233, 135, 83, 1, 206, 83,
- 1, 220, 102, 83, 1, 217, 105, 83, 1, 248, 221, 83, 1, 250, 157, 83, 1,
- 235, 141, 83, 1, 191, 83, 1, 205, 83, 1, 212, 65, 83, 1, 244, 196, 83, 1,
- 176, 83, 1, 234, 132, 83, 1, 215, 183, 83, 1, 210, 116, 83, 1, 242, 46,
- 83, 1, 210, 16, 83, 1, 232, 254, 83, 1, 210, 69, 83, 1, 250, 110, 83, 1,
- 216, 39, 199, 25, 50, 83, 1, 216, 39, 75, 83, 1, 216, 39, 73, 83, 1, 216,
- 39, 76, 83, 1, 216, 39, 70, 83, 1, 216, 39, 226, 234, 83, 1, 216, 39,
- 214, 214, 83, 1, 216, 39, 254, 115, 83, 1, 216, 39, 252, 191, 83, 1, 216,
- 39, 190, 83, 1, 216, 39, 224, 88, 83, 1, 216, 39, 243, 135, 83, 1, 216,
- 39, 184, 83, 1, 216, 39, 217, 105, 83, 1, 216, 39, 248, 221, 83, 1, 216,
- 39, 250, 157, 83, 1, 216, 39, 235, 141, 83, 1, 216, 39, 215, 183, 83, 1,
- 216, 39, 191, 83, 1, 216, 39, 212, 65, 83, 1, 216, 39, 176, 83, 1, 216,
- 39, 243, 132, 83, 1, 216, 39, 242, 46, 83, 1, 216, 39, 235, 107, 83, 1,
- 216, 39, 228, 231, 83, 1, 216, 39, 246, 38, 83, 1, 219, 190, 75, 83, 1,
- 219, 190, 73, 83, 1, 219, 190, 235, 152, 83, 1, 219, 190, 214, 214, 83,
- 1, 219, 190, 70, 83, 1, 219, 190, 254, 115, 83, 1, 219, 190, 176, 83, 1,
- 219, 190, 243, 135, 83, 1, 219, 190, 162, 83, 1, 219, 190, 190, 83, 1,
- 219, 190, 220, 102, 83, 1, 219, 190, 217, 105, 83, 1, 219, 190, 248, 221,
- 83, 1, 219, 190, 235, 141, 83, 1, 219, 190, 244, 196, 83, 1, 219, 190,
- 243, 132, 83, 1, 219, 190, 242, 46, 83, 1, 219, 190, 215, 183, 83, 1,
- 219, 190, 210, 116, 83, 1, 219, 190, 223, 184, 83, 1, 219, 190, 250, 157,
- 83, 1, 219, 190, 210, 82, 83, 1, 231, 183, 73, 83, 1, 231, 183, 176, 83,
- 1, 231, 183, 205, 83, 1, 231, 183, 244, 196, 83, 1, 231, 183, 210, 82,
- 83, 1, 254, 162, 243, 116, 254, 76, 110, 83, 1, 254, 162, 243, 116, 213,
- 148, 110, 83, 1, 254, 162, 243, 116, 248, 186, 83, 1, 254, 162, 243, 116,
- 214, 224, 83, 1, 254, 162, 243, 116, 235, 193, 214, 224, 83, 1, 254, 162,
- 243, 116, 252, 155, 83, 1, 254, 162, 243, 116, 134, 252, 155, 83, 1, 254,
- 162, 243, 116, 61, 83, 1, 254, 162, 243, 116, 73, 83, 1, 254, 162, 243,
- 116, 176, 83, 1, 254, 162, 243, 116, 229, 77, 83, 1, 254, 162, 243, 116,
- 251, 33, 83, 1, 254, 162, 243, 116, 215, 156, 83, 1, 254, 162, 243, 116,
- 215, 144, 83, 1, 254, 162, 243, 116, 248, 135, 83, 1, 254, 162, 243, 116,
- 228, 110, 83, 1, 254, 162, 243, 116, 217, 105, 83, 1, 254, 162, 243, 116,
- 248, 221, 83, 1, 254, 162, 243, 116, 190, 83, 1, 254, 162, 243, 116, 225,
- 147, 83, 1, 254, 162, 243, 116, 218, 223, 83, 1, 254, 162, 243, 116, 210,
- 82, 83, 1, 254, 162, 243, 116, 210, 116, 83, 1, 254, 162, 243, 116, 254,
- 209, 83, 1, 216, 39, 254, 162, 243, 116, 217, 105, 83, 1, 216, 39, 254,
- 162, 243, 116, 210, 82, 83, 1, 231, 183, 254, 162, 243, 116, 242, 249,
- 83, 1, 231, 183, 254, 162, 243, 116, 229, 77, 83, 1, 231, 183, 254, 162,
- 243, 116, 251, 33, 83, 1, 231, 183, 254, 162, 243, 116, 235, 114, 83, 1,
- 231, 183, 254, 162, 243, 116, 215, 156, 83, 1, 231, 183, 254, 162, 243,
- 116, 248, 119, 83, 1, 231, 183, 254, 162, 243, 116, 217, 105, 83, 1, 231,
- 183, 254, 162, 243, 116, 248, 25, 83, 1, 231, 183, 254, 162, 243, 116,
- 218, 223, 83, 1, 231, 183, 254, 162, 243, 116, 249, 72, 83, 1, 231, 183,
- 254, 162, 243, 116, 210, 82, 83, 1, 231, 183, 254, 162, 243, 116, 210,
- 116, 83, 1, 254, 162, 243, 116, 163, 70, 83, 1, 254, 162, 243, 116, 163,
- 191, 83, 1, 231, 183, 254, 162, 243, 116, 252, 18, 83, 1, 254, 162, 243,
- 116, 248, 211, 83, 1, 231, 183, 254, 162, 243, 116, 232, 254, 18, 19,
- 226, 109, 18, 19, 253, 167, 18, 19, 255, 28, 18, 19, 212, 25, 18, 19,
- 224, 221, 18, 19, 225, 229, 18, 19, 224, 105, 18, 19, 217, 31, 18, 19,
- 234, 189, 18, 19, 233, 179, 18, 19, 231, 132, 18, 19, 228, 37, 18, 19,
- 229, 181, 18, 19, 233, 68, 18, 19, 219, 22, 18, 19, 221, 211, 18, 19,
- 219, 232, 18, 19, 220, 66, 18, 19, 219, 201, 18, 19, 210, 220, 18, 19,
- 211, 52, 18, 19, 223, 134, 18, 19, 227, 171, 18, 19, 226, 216, 227, 171,
- 18, 19, 227, 170, 18, 19, 226, 216, 227, 170, 18, 19, 227, 169, 18, 19,
- 226, 216, 227, 169, 18, 19, 227, 168, 18, 19, 226, 216, 227, 168, 18, 19,
- 222, 105, 18, 19, 222, 104, 18, 19, 222, 103, 18, 19, 222, 102, 18, 19,
- 222, 101, 18, 19, 222, 109, 18, 19, 226, 216, 226, 105, 18, 19, 226, 216,
- 217, 152, 18, 19, 226, 216, 235, 23, 18, 19, 226, 216, 251, 66, 18, 19,
- 226, 216, 193, 18, 19, 226, 216, 230, 25, 18, 19, 226, 216, 222, 91, 18,
- 19, 226, 216, 220, 104, 18, 19, 245, 219, 212, 98, 18, 19, 212, 7, 212,
- 98, 18, 19, 40, 4, 222, 233, 18, 19, 40, 223, 157, 247, 120, 18, 19, 223,
- 223, 222, 106, 18, 19, 159, 232, 127, 18, 19, 159, 233, 134, 18, 19, 216,
- 126, 18, 19, 216, 128, 18, 19, 215, 136, 18, 19, 215, 138, 18, 19, 215,
- 143, 18, 19, 216, 49, 18, 19, 216, 51, 18, 19, 221, 209, 219, 206, 18,
- 19, 221, 209, 220, 1, 18, 19, 221, 209, 241, 53, 18, 19, 72, 242, 73, 18,
- 19, 72, 248, 52, 243, 55, 18, 19, 72, 243, 132, 18, 19, 72, 242, 78, 18,
- 19, 221, 209, 235, 33, 18, 19, 72, 235, 31, 18, 19, 252, 68, 248, 52,
- 156, 18, 19, 252, 68, 248, 52, 153, 18, 19, 72, 248, 47, 222, 91, 232,
- 223, 213, 122, 233, 10, 232, 223, 1, 176, 232, 223, 1, 234, 132, 232,
- 223, 1, 243, 135, 232, 223, 1, 242, 249, 232, 223, 1, 229, 77, 232, 223,
- 1, 251, 33, 232, 223, 1, 250, 157, 232, 223, 1, 235, 141, 232, 223, 1,
- 235, 114, 232, 223, 1, 211, 71, 232, 223, 1, 217, 105, 232, 223, 1, 216,
- 208, 232, 223, 1, 248, 221, 232, 223, 1, 248, 25, 232, 223, 1, 197, 232,
- 223, 1, 190, 232, 223, 1, 225, 147, 232, 223, 1, 252, 191, 232, 223, 1,
- 252, 18, 232, 223, 1, 184, 232, 223, 1, 191, 232, 223, 1, 205, 232, 223,
- 1, 233, 135, 232, 223, 1, 212, 65, 232, 223, 1, 220, 102, 232, 223, 1,
- 218, 223, 232, 223, 1, 206, 232, 223, 1, 162, 232, 223, 25, 5, 61, 232,
- 223, 25, 5, 73, 232, 223, 25, 5, 70, 232, 223, 25, 5, 245, 209, 232, 223,
- 25, 5, 254, 201, 232, 223, 25, 5, 226, 183, 232, 223, 25, 5, 253, 192,
- 232, 223, 25, 5, 75, 232, 223, 25, 5, 76, 232, 223, 218, 73, 1, 191, 232,
- 223, 218, 73, 1, 205, 232, 223, 218, 73, 1, 212, 65, 232, 223, 4, 1, 176,
- 232, 223, 4, 1, 229, 77, 232, 223, 4, 1, 254, 75, 232, 223, 4, 1, 217,
- 105, 232, 223, 4, 1, 197, 232, 223, 4, 1, 190, 232, 223, 4, 1, 184, 232,
- 223, 4, 1, 205, 232, 223, 4, 1, 233, 135, 232, 223, 5, 230, 89, 232, 223,
- 5, 234, 171, 232, 223, 5, 222, 32, 232, 223, 5, 232, 127, 232, 223, 245,
- 31, 78, 232, 223, 224, 13, 78, 232, 223, 21, 210, 86, 232, 223, 21, 110,
- 232, 223, 21, 105, 232, 223, 21, 158, 232, 223, 21, 161, 232, 223, 21,
- 189, 232, 223, 21, 194, 232, 223, 21, 198, 232, 223, 21, 195, 232, 223,
- 21, 200, 39, 233, 59, 1, 176, 39, 233, 59, 1, 211, 165, 39, 233, 59, 1,
- 229, 77, 39, 233, 59, 1, 215, 183, 39, 233, 59, 1, 206, 39, 233, 59, 1,
- 191, 39, 233, 59, 1, 217, 105, 39, 233, 59, 1, 216, 208, 39, 233, 59, 1,
- 233, 135, 39, 233, 59, 1, 190, 39, 233, 59, 1, 225, 147, 39, 233, 59, 1,
- 184, 39, 233, 59, 1, 244, 196, 39, 233, 59, 1, 214, 27, 39, 233, 59, 1,
- 162, 39, 233, 59, 1, 224, 88, 39, 233, 59, 1, 234, 132, 39, 233, 59, 1,
- 215, 175, 39, 233, 59, 1, 197, 39, 233, 59, 1, 61, 39, 233, 59, 1, 73,
- 39, 233, 59, 1, 245, 209, 39, 233, 59, 1, 245, 197, 39, 233, 59, 1, 70,
- 39, 233, 59, 1, 226, 183, 39, 233, 59, 1, 76, 39, 233, 59, 1, 214, 214,
- 39, 233, 59, 1, 75, 39, 233, 59, 1, 253, 190, 39, 233, 59, 1, 254, 201,
- 39, 233, 59, 1, 216, 28, 39, 233, 59, 1, 216, 27, 39, 233, 59, 1, 216,
- 26, 39, 233, 59, 1, 216, 25, 39, 233, 59, 1, 216, 24, 166, 39, 173, 1,
- 125, 224, 88, 166, 39, 173, 1, 121, 224, 88, 166, 39, 173, 1, 125, 176,
- 166, 39, 173, 1, 125, 211, 165, 166, 39, 173, 1, 125, 229, 77, 166, 39,
+ 164, 251, 131, 222, 144, 63, 164, 229, 69, 251, 69, 227, 150, 210, 25,
+ 63, 164, 250, 240, 255, 164, 222, 145, 251, 70, 230, 203, 251, 8, 63,
+ 164, 229, 69, 251, 69, 220, 107, 222, 144, 63, 164, 250, 133, 230, 248,
+ 63, 164, 215, 185, 255, 161, 63, 164, 242, 101, 222, 145, 242, 64, 63,
+ 164, 242, 101, 222, 145, 242, 70, 63, 164, 254, 117, 234, 124, 242, 64,
+ 63, 164, 254, 117, 234, 124, 242, 70, 63, 5, 211, 65, 215, 172, 63, 5,
+ 231, 168, 215, 172, 63, 1, 176, 63, 1, 234, 133, 63, 1, 243, 136, 63, 1,
+ 242, 250, 63, 1, 229, 78, 63, 1, 251, 34, 63, 1, 250, 158, 63, 1, 235,
+ 142, 63, 1, 227, 166, 63, 1, 215, 157, 63, 1, 215, 145, 63, 1, 248, 136,
+ 63, 1, 248, 120, 63, 1, 228, 111, 63, 1, 217, 106, 63, 1, 216, 209, 63,
+ 1, 248, 222, 63, 1, 248, 26, 63, 1, 197, 63, 1, 190, 63, 1, 225, 148, 63,
+ 1, 252, 192, 63, 1, 252, 19, 63, 1, 185, 63, 1, 215, 184, 63, 1, 215,
+ 176, 63, 1, 246, 39, 63, 1, 246, 34, 63, 1, 212, 65, 63, 1, 210, 82, 63,
+ 1, 210, 116, 63, 1, 255, 167, 63, 1, 191, 63, 1, 205, 63, 1, 233, 136,
+ 63, 1, 220, 103, 63, 1, 218, 224, 63, 1, 206, 63, 1, 162, 63, 1, 61, 63,
+ 1, 233, 232, 63, 1, 244, 78, 205, 63, 1, 234, 47, 63, 1, 222, 180, 63,
+ 25, 5, 255, 74, 63, 25, 5, 73, 63, 25, 5, 236, 34, 63, 25, 5, 70, 63, 25,
+ 5, 214, 118, 63, 25, 5, 149, 153, 63, 25, 5, 149, 222, 181, 63, 25, 5,
+ 149, 156, 63, 25, 5, 149, 232, 186, 63, 25, 5, 75, 63, 25, 5, 245, 210,
+ 63, 25, 5, 76, 63, 25, 5, 226, 184, 63, 5, 222, 222, 218, 85, 229, 79,
+ 222, 212, 63, 5, 222, 217, 252, 77, 63, 25, 5, 223, 50, 73, 63, 25, 5,
+ 223, 50, 236, 34, 63, 5, 227, 150, 210, 26, 229, 227, 248, 222, 63, 5,
+ 219, 72, 233, 61, 63, 164, 242, 30, 63, 164, 226, 58, 63, 5, 233, 64,
+ 222, 144, 63, 5, 211, 70, 222, 144, 63, 5, 233, 65, 215, 185, 251, 8, 63,
+ 5, 231, 96, 251, 8, 63, 5, 242, 120, 251, 9, 223, 41, 63, 5, 242, 120,
+ 231, 86, 223, 41, 63, 5, 235, 194, 231, 96, 251, 8, 63, 218, 74, 5, 233,
+ 65, 215, 185, 251, 8, 63, 218, 74, 5, 231, 96, 251, 8, 63, 218, 74, 5,
+ 235, 194, 231, 96, 251, 8, 63, 218, 74, 1, 176, 63, 218, 74, 1, 234, 133,
+ 63, 218, 74, 1, 243, 136, 63, 218, 74, 1, 242, 250, 63, 218, 74, 1, 229,
+ 78, 63, 218, 74, 1, 251, 34, 63, 218, 74, 1, 250, 158, 63, 218, 74, 1,
+ 235, 142, 63, 218, 74, 1, 227, 166, 63, 218, 74, 1, 215, 157, 63, 218,
+ 74, 1, 215, 145, 63, 218, 74, 1, 248, 136, 63, 218, 74, 1, 248, 120, 63,
+ 218, 74, 1, 228, 111, 63, 218, 74, 1, 217, 106, 63, 218, 74, 1, 216, 209,
+ 63, 218, 74, 1, 248, 222, 63, 218, 74, 1, 248, 26, 63, 218, 74, 1, 197,
+ 63, 218, 74, 1, 190, 63, 218, 74, 1, 225, 148, 63, 218, 74, 1, 252, 192,
+ 63, 218, 74, 1, 252, 19, 63, 218, 74, 1, 185, 63, 218, 74, 1, 215, 184,
+ 63, 218, 74, 1, 215, 176, 63, 218, 74, 1, 246, 39, 63, 218, 74, 1, 246,
+ 34, 63, 218, 74, 1, 212, 65, 63, 218, 74, 1, 210, 82, 63, 218, 74, 1,
+ 210, 116, 63, 218, 74, 1, 255, 167, 63, 218, 74, 1, 191, 63, 218, 74, 1,
+ 205, 63, 218, 74, 1, 233, 136, 63, 218, 74, 1, 220, 103, 63, 218, 74, 1,
+ 218, 224, 63, 218, 74, 1, 206, 63, 218, 74, 1, 162, 63, 218, 74, 1, 61,
+ 63, 218, 74, 1, 233, 232, 63, 218, 74, 1, 244, 78, 212, 65, 63, 218, 74,
+ 1, 244, 78, 191, 63, 218, 74, 1, 244, 78, 205, 63, 233, 219, 222, 142,
+ 234, 133, 63, 233, 219, 222, 142, 234, 134, 251, 70, 230, 203, 251, 8,
+ 63, 250, 253, 5, 114, 252, 71, 63, 250, 253, 5, 192, 252, 71, 63, 250,
+ 253, 5, 250, 254, 217, 21, 63, 250, 253, 5, 221, 208, 255, 166, 63, 16,
+ 246, 92, 251, 126, 63, 16, 223, 130, 222, 223, 63, 16, 226, 78, 243, 64,
+ 63, 16, 223, 130, 222, 224, 223, 43, 242, 146, 63, 16, 225, 113, 190, 63,
+ 16, 228, 60, 251, 126, 63, 16, 228, 60, 251, 127, 227, 140, 255, 163, 63,
+ 16, 228, 60, 251, 127, 242, 118, 255, 163, 63, 16, 228, 60, 251, 127,
+ 251, 70, 255, 163, 63, 5, 223, 131, 229, 220, 223, 131, 247, 159, 63, 5,
+ 223, 131, 229, 220, 242, 117, 63, 164, 251, 130, 220, 4, 242, 216, 230,
+ 249, 223, 42, 63, 164, 230, 164, 211, 0, 242, 216, 230, 249, 223, 42, 63,
+ 164, 227, 140, 215, 173, 63, 164, 65, 251, 153, 222, 214, 211, 0, 230,
+ 249, 231, 94, 185, 63, 164, 249, 253, 251, 153, 222, 214, 211, 0, 230,
+ 249, 220, 110, 185, 222, 251, 218, 0, 50, 233, 46, 218, 0, 50, 222, 251,
+ 218, 0, 5, 2, 247, 119, 233, 46, 218, 0, 5, 2, 247, 119, 63, 164, 233,
+ 56, 231, 97, 222, 144, 63, 164, 215, 251, 231, 97, 222, 144, 68, 1, 176,
+ 68, 1, 234, 133, 68, 1, 243, 136, 68, 1, 242, 250, 68, 1, 229, 78, 68, 1,
+ 251, 34, 68, 1, 250, 158, 68, 1, 235, 142, 68, 1, 235, 115, 68, 1, 227,
+ 166, 68, 1, 228, 77, 68, 1, 215, 157, 68, 1, 215, 145, 68, 1, 248, 136,
+ 68, 1, 248, 120, 68, 1, 228, 111, 68, 1, 217, 106, 68, 1, 216, 209, 68,
+ 1, 248, 222, 68, 1, 248, 26, 68, 1, 197, 68, 1, 190, 68, 1, 225, 148, 68,
+ 1, 252, 192, 68, 1, 252, 19, 68, 1, 185, 68, 1, 191, 68, 1, 205, 68, 1,
+ 233, 136, 68, 1, 212, 65, 68, 1, 206, 68, 1, 162, 68, 1, 232, 185, 68, 1,
+ 61, 68, 1, 220, 87, 61, 68, 1, 73, 68, 1, 236, 34, 68, 1, 70, 68, 1, 214,
+ 118, 68, 1, 75, 68, 1, 230, 152, 75, 68, 1, 76, 68, 1, 253, 193, 68, 25,
+ 5, 217, 65, 255, 74, 68, 25, 5, 255, 74, 68, 25, 5, 73, 68, 25, 5, 236,
+ 34, 68, 25, 5, 70, 68, 25, 5, 214, 118, 68, 25, 5, 75, 68, 25, 5, 254,
+ 202, 68, 25, 5, 230, 152, 236, 34, 68, 25, 5, 230, 152, 76, 68, 25, 5,
+ 160, 48, 68, 5, 254, 76, 68, 5, 59, 51, 68, 5, 213, 147, 68, 5, 213, 152,
+ 68, 5, 253, 236, 68, 116, 5, 147, 191, 68, 116, 5, 147, 205, 68, 116, 5,
+ 147, 212, 65, 68, 116, 5, 147, 162, 68, 1, 242, 133, 206, 68, 21, 210,
+ 86, 68, 21, 110, 68, 21, 105, 68, 21, 158, 68, 21, 161, 68, 21, 189, 68,
+ 21, 194, 68, 21, 198, 68, 21, 195, 68, 21, 200, 68, 5, 232, 193, 221,
+ 173, 68, 5, 221, 173, 68, 16, 232, 154, 68, 16, 249, 214, 68, 16, 254,
+ 221, 68, 16, 243, 49, 68, 1, 220, 103, 68, 1, 218, 224, 68, 1, 149, 153,
+ 68, 1, 149, 222, 181, 68, 1, 149, 156, 68, 1, 149, 232, 186, 68, 25, 5,
+ 149, 153, 68, 25, 5, 149, 222, 181, 68, 25, 5, 149, 156, 68, 25, 5, 149,
+ 232, 186, 68, 1, 230, 152, 229, 78, 68, 1, 230, 152, 235, 115, 68, 1,
+ 230, 152, 252, 112, 68, 1, 230, 152, 252, 107, 68, 116, 5, 230, 152, 147,
+ 197, 68, 116, 5, 230, 152, 147, 185, 68, 116, 5, 230, 152, 147, 233, 136,
+ 68, 1, 220, 109, 234, 214, 220, 103, 68, 25, 5, 220, 109, 234, 214, 245,
+ 56, 68, 138, 164, 220, 109, 234, 214, 241, 248, 68, 138, 164, 220, 109,
+ 234, 214, 234, 184, 225, 122, 68, 1, 212, 7, 224, 109, 234, 214, 216,
+ 209, 68, 1, 212, 7, 224, 109, 234, 214, 224, 115, 68, 25, 5, 212, 7, 224,
+ 109, 234, 214, 245, 56, 68, 25, 5, 212, 7, 224, 109, 234, 214, 214, 214,
+ 68, 5, 212, 7, 224, 109, 234, 214, 216, 30, 68, 5, 212, 7, 224, 109, 234,
+ 214, 216, 29, 68, 5, 212, 7, 224, 109, 234, 214, 216, 28, 68, 5, 212, 7,
+ 224, 109, 234, 214, 216, 27, 68, 5, 212, 7, 224, 109, 234, 214, 216, 26,
+ 68, 1, 245, 220, 224, 109, 234, 214, 228, 111, 68, 1, 245, 220, 224, 109,
+ 234, 214, 210, 176, 68, 1, 245, 220, 224, 109, 234, 214, 242, 218, 68,
+ 25, 5, 243, 60, 234, 214, 73, 68, 25, 5, 234, 189, 226, 235, 68, 25, 5,
+ 234, 189, 70, 68, 25, 5, 234, 189, 245, 210, 68, 1, 220, 87, 176, 68, 1,
+ 220, 87, 234, 133, 68, 1, 220, 87, 243, 136, 68, 1, 220, 87, 251, 34, 68,
+ 1, 220, 87, 210, 116, 68, 1, 220, 87, 227, 166, 68, 1, 220, 87, 248, 222,
+ 68, 1, 220, 87, 197, 68, 1, 220, 87, 225, 148, 68, 1, 220, 87, 244, 197,
+ 68, 1, 220, 87, 252, 192, 68, 1, 220, 87, 216, 209, 68, 1, 220, 87, 162,
+ 68, 116, 5, 220, 87, 147, 212, 65, 68, 25, 5, 220, 87, 255, 74, 68, 25,
+ 5, 220, 87, 75, 68, 25, 5, 220, 87, 160, 48, 68, 25, 5, 220, 87, 40, 211,
+ 117, 68, 5, 220, 87, 216, 29, 68, 5, 220, 87, 216, 28, 68, 5, 220, 87,
+ 216, 26, 68, 5, 220, 87, 216, 25, 68, 5, 220, 87, 249, 153, 216, 29, 68,
+ 5, 220, 87, 249, 153, 216, 28, 68, 5, 220, 87, 249, 153, 245, 154, 216,
+ 31, 68, 1, 222, 129, 226, 64, 244, 197, 68, 5, 222, 129, 226, 64, 216,
+ 26, 68, 220, 87, 21, 210, 86, 68, 220, 87, 21, 110, 68, 220, 87, 21, 105,
+ 68, 220, 87, 21, 158, 68, 220, 87, 21, 161, 68, 220, 87, 21, 189, 68,
+ 220, 87, 21, 194, 68, 220, 87, 21, 198, 68, 220, 87, 21, 195, 68, 220,
+ 87, 21, 200, 68, 5, 234, 127, 216, 30, 68, 5, 234, 127, 216, 28, 68, 25,
+ 5, 254, 191, 61, 68, 25, 5, 254, 191, 254, 202, 68, 16, 220, 87, 110, 68,
+ 16, 220, 87, 245, 31, 98, 6, 1, 254, 124, 98, 6, 1, 252, 153, 98, 6, 1,
+ 243, 107, 98, 6, 1, 247, 129, 98, 6, 1, 245, 151, 98, 6, 1, 213, 160, 98,
+ 6, 1, 210, 89, 98, 6, 1, 217, 61, 98, 6, 1, 236, 0, 98, 6, 1, 234, 235,
+ 98, 6, 1, 233, 82, 98, 6, 1, 231, 186, 98, 6, 1, 229, 196, 98, 6, 1, 226,
+ 197, 98, 6, 1, 226, 18, 98, 6, 1, 210, 78, 98, 6, 1, 223, 172, 98, 6, 1,
+ 221, 244, 98, 6, 1, 217, 51, 98, 6, 1, 214, 190, 98, 6, 1, 225, 141, 98,
+ 6, 1, 234, 122, 98, 6, 1, 242, 242, 98, 6, 1, 224, 74, 98, 6, 1, 220, 21,
+ 98, 6, 1, 250, 98, 98, 6, 1, 251, 8, 98, 6, 1, 235, 101, 98, 6, 1, 250,
+ 41, 98, 6, 1, 250, 144, 98, 6, 1, 211, 163, 98, 6, 1, 235, 112, 98, 6, 1,
+ 242, 44, 98, 6, 1, 241, 239, 98, 6, 1, 241, 176, 98, 6, 1, 212, 22, 98,
+ 6, 1, 242, 5, 98, 6, 1, 241, 66, 98, 6, 1, 210, 246, 98, 6, 1, 254, 233,
+ 98, 1, 254, 124, 98, 1, 252, 153, 98, 1, 243, 107, 98, 1, 247, 129, 98,
+ 1, 245, 151, 98, 1, 213, 160, 98, 1, 210, 89, 98, 1, 217, 61, 98, 1, 236,
+ 0, 98, 1, 234, 235, 98, 1, 233, 82, 98, 1, 231, 186, 98, 1, 229, 196, 98,
+ 1, 226, 197, 98, 1, 226, 18, 98, 1, 210, 78, 98, 1, 223, 172, 98, 1, 221,
+ 244, 98, 1, 217, 51, 98, 1, 214, 190, 98, 1, 225, 141, 98, 1, 234, 122,
+ 98, 1, 242, 242, 98, 1, 224, 74, 98, 1, 220, 21, 98, 1, 250, 98, 98, 1,
+ 251, 8, 98, 1, 235, 101, 98, 1, 250, 41, 98, 1, 250, 144, 98, 1, 211,
+ 163, 98, 1, 235, 112, 98, 1, 242, 44, 98, 1, 241, 239, 98, 1, 241, 176,
+ 98, 1, 212, 22, 98, 1, 242, 5, 98, 1, 241, 66, 98, 1, 244, 122, 98, 1,
+ 210, 246, 98, 1, 245, 166, 98, 1, 215, 94, 243, 107, 98, 1, 254, 197, 98,
+ 226, 16, 220, 138, 58, 1, 98, 229, 196, 98, 1, 254, 233, 98, 1, 242, 4,
+ 50, 98, 1, 233, 128, 50, 24, 100, 234, 59, 24, 100, 218, 216, 24, 100,
+ 228, 227, 24, 100, 216, 102, 24, 100, 218, 205, 24, 100, 223, 27, 24,
+ 100, 230, 218, 24, 100, 225, 96, 24, 100, 218, 213, 24, 100, 219, 149,
+ 24, 100, 218, 210, 24, 100, 236, 57, 24, 100, 250, 47, 24, 100, 218, 220,
+ 24, 100, 250, 107, 24, 100, 234, 111, 24, 100, 216, 174, 24, 100, 225,
+ 132, 24, 100, 241, 173, 24, 100, 228, 223, 24, 100, 218, 214, 24, 100,
+ 228, 217, 24, 100, 228, 221, 24, 100, 216, 99, 24, 100, 223, 15, 24, 100,
+ 218, 212, 24, 100, 223, 25, 24, 100, 234, 219, 24, 100, 230, 211, 24,
+ 100, 234, 222, 24, 100, 225, 91, 24, 100, 225, 89, 24, 100, 225, 77, 24,
+ 100, 225, 85, 24, 100, 225, 83, 24, 100, 225, 80, 24, 100, 225, 82, 24,
+ 100, 225, 79, 24, 100, 225, 84, 24, 100, 225, 94, 24, 100, 225, 95, 24,
+ 100, 225, 78, 24, 100, 225, 88, 24, 100, 234, 220, 24, 100, 234, 218, 24,
+ 100, 219, 142, 24, 100, 219, 140, 24, 100, 219, 132, 24, 100, 219, 135,
+ 24, 100, 219, 141, 24, 100, 219, 137, 24, 100, 219, 136, 24, 100, 219,
+ 134, 24, 100, 219, 145, 24, 100, 219, 147, 24, 100, 219, 148, 24, 100,
+ 219, 143, 24, 100, 219, 133, 24, 100, 219, 138, 24, 100, 219, 146, 24,
+ 100, 250, 91, 24, 100, 250, 89, 24, 100, 250, 169, 24, 100, 250, 167, 24,
+ 100, 226, 33, 24, 100, 236, 52, 24, 100, 236, 43, 24, 100, 236, 51, 24,
+ 100, 236, 48, 24, 100, 236, 46, 24, 100, 236, 50, 24, 100, 218, 217, 24,
+ 100, 236, 55, 24, 100, 236, 56, 24, 100, 236, 44, 24, 100, 236, 49, 24,
+ 100, 211, 26, 24, 100, 250, 46, 24, 100, 250, 92, 24, 100, 250, 90, 24,
+ 100, 250, 170, 24, 100, 250, 168, 24, 100, 250, 105, 24, 100, 250, 106,
+ 24, 100, 250, 93, 24, 100, 250, 171, 24, 100, 225, 130, 24, 100, 234,
+ 221, 24, 100, 218, 218, 24, 100, 211, 32, 24, 100, 234, 50, 24, 100, 228,
+ 219, 24, 100, 228, 225, 24, 100, 228, 224, 24, 100, 216, 96, 24, 100,
+ 244, 104, 24, 143, 244, 104, 24, 143, 61, 24, 143, 254, 244, 24, 143,
+ 191, 24, 143, 211, 92, 24, 143, 245, 118, 24, 143, 75, 24, 143, 211, 36,
+ 24, 143, 211, 47, 24, 143, 76, 24, 143, 212, 65, 24, 143, 212, 62, 24,
+ 143, 226, 235, 24, 143, 210, 244, 24, 143, 70, 24, 143, 212, 11, 24, 143,
+ 212, 22, 24, 143, 211, 250, 24, 143, 210, 212, 24, 143, 245, 56, 24, 143,
+ 211, 8, 24, 143, 73, 24, 143, 255, 158, 24, 143, 255, 157, 24, 143, 211,
+ 106, 24, 143, 211, 104, 24, 143, 245, 116, 24, 143, 245, 115, 24, 143,
+ 245, 117, 24, 143, 211, 35, 24, 143, 211, 34, 24, 143, 227, 85, 24, 143,
+ 227, 86, 24, 143, 227, 79, 24, 143, 227, 84, 24, 143, 227, 82, 24, 143,
+ 210, 238, 24, 143, 210, 237, 24, 143, 210, 236, 24, 143, 210, 239, 24,
+ 143, 210, 240, 24, 143, 215, 30, 24, 143, 215, 29, 24, 143, 215, 27, 24,
+ 143, 215, 24, 24, 143, 215, 25, 24, 143, 210, 211, 24, 143, 210, 208, 24,
+ 143, 210, 209, 24, 143, 210, 203, 24, 143, 210, 204, 24, 143, 210, 205,
+ 24, 143, 210, 207, 24, 143, 245, 50, 24, 143, 245, 52, 24, 143, 211, 7,
+ 24, 143, 240, 154, 24, 143, 240, 146, 24, 143, 240, 149, 24, 143, 240,
+ 147, 24, 143, 240, 151, 24, 143, 240, 153, 24, 143, 254, 35, 24, 143,
+ 254, 32, 24, 143, 254, 30, 24, 143, 254, 31, 24, 143, 218, 221, 24, 143,
+ 255, 159, 24, 143, 211, 105, 24, 143, 211, 33, 24, 143, 227, 81, 24, 143,
+ 227, 80, 24, 90, 234, 59, 24, 90, 218, 216, 24, 90, 234, 52, 24, 90, 228,
+ 227, 24, 90, 228, 225, 24, 90, 228, 224, 24, 90, 216, 102, 24, 90, 223,
+ 27, 24, 90, 223, 22, 24, 90, 223, 19, 24, 90, 223, 12, 24, 90, 223, 7,
+ 24, 90, 223, 2, 24, 90, 223, 13, 24, 90, 223, 25, 24, 90, 230, 218, 24,
+ 90, 225, 96, 24, 90, 225, 85, 24, 90, 219, 149, 24, 90, 218, 210, 24, 90,
+ 236, 57, 24, 90, 250, 47, 24, 90, 250, 107, 24, 90, 234, 111, 24, 90,
+ 216, 174, 24, 90, 225, 132, 24, 90, 241, 173, 24, 90, 234, 53, 24, 90,
+ 234, 51, 24, 90, 228, 223, 24, 90, 228, 217, 24, 90, 228, 219, 24, 90,
+ 228, 222, 24, 90, 228, 218, 24, 90, 216, 99, 24, 90, 216, 96, 24, 90,
+ 223, 20, 24, 90, 223, 15, 24, 90, 223, 1, 24, 90, 223, 0, 24, 90, 218,
+ 212, 24, 90, 223, 17, 24, 90, 223, 16, 24, 90, 223, 9, 24, 90, 223, 11,
+ 24, 90, 223, 24, 24, 90, 223, 4, 24, 90, 223, 14, 24, 90, 223, 23, 24,
+ 90, 222, 255, 24, 90, 230, 214, 24, 90, 230, 209, 24, 90, 230, 211, 24,
+ 90, 230, 208, 24, 90, 230, 206, 24, 90, 230, 212, 24, 90, 230, 217, 24,
+ 90, 230, 215, 24, 90, 234, 222, 24, 90, 225, 87, 24, 90, 225, 88, 24, 90,
+ 225, 93, 24, 90, 234, 220, 24, 90, 219, 142, 24, 90, 219, 132, 24, 90,
+ 219, 135, 24, 90, 219, 137, 24, 90, 226, 33, 24, 90, 236, 52, 24, 90,
+ 236, 45, 24, 90, 218, 217, 24, 90, 236, 53, 24, 90, 211, 26, 24, 90, 211,
+ 22, 24, 90, 211, 23, 24, 90, 225, 130, 24, 90, 234, 221, 24, 90, 241,
+ 171, 24, 90, 241, 169, 24, 90, 241, 172, 24, 90, 241, 170, 24, 90, 211,
+ 32, 24, 90, 234, 55, 24, 90, 234, 54, 24, 90, 234, 58, 24, 90, 234, 56,
+ 24, 90, 234, 57, 24, 90, 218, 214, 29, 3, 162, 29, 3, 240, 223, 29, 3,
+ 241, 181, 29, 3, 242, 47, 29, 3, 241, 221, 29, 3, 241, 239, 29, 3, 241,
+ 69, 29, 3, 241, 68, 29, 3, 233, 136, 29, 3, 232, 99, 29, 3, 232, 242, 29,
+ 3, 233, 135, 29, 3, 233, 51, 29, 3, 233, 59, 29, 3, 232, 157, 29, 3, 232,
+ 71, 29, 3, 241, 190, 29, 3, 241, 184, 29, 3, 241, 186, 29, 3, 241, 189,
+ 29, 3, 241, 187, 29, 3, 241, 188, 29, 3, 241, 185, 29, 3, 241, 183, 29,
+ 3, 185, 29, 3, 230, 103, 29, 3, 230, 231, 29, 3, 231, 238, 29, 3, 231,
+ 81, 29, 3, 231, 92, 29, 3, 230, 162, 29, 3, 230, 43, 29, 3, 217, 164, 29,
+ 3, 217, 158, 29, 3, 217, 160, 29, 3, 217, 163, 29, 3, 217, 161, 29, 3,
+ 217, 162, 29, 3, 217, 159, 29, 3, 217, 157, 29, 3, 205, 29, 3, 222, 141,
+ 29, 3, 223, 36, 29, 3, 223, 185, 29, 3, 223, 109, 29, 3, 223, 129, 29, 3,
+ 222, 212, 29, 3, 222, 110, 29, 3, 206, 29, 3, 218, 84, 29, 3, 219, 192,
+ 29, 3, 222, 32, 29, 3, 221, 171, 29, 3, 221, 182, 29, 3, 219, 59, 29, 3,
+ 217, 254, 29, 3, 220, 103, 29, 3, 219, 226, 29, 3, 220, 33, 29, 3, 220,
+ 99, 29, 3, 220, 62, 29, 3, 220, 64, 29, 3, 220, 8, 29, 3, 219, 209, 29,
+ 3, 224, 89, 29, 3, 224, 31, 29, 3, 224, 54, 29, 3, 224, 88, 29, 3, 224,
+ 69, 29, 3, 224, 70, 29, 3, 224, 43, 29, 3, 224, 42, 29, 3, 223, 243, 29,
+ 3, 223, 239, 29, 3, 223, 242, 29, 3, 223, 240, 29, 3, 223, 241, 29, 3,
+ 224, 66, 29, 3, 224, 60, 29, 3, 224, 62, 29, 3, 224, 65, 29, 3, 224, 63,
+ 29, 3, 224, 64, 29, 3, 224, 61, 29, 3, 224, 59, 29, 3, 224, 55, 29, 3,
+ 224, 58, 29, 3, 224, 56, 29, 3, 224, 57, 29, 3, 252, 192, 29, 3, 251,
+ 126, 29, 3, 252, 7, 29, 3, 252, 190, 29, 3, 252, 67, 29, 3, 252, 76, 29,
+ 3, 251, 206, 29, 3, 251, 84, 29, 3, 214, 27, 29, 3, 212, 116, 29, 3, 213,
+ 176, 29, 3, 214, 26, 29, 3, 213, 250, 29, 3, 213, 255, 29, 3, 213, 138,
+ 29, 3, 212, 107, 29, 3, 217, 106, 29, 3, 215, 119, 29, 3, 216, 118, 29,
+ 3, 217, 102, 29, 3, 217, 12, 29, 3, 217, 23, 29, 3, 111, 29, 3, 215, 80,
+ 29, 3, 251, 34, 29, 3, 249, 113, 29, 3, 250, 52, 29, 3, 251, 33, 29, 3,
+ 250, 183, 29, 3, 250, 191, 29, 3, 249, 239, 29, 3, 249, 82, 29, 3, 211,
+ 165, 29, 3, 211, 141, 29, 3, 211, 157, 29, 3, 211, 164, 29, 3, 211, 161,
+ 29, 3, 211, 162, 29, 3, 211, 148, 29, 3, 211, 147, 29, 3, 211, 136, 29,
+ 3, 211, 132, 29, 3, 211, 135, 29, 3, 211, 133, 29, 3, 211, 134, 29, 3,
+ 197, 29, 3, 227, 238, 29, 3, 228, 234, 29, 3, 229, 226, 29, 3, 229, 104,
+ 29, 3, 229, 108, 29, 3, 228, 75, 29, 3, 227, 175, 29, 3, 227, 166, 29, 3,
+ 227, 129, 29, 3, 227, 149, 29, 3, 227, 165, 29, 3, 227, 156, 29, 3, 227,
+ 157, 29, 3, 227, 135, 29, 3, 227, 120, 29, 3, 242, 181, 61, 29, 3, 242,
+ 181, 70, 29, 3, 242, 181, 73, 29, 3, 242, 181, 255, 74, 29, 3, 242, 181,
+ 245, 210, 29, 3, 242, 181, 75, 29, 3, 242, 181, 76, 29, 3, 242, 181, 212,
+ 65, 29, 3, 176, 29, 3, 233, 218, 29, 3, 234, 93, 29, 3, 235, 11, 29, 3,
+ 234, 182, 29, 3, 234, 183, 29, 3, 234, 29, 29, 3, 234, 28, 29, 3, 233,
+ 183, 29, 3, 233, 177, 29, 3, 233, 182, 29, 3, 233, 178, 29, 3, 233, 179,
+ 29, 3, 233, 172, 29, 3, 233, 166, 29, 3, 233, 168, 29, 3, 233, 171, 29,
+ 3, 233, 169, 29, 3, 233, 170, 29, 3, 233, 167, 29, 3, 233, 165, 29, 3,
+ 233, 161, 29, 3, 233, 164, 29, 3, 233, 162, 29, 3, 233, 163, 29, 3, 212,
+ 65, 29, 3, 211, 195, 29, 3, 211, 250, 29, 3, 212, 64, 29, 3, 212, 17, 29,
+ 3, 212, 22, 29, 3, 211, 227, 29, 3, 211, 226, 29, 3, 225, 140, 61, 29, 3,
+ 225, 140, 70, 29, 3, 225, 140, 73, 29, 3, 225, 140, 255, 74, 29, 3, 225,
+ 140, 245, 210, 29, 3, 225, 140, 75, 29, 3, 225, 140, 76, 29, 3, 210, 116,
+ 29, 3, 210, 13, 29, 3, 210, 44, 29, 3, 210, 115, 29, 3, 210, 92, 29, 3,
+ 210, 94, 29, 3, 210, 23, 29, 3, 210, 0, 29, 3, 210, 82, 29, 3, 210, 62,
+ 29, 3, 210, 69, 29, 3, 210, 81, 29, 3, 210, 73, 29, 3, 210, 74, 29, 3,
+ 210, 67, 29, 3, 210, 53, 29, 3, 191, 29, 3, 210, 212, 29, 3, 211, 8, 29,
+ 3, 211, 103, 29, 3, 211, 44, 29, 3, 211, 47, 29, 3, 210, 244, 29, 3, 210,
+ 235, 29, 3, 248, 222, 29, 3, 246, 79, 29, 3, 248, 4, 29, 3, 248, 221, 29,
+ 3, 248, 78, 29, 3, 248, 91, 29, 3, 247, 146, 29, 3, 246, 48, 29, 3, 248,
+ 136, 29, 3, 248, 101, 29, 3, 248, 113, 29, 3, 248, 135, 29, 3, 248, 123,
+ 29, 3, 248, 124, 29, 3, 248, 106, 29, 3, 248, 92, 29, 3, 235, 142, 29, 3,
+ 235, 52, 29, 3, 235, 109, 29, 3, 235, 141, 29, 3, 235, 125, 29, 3, 235,
+ 127, 29, 3, 235, 69, 29, 3, 235, 32, 29, 3, 243, 136, 29, 3, 242, 114,
+ 29, 3, 242, 215, 29, 3, 243, 133, 29, 3, 243, 56, 29, 3, 243, 63, 29, 3,
+ 242, 175, 29, 3, 242, 174, 29, 3, 242, 79, 29, 3, 242, 75, 29, 3, 242,
+ 78, 29, 3, 242, 76, 29, 3, 242, 77, 29, 3, 243, 30, 29, 3, 243, 10, 29,
+ 3, 243, 20, 29, 3, 243, 29, 29, 3, 243, 24, 29, 3, 243, 25, 29, 3, 243,
+ 14, 29, 3, 242, 255, 29, 3, 216, 209, 29, 3, 216, 137, 29, 3, 216, 176,
+ 29, 3, 216, 208, 29, 3, 216, 195, 29, 3, 216, 196, 29, 3, 216, 157, 29,
+ 3, 216, 129, 29, 3, 250, 158, 29, 3, 250, 70, 29, 3, 250, 111, 29, 3,
+ 250, 157, 29, 3, 250, 129, 29, 3, 250, 132, 29, 3, 250, 87, 29, 3, 250,
+ 59, 29, 3, 225, 148, 29, 3, 225, 115, 29, 3, 225, 134, 29, 3, 225, 147,
+ 29, 3, 225, 136, 29, 3, 225, 137, 29, 3, 225, 122, 29, 3, 225, 111, 29,
+ 3, 215, 184, 29, 3, 215, 164, 29, 3, 215, 168, 29, 3, 215, 183, 29, 3,
+ 215, 178, 29, 3, 215, 179, 29, 3, 215, 167, 29, 3, 215, 162, 29, 3, 215,
+ 39, 29, 3, 215, 31, 29, 3, 215, 35, 29, 3, 215, 38, 29, 3, 215, 36, 29,
+ 3, 215, 37, 29, 3, 215, 33, 29, 3, 215, 32, 29, 3, 244, 197, 29, 3, 243,
+ 235, 29, 3, 244, 122, 29, 3, 244, 196, 29, 3, 244, 148, 29, 3, 244, 155,
+ 29, 3, 244, 44, 29, 3, 243, 214, 29, 3, 190, 29, 3, 224, 151, 29, 3, 225,
+ 109, 29, 3, 226, 90, 29, 3, 225, 212, 29, 3, 225, 222, 29, 3, 225, 17,
+ 29, 3, 224, 115, 29, 3, 222, 100, 29, 3, 230, 32, 29, 3, 243, 208, 29,
+ 38, 243, 54, 22, 25, 233, 24, 78, 29, 38, 25, 233, 24, 78, 29, 38, 243,
+ 54, 78, 29, 221, 174, 78, 29, 211, 208, 29, 243, 230, 218, 130, 29, 249,
+ 220, 29, 220, 151, 29, 249, 227, 29, 224, 200, 249, 227, 29, 224, 14, 78,
+ 29, 226, 16, 220, 138, 29, 21, 110, 29, 21, 105, 29, 21, 158, 29, 21,
+ 161, 29, 21, 189, 29, 21, 194, 29, 21, 198, 29, 21, 195, 29, 21, 200, 29,
+ 54, 216, 248, 29, 54, 215, 73, 29, 54, 216, 163, 29, 54, 244, 16, 29, 54,
+ 244, 115, 29, 54, 219, 112, 29, 54, 220, 117, 29, 54, 245, 185, 29, 54,
+ 228, 196, 29, 54, 240, 211, 29, 54, 216, 249, 216, 148, 29, 3, 221, 178,
+ 230, 43, 29, 3, 230, 39, 29, 3, 230, 40, 29, 3, 230, 41, 29, 3, 221, 178,
+ 251, 84, 29, 3, 251, 81, 29, 3, 251, 82, 29, 3, 251, 83, 29, 3, 221, 178,
+ 243, 214, 29, 3, 243, 210, 29, 3, 243, 211, 29, 3, 243, 212, 29, 3, 221,
+ 178, 224, 115, 29, 3, 224, 111, 29, 3, 224, 112, 29, 3, 224, 113, 29,
+ 216, 32, 164, 210, 247, 29, 216, 32, 164, 248, 42, 29, 216, 32, 164, 222,
+ 239, 29, 216, 32, 164, 219, 252, 222, 239, 29, 216, 32, 164, 247, 236,
+ 29, 216, 32, 164, 234, 165, 29, 216, 32, 164, 250, 95, 29, 216, 32, 164,
+ 241, 178, 29, 216, 32, 164, 248, 41, 29, 216, 32, 164, 233, 195, 169, 1,
+ 61, 169, 1, 75, 169, 1, 73, 169, 1, 76, 169, 1, 70, 169, 1, 214, 105,
+ 169, 1, 243, 136, 169, 1, 176, 169, 1, 243, 63, 169, 1, 242, 215, 169, 1,
+ 242, 175, 169, 1, 242, 114, 169, 1, 242, 80, 169, 1, 162, 169, 1, 241,
+ 239, 169, 1, 241, 181, 169, 1, 241, 69, 169, 1, 240, 223, 169, 1, 240,
+ 202, 169, 1, 233, 136, 169, 1, 233, 59, 169, 1, 232, 242, 169, 1, 232,
+ 157, 169, 1, 232, 99, 169, 1, 232, 72, 169, 1, 185, 169, 1, 231, 92, 169,
+ 1, 230, 231, 169, 1, 230, 162, 169, 1, 230, 103, 169, 1, 197, 169, 1,
+ 241, 91, 169, 1, 229, 214, 169, 1, 229, 108, 169, 1, 228, 234, 169, 1,
+ 228, 75, 169, 1, 227, 238, 169, 1, 227, 177, 169, 1, 224, 30, 169, 1,
+ 224, 17, 169, 1, 224, 10, 169, 1, 224, 2, 169, 1, 223, 247, 169, 1, 223,
+ 245, 169, 1, 206, 169, 1, 222, 92, 169, 1, 221, 182, 169, 1, 219, 192,
+ 169, 1, 219, 59, 169, 1, 218, 84, 169, 1, 218, 3, 169, 1, 248, 222, 169,
+ 1, 217, 106, 169, 1, 248, 91, 169, 1, 217, 23, 169, 1, 248, 4, 169, 1,
+ 216, 118, 169, 1, 247, 146, 169, 1, 246, 79, 169, 1, 246, 51, 169, 1,
+ 247, 157, 169, 1, 216, 60, 169, 1, 216, 59, 169, 1, 216, 48, 169, 1, 216,
+ 47, 169, 1, 216, 46, 169, 1, 216, 45, 169, 1, 215, 184, 169, 1, 215, 179,
+ 169, 1, 215, 168, 169, 1, 215, 167, 169, 1, 215, 164, 169, 1, 215, 163,
+ 169, 1, 212, 65, 169, 1, 212, 22, 169, 1, 211, 250, 169, 1, 211, 227,
+ 169, 1, 211, 195, 169, 1, 211, 183, 169, 1, 191, 169, 1, 211, 47, 169, 1,
+ 211, 8, 169, 1, 210, 244, 169, 1, 210, 212, 169, 1, 210, 177, 18, 19,
+ 240, 169, 18, 19, 75, 18, 19, 255, 38, 18, 19, 73, 18, 19, 236, 34, 18,
+ 19, 76, 18, 19, 226, 184, 18, 19, 211, 116, 226, 184, 18, 19, 72, 245,
+ 210, 18, 19, 72, 73, 18, 19, 61, 18, 19, 255, 74, 18, 19, 212, 22, 18,
+ 19, 159, 212, 22, 18, 19, 211, 250, 18, 19, 159, 211, 250, 18, 19, 211,
+ 242, 18, 19, 159, 211, 242, 18, 19, 211, 227, 18, 19, 159, 211, 227, 18,
+ 19, 211, 215, 18, 19, 159, 211, 215, 18, 19, 229, 191, 211, 215, 18, 19,
+ 212, 65, 18, 19, 159, 212, 65, 18, 19, 212, 64, 18, 19, 159, 212, 64, 18,
+ 19, 229, 191, 212, 64, 18, 19, 254, 202, 18, 19, 211, 116, 212, 98, 18,
+ 19, 242, 181, 218, 130, 18, 19, 40, 142, 18, 19, 40, 242, 137, 18, 19,
+ 40, 251, 176, 163, 222, 234, 18, 19, 40, 216, 15, 163, 222, 234, 18, 19,
+ 40, 44, 163, 222, 234, 18, 19, 40, 222, 234, 18, 19, 40, 52, 142, 18, 19,
+ 40, 52, 219, 252, 67, 218, 91, 18, 19, 40, 230, 225, 247, 121, 18, 19,
+ 40, 219, 252, 203, 91, 18, 19, 40, 225, 23, 18, 19, 40, 124, 217, 88, 18,
+ 19, 245, 151, 18, 19, 236, 0, 18, 19, 226, 197, 18, 19, 254, 124, 18, 19,
+ 225, 222, 18, 19, 226, 88, 18, 19, 225, 109, 18, 19, 225, 72, 18, 19,
+ 225, 17, 18, 19, 224, 250, 18, 19, 211, 116, 224, 250, 18, 19, 72, 241,
+ 221, 18, 19, 72, 241, 181, 18, 19, 190, 18, 19, 226, 90, 18, 19, 224,
+ 113, 18, 19, 159, 224, 113, 18, 19, 224, 111, 18, 19, 159, 224, 111, 18,
+ 19, 224, 110, 18, 19, 159, 224, 110, 18, 19, 224, 108, 18, 19, 159, 224,
+ 108, 18, 19, 224, 107, 18, 19, 159, 224, 107, 18, 19, 224, 115, 18, 19,
+ 159, 224, 115, 18, 19, 224, 114, 18, 19, 159, 224, 114, 18, 19, 211, 116,
+ 224, 114, 18, 19, 226, 106, 18, 19, 159, 226, 106, 18, 19, 72, 242, 61,
+ 18, 19, 217, 23, 18, 19, 217, 100, 18, 19, 216, 118, 18, 19, 216, 104,
+ 18, 19, 111, 18, 19, 216, 18, 18, 19, 211, 116, 216, 18, 18, 19, 72, 248,
+ 78, 18, 19, 72, 248, 4, 18, 19, 217, 106, 18, 19, 217, 102, 18, 19, 215,
+ 78, 18, 19, 159, 215, 78, 18, 19, 215, 62, 18, 19, 159, 215, 62, 18, 19,
+ 215, 61, 18, 19, 159, 215, 61, 18, 19, 105, 18, 19, 159, 105, 18, 19,
+ 215, 54, 18, 19, 159, 215, 54, 18, 19, 215, 80, 18, 19, 159, 215, 80, 18,
+ 19, 215, 79, 18, 19, 159, 215, 79, 18, 19, 229, 191, 215, 79, 18, 19,
+ 217, 153, 18, 19, 215, 152, 18, 19, 215, 136, 18, 19, 215, 134, 18, 19,
+ 215, 157, 18, 19, 234, 183, 18, 19, 235, 8, 18, 19, 234, 93, 18, 19, 234,
+ 84, 18, 19, 234, 29, 18, 19, 234, 11, 18, 19, 211, 116, 234, 11, 18, 19,
+ 176, 18, 19, 235, 11, 18, 19, 233, 179, 18, 19, 159, 233, 179, 18, 19,
+ 233, 177, 18, 19, 159, 233, 177, 18, 19, 233, 176, 18, 19, 159, 233, 176,
+ 18, 19, 233, 175, 18, 19, 159, 233, 175, 18, 19, 233, 174, 18, 19, 159,
+ 233, 174, 18, 19, 233, 183, 18, 19, 159, 233, 183, 18, 19, 233, 182, 18,
+ 19, 159, 233, 182, 18, 19, 229, 191, 233, 182, 18, 19, 235, 24, 18, 19,
+ 233, 184, 18, 19, 219, 28, 234, 177, 18, 19, 219, 28, 234, 85, 18, 19,
+ 219, 28, 234, 24, 18, 19, 219, 28, 234, 249, 18, 19, 250, 191, 18, 19,
+ 251, 32, 18, 19, 250, 52, 18, 19, 250, 42, 18, 19, 249, 239, 18, 19, 249,
+ 175, 18, 19, 211, 116, 249, 175, 18, 19, 251, 34, 18, 19, 251, 33, 18,
+ 19, 249, 80, 18, 19, 159, 249, 80, 18, 19, 249, 78, 18, 19, 159, 249, 78,
+ 18, 19, 249, 77, 18, 19, 159, 249, 77, 18, 19, 249, 76, 18, 19, 159, 249,
+ 76, 18, 19, 249, 75, 18, 19, 159, 249, 75, 18, 19, 249, 82, 18, 19, 159,
+ 249, 82, 18, 19, 249, 81, 18, 19, 159, 249, 81, 18, 19, 229, 191, 249,
+ 81, 18, 19, 251, 67, 18, 19, 221, 210, 216, 211, 18, 19, 231, 92, 18, 19,
+ 231, 237, 18, 19, 230, 231, 18, 19, 230, 202, 18, 19, 230, 162, 18, 19,
+ 230, 133, 18, 19, 211, 116, 230, 133, 18, 19, 185, 18, 19, 231, 238, 18,
+ 19, 230, 41, 18, 19, 159, 230, 41, 18, 19, 230, 39, 18, 19, 159, 230, 39,
+ 18, 19, 230, 38, 18, 19, 159, 230, 38, 18, 19, 230, 37, 18, 19, 159, 230,
+ 37, 18, 19, 230, 36, 18, 19, 159, 230, 36, 18, 19, 230, 43, 18, 19, 159,
+ 230, 43, 18, 19, 230, 42, 18, 19, 159, 230, 42, 18, 19, 229, 191, 230,
+ 42, 18, 19, 193, 18, 19, 159, 193, 18, 19, 230, 235, 18, 19, 253, 206,
+ 193, 18, 19, 221, 210, 193, 18, 19, 229, 108, 18, 19, 229, 225, 18, 19,
+ 228, 234, 18, 19, 228, 209, 18, 19, 228, 75, 18, 19, 228, 65, 18, 19,
+ 211, 116, 228, 65, 18, 19, 197, 18, 19, 229, 226, 18, 19, 227, 173, 18,
+ 19, 159, 227, 173, 18, 19, 227, 175, 18, 19, 159, 227, 175, 18, 19, 227,
+ 174, 18, 19, 159, 227, 174, 18, 19, 229, 191, 227, 174, 18, 19, 230, 26,
+ 18, 19, 72, 229, 80, 18, 19, 228, 239, 18, 19, 233, 59, 18, 19, 233, 134,
+ 18, 19, 232, 242, 18, 19, 232, 228, 18, 19, 232, 157, 18, 19, 232, 128,
+ 18, 19, 211, 116, 232, 128, 18, 19, 233, 136, 18, 19, 233, 135, 18, 19,
+ 232, 69, 18, 19, 159, 232, 69, 18, 19, 232, 68, 18, 19, 159, 232, 68, 18,
+ 19, 232, 67, 18, 19, 159, 232, 67, 18, 19, 232, 66, 18, 19, 159, 232, 66,
+ 18, 19, 232, 65, 18, 19, 159, 232, 65, 18, 19, 232, 71, 18, 19, 159, 232,
+ 71, 18, 19, 232, 70, 18, 19, 159, 232, 70, 18, 19, 156, 18, 19, 159, 156,
+ 18, 19, 147, 156, 18, 19, 221, 182, 18, 19, 222, 30, 18, 19, 219, 192,
+ 18, 19, 219, 176, 18, 19, 219, 59, 18, 19, 219, 41, 18, 19, 211, 116,
+ 219, 41, 18, 19, 206, 18, 19, 222, 32, 18, 19, 217, 250, 18, 19, 159,
+ 217, 250, 18, 19, 217, 244, 18, 19, 159, 217, 244, 18, 19, 217, 243, 18,
+ 19, 159, 217, 243, 18, 19, 217, 239, 18, 19, 159, 217, 239, 18, 19, 217,
+ 238, 18, 19, 159, 217, 238, 18, 19, 217, 254, 18, 19, 159, 217, 254, 18,
+ 19, 217, 253, 18, 19, 159, 217, 253, 18, 19, 229, 191, 217, 253, 18, 19,
+ 222, 92, 18, 19, 253, 206, 222, 92, 18, 19, 217, 255, 18, 19, 251, 219,
+ 222, 92, 18, 19, 230, 128, 219, 109, 18, 19, 229, 191, 219, 100, 18, 19,
+ 229, 191, 222, 90, 18, 19, 229, 191, 218, 236, 18, 19, 229, 191, 218, 87,
+ 18, 19, 229, 191, 219, 99, 18, 19, 229, 191, 221, 185, 18, 19, 220, 64,
+ 18, 19, 220, 33, 18, 19, 220, 28, 18, 19, 220, 8, 18, 19, 220, 2, 18, 19,
+ 220, 103, 18, 19, 220, 99, 18, 19, 219, 207, 18, 19, 159, 219, 207, 18,
+ 19, 219, 206, 18, 19, 159, 219, 206, 18, 19, 219, 205, 18, 19, 159, 219,
+ 205, 18, 19, 219, 204, 18, 19, 159, 219, 204, 18, 19, 219, 203, 18, 19,
+ 159, 219, 203, 18, 19, 219, 209, 18, 19, 159, 219, 209, 18, 19, 219, 208,
+ 18, 19, 159, 219, 208, 18, 19, 220, 105, 18, 19, 211, 47, 18, 19, 211,
+ 101, 18, 19, 211, 8, 18, 19, 210, 255, 18, 19, 210, 244, 18, 19, 210,
+ 229, 18, 19, 211, 116, 210, 229, 18, 19, 191, 18, 19, 211, 103, 18, 19,
+ 210, 174, 18, 19, 159, 210, 174, 18, 19, 210, 173, 18, 19, 159, 210, 173,
+ 18, 19, 210, 172, 18, 19, 159, 210, 172, 18, 19, 210, 171, 18, 19, 159,
+ 210, 171, 18, 19, 210, 170, 18, 19, 159, 210, 170, 18, 19, 210, 176, 18,
+ 19, 159, 210, 176, 18, 19, 210, 175, 18, 19, 159, 210, 175, 18, 19, 229,
+ 191, 210, 175, 18, 19, 211, 117, 18, 19, 252, 5, 211, 117, 18, 19, 159,
+ 211, 117, 18, 19, 221, 210, 211, 8, 18, 19, 223, 129, 18, 19, 223, 224,
+ 223, 129, 18, 19, 159, 233, 59, 18, 19, 223, 184, 18, 19, 223, 36, 18,
+ 19, 222, 240, 18, 19, 222, 212, 18, 19, 222, 198, 18, 19, 159, 232, 157,
+ 18, 19, 205, 18, 19, 223, 185, 18, 19, 159, 233, 136, 18, 19, 222, 109,
+ 18, 19, 159, 222, 109, 18, 19, 153, 18, 19, 159, 153, 18, 19, 147, 153,
+ 18, 19, 244, 155, 18, 19, 244, 194, 18, 19, 244, 122, 18, 19, 244, 109,
+ 18, 19, 244, 44, 18, 19, 244, 35, 18, 19, 244, 197, 18, 19, 244, 196, 18,
+ 19, 243, 213, 18, 19, 159, 243, 213, 18, 19, 245, 7, 18, 19, 216, 196,
+ 18, 19, 230, 24, 216, 196, 18, 19, 216, 176, 18, 19, 230, 24, 216, 176,
+ 18, 19, 216, 172, 18, 19, 230, 24, 216, 172, 18, 19, 216, 157, 18, 19,
+ 216, 154, 18, 19, 216, 209, 18, 19, 216, 208, 18, 19, 216, 128, 18, 19,
+ 159, 216, 128, 18, 19, 216, 211, 18, 19, 215, 143, 18, 19, 215, 141, 18,
+ 19, 215, 140, 18, 19, 215, 145, 18, 19, 215, 146, 18, 19, 215, 52, 18,
+ 19, 215, 51, 18, 19, 215, 50, 18, 19, 215, 53, 18, 19, 227, 194, 241,
+ 239, 18, 19, 227, 194, 241, 181, 18, 19, 227, 194, 241, 162, 18, 19, 227,
+ 194, 241, 69, 18, 19, 227, 194, 241, 54, 18, 19, 227, 194, 162, 18, 19,
+ 227, 194, 242, 47, 18, 19, 227, 194, 242, 61, 18, 19, 227, 193, 242, 61,
+ 18, 19, 241, 155, 18, 19, 224, 85, 18, 19, 224, 54, 18, 19, 224, 49, 18,
+ 19, 224, 43, 18, 19, 224, 38, 18, 19, 224, 89, 18, 19, 224, 88, 18, 19,
+ 224, 97, 18, 19, 216, 56, 18, 19, 216, 54, 18, 19, 216, 53, 18, 19, 216,
+ 57, 18, 19, 159, 223, 129, 18, 19, 159, 223, 36, 18, 19, 159, 222, 212,
+ 18, 19, 159, 205, 18, 19, 229, 76, 18, 19, 229, 28, 18, 19, 229, 24, 18,
+ 19, 229, 5, 18, 19, 229, 0, 18, 19, 229, 78, 18, 19, 229, 77, 18, 19,
+ 229, 80, 18, 19, 228, 104, 18, 19, 221, 210, 220, 64, 18, 19, 221, 210,
+ 220, 33, 18, 19, 221, 210, 220, 8, 18, 19, 221, 210, 220, 103, 18, 19,
+ 211, 213, 216, 196, 18, 19, 211, 213, 216, 176, 18, 19, 211, 213, 216,
+ 157, 18, 19, 211, 213, 216, 209, 18, 19, 211, 213, 216, 211, 18, 19, 232,
+ 249, 18, 19, 232, 248, 18, 19, 232, 247, 18, 19, 232, 246, 18, 19, 232,
+ 255, 18, 19, 232, 254, 18, 19, 233, 0, 18, 19, 216, 210, 216, 196, 18,
+ 19, 216, 210, 216, 176, 18, 19, 216, 210, 216, 172, 18, 19, 216, 210,
+ 216, 157, 18, 19, 216, 210, 216, 154, 18, 19, 216, 210, 216, 209, 18, 19,
+ 216, 210, 216, 208, 18, 19, 216, 210, 216, 211, 18, 19, 254, 190, 253,
+ 159, 18, 19, 251, 219, 75, 18, 19, 251, 219, 73, 18, 19, 251, 219, 76,
+ 18, 19, 251, 219, 61, 18, 19, 251, 219, 212, 22, 18, 19, 251, 219, 211,
+ 250, 18, 19, 251, 219, 211, 227, 18, 19, 251, 219, 212, 65, 18, 19, 251,
+ 219, 229, 108, 18, 19, 251, 219, 228, 234, 18, 19, 251, 219, 228, 75, 18,
+ 19, 251, 219, 197, 18, 19, 251, 219, 234, 183, 18, 19, 251, 219, 234, 93,
+ 18, 19, 251, 219, 234, 29, 18, 19, 251, 219, 176, 18, 19, 221, 210, 241,
+ 239, 18, 19, 221, 210, 241, 181, 18, 19, 221, 210, 241, 69, 18, 19, 221,
+ 210, 162, 18, 19, 72, 242, 221, 18, 19, 72, 242, 225, 18, 19, 72, 242,
+ 237, 18, 19, 72, 242, 236, 18, 19, 72, 242, 226, 18, 19, 72, 242, 250,
+ 18, 19, 72, 222, 141, 18, 19, 72, 222, 212, 18, 19, 72, 223, 129, 18, 19,
+ 72, 223, 109, 18, 19, 72, 223, 36, 18, 19, 72, 205, 18, 19, 72, 211, 195,
+ 18, 19, 72, 211, 227, 18, 19, 72, 212, 22, 18, 19, 72, 212, 17, 18, 19,
+ 72, 211, 250, 18, 19, 72, 212, 65, 18, 19, 72, 240, 195, 18, 19, 72, 240,
+ 196, 18, 19, 72, 240, 199, 18, 19, 72, 240, 198, 18, 19, 72, 240, 197,
+ 18, 19, 72, 240, 201, 18, 19, 72, 216, 137, 18, 19, 72, 216, 157, 18, 19,
+ 72, 216, 196, 18, 19, 72, 216, 195, 18, 19, 72, 216, 176, 18, 19, 72,
+ 216, 209, 18, 19, 72, 215, 124, 18, 19, 72, 215, 134, 18, 19, 72, 215,
+ 152, 18, 19, 72, 215, 151, 18, 19, 72, 215, 136, 18, 19, 72, 215, 157,
+ 18, 19, 72, 224, 151, 18, 19, 72, 225, 17, 18, 19, 72, 225, 222, 18, 19,
+ 72, 225, 212, 18, 19, 72, 225, 109, 18, 19, 72, 190, 18, 19, 72, 226,
+ 106, 18, 19, 72, 242, 114, 18, 19, 72, 242, 175, 18, 19, 72, 243, 63, 18,
+ 19, 72, 243, 56, 18, 19, 72, 242, 215, 18, 19, 72, 243, 136, 18, 19, 72,
+ 234, 101, 18, 19, 72, 234, 106, 18, 19, 72, 234, 120, 18, 19, 72, 234,
+ 119, 18, 19, 72, 234, 113, 18, 19, 72, 234, 133, 18, 19, 72, 234, 42, 18,
+ 19, 72, 234, 43, 18, 19, 72, 234, 46, 18, 19, 72, 234, 45, 18, 19, 72,
+ 234, 44, 18, 19, 72, 234, 47, 18, 19, 72, 234, 48, 18, 19, 72, 227, 238,
+ 18, 19, 72, 228, 75, 18, 19, 72, 229, 108, 18, 19, 72, 229, 104, 18, 19,
+ 72, 228, 234, 18, 19, 72, 197, 18, 19, 72, 230, 103, 18, 19, 72, 230,
+ 162, 18, 19, 72, 231, 92, 18, 19, 72, 231, 81, 18, 19, 72, 230, 231, 18,
+ 19, 72, 185, 18, 19, 72, 210, 212, 18, 19, 72, 210, 244, 18, 19, 72, 211,
+ 47, 18, 19, 72, 211, 44, 18, 19, 72, 211, 8, 18, 19, 72, 191, 18, 19, 72,
+ 235, 52, 18, 19, 221, 210, 235, 52, 18, 19, 72, 235, 69, 18, 19, 72, 235,
+ 127, 18, 19, 72, 235, 125, 18, 19, 72, 235, 109, 18, 19, 221, 210, 235,
+ 109, 18, 19, 72, 235, 142, 18, 19, 72, 235, 82, 18, 19, 72, 235, 86, 18,
+ 19, 72, 235, 96, 18, 19, 72, 235, 95, 18, 19, 72, 235, 94, 18, 19, 72,
+ 235, 97, 18, 19, 72, 232, 99, 18, 19, 72, 232, 157, 18, 19, 72, 233, 59,
+ 18, 19, 72, 233, 51, 18, 19, 72, 232, 242, 18, 19, 72, 233, 136, 18, 19,
+ 72, 247, 150, 18, 19, 72, 247, 151, 18, 19, 72, 247, 156, 18, 19, 72,
+ 247, 155, 18, 19, 72, 247, 152, 18, 19, 72, 247, 157, 18, 19, 72, 232,
+ 245, 18, 19, 72, 232, 247, 18, 19, 72, 232, 251, 18, 19, 72, 232, 250,
+ 18, 19, 72, 232, 249, 18, 19, 72, 232, 255, 18, 19, 72, 216, 51, 18, 19,
+ 72, 216, 53, 18, 19, 72, 216, 56, 18, 19, 72, 216, 55, 18, 19, 72, 216,
+ 54, 18, 19, 72, 216, 57, 18, 19, 72, 216, 46, 18, 19, 72, 216, 47, 18,
+ 19, 72, 216, 59, 18, 19, 72, 216, 58, 18, 19, 72, 216, 48, 18, 19, 72,
+ 216, 60, 18, 19, 72, 210, 13, 18, 19, 72, 210, 23, 18, 19, 72, 210, 94,
+ 18, 19, 72, 210, 92, 18, 19, 72, 210, 44, 18, 19, 72, 210, 116, 18, 19,
+ 72, 210, 159, 18, 19, 72, 65, 210, 159, 18, 19, 72, 246, 29, 18, 19, 72,
+ 246, 30, 18, 19, 72, 246, 37, 18, 19, 72, 246, 36, 18, 19, 72, 246, 32,
+ 18, 19, 72, 246, 39, 18, 19, 72, 218, 84, 18, 19, 72, 219, 59, 18, 19,
+ 72, 221, 182, 18, 19, 72, 221, 171, 18, 19, 72, 219, 192, 18, 19, 72,
+ 206, 18, 19, 72, 219, 226, 18, 19, 72, 220, 8, 18, 19, 72, 220, 64, 18,
+ 19, 72, 220, 62, 18, 19, 72, 220, 33, 18, 19, 72, 220, 103, 18, 19, 72,
+ 220, 105, 18, 19, 72, 215, 164, 18, 19, 72, 215, 167, 18, 19, 72, 215,
+ 179, 18, 19, 72, 215, 178, 18, 19, 72, 215, 168, 18, 19, 72, 215, 184,
+ 18, 19, 72, 250, 70, 18, 19, 72, 250, 87, 18, 19, 72, 250, 132, 18, 19,
+ 72, 250, 129, 18, 19, 72, 250, 111, 18, 19, 72, 250, 158, 18, 19, 72,
+ 215, 127, 18, 19, 72, 215, 128, 18, 19, 72, 215, 131, 18, 19, 72, 215,
+ 130, 18, 19, 72, 215, 129, 18, 19, 72, 215, 132, 18, 19, 250, 112, 50,
+ 18, 19, 243, 230, 218, 130, 18, 19, 224, 81, 18, 19, 229, 74, 18, 19,
+ 228, 101, 18, 19, 228, 100, 18, 19, 228, 99, 18, 19, 228, 98, 18, 19,
+ 228, 103, 18, 19, 228, 102, 18, 19, 211, 213, 216, 126, 18, 19, 211, 213,
+ 216, 125, 18, 19, 211, 213, 216, 124, 18, 19, 211, 213, 216, 123, 18, 19,
+ 211, 213, 216, 122, 18, 19, 211, 213, 216, 129, 18, 19, 211, 213, 216,
+ 128, 18, 19, 211, 213, 40, 216, 211, 18, 19, 251, 219, 212, 98, 226, 227,
+ 219, 20, 78, 226, 227, 1, 252, 49, 226, 227, 1, 232, 88, 226, 227, 1,
+ 244, 152, 226, 227, 1, 222, 16, 226, 227, 1, 228, 194, 226, 227, 1, 214,
+ 226, 226, 227, 1, 248, 198, 226, 227, 1, 216, 81, 226, 227, 1, 249, 230,
+ 226, 227, 1, 250, 181, 226, 227, 1, 230, 92, 226, 227, 1, 242, 157, 226,
+ 227, 1, 229, 64, 226, 227, 1, 218, 123, 226, 227, 1, 222, 136, 226, 227,
+ 1, 254, 199, 226, 227, 1, 226, 188, 226, 227, 1, 214, 150, 226, 227, 1,
+ 245, 232, 226, 227, 1, 235, 189, 226, 227, 1, 245, 233, 226, 227, 1, 226,
+ 159, 226, 227, 1, 214, 206, 226, 227, 1, 236, 40, 226, 227, 1, 245, 230,
+ 226, 227, 1, 225, 203, 226, 227, 244, 151, 78, 226, 227, 223, 50, 244,
+ 151, 78, 178, 1, 244, 142, 244, 134, 244, 156, 245, 7, 178, 1, 214, 105,
+ 178, 1, 214, 135, 214, 151, 70, 178, 1, 210, 214, 178, 1, 211, 117, 178,
+ 1, 212, 98, 178, 1, 216, 131, 216, 130, 216, 152, 178, 1, 245, 60, 178,
+ 1, 254, 94, 61, 178, 1, 226, 144, 76, 178, 1, 255, 18, 61, 178, 1, 254,
+ 228, 178, 1, 232, 134, 76, 178, 1, 219, 245, 76, 178, 1, 76, 178, 1, 226,
+ 235, 178, 1, 226, 197, 178, 1, 223, 165, 223, 178, 223, 95, 153, 178, 1,
+ 234, 194, 178, 1, 250, 178, 178, 1, 234, 195, 235, 24, 178, 1, 243, 203,
+ 178, 1, 245, 139, 178, 1, 243, 59, 242, 67, 243, 203, 178, 1, 243, 97,
+ 178, 1, 211, 188, 211, 182, 212, 98, 178, 1, 242, 39, 242, 61, 178, 1,
+ 242, 43, 242, 61, 178, 1, 232, 136, 242, 61, 178, 1, 219, 248, 242, 61,
+ 178, 1, 229, 186, 227, 158, 229, 187, 230, 26, 178, 1, 219, 246, 230, 26,
+ 178, 1, 246, 116, 178, 1, 235, 169, 235, 173, 235, 163, 73, 178, 1, 75,
+ 178, 1, 235, 118, 235, 145, 178, 1, 243, 44, 178, 1, 232, 137, 254, 244,
+ 178, 1, 219, 250, 61, 178, 1, 235, 155, 245, 114, 178, 1, 225, 165, 225,
+ 187, 226, 106, 178, 1, 254, 164, 245, 112, 178, 1, 219, 25, 222, 92, 178,
+ 1, 219, 180, 232, 133, 222, 92, 178, 1, 219, 244, 222, 92, 178, 1, 251,
+ 67, 178, 1, 210, 159, 178, 1, 216, 64, 216, 74, 215, 41, 217, 153, 178,
+ 1, 219, 243, 217, 153, 178, 1, 249, 61, 178, 1, 252, 32, 252, 35, 251,
+ 225, 253, 159, 178, 1, 219, 249, 253, 159, 178, 1, 246, 115, 178, 1, 226,
+ 172, 178, 1, 245, 197, 245, 199, 75, 178, 1, 231, 179, 231, 187, 193,
+ 178, 1, 232, 135, 193, 178, 1, 219, 247, 193, 178, 1, 233, 74, 233, 115,
+ 232, 144, 156, 178, 1, 246, 117, 178, 1, 235, 231, 178, 1, 235, 232, 178,
+ 1, 248, 211, 248, 216, 249, 61, 178, 1, 226, 139, 245, 59, 76, 178, 1,
+ 245, 228, 178, 1, 235, 188, 178, 1, 249, 79, 178, 1, 251, 18, 178, 1,
+ 250, 190, 178, 1, 218, 162, 178, 1, 232, 132, 178, 1, 219, 242, 178, 1,
+ 240, 111, 178, 1, 224, 97, 178, 1, 211, 178, 178, 219, 156, 224, 141,
+ 178, 230, 86, 224, 141, 178, 249, 132, 224, 141, 178, 254, 7, 87, 178,
+ 215, 82, 87, 178, 252, 47, 87, 217, 84, 1, 61, 217, 84, 1, 73, 217, 84,
+ 1, 70, 217, 84, 1, 176, 217, 84, 1, 243, 136, 217, 84, 1, 229, 78, 217,
+ 84, 1, 217, 106, 217, 84, 1, 248, 222, 217, 84, 1, 197, 217, 84, 1, 190,
+ 217, 84, 1, 252, 192, 217, 84, 1, 185, 217, 84, 1, 191, 217, 84, 1, 233,
+ 136, 217, 84, 1, 212, 65, 217, 84, 1, 206, 217, 84, 1, 162, 217, 84, 25,
+ 5, 73, 217, 84, 25, 5, 70, 217, 84, 5, 213, 152, 242, 8, 1, 61, 242, 8,
+ 1, 73, 242, 8, 1, 70, 242, 8, 1, 176, 242, 8, 1, 243, 136, 242, 8, 1,
+ 229, 78, 242, 8, 1, 217, 106, 242, 8, 1, 248, 222, 242, 8, 1, 197, 242,
+ 8, 1, 190, 242, 8, 1, 252, 192, 242, 8, 1, 185, 242, 8, 1, 191, 242, 8,
+ 1, 205, 242, 8, 1, 233, 136, 242, 8, 1, 212, 65, 242, 8, 1, 206, 242, 8,
+ 1, 162, 242, 8, 25, 5, 73, 242, 8, 25, 5, 70, 242, 8, 5, 226, 50, 225,
+ 127, 219, 156, 224, 141, 225, 127, 52, 224, 141, 251, 121, 1, 61, 251,
+ 121, 1, 73, 251, 121, 1, 70, 251, 121, 1, 176, 251, 121, 1, 243, 136,
+ 251, 121, 1, 229, 78, 251, 121, 1, 217, 106, 251, 121, 1, 248, 222, 251,
+ 121, 1, 197, 251, 121, 1, 190, 251, 121, 1, 252, 192, 251, 121, 1, 185,
+ 251, 121, 1, 191, 251, 121, 1, 205, 251, 121, 1, 233, 136, 251, 121, 1,
+ 212, 65, 251, 121, 1, 206, 251, 121, 1, 162, 251, 121, 25, 5, 73, 251,
+ 121, 25, 5, 70, 217, 83, 1, 61, 217, 83, 1, 73, 217, 83, 1, 70, 217, 83,
+ 1, 176, 217, 83, 1, 243, 136, 217, 83, 1, 229, 78, 217, 83, 1, 217, 106,
+ 217, 83, 1, 248, 222, 217, 83, 1, 197, 217, 83, 1, 190, 217, 83, 1, 252,
+ 192, 217, 83, 1, 185, 217, 83, 1, 191, 217, 83, 1, 233, 136, 217, 83, 1,
+ 212, 65, 217, 83, 1, 206, 217, 83, 25, 5, 73, 217, 83, 25, 5, 70, 69, 1,
+ 176, 69, 1, 234, 133, 69, 1, 234, 29, 69, 1, 234, 106, 69, 1, 229, 5, 69,
+ 1, 251, 34, 69, 1, 250, 158, 69, 1, 249, 239, 69, 1, 250, 87, 69, 1, 227,
+ 135, 69, 1, 248, 222, 69, 1, 215, 145, 69, 1, 247, 146, 69, 1, 215, 140,
+ 69, 1, 228, 81, 69, 1, 217, 106, 69, 1, 216, 209, 69, 1, 111, 69, 1, 216,
+ 157, 69, 1, 228, 75, 69, 1, 252, 192, 69, 1, 225, 148, 69, 1, 225, 17,
+ 69, 1, 225, 122, 69, 1, 230, 162, 69, 1, 210, 244, 69, 1, 222, 212, 69,
+ 1, 232, 157, 69, 1, 213, 138, 69, 1, 220, 103, 69, 1, 218, 185, 69, 1,
+ 206, 69, 1, 162, 69, 1, 233, 136, 69, 1, 224, 89, 69, 235, 244, 25, 224,
+ 75, 69, 235, 244, 25, 224, 88, 69, 235, 244, 25, 224, 54, 69, 235, 244,
+ 25, 224, 49, 69, 235, 244, 25, 224, 31, 69, 235, 244, 25, 224, 3, 69,
+ 235, 244, 25, 223, 247, 69, 235, 244, 25, 223, 246, 69, 235, 244, 25,
+ 222, 101, 69, 235, 244, 25, 222, 94, 69, 235, 244, 25, 232, 63, 69, 235,
+ 244, 25, 232, 53, 69, 235, 244, 25, 224, 70, 69, 235, 244, 25, 224, 81,
+ 69, 235, 244, 25, 224, 39, 215, 49, 110, 69, 235, 244, 25, 224, 39, 215,
+ 49, 105, 69, 235, 244, 25, 224, 71, 69, 25, 235, 230, 254, 46, 69, 25,
+ 235, 230, 255, 74, 69, 25, 5, 255, 74, 69, 25, 5, 73, 69, 25, 5, 236, 34,
+ 69, 25, 5, 211, 117, 69, 25, 5, 210, 169, 69, 25, 5, 70, 69, 25, 5, 214,
+ 118, 69, 25, 5, 214, 229, 69, 25, 5, 226, 235, 69, 25, 5, 191, 69, 25, 5,
+ 236, 61, 69, 25, 5, 75, 69, 25, 5, 254, 244, 69, 25, 5, 254, 202, 69, 25,
+ 5, 226, 184, 69, 25, 5, 253, 193, 69, 5, 228, 207, 69, 5, 223, 127, 69,
+ 5, 210, 180, 69, 5, 230, 53, 69, 5, 215, 214, 69, 5, 252, 144, 69, 5,
+ 222, 207, 69, 5, 216, 41, 69, 5, 234, 242, 69, 5, 254, 204, 69, 5, 221,
+ 245, 221, 239, 69, 5, 213, 149, 69, 5, 249, 233, 69, 5, 252, 118, 69, 5,
+ 234, 126, 69, 5, 252, 138, 69, 5, 251, 10, 225, 73, 233, 188, 69, 5, 233,
+ 31, 216, 18, 69, 5, 252, 21, 69, 5, 225, 124, 230, 100, 69, 5, 234, 10,
+ 69, 249, 99, 16, 223, 29, 69, 5, 253, 175, 69, 5, 253, 196, 69, 21, 210,
+ 86, 69, 21, 110, 69, 21, 105, 69, 21, 158, 69, 21, 161, 69, 21, 189, 69,
+ 21, 194, 69, 21, 198, 69, 21, 195, 69, 21, 200, 69, 16, 233, 31, 253,
+ 198, 219, 44, 69, 16, 233, 31, 253, 198, 230, 72, 69, 16, 233, 31, 253,
+ 198, 225, 72, 69, 16, 233, 31, 253, 198, 252, 50, 69, 16, 233, 31, 253,
+ 198, 251, 104, 69, 16, 233, 31, 253, 198, 224, 216, 69, 16, 233, 31, 253,
+ 198, 224, 210, 69, 16, 233, 31, 253, 198, 224, 208, 69, 16, 233, 31, 253,
+ 198, 224, 214, 69, 16, 233, 31, 253, 198, 224, 212, 83, 251, 237, 83,
+ 245, 164, 83, 249, 220, 83, 243, 230, 218, 130, 83, 249, 227, 83, 244,
+ 12, 247, 119, 83, 216, 40, 219, 53, 240, 169, 83, 219, 191, 3, 251, 173,
+ 231, 155, 83, 231, 184, 249, 220, 83, 231, 184, 243, 230, 218, 130, 83,
+ 228, 192, 83, 243, 254, 45, 221, 158, 110, 83, 243, 254, 45, 221, 158,
+ 105, 83, 243, 254, 45, 221, 158, 158, 83, 25, 220, 138, 83, 21, 210, 86,
+ 83, 21, 110, 83, 21, 105, 83, 21, 158, 83, 21, 161, 83, 21, 189, 83, 21,
+ 194, 83, 21, 198, 83, 21, 195, 83, 21, 200, 83, 1, 61, 83, 1, 75, 83, 1,
+ 73, 83, 1, 76, 83, 1, 70, 83, 1, 226, 235, 83, 1, 214, 214, 83, 1, 245,
+ 210, 83, 1, 197, 83, 1, 254, 116, 83, 1, 252, 192, 83, 1, 190, 83, 1,
+ 224, 89, 83, 1, 243, 136, 83, 1, 185, 83, 1, 233, 136, 83, 1, 206, 83, 1,
+ 220, 103, 83, 1, 217, 106, 83, 1, 248, 222, 83, 1, 250, 158, 83, 1, 235,
+ 142, 83, 1, 191, 83, 1, 205, 83, 1, 212, 65, 83, 1, 244, 197, 83, 1, 176,
+ 83, 1, 234, 133, 83, 1, 215, 184, 83, 1, 210, 116, 83, 1, 242, 47, 83, 1,
+ 210, 16, 83, 1, 232, 255, 83, 1, 210, 69, 83, 1, 250, 111, 83, 1, 216,
+ 40, 199, 25, 50, 83, 1, 216, 40, 75, 83, 1, 216, 40, 73, 83, 1, 216, 40,
+ 76, 83, 1, 216, 40, 70, 83, 1, 216, 40, 226, 235, 83, 1, 216, 40, 214,
+ 214, 83, 1, 216, 40, 254, 116, 83, 1, 216, 40, 252, 192, 83, 1, 216, 40,
+ 190, 83, 1, 216, 40, 224, 89, 83, 1, 216, 40, 243, 136, 83, 1, 216, 40,
+ 185, 83, 1, 216, 40, 217, 106, 83, 1, 216, 40, 248, 222, 83, 1, 216, 40,
+ 250, 158, 83, 1, 216, 40, 235, 142, 83, 1, 216, 40, 215, 184, 83, 1, 216,
+ 40, 191, 83, 1, 216, 40, 212, 65, 83, 1, 216, 40, 176, 83, 1, 216, 40,
+ 243, 133, 83, 1, 216, 40, 242, 47, 83, 1, 216, 40, 235, 108, 83, 1, 216,
+ 40, 228, 232, 83, 1, 216, 40, 246, 39, 83, 1, 219, 191, 75, 83, 1, 219,
+ 191, 73, 83, 1, 219, 191, 235, 153, 83, 1, 219, 191, 214, 214, 83, 1,
+ 219, 191, 70, 83, 1, 219, 191, 254, 116, 83, 1, 219, 191, 176, 83, 1,
+ 219, 191, 243, 136, 83, 1, 219, 191, 162, 83, 1, 219, 191, 190, 83, 1,
+ 219, 191, 220, 103, 83, 1, 219, 191, 217, 106, 83, 1, 219, 191, 248, 222,
+ 83, 1, 219, 191, 235, 142, 83, 1, 219, 191, 244, 197, 83, 1, 219, 191,
+ 243, 133, 83, 1, 219, 191, 242, 47, 83, 1, 219, 191, 215, 184, 83, 1,
+ 219, 191, 210, 116, 83, 1, 219, 191, 223, 185, 83, 1, 219, 191, 250, 158,
+ 83, 1, 219, 191, 210, 82, 83, 1, 231, 184, 73, 83, 1, 231, 184, 176, 83,
+ 1, 231, 184, 205, 83, 1, 231, 184, 244, 197, 83, 1, 231, 184, 210, 82,
+ 83, 1, 254, 163, 243, 117, 254, 77, 110, 83, 1, 254, 163, 243, 117, 213,
+ 148, 110, 83, 1, 254, 163, 243, 117, 248, 187, 83, 1, 254, 163, 243, 117,
+ 214, 224, 83, 1, 254, 163, 243, 117, 235, 194, 214, 224, 83, 1, 254, 163,
+ 243, 117, 252, 156, 83, 1, 254, 163, 243, 117, 134, 252, 156, 83, 1, 254,
+ 163, 243, 117, 61, 83, 1, 254, 163, 243, 117, 73, 83, 1, 254, 163, 243,
+ 117, 176, 83, 1, 254, 163, 243, 117, 229, 78, 83, 1, 254, 163, 243, 117,
+ 251, 34, 83, 1, 254, 163, 243, 117, 215, 157, 83, 1, 254, 163, 243, 117,
+ 215, 145, 83, 1, 254, 163, 243, 117, 248, 136, 83, 1, 254, 163, 243, 117,
+ 228, 111, 83, 1, 254, 163, 243, 117, 217, 106, 83, 1, 254, 163, 243, 117,
+ 248, 222, 83, 1, 254, 163, 243, 117, 190, 83, 1, 254, 163, 243, 117, 225,
+ 148, 83, 1, 254, 163, 243, 117, 218, 224, 83, 1, 254, 163, 243, 117, 210,
+ 82, 83, 1, 254, 163, 243, 117, 210, 116, 83, 1, 254, 163, 243, 117, 254,
+ 210, 83, 1, 216, 40, 254, 163, 243, 117, 217, 106, 83, 1, 216, 40, 254,
+ 163, 243, 117, 210, 82, 83, 1, 231, 184, 254, 163, 243, 117, 242, 250,
+ 83, 1, 231, 184, 254, 163, 243, 117, 229, 78, 83, 1, 231, 184, 254, 163,
+ 243, 117, 251, 34, 83, 1, 231, 184, 254, 163, 243, 117, 235, 115, 83, 1,
+ 231, 184, 254, 163, 243, 117, 215, 157, 83, 1, 231, 184, 254, 163, 243,
+ 117, 248, 120, 83, 1, 231, 184, 254, 163, 243, 117, 217, 106, 83, 1, 231,
+ 184, 254, 163, 243, 117, 248, 26, 83, 1, 231, 184, 254, 163, 243, 117,
+ 218, 224, 83, 1, 231, 184, 254, 163, 243, 117, 249, 73, 83, 1, 231, 184,
+ 254, 163, 243, 117, 210, 82, 83, 1, 231, 184, 254, 163, 243, 117, 210,
+ 116, 83, 1, 254, 163, 243, 117, 163, 70, 83, 1, 254, 163, 243, 117, 163,
+ 191, 83, 1, 231, 184, 254, 163, 243, 117, 252, 19, 83, 1, 254, 163, 243,
+ 117, 248, 212, 83, 1, 231, 184, 254, 163, 243, 117, 232, 255, 18, 19,
+ 226, 110, 18, 19, 253, 168, 18, 19, 255, 29, 18, 19, 212, 25, 18, 19,
+ 224, 222, 18, 19, 225, 230, 18, 19, 224, 106, 18, 19, 217, 32, 18, 19,
+ 234, 190, 18, 19, 233, 180, 18, 19, 231, 133, 18, 19, 228, 38, 18, 19,
+ 229, 182, 18, 19, 233, 69, 18, 19, 219, 23, 18, 19, 221, 212, 18, 19,
+ 219, 233, 18, 19, 220, 67, 18, 19, 219, 202, 18, 19, 210, 220, 18, 19,
+ 211, 52, 18, 19, 223, 135, 18, 19, 227, 172, 18, 19, 226, 217, 227, 172,
+ 18, 19, 227, 171, 18, 19, 226, 217, 227, 171, 18, 19, 227, 170, 18, 19,
+ 226, 217, 227, 170, 18, 19, 227, 169, 18, 19, 226, 217, 227, 169, 18, 19,
+ 222, 106, 18, 19, 222, 105, 18, 19, 222, 104, 18, 19, 222, 103, 18, 19,
+ 222, 102, 18, 19, 222, 110, 18, 19, 226, 217, 226, 106, 18, 19, 226, 217,
+ 217, 153, 18, 19, 226, 217, 235, 24, 18, 19, 226, 217, 251, 67, 18, 19,
+ 226, 217, 193, 18, 19, 226, 217, 230, 26, 18, 19, 226, 217, 222, 92, 18,
+ 19, 226, 217, 220, 105, 18, 19, 245, 220, 212, 98, 18, 19, 212, 7, 212,
+ 98, 18, 19, 40, 4, 222, 234, 18, 19, 40, 223, 158, 247, 121, 18, 19, 223,
+ 224, 222, 107, 18, 19, 159, 232, 128, 18, 19, 159, 233, 135, 18, 19, 216,
+ 127, 18, 19, 216, 129, 18, 19, 215, 137, 18, 19, 215, 139, 18, 19, 215,
+ 144, 18, 19, 216, 50, 18, 19, 216, 52, 18, 19, 221, 210, 219, 207, 18,
+ 19, 221, 210, 220, 2, 18, 19, 221, 210, 241, 54, 18, 19, 72, 242, 74, 18,
+ 19, 72, 248, 53, 243, 56, 18, 19, 72, 243, 133, 18, 19, 72, 242, 79, 18,
+ 19, 221, 210, 235, 34, 18, 19, 72, 235, 32, 18, 19, 252, 69, 248, 53,
+ 156, 18, 19, 252, 69, 248, 53, 153, 18, 19, 72, 248, 48, 222, 92, 232,
+ 224, 213, 122, 233, 11, 232, 224, 1, 176, 232, 224, 1, 234, 133, 232,
+ 224, 1, 243, 136, 232, 224, 1, 242, 250, 232, 224, 1, 229, 78, 232, 224,
+ 1, 251, 34, 232, 224, 1, 250, 158, 232, 224, 1, 235, 142, 232, 224, 1,
+ 235, 115, 232, 224, 1, 211, 71, 232, 224, 1, 217, 106, 232, 224, 1, 216,
+ 209, 232, 224, 1, 248, 222, 232, 224, 1, 248, 26, 232, 224, 1, 197, 232,
+ 224, 1, 190, 232, 224, 1, 225, 148, 232, 224, 1, 252, 192, 232, 224, 1,
+ 252, 19, 232, 224, 1, 185, 232, 224, 1, 191, 232, 224, 1, 205, 232, 224,
+ 1, 233, 136, 232, 224, 1, 212, 65, 232, 224, 1, 220, 103, 232, 224, 1,
+ 218, 224, 232, 224, 1, 206, 232, 224, 1, 162, 232, 224, 25, 5, 61, 232,
+ 224, 25, 5, 73, 232, 224, 25, 5, 70, 232, 224, 25, 5, 245, 210, 232, 224,
+ 25, 5, 254, 202, 232, 224, 25, 5, 226, 184, 232, 224, 25, 5, 253, 193,
+ 232, 224, 25, 5, 75, 232, 224, 25, 5, 76, 232, 224, 218, 74, 1, 191, 232,
+ 224, 218, 74, 1, 205, 232, 224, 218, 74, 1, 212, 65, 232, 224, 4, 1, 176,
+ 232, 224, 4, 1, 229, 78, 232, 224, 4, 1, 254, 76, 232, 224, 4, 1, 217,
+ 106, 232, 224, 4, 1, 197, 232, 224, 4, 1, 190, 232, 224, 4, 1, 185, 232,
+ 224, 4, 1, 205, 232, 224, 4, 1, 233, 136, 232, 224, 5, 230, 90, 232, 224,
+ 5, 234, 172, 232, 224, 5, 222, 33, 232, 224, 5, 232, 128, 232, 224, 245,
+ 32, 78, 232, 224, 224, 14, 78, 232, 224, 21, 210, 86, 232, 224, 21, 110,
+ 232, 224, 21, 105, 232, 224, 21, 158, 232, 224, 21, 161, 232, 224, 21,
+ 189, 232, 224, 21, 194, 232, 224, 21, 198, 232, 224, 21, 195, 232, 224,
+ 21, 200, 39, 233, 60, 1, 176, 39, 233, 60, 1, 211, 165, 39, 233, 60, 1,
+ 229, 78, 39, 233, 60, 1, 215, 184, 39, 233, 60, 1, 206, 39, 233, 60, 1,
+ 191, 39, 233, 60, 1, 217, 106, 39, 233, 60, 1, 216, 209, 39, 233, 60, 1,
+ 233, 136, 39, 233, 60, 1, 190, 39, 233, 60, 1, 225, 148, 39, 233, 60, 1,
+ 185, 39, 233, 60, 1, 244, 197, 39, 233, 60, 1, 214, 27, 39, 233, 60, 1,
+ 162, 39, 233, 60, 1, 224, 89, 39, 233, 60, 1, 234, 133, 39, 233, 60, 1,
+ 215, 176, 39, 233, 60, 1, 197, 39, 233, 60, 1, 61, 39, 233, 60, 1, 73,
+ 39, 233, 60, 1, 245, 210, 39, 233, 60, 1, 245, 198, 39, 233, 60, 1, 70,
+ 39, 233, 60, 1, 226, 184, 39, 233, 60, 1, 76, 39, 233, 60, 1, 214, 214,
+ 39, 233, 60, 1, 75, 39, 233, 60, 1, 253, 191, 39, 233, 60, 1, 254, 202,
+ 39, 233, 60, 1, 216, 29, 39, 233, 60, 1, 216, 28, 39, 233, 60, 1, 216,
+ 27, 39, 233, 60, 1, 216, 26, 39, 233, 60, 1, 216, 25, 166, 39, 173, 1,
+ 125, 224, 89, 166, 39, 173, 1, 121, 224, 89, 166, 39, 173, 1, 125, 176,
+ 166, 39, 173, 1, 125, 211, 165, 166, 39, 173, 1, 125, 229, 78, 166, 39,
173, 1, 121, 176, 166, 39, 173, 1, 121, 211, 165, 166, 39, 173, 1, 121,
- 229, 77, 166, 39, 173, 1, 125, 215, 183, 166, 39, 173, 1, 125, 206, 166,
- 39, 173, 1, 125, 191, 166, 39, 173, 1, 121, 215, 183, 166, 39, 173, 1,
- 121, 206, 166, 39, 173, 1, 121, 191, 166, 39, 173, 1, 125, 217, 105, 166,
- 39, 173, 1, 125, 216, 208, 166, 39, 173, 1, 125, 197, 166, 39, 173, 1,
- 121, 217, 105, 166, 39, 173, 1, 121, 216, 208, 166, 39, 173, 1, 121, 197,
- 166, 39, 173, 1, 125, 190, 166, 39, 173, 1, 125, 225, 147, 166, 39, 173,
- 1, 125, 184, 166, 39, 173, 1, 121, 190, 166, 39, 173, 1, 121, 225, 147,
- 166, 39, 173, 1, 121, 184, 166, 39, 173, 1, 125, 244, 196, 166, 39, 173,
- 1, 125, 214, 27, 166, 39, 173, 1, 125, 233, 135, 166, 39, 173, 1, 121,
- 244, 196, 166, 39, 173, 1, 121, 214, 27, 166, 39, 173, 1, 121, 233, 135,
- 166, 39, 173, 1, 125, 162, 166, 39, 173, 1, 125, 248, 221, 166, 39, 173,
- 1, 125, 252, 191, 166, 39, 173, 1, 121, 162, 166, 39, 173, 1, 121, 248,
- 221, 166, 39, 173, 1, 121, 252, 191, 166, 39, 173, 1, 125, 233, 184, 166,
- 39, 173, 1, 125, 211, 138, 166, 39, 173, 1, 121, 233, 184, 166, 39, 173,
- 1, 121, 211, 138, 166, 39, 173, 1, 125, 218, 82, 166, 39, 173, 1, 121,
- 218, 82, 166, 39, 173, 25, 5, 25, 219, 239, 166, 39, 173, 25, 5, 255, 73,
- 166, 39, 173, 25, 5, 236, 33, 166, 39, 173, 25, 5, 70, 166, 39, 173, 25,
- 5, 214, 118, 166, 39, 173, 25, 5, 75, 166, 39, 173, 25, 5, 254, 243, 166,
- 39, 173, 25, 5, 76, 166, 39, 173, 25, 5, 227, 0, 166, 39, 173, 25, 5,
- 214, 214, 166, 39, 173, 25, 5, 253, 167, 166, 39, 173, 25, 5, 255, 28,
- 166, 39, 173, 25, 5, 214, 111, 166, 39, 173, 25, 5, 226, 109, 166, 39,
- 173, 25, 5, 226, 253, 166, 39, 173, 25, 5, 214, 210, 166, 39, 173, 25, 5,
- 235, 152, 166, 39, 173, 1, 40, 214, 105, 166, 39, 173, 1, 40, 229, 79,
- 166, 39, 173, 1, 40, 230, 25, 166, 39, 173, 1, 40, 193, 166, 39, 173, 1,
- 40, 235, 23, 166, 39, 173, 1, 40, 249, 60, 166, 39, 173, 1, 40, 253, 158,
- 166, 39, 173, 138, 231, 158, 166, 39, 173, 138, 231, 157, 166, 39, 173,
+ 229, 78, 166, 39, 173, 1, 125, 215, 184, 166, 39, 173, 1, 125, 206, 166,
+ 39, 173, 1, 125, 191, 166, 39, 173, 1, 121, 215, 184, 166, 39, 173, 1,
+ 121, 206, 166, 39, 173, 1, 121, 191, 166, 39, 173, 1, 125, 217, 106, 166,
+ 39, 173, 1, 125, 216, 209, 166, 39, 173, 1, 125, 197, 166, 39, 173, 1,
+ 121, 217, 106, 166, 39, 173, 1, 121, 216, 209, 166, 39, 173, 1, 121, 197,
+ 166, 39, 173, 1, 125, 190, 166, 39, 173, 1, 125, 225, 148, 166, 39, 173,
+ 1, 125, 185, 166, 39, 173, 1, 121, 190, 166, 39, 173, 1, 121, 225, 148,
+ 166, 39, 173, 1, 121, 185, 166, 39, 173, 1, 125, 244, 197, 166, 39, 173,
+ 1, 125, 214, 27, 166, 39, 173, 1, 125, 233, 136, 166, 39, 173, 1, 121,
+ 244, 197, 166, 39, 173, 1, 121, 214, 27, 166, 39, 173, 1, 121, 233, 136,
+ 166, 39, 173, 1, 125, 162, 166, 39, 173, 1, 125, 248, 222, 166, 39, 173,
+ 1, 125, 252, 192, 166, 39, 173, 1, 121, 162, 166, 39, 173, 1, 121, 248,
+ 222, 166, 39, 173, 1, 121, 252, 192, 166, 39, 173, 1, 125, 233, 185, 166,
+ 39, 173, 1, 125, 211, 138, 166, 39, 173, 1, 121, 233, 185, 166, 39, 173,
+ 1, 121, 211, 138, 166, 39, 173, 1, 125, 218, 83, 166, 39, 173, 1, 121,
+ 218, 83, 166, 39, 173, 25, 5, 25, 219, 240, 166, 39, 173, 25, 5, 255, 74,
+ 166, 39, 173, 25, 5, 236, 34, 166, 39, 173, 25, 5, 70, 166, 39, 173, 25,
+ 5, 214, 118, 166, 39, 173, 25, 5, 75, 166, 39, 173, 25, 5, 254, 244, 166,
+ 39, 173, 25, 5, 76, 166, 39, 173, 25, 5, 227, 1, 166, 39, 173, 25, 5,
+ 214, 214, 166, 39, 173, 25, 5, 253, 168, 166, 39, 173, 25, 5, 255, 29,
+ 166, 39, 173, 25, 5, 214, 111, 166, 39, 173, 25, 5, 226, 110, 166, 39,
+ 173, 25, 5, 226, 254, 166, 39, 173, 25, 5, 214, 210, 166, 39, 173, 25, 5,
+ 235, 153, 166, 39, 173, 1, 40, 214, 105, 166, 39, 173, 1, 40, 229, 80,
+ 166, 39, 173, 1, 40, 230, 26, 166, 39, 173, 1, 40, 193, 166, 39, 173, 1,
+ 40, 235, 24, 166, 39, 173, 1, 40, 249, 61, 166, 39, 173, 1, 40, 253, 159,
+ 166, 39, 173, 138, 231, 159, 166, 39, 173, 138, 231, 158, 166, 39, 173,
21, 210, 86, 166, 39, 173, 21, 110, 166, 39, 173, 21, 105, 166, 39, 173,
21, 158, 166, 39, 173, 21, 161, 166, 39, 173, 21, 189, 166, 39, 173, 21,
194, 166, 39, 173, 21, 198, 166, 39, 173, 21, 195, 166, 39, 173, 21, 200,
- 166, 39, 173, 89, 21, 110, 166, 39, 173, 5, 233, 120, 166, 39, 173, 5,
- 233, 119, 69, 16, 225, 236, 69, 16, 230, 72, 234, 25, 69, 16, 225, 72,
- 234, 25, 69, 16, 252, 50, 234, 25, 69, 16, 251, 104, 234, 25, 69, 16,
- 224, 216, 234, 25, 69, 16, 224, 210, 234, 25, 69, 16, 224, 208, 234, 25,
- 69, 16, 224, 214, 234, 25, 69, 16, 224, 212, 234, 25, 69, 16, 248, 173,
- 234, 25, 69, 16, 248, 169, 234, 25, 69, 16, 248, 168, 234, 25, 69, 16,
- 248, 171, 234, 25, 69, 16, 248, 170, 234, 25, 69, 16, 248, 167, 234, 25,
- 69, 16, 215, 87, 69, 16, 230, 72, 222, 205, 69, 16, 225, 72, 222, 205,
- 69, 16, 252, 50, 222, 205, 69, 16, 251, 104, 222, 205, 69, 16, 224, 216,
- 222, 205, 69, 16, 224, 210, 222, 205, 69, 16, 224, 208, 222, 205, 69, 16,
- 224, 214, 222, 205, 69, 16, 224, 212, 222, 205, 69, 16, 248, 173, 222,
- 205, 69, 16, 248, 169, 222, 205, 69, 16, 248, 168, 222, 205, 69, 16, 248,
- 171, 222, 205, 69, 16, 248, 170, 222, 205, 69, 16, 248, 167, 222, 205,
- 251, 121, 1, 176, 251, 121, 1, 243, 135, 251, 121, 1, 229, 77, 251, 121,
- 1, 229, 22, 251, 121, 1, 190, 251, 121, 1, 252, 191, 251, 121, 1, 184,
- 251, 121, 1, 230, 105, 251, 121, 1, 217, 105, 251, 121, 1, 248, 221, 251,
- 121, 1, 197, 251, 121, 1, 228, 36, 251, 121, 1, 251, 33, 251, 121, 1,
- 235, 141, 251, 121, 1, 227, 165, 251, 121, 1, 227, 158, 251, 121, 1, 191,
- 251, 121, 1, 205, 251, 121, 1, 233, 135, 251, 121, 1, 214, 27, 251, 121,
- 1, 206, 251, 121, 1, 61, 251, 121, 1, 162, 251, 121, 25, 5, 73, 251, 121,
- 25, 5, 70, 251, 121, 25, 5, 75, 251, 121, 25, 5, 76, 251, 121, 25, 5,
- 254, 243, 251, 121, 226, 60, 251, 121, 245, 143, 64, 221, 172, 39, 89, 1,
- 125, 176, 39, 89, 1, 125, 234, 132, 39, 89, 1, 125, 233, 171, 39, 89, 1,
- 121, 176, 39, 89, 1, 121, 233, 171, 39, 89, 1, 121, 234, 132, 39, 89, 1,
- 229, 77, 39, 89, 1, 125, 251, 33, 39, 89, 1, 125, 250, 157, 39, 89, 1,
- 121, 251, 33, 39, 89, 1, 121, 206, 39, 89, 1, 121, 250, 157, 39, 89, 1,
- 227, 165, 39, 89, 1, 223, 140, 39, 89, 1, 125, 223, 138, 39, 89, 1, 248,
- 221, 39, 89, 1, 121, 223, 138, 39, 89, 1, 223, 149, 39, 89, 1, 125, 217,
- 105, 39, 89, 1, 125, 216, 208, 39, 89, 1, 121, 217, 105, 39, 89, 1, 121,
- 216, 208, 39, 89, 1, 197, 39, 89, 1, 252, 191, 39, 89, 1, 125, 190, 39,
- 89, 1, 125, 225, 147, 39, 89, 1, 125, 244, 196, 39, 89, 1, 121, 190, 39,
- 89, 1, 121, 244, 196, 39, 89, 1, 121, 225, 147, 39, 89, 1, 184, 39, 89,
- 1, 121, 191, 39, 89, 1, 125, 191, 39, 89, 1, 205, 39, 89, 1, 222, 137,
- 39, 89, 1, 233, 135, 39, 89, 1, 232, 93, 39, 89, 1, 212, 65, 39, 89, 1,
- 125, 220, 102, 39, 89, 1, 125, 218, 223, 39, 89, 1, 125, 206, 39, 89, 1,
- 125, 162, 39, 89, 1, 232, 184, 39, 89, 1, 61, 39, 89, 1, 121, 162, 39,
- 89, 1, 73, 39, 89, 1, 236, 33, 39, 89, 1, 70, 39, 89, 1, 214, 118, 39,
- 89, 1, 245, 209, 39, 89, 1, 226, 183, 39, 89, 1, 233, 120, 39, 89, 1,
- 242, 132, 206, 39, 89, 116, 5, 147, 205, 39, 89, 116, 5, 147, 233, 135,
- 39, 89, 116, 5, 233, 136, 217, 58, 233, 109, 39, 89, 5, 231, 204, 234,
- 231, 233, 109, 39, 89, 116, 5, 40, 229, 77, 39, 89, 116, 5, 121, 190, 39,
- 89, 116, 5, 125, 223, 139, 177, 121, 190, 39, 89, 116, 5, 184, 39, 89,
- 116, 5, 252, 191, 39, 89, 116, 5, 206, 39, 89, 5, 222, 10, 39, 89, 25, 5,
- 61, 39, 89, 25, 5, 231, 204, 221, 226, 39, 89, 25, 5, 255, 73, 39, 89,
- 25, 5, 217, 64, 255, 73, 39, 89, 25, 5, 73, 39, 89, 25, 5, 236, 33, 39,
+ 166, 39, 173, 89, 21, 110, 166, 39, 173, 5, 233, 121, 166, 39, 173, 5,
+ 233, 120, 69, 16, 225, 237, 69, 16, 230, 73, 234, 26, 69, 16, 225, 73,
+ 234, 26, 69, 16, 252, 51, 234, 26, 69, 16, 251, 105, 234, 26, 69, 16,
+ 224, 217, 234, 26, 69, 16, 224, 211, 234, 26, 69, 16, 224, 209, 234, 26,
+ 69, 16, 224, 215, 234, 26, 69, 16, 224, 213, 234, 26, 69, 16, 248, 174,
+ 234, 26, 69, 16, 248, 170, 234, 26, 69, 16, 248, 169, 234, 26, 69, 16,
+ 248, 172, 234, 26, 69, 16, 248, 171, 234, 26, 69, 16, 248, 168, 234, 26,
+ 69, 16, 215, 87, 69, 16, 230, 73, 222, 206, 69, 16, 225, 73, 222, 206,
+ 69, 16, 252, 51, 222, 206, 69, 16, 251, 105, 222, 206, 69, 16, 224, 217,
+ 222, 206, 69, 16, 224, 211, 222, 206, 69, 16, 224, 209, 222, 206, 69, 16,
+ 224, 215, 222, 206, 69, 16, 224, 213, 222, 206, 69, 16, 248, 174, 222,
+ 206, 69, 16, 248, 170, 222, 206, 69, 16, 248, 169, 222, 206, 69, 16, 248,
+ 172, 222, 206, 69, 16, 248, 171, 222, 206, 69, 16, 248, 168, 222, 206,
+ 251, 122, 1, 176, 251, 122, 1, 243, 136, 251, 122, 1, 229, 78, 251, 122,
+ 1, 229, 23, 251, 122, 1, 190, 251, 122, 1, 252, 192, 251, 122, 1, 185,
+ 251, 122, 1, 230, 106, 251, 122, 1, 217, 106, 251, 122, 1, 248, 222, 251,
+ 122, 1, 197, 251, 122, 1, 228, 37, 251, 122, 1, 251, 34, 251, 122, 1,
+ 235, 142, 251, 122, 1, 227, 166, 251, 122, 1, 227, 159, 251, 122, 1, 191,
+ 251, 122, 1, 205, 251, 122, 1, 233, 136, 251, 122, 1, 214, 27, 251, 122,
+ 1, 206, 251, 122, 1, 61, 251, 122, 1, 162, 251, 122, 25, 5, 73, 251, 122,
+ 25, 5, 70, 251, 122, 25, 5, 75, 251, 122, 25, 5, 76, 251, 122, 25, 5,
+ 254, 244, 251, 122, 226, 61, 251, 122, 245, 144, 64, 221, 173, 39, 89, 1,
+ 125, 176, 39, 89, 1, 125, 234, 133, 39, 89, 1, 125, 233, 172, 39, 89, 1,
+ 121, 176, 39, 89, 1, 121, 233, 172, 39, 89, 1, 121, 234, 133, 39, 89, 1,
+ 229, 78, 39, 89, 1, 125, 251, 34, 39, 89, 1, 125, 250, 158, 39, 89, 1,
+ 121, 251, 34, 39, 89, 1, 121, 206, 39, 89, 1, 121, 250, 158, 39, 89, 1,
+ 227, 166, 39, 89, 1, 223, 141, 39, 89, 1, 125, 223, 139, 39, 89, 1, 248,
+ 222, 39, 89, 1, 121, 223, 139, 39, 89, 1, 223, 150, 39, 89, 1, 125, 217,
+ 106, 39, 89, 1, 125, 216, 209, 39, 89, 1, 121, 217, 106, 39, 89, 1, 121,
+ 216, 209, 39, 89, 1, 197, 39, 89, 1, 252, 192, 39, 89, 1, 125, 190, 39,
+ 89, 1, 125, 225, 148, 39, 89, 1, 125, 244, 197, 39, 89, 1, 121, 190, 39,
+ 89, 1, 121, 244, 197, 39, 89, 1, 121, 225, 148, 39, 89, 1, 185, 39, 89,
+ 1, 121, 191, 39, 89, 1, 125, 191, 39, 89, 1, 205, 39, 89, 1, 222, 138,
+ 39, 89, 1, 233, 136, 39, 89, 1, 232, 94, 39, 89, 1, 212, 65, 39, 89, 1,
+ 125, 220, 103, 39, 89, 1, 125, 218, 224, 39, 89, 1, 125, 206, 39, 89, 1,
+ 125, 162, 39, 89, 1, 232, 185, 39, 89, 1, 61, 39, 89, 1, 121, 162, 39,
+ 89, 1, 73, 39, 89, 1, 236, 34, 39, 89, 1, 70, 39, 89, 1, 214, 118, 39,
+ 89, 1, 245, 210, 39, 89, 1, 226, 184, 39, 89, 1, 233, 121, 39, 89, 1,
+ 242, 133, 206, 39, 89, 116, 5, 147, 205, 39, 89, 116, 5, 147, 233, 136,
+ 39, 89, 116, 5, 233, 137, 217, 59, 233, 110, 39, 89, 5, 231, 205, 234,
+ 232, 233, 110, 39, 89, 116, 5, 40, 229, 78, 39, 89, 116, 5, 121, 190, 39,
+ 89, 116, 5, 125, 223, 140, 177, 121, 190, 39, 89, 116, 5, 185, 39, 89,
+ 116, 5, 252, 192, 39, 89, 116, 5, 206, 39, 89, 5, 222, 11, 39, 89, 25, 5,
+ 61, 39, 89, 25, 5, 231, 205, 221, 227, 39, 89, 25, 5, 255, 74, 39, 89,
+ 25, 5, 217, 65, 255, 74, 39, 89, 25, 5, 73, 39, 89, 25, 5, 236, 34, 39,
89, 25, 5, 214, 214, 39, 89, 25, 5, 214, 117, 39, 89, 25, 5, 70, 39, 89,
- 25, 5, 214, 118, 39, 89, 25, 5, 76, 39, 89, 25, 5, 227, 1, 51, 39, 89,
- 25, 5, 226, 109, 39, 89, 25, 5, 75, 39, 89, 25, 5, 254, 243, 39, 89, 25,
- 5, 226, 183, 39, 89, 25, 5, 254, 201, 39, 89, 25, 5, 89, 254, 201, 39,
- 89, 25, 5, 227, 1, 48, 39, 89, 5, 231, 204, 234, 230, 39, 89, 5, 216, 29,
- 39, 89, 5, 216, 28, 39, 89, 5, 234, 97, 216, 27, 39, 89, 5, 234, 97, 216,
- 26, 39, 89, 5, 234, 97, 216, 25, 39, 89, 5, 223, 188, 242, 45, 39, 89, 5,
- 231, 204, 221, 253, 39, 89, 5, 234, 96, 234, 215, 39, 89, 38, 249, 115,
- 247, 120, 39, 89, 241, 46, 21, 210, 86, 39, 89, 241, 46, 21, 110, 39, 89,
- 241, 46, 21, 105, 39, 89, 241, 46, 21, 158, 39, 89, 241, 46, 21, 161, 39,
- 89, 241, 46, 21, 189, 39, 89, 241, 46, 21, 194, 39, 89, 241, 46, 21, 198,
- 39, 89, 241, 46, 21, 195, 39, 89, 241, 46, 21, 200, 39, 89, 89, 21, 210,
+ 25, 5, 214, 118, 39, 89, 25, 5, 76, 39, 89, 25, 5, 227, 2, 51, 39, 89,
+ 25, 5, 226, 110, 39, 89, 25, 5, 75, 39, 89, 25, 5, 254, 244, 39, 89, 25,
+ 5, 226, 184, 39, 89, 25, 5, 254, 202, 39, 89, 25, 5, 89, 254, 202, 39,
+ 89, 25, 5, 227, 2, 48, 39, 89, 5, 231, 205, 234, 231, 39, 89, 5, 216, 30,
+ 39, 89, 5, 216, 29, 39, 89, 5, 234, 98, 216, 28, 39, 89, 5, 234, 98, 216,
+ 27, 39, 89, 5, 234, 98, 216, 26, 39, 89, 5, 223, 189, 242, 46, 39, 89, 5,
+ 231, 205, 221, 254, 39, 89, 5, 234, 97, 234, 216, 39, 89, 38, 249, 116,
+ 247, 121, 39, 89, 241, 47, 21, 210, 86, 39, 89, 241, 47, 21, 110, 39, 89,
+ 241, 47, 21, 105, 39, 89, 241, 47, 21, 158, 39, 89, 241, 47, 21, 161, 39,
+ 89, 241, 47, 21, 189, 39, 89, 241, 47, 21, 194, 39, 89, 241, 47, 21, 198,
+ 39, 89, 241, 47, 21, 195, 39, 89, 241, 47, 21, 200, 39, 89, 89, 21, 210,
86, 39, 89, 89, 21, 110, 39, 89, 89, 21, 105, 39, 89, 89, 21, 158, 39,
89, 89, 21, 161, 39, 89, 89, 21, 189, 39, 89, 89, 21, 194, 39, 89, 89,
21, 198, 39, 89, 89, 21, 195, 39, 89, 89, 21, 200, 39, 89, 5, 211, 249,
- 39, 89, 5, 211, 248, 39, 89, 5, 221, 215, 39, 89, 5, 234, 160, 39, 89, 5,
- 240, 232, 39, 89, 5, 247, 134, 39, 89, 5, 223, 49, 222, 187, 223, 149,
- 39, 89, 5, 231, 204, 211, 72, 39, 89, 5, 235, 6, 39, 89, 5, 235, 5, 39,
- 89, 5, 221, 222, 39, 89, 5, 221, 221, 39, 89, 5, 242, 9, 39, 89, 5, 251,
- 30, 102, 5, 214, 200, 223, 30, 102, 5, 214, 200, 251, 1, 102, 5, 250,
- 186, 102, 5, 218, 15, 102, 5, 251, 233, 102, 1, 254, 184, 102, 1, 254,
- 185, 217, 13, 102, 1, 236, 29, 102, 1, 236, 30, 217, 13, 102, 1, 214,
- 203, 102, 1, 214, 204, 217, 13, 102, 1, 223, 188, 223, 79, 102, 1, 223,
- 188, 223, 80, 217, 13, 102, 1, 233, 136, 233, 24, 102, 1, 233, 136, 233,
- 25, 217, 13, 102, 1, 245, 179, 102, 1, 254, 199, 102, 1, 226, 212, 102,
- 1, 226, 213, 217, 13, 102, 1, 176, 102, 1, 235, 13, 231, 207, 102, 1,
- 243, 135, 102, 1, 243, 136, 242, 161, 102, 1, 229, 77, 102, 1, 251, 33,
- 102, 1, 251, 34, 233, 123, 102, 1, 235, 141, 102, 1, 235, 142, 235, 118,
- 102, 1, 227, 165, 102, 1, 217, 106, 233, 76, 102, 1, 217, 106, 230, 67,
- 231, 207, 102, 1, 248, 222, 230, 67, 254, 145, 102, 1, 248, 222, 230, 67,
- 231, 207, 102, 1, 229, 229, 223, 152, 102, 1, 217, 105, 102, 1, 217, 106,
- 217, 35, 102, 1, 248, 221, 102, 1, 248, 222, 231, 225, 102, 1, 197, 102,
- 1, 190, 102, 1, 226, 90, 234, 226, 102, 1, 252, 191, 102, 1, 252, 192,
- 234, 172, 102, 1, 184, 102, 1, 191, 102, 1, 205, 102, 1, 233, 135, 102,
- 1, 212, 65, 102, 1, 222, 34, 222, 20, 102, 1, 222, 34, 221, 233, 102, 1,
- 206, 102, 1, 162, 102, 5, 223, 70, 102, 25, 5, 217, 13, 102, 25, 5, 214,
- 199, 102, 25, 5, 214, 200, 221, 229, 102, 25, 5, 218, 47, 102, 25, 5,
- 218, 48, 236, 21, 102, 25, 5, 223, 188, 223, 79, 102, 25, 5, 223, 188,
- 223, 80, 217, 13, 102, 25, 5, 233, 136, 233, 24, 102, 25, 5, 233, 136,
- 233, 25, 217, 13, 102, 25, 5, 217, 65, 102, 25, 5, 217, 66, 223, 79, 102,
- 25, 5, 217, 66, 217, 13, 102, 25, 5, 217, 66, 223, 80, 217, 13, 102, 25,
- 5, 225, 184, 102, 25, 5, 225, 185, 217, 13, 102, 254, 250, 254, 249, 102,
- 1, 234, 251, 221, 228, 102, 1, 234, 102, 221, 228, 102, 1, 215, 34, 221,
- 228, 102, 1, 245, 203, 221, 228, 102, 1, 214, 0, 221, 228, 102, 1, 210,
- 107, 221, 228, 102, 1, 253, 209, 221, 228, 102, 21, 210, 86, 102, 21,
+ 39, 89, 5, 211, 248, 39, 89, 5, 221, 216, 39, 89, 5, 234, 161, 39, 89, 5,
+ 240, 233, 39, 89, 5, 247, 135, 39, 89, 5, 223, 50, 222, 188, 223, 150,
+ 39, 89, 5, 231, 205, 211, 72, 39, 89, 5, 235, 7, 39, 89, 5, 235, 6, 39,
+ 89, 5, 221, 223, 39, 89, 5, 221, 222, 39, 89, 5, 242, 10, 39, 89, 5, 251,
+ 31, 102, 5, 214, 200, 223, 31, 102, 5, 214, 200, 251, 2, 102, 5, 250,
+ 187, 102, 5, 218, 16, 102, 5, 251, 234, 102, 1, 254, 185, 102, 1, 254,
+ 186, 217, 14, 102, 1, 236, 30, 102, 1, 236, 31, 217, 14, 102, 1, 214,
+ 203, 102, 1, 214, 204, 217, 14, 102, 1, 223, 189, 223, 80, 102, 1, 223,
+ 189, 223, 81, 217, 14, 102, 1, 233, 137, 233, 25, 102, 1, 233, 137, 233,
+ 26, 217, 14, 102, 1, 245, 180, 102, 1, 254, 200, 102, 1, 226, 213, 102,
+ 1, 226, 214, 217, 14, 102, 1, 176, 102, 1, 235, 14, 231, 208, 102, 1,
+ 243, 136, 102, 1, 243, 137, 242, 162, 102, 1, 229, 78, 102, 1, 251, 34,
+ 102, 1, 251, 35, 233, 124, 102, 1, 235, 142, 102, 1, 235, 143, 235, 119,
+ 102, 1, 227, 166, 102, 1, 217, 107, 233, 77, 102, 1, 217, 107, 230, 68,
+ 231, 208, 102, 1, 248, 223, 230, 68, 254, 146, 102, 1, 248, 223, 230, 68,
+ 231, 208, 102, 1, 229, 230, 223, 153, 102, 1, 217, 106, 102, 1, 217, 107,
+ 217, 36, 102, 1, 248, 222, 102, 1, 248, 223, 231, 226, 102, 1, 197, 102,
+ 1, 190, 102, 1, 226, 91, 234, 227, 102, 1, 252, 192, 102, 1, 252, 193,
+ 234, 173, 102, 1, 185, 102, 1, 191, 102, 1, 205, 102, 1, 233, 136, 102,
+ 1, 212, 65, 102, 1, 222, 35, 222, 21, 102, 1, 222, 35, 221, 234, 102, 1,
+ 206, 102, 1, 162, 102, 5, 223, 71, 102, 25, 5, 217, 14, 102, 25, 5, 214,
+ 199, 102, 25, 5, 214, 200, 221, 230, 102, 25, 5, 218, 48, 102, 25, 5,
+ 218, 49, 236, 22, 102, 25, 5, 223, 189, 223, 80, 102, 25, 5, 223, 189,
+ 223, 81, 217, 14, 102, 25, 5, 233, 137, 233, 25, 102, 25, 5, 233, 137,
+ 233, 26, 217, 14, 102, 25, 5, 217, 66, 102, 25, 5, 217, 67, 223, 80, 102,
+ 25, 5, 217, 67, 217, 14, 102, 25, 5, 217, 67, 223, 81, 217, 14, 102, 25,
+ 5, 225, 185, 102, 25, 5, 225, 186, 217, 14, 102, 254, 251, 254, 250, 102,
+ 1, 234, 252, 221, 229, 102, 1, 234, 103, 221, 229, 102, 1, 215, 34, 221,
+ 229, 102, 1, 245, 204, 221, 229, 102, 1, 214, 0, 221, 229, 102, 1, 210,
+ 107, 221, 229, 102, 1, 253, 210, 221, 229, 102, 21, 210, 86, 102, 21,
110, 102, 21, 105, 102, 21, 158, 102, 21, 161, 102, 21, 189, 102, 21,
- 194, 102, 21, 198, 102, 21, 195, 102, 21, 200, 102, 226, 29, 102, 226,
- 55, 102, 211, 238, 102, 250, 236, 226, 48, 102, 250, 236, 219, 172, 102,
- 250, 236, 226, 2, 102, 226, 54, 102, 28, 16, 247, 126, 102, 28, 16, 248,
- 51, 102, 28, 16, 246, 64, 102, 28, 16, 248, 176, 102, 28, 16, 248, 177,
- 218, 15, 102, 28, 16, 247, 205, 102, 28, 16, 248, 214, 102, 28, 16, 248,
- 33, 102, 28, 16, 248, 198, 102, 28, 16, 248, 177, 243, 57, 102, 28, 16,
- 38, 217, 9, 102, 28, 16, 38, 245, 141, 102, 28, 16, 38, 234, 167, 102,
- 28, 16, 38, 234, 169, 102, 28, 16, 38, 235, 122, 102, 28, 16, 38, 234,
- 168, 2, 235, 122, 102, 28, 16, 38, 234, 170, 2, 235, 122, 102, 28, 16,
- 38, 252, 37, 102, 28, 16, 38, 242, 165, 102, 28, 16, 222, 249, 204, 246,
- 74, 102, 28, 16, 222, 249, 204, 248, 212, 102, 28, 16, 222, 249, 250, 0,
- 215, 111, 102, 28, 16, 222, 249, 250, 0, 217, 73, 102, 28, 16, 233, 44,
- 204, 226, 43, 102, 28, 16, 233, 44, 204, 224, 139, 102, 28, 16, 233, 44,
- 250, 0, 225, 38, 102, 28, 16, 233, 44, 250, 0, 225, 26, 102, 28, 16, 233,
- 44, 204, 225, 61, 207, 5, 226, 26, 207, 5, 226, 39, 207, 5, 226, 35, 207,
- 1, 61, 207, 1, 73, 207, 1, 70, 207, 1, 254, 243, 207, 1, 76, 207, 1, 75,
- 207, 1, 245, 55, 207, 1, 176, 207, 1, 224, 88, 207, 1, 243, 135, 207, 1,
- 229, 77, 207, 1, 251, 33, 207, 1, 235, 141, 207, 1, 210, 116, 207, 1,
- 227, 165, 207, 1, 217, 105, 207, 1, 248, 221, 207, 1, 197, 207, 1, 190,
- 207, 1, 244, 196, 207, 1, 214, 27, 207, 1, 252, 191, 207, 1, 184, 207, 1,
- 191, 207, 1, 205, 207, 1, 233, 135, 207, 1, 212, 65, 207, 1, 206, 207, 1,
- 211, 165, 207, 1, 162, 207, 116, 5, 226, 52, 207, 116, 5, 226, 28, 207,
- 116, 5, 226, 25, 207, 25, 5, 226, 42, 207, 25, 5, 226, 24, 207, 25, 5,
- 226, 46, 207, 25, 5, 226, 34, 207, 25, 5, 226, 53, 207, 25, 5, 226, 44,
- 207, 5, 226, 56, 207, 5, 213, 152, 207, 116, 5, 225, 248, 184, 207, 116,
- 5, 225, 248, 212, 65, 207, 1, 234, 132, 207, 1, 217, 231, 207, 21, 210,
+ 194, 102, 21, 198, 102, 21, 195, 102, 21, 200, 102, 226, 30, 102, 226,
+ 56, 102, 211, 238, 102, 250, 237, 226, 49, 102, 250, 237, 219, 173, 102,
+ 250, 237, 226, 3, 102, 226, 55, 102, 28, 16, 247, 127, 102, 28, 16, 248,
+ 52, 102, 28, 16, 246, 65, 102, 28, 16, 248, 177, 102, 28, 16, 248, 178,
+ 218, 16, 102, 28, 16, 247, 206, 102, 28, 16, 248, 215, 102, 28, 16, 248,
+ 34, 102, 28, 16, 248, 199, 102, 28, 16, 248, 178, 243, 58, 102, 28, 16,
+ 38, 217, 10, 102, 28, 16, 38, 245, 142, 102, 28, 16, 38, 234, 168, 102,
+ 28, 16, 38, 234, 170, 102, 28, 16, 38, 235, 123, 102, 28, 16, 38, 234,
+ 169, 2, 235, 123, 102, 28, 16, 38, 234, 171, 2, 235, 123, 102, 28, 16,
+ 38, 252, 38, 102, 28, 16, 38, 242, 166, 102, 28, 16, 222, 250, 204, 246,
+ 75, 102, 28, 16, 222, 250, 204, 248, 213, 102, 28, 16, 222, 250, 250, 1,
+ 215, 112, 102, 28, 16, 222, 250, 250, 1, 217, 74, 102, 28, 16, 233, 45,
+ 204, 226, 44, 102, 28, 16, 233, 45, 204, 224, 140, 102, 28, 16, 233, 45,
+ 250, 1, 225, 39, 102, 28, 16, 233, 45, 250, 1, 225, 27, 102, 28, 16, 233,
+ 45, 204, 225, 62, 207, 5, 226, 27, 207, 5, 226, 40, 207, 5, 226, 36, 207,
+ 1, 61, 207, 1, 73, 207, 1, 70, 207, 1, 254, 244, 207, 1, 76, 207, 1, 75,
+ 207, 1, 245, 56, 207, 1, 176, 207, 1, 224, 89, 207, 1, 243, 136, 207, 1,
+ 229, 78, 207, 1, 251, 34, 207, 1, 235, 142, 207, 1, 210, 116, 207, 1,
+ 227, 166, 207, 1, 217, 106, 207, 1, 248, 222, 207, 1, 197, 207, 1, 190,
+ 207, 1, 244, 197, 207, 1, 214, 27, 207, 1, 252, 192, 207, 1, 185, 207, 1,
+ 191, 207, 1, 205, 207, 1, 233, 136, 207, 1, 212, 65, 207, 1, 206, 207, 1,
+ 211, 165, 207, 1, 162, 207, 116, 5, 226, 53, 207, 116, 5, 226, 29, 207,
+ 116, 5, 226, 26, 207, 25, 5, 226, 43, 207, 25, 5, 226, 25, 207, 25, 5,
+ 226, 47, 207, 25, 5, 226, 35, 207, 25, 5, 226, 54, 207, 25, 5, 226, 45,
+ 207, 5, 226, 57, 207, 5, 213, 152, 207, 116, 5, 225, 249, 185, 207, 116,
+ 5, 225, 249, 212, 65, 207, 1, 234, 133, 207, 1, 217, 232, 207, 21, 210,
86, 207, 21, 110, 207, 21, 105, 207, 21, 158, 207, 21, 161, 207, 21, 189,
- 207, 21, 194, 207, 21, 198, 207, 21, 195, 207, 21, 200, 207, 253, 175,
- 207, 1, 223, 52, 207, 1, 233, 7, 207, 1, 252, 18, 207, 1, 40, 235, 23,
- 207, 1, 40, 193, 252, 120, 1, 61, 252, 120, 1, 219, 164, 61, 252, 120, 1,
- 162, 252, 120, 1, 219, 164, 162, 252, 120, 1, 231, 181, 162, 252, 120, 1,
- 252, 191, 252, 120, 1, 234, 212, 252, 191, 252, 120, 1, 190, 252, 120, 1,
- 219, 164, 190, 252, 120, 1, 197, 252, 120, 1, 231, 181, 197, 252, 120, 1,
- 212, 65, 252, 120, 1, 219, 164, 212, 65, 252, 120, 1, 226, 67, 212, 65,
- 252, 120, 1, 243, 135, 252, 120, 1, 219, 164, 243, 135, 252, 120, 1, 235,
- 141, 252, 120, 1, 248, 221, 252, 120, 1, 205, 252, 120, 1, 219, 164, 205,
- 252, 120, 1, 184, 252, 120, 1, 219, 164, 184, 252, 120, 1, 219, 26, 217,
- 105, 252, 120, 1, 228, 55, 217, 105, 252, 120, 1, 206, 252, 120, 1, 219,
- 164, 206, 252, 120, 1, 231, 181, 206, 252, 120, 1, 191, 252, 120, 1, 219,
- 164, 191, 252, 120, 1, 229, 77, 252, 120, 1, 233, 135, 252, 120, 1, 219,
- 164, 233, 135, 252, 120, 1, 227, 165, 252, 120, 1, 251, 33, 252, 120, 1,
- 229, 148, 252, 120, 1, 231, 124, 252, 120, 1, 73, 252, 120, 1, 70, 252,
- 120, 5, 216, 33, 252, 120, 25, 5, 75, 252, 120, 25, 5, 226, 67, 75, 252,
- 120, 25, 5, 245, 209, 252, 120, 25, 5, 73, 252, 120, 25, 5, 234, 212, 73,
- 252, 120, 25, 5, 76, 252, 120, 25, 5, 234, 212, 76, 252, 120, 25, 5, 70,
- 252, 120, 25, 5, 104, 31, 219, 164, 206, 252, 120, 116, 5, 229, 79, 252,
- 120, 116, 5, 242, 60, 252, 120, 226, 37, 252, 120, 226, 33, 252, 120, 16,
- 251, 241, 229, 229, 231, 37, 252, 120, 16, 251, 241, 225, 64, 252, 120,
- 16, 251, 241, 235, 48, 252, 120, 16, 251, 241, 226, 37, 196, 1, 176, 196,
- 1, 234, 39, 196, 1, 234, 132, 196, 1, 243, 135, 196, 1, 242, 186, 196, 1,
- 229, 77, 196, 1, 251, 33, 196, 1, 250, 157, 196, 1, 235, 141, 196, 1,
- 227, 165, 196, 1, 217, 105, 196, 1, 216, 208, 196, 1, 248, 221, 196, 1,
- 197, 196, 1, 190, 196, 1, 225, 42, 196, 1, 225, 147, 196, 1, 244, 196,
- 196, 1, 244, 75, 196, 1, 252, 191, 196, 1, 251, 222, 196, 1, 184, 196, 1,
- 230, 168, 196, 1, 215, 183, 196, 1, 215, 175, 196, 1, 246, 38, 196, 1,
- 191, 196, 1, 205, 196, 1, 233, 135, 196, 1, 162, 196, 1, 241, 153, 196,
- 1, 214, 27, 196, 1, 206, 196, 1, 220, 102, 196, 1, 212, 65, 196, 1, 61,
- 196, 218, 73, 1, 191, 196, 218, 73, 1, 205, 196, 25, 5, 255, 73, 196, 25,
- 5, 73, 196, 25, 5, 76, 196, 25, 5, 226, 183, 196, 25, 5, 70, 196, 25, 5,
- 214, 118, 196, 25, 5, 75, 196, 116, 5, 235, 23, 196, 116, 5, 193, 196,
- 116, 5, 156, 196, 116, 5, 230, 25, 196, 116, 5, 226, 105, 196, 116, 5,
- 153, 196, 116, 5, 217, 152, 196, 116, 5, 227, 142, 196, 116, 5, 234, 230,
- 196, 5, 223, 150, 196, 5, 227, 205, 196, 224, 141, 217, 103, 196, 224,
- 141, 227, 152, 216, 120, 217, 103, 196, 224, 141, 250, 164, 196, 224,
- 141, 215, 170, 250, 164, 196, 224, 141, 215, 169, 196, 21, 210, 86, 196,
+ 207, 21, 194, 207, 21, 198, 207, 21, 195, 207, 21, 200, 207, 253, 176,
+ 207, 1, 223, 53, 207, 1, 233, 8, 207, 1, 252, 19, 207, 1, 40, 235, 24,
+ 207, 1, 40, 193, 252, 121, 1, 61, 252, 121, 1, 219, 165, 61, 252, 121, 1,
+ 162, 252, 121, 1, 219, 165, 162, 252, 121, 1, 231, 182, 162, 252, 121, 1,
+ 252, 192, 252, 121, 1, 234, 213, 252, 192, 252, 121, 1, 190, 252, 121, 1,
+ 219, 165, 190, 252, 121, 1, 197, 252, 121, 1, 231, 182, 197, 252, 121, 1,
+ 212, 65, 252, 121, 1, 219, 165, 212, 65, 252, 121, 1, 226, 68, 212, 65,
+ 252, 121, 1, 243, 136, 252, 121, 1, 219, 165, 243, 136, 252, 121, 1, 235,
+ 142, 252, 121, 1, 248, 222, 252, 121, 1, 205, 252, 121, 1, 219, 165, 205,
+ 252, 121, 1, 185, 252, 121, 1, 219, 165, 185, 252, 121, 1, 219, 27, 217,
+ 106, 252, 121, 1, 228, 56, 217, 106, 252, 121, 1, 206, 252, 121, 1, 219,
+ 165, 206, 252, 121, 1, 231, 182, 206, 252, 121, 1, 191, 252, 121, 1, 219,
+ 165, 191, 252, 121, 1, 229, 78, 252, 121, 1, 233, 136, 252, 121, 1, 219,
+ 165, 233, 136, 252, 121, 1, 227, 166, 252, 121, 1, 251, 34, 252, 121, 1,
+ 229, 149, 252, 121, 1, 231, 125, 252, 121, 1, 73, 252, 121, 1, 70, 252,
+ 121, 5, 216, 34, 252, 121, 25, 5, 75, 252, 121, 25, 5, 226, 68, 75, 252,
+ 121, 25, 5, 245, 210, 252, 121, 25, 5, 73, 252, 121, 25, 5, 234, 213, 73,
+ 252, 121, 25, 5, 76, 252, 121, 25, 5, 234, 213, 76, 252, 121, 25, 5, 70,
+ 252, 121, 25, 5, 104, 31, 219, 165, 206, 252, 121, 116, 5, 229, 80, 252,
+ 121, 116, 5, 242, 61, 252, 121, 226, 38, 252, 121, 226, 34, 252, 121, 16,
+ 251, 242, 229, 230, 231, 38, 252, 121, 16, 251, 242, 225, 65, 252, 121,
+ 16, 251, 242, 235, 49, 252, 121, 16, 251, 242, 226, 38, 196, 1, 176, 196,
+ 1, 234, 40, 196, 1, 234, 133, 196, 1, 243, 136, 196, 1, 242, 187, 196, 1,
+ 229, 78, 196, 1, 251, 34, 196, 1, 250, 158, 196, 1, 235, 142, 196, 1,
+ 227, 166, 196, 1, 217, 106, 196, 1, 216, 209, 196, 1, 248, 222, 196, 1,
+ 197, 196, 1, 190, 196, 1, 225, 43, 196, 1, 225, 148, 196, 1, 244, 197,
+ 196, 1, 244, 76, 196, 1, 252, 192, 196, 1, 251, 223, 196, 1, 185, 196, 1,
+ 230, 169, 196, 1, 215, 184, 196, 1, 215, 176, 196, 1, 246, 39, 196, 1,
+ 191, 196, 1, 205, 196, 1, 233, 136, 196, 1, 162, 196, 1, 241, 154, 196,
+ 1, 214, 27, 196, 1, 206, 196, 1, 220, 103, 196, 1, 212, 65, 196, 1, 61,
+ 196, 218, 74, 1, 191, 196, 218, 74, 1, 205, 196, 25, 5, 255, 74, 196, 25,
+ 5, 73, 196, 25, 5, 76, 196, 25, 5, 226, 184, 196, 25, 5, 70, 196, 25, 5,
+ 214, 118, 196, 25, 5, 75, 196, 116, 5, 235, 24, 196, 116, 5, 193, 196,
+ 116, 5, 156, 196, 116, 5, 230, 26, 196, 116, 5, 226, 106, 196, 116, 5,
+ 153, 196, 116, 5, 217, 153, 196, 116, 5, 227, 143, 196, 116, 5, 234, 231,
+ 196, 5, 223, 151, 196, 5, 227, 206, 196, 224, 142, 217, 104, 196, 224,
+ 142, 227, 153, 216, 121, 217, 104, 196, 224, 142, 250, 165, 196, 224,
+ 142, 215, 171, 250, 165, 196, 224, 142, 215, 170, 196, 21, 210, 86, 196,
21, 110, 196, 21, 105, 196, 21, 158, 196, 21, 161, 196, 21, 189, 196, 21,
- 194, 196, 21, 198, 196, 21, 195, 196, 21, 200, 196, 1, 215, 156, 196, 1,
- 215, 144, 196, 1, 248, 135, 226, 210, 250, 103, 21, 210, 86, 226, 210,
- 250, 103, 21, 110, 226, 210, 250, 103, 21, 105, 226, 210, 250, 103, 21,
- 158, 226, 210, 250, 103, 21, 161, 226, 210, 250, 103, 21, 189, 226, 210,
- 250, 103, 21, 194, 226, 210, 250, 103, 21, 198, 226, 210, 250, 103, 21,
- 195, 226, 210, 250, 103, 21, 200, 226, 210, 250, 103, 1, 233, 135, 226,
- 210, 250, 103, 1, 253, 206, 226, 210, 250, 103, 1, 254, 216, 226, 210,
- 250, 103, 1, 254, 115, 226, 210, 250, 103, 1, 254, 178, 226, 210, 250,
- 103, 1, 233, 134, 226, 210, 250, 103, 1, 255, 35, 226, 210, 250, 103, 1,
- 255, 36, 226, 210, 250, 103, 1, 255, 34, 226, 210, 250, 103, 1, 255, 29,
- 226, 210, 250, 103, 1, 232, 241, 226, 210, 250, 103, 1, 235, 171, 226,
- 210, 250, 103, 1, 236, 34, 226, 210, 250, 103, 1, 235, 190, 226, 210,
- 250, 103, 1, 235, 179, 226, 210, 250, 103, 1, 232, 98, 226, 210, 250,
- 103, 1, 214, 221, 226, 210, 250, 103, 1, 214, 219, 226, 210, 250, 103, 1,
- 214, 168, 226, 210, 250, 103, 1, 214, 111, 226, 210, 250, 103, 1, 233,
- 58, 226, 210, 250, 103, 1, 245, 108, 226, 210, 250, 103, 1, 245, 212,
- 226, 210, 250, 103, 1, 245, 150, 226, 210, 250, 103, 1, 245, 86, 226,
- 210, 250, 103, 1, 232, 156, 226, 210, 250, 103, 1, 226, 137, 226, 210,
- 250, 103, 1, 226, 252, 226, 210, 250, 103, 1, 226, 125, 226, 210, 250,
- 103, 1, 226, 222, 226, 210, 250, 103, 230, 103, 215, 121, 226, 210, 250,
- 103, 243, 130, 215, 122, 226, 210, 250, 103, 230, 101, 215, 122, 226,
- 210, 250, 103, 223, 92, 226, 210, 250, 103, 225, 145, 226, 210, 250, 103,
- 254, 208, 226, 210, 250, 103, 224, 141, 230, 98, 226, 210, 250, 103, 224,
- 141, 52, 230, 98, 207, 224, 141, 251, 241, 218, 8, 207, 224, 141, 251,
- 241, 226, 38, 207, 224, 141, 251, 241, 224, 129, 207, 224, 141, 251, 241,
- 251, 19, 207, 224, 141, 251, 241, 233, 8, 221, 225, 207, 224, 141, 251,
- 241, 235, 13, 221, 225, 207, 224, 141, 251, 241, 248, 222, 221, 225, 207,
- 224, 141, 251, 241, 252, 192, 221, 225, 213, 252, 138, 234, 210, 213,
- 252, 138, 220, 77, 213, 252, 138, 224, 198, 213, 252, 5, 228, 209, 213,
- 252, 5, 211, 80, 230, 222, 218, 0, 213, 252, 138, 211, 80, 254, 213, 235,
- 243, 218, 0, 213, 252, 138, 211, 80, 235, 243, 218, 0, 213, 252, 138,
- 211, 80, 234, 198, 235, 243, 218, 0, 213, 252, 138, 251, 2, 51, 213, 252,
- 138, 211, 80, 234, 198, 235, 243, 218, 1, 221, 197, 213, 252, 138, 52,
- 218, 0, 213, 252, 138, 215, 211, 218, 0, 213, 252, 138, 234, 198, 254,
- 77, 213, 252, 138, 59, 51, 213, 252, 138, 113, 170, 51, 213, 252, 138,
- 134, 170, 51, 213, 252, 138, 222, 240, 234, 209, 235, 243, 218, 0, 213,
- 252, 138, 253, 204, 235, 243, 218, 0, 213, 252, 5, 213, 148, 218, 0, 213,
- 252, 5, 213, 148, 214, 216, 213, 252, 5, 223, 49, 213, 148, 214, 216,
- 213, 252, 5, 213, 148, 254, 77, 213, 252, 5, 223, 49, 213, 148, 254, 77,
- 213, 252, 5, 213, 148, 214, 217, 2, 217, 77, 213, 252, 5, 213, 148, 254,
- 78, 2, 217, 77, 213, 252, 5, 254, 76, 254, 91, 213, 252, 5, 254, 76, 252,
- 166, 213, 252, 5, 254, 76, 214, 20, 213, 252, 5, 254, 76, 214, 21, 2,
- 217, 77, 213, 252, 5, 216, 68, 213, 252, 5, 241, 191, 199, 254, 75, 213,
- 252, 5, 199, 254, 75, 213, 252, 5, 222, 142, 199, 254, 75, 213, 252, 5,
- 254, 76, 214, 223, 230, 90, 213, 252, 5, 254, 20, 213, 252, 5, 222, 187,
- 254, 20, 213, 252, 138, 251, 2, 48, 213, 252, 5, 235, 102, 213, 252, 5,
- 214, 161, 7, 1, 4, 6, 61, 7, 1, 4, 6, 254, 243, 7, 4, 1, 215, 94, 254,
- 243, 7, 1, 4, 6, 252, 134, 253, 158, 7, 1, 4, 6, 251, 66, 7, 1, 4, 6,
- 249, 60, 7, 1, 4, 6, 245, 59, 7, 1, 4, 6, 75, 7, 4, 1, 215, 94, 204, 75,
- 7, 4, 1, 215, 94, 73, 7, 1, 4, 6, 235, 144, 7, 1, 4, 6, 235, 23, 7, 1, 4,
- 6, 233, 149, 2, 91, 7, 1, 4, 6, 193, 7, 1, 4, 6, 223, 49, 230, 25, 7, 1,
- 4, 6, 76, 7, 1, 4, 6, 204, 76, 7, 4, 1, 219, 187, 76, 7, 4, 1, 219, 187,
- 204, 76, 7, 4, 1, 219, 187, 144, 2, 91, 7, 4, 1, 215, 94, 226, 234, 7, 1,
- 4, 6, 226, 134, 7, 4, 1, 216, 14, 163, 76, 7, 4, 1, 251, 175, 163, 76, 7,
- 1, 4, 6, 226, 105, 7, 1, 4, 6, 223, 49, 153, 7, 1, 4, 6, 215, 94, 153, 7,
- 1, 4, 6, 217, 152, 7, 1, 4, 6, 70, 7, 4, 1, 219, 187, 70, 7, 4, 1, 219,
- 187, 248, 0, 70, 7, 4, 1, 219, 187, 215, 94, 193, 7, 1, 4, 6, 214, 105,
- 7, 1, 4, 6, 212, 98, 7, 1, 4, 6, 210, 159, 7, 1, 4, 6, 245, 8, 7, 1, 213,
- 135, 233, 82, 218, 250, 7, 1, 254, 196, 26, 1, 4, 6, 243, 107, 26, 1, 4,
- 6, 233, 98, 26, 1, 4, 6, 225, 108, 26, 1, 4, 6, 223, 37, 26, 1, 4, 6,
- 224, 161, 33, 1, 4, 6, 245, 174, 58, 1, 6, 61, 58, 1, 6, 254, 243, 58, 1,
- 6, 253, 158, 58, 1, 6, 252, 134, 253, 158, 58, 1, 6, 249, 60, 58, 1, 6,
- 75, 58, 1, 6, 223, 49, 75, 58, 1, 6, 243, 202, 58, 1, 6, 242, 60, 58, 1,
- 6, 73, 58, 1, 6, 235, 144, 58, 1, 6, 235, 23, 58, 1, 6, 156, 58, 1, 6,
- 193, 58, 1, 6, 230, 25, 58, 1, 6, 223, 49, 230, 25, 58, 1, 6, 76, 58, 1,
- 6, 226, 134, 58, 1, 6, 226, 105, 58, 1, 6, 153, 58, 1, 6, 217, 152, 58,
+ 194, 196, 21, 198, 196, 21, 195, 196, 21, 200, 196, 1, 215, 157, 196, 1,
+ 215, 145, 196, 1, 248, 136, 226, 211, 250, 104, 21, 210, 86, 226, 211,
+ 250, 104, 21, 110, 226, 211, 250, 104, 21, 105, 226, 211, 250, 104, 21,
+ 158, 226, 211, 250, 104, 21, 161, 226, 211, 250, 104, 21, 189, 226, 211,
+ 250, 104, 21, 194, 226, 211, 250, 104, 21, 198, 226, 211, 250, 104, 21,
+ 195, 226, 211, 250, 104, 21, 200, 226, 211, 250, 104, 1, 233, 136, 226,
+ 211, 250, 104, 1, 253, 207, 226, 211, 250, 104, 1, 254, 217, 226, 211,
+ 250, 104, 1, 254, 116, 226, 211, 250, 104, 1, 254, 179, 226, 211, 250,
+ 104, 1, 233, 135, 226, 211, 250, 104, 1, 255, 36, 226, 211, 250, 104, 1,
+ 255, 37, 226, 211, 250, 104, 1, 255, 35, 226, 211, 250, 104, 1, 255, 30,
+ 226, 211, 250, 104, 1, 232, 242, 226, 211, 250, 104, 1, 235, 172, 226,
+ 211, 250, 104, 1, 236, 35, 226, 211, 250, 104, 1, 235, 191, 226, 211,
+ 250, 104, 1, 235, 180, 226, 211, 250, 104, 1, 232, 99, 226, 211, 250,
+ 104, 1, 214, 221, 226, 211, 250, 104, 1, 214, 219, 226, 211, 250, 104, 1,
+ 214, 168, 226, 211, 250, 104, 1, 214, 111, 226, 211, 250, 104, 1, 233,
+ 59, 226, 211, 250, 104, 1, 245, 109, 226, 211, 250, 104, 1, 245, 213,
+ 226, 211, 250, 104, 1, 245, 151, 226, 211, 250, 104, 1, 245, 87, 226,
+ 211, 250, 104, 1, 232, 157, 226, 211, 250, 104, 1, 226, 138, 226, 211,
+ 250, 104, 1, 226, 253, 226, 211, 250, 104, 1, 226, 126, 226, 211, 250,
+ 104, 1, 226, 223, 226, 211, 250, 104, 230, 104, 215, 122, 226, 211, 250,
+ 104, 243, 131, 215, 123, 226, 211, 250, 104, 230, 102, 215, 123, 226,
+ 211, 250, 104, 223, 93, 226, 211, 250, 104, 225, 146, 226, 211, 250, 104,
+ 254, 209, 226, 211, 250, 104, 224, 142, 230, 99, 226, 211, 250, 104, 224,
+ 142, 52, 230, 99, 207, 224, 142, 251, 242, 218, 9, 207, 224, 142, 251,
+ 242, 226, 39, 207, 224, 142, 251, 242, 224, 130, 207, 224, 142, 251, 242,
+ 251, 20, 207, 224, 142, 251, 242, 233, 9, 221, 226, 207, 224, 142, 251,
+ 242, 235, 14, 221, 226, 207, 224, 142, 251, 242, 248, 223, 221, 226, 207,
+ 224, 142, 251, 242, 252, 193, 221, 226, 213, 252, 138, 234, 211, 213,
+ 252, 138, 220, 78, 213, 252, 138, 224, 199, 213, 252, 5, 228, 210, 213,
+ 252, 5, 211, 80, 230, 223, 218, 1, 213, 252, 138, 211, 80, 254, 214, 235,
+ 244, 218, 1, 213, 252, 138, 211, 80, 235, 244, 218, 1, 213, 252, 138,
+ 211, 80, 234, 199, 235, 244, 218, 1, 213, 252, 138, 251, 3, 51, 213, 252,
+ 138, 211, 80, 234, 199, 235, 244, 218, 2, 221, 198, 213, 252, 138, 52,
+ 218, 1, 213, 252, 138, 215, 212, 218, 1, 213, 252, 138, 234, 199, 254,
+ 78, 213, 252, 138, 59, 51, 213, 252, 138, 113, 170, 51, 213, 252, 138,
+ 134, 170, 51, 213, 252, 138, 222, 241, 234, 210, 235, 244, 218, 1, 213,
+ 252, 138, 253, 205, 235, 244, 218, 1, 213, 252, 5, 213, 148, 218, 1, 213,
+ 252, 5, 213, 148, 214, 216, 213, 252, 5, 223, 50, 213, 148, 214, 216,
+ 213, 252, 5, 213, 148, 254, 78, 213, 252, 5, 223, 50, 213, 148, 254, 78,
+ 213, 252, 5, 213, 148, 214, 217, 2, 217, 78, 213, 252, 5, 213, 148, 254,
+ 79, 2, 217, 78, 213, 252, 5, 254, 77, 254, 92, 213, 252, 5, 254, 77, 252,
+ 167, 213, 252, 5, 254, 77, 214, 20, 213, 252, 5, 254, 77, 214, 21, 2,
+ 217, 78, 213, 252, 5, 216, 69, 213, 252, 5, 241, 192, 199, 254, 76, 213,
+ 252, 5, 199, 254, 76, 213, 252, 5, 222, 143, 199, 254, 76, 213, 252, 5,
+ 254, 77, 214, 223, 230, 91, 213, 252, 5, 254, 21, 213, 252, 5, 222, 188,
+ 254, 21, 213, 252, 138, 251, 3, 48, 213, 252, 5, 235, 103, 213, 252, 5,
+ 214, 161, 7, 1, 4, 6, 61, 7, 1, 4, 6, 254, 244, 7, 4, 1, 215, 94, 254,
+ 244, 7, 1, 4, 6, 252, 135, 253, 159, 7, 1, 4, 6, 251, 67, 7, 1, 4, 6,
+ 249, 61, 7, 1, 4, 6, 245, 60, 7, 1, 4, 6, 75, 7, 4, 1, 215, 94, 204, 75,
+ 7, 4, 1, 215, 94, 73, 7, 1, 4, 6, 235, 145, 7, 1, 4, 6, 235, 24, 7, 1, 4,
+ 6, 233, 150, 2, 91, 7, 1, 4, 6, 193, 7, 1, 4, 6, 223, 50, 230, 26, 7, 1,
+ 4, 6, 76, 7, 1, 4, 6, 204, 76, 7, 4, 1, 219, 188, 76, 7, 4, 1, 219, 188,
+ 204, 76, 7, 4, 1, 219, 188, 144, 2, 91, 7, 4, 1, 215, 94, 226, 235, 7, 1,
+ 4, 6, 226, 135, 7, 4, 1, 216, 15, 163, 76, 7, 4, 1, 251, 176, 163, 76, 7,
+ 1, 4, 6, 226, 106, 7, 1, 4, 6, 223, 50, 153, 7, 1, 4, 6, 215, 94, 153, 7,
+ 1, 4, 6, 217, 153, 7, 1, 4, 6, 70, 7, 4, 1, 219, 188, 70, 7, 4, 1, 219,
+ 188, 248, 1, 70, 7, 4, 1, 219, 188, 215, 94, 193, 7, 1, 4, 6, 214, 105,
+ 7, 1, 4, 6, 212, 98, 7, 1, 4, 6, 210, 159, 7, 1, 4, 6, 245, 9, 7, 1, 213,
+ 135, 233, 83, 218, 251, 7, 1, 254, 197, 26, 1, 4, 6, 243, 108, 26, 1, 4,
+ 6, 233, 99, 26, 1, 4, 6, 225, 109, 26, 1, 4, 6, 223, 38, 26, 1, 4, 6,
+ 224, 162, 33, 1, 4, 6, 245, 175, 58, 1, 6, 61, 58, 1, 6, 254, 244, 58, 1,
+ 6, 253, 159, 58, 1, 6, 252, 135, 253, 159, 58, 1, 6, 249, 61, 58, 1, 6,
+ 75, 58, 1, 6, 223, 50, 75, 58, 1, 6, 243, 203, 58, 1, 6, 242, 61, 58, 1,
+ 6, 73, 58, 1, 6, 235, 145, 58, 1, 6, 235, 24, 58, 1, 6, 156, 58, 1, 6,
+ 193, 58, 1, 6, 230, 26, 58, 1, 6, 223, 50, 230, 26, 58, 1, 6, 76, 58, 1,
+ 6, 226, 135, 58, 1, 6, 226, 106, 58, 1, 6, 153, 58, 1, 6, 217, 153, 58,
1, 6, 70, 58, 1, 6, 212, 98, 58, 1, 4, 61, 58, 1, 4, 215, 94, 61, 58, 1,
- 4, 254, 143, 58, 1, 4, 215, 94, 254, 243, 58, 1, 4, 253, 158, 58, 1, 4,
- 249, 60, 58, 1, 4, 75, 58, 1, 4, 221, 195, 58, 1, 4, 204, 75, 58, 1, 4,
- 215, 94, 204, 75, 58, 1, 4, 243, 202, 58, 1, 4, 215, 94, 73, 58, 1, 4,
- 235, 23, 58, 1, 4, 193, 58, 1, 4, 245, 138, 58, 1, 4, 76, 58, 1, 4, 204,
- 76, 58, 1, 4, 216, 14, 163, 76, 58, 1, 4, 251, 175, 163, 76, 58, 1, 4,
- 226, 105, 58, 1, 4, 217, 152, 58, 1, 4, 70, 58, 1, 4, 219, 187, 70, 58,
- 1, 4, 215, 94, 193, 58, 1, 4, 214, 105, 58, 1, 4, 254, 196, 58, 1, 4,
- 252, 26, 58, 1, 4, 26, 243, 107, 58, 1, 4, 248, 54, 58, 1, 4, 26, 225,
- 133, 58, 1, 4, 250, 110, 7, 218, 65, 4, 1, 73, 7, 218, 65, 4, 1, 153, 7,
- 218, 65, 4, 1, 70, 7, 218, 65, 4, 1, 214, 105, 26, 218, 65, 4, 1, 252,
- 26, 26, 218, 65, 4, 1, 243, 107, 26, 218, 65, 4, 1, 223, 37, 26, 218, 65,
- 4, 1, 225, 133, 26, 218, 65, 4, 1, 250, 110, 7, 4, 1, 214, 214, 7, 4, 1,
- 57, 2, 230, 224, 182, 7, 4, 1, 249, 61, 2, 230, 224, 182, 7, 4, 1, 245,
- 7, 2, 230, 224, 182, 7, 4, 1, 232, 50, 2, 230, 224, 182, 7, 4, 1, 230,
- 26, 2, 230, 224, 182, 7, 4, 1, 226, 106, 2, 230, 224, 182, 7, 4, 1, 223,
- 224, 2, 230, 224, 182, 7, 4, 1, 223, 224, 2, 244, 88, 22, 230, 224, 182,
- 7, 4, 1, 222, 92, 2, 230, 224, 182, 7, 4, 1, 217, 153, 2, 230, 224, 182,
- 7, 4, 1, 210, 160, 2, 230, 224, 182, 7, 4, 1, 215, 94, 243, 202, 58, 1,
- 33, 245, 150, 7, 4, 1, 235, 213, 243, 202, 7, 4, 1, 216, 211, 2, 218,
- 107, 7, 4, 6, 1, 240, 154, 2, 91, 7, 4, 1, 235, 186, 2, 91, 7, 4, 1, 226,
- 106, 2, 91, 7, 4, 6, 1, 104, 2, 91, 7, 4, 1, 214, 158, 2, 91, 7, 4, 1,
- 57, 2, 226, 66, 103, 7, 4, 1, 249, 61, 2, 226, 66, 103, 7, 4, 1, 245, 7,
- 2, 226, 66, 103, 7, 4, 1, 243, 203, 2, 226, 66, 103, 7, 4, 1, 235, 24, 2,
- 226, 66, 103, 7, 4, 1, 233, 149, 2, 226, 66, 103, 7, 4, 1, 232, 50, 2,
- 226, 66, 103, 7, 4, 1, 230, 26, 2, 226, 66, 103, 7, 4, 1, 226, 106, 2,
- 226, 66, 103, 7, 4, 1, 223, 224, 2, 226, 66, 103, 7, 4, 1, 222, 92, 2,
- 226, 66, 103, 7, 4, 1, 245, 76, 2, 226, 66, 103, 7, 4, 1, 214, 106, 2,
- 226, 66, 103, 7, 4, 1, 211, 179, 2, 226, 66, 103, 7, 4, 1, 210, 160, 2,
- 226, 66, 103, 7, 4, 1, 115, 2, 223, 55, 103, 7, 4, 1, 254, 144, 2, 223,
- 55, 103, 7, 4, 1, 249, 61, 2, 241, 52, 22, 217, 77, 7, 4, 1, 160, 2, 223,
- 55, 103, 7, 4, 1, 204, 160, 2, 223, 55, 103, 7, 4, 1, 223, 49, 204, 160,
- 2, 223, 55, 103, 7, 4, 1, 221, 196, 2, 223, 55, 103, 7, 4, 1, 240, 154,
- 2, 223, 55, 103, 7, 4, 1, 204, 144, 2, 223, 55, 103, 7, 4, 1, 245, 76, 2,
- 223, 55, 103, 7, 4, 1, 104, 2, 223, 55, 103, 7, 4, 1, 245, 9, 2, 223, 55,
- 103, 58, 1, 4, 215, 94, 254, 143, 58, 1, 4, 251, 66, 58, 1, 4, 251, 67,
- 2, 249, 100, 58, 1, 4, 245, 59, 58, 1, 4, 223, 49, 204, 75, 58, 1, 4,
- 245, 6, 58, 1, 4, 247, 119, 235, 145, 2, 91, 58, 1, 4, 119, 243, 202, 58,
- 1, 4, 215, 94, 242, 60, 58, 1, 4, 240, 154, 2, 91, 58, 1, 4, 235, 185,
- 58, 1, 4, 6, 73, 58, 1, 4, 6, 240, 154, 2, 91, 58, 1, 4, 235, 145, 2,
- 249, 127, 58, 1, 4, 233, 149, 2, 223, 55, 103, 58, 1, 4, 233, 149, 2,
- 226, 66, 103, 58, 1, 4, 6, 156, 58, 1, 4, 232, 50, 2, 103, 58, 1, 4, 215,
- 94, 232, 50, 2, 199, 233, 36, 58, 1, 4, 230, 26, 2, 43, 103, 58, 1, 4,
- 230, 26, 2, 223, 55, 103, 58, 1, 4, 6, 230, 25, 58, 1, 4, 252, 134, 76,
- 58, 1, 4, 225, 133, 58, 1, 4, 222, 92, 2, 103, 58, 1, 4, 245, 75, 58, 1,
- 4, 217, 153, 2, 226, 66, 103, 58, 1, 4, 104, 130, 58, 1, 4, 214, 157, 58,
+ 4, 254, 144, 58, 1, 4, 215, 94, 254, 244, 58, 1, 4, 253, 159, 58, 1, 4,
+ 249, 61, 58, 1, 4, 75, 58, 1, 4, 221, 196, 58, 1, 4, 204, 75, 58, 1, 4,
+ 215, 94, 204, 75, 58, 1, 4, 243, 203, 58, 1, 4, 215, 94, 73, 58, 1, 4,
+ 235, 24, 58, 1, 4, 193, 58, 1, 4, 245, 139, 58, 1, 4, 76, 58, 1, 4, 204,
+ 76, 58, 1, 4, 216, 15, 163, 76, 58, 1, 4, 251, 176, 163, 76, 58, 1, 4,
+ 226, 106, 58, 1, 4, 217, 153, 58, 1, 4, 70, 58, 1, 4, 219, 188, 70, 58,
+ 1, 4, 215, 94, 193, 58, 1, 4, 214, 105, 58, 1, 4, 254, 197, 58, 1, 4,
+ 252, 27, 58, 1, 4, 26, 243, 108, 58, 1, 4, 248, 55, 58, 1, 4, 26, 225,
+ 134, 58, 1, 4, 250, 111, 7, 218, 66, 4, 1, 73, 7, 218, 66, 4, 1, 153, 7,
+ 218, 66, 4, 1, 70, 7, 218, 66, 4, 1, 214, 105, 26, 218, 66, 4, 1, 252,
+ 27, 26, 218, 66, 4, 1, 243, 108, 26, 218, 66, 4, 1, 223, 38, 26, 218, 66,
+ 4, 1, 225, 134, 26, 218, 66, 4, 1, 250, 111, 7, 4, 1, 214, 214, 7, 4, 1,
+ 57, 2, 230, 225, 183, 7, 4, 1, 249, 62, 2, 230, 225, 183, 7, 4, 1, 245,
+ 8, 2, 230, 225, 183, 7, 4, 1, 232, 51, 2, 230, 225, 183, 7, 4, 1, 230,
+ 27, 2, 230, 225, 183, 7, 4, 1, 226, 107, 2, 230, 225, 183, 7, 4, 1, 223,
+ 225, 2, 230, 225, 183, 7, 4, 1, 223, 225, 2, 244, 89, 22, 230, 225, 183,
+ 7, 4, 1, 222, 93, 2, 230, 225, 183, 7, 4, 1, 217, 154, 2, 230, 225, 183,
+ 7, 4, 1, 210, 160, 2, 230, 225, 183, 7, 4, 1, 215, 94, 243, 203, 58, 1,
+ 33, 245, 151, 7, 4, 1, 235, 214, 243, 203, 7, 4, 1, 216, 212, 2, 218,
+ 108, 7, 4, 6, 1, 240, 155, 2, 91, 7, 4, 1, 235, 187, 2, 91, 7, 4, 1, 226,
+ 107, 2, 91, 7, 4, 6, 1, 104, 2, 91, 7, 4, 1, 214, 158, 2, 91, 7, 4, 1,
+ 57, 2, 226, 67, 103, 7, 4, 1, 249, 62, 2, 226, 67, 103, 7, 4, 1, 245, 8,
+ 2, 226, 67, 103, 7, 4, 1, 243, 204, 2, 226, 67, 103, 7, 4, 1, 235, 25, 2,
+ 226, 67, 103, 7, 4, 1, 233, 150, 2, 226, 67, 103, 7, 4, 1, 232, 51, 2,
+ 226, 67, 103, 7, 4, 1, 230, 27, 2, 226, 67, 103, 7, 4, 1, 226, 107, 2,
+ 226, 67, 103, 7, 4, 1, 223, 225, 2, 226, 67, 103, 7, 4, 1, 222, 93, 2,
+ 226, 67, 103, 7, 4, 1, 245, 77, 2, 226, 67, 103, 7, 4, 1, 214, 106, 2,
+ 226, 67, 103, 7, 4, 1, 211, 179, 2, 226, 67, 103, 7, 4, 1, 210, 160, 2,
+ 226, 67, 103, 7, 4, 1, 115, 2, 223, 56, 103, 7, 4, 1, 254, 145, 2, 223,
+ 56, 103, 7, 4, 1, 249, 62, 2, 241, 53, 22, 217, 78, 7, 4, 1, 160, 2, 223,
+ 56, 103, 7, 4, 1, 204, 160, 2, 223, 56, 103, 7, 4, 1, 223, 50, 204, 160,
+ 2, 223, 56, 103, 7, 4, 1, 221, 197, 2, 223, 56, 103, 7, 4, 1, 240, 155,
+ 2, 223, 56, 103, 7, 4, 1, 204, 144, 2, 223, 56, 103, 7, 4, 1, 245, 77, 2,
+ 223, 56, 103, 7, 4, 1, 104, 2, 223, 56, 103, 7, 4, 1, 245, 10, 2, 223,
+ 56, 103, 58, 1, 4, 215, 94, 254, 144, 58, 1, 4, 251, 67, 58, 1, 4, 251,
+ 68, 2, 249, 101, 58, 1, 4, 245, 60, 58, 1, 4, 223, 50, 204, 75, 58, 1, 4,
+ 245, 7, 58, 1, 4, 247, 120, 235, 146, 2, 91, 58, 1, 4, 119, 243, 203, 58,
+ 1, 4, 215, 94, 242, 61, 58, 1, 4, 240, 155, 2, 91, 58, 1, 4, 235, 186,
+ 58, 1, 4, 6, 73, 58, 1, 4, 6, 240, 155, 2, 91, 58, 1, 4, 235, 146, 2,
+ 249, 128, 58, 1, 4, 233, 150, 2, 223, 56, 103, 58, 1, 4, 233, 150, 2,
+ 226, 67, 103, 58, 1, 4, 6, 156, 58, 1, 4, 232, 51, 2, 103, 58, 1, 4, 215,
+ 94, 232, 51, 2, 199, 233, 37, 58, 1, 4, 230, 27, 2, 43, 103, 58, 1, 4,
+ 230, 27, 2, 223, 56, 103, 58, 1, 4, 6, 230, 26, 58, 1, 4, 252, 135, 76,
+ 58, 1, 4, 225, 134, 58, 1, 4, 222, 93, 2, 103, 58, 1, 4, 245, 76, 58, 1,
+ 4, 217, 154, 2, 226, 67, 103, 58, 1, 4, 104, 130, 58, 1, 4, 214, 157, 58,
1, 4, 6, 70, 58, 1, 4, 214, 106, 2, 103, 58, 1, 4, 215, 94, 214, 105, 58,
- 1, 4, 210, 159, 58, 1, 4, 210, 160, 2, 223, 55, 103, 58, 1, 4, 210, 160,
- 2, 249, 100, 58, 1, 4, 245, 8, 58, 1, 4, 216, 179, 38, 246, 118, 242,
- 137, 255, 14, 38, 246, 118, 255, 3, 255, 14, 38, 219, 69, 51, 38, 218, 6,
- 78, 38, 231, 231, 38, 242, 134, 38, 231, 229, 38, 255, 1, 38, 242, 135,
- 38, 255, 2, 38, 7, 4, 1, 223, 224, 51, 38, 251, 145, 38, 231, 230, 38,
- 52, 250, 31, 48, 38, 226, 225, 48, 38, 210, 35, 51, 38, 235, 172, 51, 38,
- 214, 151, 48, 38, 214, 134, 48, 38, 7, 4, 1, 244, 63, 204, 115, 48, 38,
- 7, 4, 1, 254, 243, 38, 7, 4, 1, 254, 73, 38, 7, 4, 1, 253, 176, 38, 7, 4,
- 1, 251, 67, 250, 183, 38, 7, 4, 1, 235, 213, 249, 60, 38, 7, 4, 1, 245,
- 59, 38, 7, 4, 1, 243, 202, 38, 7, 1, 4, 6, 243, 202, 38, 7, 4, 1, 235,
- 23, 38, 7, 4, 1, 156, 38, 7, 1, 4, 6, 156, 38, 7, 1, 4, 6, 193, 38, 7, 4,
- 1, 230, 25, 38, 7, 1, 4, 6, 230, 25, 38, 7, 1, 4, 6, 153, 38, 7, 4, 1,
- 223, 224, 222, 186, 38, 7, 4, 1, 222, 91, 38, 7, 4, 1, 199, 222, 91, 38,
- 7, 4, 1, 210, 159, 38, 52, 235, 193, 251, 147, 51, 38, 254, 148, 128,
- 216, 42, 51, 38, 43, 253, 250, 48, 38, 44, 253, 250, 22, 124, 253, 250,
- 51, 7, 6, 1, 115, 2, 222, 234, 51, 7, 4, 1, 115, 2, 222, 234, 51, 7, 6,
+ 1, 4, 210, 159, 58, 1, 4, 210, 160, 2, 223, 56, 103, 58, 1, 4, 210, 160,
+ 2, 249, 101, 58, 1, 4, 245, 9, 58, 1, 4, 216, 180, 38, 246, 119, 242,
+ 138, 255, 15, 38, 246, 119, 255, 4, 255, 15, 38, 219, 70, 51, 38, 218, 7,
+ 78, 38, 231, 232, 38, 242, 135, 38, 231, 230, 38, 255, 2, 38, 242, 136,
+ 38, 255, 3, 38, 7, 4, 1, 223, 225, 51, 38, 251, 146, 38, 231, 231, 38,
+ 52, 250, 32, 48, 38, 226, 226, 48, 38, 210, 35, 51, 38, 235, 173, 51, 38,
+ 214, 151, 48, 38, 214, 134, 48, 38, 7, 4, 1, 244, 64, 204, 115, 48, 38,
+ 7, 4, 1, 254, 244, 38, 7, 4, 1, 254, 74, 38, 7, 4, 1, 253, 177, 38, 7, 4,
+ 1, 251, 68, 250, 184, 38, 7, 4, 1, 235, 214, 249, 61, 38, 7, 4, 1, 245,
+ 60, 38, 7, 4, 1, 243, 203, 38, 7, 1, 4, 6, 243, 203, 38, 7, 4, 1, 235,
+ 24, 38, 7, 4, 1, 156, 38, 7, 1, 4, 6, 156, 38, 7, 1, 4, 6, 193, 38, 7, 4,
+ 1, 230, 26, 38, 7, 1, 4, 6, 230, 26, 38, 7, 1, 4, 6, 153, 38, 7, 4, 1,
+ 223, 225, 222, 187, 38, 7, 4, 1, 222, 92, 38, 7, 4, 1, 199, 222, 92, 38,
+ 7, 4, 1, 210, 159, 38, 52, 235, 194, 251, 148, 51, 38, 254, 149, 128,
+ 216, 43, 51, 38, 43, 253, 251, 48, 38, 44, 253, 251, 22, 124, 253, 251,
+ 51, 7, 6, 1, 115, 2, 222, 235, 51, 7, 4, 1, 115, 2, 222, 235, 51, 7, 6,
1, 57, 2, 59, 48, 7, 4, 1, 57, 2, 59, 48, 7, 6, 1, 57, 2, 59, 51, 7, 4,
- 1, 57, 2, 59, 51, 7, 6, 1, 57, 2, 232, 214, 51, 7, 4, 1, 57, 2, 232, 214,
- 51, 7, 6, 1, 251, 67, 2, 250, 184, 22, 142, 7, 4, 1, 251, 67, 2, 250,
- 184, 22, 142, 7, 6, 1, 249, 61, 2, 59, 48, 7, 4, 1, 249, 61, 2, 59, 48,
- 7, 6, 1, 249, 61, 2, 59, 51, 7, 4, 1, 249, 61, 2, 59, 51, 7, 6, 1, 249,
- 61, 2, 232, 214, 51, 7, 4, 1, 249, 61, 2, 232, 214, 51, 7, 6, 1, 249, 61,
- 2, 250, 183, 7, 4, 1, 249, 61, 2, 250, 183, 7, 6, 1, 249, 61, 2, 250, 31,
- 51, 7, 4, 1, 249, 61, 2, 250, 31, 51, 7, 6, 1, 160, 2, 231, 233, 22, 242,
- 136, 7, 4, 1, 160, 2, 231, 233, 22, 242, 136, 7, 6, 1, 160, 2, 231, 233,
- 22, 142, 7, 4, 1, 160, 2, 231, 233, 22, 142, 7, 6, 1, 160, 2, 250, 31,
- 51, 7, 4, 1, 160, 2, 250, 31, 51, 7, 6, 1, 160, 2, 216, 89, 51, 7, 4, 1,
- 160, 2, 216, 89, 51, 7, 6, 1, 160, 2, 250, 184, 22, 251, 146, 7, 4, 1,
- 160, 2, 250, 184, 22, 251, 146, 7, 6, 1, 245, 7, 2, 59, 48, 7, 4, 1, 245,
- 7, 2, 59, 48, 7, 6, 1, 243, 203, 2, 231, 232, 7, 4, 1, 243, 203, 2, 231,
- 232, 7, 6, 1, 242, 61, 2, 59, 48, 7, 4, 1, 242, 61, 2, 59, 48, 7, 6, 1,
- 242, 61, 2, 59, 51, 7, 4, 1, 242, 61, 2, 59, 51, 7, 6, 1, 242, 61, 2,
- 248, 1, 7, 4, 1, 242, 61, 2, 248, 1, 7, 6, 1, 242, 61, 2, 250, 183, 7, 4,
- 1, 242, 61, 2, 250, 183, 7, 6, 1, 242, 61, 2, 251, 147, 51, 7, 4, 1, 242,
- 61, 2, 251, 147, 51, 7, 6, 1, 240, 154, 2, 216, 89, 51, 7, 4, 1, 240,
- 154, 2, 216, 89, 51, 7, 6, 1, 240, 154, 2, 248, 2, 22, 142, 7, 4, 1, 240,
- 154, 2, 248, 2, 22, 142, 7, 6, 1, 235, 24, 2, 142, 7, 4, 1, 235, 24, 2,
- 142, 7, 6, 1, 235, 24, 2, 59, 51, 7, 4, 1, 235, 24, 2, 59, 51, 7, 6, 1,
- 235, 24, 2, 232, 214, 51, 7, 4, 1, 235, 24, 2, 232, 214, 51, 7, 6, 1,
- 233, 149, 2, 59, 51, 7, 4, 1, 233, 149, 2, 59, 51, 7, 6, 1, 233, 149, 2,
- 59, 252, 43, 22, 231, 232, 7, 4, 1, 233, 149, 2, 59, 252, 43, 22, 231,
- 232, 7, 6, 1, 233, 149, 2, 232, 214, 51, 7, 4, 1, 233, 149, 2, 232, 214,
- 51, 7, 6, 1, 233, 149, 2, 250, 31, 51, 7, 4, 1, 233, 149, 2, 250, 31, 51,
- 7, 6, 1, 232, 50, 2, 142, 7, 4, 1, 232, 50, 2, 142, 7, 6, 1, 232, 50, 2,
- 59, 48, 7, 4, 1, 232, 50, 2, 59, 48, 7, 6, 1, 232, 50, 2, 59, 51, 7, 4,
- 1, 232, 50, 2, 59, 51, 7, 6, 1, 230, 26, 2, 59, 48, 7, 4, 1, 230, 26, 2,
- 59, 48, 7, 6, 1, 230, 26, 2, 59, 51, 7, 4, 1, 230, 26, 2, 59, 51, 7, 6,
- 1, 230, 26, 2, 232, 214, 51, 7, 4, 1, 230, 26, 2, 232, 214, 51, 7, 6, 1,
- 230, 26, 2, 250, 31, 51, 7, 4, 1, 230, 26, 2, 250, 31, 51, 7, 6, 1, 144,
- 2, 216, 89, 22, 142, 7, 4, 1, 144, 2, 216, 89, 22, 142, 7, 6, 1, 144, 2,
- 216, 89, 22, 248, 1, 7, 4, 1, 144, 2, 216, 89, 22, 248, 1, 7, 6, 1, 144,
- 2, 231, 233, 22, 242, 136, 7, 4, 1, 144, 2, 231, 233, 22, 242, 136, 7, 6,
- 1, 144, 2, 231, 233, 22, 142, 7, 4, 1, 144, 2, 231, 233, 22, 142, 7, 6,
- 1, 226, 106, 2, 142, 7, 4, 1, 226, 106, 2, 142, 7, 6, 1, 226, 106, 2, 59,
- 48, 7, 4, 1, 226, 106, 2, 59, 48, 7, 6, 1, 223, 224, 2, 59, 48, 7, 4, 1,
- 223, 224, 2, 59, 48, 7, 6, 1, 223, 224, 2, 59, 51, 7, 4, 1, 223, 224, 2,
- 59, 51, 7, 6, 1, 223, 224, 2, 59, 252, 43, 22, 231, 232, 7, 4, 1, 223,
- 224, 2, 59, 252, 43, 22, 231, 232, 7, 6, 1, 223, 224, 2, 232, 214, 51, 7,
- 4, 1, 223, 224, 2, 232, 214, 51, 7, 6, 1, 222, 92, 2, 59, 48, 7, 4, 1,
- 222, 92, 2, 59, 48, 7, 6, 1, 222, 92, 2, 59, 51, 7, 4, 1, 222, 92, 2, 59,
- 51, 7, 6, 1, 222, 92, 2, 255, 3, 22, 59, 48, 7, 4, 1, 222, 92, 2, 255, 3,
- 22, 59, 48, 7, 6, 1, 222, 92, 2, 250, 235, 22, 59, 48, 7, 4, 1, 222, 92,
- 2, 250, 235, 22, 59, 48, 7, 6, 1, 222, 92, 2, 59, 252, 43, 22, 59, 48, 7,
- 4, 1, 222, 92, 2, 59, 252, 43, 22, 59, 48, 7, 6, 1, 217, 153, 2, 59, 48,
- 7, 4, 1, 217, 153, 2, 59, 48, 7, 6, 1, 217, 153, 2, 59, 51, 7, 4, 1, 217,
- 153, 2, 59, 51, 7, 6, 1, 217, 153, 2, 232, 214, 51, 7, 4, 1, 217, 153, 2,
- 232, 214, 51, 7, 6, 1, 217, 153, 2, 250, 31, 51, 7, 4, 1, 217, 153, 2,
- 250, 31, 51, 7, 6, 1, 104, 2, 248, 2, 51, 7, 4, 1, 104, 2, 248, 2, 51, 7,
- 6, 1, 104, 2, 216, 89, 51, 7, 4, 1, 104, 2, 216, 89, 51, 7, 6, 1, 104, 2,
- 250, 31, 51, 7, 4, 1, 104, 2, 250, 31, 51, 7, 6, 1, 104, 2, 216, 89, 22,
- 142, 7, 4, 1, 104, 2, 216, 89, 22, 142, 7, 6, 1, 104, 2, 231, 233, 22,
- 248, 1, 7, 4, 1, 104, 2, 231, 233, 22, 248, 1, 7, 6, 1, 214, 106, 2, 182,
- 7, 4, 1, 214, 106, 2, 182, 7, 6, 1, 214, 106, 2, 59, 51, 7, 4, 1, 214,
- 106, 2, 59, 51, 7, 6, 1, 212, 99, 2, 242, 136, 7, 4, 1, 212, 99, 2, 242,
- 136, 7, 6, 1, 212, 99, 2, 142, 7, 4, 1, 212, 99, 2, 142, 7, 6, 1, 212,
- 99, 2, 248, 1, 7, 4, 1, 212, 99, 2, 248, 1, 7, 6, 1, 212, 99, 2, 59, 48,
+ 1, 57, 2, 59, 51, 7, 6, 1, 57, 2, 232, 215, 51, 7, 4, 1, 57, 2, 232, 215,
+ 51, 7, 6, 1, 251, 68, 2, 250, 185, 22, 142, 7, 4, 1, 251, 68, 2, 250,
+ 185, 22, 142, 7, 6, 1, 249, 62, 2, 59, 48, 7, 4, 1, 249, 62, 2, 59, 48,
+ 7, 6, 1, 249, 62, 2, 59, 51, 7, 4, 1, 249, 62, 2, 59, 51, 7, 6, 1, 249,
+ 62, 2, 232, 215, 51, 7, 4, 1, 249, 62, 2, 232, 215, 51, 7, 6, 1, 249, 62,
+ 2, 250, 184, 7, 4, 1, 249, 62, 2, 250, 184, 7, 6, 1, 249, 62, 2, 250, 32,
+ 51, 7, 4, 1, 249, 62, 2, 250, 32, 51, 7, 6, 1, 160, 2, 231, 234, 22, 242,
+ 137, 7, 4, 1, 160, 2, 231, 234, 22, 242, 137, 7, 6, 1, 160, 2, 231, 234,
+ 22, 142, 7, 4, 1, 160, 2, 231, 234, 22, 142, 7, 6, 1, 160, 2, 250, 32,
+ 51, 7, 4, 1, 160, 2, 250, 32, 51, 7, 6, 1, 160, 2, 216, 90, 51, 7, 4, 1,
+ 160, 2, 216, 90, 51, 7, 6, 1, 160, 2, 250, 185, 22, 251, 147, 7, 4, 1,
+ 160, 2, 250, 185, 22, 251, 147, 7, 6, 1, 245, 8, 2, 59, 48, 7, 4, 1, 245,
+ 8, 2, 59, 48, 7, 6, 1, 243, 204, 2, 231, 233, 7, 4, 1, 243, 204, 2, 231,
+ 233, 7, 6, 1, 242, 62, 2, 59, 48, 7, 4, 1, 242, 62, 2, 59, 48, 7, 6, 1,
+ 242, 62, 2, 59, 51, 7, 4, 1, 242, 62, 2, 59, 51, 7, 6, 1, 242, 62, 2,
+ 248, 2, 7, 4, 1, 242, 62, 2, 248, 2, 7, 6, 1, 242, 62, 2, 250, 184, 7, 4,
+ 1, 242, 62, 2, 250, 184, 7, 6, 1, 242, 62, 2, 251, 148, 51, 7, 4, 1, 242,
+ 62, 2, 251, 148, 51, 7, 6, 1, 240, 155, 2, 216, 90, 51, 7, 4, 1, 240,
+ 155, 2, 216, 90, 51, 7, 6, 1, 240, 155, 2, 248, 3, 22, 142, 7, 4, 1, 240,
+ 155, 2, 248, 3, 22, 142, 7, 6, 1, 235, 25, 2, 142, 7, 4, 1, 235, 25, 2,
+ 142, 7, 6, 1, 235, 25, 2, 59, 51, 7, 4, 1, 235, 25, 2, 59, 51, 7, 6, 1,
+ 235, 25, 2, 232, 215, 51, 7, 4, 1, 235, 25, 2, 232, 215, 51, 7, 6, 1,
+ 233, 150, 2, 59, 51, 7, 4, 1, 233, 150, 2, 59, 51, 7, 6, 1, 233, 150, 2,
+ 59, 252, 44, 22, 231, 233, 7, 4, 1, 233, 150, 2, 59, 252, 44, 22, 231,
+ 233, 7, 6, 1, 233, 150, 2, 232, 215, 51, 7, 4, 1, 233, 150, 2, 232, 215,
+ 51, 7, 6, 1, 233, 150, 2, 250, 32, 51, 7, 4, 1, 233, 150, 2, 250, 32, 51,
+ 7, 6, 1, 232, 51, 2, 142, 7, 4, 1, 232, 51, 2, 142, 7, 6, 1, 232, 51, 2,
+ 59, 48, 7, 4, 1, 232, 51, 2, 59, 48, 7, 6, 1, 232, 51, 2, 59, 51, 7, 4,
+ 1, 232, 51, 2, 59, 51, 7, 6, 1, 230, 27, 2, 59, 48, 7, 4, 1, 230, 27, 2,
+ 59, 48, 7, 6, 1, 230, 27, 2, 59, 51, 7, 4, 1, 230, 27, 2, 59, 51, 7, 6,
+ 1, 230, 27, 2, 232, 215, 51, 7, 4, 1, 230, 27, 2, 232, 215, 51, 7, 6, 1,
+ 230, 27, 2, 250, 32, 51, 7, 4, 1, 230, 27, 2, 250, 32, 51, 7, 6, 1, 144,
+ 2, 216, 90, 22, 142, 7, 4, 1, 144, 2, 216, 90, 22, 142, 7, 6, 1, 144, 2,
+ 216, 90, 22, 248, 2, 7, 4, 1, 144, 2, 216, 90, 22, 248, 2, 7, 6, 1, 144,
+ 2, 231, 234, 22, 242, 137, 7, 4, 1, 144, 2, 231, 234, 22, 242, 137, 7, 6,
+ 1, 144, 2, 231, 234, 22, 142, 7, 4, 1, 144, 2, 231, 234, 22, 142, 7, 6,
+ 1, 226, 107, 2, 142, 7, 4, 1, 226, 107, 2, 142, 7, 6, 1, 226, 107, 2, 59,
+ 48, 7, 4, 1, 226, 107, 2, 59, 48, 7, 6, 1, 223, 225, 2, 59, 48, 7, 4, 1,
+ 223, 225, 2, 59, 48, 7, 6, 1, 223, 225, 2, 59, 51, 7, 4, 1, 223, 225, 2,
+ 59, 51, 7, 6, 1, 223, 225, 2, 59, 252, 44, 22, 231, 233, 7, 4, 1, 223,
+ 225, 2, 59, 252, 44, 22, 231, 233, 7, 6, 1, 223, 225, 2, 232, 215, 51, 7,
+ 4, 1, 223, 225, 2, 232, 215, 51, 7, 6, 1, 222, 93, 2, 59, 48, 7, 4, 1,
+ 222, 93, 2, 59, 48, 7, 6, 1, 222, 93, 2, 59, 51, 7, 4, 1, 222, 93, 2, 59,
+ 51, 7, 6, 1, 222, 93, 2, 255, 4, 22, 59, 48, 7, 4, 1, 222, 93, 2, 255, 4,
+ 22, 59, 48, 7, 6, 1, 222, 93, 2, 250, 236, 22, 59, 48, 7, 4, 1, 222, 93,
+ 2, 250, 236, 22, 59, 48, 7, 6, 1, 222, 93, 2, 59, 252, 44, 22, 59, 48, 7,
+ 4, 1, 222, 93, 2, 59, 252, 44, 22, 59, 48, 7, 6, 1, 217, 154, 2, 59, 48,
+ 7, 4, 1, 217, 154, 2, 59, 48, 7, 6, 1, 217, 154, 2, 59, 51, 7, 4, 1, 217,
+ 154, 2, 59, 51, 7, 6, 1, 217, 154, 2, 232, 215, 51, 7, 4, 1, 217, 154, 2,
+ 232, 215, 51, 7, 6, 1, 217, 154, 2, 250, 32, 51, 7, 4, 1, 217, 154, 2,
+ 250, 32, 51, 7, 6, 1, 104, 2, 248, 3, 51, 7, 4, 1, 104, 2, 248, 3, 51, 7,
+ 6, 1, 104, 2, 216, 90, 51, 7, 4, 1, 104, 2, 216, 90, 51, 7, 6, 1, 104, 2,
+ 250, 32, 51, 7, 4, 1, 104, 2, 250, 32, 51, 7, 6, 1, 104, 2, 216, 90, 22,
+ 142, 7, 4, 1, 104, 2, 216, 90, 22, 142, 7, 6, 1, 104, 2, 231, 234, 22,
+ 248, 2, 7, 4, 1, 104, 2, 231, 234, 22, 248, 2, 7, 6, 1, 214, 106, 2, 183,
+ 7, 4, 1, 214, 106, 2, 183, 7, 6, 1, 214, 106, 2, 59, 51, 7, 4, 1, 214,
+ 106, 2, 59, 51, 7, 6, 1, 212, 99, 2, 242, 137, 7, 4, 1, 212, 99, 2, 242,
+ 137, 7, 6, 1, 212, 99, 2, 142, 7, 4, 1, 212, 99, 2, 142, 7, 6, 1, 212,
+ 99, 2, 248, 2, 7, 4, 1, 212, 99, 2, 248, 2, 7, 6, 1, 212, 99, 2, 59, 48,
7, 4, 1, 212, 99, 2, 59, 48, 7, 6, 1, 212, 99, 2, 59, 51, 7, 4, 1, 212,
99, 2, 59, 51, 7, 6, 1, 211, 179, 2, 59, 48, 7, 4, 1, 211, 179, 2, 59,
- 48, 7, 6, 1, 211, 179, 2, 248, 1, 7, 4, 1, 211, 179, 2, 248, 1, 7, 6, 1,
+ 48, 7, 6, 1, 211, 179, 2, 248, 2, 7, 4, 1, 211, 179, 2, 248, 2, 7, 6, 1,
211, 118, 2, 59, 48, 7, 4, 1, 211, 118, 2, 59, 48, 7, 6, 1, 210, 160, 2,
- 250, 30, 7, 4, 1, 210, 160, 2, 250, 30, 7, 6, 1, 210, 160, 2, 59, 51, 7,
- 4, 1, 210, 160, 2, 59, 51, 7, 6, 1, 210, 160, 2, 232, 214, 51, 7, 4, 1,
- 210, 160, 2, 232, 214, 51, 7, 4, 1, 242, 61, 2, 232, 214, 51, 7, 4, 1,
- 217, 153, 2, 248, 1, 7, 4, 1, 212, 99, 2, 222, 234, 48, 7, 4, 1, 211,
- 118, 2, 222, 234, 48, 7, 4, 1, 115, 2, 44, 163, 222, 233, 7, 4, 1, 199,
- 222, 92, 2, 59, 48, 7, 4, 1, 199, 222, 92, 2, 247, 255, 91, 7, 4, 1, 199,
- 222, 92, 2, 125, 91, 7, 6, 1, 220, 76, 222, 91, 7, 4, 1, 248, 54, 7, 6,
- 1, 115, 2, 59, 51, 7, 4, 1, 115, 2, 59, 51, 7, 6, 1, 115, 2, 241, 52, 48,
- 7, 4, 1, 115, 2, 241, 52, 48, 7, 6, 1, 115, 2, 250, 31, 22, 142, 7, 4, 1,
- 115, 2, 250, 31, 22, 142, 7, 6, 1, 115, 2, 250, 31, 22, 242, 136, 7, 4,
- 1, 115, 2, 250, 31, 22, 242, 136, 7, 6, 1, 115, 2, 250, 31, 22, 241, 52,
- 48, 7, 4, 1, 115, 2, 250, 31, 22, 241, 52, 48, 7, 6, 1, 115, 2, 250, 31,
- 22, 182, 7, 4, 1, 115, 2, 250, 31, 22, 182, 7, 6, 1, 115, 2, 250, 31, 22,
- 59, 51, 7, 4, 1, 115, 2, 250, 31, 22, 59, 51, 7, 6, 1, 115, 2, 251, 147,
- 22, 142, 7, 4, 1, 115, 2, 251, 147, 22, 142, 7, 6, 1, 115, 2, 251, 147,
- 22, 242, 136, 7, 4, 1, 115, 2, 251, 147, 22, 242, 136, 7, 6, 1, 115, 2,
- 251, 147, 22, 241, 52, 48, 7, 4, 1, 115, 2, 251, 147, 22, 241, 52, 48, 7,
- 6, 1, 115, 2, 251, 147, 22, 182, 7, 4, 1, 115, 2, 251, 147, 22, 182, 7,
- 6, 1, 115, 2, 251, 147, 22, 59, 51, 7, 4, 1, 115, 2, 251, 147, 22, 59,
+ 250, 31, 7, 4, 1, 210, 160, 2, 250, 31, 7, 6, 1, 210, 160, 2, 59, 51, 7,
+ 4, 1, 210, 160, 2, 59, 51, 7, 6, 1, 210, 160, 2, 232, 215, 51, 7, 4, 1,
+ 210, 160, 2, 232, 215, 51, 7, 4, 1, 242, 62, 2, 232, 215, 51, 7, 4, 1,
+ 217, 154, 2, 248, 2, 7, 4, 1, 212, 99, 2, 222, 235, 48, 7, 4, 1, 211,
+ 118, 2, 222, 235, 48, 7, 4, 1, 115, 2, 44, 163, 222, 234, 7, 4, 1, 199,
+ 222, 93, 2, 59, 48, 7, 4, 1, 199, 222, 93, 2, 248, 0, 91, 7, 4, 1, 199,
+ 222, 93, 2, 125, 91, 7, 6, 1, 220, 77, 222, 92, 7, 4, 1, 248, 55, 7, 6,
+ 1, 115, 2, 59, 51, 7, 4, 1, 115, 2, 59, 51, 7, 6, 1, 115, 2, 241, 53, 48,
+ 7, 4, 1, 115, 2, 241, 53, 48, 7, 6, 1, 115, 2, 250, 32, 22, 142, 7, 4, 1,
+ 115, 2, 250, 32, 22, 142, 7, 6, 1, 115, 2, 250, 32, 22, 242, 137, 7, 4,
+ 1, 115, 2, 250, 32, 22, 242, 137, 7, 6, 1, 115, 2, 250, 32, 22, 241, 53,
+ 48, 7, 4, 1, 115, 2, 250, 32, 22, 241, 53, 48, 7, 6, 1, 115, 2, 250, 32,
+ 22, 183, 7, 4, 1, 115, 2, 250, 32, 22, 183, 7, 6, 1, 115, 2, 250, 32, 22,
+ 59, 51, 7, 4, 1, 115, 2, 250, 32, 22, 59, 51, 7, 6, 1, 115, 2, 251, 148,
+ 22, 142, 7, 4, 1, 115, 2, 251, 148, 22, 142, 7, 6, 1, 115, 2, 251, 148,
+ 22, 242, 137, 7, 4, 1, 115, 2, 251, 148, 22, 242, 137, 7, 6, 1, 115, 2,
+ 251, 148, 22, 241, 53, 48, 7, 4, 1, 115, 2, 251, 148, 22, 241, 53, 48, 7,
+ 6, 1, 115, 2, 251, 148, 22, 183, 7, 4, 1, 115, 2, 251, 148, 22, 183, 7,
+ 6, 1, 115, 2, 251, 148, 22, 59, 51, 7, 4, 1, 115, 2, 251, 148, 22, 59,
51, 7, 6, 1, 160, 2, 59, 51, 7, 4, 1, 160, 2, 59, 51, 7, 6, 1, 160, 2,
- 241, 52, 48, 7, 4, 1, 160, 2, 241, 52, 48, 7, 6, 1, 160, 2, 182, 7, 4, 1,
- 160, 2, 182, 7, 6, 1, 160, 2, 250, 31, 22, 142, 7, 4, 1, 160, 2, 250, 31,
- 22, 142, 7, 6, 1, 160, 2, 250, 31, 22, 242, 136, 7, 4, 1, 160, 2, 250,
- 31, 22, 242, 136, 7, 6, 1, 160, 2, 250, 31, 22, 241, 52, 48, 7, 4, 1,
- 160, 2, 250, 31, 22, 241, 52, 48, 7, 6, 1, 160, 2, 250, 31, 22, 182, 7,
- 4, 1, 160, 2, 250, 31, 22, 182, 7, 6, 1, 160, 2, 250, 31, 22, 59, 51, 7,
- 4, 1, 160, 2, 250, 31, 22, 59, 51, 7, 6, 1, 240, 154, 2, 241, 52, 48, 7,
- 4, 1, 240, 154, 2, 241, 52, 48, 7, 6, 1, 240, 154, 2, 59, 51, 7, 4, 1,
- 240, 154, 2, 59, 51, 7, 6, 1, 144, 2, 59, 51, 7, 4, 1, 144, 2, 59, 51, 7,
- 6, 1, 144, 2, 241, 52, 48, 7, 4, 1, 144, 2, 241, 52, 48, 7, 6, 1, 144, 2,
- 250, 31, 22, 142, 7, 4, 1, 144, 2, 250, 31, 22, 142, 7, 6, 1, 144, 2,
- 250, 31, 22, 242, 136, 7, 4, 1, 144, 2, 250, 31, 22, 242, 136, 7, 6, 1,
- 144, 2, 250, 31, 22, 241, 52, 48, 7, 4, 1, 144, 2, 250, 31, 22, 241, 52,
- 48, 7, 6, 1, 144, 2, 250, 31, 22, 182, 7, 4, 1, 144, 2, 250, 31, 22, 182,
- 7, 6, 1, 144, 2, 250, 31, 22, 59, 51, 7, 4, 1, 144, 2, 250, 31, 22, 59,
- 51, 7, 6, 1, 144, 2, 240, 249, 22, 142, 7, 4, 1, 144, 2, 240, 249, 22,
- 142, 7, 6, 1, 144, 2, 240, 249, 22, 242, 136, 7, 4, 1, 144, 2, 240, 249,
- 22, 242, 136, 7, 6, 1, 144, 2, 240, 249, 22, 241, 52, 48, 7, 4, 1, 144,
- 2, 240, 249, 22, 241, 52, 48, 7, 6, 1, 144, 2, 240, 249, 22, 182, 7, 4,
- 1, 144, 2, 240, 249, 22, 182, 7, 6, 1, 144, 2, 240, 249, 22, 59, 51, 7,
- 4, 1, 144, 2, 240, 249, 22, 59, 51, 7, 6, 1, 104, 2, 59, 51, 7, 4, 1,
- 104, 2, 59, 51, 7, 6, 1, 104, 2, 241, 52, 48, 7, 4, 1, 104, 2, 241, 52,
- 48, 7, 6, 1, 104, 2, 240, 249, 22, 142, 7, 4, 1, 104, 2, 240, 249, 22,
- 142, 7, 6, 1, 104, 2, 240, 249, 22, 242, 136, 7, 4, 1, 104, 2, 240, 249,
- 22, 242, 136, 7, 6, 1, 104, 2, 240, 249, 22, 241, 52, 48, 7, 4, 1, 104,
- 2, 240, 249, 22, 241, 52, 48, 7, 6, 1, 104, 2, 240, 249, 22, 182, 7, 4,
- 1, 104, 2, 240, 249, 22, 182, 7, 6, 1, 104, 2, 240, 249, 22, 59, 51, 7,
- 4, 1, 104, 2, 240, 249, 22, 59, 51, 7, 6, 1, 211, 118, 2, 242, 136, 7, 4,
- 1, 211, 118, 2, 242, 136, 7, 6, 1, 211, 118, 2, 59, 51, 7, 4, 1, 211,
- 118, 2, 59, 51, 7, 6, 1, 211, 118, 2, 241, 52, 48, 7, 4, 1, 211, 118, 2,
- 241, 52, 48, 7, 6, 1, 211, 118, 2, 182, 7, 4, 1, 211, 118, 2, 182, 7, 6,
- 1, 230, 223, 232, 185, 7, 4, 1, 230, 223, 232, 185, 7, 6, 1, 230, 223,
- 214, 105, 7, 4, 1, 230, 223, 214, 105, 7, 6, 1, 211, 118, 2, 232, 123, 7,
- 4, 1, 211, 118, 2, 232, 123, 26, 4, 1, 254, 144, 2, 224, 154, 26, 4, 1,
- 254, 144, 2, 248, 153, 26, 4, 1, 254, 144, 2, 224, 155, 22, 214, 13, 26,
- 4, 1, 254, 144, 2, 248, 154, 22, 214, 13, 26, 4, 1, 254, 144, 2, 224,
- 155, 22, 226, 110, 26, 4, 1, 254, 144, 2, 248, 154, 22, 226, 110, 26, 4,
- 1, 254, 144, 2, 224, 155, 22, 225, 175, 26, 4, 1, 254, 144, 2, 248, 154,
- 22, 225, 175, 26, 6, 1, 254, 144, 2, 224, 154, 26, 6, 1, 254, 144, 2,
- 248, 153, 26, 6, 1, 254, 144, 2, 224, 155, 22, 214, 13, 26, 6, 1, 254,
- 144, 2, 248, 154, 22, 214, 13, 26, 6, 1, 254, 144, 2, 224, 155, 22, 226,
- 110, 26, 6, 1, 254, 144, 2, 248, 154, 22, 226, 110, 26, 6, 1, 254, 144,
- 2, 224, 155, 22, 225, 175, 26, 6, 1, 254, 144, 2, 248, 154, 22, 225, 175,
- 26, 4, 1, 245, 101, 2, 224, 154, 26, 4, 1, 245, 101, 2, 248, 153, 26, 4,
- 1, 245, 101, 2, 224, 155, 22, 214, 13, 26, 4, 1, 245, 101, 2, 248, 154,
- 22, 214, 13, 26, 4, 1, 245, 101, 2, 224, 155, 22, 226, 110, 26, 4, 1,
- 245, 101, 2, 248, 154, 22, 226, 110, 26, 6, 1, 245, 101, 2, 224, 154, 26,
- 6, 1, 245, 101, 2, 248, 153, 26, 6, 1, 245, 101, 2, 224, 155, 22, 214,
- 13, 26, 6, 1, 245, 101, 2, 248, 154, 22, 214, 13, 26, 6, 1, 245, 101, 2,
- 224, 155, 22, 226, 110, 26, 6, 1, 245, 101, 2, 248, 154, 22, 226, 110,
- 26, 4, 1, 245, 64, 2, 224, 154, 26, 4, 1, 245, 64, 2, 248, 153, 26, 4, 1,
- 245, 64, 2, 224, 155, 22, 214, 13, 26, 4, 1, 245, 64, 2, 248, 154, 22,
- 214, 13, 26, 4, 1, 245, 64, 2, 224, 155, 22, 226, 110, 26, 4, 1, 245, 64,
- 2, 248, 154, 22, 226, 110, 26, 4, 1, 245, 64, 2, 224, 155, 22, 225, 175,
- 26, 4, 1, 245, 64, 2, 248, 154, 22, 225, 175, 26, 6, 1, 245, 64, 2, 224,
- 154, 26, 6, 1, 245, 64, 2, 248, 153, 26, 6, 1, 245, 64, 2, 224, 155, 22,
- 214, 13, 26, 6, 1, 245, 64, 2, 248, 154, 22, 214, 13, 26, 6, 1, 245, 64,
- 2, 224, 155, 22, 226, 110, 26, 6, 1, 245, 64, 2, 248, 154, 22, 226, 110,
- 26, 6, 1, 245, 64, 2, 224, 155, 22, 225, 175, 26, 6, 1, 245, 64, 2, 248,
- 154, 22, 225, 175, 26, 4, 1, 235, 186, 2, 224, 154, 26, 4, 1, 235, 186,
- 2, 248, 153, 26, 4, 1, 235, 186, 2, 224, 155, 22, 214, 13, 26, 4, 1, 235,
- 186, 2, 248, 154, 22, 214, 13, 26, 4, 1, 235, 186, 2, 224, 155, 22, 226,
- 110, 26, 4, 1, 235, 186, 2, 248, 154, 22, 226, 110, 26, 4, 1, 235, 186,
- 2, 224, 155, 22, 225, 175, 26, 4, 1, 235, 186, 2, 248, 154, 22, 225, 175,
- 26, 6, 1, 235, 186, 2, 224, 154, 26, 6, 1, 235, 186, 2, 248, 153, 26, 6,
- 1, 235, 186, 2, 224, 155, 22, 214, 13, 26, 6, 1, 235, 186, 2, 248, 154,
- 22, 214, 13, 26, 6, 1, 235, 186, 2, 224, 155, 22, 226, 110, 26, 6, 1,
- 235, 186, 2, 248, 154, 22, 226, 110, 26, 6, 1, 235, 186, 2, 224, 155, 22,
- 225, 175, 26, 6, 1, 235, 186, 2, 248, 154, 22, 225, 175, 26, 4, 1, 226,
- 200, 2, 224, 154, 26, 4, 1, 226, 200, 2, 248, 153, 26, 4, 1, 226, 200, 2,
- 224, 155, 22, 214, 13, 26, 4, 1, 226, 200, 2, 248, 154, 22, 214, 13, 26,
- 4, 1, 226, 200, 2, 224, 155, 22, 226, 110, 26, 4, 1, 226, 200, 2, 248,
- 154, 22, 226, 110, 26, 6, 1, 226, 200, 2, 224, 154, 26, 6, 1, 226, 200,
- 2, 248, 153, 26, 6, 1, 226, 200, 2, 224, 155, 22, 214, 13, 26, 6, 1, 226,
- 200, 2, 248, 154, 22, 214, 13, 26, 6, 1, 226, 200, 2, 224, 155, 22, 226,
- 110, 26, 6, 1, 226, 200, 2, 248, 154, 22, 226, 110, 26, 4, 1, 214, 158,
- 2, 224, 154, 26, 4, 1, 214, 158, 2, 248, 153, 26, 4, 1, 214, 158, 2, 224,
- 155, 22, 214, 13, 26, 4, 1, 214, 158, 2, 248, 154, 22, 214, 13, 26, 4, 1,
- 214, 158, 2, 224, 155, 22, 226, 110, 26, 4, 1, 214, 158, 2, 248, 154, 22,
- 226, 110, 26, 4, 1, 214, 158, 2, 224, 155, 22, 225, 175, 26, 4, 1, 214,
- 158, 2, 248, 154, 22, 225, 175, 26, 6, 1, 214, 158, 2, 248, 153, 26, 6,
- 1, 214, 158, 2, 248, 154, 22, 214, 13, 26, 6, 1, 214, 158, 2, 248, 154,
- 22, 226, 110, 26, 6, 1, 214, 158, 2, 248, 154, 22, 225, 175, 26, 4, 1,
- 226, 202, 2, 224, 154, 26, 4, 1, 226, 202, 2, 248, 153, 26, 4, 1, 226,
- 202, 2, 224, 155, 22, 214, 13, 26, 4, 1, 226, 202, 2, 248, 154, 22, 214,
- 13, 26, 4, 1, 226, 202, 2, 224, 155, 22, 226, 110, 26, 4, 1, 226, 202, 2,
- 248, 154, 22, 226, 110, 26, 4, 1, 226, 202, 2, 224, 155, 22, 225, 175,
- 26, 4, 1, 226, 202, 2, 248, 154, 22, 225, 175, 26, 6, 1, 226, 202, 2,
- 224, 154, 26, 6, 1, 226, 202, 2, 248, 153, 26, 6, 1, 226, 202, 2, 224,
- 155, 22, 214, 13, 26, 6, 1, 226, 202, 2, 248, 154, 22, 214, 13, 26, 6, 1,
- 226, 202, 2, 224, 155, 22, 226, 110, 26, 6, 1, 226, 202, 2, 248, 154, 22,
- 226, 110, 26, 6, 1, 226, 202, 2, 224, 155, 22, 225, 175, 26, 6, 1, 226,
- 202, 2, 248, 154, 22, 225, 175, 26, 4, 1, 254, 144, 2, 214, 13, 26, 4, 1,
- 254, 144, 2, 226, 110, 26, 4, 1, 245, 101, 2, 214, 13, 26, 4, 1, 245,
- 101, 2, 226, 110, 26, 4, 1, 245, 64, 2, 214, 13, 26, 4, 1, 245, 64, 2,
- 226, 110, 26, 4, 1, 235, 186, 2, 214, 13, 26, 4, 1, 235, 186, 2, 226,
- 110, 26, 4, 1, 226, 200, 2, 214, 13, 26, 4, 1, 226, 200, 2, 226, 110, 26,
- 4, 1, 214, 158, 2, 214, 13, 26, 4, 1, 214, 158, 2, 226, 110, 26, 4, 1,
- 226, 202, 2, 214, 13, 26, 4, 1, 226, 202, 2, 226, 110, 26, 4, 1, 254,
- 144, 2, 224, 155, 22, 210, 219, 26, 4, 1, 254, 144, 2, 248, 154, 22, 210,
- 219, 26, 4, 1, 254, 144, 2, 224, 155, 22, 214, 14, 22, 210, 219, 26, 4,
- 1, 254, 144, 2, 248, 154, 22, 214, 14, 22, 210, 219, 26, 4, 1, 254, 144,
- 2, 224, 155, 22, 226, 111, 22, 210, 219, 26, 4, 1, 254, 144, 2, 248, 154,
- 22, 226, 111, 22, 210, 219, 26, 4, 1, 254, 144, 2, 224, 155, 22, 225,
- 176, 22, 210, 219, 26, 4, 1, 254, 144, 2, 248, 154, 22, 225, 176, 22,
- 210, 219, 26, 6, 1, 254, 144, 2, 224, 155, 22, 224, 167, 26, 6, 1, 254,
- 144, 2, 248, 154, 22, 224, 167, 26, 6, 1, 254, 144, 2, 224, 155, 22, 214,
- 14, 22, 224, 167, 26, 6, 1, 254, 144, 2, 248, 154, 22, 214, 14, 22, 224,
- 167, 26, 6, 1, 254, 144, 2, 224, 155, 22, 226, 111, 22, 224, 167, 26, 6,
- 1, 254, 144, 2, 248, 154, 22, 226, 111, 22, 224, 167, 26, 6, 1, 254, 144,
- 2, 224, 155, 22, 225, 176, 22, 224, 167, 26, 6, 1, 254, 144, 2, 248, 154,
- 22, 225, 176, 22, 224, 167, 26, 4, 1, 245, 64, 2, 224, 155, 22, 210, 219,
- 26, 4, 1, 245, 64, 2, 248, 154, 22, 210, 219, 26, 4, 1, 245, 64, 2, 224,
- 155, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, 64, 2, 248, 154, 22, 214,
- 14, 22, 210, 219, 26, 4, 1, 245, 64, 2, 224, 155, 22, 226, 111, 22, 210,
- 219, 26, 4, 1, 245, 64, 2, 248, 154, 22, 226, 111, 22, 210, 219, 26, 4,
- 1, 245, 64, 2, 224, 155, 22, 225, 176, 22, 210, 219, 26, 4, 1, 245, 64,
- 2, 248, 154, 22, 225, 176, 22, 210, 219, 26, 6, 1, 245, 64, 2, 224, 155,
- 22, 224, 167, 26, 6, 1, 245, 64, 2, 248, 154, 22, 224, 167, 26, 6, 1,
- 245, 64, 2, 224, 155, 22, 214, 14, 22, 224, 167, 26, 6, 1, 245, 64, 2,
- 248, 154, 22, 214, 14, 22, 224, 167, 26, 6, 1, 245, 64, 2, 224, 155, 22,
- 226, 111, 22, 224, 167, 26, 6, 1, 245, 64, 2, 248, 154, 22, 226, 111, 22,
- 224, 167, 26, 6, 1, 245, 64, 2, 224, 155, 22, 225, 176, 22, 224, 167, 26,
- 6, 1, 245, 64, 2, 248, 154, 22, 225, 176, 22, 224, 167, 26, 4, 1, 226,
- 202, 2, 224, 155, 22, 210, 219, 26, 4, 1, 226, 202, 2, 248, 154, 22, 210,
- 219, 26, 4, 1, 226, 202, 2, 224, 155, 22, 214, 14, 22, 210, 219, 26, 4,
- 1, 226, 202, 2, 248, 154, 22, 214, 14, 22, 210, 219, 26, 4, 1, 226, 202,
- 2, 224, 155, 22, 226, 111, 22, 210, 219, 26, 4, 1, 226, 202, 2, 248, 154,
- 22, 226, 111, 22, 210, 219, 26, 4, 1, 226, 202, 2, 224, 155, 22, 225,
- 176, 22, 210, 219, 26, 4, 1, 226, 202, 2, 248, 154, 22, 225, 176, 22,
- 210, 219, 26, 6, 1, 226, 202, 2, 224, 155, 22, 224, 167, 26, 6, 1, 226,
- 202, 2, 248, 154, 22, 224, 167, 26, 6, 1, 226, 202, 2, 224, 155, 22, 214,
- 14, 22, 224, 167, 26, 6, 1, 226, 202, 2, 248, 154, 22, 214, 14, 22, 224,
- 167, 26, 6, 1, 226, 202, 2, 224, 155, 22, 226, 111, 22, 224, 167, 26, 6,
- 1, 226, 202, 2, 248, 154, 22, 226, 111, 22, 224, 167, 26, 6, 1, 226, 202,
- 2, 224, 155, 22, 225, 176, 22, 224, 167, 26, 6, 1, 226, 202, 2, 248, 154,
- 22, 225, 176, 22, 224, 167, 26, 4, 1, 254, 144, 2, 213, 120, 26, 4, 1,
- 254, 144, 2, 231, 232, 26, 4, 1, 254, 144, 2, 214, 14, 22, 210, 219, 26,
- 4, 1, 254, 144, 2, 210, 219, 26, 4, 1, 254, 144, 2, 226, 111, 22, 210,
- 219, 26, 4, 1, 254, 144, 2, 225, 175, 26, 4, 1, 254, 144, 2, 225, 176,
- 22, 210, 219, 26, 6, 1, 254, 144, 2, 213, 120, 26, 6, 1, 254, 144, 2,
- 231, 232, 26, 6, 1, 254, 144, 2, 214, 13, 26, 6, 1, 254, 144, 2, 226,
- 110, 26, 6, 1, 254, 144, 2, 224, 167, 26, 234, 2, 26, 224, 167, 26, 224,
- 154, 26, 225, 175, 26, 247, 252, 22, 225, 175, 26, 4, 1, 245, 64, 2, 214,
- 14, 22, 210, 219, 26, 4, 1, 245, 64, 2, 210, 219, 26, 4, 1, 245, 64, 2,
- 226, 111, 22, 210, 219, 26, 4, 1, 245, 64, 2, 225, 175, 26, 4, 1, 245,
- 64, 2, 225, 176, 22, 210, 219, 26, 6, 1, 245, 101, 2, 214, 13, 26, 6, 1,
- 245, 101, 2, 226, 110, 26, 6, 1, 245, 64, 2, 214, 13, 26, 6, 1, 245, 64,
- 2, 226, 110, 26, 6, 1, 245, 64, 2, 224, 167, 26, 224, 155, 22, 214, 13,
- 26, 224, 155, 22, 226, 110, 26, 224, 155, 22, 225, 175, 26, 4, 1, 235,
- 186, 2, 213, 120, 26, 4, 1, 235, 186, 2, 231, 232, 26, 4, 1, 235, 186, 2,
- 247, 252, 22, 214, 13, 26, 4, 1, 235, 186, 2, 247, 252, 22, 226, 110, 26,
- 4, 1, 235, 186, 2, 225, 175, 26, 4, 1, 235, 186, 2, 247, 252, 22, 225,
- 175, 26, 6, 1, 235, 186, 2, 213, 120, 26, 6, 1, 235, 186, 2, 231, 232,
- 26, 6, 1, 235, 186, 2, 214, 13, 26, 6, 1, 235, 186, 2, 226, 110, 26, 248,
- 154, 22, 214, 13, 26, 248, 154, 22, 226, 110, 26, 248, 154, 22, 225, 175,
- 26, 4, 1, 214, 158, 2, 213, 120, 26, 4, 1, 214, 158, 2, 231, 232, 26, 4,
- 1, 214, 158, 2, 247, 252, 22, 214, 13, 26, 4, 1, 214, 158, 2, 247, 252,
- 22, 226, 110, 26, 4, 1, 223, 38, 2, 224, 154, 26, 4, 1, 223, 38, 2, 248,
- 153, 26, 4, 1, 214, 158, 2, 225, 175, 26, 4, 1, 214, 158, 2, 247, 252,
- 22, 225, 175, 26, 6, 1, 214, 158, 2, 213, 120, 26, 6, 1, 214, 158, 2,
- 231, 232, 26, 6, 1, 214, 158, 2, 214, 13, 26, 6, 1, 214, 158, 2, 226,
- 110, 26, 6, 1, 223, 38, 2, 248, 153, 26, 247, 252, 22, 214, 13, 26, 247,
- 252, 22, 226, 110, 26, 214, 13, 26, 4, 1, 226, 202, 2, 214, 14, 22, 210,
- 219, 26, 4, 1, 226, 202, 2, 210, 219, 26, 4, 1, 226, 202, 2, 226, 111,
- 22, 210, 219, 26, 4, 1, 226, 202, 2, 225, 175, 26, 4, 1, 226, 202, 2,
- 225, 176, 22, 210, 219, 26, 6, 1, 226, 200, 2, 214, 13, 26, 6, 1, 226,
- 200, 2, 226, 110, 26, 6, 1, 226, 202, 2, 214, 13, 26, 6, 1, 226, 202, 2,
- 226, 110, 26, 6, 1, 226, 202, 2, 224, 167, 26, 226, 110, 26, 248, 153,
- 245, 151, 224, 27, 245, 160, 224, 27, 245, 151, 219, 18, 245, 160, 219,
- 18, 216, 141, 219, 18, 244, 9, 219, 18, 219, 123, 219, 18, 244, 112, 219,
- 18, 224, 141, 219, 18, 216, 170, 219, 18, 242, 35, 219, 18, 210, 87, 211,
- 245, 219, 18, 210, 87, 211, 245, 228, 67, 210, 87, 211, 245, 235, 63,
- 233, 38, 78, 222, 243, 78, 240, 168, 228, 68, 240, 168, 244, 112, 248,
- 156, 245, 151, 248, 156, 245, 160, 248, 156, 203, 130, 52, 67, 232, 213,
- 52, 121, 232, 213, 43, 219, 155, 223, 254, 78, 44, 219, 155, 223, 254,
- 78, 219, 155, 232, 109, 223, 254, 78, 219, 155, 241, 163, 223, 254, 78,
- 43, 52, 223, 254, 78, 44, 52, 223, 254, 78, 52, 232, 109, 223, 254, 78,
- 52, 241, 163, 223, 254, 78, 248, 205, 52, 248, 205, 251, 113, 215, 222,
- 251, 113, 123, 59, 233, 56, 113, 59, 233, 56, 203, 245, 163, 240, 166,
- 225, 10, 232, 214, 220, 137, 226, 15, 220, 137, 233, 38, 245, 158, 222,
- 243, 245, 158, 224, 246, 247, 196, 244, 19, 233, 38, 226, 117, 222, 243,
- 226, 117, 229, 194, 228, 73, 219, 18, 225, 183, 230, 193, 50, 225, 183,
- 216, 248, 216, 148, 50, 224, 190, 52, 224, 190, 215, 211, 224, 190, 223,
- 49, 224, 190, 223, 49, 52, 224, 190, 223, 49, 215, 211, 224, 190, 250,
- 238, 219, 155, 233, 42, 254, 110, 223, 254, 78, 219, 155, 222, 247, 254,
- 110, 223, 254, 78, 223, 107, 78, 52, 245, 31, 78, 235, 201, 226, 119,
- 214, 180, 135, 216, 111, 250, 239, 235, 216, 225, 10, 253, 214, 240, 169,
- 251, 113, 244, 2, 219, 95, 43, 42, 251, 158, 2, 224, 7, 44, 42, 251, 158,
- 2, 224, 7, 52, 224, 13, 78, 224, 13, 245, 31, 78, 245, 31, 224, 13, 78,
- 216, 70, 5, 245, 65, 223, 49, 225, 68, 50, 85, 140, 251, 113, 85, 97,
- 251, 113, 121, 253, 216, 223, 49, 220, 150, 250, 1, 214, 163, 113, 253,
- 215, 254, 158, 213, 188, 249, 217, 230, 182, 50, 217, 234, 248, 156, 235,
- 193, 214, 180, 244, 52, 224, 141, 78, 134, 59, 224, 140, 224, 24, 224,
- 190, 244, 11, 59, 224, 140, 244, 81, 59, 224, 140, 113, 59, 224, 140,
- 244, 11, 59, 78, 246, 118, 249, 130, 215, 221, 67, 244, 11, 247, 118,
- 231, 82, 11, 219, 18, 211, 209, 235, 63, 243, 227, 254, 52, 235, 191,
- 216, 85, 235, 191, 220, 137, 235, 191, 225, 22, 235, 228, 217, 182, 217,
- 251, 255, 5, 217, 182, 217, 251, 235, 228, 10, 244, 20, 220, 80, 255, 5,
- 10, 244, 20, 220, 80, 229, 189, 21, 220, 81, 228, 69, 21, 220, 81, 218,
- 23, 210, 86, 218, 23, 7, 4, 1, 73, 218, 23, 161, 218, 23, 189, 218, 23,
- 194, 218, 23, 198, 218, 23, 195, 218, 23, 200, 218, 23, 96, 50, 218, 23,
- 230, 181, 218, 23, 245, 98, 50, 218, 23, 43, 226, 3, 218, 23, 44, 226, 3,
- 218, 23, 7, 4, 1, 230, 25, 218, 65, 210, 86, 218, 65, 110, 218, 65, 105,
- 218, 65, 158, 218, 65, 161, 218, 65, 189, 218, 65, 194, 218, 65, 198,
- 218, 65, 195, 218, 65, 200, 218, 65, 96, 50, 218, 65, 230, 181, 218, 65,
- 245, 98, 50, 218, 65, 43, 226, 3, 218, 65, 44, 226, 3, 7, 218, 65, 4, 1,
- 61, 7, 218, 65, 4, 1, 75, 7, 218, 65, 4, 1, 76, 7, 218, 65, 4, 1, 211,
- 178, 7, 218, 65, 4, 1, 221, 195, 7, 218, 65, 4, 1, 242, 60, 7, 218, 65,
- 4, 1, 235, 23, 7, 218, 65, 4, 1, 156, 7, 218, 65, 4, 1, 193, 7, 218, 65,
- 4, 1, 230, 25, 7, 218, 65, 4, 1, 226, 105, 7, 218, 65, 4, 1, 222, 91, 7,
- 218, 65, 4, 1, 217, 152, 245, 46, 50, 249, 227, 50, 249, 117, 50, 243,
- 251, 243, 254, 50, 232, 198, 50, 230, 194, 50, 229, 210, 50, 225, 162,
- 50, 222, 118, 50, 211, 217, 50, 166, 220, 49, 50, 247, 127, 50, 245, 47,
- 50, 234, 76, 50, 215, 112, 50, 246, 101, 50, 243, 40, 225, 193, 50, 225,
- 160, 50, 242, 109, 50, 253, 182, 50, 240, 228, 50, 250, 185, 50, 232,
- 191, 216, 3, 50, 219, 0, 50, 216, 245, 50, 235, 241, 222, 118, 50, 38,
- 43, 241, 255, 48, 38, 44, 241, 255, 48, 38, 199, 67, 232, 214, 226, 120,
- 38, 219, 251, 67, 232, 214, 226, 120, 38, 254, 88, 80, 48, 38, 250, 2,
- 80, 48, 38, 43, 80, 48, 38, 44, 80, 48, 38, 222, 234, 226, 120, 38, 250,
- 2, 222, 234, 226, 120, 38, 254, 88, 222, 234, 226, 120, 38, 134, 170, 48,
- 38, 244, 11, 170, 48, 38, 245, 146, 250, 35, 38, 245, 146, 218, 234, 38,
- 245, 146, 247, 248, 38, 245, 146, 250, 36, 252, 180, 38, 43, 44, 80, 48,
- 38, 245, 146, 221, 188, 38, 245, 146, 234, 135, 38, 245, 146, 214, 155,
- 225, 7, 215, 225, 38, 223, 50, 219, 47, 226, 120, 38, 52, 67, 218, 103,
- 226, 120, 38, 254, 98, 87, 38, 215, 211, 214, 182, 38, 211, 247, 251,
- 140, 48, 38, 140, 80, 226, 120, 38, 199, 52, 219, 47, 226, 120, 38, 97,
- 241, 255, 2, 252, 139, 246, 103, 38, 140, 241, 255, 2, 252, 139, 246,
- 103, 38, 43, 80, 51, 38, 44, 80, 51, 38, 253, 217, 48, 255, 11, 226, 231,
- 254, 251, 216, 42, 216, 196, 218, 74, 139, 6, 251, 66, 248, 71, 250, 178,
- 250, 175, 232, 214, 87, 250, 240, 226, 231, 251, 26, 214, 189, 245, 48,
- 249, 191, 221, 185, 248, 71, 244, 179, 119, 4, 243, 202, 119, 6, 242, 60,
- 251, 219, 6, 242, 60, 139, 6, 242, 60, 225, 37, 249, 191, 225, 37, 249,
- 192, 117, 113, 225, 108, 119, 6, 73, 251, 219, 6, 73, 119, 6, 156, 119,
- 4, 156, 233, 149, 57, 252, 141, 87, 139, 6, 230, 25, 227, 196, 50, 219,
- 31, 223, 119, 249, 162, 119, 6, 226, 105, 139, 6, 226, 105, 139, 6, 224,
- 96, 119, 6, 153, 251, 219, 6, 153, 139, 6, 153, 224, 196, 217, 71, 223,
- 62, 220, 132, 78, 217, 1, 50, 215, 253, 164, 50, 213, 240, 139, 6, 210,
- 159, 226, 133, 50, 226, 221, 50, 235, 193, 226, 221, 50, 251, 219, 6,
- 210, 159, 215, 94, 26, 4, 1, 235, 185, 234, 173, 50, 254, 107, 50, 119,
- 6, 253, 158, 251, 219, 6, 251, 66, 245, 68, 87, 119, 4, 75, 119, 6, 75,
- 119, 6, 245, 6, 215, 94, 6, 245, 6, 119, 6, 193, 119, 4, 76, 112, 87,
- 252, 29, 87, 242, 202, 87, 248, 190, 87, 235, 232, 219, 29, 222, 187, 6,
- 224, 96, 244, 182, 50, 139, 4, 225, 108, 139, 4, 243, 107, 139, 6, 243,
- 107, 139, 6, 225, 108, 139, 230, 24, 218, 40, 215, 94, 35, 6, 243, 202,
- 215, 94, 35, 6, 156, 223, 49, 35, 6, 156, 215, 94, 35, 6, 211, 117, 139,
- 32, 6, 249, 60, 139, 32, 4, 249, 60, 139, 32, 4, 75, 139, 32, 4, 73, 139,
- 32, 4, 235, 144, 224, 170, 232, 213, 215, 94, 254, 126, 225, 183, 50,
- 254, 180, 215, 94, 4, 245, 6, 16, 31, 221, 252, 219, 29, 212, 114, 244,
- 2, 123, 220, 118, 212, 114, 244, 2, 123, 228, 194, 212, 114, 244, 2, 123,
- 216, 241, 212, 114, 244, 2, 123, 216, 168, 212, 114, 244, 2, 113, 216,
- 166, 212, 114, 244, 2, 123, 244, 117, 212, 114, 244, 2, 113, 244, 116,
- 212, 114, 244, 2, 134, 244, 116, 212, 114, 244, 2, 244, 11, 244, 116,
- 212, 114, 244, 2, 123, 219, 115, 212, 114, 244, 2, 244, 81, 219, 113,
- 212, 114, 244, 2, 123, 245, 188, 212, 114, 244, 2, 134, 245, 186, 212,
- 114, 244, 2, 244, 81, 245, 186, 212, 114, 244, 2, 220, 122, 245, 186,
- 244, 2, 227, 197, 110, 222, 198, 227, 198, 110, 222, 198, 227, 198, 105,
- 222, 198, 227, 198, 158, 222, 198, 227, 198, 161, 222, 198, 227, 198,
- 189, 222, 198, 227, 198, 194, 222, 198, 227, 198, 198, 222, 198, 227,
- 198, 195, 222, 198, 227, 198, 200, 222, 198, 227, 198, 216, 247, 222,
- 198, 227, 198, 245, 167, 222, 198, 227, 198, 215, 76, 222, 198, 227, 198,
- 244, 114, 222, 198, 227, 198, 123, 240, 210, 222, 198, 227, 198, 244, 81,
- 240, 210, 222, 198, 227, 198, 123, 216, 147, 4, 222, 198, 227, 198, 110,
- 4, 222, 198, 227, 198, 105, 4, 222, 198, 227, 198, 158, 4, 222, 198, 227,
- 198, 161, 4, 222, 198, 227, 198, 189, 4, 222, 198, 227, 198, 194, 4, 222,
- 198, 227, 198, 198, 4, 222, 198, 227, 198, 195, 4, 222, 198, 227, 198,
- 200, 4, 222, 198, 227, 198, 216, 247, 4, 222, 198, 227, 198, 245, 167, 4,
- 222, 198, 227, 198, 215, 76, 4, 222, 198, 227, 198, 244, 114, 4, 222,
- 198, 227, 198, 123, 240, 210, 4, 222, 198, 227, 198, 244, 81, 240, 210,
- 4, 222, 198, 227, 198, 123, 216, 147, 222, 198, 227, 198, 123, 216, 148,
- 251, 67, 249, 60, 222, 198, 227, 198, 244, 81, 216, 147, 222, 198, 227,
- 198, 216, 248, 216, 147, 222, 198, 227, 198, 223, 49, 123, 240, 210, 7,
- 4, 1, 223, 49, 251, 66, 222, 198, 227, 198, 219, 125, 233, 78, 17, 222,
- 198, 227, 198, 244, 115, 245, 226, 17, 222, 198, 227, 198, 244, 115, 216,
- 147, 222, 198, 227, 198, 123, 240, 211, 216, 147, 212, 114, 244, 2, 210,
- 87, 216, 166, 140, 74, 214, 153, 74, 97, 74, 246, 104, 74, 43, 44, 74,
- 120, 124, 74, 228, 56, 212, 9, 74, 228, 56, 245, 220, 74, 219, 28, 245,
- 220, 74, 219, 28, 212, 9, 74, 140, 80, 2, 91, 97, 80, 2, 91, 140, 212,
- 36, 74, 97, 212, 36, 74, 140, 113, 241, 234, 74, 214, 153, 113, 241, 234,
- 74, 97, 113, 241, 234, 74, 246, 104, 113, 241, 234, 74, 140, 80, 2, 217,
- 77, 97, 80, 2, 217, 77, 140, 80, 243, 243, 130, 214, 153, 80, 243, 243,
- 130, 97, 80, 243, 243, 130, 246, 104, 80, 243, 243, 130, 120, 124, 80, 2,
- 252, 127, 140, 80, 2, 103, 97, 80, 2, 103, 140, 80, 2, 232, 123, 97, 80,
- 2, 232, 123, 43, 44, 212, 36, 74, 43, 44, 80, 2, 91, 246, 104, 210, 35,
- 74, 214, 153, 80, 2, 216, 77, 233, 37, 214, 153, 80, 2, 216, 77, 222,
- 241, 246, 104, 80, 2, 216, 77, 233, 37, 246, 104, 80, 2, 216, 77, 222,
- 241, 97, 80, 2, 249, 161, 246, 103, 246, 104, 80, 2, 249, 161, 233, 37,
- 254, 88, 216, 14, 220, 153, 74, 250, 2, 216, 14, 220, 153, 74, 228, 56,
- 212, 9, 80, 216, 42, 199, 130, 140, 80, 216, 42, 252, 141, 117, 97, 80,
- 216, 42, 130, 254, 88, 204, 250, 36, 74, 250, 2, 204, 250, 36, 74, 140,
- 241, 255, 2, 252, 139, 214, 152, 140, 241, 255, 2, 252, 139, 246, 103,
- 214, 153, 241, 255, 2, 252, 139, 222, 241, 214, 153, 241, 255, 2, 252,
- 139, 233, 37, 97, 241, 255, 2, 252, 139, 214, 152, 97, 241, 255, 2, 252,
- 139, 246, 103, 246, 104, 241, 255, 2, 252, 139, 222, 241, 246, 104, 241,
- 255, 2, 252, 139, 233, 37, 97, 80, 117, 140, 74, 214, 153, 80, 140, 64,
- 246, 104, 74, 140, 80, 117, 97, 74, 140, 226, 70, 253, 247, 214, 153,
- 226, 70, 253, 247, 97, 226, 70, 253, 247, 246, 104, 226, 70, 253, 247,
- 140, 241, 255, 117, 97, 241, 254, 97, 241, 255, 117, 140, 241, 254, 140,
- 52, 80, 2, 91, 43, 44, 52, 80, 2, 91, 97, 52, 80, 2, 91, 140, 52, 74,
- 214, 153, 52, 74, 97, 52, 74, 246, 104, 52, 74, 43, 44, 52, 74, 120, 124,
- 52, 74, 228, 56, 212, 9, 52, 74, 228, 56, 245, 220, 52, 74, 219, 28, 245,
- 220, 52, 74, 219, 28, 212, 9, 52, 74, 140, 215, 211, 74, 97, 215, 211,
- 74, 140, 218, 230, 74, 97, 218, 230, 74, 214, 153, 80, 2, 52, 91, 246,
- 104, 80, 2, 52, 91, 140, 248, 155, 74, 214, 153, 248, 155, 74, 97, 248,
- 155, 74, 246, 104, 248, 155, 74, 140, 80, 216, 42, 130, 97, 80, 216, 42,
- 130, 140, 71, 74, 214, 153, 71, 74, 97, 71, 74, 246, 104, 71, 74, 214,
- 153, 71, 80, 243, 243, 130, 214, 153, 71, 80, 226, 197, 225, 214, 214,
- 153, 71, 80, 226, 197, 225, 215, 2, 203, 130, 214, 153, 71, 80, 226, 197,
- 225, 215, 2, 67, 130, 214, 153, 71, 52, 74, 214, 153, 71, 52, 80, 226,
- 197, 225, 214, 97, 71, 80, 243, 243, 212, 56, 228, 56, 212, 9, 80, 216,
- 42, 249, 160, 219, 28, 245, 220, 80, 216, 42, 249, 160, 120, 124, 71, 74,
- 44, 80, 2, 4, 250, 35, 246, 104, 80, 140, 64, 214, 153, 74, 134, 97, 253,
- 247, 140, 80, 2, 67, 91, 97, 80, 2, 67, 91, 43, 44, 80, 2, 67, 91, 140,
- 80, 2, 52, 67, 91, 97, 80, 2, 52, 67, 91, 43, 44, 80, 2, 52, 67, 91, 140,
- 226, 173, 74, 97, 226, 173, 74, 43, 44, 226, 173, 74, 31, 254, 154, 249,
- 214, 225, 253, 247, 233, 216, 187, 245, 27, 216, 187, 247, 138, 228, 52,
- 245, 28, 245, 152, 220, 127, 235, 245, 229, 221, 245, 170, 226, 231, 228,
- 52, 254, 124, 245, 170, 226, 231, 4, 245, 170, 226, 231, 249, 186, 253,
- 238, 231, 62, 247, 138, 228, 52, 249, 188, 253, 238, 231, 62, 4, 249,
- 186, 253, 238, 231, 62, 245, 143, 64, 224, 172, 230, 24, 224, 180, 230,
- 24, 249, 165, 230, 24, 218, 40, 230, 182, 50, 230, 180, 50, 59, 225, 22,
- 247, 169, 219, 95, 220, 128, 230, 181, 253, 217, 226, 167, 222, 234, 226,
- 167, 251, 114, 226, 167, 42, 222, 193, 249, 109, 222, 193, 244, 4, 222,
- 193, 224, 168, 111, 235, 234, 44, 254, 109, 254, 109, 231, 88, 254, 109,
- 218, 255, 254, 109, 247, 171, 247, 138, 228, 52, 247, 174, 226, 8, 111,
- 228, 52, 226, 8, 111, 232, 146, 254, 118, 232, 146, 226, 158, 235, 198,
- 214, 175, 235, 211, 52, 235, 211, 215, 211, 235, 211, 249, 182, 235, 211,
- 218, 13, 235, 211, 213, 129, 235, 211, 250, 2, 235, 211, 250, 2, 249,
- 182, 235, 211, 254, 88, 249, 182, 235, 211, 216, 186, 252, 67, 223, 137,
- 224, 169, 59, 230, 181, 245, 33, 243, 46, 224, 169, 241, 57, 216, 89,
- 226, 167, 223, 49, 182, 235, 193, 233, 65, 222, 91, 219, 157, 212, 35,
- 211, 200, 224, 180, 228, 52, 182, 230, 182, 182, 253, 210, 128, 111, 228,
- 52, 253, 210, 128, 111, 254, 48, 128, 111, 254, 48, 251, 88, 228, 52,
- 255, 4, 128, 111, 229, 100, 254, 48, 228, 59, 255, 4, 128, 111, 254, 148,
- 128, 111, 228, 52, 254, 148, 128, 111, 254, 148, 128, 177, 128, 111, 215,
- 211, 182, 254, 155, 128, 111, 245, 94, 111, 243, 45, 245, 94, 111, 247,
- 234, 252, 23, 254, 50, 216, 196, 232, 221, 243, 45, 128, 111, 254, 48,
- 128, 216, 42, 177, 216, 196, 236, 15, 226, 231, 236, 15, 64, 177, 254,
- 48, 128, 111, 249, 227, 245, 97, 245, 98, 249, 226, 222, 234, 236, 0,
- 128, 111, 222, 234, 128, 111, 249, 154, 111, 245, 67, 245, 96, 111, 218,
- 157, 245, 97, 248, 55, 128, 111, 128, 216, 42, 251, 78, 248, 72, 231, 88,
- 251, 77, 224, 11, 128, 111, 228, 52, 128, 111, 240, 104, 111, 228, 52,
- 240, 104, 111, 218, 109, 245, 94, 111, 233, 15, 177, 128, 111, 242, 130,
- 177, 128, 111, 233, 15, 117, 128, 111, 242, 130, 117, 128, 111, 233, 15,
- 251, 88, 228, 52, 128, 111, 242, 130, 251, 88, 228, 52, 128, 111, 230,
- 97, 233, 14, 230, 97, 242, 129, 252, 23, 228, 52, 245, 94, 111, 228, 52,
- 233, 14, 228, 52, 242, 129, 229, 100, 233, 15, 228, 59, 128, 111, 229,
- 100, 242, 130, 228, 59, 128, 111, 233, 15, 177, 245, 94, 111, 242, 130,
- 177, 245, 94, 111, 229, 100, 233, 15, 228, 59, 245, 94, 111, 229, 100,
- 242, 130, 228, 59, 245, 94, 111, 233, 15, 177, 242, 129, 242, 130, 177,
- 233, 14, 229, 100, 233, 15, 228, 59, 242, 129, 229, 100, 242, 130, 228,
- 59, 233, 14, 224, 202, 218, 55, 224, 203, 177, 128, 111, 218, 56, 177,
- 128, 111, 224, 203, 177, 245, 94, 111, 218, 56, 177, 245, 94, 111, 247,
- 138, 228, 52, 224, 205, 247, 138, 228, 52, 218, 57, 218, 64, 226, 231,
- 218, 22, 226, 231, 228, 52, 115, 218, 64, 226, 231, 228, 52, 115, 218,
- 22, 226, 231, 218, 64, 64, 177, 128, 111, 218, 22, 64, 177, 128, 111,
- 229, 100, 115, 218, 64, 64, 228, 59, 128, 111, 229, 100, 115, 218, 22,
- 64, 228, 59, 128, 111, 218, 64, 64, 2, 228, 52, 128, 111, 218, 22, 64, 2,
- 228, 52, 128, 111, 230, 81, 230, 82, 230, 83, 230, 82, 214, 175, 42, 236,
- 15, 226, 231, 42, 226, 150, 226, 231, 42, 236, 15, 64, 177, 128, 111, 42,
- 226, 150, 64, 177, 128, 111, 42, 250, 251, 42, 249, 102, 37, 225, 22, 37,
- 230, 181, 37, 216, 85, 37, 247, 169, 219, 95, 37, 59, 226, 167, 37, 222,
- 234, 226, 167, 37, 253, 217, 226, 167, 37, 245, 97, 37, 248, 156, 92,
- 225, 22, 92, 230, 181, 92, 216, 85, 92, 59, 226, 167, 44, 217, 87, 43,
- 217, 87, 124, 217, 87, 120, 217, 87, 253, 220, 230, 156, 215, 191, 244,
- 25, 215, 211, 67, 252, 141, 44, 215, 93, 52, 67, 252, 141, 52, 44, 215,
- 93, 247, 138, 228, 52, 224, 163, 228, 52, 215, 191, 247, 138, 228, 52,
- 244, 26, 229, 102, 52, 67, 252, 141, 52, 44, 215, 93, 224, 203, 214, 184,
- 223, 91, 218, 56, 214, 184, 223, 91, 228, 57, 218, 77, 226, 231, 249,
- 186, 253, 238, 228, 57, 218, 76, 228, 57, 218, 77, 64, 177, 128, 111,
- 249, 186, 253, 238, 228, 57, 218, 77, 177, 128, 111, 226, 150, 226, 231,
- 236, 15, 226, 231, 230, 87, 241, 200, 249, 196, 231, 137, 235, 208, 211,
- 145, 229, 202, 228, 58, 44, 254, 110, 2, 254, 25, 44, 215, 225, 230, 24,
- 232, 146, 254, 118, 230, 24, 232, 146, 226, 158, 230, 24, 235, 198, 230,
- 24, 214, 175, 247, 249, 226, 167, 59, 226, 167, 218, 157, 226, 167, 247,
- 169, 216, 85, 251, 164, 43, 228, 57, 244, 181, 220, 149, 224, 180, 44,
- 228, 57, 244, 181, 220, 149, 224, 180, 43, 220, 149, 224, 180, 44, 220,
- 149, 224, 180, 223, 49, 216, 89, 245, 97, 249, 99, 232, 146, 226, 158,
- 249, 99, 232, 146, 254, 118, 52, 218, 63, 52, 218, 21, 52, 235, 198, 52,
- 214, 175, 225, 47, 128, 22, 226, 8, 111, 233, 15, 2, 247, 120, 242, 130,
- 2, 247, 120, 213, 187, 230, 97, 233, 14, 213, 187, 230, 97, 242, 129,
- 233, 15, 128, 216, 42, 177, 242, 129, 242, 130, 128, 216, 42, 177, 233,
- 14, 128, 216, 42, 177, 233, 14, 128, 216, 42, 177, 242, 129, 128, 216,
- 42, 177, 224, 202, 128, 216, 42, 177, 218, 55, 247, 138, 228, 52, 224,
- 206, 177, 245, 99, 247, 138, 228, 52, 218, 58, 177, 245, 99, 228, 52, 42,
- 236, 15, 64, 177, 128, 111, 228, 52, 42, 226, 150, 64, 177, 128, 111, 42,
- 236, 15, 64, 177, 228, 52, 128, 111, 42, 226, 150, 64, 177, 228, 52, 128,
- 111, 233, 15, 251, 88, 228, 52, 245, 94, 111, 242, 130, 251, 88, 228, 52,
- 245, 94, 111, 224, 203, 251, 88, 228, 52, 245, 94, 111, 218, 56, 251, 88,
- 228, 52, 245, 94, 111, 228, 52, 228, 57, 218, 77, 226, 231, 247, 138,
- 228, 52, 249, 188, 253, 238, 228, 57, 218, 76, 228, 52, 228, 57, 218, 77,
- 64, 177, 128, 111, 247, 138, 228, 52, 249, 188, 253, 238, 228, 57, 218,
- 77, 177, 245, 99, 67, 245, 163, 230, 222, 203, 245, 163, 120, 44, 247,
- 255, 245, 163, 124, 44, 247, 255, 245, 163, 245, 170, 64, 2, 199, 203,
- 91, 245, 170, 64, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203, 91, 4,
- 245, 170, 64, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203, 91, 245, 170,
- 64, 2, 59, 48, 245, 170, 64, 2, 226, 123, 4, 245, 170, 64, 2, 226, 123,
- 245, 170, 64, 2, 214, 183, 245, 170, 64, 2, 113, 203, 218, 90, 249, 186,
- 2, 199, 203, 91, 249, 186, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203,
- 91, 4, 249, 186, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203, 91, 249,
- 186, 2, 226, 123, 4, 249, 186, 2, 226, 123, 210, 160, 187, 252, 173, 231,
- 61, 247, 250, 50, 245, 172, 74, 240, 234, 120, 253, 249, 124, 253, 249,
- 224, 175, 225, 165, 212, 32, 232, 213, 43, 250, 181, 44, 250, 181, 43,
- 244, 57, 44, 244, 57, 251, 175, 44, 249, 132, 251, 175, 43, 249, 132,
- 216, 14, 44, 249, 132, 216, 14, 43, 249, 132, 223, 49, 228, 52, 50, 42,
- 232, 104, 254, 25, 221, 164, 221, 171, 217, 1, 223, 120, 224, 241, 235,
- 238, 213, 165, 218, 234, 225, 41, 64, 235, 207, 50, 215, 94, 228, 52, 50,
- 212, 42, 240, 236, 216, 14, 43, 249, 160, 216, 14, 44, 249, 160, 251,
- 175, 43, 249, 160, 251, 175, 44, 249, 160, 216, 14, 163, 235, 211, 251,
- 175, 163, 235, 211, 243, 240, 219, 75, 120, 253, 250, 252, 24, 113, 203,
- 252, 129, 226, 160, 234, 138, 245, 90, 216, 42, 216, 196, 222, 251, 211,
- 179, 236, 0, 115, 223, 117, 251, 163, 234, 137, 233, 42, 254, 110, 127,
- 222, 247, 254, 110, 127, 245, 90, 216, 42, 216, 196, 233, 46, 252, 35,
- 222, 233, 249, 70, 254, 155, 254, 1, 217, 181, 216, 4, 222, 123, 247,
- 215, 226, 151, 249, 198, 217, 52, 219, 86, 249, 151, 249, 150, 254, 66,
- 243, 225, 16, 240, 151, 254, 66, 243, 225, 16, 218, 228, 224, 27, 254,
- 66, 243, 225, 16, 224, 28, 245, 99, 254, 66, 243, 225, 16, 224, 28, 247,
- 174, 254, 66, 243, 225, 16, 224, 28, 247, 248, 254, 66, 243, 225, 16,
- 224, 28, 235, 56, 254, 66, 243, 225, 16, 224, 28, 250, 35, 254, 66, 243,
- 225, 16, 250, 36, 218, 135, 254, 66, 243, 225, 16, 250, 36, 235, 56, 254,
- 66, 243, 225, 16, 219, 96, 130, 254, 66, 243, 225, 16, 252, 181, 130,
- 254, 66, 243, 225, 16, 224, 28, 219, 95, 254, 66, 243, 225, 16, 224, 28,
- 252, 180, 254, 66, 243, 225, 16, 224, 28, 233, 14, 254, 66, 243, 225, 16,
- 224, 28, 242, 129, 254, 66, 243, 225, 16, 140, 214, 19, 254, 66, 243,
- 225, 16, 97, 214, 19, 254, 66, 243, 225, 16, 224, 28, 140, 74, 254, 66,
- 243, 225, 16, 224, 28, 97, 74, 254, 66, 243, 225, 16, 250, 36, 252, 180,
- 254, 66, 243, 225, 16, 124, 217, 88, 214, 183, 254, 66, 243, 225, 16,
- 248, 55, 218, 135, 254, 66, 243, 225, 16, 224, 28, 124, 250, 238, 254,
- 66, 243, 225, 16, 224, 28, 248, 54, 254, 66, 243, 225, 16, 124, 217, 88,
- 235, 56, 254, 66, 243, 225, 16, 214, 153, 214, 19, 254, 66, 243, 225, 16,
- 224, 28, 214, 153, 74, 254, 66, 243, 225, 16, 120, 217, 88, 226, 123,
- 254, 66, 243, 225, 16, 248, 66, 218, 135, 254, 66, 243, 225, 16, 224, 28,
- 120, 250, 238, 254, 66, 243, 225, 16, 224, 28, 248, 65, 254, 66, 243,
- 225, 16, 120, 217, 88, 235, 56, 254, 66, 243, 225, 16, 246, 104, 214, 19,
- 254, 66, 243, 225, 16, 224, 28, 246, 104, 74, 254, 66, 243, 225, 16, 223,
- 253, 214, 183, 254, 66, 243, 225, 16, 248, 55, 214, 183, 254, 66, 243,
- 225, 16, 247, 249, 214, 183, 254, 66, 243, 225, 16, 235, 57, 214, 183,
- 254, 66, 243, 225, 16, 250, 36, 214, 183, 254, 66, 243, 225, 16, 120,
- 220, 5, 235, 56, 254, 66, 243, 225, 16, 223, 253, 224, 27, 254, 66, 243,
- 225, 16, 250, 36, 218, 156, 254, 66, 243, 225, 16, 224, 28, 249, 226,
- 254, 66, 243, 225, 16, 120, 217, 88, 248, 1, 254, 66, 243, 225, 16, 248,
- 66, 248, 1, 254, 66, 243, 225, 16, 218, 157, 248, 1, 254, 66, 243, 225,
- 16, 235, 57, 248, 1, 254, 66, 243, 225, 16, 250, 36, 248, 1, 254, 66,
- 243, 225, 16, 124, 220, 5, 218, 135, 254, 66, 243, 225, 16, 43, 220, 5,
- 218, 135, 254, 66, 243, 225, 16, 216, 89, 248, 1, 254, 66, 243, 225, 16,
- 242, 130, 248, 1, 254, 66, 243, 225, 16, 249, 220, 130, 254, 66, 243,
- 225, 16, 248, 66, 182, 254, 66, 243, 225, 16, 210, 34, 254, 66, 243, 225,
- 16, 218, 136, 182, 254, 66, 243, 225, 16, 220, 151, 214, 183, 254, 66,
- 243, 225, 16, 224, 28, 228, 52, 245, 99, 254, 66, 243, 225, 16, 224, 28,
- 224, 12, 254, 66, 243, 225, 16, 124, 250, 239, 182, 254, 66, 243, 225,
- 16, 120, 250, 239, 182, 254, 66, 243, 225, 16, 235, 185, 254, 66, 243,
- 225, 16, 223, 37, 254, 66, 243, 225, 16, 226, 201, 254, 66, 243, 225, 16,
- 254, 144, 214, 183, 254, 66, 243, 225, 16, 245, 101, 214, 183, 254, 66,
- 243, 225, 16, 235, 186, 214, 183, 254, 66, 243, 225, 16, 226, 202, 214,
- 183, 254, 66, 243, 225, 16, 254, 143, 228, 52, 250, 130, 78, 44, 254,
- 110, 2, 246, 104, 210, 35, 74, 219, 235, 204, 251, 163, 252, 45, 87, 67,
- 232, 214, 2, 230, 224, 247, 120, 235, 216, 87, 249, 183, 214, 181, 87,
- 247, 189, 214, 181, 87, 245, 154, 87, 249, 210, 87, 71, 42, 2, 250, 175,
- 67, 232, 213, 245, 130, 87, 254, 139, 234, 139, 87, 241, 213, 87, 37,
- 203, 252, 141, 2, 228, 50, 37, 215, 226, 246, 106, 251, 135, 250, 36, 2,
- 228, 54, 74, 214, 179, 87, 230, 137, 87, 240, 164, 87, 226, 174, 242, 59,
- 87, 226, 174, 233, 147, 87, 225, 244, 87, 225, 243, 87, 247, 197, 249,
- 97, 16, 244, 20, 105, 219, 50, 87, 254, 66, 243, 225, 16, 224, 27, 248,
- 83, 220, 138, 234, 139, 87, 224, 192, 226, 75, 229, 82, 226, 75, 224,
- 188, 221, 189, 87, 250, 17, 221, 189, 87, 43, 226, 4, 214, 160, 103, 43,
- 226, 4, 245, 21, 43, 226, 4, 232, 108, 103, 44, 226, 4, 214, 160, 103,
- 44, 226, 4, 245, 21, 44, 226, 4, 232, 108, 103, 43, 42, 251, 158, 214,
- 160, 249, 160, 43, 42, 251, 158, 245, 21, 43, 42, 251, 158, 232, 108,
- 249, 160, 44, 42, 251, 158, 214, 160, 249, 160, 44, 42, 251, 158, 245,
- 21, 44, 42, 251, 158, 232, 108, 249, 160, 43, 249, 99, 251, 158, 214,
- 160, 103, 43, 249, 99, 251, 158, 230, 224, 225, 101, 43, 249, 99, 251,
- 158, 232, 108, 103, 249, 99, 251, 158, 245, 21, 44, 249, 99, 251, 158,
- 214, 160, 103, 44, 249, 99, 251, 158, 230, 224, 225, 101, 44, 249, 99,
- 251, 158, 232, 108, 103, 235, 212, 245, 21, 203, 232, 214, 245, 21, 214,
- 160, 43, 177, 232, 108, 44, 249, 99, 251, 158, 221, 172, 214, 160, 44,
- 177, 232, 108, 43, 249, 99, 251, 158, 221, 172, 218, 41, 216, 13, 218,
- 41, 251, 174, 216, 14, 42, 127, 251, 175, 42, 127, 251, 175, 42, 251,
- 158, 117, 216, 14, 42, 127, 34, 16, 251, 174, 43, 67, 93, 232, 213, 44,
- 67, 93, 232, 213, 203, 221, 205, 232, 212, 203, 221, 205, 232, 211, 203,
- 221, 205, 232, 210, 203, 221, 205, 232, 209, 248, 46, 16, 192, 67, 22,
- 216, 14, 222, 251, 248, 46, 16, 192, 67, 22, 251, 175, 222, 251, 248, 46,
- 16, 192, 67, 2, 250, 35, 248, 46, 16, 192, 124, 22, 203, 2, 250, 35, 248,
- 46, 16, 192, 120, 22, 203, 2, 250, 35, 248, 46, 16, 192, 67, 2, 215, 225,
- 248, 46, 16, 192, 124, 22, 203, 2, 215, 225, 248, 46, 16, 192, 120, 22,
- 203, 2, 215, 225, 248, 46, 16, 192, 67, 22, 212, 35, 248, 46, 16, 192,
- 124, 22, 203, 2, 212, 35, 248, 46, 16, 192, 120, 22, 203, 2, 212, 35,
- 248, 46, 16, 192, 124, 22, 241, 44, 248, 46, 16, 192, 120, 22, 241, 44,
- 248, 46, 16, 192, 67, 22, 216, 14, 233, 46, 248, 46, 16, 192, 67, 22,
- 251, 175, 233, 46, 42, 244, 32, 223, 54, 87, 245, 182, 87, 67, 232, 214,
- 245, 21, 231, 33, 251, 146, 231, 33, 199, 117, 219, 250, 231, 33, 219,
- 251, 117, 232, 137, 231, 33, 199, 117, 113, 219, 237, 231, 33, 113, 219,
- 238, 117, 232, 137, 231, 33, 113, 219, 238, 235, 64, 231, 33, 215, 208,
- 231, 33, 216, 223, 231, 33, 225, 188, 245, 224, 242, 122, 243, 219, 216,
- 14, 226, 3, 251, 175, 226, 3, 216, 14, 249, 99, 127, 251, 175, 249, 99,
- 127, 216, 14, 216, 6, 220, 53, 127, 251, 175, 216, 6, 220, 53, 127, 71,
- 215, 239, 252, 35, 222, 234, 2, 250, 35, 218, 120, 244, 64, 255, 17, 249,
- 96, 245, 171, 235, 198, 248, 83, 245, 24, 87, 85, 222, 247, 52, 215, 225,
- 85, 233, 42, 52, 215, 225, 85, 214, 162, 52, 215, 225, 85, 246, 105, 52,
- 215, 225, 85, 222, 247, 52, 215, 226, 2, 67, 130, 85, 233, 42, 52, 215,
- 226, 2, 67, 130, 85, 222, 247, 215, 226, 2, 52, 67, 130, 254, 173, 250,
- 3, 218, 126, 216, 86, 250, 3, 240, 237, 2, 244, 50, 221, 241, 16, 31,
- 227, 202, 16, 31, 218, 152, 64, 241, 233, 16, 31, 218, 152, 64, 216, 212,
- 16, 31, 245, 143, 64, 216, 212, 16, 31, 245, 143, 64, 215, 243, 16, 31,
- 245, 132, 16, 31, 255, 7, 16, 31, 252, 44, 16, 31, 252, 179, 16, 31, 203,
- 217, 89, 16, 31, 232, 214, 244, 145, 16, 31, 67, 217, 89, 16, 31, 244,
- 20, 244, 145, 16, 31, 250, 230, 223, 53, 16, 31, 220, 28, 226, 130, 16,
- 31, 220, 28, 235, 255, 16, 31, 248, 151, 232, 204, 245, 77, 16, 31, 248,
- 31, 249, 178, 110, 16, 31, 248, 31, 249, 178, 105, 16, 31, 248, 31, 249,
- 178, 158, 16, 31, 248, 31, 249, 178, 161, 16, 31, 152, 255, 7, 16, 31,
- 217, 177, 236, 62, 16, 31, 245, 143, 64, 215, 244, 251, 213, 16, 31, 251,
- 5, 16, 31, 245, 143, 64, 231, 81, 16, 31, 218, 61, 16, 31, 245, 77, 16,
- 31, 244, 107, 220, 137, 16, 31, 242, 121, 220, 137, 16, 31, 223, 121,
- 220, 137, 16, 31, 214, 174, 220, 137, 16, 31, 219, 18, 16, 31, 248, 63,
- 251, 216, 87, 204, 251, 163, 16, 31, 229, 85, 16, 31, 248, 64, 244, 20,
- 105, 16, 31, 218, 62, 244, 20, 105, 226, 241, 103, 226, 241, 250, 152,
- 226, 241, 244, 23, 226, 241, 235, 193, 244, 23, 226, 241, 252, 42, 251,
- 124, 226, 241, 251, 170, 216, 111, 226, 241, 251, 155, 252, 146, 240,
- 103, 226, 241, 254, 127, 64, 250, 129, 226, 241, 248, 156, 226, 241, 249,
- 87, 255, 11, 227, 200, 226, 241, 52, 252, 180, 37, 21, 110, 37, 21, 105,
- 37, 21, 158, 37, 21, 161, 37, 21, 189, 37, 21, 194, 37, 21, 198, 37, 21,
- 195, 37, 21, 200, 37, 54, 216, 247, 37, 54, 245, 167, 37, 54, 215, 76,
- 37, 54, 216, 164, 37, 54, 244, 5, 37, 54, 244, 118, 37, 54, 219, 119, 37,
- 54, 220, 119, 37, 54, 245, 190, 37, 54, 228, 197, 37, 54, 215, 73, 88,
- 21, 110, 88, 21, 105, 88, 21, 158, 88, 21, 161, 88, 21, 189, 88, 21, 194,
- 88, 21, 198, 88, 21, 195, 88, 21, 200, 88, 54, 216, 247, 88, 54, 245,
- 167, 88, 54, 215, 76, 88, 54, 216, 164, 88, 54, 244, 5, 88, 54, 244, 118,
- 88, 54, 219, 119, 88, 54, 220, 119, 88, 54, 245, 190, 88, 54, 228, 197,
- 88, 54, 215, 73, 21, 123, 243, 229, 218, 129, 21, 113, 243, 229, 218,
- 129, 21, 134, 243, 229, 218, 129, 21, 244, 11, 243, 229, 218, 129, 21,
- 244, 81, 243, 229, 218, 129, 21, 219, 125, 243, 229, 218, 129, 21, 220,
- 122, 243, 229, 218, 129, 21, 245, 193, 243, 229, 218, 129, 21, 228, 200,
- 243, 229, 218, 129, 54, 216, 248, 243, 229, 218, 129, 54, 245, 168, 243,
- 229, 218, 129, 54, 215, 77, 243, 229, 218, 129, 54, 216, 165, 243, 229,
- 218, 129, 54, 244, 6, 243, 229, 218, 129, 54, 244, 119, 243, 229, 218,
- 129, 54, 219, 120, 243, 229, 218, 129, 54, 220, 120, 243, 229, 218, 129,
- 54, 245, 191, 243, 229, 218, 129, 54, 228, 198, 243, 229, 218, 129, 54,
- 215, 74, 243, 229, 218, 129, 88, 7, 4, 1, 61, 88, 7, 4, 1, 253, 158, 88,
- 7, 4, 1, 251, 66, 88, 7, 4, 1, 249, 60, 88, 7, 4, 1, 75, 88, 7, 4, 1,
- 245, 6, 88, 7, 4, 1, 243, 202, 88, 7, 4, 1, 242, 60, 88, 7, 4, 1, 73, 88,
- 7, 4, 1, 235, 144, 88, 7, 4, 1, 235, 23, 88, 7, 4, 1, 156, 88, 7, 4, 1,
- 193, 88, 7, 4, 1, 230, 25, 88, 7, 4, 1, 76, 88, 7, 4, 1, 226, 105, 88, 7,
- 4, 1, 224, 96, 88, 7, 4, 1, 153, 88, 7, 4, 1, 222, 91, 88, 7, 4, 1, 217,
- 152, 88, 7, 4, 1, 70, 88, 7, 4, 1, 214, 105, 88, 7, 4, 1, 212, 98, 88, 7,
- 4, 1, 211, 178, 88, 7, 4, 1, 211, 117, 88, 7, 4, 1, 210, 159, 37, 7, 6,
- 1, 61, 37, 7, 6, 1, 253, 158, 37, 7, 6, 1, 251, 66, 37, 7, 6, 1, 249, 60,
- 37, 7, 6, 1, 75, 37, 7, 6, 1, 245, 6, 37, 7, 6, 1, 243, 202, 37, 7, 6, 1,
- 242, 60, 37, 7, 6, 1, 73, 37, 7, 6, 1, 235, 144, 37, 7, 6, 1, 235, 23,
- 37, 7, 6, 1, 156, 37, 7, 6, 1, 193, 37, 7, 6, 1, 230, 25, 37, 7, 6, 1,
- 76, 37, 7, 6, 1, 226, 105, 37, 7, 6, 1, 224, 96, 37, 7, 6, 1, 153, 37, 7,
- 6, 1, 222, 91, 37, 7, 6, 1, 217, 152, 37, 7, 6, 1, 70, 37, 7, 6, 1, 214,
- 105, 37, 7, 6, 1, 212, 98, 37, 7, 6, 1, 211, 178, 37, 7, 6, 1, 211, 117,
- 37, 7, 6, 1, 210, 159, 37, 7, 4, 1, 61, 37, 7, 4, 1, 253, 158, 37, 7, 4,
- 1, 251, 66, 37, 7, 4, 1, 249, 60, 37, 7, 4, 1, 75, 37, 7, 4, 1, 245, 6,
- 37, 7, 4, 1, 243, 202, 37, 7, 4, 1, 242, 60, 37, 7, 4, 1, 73, 37, 7, 4,
- 1, 235, 144, 37, 7, 4, 1, 235, 23, 37, 7, 4, 1, 156, 37, 7, 4, 1, 193,
- 37, 7, 4, 1, 230, 25, 37, 7, 4, 1, 76, 37, 7, 4, 1, 226, 105, 37, 7, 4,
- 1, 224, 96, 37, 7, 4, 1, 153, 37, 7, 4, 1, 222, 91, 37, 7, 4, 1, 217,
- 152, 37, 7, 4, 1, 70, 37, 7, 4, 1, 214, 105, 37, 7, 4, 1, 212, 98, 37, 7,
- 4, 1, 211, 178, 37, 7, 4, 1, 211, 117, 37, 7, 4, 1, 210, 159, 37, 21,
- 210, 86, 152, 37, 54, 245, 167, 152, 37, 54, 215, 76, 152, 37, 54, 216,
- 164, 152, 37, 54, 244, 5, 152, 37, 54, 244, 118, 152, 37, 54, 219, 119,
- 152, 37, 54, 220, 119, 152, 37, 54, 245, 190, 152, 37, 54, 228, 197, 152,
- 37, 54, 215, 73, 52, 37, 21, 110, 52, 37, 21, 105, 52, 37, 21, 158, 52,
- 37, 21, 161, 52, 37, 21, 189, 52, 37, 21, 194, 52, 37, 21, 198, 52, 37,
- 21, 195, 52, 37, 21, 200, 52, 37, 54, 216, 247, 152, 37, 21, 210, 86, 93,
- 99, 192, 241, 44, 93, 99, 114, 241, 44, 93, 99, 192, 213, 239, 93, 99,
- 114, 213, 239, 93, 99, 192, 215, 211, 248, 157, 241, 44, 93, 99, 114,
- 215, 211, 248, 157, 241, 44, 93, 99, 192, 215, 211, 248, 157, 213, 239,
- 93, 99, 114, 215, 211, 248, 157, 213, 239, 93, 99, 192, 224, 24, 248,
- 157, 241, 44, 93, 99, 114, 224, 24, 248, 157, 241, 44, 93, 99, 192, 224,
- 24, 248, 157, 213, 239, 93, 99, 114, 224, 24, 248, 157, 213, 239, 93, 99,
- 192, 124, 22, 222, 251, 93, 99, 124, 192, 22, 44, 241, 221, 93, 99, 124,
- 114, 22, 44, 232, 230, 93, 99, 114, 124, 22, 222, 251, 93, 99, 192, 124,
- 22, 233, 46, 93, 99, 124, 192, 22, 43, 241, 221, 93, 99, 124, 114, 22,
- 43, 232, 230, 93, 99, 114, 124, 22, 233, 46, 93, 99, 192, 120, 22, 222,
- 251, 93, 99, 120, 192, 22, 44, 241, 221, 93, 99, 120, 114, 22, 44, 232,
- 230, 93, 99, 114, 120, 22, 222, 251, 93, 99, 192, 120, 22, 233, 46, 93,
- 99, 120, 192, 22, 43, 241, 221, 93, 99, 120, 114, 22, 43, 232, 230, 93,
- 99, 114, 120, 22, 233, 46, 93, 99, 192, 67, 22, 222, 251, 93, 99, 67,
- 192, 22, 44, 241, 221, 93, 99, 120, 114, 22, 44, 124, 232, 230, 93, 99,
- 124, 114, 22, 44, 120, 232, 230, 93, 99, 67, 114, 22, 44, 232, 230, 93,
- 99, 124, 192, 22, 44, 120, 241, 221, 93, 99, 120, 192, 22, 44, 124, 241,
- 221, 93, 99, 114, 67, 22, 222, 251, 93, 99, 192, 67, 22, 233, 46, 93, 99,
- 67, 192, 22, 43, 241, 221, 93, 99, 120, 114, 22, 43, 124, 232, 230, 93,
- 99, 124, 114, 22, 43, 120, 232, 230, 93, 99, 67, 114, 22, 43, 232, 230,
- 93, 99, 124, 192, 22, 43, 120, 241, 221, 93, 99, 120, 192, 22, 43, 124,
- 241, 221, 93, 99, 114, 67, 22, 233, 46, 93, 99, 192, 124, 22, 241, 44,
- 93, 99, 43, 114, 22, 44, 124, 232, 230, 93, 99, 44, 114, 22, 43, 124,
- 232, 230, 93, 99, 124, 192, 22, 203, 241, 221, 93, 99, 124, 114, 22, 203,
- 232, 230, 93, 99, 44, 192, 22, 43, 124, 241, 221, 93, 99, 43, 192, 22,
- 44, 124, 241, 221, 93, 99, 114, 124, 22, 241, 44, 93, 99, 192, 120, 22,
- 241, 44, 93, 99, 43, 114, 22, 44, 120, 232, 230, 93, 99, 44, 114, 22, 43,
- 120, 232, 230, 93, 99, 120, 192, 22, 203, 241, 221, 93, 99, 120, 114, 22,
- 203, 232, 230, 93, 99, 44, 192, 22, 43, 120, 241, 221, 93, 99, 43, 192,
- 22, 44, 120, 241, 221, 93, 99, 114, 120, 22, 241, 44, 93, 99, 192, 67,
- 22, 241, 44, 93, 99, 43, 114, 22, 44, 67, 232, 230, 93, 99, 44, 114, 22,
- 43, 67, 232, 230, 93, 99, 67, 192, 22, 203, 241, 221, 93, 99, 120, 114,
- 22, 124, 203, 232, 230, 93, 99, 124, 114, 22, 120, 203, 232, 230, 93, 99,
- 67, 114, 22, 203, 232, 230, 93, 99, 43, 120, 114, 22, 44, 124, 232, 230,
- 93, 99, 44, 120, 114, 22, 43, 124, 232, 230, 93, 99, 43, 124, 114, 22,
- 44, 120, 232, 230, 93, 99, 44, 124, 114, 22, 43, 120, 232, 230, 93, 99,
- 124, 192, 22, 120, 203, 241, 221, 93, 99, 120, 192, 22, 124, 203, 241,
- 221, 93, 99, 44, 192, 22, 43, 67, 241, 221, 93, 99, 43, 192, 22, 44, 67,
- 241, 221, 93, 99, 114, 67, 22, 241, 44, 93, 99, 192, 52, 248, 157, 241,
- 44, 93, 99, 114, 52, 248, 157, 241, 44, 93, 99, 192, 52, 248, 157, 213,
- 239, 93, 99, 114, 52, 248, 157, 213, 239, 93, 99, 52, 241, 44, 93, 99,
- 52, 213, 239, 93, 99, 124, 219, 155, 22, 44, 246, 113, 93, 99, 124, 52,
- 22, 44, 219, 154, 93, 99, 52, 124, 22, 222, 251, 93, 99, 124, 219, 155,
- 22, 43, 246, 113, 93, 99, 124, 52, 22, 43, 219, 154, 93, 99, 52, 124, 22,
- 233, 46, 93, 99, 120, 219, 155, 22, 44, 246, 113, 93, 99, 120, 52, 22,
- 44, 219, 154, 93, 99, 52, 120, 22, 222, 251, 93, 99, 120, 219, 155, 22,
- 43, 246, 113, 93, 99, 120, 52, 22, 43, 219, 154, 93, 99, 52, 120, 22,
- 233, 46, 93, 99, 67, 219, 155, 22, 44, 246, 113, 93, 99, 67, 52, 22, 44,
- 219, 154, 93, 99, 52, 67, 22, 222, 251, 93, 99, 67, 219, 155, 22, 43,
- 246, 113, 93, 99, 67, 52, 22, 43, 219, 154, 93, 99, 52, 67, 22, 233, 46,
- 93, 99, 124, 219, 155, 22, 203, 246, 113, 93, 99, 124, 52, 22, 203, 219,
- 154, 93, 99, 52, 124, 22, 241, 44, 93, 99, 120, 219, 155, 22, 203, 246,
- 113, 93, 99, 120, 52, 22, 203, 219, 154, 93, 99, 52, 120, 22, 241, 44,
- 93, 99, 67, 219, 155, 22, 203, 246, 113, 93, 99, 67, 52, 22, 203, 219,
- 154, 93, 99, 52, 67, 22, 241, 44, 93, 99, 192, 254, 26, 124, 22, 222,
- 251, 93, 99, 192, 254, 26, 124, 22, 233, 46, 93, 99, 192, 254, 26, 120,
- 22, 233, 46, 93, 99, 192, 254, 26, 120, 22, 222, 251, 93, 99, 192, 247,
- 255, 214, 160, 44, 216, 42, 232, 108, 233, 46, 93, 99, 192, 247, 255,
- 214, 160, 43, 216, 42, 232, 108, 222, 251, 93, 99, 192, 247, 255, 249,
- 130, 93, 99, 192, 233, 46, 93, 99, 192, 214, 163, 93, 99, 192, 222, 251,
- 93, 99, 192, 246, 106, 93, 99, 114, 233, 46, 93, 99, 114, 214, 163, 93,
- 99, 114, 222, 251, 93, 99, 114, 246, 106, 93, 99, 192, 43, 22, 114, 222,
- 251, 93, 99, 192, 120, 22, 114, 246, 106, 93, 99, 114, 43, 22, 192, 222,
- 251, 93, 99, 114, 120, 22, 192, 246, 106, 214, 160, 163, 251, 213, 232,
- 108, 123, 245, 189, 251, 213, 232, 108, 123, 224, 22, 251, 213, 232, 108,
- 134, 245, 187, 251, 213, 232, 108, 163, 251, 213, 232, 108, 244, 81, 245,
- 187, 251, 213, 232, 108, 134, 224, 20, 251, 213, 232, 108, 220, 122, 245,
- 187, 251, 213, 243, 229, 251, 213, 43, 220, 122, 245, 187, 251, 213, 43,
- 134, 224, 20, 251, 213, 43, 244, 81, 245, 187, 251, 213, 43, 163, 251,
- 213, 43, 134, 245, 187, 251, 213, 43, 123, 224, 22, 251, 213, 43, 123,
- 245, 189, 251, 213, 44, 163, 251, 213, 192, 220, 92, 231, 82, 220, 92,
- 248, 162, 220, 92, 214, 160, 123, 245, 189, 251, 213, 44, 123, 245, 189,
- 251, 213, 224, 26, 232, 108, 233, 46, 224, 26, 232, 108, 222, 251, 224,
- 26, 214, 160, 233, 46, 224, 26, 214, 160, 43, 22, 232, 108, 43, 22, 232,
- 108, 222, 251, 224, 26, 214, 160, 43, 22, 232, 108, 222, 251, 224, 26,
- 214, 160, 43, 22, 214, 160, 44, 22, 232, 108, 233, 46, 224, 26, 214, 160,
- 43, 22, 214, 160, 44, 22, 232, 108, 222, 251, 224, 26, 214, 160, 222,
- 251, 224, 26, 214, 160, 44, 22, 232, 108, 233, 46, 224, 26, 214, 160, 44,
- 22, 232, 108, 43, 22, 232, 108, 222, 251, 85, 218, 234, 71, 218, 234, 71,
- 42, 2, 222, 183, 249, 159, 71, 42, 249, 187, 85, 4, 218, 234, 42, 2, 203,
- 244, 105, 42, 2, 67, 244, 105, 42, 2, 226, 144, 249, 126, 244, 105, 42,
- 2, 214, 160, 43, 216, 42, 232, 108, 44, 244, 105, 42, 2, 214, 160, 44,
- 216, 42, 232, 108, 43, 244, 105, 42, 2, 247, 255, 249, 126, 244, 105, 85,
- 4, 218, 234, 71, 4, 218, 234, 85, 223, 116, 71, 223, 116, 85, 67, 223,
- 116, 71, 67, 223, 116, 85, 226, 6, 71, 226, 6, 85, 214, 162, 215, 225,
- 71, 214, 162, 215, 225, 85, 214, 162, 4, 215, 225, 71, 214, 162, 4, 215,
- 225, 85, 222, 247, 215, 225, 71, 222, 247, 215, 225, 85, 222, 247, 4,
- 215, 225, 71, 222, 247, 4, 215, 225, 85, 222, 247, 225, 8, 71, 222, 247,
- 225, 8, 85, 246, 105, 215, 225, 71, 246, 105, 215, 225, 85, 246, 105, 4,
- 215, 225, 71, 246, 105, 4, 215, 225, 85, 233, 42, 215, 225, 71, 233, 42,
- 215, 225, 85, 233, 42, 4, 215, 225, 71, 233, 42, 4, 215, 225, 85, 233,
- 42, 225, 8, 71, 233, 42, 225, 8, 85, 247, 248, 71, 247, 248, 71, 247,
- 249, 249, 187, 85, 4, 247, 248, 244, 89, 232, 104, 71, 250, 35, 246, 118,
- 250, 35, 250, 36, 2, 67, 244, 105, 251, 111, 85, 250, 35, 250, 36, 2, 43,
- 163, 251, 221, 250, 36, 2, 44, 163, 251, 221, 250, 36, 2, 232, 108, 163,
- 251, 221, 250, 36, 2, 214, 160, 163, 251, 221, 250, 36, 2, 214, 160, 44,
- 224, 26, 251, 221, 250, 36, 2, 254, 155, 251, 88, 214, 160, 43, 224, 26,
- 251, 221, 43, 163, 85, 250, 35, 44, 163, 85, 250, 35, 235, 194, 251, 113,
- 235, 194, 71, 250, 35, 214, 160, 163, 235, 194, 71, 250, 35, 232, 108,
- 163, 235, 194, 71, 250, 35, 214, 160, 43, 224, 26, 250, 33, 254, 25, 214,
- 160, 44, 224, 26, 250, 33, 254, 25, 232, 108, 44, 224, 26, 250, 33, 254,
- 25, 232, 108, 43, 224, 26, 250, 33, 254, 25, 214, 160, 163, 250, 35, 232,
- 108, 163, 250, 35, 85, 232, 108, 44, 215, 225, 85, 232, 108, 43, 215,
- 225, 85, 214, 160, 43, 215, 225, 85, 214, 160, 44, 215, 225, 71, 251,
- 113, 42, 2, 43, 163, 251, 221, 42, 2, 44, 163, 251, 221, 42, 2, 214, 160,
- 43, 247, 255, 163, 251, 221, 42, 2, 232, 108, 44, 247, 255, 163, 251,
- 221, 71, 42, 2, 67, 251, 232, 232, 213, 71, 214, 162, 215, 226, 2, 247,
- 120, 214, 162, 215, 226, 2, 43, 163, 251, 221, 214, 162, 215, 226, 2, 44,
- 163, 251, 221, 233, 85, 250, 35, 71, 42, 2, 214, 160, 43, 224, 25, 71,
- 42, 2, 232, 108, 43, 224, 25, 71, 42, 2, 232, 108, 44, 224, 25, 71, 42,
- 2, 214, 160, 44, 224, 25, 71, 250, 36, 2, 214, 160, 43, 224, 25, 71, 250,
- 36, 2, 232, 108, 43, 224, 25, 71, 250, 36, 2, 232, 108, 44, 224, 25, 71,
- 250, 36, 2, 214, 160, 44, 224, 25, 214, 160, 43, 215, 225, 214, 160, 44,
- 215, 225, 232, 108, 43, 215, 225, 71, 231, 82, 218, 234, 85, 231, 82,
- 218, 234, 71, 231, 82, 4, 218, 234, 85, 231, 82, 4, 218, 234, 232, 108,
- 44, 215, 225, 85, 218, 38, 2, 223, 132, 249, 247, 214, 194, 219, 60, 249,
- 222, 85, 218, 156, 71, 218, 156, 232, 228, 216, 132, 218, 37, 253, 234,
- 228, 71, 248, 38, 228, 71, 249, 195, 226, 163, 85, 217, 0, 71, 217, 0,
- 252, 156, 251, 163, 252, 156, 93, 2, 250, 129, 252, 156, 93, 2, 211, 178,
- 221, 254, 214, 195, 2, 223, 160, 246, 84, 240, 243, 252, 22, 71, 220, 2,
- 225, 101, 85, 220, 2, 225, 101, 220, 87, 223, 49, 222, 187, 244, 55, 241,
- 228, 251, 113, 85, 43, 225, 7, 235, 242, 85, 44, 225, 7, 235, 242, 71,
- 43, 225, 7, 235, 242, 71, 120, 225, 7, 235, 242, 71, 44, 225, 7, 235,
- 242, 71, 124, 225, 7, 235, 242, 219, 101, 22, 249, 129, 250, 219, 50,
- 223, 172, 50, 251, 239, 50, 251, 25, 254, 102, 226, 145, 249, 130, 250,
- 111, 223, 37, 249, 131, 64, 232, 118, 249, 131, 64, 235, 116, 218, 157,
- 22, 249, 136, 244, 168, 87, 254, 248, 220, 89, 242, 22, 22, 219, 189,
- 225, 220, 87, 210, 254, 211, 69, 215, 215, 31, 241, 223, 215, 215, 31,
- 233, 107, 215, 215, 31, 244, 96, 215, 215, 31, 216, 133, 215, 215, 31,
- 211, 239, 215, 215, 31, 212, 40, 215, 215, 31, 230, 115, 215, 215, 31,
- 245, 223, 212, 1, 64, 248, 18, 71, 243, 239, 244, 190, 71, 219, 74, 244,
- 190, 85, 219, 74, 244, 190, 71, 218, 38, 2, 223, 132, 244, 92, 224, 22,
- 230, 128, 233, 80, 224, 22, 230, 128, 231, 54, 244, 138, 50, 245, 223,
- 231, 190, 50, 235, 38, 221, 220, 214, 145, 229, 93, 225, 20, 254, 12,
- 217, 40, 243, 52, 251, 3, 233, 19, 213, 150, 232, 238, 221, 191, 222, 19,
- 250, 248, 254, 42, 225, 52, 71, 250, 117, 234, 78, 71, 250, 117, 224, 14,
- 71, 250, 117, 222, 195, 71, 250, 117, 251, 231, 71, 250, 117, 234, 30,
- 71, 250, 117, 225, 231, 85, 250, 117, 234, 78, 85, 250, 117, 224, 14, 85,
- 250, 117, 222, 195, 85, 250, 117, 251, 231, 85, 250, 117, 234, 30, 85,
- 250, 117, 225, 231, 85, 219, 16, 218, 50, 71, 241, 228, 218, 50, 71, 247,
- 249, 218, 50, 85, 249, 245, 218, 50, 71, 219, 16, 218, 50, 85, 241, 228,
- 218, 50, 85, 247, 249, 218, 50, 71, 249, 245, 218, 50, 240, 243, 218,
- 238, 224, 22, 228, 47, 245, 189, 228, 47, 252, 73, 245, 189, 228, 42,
- 252, 73, 219, 118, 228, 42, 230, 57, 244, 66, 50, 230, 57, 229, 188, 50,
- 230, 57, 220, 76, 50, 212, 9, 188, 249, 130, 245, 220, 188, 249, 130,
- 214, 171, 223, 112, 87, 223, 112, 16, 31, 215, 48, 225, 34, 223, 112, 16,
- 31, 215, 47, 225, 34, 223, 112, 16, 31, 215, 46, 225, 34, 223, 112, 16,
- 31, 215, 45, 225, 34, 223, 112, 16, 31, 215, 44, 225, 34, 223, 112, 16,
- 31, 215, 43, 225, 34, 223, 112, 16, 31, 215, 42, 225, 34, 223, 112, 16,
- 31, 243, 50, 231, 138, 85, 214, 171, 223, 112, 87, 223, 113, 226, 20, 87,
- 225, 252, 226, 20, 87, 225, 174, 226, 20, 50, 211, 255, 87, 247, 241,
- 244, 189, 247, 241, 244, 188, 247, 241, 244, 187, 247, 241, 244, 186,
- 247, 241, 244, 185, 247, 241, 244, 184, 71, 250, 36, 2, 59, 222, 251, 71,
- 250, 36, 2, 113, 247, 118, 85, 250, 36, 2, 71, 59, 222, 251, 85, 250, 36,
- 2, 113, 71, 247, 118, 230, 142, 31, 211, 69, 230, 142, 31, 210, 253, 247,
- 224, 31, 242, 131, 211, 69, 247, 224, 31, 233, 13, 210, 253, 247, 224,
- 31, 233, 13, 211, 69, 247, 224, 31, 242, 131, 210, 253, 71, 244, 73, 85,
- 244, 73, 242, 22, 22, 225, 104, 254, 120, 249, 128, 217, 235, 218, 164,
- 64, 254, 226, 221, 206, 254, 169, 244, 51, 243, 60, 218, 164, 64, 241,
- 202, 253, 199, 87, 244, 62, 226, 126, 71, 218, 156, 134, 232, 208, 249,
- 175, 222, 251, 134, 232, 208, 249, 175, 233, 46, 212, 50, 50, 125, 213,
- 130, 50, 246, 110, 244, 138, 50, 246, 110, 231, 190, 50, 235, 203, 244,
- 138, 22, 231, 190, 50, 231, 190, 22, 244, 138, 50, 231, 190, 2, 218, 103,
- 50, 231, 190, 2, 218, 103, 22, 231, 190, 22, 244, 138, 50, 67, 231, 190,
- 2, 218, 103, 50, 203, 231, 190, 2, 218, 103, 50, 231, 82, 71, 250, 35,
- 231, 82, 85, 250, 35, 231, 82, 4, 71, 250, 35, 231, 153, 87, 247, 167,
- 87, 214, 169, 225, 251, 87, 249, 231, 243, 224, 214, 141, 229, 88, 250,
- 161, 226, 61, 235, 44, 213, 185, 250, 93, 85, 230, 129, 232, 225, 220,
- 112, 220, 147, 224, 5, 220, 130, 219, 55, 252, 159, 252, 126, 92, 234,
- 138, 71, 246, 93, 231, 185, 71, 246, 93, 234, 78, 85, 246, 93, 231, 185,
- 85, 246, 93, 234, 78, 219, 61, 211, 230, 219, 64, 218, 38, 252, 51, 249,
- 247, 223, 159, 85, 219, 60, 216, 134, 249, 248, 22, 223, 159, 215, 94,
- 71, 220, 2, 225, 101, 215, 94, 85, 220, 2, 225, 101, 71, 247, 249, 236,
- 0, 218, 234, 249, 125, 233, 91, 247, 193, 250, 244, 226, 166, 225, 104,
- 250, 245, 219, 88, 241, 212, 2, 71, 249, 130, 37, 249, 125, 233, 91, 250,
- 153, 228, 75, 245, 124, 254, 141, 226, 191, 43, 212, 26, 215, 251, 85,
- 215, 55, 43, 212, 26, 215, 251, 71, 215, 55, 43, 212, 26, 215, 251, 85,
- 43, 233, 92, 231, 53, 71, 43, 233, 92, 231, 53, 246, 89, 219, 82, 50,
- 114, 71, 246, 105, 215, 225, 43, 250, 0, 245, 124, 92, 221, 254, 244,
- 175, 247, 255, 236, 0, 71, 250, 36, 236, 0, 85, 218, 234, 85, 215, 192,
- 223, 60, 43, 245, 123, 223, 60, 43, 245, 122, 253, 211, 16, 31, 214, 145,
- 114, 250, 36, 2, 218, 103, 22, 113, 170, 48, 225, 189, 222, 248, 235,
- 205, 225, 189, 233, 43, 235, 205, 225, 189, 235, 193, 225, 189, 85, 249,
- 131, 226, 197, 220, 29, 220, 17, 219, 229, 250, 61, 250, 226, 241, 157,
- 219, 126, 243, 61, 211, 230, 240, 220, 243, 61, 2, 242, 12, 231, 173, 16,
- 31, 232, 229, 230, 115, 214, 195, 226, 197, 242, 122, 244, 12, 244, 74,
- 236, 0, 241, 59, 244, 129, 222, 14, 42, 244, 11, 249, 159, 219, 104, 240,
- 112, 219, 107, 225, 168, 2, 252, 159, 216, 242, 235, 131, 252, 146, 87,
- 241, 231, 242, 133, 87, 243, 232, 224, 142, 249, 103, 226, 197, 85, 218,
- 234, 71, 244, 74, 2, 203, 230, 224, 85, 218, 104, 214, 160, 251, 217,
- 221, 193, 85, 221, 193, 232, 108, 251, 217, 221, 193, 71, 221, 193, 71,
- 114, 250, 130, 78, 217, 1, 232, 154, 50, 217, 53, 246, 88, 254, 191, 245,
- 119, 223, 157, 244, 85, 223, 157, 242, 15, 213, 174, 242, 15, 211, 198,
- 242, 15, 232, 108, 44, 225, 198, 225, 198, 214, 160, 44, 225, 198, 71,
- 228, 230, 85, 228, 230, 250, 130, 78, 114, 250, 130, 78, 230, 84, 211,
- 178, 114, 230, 84, 211, 178, 252, 156, 211, 178, 114, 252, 156, 211, 178,
- 226, 126, 26, 249, 130, 114, 26, 249, 130, 204, 250, 175, 249, 130, 114,
- 204, 250, 175, 249, 130, 7, 249, 130, 220, 91, 71, 7, 249, 130, 226, 126,
- 7, 249, 130, 231, 187, 249, 130, 218, 157, 64, 248, 149, 244, 11, 217,
- 15, 253, 216, 244, 11, 252, 157, 253, 216, 114, 244, 11, 252, 157, 253,
- 216, 244, 11, 249, 243, 253, 216, 85, 244, 11, 225, 9, 218, 156, 71, 244,
- 11, 225, 9, 218, 156, 219, 11, 218, 111, 226, 126, 71, 218, 156, 37, 71,
- 218, 156, 204, 250, 175, 85, 218, 156, 85, 250, 175, 71, 218, 156, 226,
- 126, 85, 218, 156, 114, 226, 126, 85, 218, 156, 225, 60, 218, 156, 220,
- 91, 71, 218, 156, 114, 253, 216, 204, 250, 175, 253, 216, 245, 193, 218,
- 244, 253, 216, 245, 193, 225, 9, 85, 218, 156, 245, 193, 225, 9, 225, 60,
- 218, 156, 219, 125, 225, 9, 85, 218, 156, 245, 193, 225, 9, 223, 114, 85,
- 218, 156, 114, 245, 193, 225, 9, 223, 114, 85, 218, 156, 215, 77, 225, 9,
- 85, 218, 156, 219, 120, 225, 9, 253, 216, 217, 15, 253, 216, 204, 250,
- 175, 217, 15, 253, 216, 114, 217, 15, 253, 216, 219, 125, 225, 157, 85,
- 22, 71, 244, 54, 85, 244, 54, 71, 244, 54, 245, 193, 225, 157, 226, 126,
- 85, 244, 54, 37, 204, 250, 175, 245, 193, 225, 9, 218, 156, 114, 217, 15,
- 225, 60, 253, 216, 219, 62, 216, 105, 215, 218, 219, 62, 114, 250, 114,
- 219, 62, 219, 13, 114, 219, 13, 252, 157, 253, 216, 245, 193, 217, 15,
- 224, 171, 253, 216, 114, 245, 193, 217, 15, 224, 171, 253, 216, 249, 131,
- 78, 220, 91, 71, 250, 35, 152, 92, 249, 131, 78, 232, 108, 44, 246, 86,
- 71, 218, 234, 214, 160, 44, 246, 86, 71, 218, 234, 232, 108, 44, 220, 91,
- 71, 218, 234, 214, 160, 44, 220, 91, 71, 218, 234, 85, 224, 13, 164, 226,
- 147, 71, 224, 13, 164, 226, 147, 71, 245, 31, 164, 226, 147, 85, 247,
- 249, 230, 182, 71, 211, 178, 114, 245, 31, 164, 87, 192, 67, 130, 231,
- 82, 67, 130, 114, 67, 130, 114, 219, 155, 215, 94, 249, 220, 223, 254,
- 164, 226, 147, 114, 219, 155, 249, 220, 223, 254, 164, 226, 147, 114, 52,
- 215, 94, 249, 220, 223, 254, 164, 226, 147, 114, 52, 249, 220, 223, 254,
- 164, 226, 147, 114, 121, 219, 155, 249, 220, 223, 254, 164, 226, 147,
- 114, 121, 52, 249, 220, 223, 254, 164, 226, 147, 249, 91, 218, 140, 226,
- 15, 5, 226, 147, 114, 245, 31, 164, 226, 147, 114, 241, 228, 245, 31,
- 164, 226, 147, 114, 85, 241, 227, 222, 187, 114, 85, 241, 228, 251, 113,
- 244, 55, 241, 227, 222, 187, 244, 55, 241, 228, 251, 113, 231, 82, 43,
- 226, 4, 226, 147, 231, 82, 44, 226, 4, 226, 147, 231, 82, 244, 63, 43,
- 226, 4, 226, 147, 231, 82, 244, 63, 44, 226, 4, 226, 147, 231, 82, 233,
- 42, 254, 110, 251, 158, 226, 147, 231, 82, 222, 247, 254, 110, 251, 158,
- 226, 147, 114, 233, 42, 254, 110, 223, 254, 164, 226, 147, 114, 222, 247,
- 254, 110, 223, 254, 164, 226, 147, 114, 233, 42, 254, 110, 251, 158, 226,
- 147, 114, 222, 247, 254, 110, 251, 158, 226, 147, 192, 43, 216, 6, 220,
- 53, 251, 158, 226, 147, 192, 44, 216, 6, 220, 53, 251, 158, 226, 147,
- 231, 82, 43, 249, 99, 251, 158, 226, 147, 231, 82, 44, 249, 99, 251, 158,
- 226, 147, 247, 204, 152, 37, 21, 110, 247, 204, 152, 37, 21, 105, 247,
- 204, 152, 37, 21, 158, 247, 204, 152, 37, 21, 161, 247, 204, 152, 37, 21,
- 189, 247, 204, 152, 37, 21, 194, 247, 204, 152, 37, 21, 198, 247, 204,
- 152, 37, 21, 195, 247, 204, 152, 37, 21, 200, 247, 204, 152, 37, 54, 216,
- 247, 247, 204, 37, 35, 21, 110, 247, 204, 37, 35, 21, 105, 247, 204, 37,
- 35, 21, 158, 247, 204, 37, 35, 21, 161, 247, 204, 37, 35, 21, 189, 247,
- 204, 37, 35, 21, 194, 247, 204, 37, 35, 21, 198, 247, 204, 37, 35, 21,
- 195, 247, 204, 37, 35, 21, 200, 247, 204, 37, 35, 54, 216, 247, 247, 204,
- 152, 37, 35, 21, 110, 247, 204, 152, 37, 35, 21, 105, 247, 204, 152, 37,
- 35, 21, 158, 247, 204, 152, 37, 35, 21, 161, 247, 204, 152, 37, 35, 21,
- 189, 247, 204, 152, 37, 35, 21, 194, 247, 204, 152, 37, 35, 21, 198, 247,
- 204, 152, 37, 35, 21, 195, 247, 204, 152, 37, 35, 21, 200, 247, 204, 152,
- 37, 35, 54, 216, 247, 114, 211, 246, 97, 74, 114, 96, 50, 114, 230, 182,
- 50, 114, 247, 169, 50, 114, 219, 28, 245, 220, 74, 114, 97, 74, 114, 228,
- 56, 245, 220, 74, 246, 98, 225, 11, 97, 74, 114, 222, 184, 97, 74, 215,
- 224, 97, 74, 114, 215, 224, 97, 74, 248, 155, 215, 224, 97, 74, 114, 248,
- 155, 215, 224, 97, 74, 85, 97, 74, 216, 144, 216, 12, 97, 253, 249, 216,
- 144, 251, 173, 97, 253, 249, 85, 97, 253, 249, 114, 85, 249, 91, 246,
- 104, 22, 97, 74, 114, 85, 249, 91, 214, 153, 22, 97, 74, 218, 231, 85,
- 97, 74, 114, 249, 206, 85, 97, 74, 222, 246, 71, 97, 74, 233, 41, 71, 97,
- 74, 252, 183, 220, 91, 71, 97, 74, 243, 241, 220, 91, 71, 97, 74, 114,
- 232, 108, 222, 245, 71, 97, 74, 114, 214, 160, 222, 245, 71, 97, 74, 228,
- 49, 232, 108, 222, 245, 71, 97, 74, 249, 99, 232, 123, 228, 49, 214, 160,
- 222, 245, 71, 97, 74, 37, 114, 71, 97, 74, 211, 252, 97, 74, 251, 220,
- 219, 28, 245, 220, 74, 251, 220, 97, 74, 251, 220, 228, 56, 245, 220, 74,
- 114, 251, 220, 219, 28, 245, 220, 74, 114, 251, 220, 97, 74, 114, 251,
- 220, 228, 56, 245, 220, 74, 217, 17, 97, 74, 114, 217, 16, 97, 74, 212,
- 18, 97, 74, 114, 212, 18, 97, 74, 226, 172, 97, 74, 52, 249, 99, 232,
- 123, 134, 247, 214, 254, 109, 71, 215, 226, 249, 187, 4, 71, 215, 225,
- 225, 171, 204, 218, 63, 204, 218, 21, 43, 222, 90, 252, 173, 248, 60, 44,
- 222, 90, 252, 173, 248, 60, 177, 2, 59, 235, 215, 223, 50, 219, 47, 224,
- 201, 218, 63, 218, 22, 224, 201, 219, 46, 67, 252, 141, 2, 203, 91, 11,
- 222, 228, 247, 254, 199, 247, 168, 11, 244, 175, 247, 254, 92, 232, 146,
- 254, 118, 92, 232, 146, 226, 158, 71, 247, 249, 2, 250, 173, 247, 120,
- 22, 2, 247, 120, 245, 170, 64, 226, 170, 214, 152, 232, 108, 44, 249,
- 161, 2, 247, 120, 214, 160, 43, 249, 161, 2, 247, 120, 43, 226, 128, 235,
- 66, 44, 226, 128, 235, 66, 243, 229, 226, 128, 235, 66, 233, 85, 120,
- 217, 87, 233, 85, 124, 217, 87, 43, 22, 44, 52, 215, 93, 43, 22, 44, 217,
- 87, 43, 230, 87, 199, 44, 217, 87, 199, 43, 217, 87, 120, 217, 88, 2,
- 250, 36, 48, 232, 105, 247, 173, 251, 78, 203, 222, 133, 71, 249, 205,
- 247, 248, 71, 249, 205, 247, 249, 2, 140, 216, 114, 71, 249, 205, 247,
- 249, 2, 97, 216, 114, 71, 42, 2, 140, 216, 114, 71, 42, 2, 97, 216, 114,
- 11, 43, 71, 42, 127, 11, 44, 71, 42, 127, 11, 43, 254, 110, 127, 11, 44,
- 254, 110, 127, 11, 43, 52, 254, 110, 127, 11, 44, 52, 254, 110, 127, 11,
- 43, 71, 216, 6, 220, 53, 127, 11, 44, 71, 216, 6, 220, 53, 127, 11, 43,
- 244, 63, 226, 3, 11, 44, 244, 63, 226, 3, 214, 153, 224, 24, 74, 246,
- 104, 224, 24, 74, 254, 88, 243, 98, 250, 36, 74, 250, 2, 243, 98, 250,
- 36, 74, 44, 80, 2, 37, 225, 22, 199, 140, 74, 199, 97, 74, 199, 43, 44,
- 74, 199, 140, 52, 74, 199, 97, 52, 74, 199, 43, 44, 52, 74, 199, 140, 80,
- 243, 243, 130, 199, 97, 80, 243, 243, 130, 199, 140, 52, 80, 243, 243,
- 130, 199, 97, 52, 80, 243, 243, 130, 199, 97, 218, 230, 74, 46, 47, 251,
- 215, 46, 47, 247, 117, 46, 47, 246, 245, 46, 47, 247, 116, 46, 47, 246,
- 181, 46, 47, 247, 52, 46, 47, 246, 244, 46, 47, 247, 115, 46, 47, 246,
- 149, 46, 47, 247, 20, 46, 47, 246, 212, 46, 47, 247, 83, 46, 47, 246,
- 180, 46, 47, 247, 51, 46, 47, 246, 243, 46, 47, 247, 114, 46, 47, 246,
- 133, 46, 47, 247, 4, 46, 47, 246, 196, 46, 47, 247, 67, 46, 47, 246, 164,
- 46, 47, 247, 35, 46, 47, 246, 227, 46, 47, 247, 98, 46, 47, 246, 148, 46,
- 47, 247, 19, 46, 47, 246, 211, 46, 47, 247, 82, 46, 47, 246, 179, 46, 47,
- 247, 50, 46, 47, 246, 242, 46, 47, 247, 113, 46, 47, 246, 125, 46, 47,
- 246, 252, 46, 47, 246, 188, 46, 47, 247, 59, 46, 47, 246, 156, 46, 47,
- 247, 27, 46, 47, 246, 219, 46, 47, 247, 90, 46, 47, 246, 140, 46, 47,
- 247, 11, 46, 47, 246, 203, 46, 47, 247, 74, 46, 47, 246, 171, 46, 47,
- 247, 42, 46, 47, 246, 234, 46, 47, 247, 105, 46, 47, 246, 132, 46, 47,
- 247, 3, 46, 47, 246, 195, 46, 47, 247, 66, 46, 47, 246, 163, 46, 47, 247,
- 34, 46, 47, 246, 226, 46, 47, 247, 97, 46, 47, 246, 147, 46, 47, 247, 18,
- 46, 47, 246, 210, 46, 47, 247, 81, 46, 47, 246, 178, 46, 47, 247, 49, 46,
- 47, 246, 241, 46, 47, 247, 112, 46, 47, 246, 121, 46, 47, 246, 248, 46,
- 47, 246, 184, 46, 47, 247, 55, 46, 47, 246, 152, 46, 47, 247, 23, 46, 47,
- 246, 215, 46, 47, 247, 86, 46, 47, 246, 136, 46, 47, 247, 7, 46, 47, 246,
- 199, 46, 47, 247, 70, 46, 47, 246, 167, 46, 47, 247, 38, 46, 47, 246,
- 230, 46, 47, 247, 101, 46, 47, 246, 128, 46, 47, 246, 255, 46, 47, 246,
- 191, 46, 47, 247, 62, 46, 47, 246, 159, 46, 47, 247, 30, 46, 47, 246,
- 222, 46, 47, 247, 93, 46, 47, 246, 143, 46, 47, 247, 14, 46, 47, 246,
- 206, 46, 47, 247, 77, 46, 47, 246, 174, 46, 47, 247, 45, 46, 47, 246,
- 237, 46, 47, 247, 108, 46, 47, 246, 124, 46, 47, 246, 251, 46, 47, 246,
- 187, 46, 47, 247, 58, 46, 47, 246, 155, 46, 47, 247, 26, 46, 47, 246,
- 218, 46, 47, 247, 89, 46, 47, 246, 139, 46, 47, 247, 10, 46, 47, 246,
- 202, 46, 47, 247, 73, 46, 47, 246, 170, 46, 47, 247, 41, 46, 47, 246,
- 233, 46, 47, 247, 104, 46, 47, 246, 131, 46, 47, 247, 2, 46, 47, 246,
- 194, 46, 47, 247, 65, 46, 47, 246, 162, 46, 47, 247, 33, 46, 47, 246,
- 225, 46, 47, 247, 96, 46, 47, 246, 146, 46, 47, 247, 17, 46, 47, 246,
- 209, 46, 47, 247, 80, 46, 47, 246, 177, 46, 47, 247, 48, 46, 47, 246,
- 240, 46, 47, 247, 111, 46, 47, 246, 119, 46, 47, 246, 246, 46, 47, 246,
- 182, 46, 47, 247, 53, 46, 47, 246, 150, 46, 47, 247, 21, 46, 47, 246,
- 213, 46, 47, 247, 84, 46, 47, 246, 134, 46, 47, 247, 5, 46, 47, 246, 197,
- 46, 47, 247, 68, 46, 47, 246, 165, 46, 47, 247, 36, 46, 47, 246, 228, 46,
- 47, 247, 99, 46, 47, 246, 126, 46, 47, 246, 253, 46, 47, 246, 189, 46,
- 47, 247, 60, 46, 47, 246, 157, 46, 47, 247, 28, 46, 47, 246, 220, 46, 47,
- 247, 91, 46, 47, 246, 141, 46, 47, 247, 12, 46, 47, 246, 204, 46, 47,
- 247, 75, 46, 47, 246, 172, 46, 47, 247, 43, 46, 47, 246, 235, 46, 47,
- 247, 106, 46, 47, 246, 122, 46, 47, 246, 249, 46, 47, 246, 185, 46, 47,
- 247, 56, 46, 47, 246, 153, 46, 47, 247, 24, 46, 47, 246, 216, 46, 47,
- 247, 87, 46, 47, 246, 137, 46, 47, 247, 8, 46, 47, 246, 200, 46, 47, 247,
- 71, 46, 47, 246, 168, 46, 47, 247, 39, 46, 47, 246, 231, 46, 47, 247,
- 102, 46, 47, 246, 129, 46, 47, 247, 0, 46, 47, 246, 192, 46, 47, 247, 63,
- 46, 47, 246, 160, 46, 47, 247, 31, 46, 47, 246, 223, 46, 47, 247, 94, 46,
- 47, 246, 144, 46, 47, 247, 15, 46, 47, 246, 207, 46, 47, 247, 78, 46, 47,
- 246, 175, 46, 47, 247, 46, 46, 47, 246, 238, 46, 47, 247, 109, 46, 47,
- 246, 120, 46, 47, 246, 247, 46, 47, 246, 183, 46, 47, 247, 54, 46, 47,
- 246, 151, 46, 47, 247, 22, 46, 47, 246, 214, 46, 47, 247, 85, 46, 47,
- 246, 135, 46, 47, 247, 6, 46, 47, 246, 198, 46, 47, 247, 69, 46, 47, 246,
- 166, 46, 47, 247, 37, 46, 47, 246, 229, 46, 47, 247, 100, 46, 47, 246,
- 127, 46, 47, 246, 254, 46, 47, 246, 190, 46, 47, 247, 61, 46, 47, 246,
- 158, 46, 47, 247, 29, 46, 47, 246, 221, 46, 47, 247, 92, 46, 47, 246,
- 142, 46, 47, 247, 13, 46, 47, 246, 205, 46, 47, 247, 76, 46, 47, 246,
- 173, 46, 47, 247, 44, 46, 47, 246, 236, 46, 47, 247, 107, 46, 47, 246,
- 123, 46, 47, 246, 250, 46, 47, 246, 186, 46, 47, 247, 57, 46, 47, 246,
- 154, 46, 47, 247, 25, 46, 47, 246, 217, 46, 47, 247, 88, 46, 47, 246,
- 138, 46, 47, 247, 9, 46, 47, 246, 201, 46, 47, 247, 72, 46, 47, 246, 169,
- 46, 47, 247, 40, 46, 47, 246, 232, 46, 47, 247, 103, 46, 47, 246, 130,
- 46, 47, 247, 1, 46, 47, 246, 193, 46, 47, 247, 64, 46, 47, 246, 161, 46,
- 47, 247, 32, 46, 47, 246, 224, 46, 47, 247, 95, 46, 47, 246, 145, 46, 47,
- 247, 16, 46, 47, 246, 208, 46, 47, 247, 79, 46, 47, 246, 176, 46, 47,
- 247, 47, 46, 47, 246, 239, 46, 47, 247, 110, 97, 215, 58, 80, 2, 67, 91,
+ 241, 53, 48, 7, 4, 1, 160, 2, 241, 53, 48, 7, 6, 1, 160, 2, 183, 7, 4, 1,
+ 160, 2, 183, 7, 6, 1, 160, 2, 250, 32, 22, 142, 7, 4, 1, 160, 2, 250, 32,
+ 22, 142, 7, 6, 1, 160, 2, 250, 32, 22, 242, 137, 7, 4, 1, 160, 2, 250,
+ 32, 22, 242, 137, 7, 6, 1, 160, 2, 250, 32, 22, 241, 53, 48, 7, 4, 1,
+ 160, 2, 250, 32, 22, 241, 53, 48, 7, 6, 1, 160, 2, 250, 32, 22, 183, 7,
+ 4, 1, 160, 2, 250, 32, 22, 183, 7, 6, 1, 160, 2, 250, 32, 22, 59, 51, 7,
+ 4, 1, 160, 2, 250, 32, 22, 59, 51, 7, 6, 1, 240, 155, 2, 241, 53, 48, 7,
+ 4, 1, 240, 155, 2, 241, 53, 48, 7, 6, 1, 240, 155, 2, 59, 51, 7, 4, 1,
+ 240, 155, 2, 59, 51, 7, 6, 1, 144, 2, 59, 51, 7, 4, 1, 144, 2, 59, 51, 7,
+ 6, 1, 144, 2, 241, 53, 48, 7, 4, 1, 144, 2, 241, 53, 48, 7, 6, 1, 144, 2,
+ 250, 32, 22, 142, 7, 4, 1, 144, 2, 250, 32, 22, 142, 7, 6, 1, 144, 2,
+ 250, 32, 22, 242, 137, 7, 4, 1, 144, 2, 250, 32, 22, 242, 137, 7, 6, 1,
+ 144, 2, 250, 32, 22, 241, 53, 48, 7, 4, 1, 144, 2, 250, 32, 22, 241, 53,
+ 48, 7, 6, 1, 144, 2, 250, 32, 22, 183, 7, 4, 1, 144, 2, 250, 32, 22, 183,
+ 7, 6, 1, 144, 2, 250, 32, 22, 59, 51, 7, 4, 1, 144, 2, 250, 32, 22, 59,
+ 51, 7, 6, 1, 144, 2, 240, 250, 22, 142, 7, 4, 1, 144, 2, 240, 250, 22,
+ 142, 7, 6, 1, 144, 2, 240, 250, 22, 242, 137, 7, 4, 1, 144, 2, 240, 250,
+ 22, 242, 137, 7, 6, 1, 144, 2, 240, 250, 22, 241, 53, 48, 7, 4, 1, 144,
+ 2, 240, 250, 22, 241, 53, 48, 7, 6, 1, 144, 2, 240, 250, 22, 183, 7, 4,
+ 1, 144, 2, 240, 250, 22, 183, 7, 6, 1, 144, 2, 240, 250, 22, 59, 51, 7,
+ 4, 1, 144, 2, 240, 250, 22, 59, 51, 7, 6, 1, 104, 2, 59, 51, 7, 4, 1,
+ 104, 2, 59, 51, 7, 6, 1, 104, 2, 241, 53, 48, 7, 4, 1, 104, 2, 241, 53,
+ 48, 7, 6, 1, 104, 2, 240, 250, 22, 142, 7, 4, 1, 104, 2, 240, 250, 22,
+ 142, 7, 6, 1, 104, 2, 240, 250, 22, 242, 137, 7, 4, 1, 104, 2, 240, 250,
+ 22, 242, 137, 7, 6, 1, 104, 2, 240, 250, 22, 241, 53, 48, 7, 4, 1, 104,
+ 2, 240, 250, 22, 241, 53, 48, 7, 6, 1, 104, 2, 240, 250, 22, 183, 7, 4,
+ 1, 104, 2, 240, 250, 22, 183, 7, 6, 1, 104, 2, 240, 250, 22, 59, 51, 7,
+ 4, 1, 104, 2, 240, 250, 22, 59, 51, 7, 6, 1, 211, 118, 2, 242, 137, 7, 4,
+ 1, 211, 118, 2, 242, 137, 7, 6, 1, 211, 118, 2, 59, 51, 7, 4, 1, 211,
+ 118, 2, 59, 51, 7, 6, 1, 211, 118, 2, 241, 53, 48, 7, 4, 1, 211, 118, 2,
+ 241, 53, 48, 7, 6, 1, 211, 118, 2, 183, 7, 4, 1, 211, 118, 2, 183, 7, 6,
+ 1, 230, 224, 232, 186, 7, 4, 1, 230, 224, 232, 186, 7, 6, 1, 230, 224,
+ 214, 105, 7, 4, 1, 230, 224, 214, 105, 7, 6, 1, 211, 118, 2, 232, 124, 7,
+ 4, 1, 211, 118, 2, 232, 124, 26, 4, 1, 254, 145, 2, 224, 155, 26, 4, 1,
+ 254, 145, 2, 248, 154, 26, 4, 1, 254, 145, 2, 224, 156, 22, 214, 13, 26,
+ 4, 1, 254, 145, 2, 248, 155, 22, 214, 13, 26, 4, 1, 254, 145, 2, 224,
+ 156, 22, 226, 111, 26, 4, 1, 254, 145, 2, 248, 155, 22, 226, 111, 26, 4,
+ 1, 254, 145, 2, 224, 156, 22, 225, 176, 26, 4, 1, 254, 145, 2, 248, 155,
+ 22, 225, 176, 26, 6, 1, 254, 145, 2, 224, 155, 26, 6, 1, 254, 145, 2,
+ 248, 154, 26, 6, 1, 254, 145, 2, 224, 156, 22, 214, 13, 26, 6, 1, 254,
+ 145, 2, 248, 155, 22, 214, 13, 26, 6, 1, 254, 145, 2, 224, 156, 22, 226,
+ 111, 26, 6, 1, 254, 145, 2, 248, 155, 22, 226, 111, 26, 6, 1, 254, 145,
+ 2, 224, 156, 22, 225, 176, 26, 6, 1, 254, 145, 2, 248, 155, 22, 225, 176,
+ 26, 4, 1, 245, 102, 2, 224, 155, 26, 4, 1, 245, 102, 2, 248, 154, 26, 4,
+ 1, 245, 102, 2, 224, 156, 22, 214, 13, 26, 4, 1, 245, 102, 2, 248, 155,
+ 22, 214, 13, 26, 4, 1, 245, 102, 2, 224, 156, 22, 226, 111, 26, 4, 1,
+ 245, 102, 2, 248, 155, 22, 226, 111, 26, 6, 1, 245, 102, 2, 224, 155, 26,
+ 6, 1, 245, 102, 2, 248, 154, 26, 6, 1, 245, 102, 2, 224, 156, 22, 214,
+ 13, 26, 6, 1, 245, 102, 2, 248, 155, 22, 214, 13, 26, 6, 1, 245, 102, 2,
+ 224, 156, 22, 226, 111, 26, 6, 1, 245, 102, 2, 248, 155, 22, 226, 111,
+ 26, 4, 1, 245, 65, 2, 224, 155, 26, 4, 1, 245, 65, 2, 248, 154, 26, 4, 1,
+ 245, 65, 2, 224, 156, 22, 214, 13, 26, 4, 1, 245, 65, 2, 248, 155, 22,
+ 214, 13, 26, 4, 1, 245, 65, 2, 224, 156, 22, 226, 111, 26, 4, 1, 245, 65,
+ 2, 248, 155, 22, 226, 111, 26, 4, 1, 245, 65, 2, 224, 156, 22, 225, 176,
+ 26, 4, 1, 245, 65, 2, 248, 155, 22, 225, 176, 26, 6, 1, 245, 65, 2, 224,
+ 155, 26, 6, 1, 245, 65, 2, 248, 154, 26, 6, 1, 245, 65, 2, 224, 156, 22,
+ 214, 13, 26, 6, 1, 245, 65, 2, 248, 155, 22, 214, 13, 26, 6, 1, 245, 65,
+ 2, 224, 156, 22, 226, 111, 26, 6, 1, 245, 65, 2, 248, 155, 22, 226, 111,
+ 26, 6, 1, 245, 65, 2, 224, 156, 22, 225, 176, 26, 6, 1, 245, 65, 2, 248,
+ 155, 22, 225, 176, 26, 4, 1, 235, 187, 2, 224, 155, 26, 4, 1, 235, 187,
+ 2, 248, 154, 26, 4, 1, 235, 187, 2, 224, 156, 22, 214, 13, 26, 4, 1, 235,
+ 187, 2, 248, 155, 22, 214, 13, 26, 4, 1, 235, 187, 2, 224, 156, 22, 226,
+ 111, 26, 4, 1, 235, 187, 2, 248, 155, 22, 226, 111, 26, 4, 1, 235, 187,
+ 2, 224, 156, 22, 225, 176, 26, 4, 1, 235, 187, 2, 248, 155, 22, 225, 176,
+ 26, 6, 1, 235, 187, 2, 224, 155, 26, 6, 1, 235, 187, 2, 248, 154, 26, 6,
+ 1, 235, 187, 2, 224, 156, 22, 214, 13, 26, 6, 1, 235, 187, 2, 248, 155,
+ 22, 214, 13, 26, 6, 1, 235, 187, 2, 224, 156, 22, 226, 111, 26, 6, 1,
+ 235, 187, 2, 248, 155, 22, 226, 111, 26, 6, 1, 235, 187, 2, 224, 156, 22,
+ 225, 176, 26, 6, 1, 235, 187, 2, 248, 155, 22, 225, 176, 26, 4, 1, 226,
+ 201, 2, 224, 155, 26, 4, 1, 226, 201, 2, 248, 154, 26, 4, 1, 226, 201, 2,
+ 224, 156, 22, 214, 13, 26, 4, 1, 226, 201, 2, 248, 155, 22, 214, 13, 26,
+ 4, 1, 226, 201, 2, 224, 156, 22, 226, 111, 26, 4, 1, 226, 201, 2, 248,
+ 155, 22, 226, 111, 26, 6, 1, 226, 201, 2, 224, 155, 26, 6, 1, 226, 201,
+ 2, 248, 154, 26, 6, 1, 226, 201, 2, 224, 156, 22, 214, 13, 26, 6, 1, 226,
+ 201, 2, 248, 155, 22, 214, 13, 26, 6, 1, 226, 201, 2, 224, 156, 22, 226,
+ 111, 26, 6, 1, 226, 201, 2, 248, 155, 22, 226, 111, 26, 4, 1, 214, 158,
+ 2, 224, 155, 26, 4, 1, 214, 158, 2, 248, 154, 26, 4, 1, 214, 158, 2, 224,
+ 156, 22, 214, 13, 26, 4, 1, 214, 158, 2, 248, 155, 22, 214, 13, 26, 4, 1,
+ 214, 158, 2, 224, 156, 22, 226, 111, 26, 4, 1, 214, 158, 2, 248, 155, 22,
+ 226, 111, 26, 4, 1, 214, 158, 2, 224, 156, 22, 225, 176, 26, 4, 1, 214,
+ 158, 2, 248, 155, 22, 225, 176, 26, 6, 1, 214, 158, 2, 248, 154, 26, 6,
+ 1, 214, 158, 2, 248, 155, 22, 214, 13, 26, 6, 1, 214, 158, 2, 248, 155,
+ 22, 226, 111, 26, 6, 1, 214, 158, 2, 248, 155, 22, 225, 176, 26, 4, 1,
+ 226, 203, 2, 224, 155, 26, 4, 1, 226, 203, 2, 248, 154, 26, 4, 1, 226,
+ 203, 2, 224, 156, 22, 214, 13, 26, 4, 1, 226, 203, 2, 248, 155, 22, 214,
+ 13, 26, 4, 1, 226, 203, 2, 224, 156, 22, 226, 111, 26, 4, 1, 226, 203, 2,
+ 248, 155, 22, 226, 111, 26, 4, 1, 226, 203, 2, 224, 156, 22, 225, 176,
+ 26, 4, 1, 226, 203, 2, 248, 155, 22, 225, 176, 26, 6, 1, 226, 203, 2,
+ 224, 155, 26, 6, 1, 226, 203, 2, 248, 154, 26, 6, 1, 226, 203, 2, 224,
+ 156, 22, 214, 13, 26, 6, 1, 226, 203, 2, 248, 155, 22, 214, 13, 26, 6, 1,
+ 226, 203, 2, 224, 156, 22, 226, 111, 26, 6, 1, 226, 203, 2, 248, 155, 22,
+ 226, 111, 26, 6, 1, 226, 203, 2, 224, 156, 22, 225, 176, 26, 6, 1, 226,
+ 203, 2, 248, 155, 22, 225, 176, 26, 4, 1, 254, 145, 2, 214, 13, 26, 4, 1,
+ 254, 145, 2, 226, 111, 26, 4, 1, 245, 102, 2, 214, 13, 26, 4, 1, 245,
+ 102, 2, 226, 111, 26, 4, 1, 245, 65, 2, 214, 13, 26, 4, 1, 245, 65, 2,
+ 226, 111, 26, 4, 1, 235, 187, 2, 214, 13, 26, 4, 1, 235, 187, 2, 226,
+ 111, 26, 4, 1, 226, 201, 2, 214, 13, 26, 4, 1, 226, 201, 2, 226, 111, 26,
+ 4, 1, 214, 158, 2, 214, 13, 26, 4, 1, 214, 158, 2, 226, 111, 26, 4, 1,
+ 226, 203, 2, 214, 13, 26, 4, 1, 226, 203, 2, 226, 111, 26, 4, 1, 254,
+ 145, 2, 224, 156, 22, 210, 219, 26, 4, 1, 254, 145, 2, 248, 155, 22, 210,
+ 219, 26, 4, 1, 254, 145, 2, 224, 156, 22, 214, 14, 22, 210, 219, 26, 4,
+ 1, 254, 145, 2, 248, 155, 22, 214, 14, 22, 210, 219, 26, 4, 1, 254, 145,
+ 2, 224, 156, 22, 226, 112, 22, 210, 219, 26, 4, 1, 254, 145, 2, 248, 155,
+ 22, 226, 112, 22, 210, 219, 26, 4, 1, 254, 145, 2, 224, 156, 22, 225,
+ 177, 22, 210, 219, 26, 4, 1, 254, 145, 2, 248, 155, 22, 225, 177, 22,
+ 210, 219, 26, 6, 1, 254, 145, 2, 224, 156, 22, 224, 168, 26, 6, 1, 254,
+ 145, 2, 248, 155, 22, 224, 168, 26, 6, 1, 254, 145, 2, 224, 156, 22, 214,
+ 14, 22, 224, 168, 26, 6, 1, 254, 145, 2, 248, 155, 22, 214, 14, 22, 224,
+ 168, 26, 6, 1, 254, 145, 2, 224, 156, 22, 226, 112, 22, 224, 168, 26, 6,
+ 1, 254, 145, 2, 248, 155, 22, 226, 112, 22, 224, 168, 26, 6, 1, 254, 145,
+ 2, 224, 156, 22, 225, 177, 22, 224, 168, 26, 6, 1, 254, 145, 2, 248, 155,
+ 22, 225, 177, 22, 224, 168, 26, 4, 1, 245, 65, 2, 224, 156, 22, 210, 219,
+ 26, 4, 1, 245, 65, 2, 248, 155, 22, 210, 219, 26, 4, 1, 245, 65, 2, 224,
+ 156, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, 65, 2, 248, 155, 22, 214,
+ 14, 22, 210, 219, 26, 4, 1, 245, 65, 2, 224, 156, 22, 226, 112, 22, 210,
+ 219, 26, 4, 1, 245, 65, 2, 248, 155, 22, 226, 112, 22, 210, 219, 26, 4,
+ 1, 245, 65, 2, 224, 156, 22, 225, 177, 22, 210, 219, 26, 4, 1, 245, 65,
+ 2, 248, 155, 22, 225, 177, 22, 210, 219, 26, 6, 1, 245, 65, 2, 224, 156,
+ 22, 224, 168, 26, 6, 1, 245, 65, 2, 248, 155, 22, 224, 168, 26, 6, 1,
+ 245, 65, 2, 224, 156, 22, 214, 14, 22, 224, 168, 26, 6, 1, 245, 65, 2,
+ 248, 155, 22, 214, 14, 22, 224, 168, 26, 6, 1, 245, 65, 2, 224, 156, 22,
+ 226, 112, 22, 224, 168, 26, 6, 1, 245, 65, 2, 248, 155, 22, 226, 112, 22,
+ 224, 168, 26, 6, 1, 245, 65, 2, 224, 156, 22, 225, 177, 22, 224, 168, 26,
+ 6, 1, 245, 65, 2, 248, 155, 22, 225, 177, 22, 224, 168, 26, 4, 1, 226,
+ 203, 2, 224, 156, 22, 210, 219, 26, 4, 1, 226, 203, 2, 248, 155, 22, 210,
+ 219, 26, 4, 1, 226, 203, 2, 224, 156, 22, 214, 14, 22, 210, 219, 26, 4,
+ 1, 226, 203, 2, 248, 155, 22, 214, 14, 22, 210, 219, 26, 4, 1, 226, 203,
+ 2, 224, 156, 22, 226, 112, 22, 210, 219, 26, 4, 1, 226, 203, 2, 248, 155,
+ 22, 226, 112, 22, 210, 219, 26, 4, 1, 226, 203, 2, 224, 156, 22, 225,
+ 177, 22, 210, 219, 26, 4, 1, 226, 203, 2, 248, 155, 22, 225, 177, 22,
+ 210, 219, 26, 6, 1, 226, 203, 2, 224, 156, 22, 224, 168, 26, 6, 1, 226,
+ 203, 2, 248, 155, 22, 224, 168, 26, 6, 1, 226, 203, 2, 224, 156, 22, 214,
+ 14, 22, 224, 168, 26, 6, 1, 226, 203, 2, 248, 155, 22, 214, 14, 22, 224,
+ 168, 26, 6, 1, 226, 203, 2, 224, 156, 22, 226, 112, 22, 224, 168, 26, 6,
+ 1, 226, 203, 2, 248, 155, 22, 226, 112, 22, 224, 168, 26, 6, 1, 226, 203,
+ 2, 224, 156, 22, 225, 177, 22, 224, 168, 26, 6, 1, 226, 203, 2, 248, 155,
+ 22, 225, 177, 22, 224, 168, 26, 4, 1, 254, 145, 2, 213, 120, 26, 4, 1,
+ 254, 145, 2, 231, 233, 26, 4, 1, 254, 145, 2, 214, 14, 22, 210, 219, 26,
+ 4, 1, 254, 145, 2, 210, 219, 26, 4, 1, 254, 145, 2, 226, 112, 22, 210,
+ 219, 26, 4, 1, 254, 145, 2, 225, 176, 26, 4, 1, 254, 145, 2, 225, 177,
+ 22, 210, 219, 26, 6, 1, 254, 145, 2, 213, 120, 26, 6, 1, 254, 145, 2,
+ 231, 233, 26, 6, 1, 254, 145, 2, 214, 13, 26, 6, 1, 254, 145, 2, 226,
+ 111, 26, 6, 1, 254, 145, 2, 224, 168, 26, 234, 3, 26, 224, 168, 26, 224,
+ 155, 26, 225, 176, 26, 247, 253, 22, 225, 176, 26, 4, 1, 245, 65, 2, 214,
+ 14, 22, 210, 219, 26, 4, 1, 245, 65, 2, 210, 219, 26, 4, 1, 245, 65, 2,
+ 226, 112, 22, 210, 219, 26, 4, 1, 245, 65, 2, 225, 176, 26, 4, 1, 245,
+ 65, 2, 225, 177, 22, 210, 219, 26, 6, 1, 245, 102, 2, 214, 13, 26, 6, 1,
+ 245, 102, 2, 226, 111, 26, 6, 1, 245, 65, 2, 214, 13, 26, 6, 1, 245, 65,
+ 2, 226, 111, 26, 6, 1, 245, 65, 2, 224, 168, 26, 224, 156, 22, 214, 13,
+ 26, 224, 156, 22, 226, 111, 26, 224, 156, 22, 225, 176, 26, 4, 1, 235,
+ 187, 2, 213, 120, 26, 4, 1, 235, 187, 2, 231, 233, 26, 4, 1, 235, 187, 2,
+ 247, 253, 22, 214, 13, 26, 4, 1, 235, 187, 2, 247, 253, 22, 226, 111, 26,
+ 4, 1, 235, 187, 2, 225, 176, 26, 4, 1, 235, 187, 2, 247, 253, 22, 225,
+ 176, 26, 6, 1, 235, 187, 2, 213, 120, 26, 6, 1, 235, 187, 2, 231, 233,
+ 26, 6, 1, 235, 187, 2, 214, 13, 26, 6, 1, 235, 187, 2, 226, 111, 26, 248,
+ 155, 22, 214, 13, 26, 248, 155, 22, 226, 111, 26, 248, 155, 22, 225, 176,
+ 26, 4, 1, 214, 158, 2, 213, 120, 26, 4, 1, 214, 158, 2, 231, 233, 26, 4,
+ 1, 214, 158, 2, 247, 253, 22, 214, 13, 26, 4, 1, 214, 158, 2, 247, 253,
+ 22, 226, 111, 26, 4, 1, 223, 39, 2, 224, 155, 26, 4, 1, 223, 39, 2, 248,
+ 154, 26, 4, 1, 214, 158, 2, 225, 176, 26, 4, 1, 214, 158, 2, 247, 253,
+ 22, 225, 176, 26, 6, 1, 214, 158, 2, 213, 120, 26, 6, 1, 214, 158, 2,
+ 231, 233, 26, 6, 1, 214, 158, 2, 214, 13, 26, 6, 1, 214, 158, 2, 226,
+ 111, 26, 6, 1, 223, 39, 2, 248, 154, 26, 247, 253, 22, 214, 13, 26, 247,
+ 253, 22, 226, 111, 26, 214, 13, 26, 4, 1, 226, 203, 2, 214, 14, 22, 210,
+ 219, 26, 4, 1, 226, 203, 2, 210, 219, 26, 4, 1, 226, 203, 2, 226, 112,
+ 22, 210, 219, 26, 4, 1, 226, 203, 2, 225, 176, 26, 4, 1, 226, 203, 2,
+ 225, 177, 22, 210, 219, 26, 6, 1, 226, 201, 2, 214, 13, 26, 6, 1, 226,
+ 201, 2, 226, 111, 26, 6, 1, 226, 203, 2, 214, 13, 26, 6, 1, 226, 203, 2,
+ 226, 111, 26, 6, 1, 226, 203, 2, 224, 168, 26, 226, 111, 26, 248, 154,
+ 245, 152, 224, 28, 245, 161, 224, 28, 245, 152, 219, 19, 245, 161, 219,
+ 19, 216, 142, 219, 19, 244, 10, 219, 19, 219, 124, 219, 19, 244, 113,
+ 219, 19, 224, 142, 219, 19, 216, 171, 219, 19, 242, 36, 219, 19, 210, 87,
+ 211, 245, 219, 19, 210, 87, 211, 245, 228, 68, 210, 87, 211, 245, 235,
+ 64, 233, 39, 78, 222, 244, 78, 240, 169, 228, 69, 240, 169, 244, 113,
+ 248, 157, 245, 152, 248, 157, 245, 161, 248, 157, 203, 130, 52, 67, 232,
+ 214, 52, 121, 232, 214, 43, 219, 156, 223, 255, 78, 44, 219, 156, 223,
+ 255, 78, 219, 156, 232, 110, 223, 255, 78, 219, 156, 241, 164, 223, 255,
+ 78, 43, 52, 223, 255, 78, 44, 52, 223, 255, 78, 52, 232, 110, 223, 255,
+ 78, 52, 241, 164, 223, 255, 78, 248, 206, 52, 248, 206, 251, 114, 215,
+ 223, 251, 114, 123, 59, 233, 57, 113, 59, 233, 57, 203, 245, 164, 240,
+ 167, 225, 11, 232, 215, 220, 138, 226, 16, 220, 138, 233, 39, 245, 159,
+ 222, 244, 245, 159, 224, 247, 247, 197, 244, 20, 233, 39, 226, 118, 222,
+ 244, 226, 118, 229, 195, 228, 74, 219, 19, 225, 184, 230, 194, 50, 225,
+ 184, 216, 249, 216, 149, 50, 224, 191, 52, 224, 191, 215, 212, 224, 191,
+ 223, 50, 224, 191, 223, 50, 52, 224, 191, 223, 50, 215, 212, 224, 191,
+ 250, 239, 219, 156, 233, 43, 254, 111, 223, 255, 78, 219, 156, 222, 248,
+ 254, 111, 223, 255, 78, 223, 108, 78, 52, 245, 32, 78, 235, 202, 226,
+ 120, 214, 180, 135, 216, 112, 250, 240, 235, 217, 225, 11, 253, 215, 240,
+ 170, 251, 114, 244, 3, 219, 96, 43, 42, 251, 159, 2, 224, 8, 44, 42, 251,
+ 159, 2, 224, 8, 52, 224, 14, 78, 224, 14, 245, 32, 78, 245, 32, 224, 14,
+ 78, 216, 71, 5, 245, 66, 223, 50, 225, 69, 50, 85, 140, 251, 114, 85, 97,
+ 251, 114, 121, 253, 217, 223, 50, 220, 151, 250, 2, 214, 163, 113, 253,
+ 216, 254, 159, 213, 188, 249, 218, 230, 183, 50, 217, 235, 248, 157, 235,
+ 194, 214, 180, 244, 53, 224, 142, 78, 134, 59, 224, 141, 224, 25, 224,
+ 191, 244, 12, 59, 224, 141, 244, 82, 59, 224, 141, 113, 59, 224, 141,
+ 244, 12, 59, 78, 246, 119, 249, 131, 215, 222, 67, 244, 12, 247, 119,
+ 231, 83, 11, 219, 19, 211, 209, 235, 64, 243, 228, 254, 53, 235, 192,
+ 216, 86, 235, 192, 220, 138, 235, 192, 225, 23, 235, 229, 217, 183, 217,
+ 252, 255, 6, 217, 183, 217, 252, 235, 229, 10, 244, 21, 220, 81, 255, 6,
+ 10, 244, 21, 220, 81, 229, 190, 21, 220, 82, 228, 70, 21, 220, 82, 218,
+ 24, 210, 86, 218, 24, 7, 4, 1, 73, 218, 24, 161, 218, 24, 189, 218, 24,
+ 194, 218, 24, 198, 218, 24, 195, 218, 24, 200, 218, 24, 96, 50, 218, 24,
+ 230, 182, 218, 24, 245, 99, 50, 218, 24, 43, 226, 4, 218, 24, 44, 226, 4,
+ 218, 24, 7, 4, 1, 230, 26, 218, 66, 210, 86, 218, 66, 110, 218, 66, 105,
+ 218, 66, 158, 218, 66, 161, 218, 66, 189, 218, 66, 194, 218, 66, 198,
+ 218, 66, 195, 218, 66, 200, 218, 66, 96, 50, 218, 66, 230, 182, 218, 66,
+ 245, 99, 50, 218, 66, 43, 226, 4, 218, 66, 44, 226, 4, 7, 218, 66, 4, 1,
+ 61, 7, 218, 66, 4, 1, 75, 7, 218, 66, 4, 1, 76, 7, 218, 66, 4, 1, 211,
+ 178, 7, 218, 66, 4, 1, 221, 196, 7, 218, 66, 4, 1, 242, 61, 7, 218, 66,
+ 4, 1, 235, 24, 7, 218, 66, 4, 1, 156, 7, 218, 66, 4, 1, 193, 7, 218, 66,
+ 4, 1, 230, 26, 7, 218, 66, 4, 1, 226, 106, 7, 218, 66, 4, 1, 222, 92, 7,
+ 218, 66, 4, 1, 217, 153, 245, 47, 50, 249, 228, 50, 249, 118, 50, 243,
+ 252, 243, 255, 50, 232, 199, 50, 230, 195, 50, 229, 211, 50, 225, 163,
+ 50, 222, 119, 50, 211, 217, 50, 166, 220, 50, 50, 247, 128, 50, 245, 48,
+ 50, 234, 77, 50, 215, 113, 50, 246, 102, 50, 243, 41, 225, 194, 50, 225,
+ 161, 50, 242, 110, 50, 253, 183, 50, 240, 229, 50, 250, 186, 50, 232,
+ 192, 216, 4, 50, 219, 1, 50, 216, 246, 50, 235, 242, 222, 119, 50, 215,
+ 97, 232, 199, 50, 38, 43, 242, 0, 48, 38, 44, 242, 0, 48, 38, 199, 67,
+ 232, 215, 226, 121, 38, 219, 252, 67, 232, 215, 226, 121, 38, 254, 89,
+ 80, 48, 38, 250, 3, 80, 48, 38, 43, 80, 48, 38, 44, 80, 48, 38, 222, 235,
+ 226, 121, 38, 250, 3, 222, 235, 226, 121, 38, 254, 89, 222, 235, 226,
+ 121, 38, 134, 170, 48, 38, 244, 12, 170, 48, 38, 245, 147, 250, 36, 38,
+ 245, 147, 218, 235, 38, 245, 147, 247, 249, 38, 245, 147, 250, 37, 252,
+ 181, 38, 43, 44, 80, 48, 38, 245, 147, 221, 189, 38, 245, 147, 234, 136,
+ 38, 245, 147, 214, 155, 225, 8, 215, 226, 38, 223, 51, 219, 48, 226, 121,
+ 38, 52, 67, 218, 104, 226, 121, 38, 254, 99, 87, 38, 215, 212, 214, 182,
+ 38, 211, 247, 251, 141, 48, 38, 140, 80, 226, 121, 38, 199, 52, 219, 48,
+ 226, 121, 38, 97, 242, 0, 2, 252, 140, 246, 104, 38, 140, 242, 0, 2, 252,
+ 140, 246, 104, 38, 43, 80, 51, 38, 44, 80, 51, 38, 253, 218, 48, 255, 12,
+ 226, 232, 254, 252, 216, 43, 216, 197, 218, 75, 139, 6, 251, 67, 248, 72,
+ 250, 179, 250, 176, 232, 215, 87, 250, 241, 226, 232, 251, 27, 214, 189,
+ 245, 49, 249, 192, 221, 186, 248, 72, 244, 180, 119, 4, 243, 203, 119, 6,
+ 242, 61, 251, 220, 6, 242, 61, 139, 6, 242, 61, 225, 38, 249, 192, 225,
+ 38, 249, 193, 117, 113, 225, 109, 119, 6, 73, 251, 220, 6, 73, 119, 6,
+ 156, 119, 4, 156, 233, 150, 57, 252, 142, 87, 139, 6, 230, 26, 227, 197,
+ 50, 219, 32, 223, 120, 249, 163, 119, 6, 226, 106, 139, 6, 226, 106, 139,
+ 6, 224, 97, 119, 6, 153, 251, 220, 6, 153, 139, 6, 153, 224, 197, 217,
+ 72, 223, 63, 220, 133, 78, 217, 2, 50, 215, 254, 164, 50, 213, 240, 139,
+ 6, 210, 159, 226, 134, 50, 226, 222, 50, 235, 194, 226, 222, 50, 251,
+ 220, 6, 210, 159, 215, 94, 26, 4, 1, 235, 186, 234, 174, 50, 254, 108,
+ 50, 119, 6, 253, 159, 251, 220, 6, 251, 67, 245, 69, 87, 119, 4, 75, 119,
+ 6, 75, 119, 6, 245, 7, 215, 94, 6, 245, 7, 119, 6, 193, 119, 4, 76, 112,
+ 87, 252, 30, 87, 242, 203, 87, 248, 191, 87, 235, 233, 219, 30, 222, 188,
+ 6, 224, 97, 244, 183, 50, 139, 4, 225, 109, 139, 4, 243, 108, 139, 6,
+ 243, 108, 139, 6, 225, 109, 139, 230, 25, 218, 41, 215, 94, 35, 6, 243,
+ 203, 215, 94, 35, 6, 156, 223, 50, 35, 6, 156, 215, 94, 35, 6, 211, 117,
+ 139, 32, 6, 249, 61, 139, 32, 4, 249, 61, 139, 32, 4, 75, 139, 32, 4, 73,
+ 139, 32, 4, 235, 145, 224, 171, 232, 214, 215, 94, 254, 127, 225, 184,
+ 50, 254, 181, 215, 94, 4, 245, 7, 16, 31, 221, 253, 219, 30, 212, 114,
+ 244, 3, 123, 220, 119, 212, 114, 244, 3, 123, 228, 195, 212, 114, 244, 3,
+ 123, 216, 242, 212, 114, 244, 3, 123, 216, 169, 212, 114, 244, 3, 113,
+ 216, 167, 212, 114, 244, 3, 123, 244, 118, 212, 114, 244, 3, 113, 244,
+ 117, 212, 114, 244, 3, 134, 244, 117, 212, 114, 244, 3, 244, 12, 244,
+ 117, 212, 114, 244, 3, 123, 219, 116, 212, 114, 244, 3, 244, 82, 219,
+ 114, 212, 114, 244, 3, 123, 245, 189, 212, 114, 244, 3, 134, 245, 187,
+ 212, 114, 244, 3, 244, 82, 245, 187, 212, 114, 244, 3, 220, 123, 245,
+ 187, 244, 3, 227, 198, 110, 222, 199, 227, 199, 110, 222, 199, 227, 199,
+ 105, 222, 199, 227, 199, 158, 222, 199, 227, 199, 161, 222, 199, 227,
+ 199, 189, 222, 199, 227, 199, 194, 222, 199, 227, 199, 198, 222, 199,
+ 227, 199, 195, 222, 199, 227, 199, 200, 222, 199, 227, 199, 216, 248,
+ 222, 199, 227, 199, 245, 168, 222, 199, 227, 199, 215, 76, 222, 199, 227,
+ 199, 244, 115, 222, 199, 227, 199, 123, 240, 211, 222, 199, 227, 199,
+ 244, 82, 240, 211, 222, 199, 227, 199, 123, 216, 148, 4, 222, 199, 227,
+ 199, 110, 4, 222, 199, 227, 199, 105, 4, 222, 199, 227, 199, 158, 4, 222,
+ 199, 227, 199, 161, 4, 222, 199, 227, 199, 189, 4, 222, 199, 227, 199,
+ 194, 4, 222, 199, 227, 199, 198, 4, 222, 199, 227, 199, 195, 4, 222, 199,
+ 227, 199, 200, 4, 222, 199, 227, 199, 216, 248, 4, 222, 199, 227, 199,
+ 245, 168, 4, 222, 199, 227, 199, 215, 76, 4, 222, 199, 227, 199, 244,
+ 115, 4, 222, 199, 227, 199, 123, 240, 211, 4, 222, 199, 227, 199, 244,
+ 82, 240, 211, 4, 222, 199, 227, 199, 123, 216, 148, 222, 199, 227, 199,
+ 123, 216, 149, 251, 68, 249, 61, 222, 199, 227, 199, 244, 82, 216, 148,
+ 222, 199, 227, 199, 216, 249, 216, 148, 222, 199, 227, 199, 223, 50, 123,
+ 240, 211, 7, 4, 1, 223, 50, 251, 67, 222, 199, 227, 199, 219, 126, 233,
+ 79, 17, 222, 199, 227, 199, 244, 116, 245, 227, 17, 222, 199, 227, 199,
+ 244, 116, 216, 148, 222, 199, 227, 199, 123, 240, 212, 216, 148, 212,
+ 114, 244, 3, 210, 87, 216, 167, 140, 74, 214, 153, 74, 97, 74, 246, 105,
+ 74, 43, 44, 74, 120, 124, 74, 228, 57, 212, 9, 74, 228, 57, 245, 221, 74,
+ 219, 29, 245, 221, 74, 219, 29, 212, 9, 74, 140, 80, 2, 91, 97, 80, 2,
+ 91, 140, 212, 36, 74, 97, 212, 36, 74, 140, 113, 241, 235, 74, 214, 153,
+ 113, 241, 235, 74, 97, 113, 241, 235, 74, 246, 105, 113, 241, 235, 74,
+ 140, 80, 2, 217, 78, 97, 80, 2, 217, 78, 140, 80, 243, 244, 130, 214,
+ 153, 80, 243, 244, 130, 97, 80, 243, 244, 130, 246, 105, 80, 243, 244,
+ 130, 120, 124, 80, 2, 252, 128, 140, 80, 2, 103, 97, 80, 2, 103, 140, 80,
+ 2, 232, 124, 97, 80, 2, 232, 124, 43, 44, 212, 36, 74, 43, 44, 80, 2, 91,
+ 246, 105, 210, 35, 74, 214, 153, 80, 2, 216, 78, 233, 38, 214, 153, 80,
+ 2, 216, 78, 222, 242, 246, 105, 80, 2, 216, 78, 233, 38, 246, 105, 80, 2,
+ 216, 78, 222, 242, 97, 80, 2, 249, 162, 246, 104, 246, 105, 80, 2, 249,
+ 162, 233, 38, 254, 89, 216, 15, 220, 154, 74, 250, 3, 216, 15, 220, 154,
+ 74, 228, 57, 212, 9, 80, 216, 43, 199, 130, 140, 80, 216, 43, 252, 142,
+ 117, 97, 80, 216, 43, 130, 254, 89, 204, 250, 37, 74, 250, 3, 204, 250,
+ 37, 74, 140, 242, 0, 2, 252, 140, 214, 152, 140, 242, 0, 2, 252, 140,
+ 246, 104, 214, 153, 242, 0, 2, 252, 140, 222, 242, 214, 153, 242, 0, 2,
+ 252, 140, 233, 38, 97, 242, 0, 2, 252, 140, 214, 152, 97, 242, 0, 2, 252,
+ 140, 246, 104, 246, 105, 242, 0, 2, 252, 140, 222, 242, 246, 105, 242, 0,
+ 2, 252, 140, 233, 38, 97, 80, 117, 140, 74, 214, 153, 80, 140, 64, 246,
+ 105, 74, 140, 80, 117, 97, 74, 140, 226, 71, 253, 248, 214, 153, 226, 71,
+ 253, 248, 97, 226, 71, 253, 248, 246, 105, 226, 71, 253, 248, 140, 242,
+ 0, 117, 97, 241, 255, 97, 242, 0, 117, 140, 241, 255, 140, 52, 80, 2, 91,
+ 43, 44, 52, 80, 2, 91, 97, 52, 80, 2, 91, 140, 52, 74, 214, 153, 52, 74,
+ 97, 52, 74, 246, 105, 52, 74, 43, 44, 52, 74, 120, 124, 52, 74, 228, 57,
+ 212, 9, 52, 74, 228, 57, 245, 221, 52, 74, 219, 29, 245, 221, 52, 74,
+ 219, 29, 212, 9, 52, 74, 140, 215, 212, 74, 97, 215, 212, 74, 140, 218,
+ 231, 74, 97, 218, 231, 74, 214, 153, 80, 2, 52, 91, 246, 105, 80, 2, 52,
+ 91, 140, 248, 156, 74, 214, 153, 248, 156, 74, 97, 248, 156, 74, 246,
+ 105, 248, 156, 74, 140, 80, 216, 43, 130, 97, 80, 216, 43, 130, 140, 71,
+ 74, 214, 153, 71, 74, 97, 71, 74, 246, 105, 71, 74, 214, 153, 71, 80,
+ 243, 244, 130, 214, 153, 71, 80, 226, 198, 225, 215, 214, 153, 71, 80,
+ 226, 198, 225, 216, 2, 203, 130, 214, 153, 71, 80, 226, 198, 225, 216, 2,
+ 67, 130, 214, 153, 71, 52, 74, 214, 153, 71, 52, 80, 226, 198, 225, 215,
+ 97, 71, 80, 243, 244, 212, 56, 228, 57, 212, 9, 80, 216, 43, 249, 161,
+ 219, 29, 245, 221, 80, 216, 43, 249, 161, 120, 124, 71, 74, 44, 80, 2, 4,
+ 250, 36, 246, 105, 80, 140, 64, 214, 153, 74, 134, 97, 253, 248, 140, 80,
+ 2, 67, 91, 97, 80, 2, 67, 91, 43, 44, 80, 2, 67, 91, 140, 80, 2, 52, 67,
+ 91, 97, 80, 2, 52, 67, 91, 43, 44, 80, 2, 52, 67, 91, 140, 226, 174, 74,
+ 97, 226, 174, 74, 43, 44, 226, 174, 74, 31, 254, 155, 249, 215, 225, 254,
+ 247, 234, 216, 188, 245, 28, 216, 188, 247, 139, 228, 53, 245, 29, 245,
+ 153, 220, 128, 235, 246, 229, 222, 245, 171, 226, 232, 228, 53, 254, 125,
+ 245, 171, 226, 232, 4, 245, 171, 226, 232, 249, 187, 253, 239, 231, 63,
+ 247, 139, 228, 53, 249, 189, 253, 239, 231, 63, 4, 249, 187, 253, 239,
+ 231, 63, 245, 144, 64, 224, 173, 230, 25, 224, 181, 230, 25, 249, 166,
+ 230, 25, 218, 41, 230, 183, 50, 230, 181, 50, 59, 225, 23, 247, 170, 219,
+ 96, 220, 129, 230, 182, 253, 218, 226, 168, 222, 235, 226, 168, 251, 115,
+ 226, 168, 42, 222, 194, 249, 110, 222, 194, 244, 5, 222, 194, 224, 169,
+ 111, 235, 235, 44, 254, 110, 254, 110, 231, 89, 254, 110, 219, 0, 254,
+ 110, 247, 172, 247, 139, 228, 53, 247, 175, 226, 9, 111, 228, 53, 226, 9,
+ 111, 232, 147, 254, 119, 232, 147, 226, 159, 235, 199, 214, 175, 235,
+ 212, 52, 235, 212, 215, 212, 235, 212, 249, 183, 235, 212, 218, 14, 235,
+ 212, 213, 129, 235, 212, 250, 3, 235, 212, 250, 3, 249, 183, 235, 212,
+ 254, 89, 249, 183, 235, 212, 216, 187, 252, 68, 223, 138, 224, 170, 59,
+ 230, 182, 245, 34, 243, 47, 224, 170, 241, 58, 216, 90, 226, 168, 223,
+ 50, 183, 235, 194, 233, 66, 222, 92, 219, 158, 212, 35, 211, 200, 224,
+ 181, 228, 53, 183, 230, 183, 183, 253, 211, 128, 111, 228, 53, 253, 211,
+ 128, 111, 254, 49, 128, 111, 254, 49, 251, 89, 228, 53, 255, 5, 128, 111,
+ 229, 101, 254, 49, 228, 60, 255, 5, 128, 111, 254, 149, 128, 111, 228,
+ 53, 254, 149, 128, 111, 254, 149, 128, 177, 128, 111, 215, 212, 183, 254,
+ 156, 128, 111, 245, 95, 111, 243, 46, 245, 95, 111, 247, 235, 252, 24,
+ 254, 51, 216, 197, 232, 222, 243, 46, 128, 111, 254, 49, 128, 216, 43,
+ 177, 216, 197, 236, 16, 226, 232, 236, 16, 64, 177, 254, 49, 128, 111,
+ 249, 228, 245, 98, 245, 99, 249, 227, 222, 235, 236, 1, 128, 111, 222,
+ 235, 128, 111, 249, 155, 111, 245, 68, 245, 97, 111, 218, 158, 245, 98,
+ 248, 56, 128, 111, 128, 216, 43, 251, 79, 248, 73, 231, 89, 251, 78, 224,
+ 12, 128, 111, 228, 53, 128, 111, 240, 105, 111, 228, 53, 240, 105, 111,
+ 218, 110, 245, 95, 111, 233, 16, 177, 128, 111, 242, 131, 177, 128, 111,
+ 233, 16, 117, 128, 111, 242, 131, 117, 128, 111, 233, 16, 251, 89, 228,
+ 53, 128, 111, 242, 131, 251, 89, 228, 53, 128, 111, 230, 98, 233, 15,
+ 230, 98, 242, 130, 252, 24, 228, 53, 245, 95, 111, 228, 53, 233, 15, 228,
+ 53, 242, 130, 229, 101, 233, 16, 228, 60, 128, 111, 229, 101, 242, 131,
+ 228, 60, 128, 111, 233, 16, 177, 245, 95, 111, 242, 131, 177, 245, 95,
+ 111, 229, 101, 233, 16, 228, 60, 245, 95, 111, 229, 101, 242, 131, 228,
+ 60, 245, 95, 111, 233, 16, 177, 242, 130, 242, 131, 177, 233, 15, 229,
+ 101, 233, 16, 228, 60, 242, 130, 229, 101, 242, 131, 228, 60, 233, 15,
+ 224, 203, 218, 56, 224, 204, 177, 128, 111, 218, 57, 177, 128, 111, 224,
+ 204, 177, 245, 95, 111, 218, 57, 177, 245, 95, 111, 247, 139, 228, 53,
+ 224, 206, 247, 139, 228, 53, 218, 58, 218, 65, 226, 232, 218, 23, 226,
+ 232, 228, 53, 115, 218, 65, 226, 232, 228, 53, 115, 218, 23, 226, 232,
+ 218, 65, 64, 177, 128, 111, 218, 23, 64, 177, 128, 111, 229, 101, 115,
+ 218, 65, 64, 228, 60, 128, 111, 229, 101, 115, 218, 23, 64, 228, 60, 128,
+ 111, 218, 65, 64, 2, 228, 53, 128, 111, 218, 23, 64, 2, 228, 53, 128,
+ 111, 230, 82, 230, 83, 230, 84, 230, 83, 214, 175, 42, 236, 16, 226, 232,
+ 42, 226, 151, 226, 232, 42, 236, 16, 64, 177, 128, 111, 42, 226, 151, 64,
+ 177, 128, 111, 42, 250, 252, 42, 249, 103, 37, 225, 23, 37, 230, 182, 37,
+ 216, 86, 37, 247, 170, 219, 96, 37, 59, 226, 168, 37, 222, 235, 226, 168,
+ 37, 253, 218, 226, 168, 37, 245, 98, 37, 248, 157, 92, 225, 23, 92, 230,
+ 182, 92, 216, 86, 92, 59, 226, 168, 44, 217, 88, 43, 217, 88, 124, 217,
+ 88, 120, 217, 88, 253, 221, 230, 157, 215, 192, 244, 26, 215, 212, 67,
+ 252, 142, 44, 215, 93, 52, 67, 252, 142, 52, 44, 215, 93, 247, 139, 228,
+ 53, 224, 164, 228, 53, 215, 192, 247, 139, 228, 53, 244, 27, 229, 103,
+ 52, 67, 252, 142, 52, 44, 215, 93, 224, 204, 214, 184, 223, 92, 218, 57,
+ 214, 184, 223, 92, 228, 58, 218, 78, 226, 232, 249, 187, 253, 239, 228,
+ 58, 218, 77, 228, 58, 218, 78, 64, 177, 128, 111, 249, 187, 253, 239,
+ 228, 58, 218, 78, 177, 128, 111, 226, 151, 226, 232, 236, 16, 226, 232,
+ 230, 88, 241, 201, 249, 197, 231, 138, 235, 209, 211, 145, 229, 203, 228,
+ 59, 44, 254, 111, 2, 254, 26, 44, 215, 226, 230, 25, 232, 147, 254, 119,
+ 230, 25, 232, 147, 226, 159, 230, 25, 235, 199, 230, 25, 214, 175, 247,
+ 250, 226, 168, 59, 226, 168, 218, 158, 226, 168, 247, 170, 216, 86, 251,
+ 165, 43, 228, 58, 244, 182, 220, 150, 224, 181, 44, 228, 58, 244, 182,
+ 220, 150, 224, 181, 43, 220, 150, 224, 181, 44, 220, 150, 224, 181, 223,
+ 50, 216, 90, 245, 98, 249, 100, 232, 147, 226, 159, 249, 100, 232, 147,
+ 254, 119, 52, 218, 64, 52, 218, 22, 52, 235, 199, 52, 214, 175, 225, 48,
+ 128, 22, 226, 9, 111, 233, 16, 2, 247, 121, 242, 131, 2, 247, 121, 213,
+ 187, 230, 98, 233, 15, 213, 187, 230, 98, 242, 130, 233, 16, 128, 216,
+ 43, 177, 242, 130, 242, 131, 128, 216, 43, 177, 233, 15, 128, 216, 43,
+ 177, 233, 15, 128, 216, 43, 177, 242, 130, 128, 216, 43, 177, 224, 203,
+ 128, 216, 43, 177, 218, 56, 247, 139, 228, 53, 224, 207, 177, 245, 100,
+ 247, 139, 228, 53, 218, 59, 177, 245, 100, 228, 53, 42, 236, 16, 64, 177,
+ 128, 111, 228, 53, 42, 226, 151, 64, 177, 128, 111, 42, 236, 16, 64, 177,
+ 228, 53, 128, 111, 42, 226, 151, 64, 177, 228, 53, 128, 111, 233, 16,
+ 251, 89, 228, 53, 245, 95, 111, 242, 131, 251, 89, 228, 53, 245, 95, 111,
+ 224, 204, 251, 89, 228, 53, 245, 95, 111, 218, 57, 251, 89, 228, 53, 245,
+ 95, 111, 228, 53, 228, 58, 218, 78, 226, 232, 247, 139, 228, 53, 249,
+ 189, 253, 239, 228, 58, 218, 77, 228, 53, 228, 58, 218, 78, 64, 177, 128,
+ 111, 247, 139, 228, 53, 249, 189, 253, 239, 228, 58, 218, 78, 177, 245,
+ 100, 67, 245, 164, 230, 223, 203, 245, 164, 120, 44, 248, 0, 245, 164,
+ 124, 44, 248, 0, 245, 164, 245, 171, 64, 2, 199, 203, 91, 245, 171, 64,
+ 2, 67, 252, 142, 253, 208, 245, 144, 64, 203, 91, 4, 245, 171, 64, 2, 67,
+ 252, 142, 253, 208, 245, 144, 64, 203, 91, 245, 171, 64, 2, 59, 48, 245,
+ 171, 64, 2, 226, 124, 4, 245, 171, 64, 2, 226, 124, 245, 171, 64, 2, 214,
+ 183, 245, 171, 64, 2, 113, 203, 218, 91, 249, 187, 2, 199, 203, 91, 249,
+ 187, 2, 67, 252, 142, 253, 208, 245, 144, 64, 203, 91, 4, 249, 187, 2,
+ 67, 252, 142, 253, 208, 245, 144, 64, 203, 91, 249, 187, 2, 226, 124, 4,
+ 249, 187, 2, 226, 124, 210, 160, 188, 252, 174, 231, 62, 247, 251, 50,
+ 245, 173, 74, 240, 235, 120, 253, 250, 124, 253, 250, 224, 176, 225, 166,
+ 212, 32, 232, 214, 43, 250, 182, 44, 250, 182, 43, 244, 58, 44, 244, 58,
+ 251, 176, 44, 249, 133, 251, 176, 43, 249, 133, 216, 15, 44, 249, 133,
+ 216, 15, 43, 249, 133, 223, 50, 228, 53, 50, 42, 232, 105, 254, 26, 221,
+ 165, 221, 172, 217, 2, 223, 121, 224, 242, 235, 239, 213, 165, 218, 235,
+ 225, 42, 64, 235, 208, 50, 215, 94, 228, 53, 50, 212, 42, 240, 237, 216,
+ 15, 43, 249, 161, 216, 15, 44, 249, 161, 251, 176, 43, 249, 161, 251,
+ 176, 44, 249, 161, 216, 15, 163, 235, 212, 251, 176, 163, 235, 212, 243,
+ 241, 219, 76, 120, 253, 251, 252, 25, 113, 203, 252, 130, 226, 161, 234,
+ 139, 245, 91, 216, 43, 216, 197, 222, 252, 211, 179, 236, 1, 115, 223,
+ 118, 251, 164, 234, 138, 233, 43, 254, 111, 127, 222, 248, 254, 111, 127,
+ 245, 91, 216, 43, 216, 197, 233, 47, 252, 36, 222, 234, 249, 71, 254,
+ 156, 254, 2, 217, 182, 216, 5, 222, 124, 247, 216, 226, 152, 249, 199,
+ 217, 53, 219, 87, 249, 152, 249, 151, 254, 67, 243, 226, 16, 240, 152,
+ 254, 67, 243, 226, 16, 218, 229, 224, 28, 254, 67, 243, 226, 16, 224, 29,
+ 245, 100, 254, 67, 243, 226, 16, 224, 29, 247, 175, 254, 67, 243, 226,
+ 16, 224, 29, 247, 249, 254, 67, 243, 226, 16, 224, 29, 235, 57, 254, 67,
+ 243, 226, 16, 224, 29, 250, 36, 254, 67, 243, 226, 16, 250, 37, 218, 136,
+ 254, 67, 243, 226, 16, 250, 37, 235, 57, 254, 67, 243, 226, 16, 219, 97,
+ 130, 254, 67, 243, 226, 16, 252, 182, 130, 254, 67, 243, 226, 16, 224,
+ 29, 219, 96, 254, 67, 243, 226, 16, 224, 29, 252, 181, 254, 67, 243, 226,
+ 16, 224, 29, 233, 15, 254, 67, 243, 226, 16, 224, 29, 242, 130, 254, 67,
+ 243, 226, 16, 140, 214, 19, 254, 67, 243, 226, 16, 97, 214, 19, 254, 67,
+ 243, 226, 16, 224, 29, 140, 74, 254, 67, 243, 226, 16, 224, 29, 97, 74,
+ 254, 67, 243, 226, 16, 250, 37, 252, 181, 254, 67, 243, 226, 16, 124,
+ 217, 89, 214, 183, 254, 67, 243, 226, 16, 248, 56, 218, 136, 254, 67,
+ 243, 226, 16, 224, 29, 124, 250, 239, 254, 67, 243, 226, 16, 224, 29,
+ 248, 55, 254, 67, 243, 226, 16, 124, 217, 89, 235, 57, 254, 67, 243, 226,
+ 16, 214, 153, 214, 19, 254, 67, 243, 226, 16, 224, 29, 214, 153, 74, 254,
+ 67, 243, 226, 16, 120, 217, 89, 226, 124, 254, 67, 243, 226, 16, 248, 67,
+ 218, 136, 254, 67, 243, 226, 16, 224, 29, 120, 250, 239, 254, 67, 243,
+ 226, 16, 224, 29, 248, 66, 254, 67, 243, 226, 16, 120, 217, 89, 235, 57,
+ 254, 67, 243, 226, 16, 246, 105, 214, 19, 254, 67, 243, 226, 16, 224, 29,
+ 246, 105, 74, 254, 67, 243, 226, 16, 223, 254, 214, 183, 254, 67, 243,
+ 226, 16, 248, 56, 214, 183, 254, 67, 243, 226, 16, 247, 250, 214, 183,
+ 254, 67, 243, 226, 16, 235, 58, 214, 183, 254, 67, 243, 226, 16, 250, 37,
+ 214, 183, 254, 67, 243, 226, 16, 120, 220, 6, 235, 57, 254, 67, 243, 226,
+ 16, 223, 254, 224, 28, 254, 67, 243, 226, 16, 250, 37, 218, 157, 254, 67,
+ 243, 226, 16, 224, 29, 249, 227, 254, 67, 243, 226, 16, 120, 217, 89,
+ 248, 2, 254, 67, 243, 226, 16, 248, 67, 248, 2, 254, 67, 243, 226, 16,
+ 218, 158, 248, 2, 254, 67, 243, 226, 16, 235, 58, 248, 2, 254, 67, 243,
+ 226, 16, 250, 37, 248, 2, 254, 67, 243, 226, 16, 124, 220, 6, 218, 136,
+ 254, 67, 243, 226, 16, 43, 220, 6, 218, 136, 254, 67, 243, 226, 16, 216,
+ 90, 248, 2, 254, 67, 243, 226, 16, 242, 131, 248, 2, 254, 67, 243, 226,
+ 16, 249, 221, 130, 254, 67, 243, 226, 16, 248, 67, 183, 254, 67, 243,
+ 226, 16, 210, 34, 254, 67, 243, 226, 16, 218, 137, 183, 254, 67, 243,
+ 226, 16, 220, 152, 214, 183, 254, 67, 243, 226, 16, 224, 29, 228, 53,
+ 245, 100, 254, 67, 243, 226, 16, 224, 29, 224, 13, 254, 67, 243, 226, 16,
+ 124, 250, 240, 183, 254, 67, 243, 226, 16, 120, 250, 240, 183, 254, 67,
+ 243, 226, 16, 235, 186, 254, 67, 243, 226, 16, 223, 38, 254, 67, 243,
+ 226, 16, 226, 202, 254, 67, 243, 226, 16, 254, 145, 214, 183, 254, 67,
+ 243, 226, 16, 245, 102, 214, 183, 254, 67, 243, 226, 16, 235, 187, 214,
+ 183, 254, 67, 243, 226, 16, 226, 203, 214, 183, 254, 67, 243, 226, 16,
+ 254, 144, 228, 53, 250, 131, 78, 44, 254, 111, 2, 246, 105, 210, 35, 74,
+ 219, 236, 204, 251, 164, 252, 46, 87, 67, 232, 215, 2, 230, 225, 247,
+ 121, 235, 217, 87, 249, 184, 214, 181, 87, 247, 190, 214, 181, 87, 245,
+ 155, 87, 249, 211, 87, 71, 42, 2, 250, 176, 67, 232, 214, 245, 131, 87,
+ 254, 140, 234, 140, 87, 241, 214, 87, 37, 203, 252, 142, 2, 228, 51, 37,
+ 215, 227, 246, 107, 251, 136, 250, 37, 2, 228, 55, 74, 214, 179, 87, 230,
+ 138, 87, 240, 165, 87, 226, 175, 242, 60, 87, 226, 175, 233, 148, 87,
+ 225, 245, 87, 225, 244, 87, 247, 198, 249, 98, 16, 244, 21, 105, 219, 51,
+ 87, 254, 67, 243, 226, 16, 224, 28, 248, 84, 220, 139, 234, 140, 87, 224,
+ 193, 226, 76, 229, 83, 226, 76, 224, 189, 221, 190, 87, 250, 18, 221,
+ 190, 87, 43, 226, 5, 214, 160, 103, 43, 226, 5, 245, 22, 43, 226, 5, 232,
+ 109, 103, 44, 226, 5, 214, 160, 103, 44, 226, 5, 245, 22, 44, 226, 5,
+ 232, 109, 103, 43, 42, 251, 159, 214, 160, 249, 161, 43, 42, 251, 159,
+ 245, 22, 43, 42, 251, 159, 232, 109, 249, 161, 44, 42, 251, 159, 214,
+ 160, 249, 161, 44, 42, 251, 159, 245, 22, 44, 42, 251, 159, 232, 109,
+ 249, 161, 43, 249, 100, 251, 159, 214, 160, 103, 43, 249, 100, 251, 159,
+ 230, 225, 225, 102, 43, 249, 100, 251, 159, 232, 109, 103, 249, 100, 251,
+ 159, 245, 22, 44, 249, 100, 251, 159, 214, 160, 103, 44, 249, 100, 251,
+ 159, 230, 225, 225, 102, 44, 249, 100, 251, 159, 232, 109, 103, 235, 213,
+ 245, 22, 203, 232, 215, 245, 22, 214, 160, 43, 177, 232, 109, 44, 249,
+ 100, 251, 159, 221, 173, 214, 160, 44, 177, 232, 109, 43, 249, 100, 251,
+ 159, 221, 173, 218, 42, 216, 14, 218, 42, 251, 175, 216, 15, 42, 127,
+ 251, 176, 42, 127, 251, 176, 42, 251, 159, 117, 216, 15, 42, 127, 34, 16,
+ 251, 175, 43, 67, 93, 232, 214, 44, 67, 93, 232, 214, 203, 221, 206, 232,
+ 213, 203, 221, 206, 232, 212, 203, 221, 206, 232, 211, 203, 221, 206,
+ 232, 210, 248, 47, 16, 192, 67, 22, 216, 15, 222, 252, 248, 47, 16, 192,
+ 67, 22, 251, 176, 222, 252, 248, 47, 16, 192, 67, 2, 250, 36, 248, 47,
+ 16, 192, 124, 22, 203, 2, 250, 36, 248, 47, 16, 192, 120, 22, 203, 2,
+ 250, 36, 248, 47, 16, 192, 67, 2, 215, 226, 248, 47, 16, 192, 124, 22,
+ 203, 2, 215, 226, 248, 47, 16, 192, 120, 22, 203, 2, 215, 226, 248, 47,
+ 16, 192, 67, 22, 212, 35, 248, 47, 16, 192, 124, 22, 203, 2, 212, 35,
+ 248, 47, 16, 192, 120, 22, 203, 2, 212, 35, 248, 47, 16, 192, 124, 22,
+ 241, 45, 248, 47, 16, 192, 120, 22, 241, 45, 248, 47, 16, 192, 67, 22,
+ 216, 15, 233, 47, 248, 47, 16, 192, 67, 22, 251, 176, 233, 47, 42, 244,
+ 33, 223, 55, 87, 245, 183, 87, 67, 232, 215, 245, 22, 231, 34, 251, 147,
+ 231, 34, 199, 117, 219, 251, 231, 34, 219, 252, 117, 232, 138, 231, 34,
+ 199, 117, 113, 219, 238, 231, 34, 113, 219, 239, 117, 232, 138, 231, 34,
+ 113, 219, 239, 235, 65, 231, 34, 215, 209, 231, 34, 216, 224, 231, 34,
+ 225, 189, 245, 225, 242, 123, 243, 220, 216, 15, 226, 4, 251, 176, 226,
+ 4, 216, 15, 249, 100, 127, 251, 176, 249, 100, 127, 216, 15, 216, 7, 220,
+ 54, 127, 251, 176, 216, 7, 220, 54, 127, 71, 215, 240, 252, 36, 222, 235,
+ 2, 250, 36, 218, 121, 244, 65, 255, 18, 249, 97, 245, 172, 235, 199, 248,
+ 84, 245, 25, 87, 85, 222, 248, 52, 215, 226, 85, 233, 43, 52, 215, 226,
+ 85, 214, 162, 52, 215, 226, 85, 246, 106, 52, 215, 226, 85, 222, 248, 52,
+ 215, 227, 2, 67, 130, 85, 233, 43, 52, 215, 227, 2, 67, 130, 85, 222,
+ 248, 215, 227, 2, 52, 67, 130, 254, 174, 250, 4, 218, 127, 216, 87, 250,
+ 4, 240, 238, 2, 244, 51, 221, 242, 16, 31, 227, 203, 16, 31, 218, 153,
+ 64, 241, 234, 16, 31, 218, 153, 64, 216, 213, 16, 31, 245, 144, 64, 216,
+ 213, 16, 31, 245, 144, 64, 215, 244, 16, 31, 245, 133, 16, 31, 255, 8,
+ 16, 31, 252, 45, 16, 31, 252, 180, 16, 31, 203, 217, 90, 16, 31, 232,
+ 215, 244, 146, 16, 31, 67, 217, 90, 16, 31, 244, 21, 244, 146, 16, 31,
+ 250, 231, 223, 54, 16, 31, 220, 29, 226, 131, 16, 31, 220, 29, 236, 0,
+ 16, 31, 248, 152, 232, 205, 245, 78, 16, 31, 248, 32, 249, 179, 110, 16,
+ 31, 248, 32, 249, 179, 105, 16, 31, 248, 32, 249, 179, 158, 16, 31, 248,
+ 32, 249, 179, 161, 16, 31, 152, 255, 8, 16, 31, 217, 178, 236, 63, 16,
+ 31, 245, 144, 64, 215, 245, 251, 214, 16, 31, 251, 6, 16, 31, 245, 144,
+ 64, 231, 82, 16, 31, 218, 62, 16, 31, 245, 78, 16, 31, 244, 108, 220,
+ 138, 16, 31, 242, 122, 220, 138, 16, 31, 223, 122, 220, 138, 16, 31, 214,
+ 174, 220, 138, 16, 31, 219, 19, 16, 31, 248, 64, 251, 217, 87, 204, 251,
+ 164, 16, 31, 229, 86, 16, 31, 248, 65, 244, 21, 105, 16, 31, 218, 63,
+ 244, 21, 105, 226, 242, 103, 226, 242, 250, 153, 226, 242, 244, 24, 226,
+ 242, 235, 194, 244, 24, 226, 242, 252, 43, 251, 125, 226, 242, 251, 171,
+ 216, 112, 226, 242, 251, 156, 252, 147, 240, 104, 226, 242, 254, 128, 64,
+ 250, 130, 226, 242, 248, 157, 226, 242, 249, 88, 255, 12, 227, 201, 226,
+ 242, 52, 252, 181, 37, 21, 110, 37, 21, 105, 37, 21, 158, 37, 21, 161,
+ 37, 21, 189, 37, 21, 194, 37, 21, 198, 37, 21, 195, 37, 21, 200, 37, 54,
+ 216, 248, 37, 54, 245, 168, 37, 54, 215, 76, 37, 54, 216, 165, 37, 54,
+ 244, 6, 37, 54, 244, 119, 37, 54, 219, 120, 37, 54, 220, 120, 37, 54,
+ 245, 191, 37, 54, 228, 198, 37, 54, 215, 73, 88, 21, 110, 88, 21, 105,
+ 88, 21, 158, 88, 21, 161, 88, 21, 189, 88, 21, 194, 88, 21, 198, 88, 21,
+ 195, 88, 21, 200, 88, 54, 216, 248, 88, 54, 245, 168, 88, 54, 215, 76,
+ 88, 54, 216, 165, 88, 54, 244, 6, 88, 54, 244, 119, 88, 54, 219, 120, 88,
+ 54, 220, 120, 88, 54, 245, 191, 88, 54, 228, 198, 88, 54, 215, 73, 21,
+ 123, 243, 230, 218, 130, 21, 113, 243, 230, 218, 130, 21, 134, 243, 230,
+ 218, 130, 21, 244, 12, 243, 230, 218, 130, 21, 244, 82, 243, 230, 218,
+ 130, 21, 219, 126, 243, 230, 218, 130, 21, 220, 123, 243, 230, 218, 130,
+ 21, 245, 194, 243, 230, 218, 130, 21, 228, 201, 243, 230, 218, 130, 54,
+ 216, 249, 243, 230, 218, 130, 54, 245, 169, 243, 230, 218, 130, 54, 215,
+ 77, 243, 230, 218, 130, 54, 216, 166, 243, 230, 218, 130, 54, 244, 7,
+ 243, 230, 218, 130, 54, 244, 120, 243, 230, 218, 130, 54, 219, 121, 243,
+ 230, 218, 130, 54, 220, 121, 243, 230, 218, 130, 54, 245, 192, 243, 230,
+ 218, 130, 54, 228, 199, 243, 230, 218, 130, 54, 215, 74, 243, 230, 218,
+ 130, 88, 7, 4, 1, 61, 88, 7, 4, 1, 253, 159, 88, 7, 4, 1, 251, 67, 88, 7,
+ 4, 1, 249, 61, 88, 7, 4, 1, 75, 88, 7, 4, 1, 245, 7, 88, 7, 4, 1, 243,
+ 203, 88, 7, 4, 1, 242, 61, 88, 7, 4, 1, 73, 88, 7, 4, 1, 235, 145, 88, 7,
+ 4, 1, 235, 24, 88, 7, 4, 1, 156, 88, 7, 4, 1, 193, 88, 7, 4, 1, 230, 26,
+ 88, 7, 4, 1, 76, 88, 7, 4, 1, 226, 106, 88, 7, 4, 1, 224, 97, 88, 7, 4,
+ 1, 153, 88, 7, 4, 1, 222, 92, 88, 7, 4, 1, 217, 153, 88, 7, 4, 1, 70, 88,
+ 7, 4, 1, 214, 105, 88, 7, 4, 1, 212, 98, 88, 7, 4, 1, 211, 178, 88, 7, 4,
+ 1, 211, 117, 88, 7, 4, 1, 210, 159, 37, 7, 6, 1, 61, 37, 7, 6, 1, 253,
+ 159, 37, 7, 6, 1, 251, 67, 37, 7, 6, 1, 249, 61, 37, 7, 6, 1, 75, 37, 7,
+ 6, 1, 245, 7, 37, 7, 6, 1, 243, 203, 37, 7, 6, 1, 242, 61, 37, 7, 6, 1,
+ 73, 37, 7, 6, 1, 235, 145, 37, 7, 6, 1, 235, 24, 37, 7, 6, 1, 156, 37, 7,
+ 6, 1, 193, 37, 7, 6, 1, 230, 26, 37, 7, 6, 1, 76, 37, 7, 6, 1, 226, 106,
+ 37, 7, 6, 1, 224, 97, 37, 7, 6, 1, 153, 37, 7, 6, 1, 222, 92, 37, 7, 6,
+ 1, 217, 153, 37, 7, 6, 1, 70, 37, 7, 6, 1, 214, 105, 37, 7, 6, 1, 212,
+ 98, 37, 7, 6, 1, 211, 178, 37, 7, 6, 1, 211, 117, 37, 7, 6, 1, 210, 159,
+ 37, 7, 4, 1, 61, 37, 7, 4, 1, 253, 159, 37, 7, 4, 1, 251, 67, 37, 7, 4,
+ 1, 249, 61, 37, 7, 4, 1, 75, 37, 7, 4, 1, 245, 7, 37, 7, 4, 1, 243, 203,
+ 37, 7, 4, 1, 242, 61, 37, 7, 4, 1, 73, 37, 7, 4, 1, 235, 145, 37, 7, 4,
+ 1, 235, 24, 37, 7, 4, 1, 156, 37, 7, 4, 1, 193, 37, 7, 4, 1, 230, 26, 37,
+ 7, 4, 1, 76, 37, 7, 4, 1, 226, 106, 37, 7, 4, 1, 224, 97, 37, 7, 4, 1,
+ 153, 37, 7, 4, 1, 222, 92, 37, 7, 4, 1, 217, 153, 37, 7, 4, 1, 70, 37, 7,
+ 4, 1, 214, 105, 37, 7, 4, 1, 212, 98, 37, 7, 4, 1, 211, 178, 37, 7, 4, 1,
+ 211, 117, 37, 7, 4, 1, 210, 159, 37, 21, 210, 86, 152, 37, 54, 245, 168,
+ 152, 37, 54, 215, 76, 152, 37, 54, 216, 165, 152, 37, 54, 244, 6, 152,
+ 37, 54, 244, 119, 152, 37, 54, 219, 120, 152, 37, 54, 220, 120, 152, 37,
+ 54, 245, 191, 152, 37, 54, 228, 198, 152, 37, 54, 215, 73, 52, 37, 21,
+ 110, 52, 37, 21, 105, 52, 37, 21, 158, 52, 37, 21, 161, 52, 37, 21, 189,
+ 52, 37, 21, 194, 52, 37, 21, 198, 52, 37, 21, 195, 52, 37, 21, 200, 52,
+ 37, 54, 216, 248, 152, 37, 21, 210, 86, 93, 99, 192, 241, 45, 93, 99,
+ 114, 241, 45, 93, 99, 192, 213, 239, 93, 99, 114, 213, 239, 93, 99, 192,
+ 215, 212, 248, 158, 241, 45, 93, 99, 114, 215, 212, 248, 158, 241, 45,
+ 93, 99, 192, 215, 212, 248, 158, 213, 239, 93, 99, 114, 215, 212, 248,
+ 158, 213, 239, 93, 99, 192, 224, 25, 248, 158, 241, 45, 93, 99, 114, 224,
+ 25, 248, 158, 241, 45, 93, 99, 192, 224, 25, 248, 158, 213, 239, 93, 99,
+ 114, 224, 25, 248, 158, 213, 239, 93, 99, 192, 124, 22, 222, 252, 93, 99,
+ 124, 192, 22, 44, 241, 222, 93, 99, 124, 114, 22, 44, 232, 231, 93, 99,
+ 114, 124, 22, 222, 252, 93, 99, 192, 124, 22, 233, 47, 93, 99, 124, 192,
+ 22, 43, 241, 222, 93, 99, 124, 114, 22, 43, 232, 231, 93, 99, 114, 124,
+ 22, 233, 47, 93, 99, 192, 120, 22, 222, 252, 93, 99, 120, 192, 22, 44,
+ 241, 222, 93, 99, 120, 114, 22, 44, 232, 231, 93, 99, 114, 120, 22, 222,
+ 252, 93, 99, 192, 120, 22, 233, 47, 93, 99, 120, 192, 22, 43, 241, 222,
+ 93, 99, 120, 114, 22, 43, 232, 231, 93, 99, 114, 120, 22, 233, 47, 93,
+ 99, 192, 67, 22, 222, 252, 93, 99, 67, 192, 22, 44, 241, 222, 93, 99,
+ 120, 114, 22, 44, 124, 232, 231, 93, 99, 124, 114, 22, 44, 120, 232, 231,
+ 93, 99, 67, 114, 22, 44, 232, 231, 93, 99, 124, 192, 22, 44, 120, 241,
+ 222, 93, 99, 120, 192, 22, 44, 124, 241, 222, 93, 99, 114, 67, 22, 222,
+ 252, 93, 99, 192, 67, 22, 233, 47, 93, 99, 67, 192, 22, 43, 241, 222, 93,
+ 99, 120, 114, 22, 43, 124, 232, 231, 93, 99, 124, 114, 22, 43, 120, 232,
+ 231, 93, 99, 67, 114, 22, 43, 232, 231, 93, 99, 124, 192, 22, 43, 120,
+ 241, 222, 93, 99, 120, 192, 22, 43, 124, 241, 222, 93, 99, 114, 67, 22,
+ 233, 47, 93, 99, 192, 124, 22, 241, 45, 93, 99, 43, 114, 22, 44, 124,
+ 232, 231, 93, 99, 44, 114, 22, 43, 124, 232, 231, 93, 99, 124, 192, 22,
+ 203, 241, 222, 93, 99, 124, 114, 22, 203, 232, 231, 93, 99, 44, 192, 22,
+ 43, 124, 241, 222, 93, 99, 43, 192, 22, 44, 124, 241, 222, 93, 99, 114,
+ 124, 22, 241, 45, 93, 99, 192, 120, 22, 241, 45, 93, 99, 43, 114, 22, 44,
+ 120, 232, 231, 93, 99, 44, 114, 22, 43, 120, 232, 231, 93, 99, 120, 192,
+ 22, 203, 241, 222, 93, 99, 120, 114, 22, 203, 232, 231, 93, 99, 44, 192,
+ 22, 43, 120, 241, 222, 93, 99, 43, 192, 22, 44, 120, 241, 222, 93, 99,
+ 114, 120, 22, 241, 45, 93, 99, 192, 67, 22, 241, 45, 93, 99, 43, 114, 22,
+ 44, 67, 232, 231, 93, 99, 44, 114, 22, 43, 67, 232, 231, 93, 99, 67, 192,
+ 22, 203, 241, 222, 93, 99, 120, 114, 22, 124, 203, 232, 231, 93, 99, 124,
+ 114, 22, 120, 203, 232, 231, 93, 99, 67, 114, 22, 203, 232, 231, 93, 99,
+ 43, 120, 114, 22, 44, 124, 232, 231, 93, 99, 44, 120, 114, 22, 43, 124,
+ 232, 231, 93, 99, 43, 124, 114, 22, 44, 120, 232, 231, 93, 99, 44, 124,
+ 114, 22, 43, 120, 232, 231, 93, 99, 124, 192, 22, 120, 203, 241, 222, 93,
+ 99, 120, 192, 22, 124, 203, 241, 222, 93, 99, 44, 192, 22, 43, 67, 241,
+ 222, 93, 99, 43, 192, 22, 44, 67, 241, 222, 93, 99, 114, 67, 22, 241, 45,
+ 93, 99, 192, 52, 248, 158, 241, 45, 93, 99, 114, 52, 248, 158, 241, 45,
+ 93, 99, 192, 52, 248, 158, 213, 239, 93, 99, 114, 52, 248, 158, 213, 239,
+ 93, 99, 52, 241, 45, 93, 99, 52, 213, 239, 93, 99, 124, 219, 156, 22, 44,
+ 246, 114, 93, 99, 124, 52, 22, 44, 219, 155, 93, 99, 52, 124, 22, 222,
+ 252, 93, 99, 124, 219, 156, 22, 43, 246, 114, 93, 99, 124, 52, 22, 43,
+ 219, 155, 93, 99, 52, 124, 22, 233, 47, 93, 99, 120, 219, 156, 22, 44,
+ 246, 114, 93, 99, 120, 52, 22, 44, 219, 155, 93, 99, 52, 120, 22, 222,
+ 252, 93, 99, 120, 219, 156, 22, 43, 246, 114, 93, 99, 120, 52, 22, 43,
+ 219, 155, 93, 99, 52, 120, 22, 233, 47, 93, 99, 67, 219, 156, 22, 44,
+ 246, 114, 93, 99, 67, 52, 22, 44, 219, 155, 93, 99, 52, 67, 22, 222, 252,
+ 93, 99, 67, 219, 156, 22, 43, 246, 114, 93, 99, 67, 52, 22, 43, 219, 155,
+ 93, 99, 52, 67, 22, 233, 47, 93, 99, 124, 219, 156, 22, 203, 246, 114,
+ 93, 99, 124, 52, 22, 203, 219, 155, 93, 99, 52, 124, 22, 241, 45, 93, 99,
+ 120, 219, 156, 22, 203, 246, 114, 93, 99, 120, 52, 22, 203, 219, 155, 93,
+ 99, 52, 120, 22, 241, 45, 93, 99, 67, 219, 156, 22, 203, 246, 114, 93,
+ 99, 67, 52, 22, 203, 219, 155, 93, 99, 52, 67, 22, 241, 45, 93, 99, 192,
+ 254, 27, 124, 22, 222, 252, 93, 99, 192, 254, 27, 124, 22, 233, 47, 93,
+ 99, 192, 254, 27, 120, 22, 233, 47, 93, 99, 192, 254, 27, 120, 22, 222,
+ 252, 93, 99, 192, 248, 0, 214, 160, 44, 216, 43, 232, 109, 233, 47, 93,
+ 99, 192, 248, 0, 214, 160, 43, 216, 43, 232, 109, 222, 252, 93, 99, 192,
+ 248, 0, 249, 131, 93, 99, 192, 233, 47, 93, 99, 192, 214, 163, 93, 99,
+ 192, 222, 252, 93, 99, 192, 246, 107, 93, 99, 114, 233, 47, 93, 99, 114,
+ 214, 163, 93, 99, 114, 222, 252, 93, 99, 114, 246, 107, 93, 99, 192, 43,
+ 22, 114, 222, 252, 93, 99, 192, 120, 22, 114, 246, 107, 93, 99, 114, 43,
+ 22, 192, 222, 252, 93, 99, 114, 120, 22, 192, 246, 107, 214, 160, 163,
+ 251, 214, 232, 109, 123, 245, 190, 251, 214, 232, 109, 123, 224, 23, 251,
+ 214, 232, 109, 134, 245, 188, 251, 214, 232, 109, 163, 251, 214, 232,
+ 109, 244, 82, 245, 188, 251, 214, 232, 109, 134, 224, 21, 251, 214, 232,
+ 109, 220, 123, 245, 188, 251, 214, 243, 230, 251, 214, 43, 220, 123, 245,
+ 188, 251, 214, 43, 134, 224, 21, 251, 214, 43, 244, 82, 245, 188, 251,
+ 214, 43, 163, 251, 214, 43, 134, 245, 188, 251, 214, 43, 123, 224, 23,
+ 251, 214, 43, 123, 245, 190, 251, 214, 44, 163, 251, 214, 192, 220, 93,
+ 231, 83, 220, 93, 248, 163, 220, 93, 214, 160, 123, 245, 190, 251, 214,
+ 44, 123, 245, 190, 251, 214, 224, 27, 232, 109, 233, 47, 224, 27, 232,
+ 109, 222, 252, 224, 27, 214, 160, 233, 47, 224, 27, 214, 160, 43, 22,
+ 232, 109, 43, 22, 232, 109, 222, 252, 224, 27, 214, 160, 43, 22, 232,
+ 109, 222, 252, 224, 27, 214, 160, 43, 22, 214, 160, 44, 22, 232, 109,
+ 233, 47, 224, 27, 214, 160, 43, 22, 214, 160, 44, 22, 232, 109, 222, 252,
+ 224, 27, 214, 160, 222, 252, 224, 27, 214, 160, 44, 22, 232, 109, 233,
+ 47, 224, 27, 214, 160, 44, 22, 232, 109, 43, 22, 232, 109, 222, 252, 85,
+ 218, 235, 71, 218, 235, 71, 42, 2, 222, 184, 249, 160, 71, 42, 249, 188,
+ 85, 4, 218, 235, 42, 2, 203, 244, 106, 42, 2, 67, 244, 106, 42, 2, 226,
+ 145, 249, 127, 244, 106, 42, 2, 214, 160, 43, 216, 43, 232, 109, 44, 244,
+ 106, 42, 2, 214, 160, 44, 216, 43, 232, 109, 43, 244, 106, 42, 2, 248, 0,
+ 249, 127, 244, 106, 85, 4, 218, 235, 71, 4, 218, 235, 85, 223, 117, 71,
+ 223, 117, 85, 67, 223, 117, 71, 67, 223, 117, 85, 226, 7, 71, 226, 7, 85,
+ 214, 162, 215, 226, 71, 214, 162, 215, 226, 85, 214, 162, 4, 215, 226,
+ 71, 214, 162, 4, 215, 226, 85, 222, 248, 215, 226, 71, 222, 248, 215,
+ 226, 85, 222, 248, 4, 215, 226, 71, 222, 248, 4, 215, 226, 85, 222, 248,
+ 225, 9, 71, 222, 248, 225, 9, 85, 246, 106, 215, 226, 71, 246, 106, 215,
+ 226, 85, 246, 106, 4, 215, 226, 71, 246, 106, 4, 215, 226, 85, 233, 43,
+ 215, 226, 71, 233, 43, 215, 226, 85, 233, 43, 4, 215, 226, 71, 233, 43,
+ 4, 215, 226, 85, 233, 43, 225, 9, 71, 233, 43, 225, 9, 85, 247, 249, 71,
+ 247, 249, 71, 247, 250, 249, 188, 85, 4, 247, 249, 244, 90, 232, 105, 71,
+ 250, 36, 246, 119, 250, 36, 250, 37, 2, 67, 244, 106, 251, 112, 85, 250,
+ 36, 250, 37, 2, 43, 163, 251, 222, 250, 37, 2, 44, 163, 251, 222, 250,
+ 37, 2, 232, 109, 163, 251, 222, 250, 37, 2, 214, 160, 163, 251, 222, 250,
+ 37, 2, 214, 160, 44, 224, 27, 251, 222, 250, 37, 2, 254, 156, 251, 89,
+ 214, 160, 43, 224, 27, 251, 222, 43, 163, 85, 250, 36, 44, 163, 85, 250,
+ 36, 235, 195, 251, 114, 235, 195, 71, 250, 36, 214, 160, 163, 235, 195,
+ 71, 250, 36, 232, 109, 163, 235, 195, 71, 250, 36, 214, 160, 43, 224, 27,
+ 250, 34, 254, 26, 214, 160, 44, 224, 27, 250, 34, 254, 26, 232, 109, 44,
+ 224, 27, 250, 34, 254, 26, 232, 109, 43, 224, 27, 250, 34, 254, 26, 214,
+ 160, 163, 250, 36, 232, 109, 163, 250, 36, 85, 232, 109, 44, 215, 226,
+ 85, 232, 109, 43, 215, 226, 85, 214, 160, 43, 215, 226, 85, 214, 160, 44,
+ 215, 226, 71, 251, 114, 42, 2, 43, 163, 251, 222, 42, 2, 44, 163, 251,
+ 222, 42, 2, 214, 160, 43, 248, 0, 163, 251, 222, 42, 2, 232, 109, 44,
+ 248, 0, 163, 251, 222, 71, 42, 2, 67, 251, 233, 232, 214, 71, 214, 162,
+ 215, 227, 2, 247, 121, 214, 162, 215, 227, 2, 43, 163, 251, 222, 214,
+ 162, 215, 227, 2, 44, 163, 251, 222, 233, 86, 250, 36, 71, 42, 2, 214,
+ 160, 43, 224, 26, 71, 42, 2, 232, 109, 43, 224, 26, 71, 42, 2, 232, 109,
+ 44, 224, 26, 71, 42, 2, 214, 160, 44, 224, 26, 71, 250, 37, 2, 214, 160,
+ 43, 224, 26, 71, 250, 37, 2, 232, 109, 43, 224, 26, 71, 250, 37, 2, 232,
+ 109, 44, 224, 26, 71, 250, 37, 2, 214, 160, 44, 224, 26, 214, 160, 43,
+ 215, 226, 214, 160, 44, 215, 226, 232, 109, 43, 215, 226, 71, 231, 83,
+ 218, 235, 85, 231, 83, 218, 235, 71, 231, 83, 4, 218, 235, 85, 231, 83,
+ 4, 218, 235, 232, 109, 44, 215, 226, 85, 218, 39, 2, 223, 133, 249, 248,
+ 214, 194, 219, 61, 249, 223, 85, 218, 157, 71, 218, 157, 232, 229, 216,
+ 133, 218, 38, 253, 235, 228, 72, 248, 39, 228, 72, 249, 196, 226, 164,
+ 85, 217, 1, 71, 217, 1, 252, 157, 251, 164, 252, 157, 93, 2, 250, 130,
+ 252, 157, 93, 2, 211, 178, 221, 255, 214, 195, 2, 223, 161, 246, 85, 240,
+ 244, 252, 23, 71, 220, 3, 225, 102, 85, 220, 3, 225, 102, 220, 88, 223,
+ 50, 222, 188, 244, 56, 241, 229, 251, 114, 85, 43, 225, 8, 235, 243, 85,
+ 44, 225, 8, 235, 243, 71, 43, 225, 8, 235, 243, 71, 120, 225, 8, 235,
+ 243, 71, 44, 225, 8, 235, 243, 71, 124, 225, 8, 235, 243, 219, 102, 22,
+ 249, 130, 250, 220, 50, 223, 173, 50, 251, 240, 50, 251, 26, 254, 103,
+ 226, 146, 249, 131, 250, 112, 223, 38, 249, 132, 64, 232, 119, 249, 132,
+ 64, 235, 117, 218, 158, 22, 249, 137, 244, 169, 87, 254, 249, 220, 90,
+ 242, 23, 22, 219, 190, 225, 221, 87, 210, 254, 211, 69, 215, 216, 31,
+ 241, 224, 215, 216, 31, 233, 108, 215, 216, 31, 244, 97, 215, 216, 31,
+ 216, 134, 215, 216, 31, 211, 239, 215, 216, 31, 212, 40, 215, 216, 31,
+ 230, 116, 215, 216, 31, 245, 224, 212, 1, 64, 248, 19, 71, 243, 240, 244,
+ 191, 71, 219, 75, 244, 191, 85, 219, 75, 244, 191, 71, 218, 39, 2, 223,
+ 133, 244, 93, 224, 23, 230, 129, 233, 81, 224, 23, 230, 129, 231, 55,
+ 244, 139, 50, 245, 224, 231, 191, 50, 235, 39, 221, 221, 214, 145, 229,
+ 94, 225, 21, 254, 13, 217, 41, 243, 53, 251, 4, 233, 20, 213, 150, 232,
+ 239, 221, 192, 222, 20, 250, 249, 254, 43, 225, 53, 71, 250, 118, 234,
+ 79, 71, 250, 118, 224, 15, 71, 250, 118, 222, 196, 71, 250, 118, 251,
+ 232, 71, 250, 118, 234, 31, 71, 250, 118, 225, 232, 85, 250, 118, 234,
+ 79, 85, 250, 118, 224, 15, 85, 250, 118, 222, 196, 85, 250, 118, 251,
+ 232, 85, 250, 118, 234, 31, 85, 250, 118, 225, 232, 85, 219, 17, 218, 51,
+ 71, 241, 229, 218, 51, 71, 247, 250, 218, 51, 85, 249, 246, 218, 51, 71,
+ 219, 17, 218, 51, 85, 241, 229, 218, 51, 85, 247, 250, 218, 51, 71, 249,
+ 246, 218, 51, 240, 244, 218, 239, 224, 23, 228, 48, 245, 190, 228, 48,
+ 252, 74, 245, 190, 228, 43, 252, 74, 219, 119, 228, 43, 230, 58, 244, 67,
+ 50, 230, 58, 229, 189, 50, 230, 58, 220, 77, 50, 212, 9, 182, 249, 131,
+ 245, 221, 182, 249, 131, 214, 171, 223, 113, 87, 223, 113, 16, 31, 215,
+ 48, 225, 35, 223, 113, 16, 31, 215, 47, 225, 35, 223, 113, 16, 31, 215,
+ 46, 225, 35, 223, 113, 16, 31, 215, 45, 225, 35, 223, 113, 16, 31, 215,
+ 44, 225, 35, 223, 113, 16, 31, 215, 43, 225, 35, 223, 113, 16, 31, 215,
+ 42, 225, 35, 223, 113, 16, 31, 243, 51, 231, 139, 85, 214, 171, 223, 113,
+ 87, 223, 114, 226, 21, 87, 225, 253, 226, 21, 87, 225, 175, 226, 21, 50,
+ 211, 255, 87, 247, 242, 244, 190, 247, 242, 244, 189, 247, 242, 244, 188,
+ 247, 242, 244, 187, 247, 242, 244, 186, 247, 242, 244, 185, 71, 250, 37,
+ 2, 59, 222, 252, 71, 250, 37, 2, 113, 247, 119, 85, 250, 37, 2, 71, 59,
+ 222, 252, 85, 250, 37, 2, 113, 71, 247, 119, 230, 143, 31, 211, 69, 230,
+ 143, 31, 210, 253, 247, 225, 31, 242, 132, 211, 69, 247, 225, 31, 233,
+ 14, 210, 253, 247, 225, 31, 233, 14, 211, 69, 247, 225, 31, 242, 132,
+ 210, 253, 71, 244, 74, 85, 244, 74, 242, 23, 22, 225, 105, 254, 121, 249,
+ 129, 217, 236, 218, 165, 64, 254, 227, 221, 207, 254, 170, 244, 52, 243,
+ 61, 218, 165, 64, 241, 203, 253, 200, 87, 244, 63, 226, 127, 71, 218,
+ 157, 134, 232, 209, 249, 176, 222, 252, 134, 232, 209, 249, 176, 233, 47,
+ 212, 50, 50, 125, 213, 130, 50, 246, 111, 244, 139, 50, 246, 111, 231,
+ 191, 50, 235, 204, 244, 139, 22, 231, 191, 50, 231, 191, 22, 244, 139,
+ 50, 231, 191, 2, 218, 104, 50, 231, 191, 2, 218, 104, 22, 231, 191, 22,
+ 244, 139, 50, 67, 231, 191, 2, 218, 104, 50, 203, 231, 191, 2, 218, 104,
+ 50, 231, 83, 71, 250, 36, 231, 83, 85, 250, 36, 231, 83, 4, 71, 250, 36,
+ 231, 154, 87, 247, 168, 87, 214, 169, 225, 252, 87, 249, 232, 243, 225,
+ 214, 141, 229, 89, 250, 162, 226, 62, 235, 45, 213, 185, 250, 94, 85,
+ 230, 130, 232, 226, 220, 113, 220, 148, 224, 6, 220, 131, 219, 56, 252,
+ 160, 252, 127, 92, 234, 139, 71, 246, 94, 231, 186, 71, 246, 94, 234, 79,
+ 85, 246, 94, 231, 186, 85, 246, 94, 234, 79, 219, 62, 211, 230, 219, 65,
+ 218, 39, 252, 52, 249, 248, 223, 160, 85, 219, 61, 216, 135, 249, 249,
+ 22, 223, 160, 215, 94, 71, 220, 3, 225, 102, 215, 94, 85, 220, 3, 225,
+ 102, 71, 247, 250, 236, 1, 218, 235, 249, 126, 233, 92, 247, 194, 250,
+ 245, 226, 167, 225, 105, 250, 246, 219, 89, 241, 213, 2, 71, 249, 131,
+ 37, 249, 126, 233, 92, 250, 154, 228, 76, 245, 125, 254, 142, 226, 192,
+ 43, 212, 26, 215, 252, 85, 215, 55, 43, 212, 26, 215, 252, 71, 215, 55,
+ 43, 212, 26, 215, 252, 85, 43, 233, 93, 231, 54, 71, 43, 233, 93, 231,
+ 54, 246, 90, 219, 83, 50, 114, 71, 246, 106, 215, 226, 43, 250, 1, 245,
+ 125, 92, 221, 255, 244, 176, 248, 0, 236, 1, 71, 250, 37, 236, 1, 85,
+ 218, 235, 85, 215, 193, 223, 61, 43, 245, 124, 223, 61, 43, 245, 123,
+ 253, 212, 16, 31, 214, 145, 114, 250, 37, 2, 218, 104, 22, 113, 170, 48,
+ 225, 190, 222, 249, 235, 206, 225, 190, 233, 44, 235, 206, 225, 190, 235,
+ 194, 225, 190, 85, 249, 132, 226, 198, 220, 30, 220, 18, 219, 230, 250,
+ 62, 250, 227, 241, 158, 219, 127, 243, 62, 211, 230, 240, 221, 243, 62,
+ 2, 242, 13, 231, 174, 16, 31, 232, 230, 230, 116, 214, 195, 226, 198,
+ 242, 123, 244, 13, 244, 75, 236, 1, 241, 60, 244, 130, 222, 15, 42, 244,
+ 12, 249, 160, 219, 105, 240, 113, 219, 108, 225, 169, 2, 252, 160, 216,
+ 243, 235, 132, 252, 147, 87, 241, 232, 242, 134, 87, 243, 233, 224, 143,
+ 249, 104, 226, 198, 85, 218, 235, 71, 244, 75, 2, 203, 230, 225, 85, 218,
+ 105, 214, 160, 251, 218, 221, 194, 85, 221, 194, 232, 109, 251, 218, 221,
+ 194, 71, 221, 194, 71, 114, 250, 131, 78, 217, 2, 232, 155, 50, 217, 54,
+ 246, 89, 254, 192, 245, 120, 223, 158, 244, 86, 223, 158, 242, 16, 213,
+ 174, 242, 16, 211, 198, 242, 16, 232, 109, 44, 225, 199, 225, 199, 214,
+ 160, 44, 225, 199, 71, 228, 231, 85, 228, 231, 250, 131, 78, 114, 250,
+ 131, 78, 230, 85, 211, 178, 114, 230, 85, 211, 178, 252, 157, 211, 178,
+ 114, 252, 157, 211, 178, 226, 127, 26, 249, 131, 114, 26, 249, 131, 204,
+ 250, 176, 249, 131, 114, 204, 250, 176, 249, 131, 7, 249, 131, 220, 92,
+ 71, 7, 249, 131, 226, 127, 7, 249, 131, 231, 188, 249, 131, 218, 158, 64,
+ 248, 150, 244, 12, 217, 16, 253, 217, 244, 12, 252, 158, 253, 217, 114,
+ 244, 12, 252, 158, 253, 217, 244, 12, 249, 244, 253, 217, 85, 244, 12,
+ 225, 10, 218, 157, 71, 244, 12, 225, 10, 218, 157, 219, 12, 218, 112,
+ 226, 127, 71, 218, 157, 37, 71, 218, 157, 204, 250, 176, 85, 218, 157,
+ 85, 250, 176, 71, 218, 157, 226, 127, 85, 218, 157, 114, 226, 127, 85,
+ 218, 157, 225, 61, 218, 157, 220, 92, 71, 218, 157, 114, 253, 217, 204,
+ 250, 176, 253, 217, 245, 194, 218, 245, 253, 217, 245, 194, 225, 10, 85,
+ 218, 157, 245, 194, 225, 10, 225, 61, 218, 157, 219, 126, 225, 10, 85,
+ 218, 157, 245, 194, 225, 10, 223, 115, 85, 218, 157, 114, 245, 194, 225,
+ 10, 223, 115, 85, 218, 157, 215, 77, 225, 10, 85, 218, 157, 219, 121,
+ 225, 10, 253, 217, 217, 16, 253, 217, 204, 250, 176, 217, 16, 253, 217,
+ 114, 217, 16, 253, 217, 219, 126, 225, 158, 85, 22, 71, 244, 55, 85, 244,
+ 55, 71, 244, 55, 245, 194, 225, 158, 226, 127, 85, 244, 55, 37, 204, 250,
+ 176, 245, 194, 225, 10, 218, 157, 114, 217, 16, 225, 61, 253, 217, 219,
+ 63, 216, 106, 215, 219, 219, 63, 114, 250, 115, 219, 63, 219, 14, 114,
+ 219, 14, 252, 158, 253, 217, 245, 194, 217, 16, 224, 172, 253, 217, 114,
+ 245, 194, 217, 16, 224, 172, 253, 217, 249, 132, 78, 220, 92, 71, 250,
+ 36, 152, 92, 249, 132, 78, 232, 109, 44, 246, 87, 71, 218, 235, 214, 160,
+ 44, 246, 87, 71, 218, 235, 232, 109, 44, 220, 92, 71, 218, 235, 214, 160,
+ 44, 220, 92, 71, 218, 235, 85, 224, 14, 164, 226, 148, 71, 224, 14, 164,
+ 226, 148, 71, 245, 32, 164, 226, 148, 85, 247, 250, 230, 183, 71, 211,
+ 178, 114, 245, 32, 164, 87, 192, 67, 130, 231, 83, 67, 130, 114, 67, 130,
+ 114, 219, 156, 215, 94, 249, 221, 223, 255, 164, 226, 148, 114, 219, 156,
+ 249, 221, 223, 255, 164, 226, 148, 114, 52, 215, 94, 249, 221, 223, 255,
+ 164, 226, 148, 114, 52, 249, 221, 223, 255, 164, 226, 148, 114, 121, 219,
+ 156, 249, 221, 223, 255, 164, 226, 148, 114, 121, 52, 249, 221, 223, 255,
+ 164, 226, 148, 249, 92, 218, 141, 226, 16, 5, 226, 148, 114, 245, 32,
+ 164, 226, 148, 114, 241, 229, 245, 32, 164, 226, 148, 114, 85, 241, 228,
+ 222, 188, 114, 85, 241, 229, 251, 114, 244, 56, 241, 228, 222, 188, 244,
+ 56, 241, 229, 251, 114, 231, 83, 43, 226, 5, 226, 148, 231, 83, 44, 226,
+ 5, 226, 148, 231, 83, 244, 64, 43, 226, 5, 226, 148, 231, 83, 244, 64,
+ 44, 226, 5, 226, 148, 231, 83, 233, 43, 254, 111, 251, 159, 226, 148,
+ 231, 83, 222, 248, 254, 111, 251, 159, 226, 148, 114, 233, 43, 254, 111,
+ 223, 255, 164, 226, 148, 114, 222, 248, 254, 111, 223, 255, 164, 226,
+ 148, 114, 233, 43, 254, 111, 251, 159, 226, 148, 114, 222, 248, 254, 111,
+ 251, 159, 226, 148, 192, 43, 216, 7, 220, 54, 251, 159, 226, 148, 192,
+ 44, 216, 7, 220, 54, 251, 159, 226, 148, 231, 83, 43, 249, 100, 251, 159,
+ 226, 148, 231, 83, 44, 249, 100, 251, 159, 226, 148, 247, 205, 152, 37,
+ 21, 110, 247, 205, 152, 37, 21, 105, 247, 205, 152, 37, 21, 158, 247,
+ 205, 152, 37, 21, 161, 247, 205, 152, 37, 21, 189, 247, 205, 152, 37, 21,
+ 194, 247, 205, 152, 37, 21, 198, 247, 205, 152, 37, 21, 195, 247, 205,
+ 152, 37, 21, 200, 247, 205, 152, 37, 54, 216, 248, 247, 205, 37, 35, 21,
+ 110, 247, 205, 37, 35, 21, 105, 247, 205, 37, 35, 21, 158, 247, 205, 37,
+ 35, 21, 161, 247, 205, 37, 35, 21, 189, 247, 205, 37, 35, 21, 194, 247,
+ 205, 37, 35, 21, 198, 247, 205, 37, 35, 21, 195, 247, 205, 37, 35, 21,
+ 200, 247, 205, 37, 35, 54, 216, 248, 247, 205, 152, 37, 35, 21, 110, 247,
+ 205, 152, 37, 35, 21, 105, 247, 205, 152, 37, 35, 21, 158, 247, 205, 152,
+ 37, 35, 21, 161, 247, 205, 152, 37, 35, 21, 189, 247, 205, 152, 37, 35,
+ 21, 194, 247, 205, 152, 37, 35, 21, 198, 247, 205, 152, 37, 35, 21, 195,
+ 247, 205, 152, 37, 35, 21, 200, 247, 205, 152, 37, 35, 54, 216, 248, 114,
+ 211, 246, 97, 74, 114, 96, 50, 114, 230, 183, 50, 114, 247, 170, 50, 114,
+ 219, 29, 245, 221, 74, 114, 97, 74, 114, 228, 57, 245, 221, 74, 246, 99,
+ 225, 12, 97, 74, 114, 222, 185, 97, 74, 215, 225, 97, 74, 114, 215, 225,
+ 97, 74, 248, 156, 215, 225, 97, 74, 114, 248, 156, 215, 225, 97, 74, 85,
+ 97, 74, 216, 145, 216, 13, 97, 253, 250, 216, 145, 251, 174, 97, 253,
+ 250, 85, 97, 253, 250, 114, 85, 249, 92, 246, 105, 22, 97, 74, 114, 85,
+ 249, 92, 214, 153, 22, 97, 74, 218, 232, 85, 97, 74, 114, 249, 207, 85,
+ 97, 74, 222, 247, 71, 97, 74, 233, 42, 71, 97, 74, 252, 184, 220, 92, 71,
+ 97, 74, 243, 242, 220, 92, 71, 97, 74, 114, 232, 109, 222, 246, 71, 97,
+ 74, 114, 214, 160, 222, 246, 71, 97, 74, 228, 50, 232, 109, 222, 246, 71,
+ 97, 74, 249, 100, 232, 124, 228, 50, 214, 160, 222, 246, 71, 97, 74, 37,
+ 114, 71, 97, 74, 211, 252, 97, 74, 251, 221, 219, 29, 245, 221, 74, 251,
+ 221, 97, 74, 251, 221, 228, 57, 245, 221, 74, 114, 251, 221, 219, 29,
+ 245, 221, 74, 114, 251, 221, 97, 74, 114, 251, 221, 228, 57, 245, 221,
+ 74, 217, 18, 97, 74, 114, 217, 17, 97, 74, 212, 18, 97, 74, 114, 212, 18,
+ 97, 74, 226, 173, 97, 74, 52, 249, 100, 232, 124, 134, 247, 215, 254,
+ 110, 71, 215, 227, 249, 188, 4, 71, 215, 226, 225, 172, 204, 218, 64,
+ 204, 218, 22, 43, 222, 91, 252, 174, 248, 61, 44, 222, 91, 252, 174, 248,
+ 61, 177, 2, 59, 235, 216, 223, 51, 219, 48, 224, 202, 218, 64, 218, 23,
+ 224, 202, 219, 47, 67, 252, 142, 2, 203, 91, 11, 222, 229, 247, 255, 199,
+ 247, 169, 11, 244, 176, 247, 255, 92, 232, 147, 254, 119, 92, 232, 147,
+ 226, 159, 71, 247, 250, 2, 250, 174, 247, 121, 22, 2, 247, 121, 245, 171,
+ 64, 226, 171, 214, 152, 232, 109, 44, 249, 162, 2, 247, 121, 214, 160,
+ 43, 249, 162, 2, 247, 121, 43, 226, 129, 235, 67, 44, 226, 129, 235, 67,
+ 243, 230, 226, 129, 235, 67, 233, 86, 120, 217, 88, 233, 86, 124, 217,
+ 88, 43, 22, 44, 52, 215, 93, 43, 22, 44, 217, 88, 43, 230, 88, 199, 44,
+ 217, 88, 199, 43, 217, 88, 120, 217, 89, 2, 250, 37, 48, 232, 106, 247,
+ 174, 251, 79, 203, 222, 134, 71, 249, 206, 247, 249, 71, 249, 206, 247,
+ 250, 2, 140, 216, 115, 71, 249, 206, 247, 250, 2, 97, 216, 115, 71, 42,
+ 2, 140, 216, 115, 71, 42, 2, 97, 216, 115, 11, 43, 71, 42, 127, 11, 44,
+ 71, 42, 127, 11, 43, 254, 111, 127, 11, 44, 254, 111, 127, 11, 43, 52,
+ 254, 111, 127, 11, 44, 52, 254, 111, 127, 11, 43, 71, 216, 7, 220, 54,
+ 127, 11, 44, 71, 216, 7, 220, 54, 127, 11, 43, 244, 64, 226, 4, 11, 44,
+ 244, 64, 226, 4, 214, 153, 224, 25, 74, 246, 105, 224, 25, 74, 254, 89,
+ 243, 99, 250, 37, 74, 250, 3, 243, 99, 250, 37, 74, 44, 80, 2, 37, 225,
+ 23, 199, 140, 74, 199, 97, 74, 199, 43, 44, 74, 199, 140, 52, 74, 199,
+ 97, 52, 74, 199, 43, 44, 52, 74, 199, 140, 80, 243, 244, 130, 199, 97,
+ 80, 243, 244, 130, 199, 140, 52, 80, 243, 244, 130, 199, 97, 52, 80, 243,
+ 244, 130, 199, 97, 218, 231, 74, 46, 47, 251, 216, 46, 47, 247, 118, 46,
+ 47, 246, 246, 46, 47, 247, 117, 46, 47, 246, 182, 46, 47, 247, 53, 46,
+ 47, 246, 245, 46, 47, 247, 116, 46, 47, 246, 150, 46, 47, 247, 21, 46,
+ 47, 246, 213, 46, 47, 247, 84, 46, 47, 246, 181, 46, 47, 247, 52, 46, 47,
+ 246, 244, 46, 47, 247, 115, 46, 47, 246, 134, 46, 47, 247, 5, 46, 47,
+ 246, 197, 46, 47, 247, 68, 46, 47, 246, 165, 46, 47, 247, 36, 46, 47,
+ 246, 228, 46, 47, 247, 99, 46, 47, 246, 149, 46, 47, 247, 20, 46, 47,
+ 246, 212, 46, 47, 247, 83, 46, 47, 246, 180, 46, 47, 247, 51, 46, 47,
+ 246, 243, 46, 47, 247, 114, 46, 47, 246, 126, 46, 47, 246, 253, 46, 47,
+ 246, 189, 46, 47, 247, 60, 46, 47, 246, 157, 46, 47, 247, 28, 46, 47,
+ 246, 220, 46, 47, 247, 91, 46, 47, 246, 141, 46, 47, 247, 12, 46, 47,
+ 246, 204, 46, 47, 247, 75, 46, 47, 246, 172, 46, 47, 247, 43, 46, 47,
+ 246, 235, 46, 47, 247, 106, 46, 47, 246, 133, 46, 47, 247, 4, 46, 47,
+ 246, 196, 46, 47, 247, 67, 46, 47, 246, 164, 46, 47, 247, 35, 46, 47,
+ 246, 227, 46, 47, 247, 98, 46, 47, 246, 148, 46, 47, 247, 19, 46, 47,
+ 246, 211, 46, 47, 247, 82, 46, 47, 246, 179, 46, 47, 247, 50, 46, 47,
+ 246, 242, 46, 47, 247, 113, 46, 47, 246, 122, 46, 47, 246, 249, 46, 47,
+ 246, 185, 46, 47, 247, 56, 46, 47, 246, 153, 46, 47, 247, 24, 46, 47,
+ 246, 216, 46, 47, 247, 87, 46, 47, 246, 137, 46, 47, 247, 8, 46, 47, 246,
+ 200, 46, 47, 247, 71, 46, 47, 246, 168, 46, 47, 247, 39, 46, 47, 246,
+ 231, 46, 47, 247, 102, 46, 47, 246, 129, 46, 47, 247, 0, 46, 47, 246,
+ 192, 46, 47, 247, 63, 46, 47, 246, 160, 46, 47, 247, 31, 46, 47, 246,
+ 223, 46, 47, 247, 94, 46, 47, 246, 144, 46, 47, 247, 15, 46, 47, 246,
+ 207, 46, 47, 247, 78, 46, 47, 246, 175, 46, 47, 247, 46, 46, 47, 246,
+ 238, 46, 47, 247, 109, 46, 47, 246, 125, 46, 47, 246, 252, 46, 47, 246,
+ 188, 46, 47, 247, 59, 46, 47, 246, 156, 46, 47, 247, 27, 46, 47, 246,
+ 219, 46, 47, 247, 90, 46, 47, 246, 140, 46, 47, 247, 11, 46, 47, 246,
+ 203, 46, 47, 247, 74, 46, 47, 246, 171, 46, 47, 247, 42, 46, 47, 246,
+ 234, 46, 47, 247, 105, 46, 47, 246, 132, 46, 47, 247, 3, 46, 47, 246,
+ 195, 46, 47, 247, 66, 46, 47, 246, 163, 46, 47, 247, 34, 46, 47, 246,
+ 226, 46, 47, 247, 97, 46, 47, 246, 147, 46, 47, 247, 18, 46, 47, 246,
+ 210, 46, 47, 247, 81, 46, 47, 246, 178, 46, 47, 247, 49, 46, 47, 246,
+ 241, 46, 47, 247, 112, 46, 47, 246, 120, 46, 47, 246, 247, 46, 47, 246,
+ 183, 46, 47, 247, 54, 46, 47, 246, 151, 46, 47, 247, 22, 46, 47, 246,
+ 214, 46, 47, 247, 85, 46, 47, 246, 135, 46, 47, 247, 6, 46, 47, 246, 198,
+ 46, 47, 247, 69, 46, 47, 246, 166, 46, 47, 247, 37, 46, 47, 246, 229, 46,
+ 47, 247, 100, 46, 47, 246, 127, 46, 47, 246, 254, 46, 47, 246, 190, 46,
+ 47, 247, 61, 46, 47, 246, 158, 46, 47, 247, 29, 46, 47, 246, 221, 46, 47,
+ 247, 92, 46, 47, 246, 142, 46, 47, 247, 13, 46, 47, 246, 205, 46, 47,
+ 247, 76, 46, 47, 246, 173, 46, 47, 247, 44, 46, 47, 246, 236, 46, 47,
+ 247, 107, 46, 47, 246, 123, 46, 47, 246, 250, 46, 47, 246, 186, 46, 47,
+ 247, 57, 46, 47, 246, 154, 46, 47, 247, 25, 46, 47, 246, 217, 46, 47,
+ 247, 88, 46, 47, 246, 138, 46, 47, 247, 9, 46, 47, 246, 201, 46, 47, 247,
+ 72, 46, 47, 246, 169, 46, 47, 247, 40, 46, 47, 246, 232, 46, 47, 247,
+ 103, 46, 47, 246, 130, 46, 47, 247, 1, 46, 47, 246, 193, 46, 47, 247, 64,
+ 46, 47, 246, 161, 46, 47, 247, 32, 46, 47, 246, 224, 46, 47, 247, 95, 46,
+ 47, 246, 145, 46, 47, 247, 16, 46, 47, 246, 208, 46, 47, 247, 79, 46, 47,
+ 246, 176, 46, 47, 247, 47, 46, 47, 246, 239, 46, 47, 247, 110, 46, 47,
+ 246, 121, 46, 47, 246, 248, 46, 47, 246, 184, 46, 47, 247, 55, 46, 47,
+ 246, 152, 46, 47, 247, 23, 46, 47, 246, 215, 46, 47, 247, 86, 46, 47,
+ 246, 136, 46, 47, 247, 7, 46, 47, 246, 199, 46, 47, 247, 70, 46, 47, 246,
+ 167, 46, 47, 247, 38, 46, 47, 246, 230, 46, 47, 247, 101, 46, 47, 246,
+ 128, 46, 47, 246, 255, 46, 47, 246, 191, 46, 47, 247, 62, 46, 47, 246,
+ 159, 46, 47, 247, 30, 46, 47, 246, 222, 46, 47, 247, 93, 46, 47, 246,
+ 143, 46, 47, 247, 14, 46, 47, 246, 206, 46, 47, 247, 77, 46, 47, 246,
+ 174, 46, 47, 247, 45, 46, 47, 246, 237, 46, 47, 247, 108, 46, 47, 246,
+ 124, 46, 47, 246, 251, 46, 47, 246, 187, 46, 47, 247, 58, 46, 47, 246,
+ 155, 46, 47, 247, 26, 46, 47, 246, 218, 46, 47, 247, 89, 46, 47, 246,
+ 139, 46, 47, 247, 10, 46, 47, 246, 202, 46, 47, 247, 73, 46, 47, 246,
+ 170, 46, 47, 247, 41, 46, 47, 246, 233, 46, 47, 247, 104, 46, 47, 246,
+ 131, 46, 47, 247, 2, 46, 47, 246, 194, 46, 47, 247, 65, 46, 47, 246, 162,
+ 46, 47, 247, 33, 46, 47, 246, 225, 46, 47, 247, 96, 46, 47, 246, 146, 46,
+ 47, 247, 17, 46, 47, 246, 209, 46, 47, 247, 80, 46, 47, 246, 177, 46, 47,
+ 247, 48, 46, 47, 246, 240, 46, 47, 247, 111, 97, 215, 58, 80, 2, 67, 91,
97, 215, 58, 80, 2, 52, 67, 91, 140, 52, 80, 2, 67, 91, 97, 52, 80, 2,
- 67, 91, 43, 44, 52, 80, 2, 67, 91, 97, 215, 58, 80, 243, 243, 130, 140,
- 52, 80, 243, 243, 130, 97, 52, 80, 243, 243, 130, 246, 104, 80, 2, 203,
- 91, 214, 153, 80, 2, 203, 91, 214, 153, 215, 211, 74, 246, 104, 215, 211,
- 74, 140, 52, 248, 157, 74, 97, 52, 248, 157, 74, 140, 215, 211, 248, 157,
- 74, 97, 215, 211, 248, 157, 74, 97, 215, 58, 215, 211, 248, 157, 74, 97,
- 80, 2, 246, 118, 218, 139, 214, 153, 80, 216, 42, 130, 246, 104, 80, 216,
- 42, 130, 97, 80, 2, 217, 78, 2, 67, 91, 97, 80, 2, 217, 78, 2, 52, 67,
- 91, 97, 215, 58, 80, 2, 217, 77, 97, 215, 58, 80, 2, 217, 78, 2, 67, 91,
- 97, 215, 58, 80, 2, 217, 78, 2, 52, 67, 91, 140, 253, 251, 97, 253, 251,
- 140, 52, 253, 251, 97, 52, 253, 251, 140, 80, 216, 42, 85, 247, 248, 97,
- 80, 216, 42, 85, 247, 248, 140, 80, 243, 243, 252, 141, 216, 42, 85, 247,
- 248, 97, 80, 243, 243, 252, 141, 216, 42, 85, 247, 248, 228, 56, 212, 9,
- 22, 219, 28, 245, 220, 74, 228, 56, 245, 220, 22, 219, 28, 212, 9, 74,
- 228, 56, 212, 9, 80, 2, 103, 228, 56, 245, 220, 80, 2, 103, 219, 28, 245,
- 220, 80, 2, 103, 219, 28, 212, 9, 80, 2, 103, 228, 56, 212, 9, 80, 22,
- 228, 56, 245, 220, 74, 228, 56, 245, 220, 80, 22, 219, 28, 245, 220, 74,
- 219, 28, 245, 220, 80, 22, 219, 28, 212, 9, 74, 219, 28, 212, 9, 80, 22,
- 228, 56, 212, 9, 74, 222, 228, 247, 255, 249, 125, 244, 175, 247, 254,
- 244, 175, 247, 255, 249, 125, 222, 228, 247, 254, 219, 28, 245, 220, 80,
- 249, 125, 228, 56, 245, 220, 74, 228, 56, 245, 220, 80, 249, 125, 219,
- 28, 245, 220, 74, 244, 175, 247, 255, 249, 125, 228, 56, 245, 220, 74,
- 222, 228, 247, 255, 249, 125, 219, 28, 245, 220, 74, 228, 56, 245, 220,
- 80, 249, 125, 228, 56, 212, 9, 74, 228, 56, 212, 9, 80, 249, 125, 228,
- 56, 245, 220, 74, 212, 36, 80, 225, 7, 247, 195, 222, 251, 80, 225, 7,
- 97, 216, 188, 249, 90, 214, 152, 80, 225, 7, 97, 216, 188, 249, 90, 246,
- 103, 80, 225, 7, 246, 104, 216, 188, 249, 90, 233, 37, 80, 225, 7, 246,
- 104, 216, 188, 249, 90, 222, 241, 222, 244, 254, 26, 250, 2, 74, 233, 40,
- 254, 26, 254, 88, 74, 216, 14, 254, 26, 254, 88, 74, 251, 175, 254, 26,
- 254, 88, 74, 216, 14, 254, 26, 250, 2, 80, 2, 230, 181, 216, 14, 254, 26,
- 254, 88, 80, 2, 225, 22, 232, 108, 44, 220, 152, 250, 2, 74, 232, 108,
- 43, 220, 152, 254, 88, 74, 254, 88, 250, 0, 250, 36, 74, 250, 2, 250, 0,
- 250, 36, 74, 97, 80, 77, 219, 251, 140, 74, 140, 80, 77, 219, 251, 97,
- 74, 219, 251, 97, 80, 77, 140, 74, 97, 80, 2, 96, 51, 140, 80, 2, 96, 51,
- 97, 80, 216, 139, 211, 178, 43, 44, 80, 216, 139, 4, 250, 35, 214, 153,
- 215, 58, 80, 243, 243, 4, 250, 35, 43, 252, 139, 120, 44, 252, 139, 124,
- 241, 254, 43, 252, 139, 124, 44, 252, 139, 120, 241, 254, 120, 252, 139,
- 44, 124, 252, 139, 43, 241, 254, 120, 252, 139, 43, 124, 252, 139, 44,
- 241, 254, 43, 252, 139, 120, 44, 252, 139, 120, 241, 254, 120, 252, 139,
- 44, 124, 252, 139, 44, 241, 254, 43, 252, 139, 124, 44, 252, 139, 124,
- 241, 254, 120, 252, 139, 43, 124, 252, 139, 43, 241, 254, 140, 241, 255,
- 2, 252, 139, 120, 216, 42, 130, 97, 241, 255, 2, 252, 139, 120, 216, 42,
- 130, 214, 153, 241, 255, 2, 252, 139, 44, 216, 42, 130, 246, 104, 241,
- 255, 2, 252, 139, 44, 216, 42, 130, 140, 241, 255, 2, 252, 139, 124, 216,
- 42, 130, 97, 241, 255, 2, 252, 139, 124, 216, 42, 130, 214, 153, 241,
- 255, 2, 252, 139, 43, 216, 42, 130, 246, 104, 241, 255, 2, 252, 139, 43,
- 216, 42, 130, 140, 241, 255, 2, 252, 139, 120, 243, 243, 130, 97, 241,
- 255, 2, 252, 139, 120, 243, 243, 130, 214, 153, 241, 255, 2, 252, 139,
- 44, 243, 243, 130, 246, 104, 241, 255, 2, 252, 139, 44, 243, 243, 130,
- 140, 241, 255, 2, 252, 139, 124, 243, 243, 130, 97, 241, 255, 2, 252,
- 139, 124, 243, 243, 130, 214, 153, 241, 255, 2, 252, 139, 43, 243, 243,
- 130, 246, 104, 241, 255, 2, 252, 139, 43, 243, 243, 130, 140, 241, 255,
- 2, 252, 139, 120, 77, 140, 241, 255, 2, 252, 139, 246, 106, 214, 153,
- 241, 255, 2, 252, 139, 43, 252, 30, 214, 153, 241, 255, 2, 252, 139, 222,
- 251, 97, 241, 255, 2, 252, 139, 120, 77, 97, 241, 255, 2, 252, 139, 246,
- 106, 246, 104, 241, 255, 2, 252, 139, 43, 252, 30, 246, 104, 241, 255, 2,
- 252, 139, 222, 251, 140, 241, 255, 2, 252, 139, 120, 77, 97, 241, 255, 2,
- 252, 139, 214, 163, 140, 241, 255, 2, 252, 139, 124, 77, 97, 241, 255, 2,
- 252, 139, 246, 106, 97, 241, 255, 2, 252, 139, 120, 77, 140, 241, 255, 2,
- 252, 139, 214, 163, 97, 241, 255, 2, 252, 139, 124, 77, 140, 241, 255, 2,
- 252, 139, 246, 106, 140, 241, 255, 2, 252, 139, 120, 77, 199, 248, 156,
- 140, 241, 255, 2, 252, 139, 124, 252, 43, 199, 248, 156, 97, 241, 255, 2,
- 252, 139, 120, 77, 199, 248, 156, 97, 241, 255, 2, 252, 139, 124, 252,
- 43, 199, 248, 156, 214, 153, 241, 255, 2, 252, 139, 43, 252, 30, 246,
- 104, 241, 255, 2, 252, 139, 222, 251, 246, 104, 241, 255, 2, 252, 139,
- 43, 252, 30, 214, 153, 241, 255, 2, 252, 139, 222, 251, 44, 52, 80, 2,
- 222, 183, 241, 235, 245, 98, 5, 77, 97, 74, 216, 89, 226, 168, 77, 97,
- 74, 140, 80, 77, 216, 89, 226, 167, 97, 80, 77, 216, 89, 226, 167, 97,
- 80, 77, 254, 148, 128, 111, 233, 15, 77, 140, 74, 140, 80, 216, 139, 233,
- 14, 242, 130, 77, 97, 74, 218, 64, 77, 97, 74, 140, 80, 216, 139, 218,
- 63, 218, 22, 77, 140, 74, 43, 244, 91, 217, 77, 44, 244, 91, 217, 77,
- 120, 244, 91, 217, 77, 124, 244, 91, 217, 77, 215, 211, 67, 252, 141,
- 248, 60, 210, 160, 187, 218, 242, 210, 160, 187, 215, 49, 249, 226, 43,
- 71, 249, 99, 127, 44, 71, 249, 99, 127, 43, 71, 226, 3, 44, 71, 226, 3,
- 210, 160, 187, 43, 236, 15, 127, 210, 160, 187, 44, 236, 15, 127, 210,
- 160, 187, 43, 251, 242, 127, 210, 160, 187, 44, 251, 242, 127, 43, 42,
- 251, 158, 2, 214, 183, 44, 42, 251, 158, 2, 214, 183, 43, 42, 251, 158,
- 2, 216, 115, 236, 0, 216, 14, 249, 160, 44, 42, 251, 158, 2, 216, 115,
- 236, 0, 251, 175, 249, 160, 43, 42, 251, 158, 2, 216, 115, 236, 0, 251,
- 175, 249, 160, 44, 42, 251, 158, 2, 216, 115, 236, 0, 216, 14, 249, 160,
- 43, 254, 110, 251, 158, 2, 247, 120, 44, 254, 110, 251, 158, 2, 247, 120,
- 43, 254, 26, 233, 15, 127, 44, 254, 26, 242, 130, 127, 52, 43, 254, 26,
- 242, 130, 127, 52, 44, 254, 26, 233, 15, 127, 43, 85, 216, 6, 220, 53,
- 127, 44, 85, 216, 6, 220, 53, 127, 246, 118, 244, 135, 67, 210, 35, 232,
- 213, 231, 88, 254, 110, 226, 170, 233, 46, 44, 254, 110, 214, 12, 2, 218,
- 234, 231, 88, 44, 254, 110, 2, 247, 120, 254, 110, 2, 222, 92, 235, 215,
- 255, 3, 254, 109, 218, 255, 254, 110, 226, 170, 233, 46, 218, 255, 254,
- 110, 226, 170, 214, 163, 215, 94, 254, 109, 223, 49, 254, 109, 254, 110,
- 2, 214, 183, 223, 49, 254, 110, 2, 214, 183, 226, 248, 254, 110, 226,
- 170, 214, 163, 226, 248, 254, 110, 226, 170, 246, 106, 231, 88, 254, 110,
- 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 120, 22, 222, 251, 231, 88,
- 254, 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 120, 22, 233, 46,
- 231, 88, 254, 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 124, 22,
- 222, 251, 231, 88, 254, 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225,
- 7, 124, 22, 233, 46, 231, 88, 254, 110, 2, 204, 254, 5, 245, 140, 236, 0,
- 80, 225, 7, 44, 22, 214, 163, 231, 88, 254, 110, 2, 204, 254, 5, 245,
- 140, 236, 0, 80, 225, 7, 43, 22, 214, 163, 231, 88, 254, 110, 2, 204,
- 254, 5, 245, 140, 236, 0, 80, 225, 7, 44, 22, 246, 106, 231, 88, 254,
- 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 43, 22, 246, 106, 223,
- 49, 245, 152, 220, 127, 245, 152, 220, 128, 2, 226, 123, 245, 152, 220,
- 128, 2, 4, 250, 36, 48, 245, 152, 220, 128, 2, 44, 80, 48, 245, 152, 220,
- 128, 2, 43, 80, 48, 250, 36, 2, 203, 130, 37, 67, 130, 37, 226, 7, 37,
- 223, 50, 219, 46, 37, 225, 171, 250, 36, 247, 173, 251, 78, 203, 252,
- 141, 22, 216, 14, 163, 247, 173, 251, 78, 67, 130, 250, 36, 2, 218, 24,
- 211, 178, 37, 254, 87, 247, 169, 50, 120, 80, 216, 139, 250, 35, 37, 71,
- 251, 113, 37, 251, 113, 37, 233, 14, 37, 242, 129, 250, 36, 2, 4, 250,
- 36, 216, 42, 216, 196, 222, 251, 250, 36, 2, 113, 203, 218, 91, 216, 42,
- 216, 196, 222, 251, 92, 222, 228, 247, 255, 219, 95, 92, 244, 175, 247,
- 255, 219, 95, 92, 253, 216, 92, 4, 250, 35, 92, 218, 234, 113, 235, 65,
- 218, 232, 215, 226, 2, 59, 48, 215, 226, 2, 214, 183, 222, 92, 236, 0,
- 215, 225, 215, 226, 2, 220, 134, 253, 207, 251, 174, 44, 215, 226, 77,
- 43, 215, 225, 43, 215, 226, 252, 30, 67, 130, 67, 252, 141, 252, 30, 44,
- 215, 225, 251, 165, 2, 43, 163, 251, 221, 251, 165, 2, 44, 163, 251, 221,
- 85, 251, 164, 30, 2, 43, 163, 251, 221, 30, 2, 44, 163, 251, 221, 71,
- 240, 236, 85, 240, 236, 43, 211, 244, 244, 135, 44, 211, 244, 244, 135,
- 43, 52, 211, 244, 244, 135, 44, 52, 211, 244, 244, 135, 235, 248, 235,
- 234, 216, 112, 117, 235, 234, 235, 235, 229, 102, 2, 67, 130, 246, 112,
- 230, 87, 42, 2, 249, 181, 226, 127, 235, 246, 253, 237, 219, 219, 224,
- 180, 245, 98, 5, 22, 219, 97, 226, 7, 245, 98, 5, 22, 219, 97, 226, 8, 2,
- 216, 89, 48, 240, 104, 216, 42, 22, 219, 97, 226, 7, 242, 183, 218, 155,
- 216, 185, 246, 105, 215, 226, 2, 43, 163, 251, 221, 246, 105, 215, 226,
- 2, 44, 163, 251, 221, 85, 247, 249, 2, 124, 74, 85, 232, 104, 71, 250,
- 36, 2, 124, 74, 85, 250, 36, 2, 124, 74, 245, 85, 71, 218, 234, 245, 85,
- 85, 218, 234, 245, 85, 71, 247, 248, 245, 85, 85, 247, 248, 245, 85, 71,
- 250, 35, 245, 85, 85, 250, 35, 222, 132, 223, 50, 219, 47, 226, 167, 219,
- 47, 2, 226, 123, 223, 50, 219, 47, 2, 203, 91, 251, 249, 219, 46, 251,
- 249, 223, 50, 219, 46, 52, 225, 22, 215, 211, 225, 22, 233, 42, 249, 91,
- 254, 110, 127, 222, 247, 249, 91, 254, 110, 127, 216, 78, 230, 179, 230,
- 24, 37, 59, 226, 167, 230, 24, 37, 96, 226, 167, 230, 24, 37, 30, 226,
- 167, 230, 24, 214, 176, 226, 168, 2, 247, 120, 230, 24, 214, 176, 226,
- 168, 2, 225, 22, 230, 24, 42, 235, 199, 226, 167, 230, 24, 42, 214, 176,
- 226, 167, 113, 232, 146, 22, 226, 167, 113, 232, 146, 177, 226, 167, 230,
- 24, 30, 226, 167, 230, 154, 113, 218, 43, 218, 41, 2, 235, 211, 224, 24,
- 235, 212, 226, 167, 244, 99, 225, 255, 235, 211, 235, 212, 2, 52, 91,
- 235, 212, 253, 173, 2, 219, 95, 250, 32, 243, 226, 254, 88, 235, 209,
- 232, 214, 235, 210, 2, 223, 115, 225, 237, 254, 2, 225, 1, 232, 214, 235,
- 210, 2, 220, 152, 225, 237, 254, 2, 225, 1, 232, 214, 235, 210, 228, 52,
- 235, 250, 216, 196, 225, 1, 235, 212, 254, 2, 115, 225, 11, 226, 167,
- 224, 18, 235, 212, 226, 167, 235, 212, 2, 140, 80, 2, 103, 235, 212, 2,
- 30, 50, 235, 212, 2, 235, 198, 235, 212, 2, 214, 175, 235, 212, 2, 226,
- 123, 235, 212, 2, 214, 183, 235, 66, 233, 85, 43, 215, 226, 226, 167,
- 210, 160, 187, 221, 201, 249, 209, 210, 160, 187, 221, 201, 225, 56, 210,
- 160, 187, 221, 201, 224, 176, 96, 5, 2, 4, 250, 36, 48, 96, 5, 2, 250,
- 31, 255, 15, 48, 96, 5, 2, 216, 89, 48, 96, 5, 2, 59, 51, 96, 5, 2, 216,
- 89, 51, 96, 5, 2, 218, 65, 105, 96, 5, 2, 85, 215, 225, 230, 182, 5, 2,
- 249, 220, 48, 230, 182, 5, 2, 59, 51, 230, 182, 5, 2, 244, 175, 247, 118,
- 230, 182, 5, 2, 222, 228, 247, 118, 96, 5, 236, 0, 43, 163, 250, 35, 96,
- 5, 236, 0, 44, 163, 250, 35, 213, 254, 177, 249, 131, 224, 180, 230, 84,
- 5, 2, 59, 48, 230, 84, 5, 2, 214, 183, 220, 149, 224, 181, 2, 251, 175,
- 249, 255, 219, 77, 224, 180, 230, 84, 5, 236, 0, 43, 163, 250, 35, 230,
- 84, 5, 236, 0, 44, 163, 250, 35, 37, 230, 84, 5, 2, 250, 31, 255, 14,
- 230, 84, 5, 236, 0, 52, 250, 35, 37, 247, 169, 50, 96, 5, 236, 0, 215,
- 225, 230, 182, 5, 236, 0, 215, 225, 230, 84, 5, 236, 0, 215, 225, 235,
- 206, 224, 180, 222, 242, 235, 206, 224, 180, 210, 160, 187, 223, 90, 249,
- 209, 254, 134, 177, 249, 165, 235, 199, 2, 247, 120, 214, 176, 2, 230,
- 182, 50, 214, 176, 2, 226, 123, 235, 199, 2, 226, 123, 235, 199, 2, 232,
- 146, 254, 118, 214, 176, 2, 232, 146, 226, 158, 214, 176, 77, 235, 198,
- 235, 199, 77, 214, 175, 214, 176, 77, 252, 141, 77, 235, 198, 235, 199,
- 77, 252, 141, 77, 214, 175, 214, 176, 252, 30, 22, 235, 65, 2, 214, 175,
- 235, 199, 252, 30, 22, 235, 65, 2, 235, 198, 250, 0, 214, 176, 2, 220,
- 133, 250, 0, 235, 199, 2, 220, 133, 52, 42, 235, 198, 52, 42, 214, 175,
- 250, 0, 214, 176, 2, 220, 134, 22, 219, 77, 224, 180, 232, 146, 22, 2,
- 59, 48, 232, 146, 177, 2, 59, 48, 52, 232, 146, 254, 118, 52, 232, 146,
- 226, 158, 113, 235, 200, 232, 146, 254, 118, 113, 235, 200, 232, 146,
- 226, 158, 219, 85, 233, 85, 226, 158, 219, 85, 233, 85, 254, 118, 232,
- 146, 177, 226, 121, 232, 146, 254, 118, 232, 146, 22, 2, 230, 224, 218,
- 139, 232, 146, 177, 2, 230, 224, 218, 139, 232, 146, 22, 2, 203, 248,
- 156, 232, 146, 177, 2, 203, 248, 156, 232, 146, 22, 2, 52, 226, 123, 232,
- 146, 22, 2, 214, 183, 232, 146, 22, 2, 52, 214, 183, 4, 213, 251, 2, 214,
- 183, 232, 146, 177, 2, 52, 226, 123, 232, 146, 177, 2, 52, 214, 183, 210,
- 160, 187, 247, 129, 254, 79, 210, 160, 187, 223, 148, 254, 79, 245, 98,
- 5, 2, 59, 51, 240, 104, 2, 59, 48, 215, 211, 203, 252, 141, 2, 52, 67,
- 91, 215, 211, 203, 252, 141, 2, 215, 211, 67, 91, 216, 89, 226, 168, 2,
- 59, 48, 216, 89, 226, 168, 2, 222, 228, 247, 118, 219, 162, 230, 182,
- 219, 161, 249, 199, 2, 59, 48, 245, 98, 2, 253, 216, 254, 148, 128, 216,
- 42, 2, 250, 31, 255, 14, 254, 48, 128, 177, 128, 111, 245, 98, 5, 77, 96,
- 50, 96, 5, 77, 245, 98, 50, 245, 98, 5, 77, 216, 89, 226, 167, 52, 249,
- 227, 245, 99, 113, 249, 194, 245, 98, 219, 176, 134, 249, 194, 245, 98,
- 219, 176, 245, 98, 5, 2, 113, 170, 77, 22, 113, 170, 51, 245, 94, 2, 244,
- 11, 170, 48, 233, 15, 2, 250, 36, 235, 215, 242, 130, 2, 250, 36, 235,
- 215, 233, 15, 2, 224, 13, 164, 48, 242, 130, 2, 224, 13, 164, 48, 233,
- 15, 177, 219, 97, 128, 111, 242, 130, 177, 219, 97, 128, 111, 233, 15,
- 177, 219, 97, 128, 216, 42, 2, 59, 235, 215, 242, 130, 177, 219, 97, 128,
- 216, 42, 2, 59, 235, 215, 233, 15, 177, 219, 97, 128, 216, 42, 2, 59, 48,
- 242, 130, 177, 219, 97, 128, 216, 42, 2, 59, 48, 233, 15, 177, 219, 97,
- 128, 216, 42, 2, 59, 77, 222, 251, 242, 130, 177, 219, 97, 128, 216, 42,
- 2, 59, 77, 233, 46, 233, 15, 177, 254, 49, 242, 130, 177, 254, 49, 233,
- 15, 22, 219, 153, 228, 52, 128, 111, 242, 130, 22, 219, 153, 228, 52,
- 128, 111, 233, 15, 22, 228, 52, 254, 49, 242, 130, 22, 228, 52, 254, 49,
- 233, 15, 77, 246, 111, 128, 77, 242, 129, 242, 130, 77, 246, 111, 128,
- 77, 233, 14, 233, 15, 77, 219, 162, 177, 245, 99, 242, 130, 77, 219, 162,
- 177, 245, 99, 233, 15, 77, 219, 162, 77, 242, 129, 242, 130, 77, 219,
- 162, 77, 233, 14, 233, 15, 77, 242, 130, 77, 246, 111, 245, 99, 242, 130,
- 77, 233, 15, 77, 246, 111, 245, 99, 233, 15, 77, 219, 97, 128, 77, 242,
- 130, 77, 219, 97, 245, 99, 242, 130, 77, 219, 97, 128, 77, 233, 15, 77,
- 219, 97, 245, 99, 219, 97, 128, 216, 42, 177, 233, 14, 219, 97, 128, 216,
- 42, 177, 242, 129, 219, 97, 128, 216, 42, 177, 233, 15, 2, 59, 235, 215,
- 219, 97, 128, 216, 42, 177, 242, 130, 2, 59, 235, 215, 246, 111, 128,
- 216, 42, 177, 233, 14, 246, 111, 128, 216, 42, 177, 242, 129, 246, 111,
- 219, 97, 128, 216, 42, 177, 233, 14, 246, 111, 219, 97, 128, 216, 42,
- 177, 242, 129, 219, 162, 177, 233, 14, 219, 162, 177, 242, 129, 219, 162,
- 77, 233, 15, 77, 245, 98, 50, 219, 162, 77, 242, 130, 77, 245, 98, 50,
- 52, 229, 91, 233, 14, 52, 229, 91, 242, 129, 52, 229, 91, 233, 15, 2,
- 214, 183, 242, 130, 226, 121, 233, 14, 242, 130, 252, 30, 233, 14, 233,
- 15, 250, 0, 251, 78, 249, 92, 242, 130, 250, 0, 251, 78, 249, 92, 233,
- 15, 250, 0, 251, 78, 249, 93, 77, 219, 97, 245, 99, 242, 130, 250, 0,
- 251, 78, 249, 93, 77, 219, 97, 245, 99, 219, 78, 216, 200, 233, 83, 216,
- 200, 219, 78, 216, 201, 177, 128, 111, 233, 83, 216, 201, 177, 128, 111,
- 245, 98, 5, 2, 251, 108, 48, 224, 203, 77, 219, 153, 245, 98, 50, 218,
- 56, 77, 219, 153, 245, 98, 50, 224, 203, 77, 219, 153, 228, 52, 128, 111,
- 218, 56, 77, 219, 153, 228, 52, 128, 111, 224, 203, 77, 245, 98, 50, 218,
- 56, 77, 245, 98, 50, 224, 203, 77, 228, 52, 128, 111, 218, 56, 77, 228,
- 52, 128, 111, 224, 203, 77, 254, 148, 128, 111, 218, 56, 77, 254, 148,
- 128, 111, 224, 203, 77, 228, 52, 254, 148, 128, 111, 218, 56, 77, 228,
- 52, 254, 148, 128, 111, 52, 224, 202, 52, 218, 55, 218, 64, 2, 247, 120,
- 218, 22, 2, 247, 120, 218, 64, 2, 96, 5, 51, 218, 22, 2, 96, 5, 51, 218,
- 64, 2, 230, 84, 5, 51, 218, 22, 2, 230, 84, 5, 51, 218, 64, 64, 177, 128,
- 216, 42, 2, 59, 48, 218, 22, 64, 177, 128, 216, 42, 2, 59, 48, 218, 64,
- 64, 77, 245, 98, 50, 218, 22, 64, 77, 245, 98, 50, 218, 64, 64, 77, 216,
- 89, 226, 167, 218, 22, 64, 77, 216, 89, 226, 167, 218, 64, 64, 77, 254,
- 148, 128, 111, 218, 22, 64, 77, 254, 148, 128, 111, 218, 64, 64, 77, 228,
- 52, 128, 111, 218, 22, 64, 77, 228, 52, 128, 111, 42, 43, 204, 93, 226,
- 167, 42, 44, 204, 93, 226, 167, 250, 0, 218, 63, 250, 0, 218, 21, 250, 0,
- 218, 64, 177, 128, 111, 250, 0, 218, 22, 177, 128, 111, 218, 64, 77, 218,
- 21, 218, 22, 77, 218, 63, 218, 64, 77, 218, 63, 218, 22, 77, 218, 21,
- 218, 22, 252, 30, 218, 63, 218, 22, 252, 30, 22, 235, 65, 251, 78, 248,
- 157, 2, 218, 63, 245, 170, 64, 226, 170, 246, 103, 225, 48, 2, 217, 12,
- 216, 13, 215, 240, 235, 198, 244, 21, 228, 65, 219, 251, 43, 217, 87,
- 219, 251, 124, 217, 87, 219, 251, 120, 217, 87, 225, 172, 2, 222, 91, 67,
- 252, 141, 215, 211, 44, 215, 93, 52, 67, 252, 141, 43, 215, 93, 67, 252,
- 141, 52, 43, 215, 93, 52, 67, 252, 141, 52, 43, 215, 93, 199, 248, 157,
- 243, 243, 43, 231, 63, 64, 52, 213, 239, 219, 251, 124, 217, 88, 2, 226,
- 123, 219, 251, 120, 217, 88, 2, 214, 183, 219, 251, 120, 217, 88, 77,
- 219, 251, 124, 217, 87, 52, 124, 217, 87, 52, 120, 217, 87, 52, 218, 103,
- 228, 52, 50, 223, 49, 52, 218, 103, 228, 52, 50, 247, 138, 228, 52, 247,
- 175, 2, 223, 49, 229, 101, 219, 95, 67, 232, 214, 2, 250, 36, 48, 67,
- 232, 214, 2, 250, 36, 51, 124, 217, 88, 2, 250, 36, 51, 226, 8, 2, 203,
- 91, 226, 8, 2, 216, 89, 226, 167, 215, 211, 67, 252, 141, 251, 244, 223,
- 91, 215, 211, 67, 252, 141, 2, 203, 91, 215, 211, 249, 227, 226, 167,
- 215, 211, 229, 91, 233, 14, 215, 211, 229, 91, 242, 129, 246, 111, 219,
- 97, 233, 15, 177, 128, 111, 246, 111, 219, 97, 242, 130, 177, 128, 111,
- 215, 211, 219, 47, 251, 244, 223, 91, 233, 85, 215, 211, 67, 252, 141,
- 226, 167, 52, 219, 47, 226, 167, 71, 67, 130, 230, 24, 71, 67, 130, 228,
- 56, 245, 220, 71, 74, 228, 56, 212, 9, 71, 74, 219, 28, 245, 220, 71, 74,
- 219, 28, 212, 9, 71, 74, 43, 44, 71, 74, 140, 85, 74, 214, 153, 85, 74,
- 246, 104, 85, 74, 228, 56, 245, 220, 85, 74, 228, 56, 212, 9, 85, 74,
- 219, 28, 245, 220, 85, 74, 219, 28, 212, 9, 85, 74, 43, 44, 85, 74, 120,
- 124, 85, 74, 97, 80, 2, 216, 77, 246, 103, 97, 80, 2, 216, 77, 214, 152,
- 140, 80, 2, 216, 77, 246, 103, 140, 80, 2, 216, 77, 214, 152, 42, 2, 216,
- 14, 163, 251, 221, 42, 2, 251, 175, 163, 251, 221, 42, 2, 214, 160, 44,
- 247, 255, 163, 251, 221, 42, 2, 232, 108, 43, 247, 255, 163, 251, 221,
- 247, 249, 2, 43, 163, 251, 221, 247, 249, 2, 44, 163, 251, 221, 247, 249,
- 2, 216, 14, 163, 251, 221, 247, 249, 2, 251, 175, 163, 251, 221, 246,
- 118, 218, 234, 85, 233, 85, 218, 234, 71, 233, 85, 218, 234, 85, 213,
- 187, 4, 218, 234, 71, 213, 187, 4, 218, 234, 85, 225, 190, 71, 225, 190,
- 71, 241, 193, 85, 241, 193, 203, 85, 241, 193, 85, 233, 85, 250, 35, 85,
- 231, 82, 247, 248, 71, 231, 82, 247, 248, 85, 231, 82, 232, 104, 71, 231,
- 82, 232, 104, 85, 4, 247, 248, 85, 4, 232, 104, 71, 4, 232, 104, 85, 203,
- 245, 164, 71, 203, 245, 164, 85, 67, 245, 164, 71, 67, 245, 164, 43, 80,
- 2, 4, 250, 35, 134, 140, 253, 247, 43, 80, 2, 37, 225, 22, 199, 140, 218,
- 230, 74, 140, 215, 58, 80, 2, 67, 91, 140, 215, 58, 80, 2, 52, 67, 91,
- 140, 215, 58, 80, 243, 243, 130, 140, 215, 58, 215, 211, 248, 157, 74,
- 140, 80, 2, 246, 118, 218, 139, 140, 80, 2, 217, 78, 2, 67, 91, 140, 80,
- 2, 217, 78, 2, 52, 67, 91, 140, 215, 58, 80, 2, 217, 77, 140, 215, 58,
- 80, 2, 217, 78, 2, 67, 91, 140, 215, 58, 80, 2, 217, 78, 2, 52, 67, 91,
- 140, 80, 216, 139, 211, 178, 212, 36, 80, 225, 7, 247, 195, 233, 46, 245,
- 98, 5, 77, 140, 74, 223, 50, 216, 89, 226, 168, 77, 140, 74, 140, 80, 77,
- 223, 50, 254, 148, 128, 111, 97, 80, 216, 139, 242, 129, 97, 80, 216,
- 139, 218, 21, 140, 224, 24, 74, 97, 224, 24, 74, 223, 50, 216, 89, 226,
- 168, 77, 97, 74, 97, 80, 77, 223, 50, 254, 148, 128, 111, 216, 89, 226,
- 168, 77, 140, 74, 140, 80, 77, 254, 148, 128, 111, 140, 80, 77, 223, 50,
- 216, 89, 226, 167, 97, 80, 77, 223, 50, 216, 89, 226, 167, 71, 231, 82,
- 218, 156, 85, 4, 218, 156, 71, 4, 218, 156, 85, 222, 247, 225, 190, 71,
- 222, 247, 225, 190, 114, 233, 85, 250, 35, 114, 226, 124, 2, 226, 124,
- 235, 215, 114, 250, 36, 2, 250, 36, 235, 215, 114, 250, 35, 114, 37, 221,
- 254, 145, 6, 1, 253, 159, 145, 6, 1, 251, 117, 145, 6, 1, 213, 253, 145,
- 6, 1, 242, 185, 145, 6, 1, 247, 140, 145, 6, 1, 211, 21, 145, 6, 1, 210,
- 68, 145, 6, 1, 246, 34, 145, 6, 1, 210, 91, 145, 6, 1, 235, 148, 145, 6,
- 1, 65, 235, 148, 145, 6, 1, 73, 145, 6, 1, 247, 160, 145, 6, 1, 234, 240,
- 145, 6, 1, 232, 186, 145, 6, 1, 230, 29, 145, 6, 1, 229, 191, 145, 6, 1,
- 226, 185, 145, 6, 1, 225, 4, 145, 6, 1, 222, 227, 145, 6, 1, 219, 83,
- 145, 6, 1, 215, 81, 145, 6, 1, 214, 201, 145, 6, 1, 243, 246, 145, 6, 1,
- 241, 199, 145, 6, 1, 226, 135, 145, 6, 1, 225, 221, 145, 6, 1, 219, 228,
- 145, 6, 1, 215, 167, 145, 6, 1, 250, 75, 145, 6, 1, 220, 102, 145, 6, 1,
- 211, 27, 145, 6, 1, 211, 29, 145, 6, 1, 211, 57, 145, 6, 1, 218, 253,
- 162, 145, 6, 1, 210, 212, 145, 6, 1, 4, 210, 183, 145, 6, 1, 4, 210, 184,
- 2, 217, 77, 145, 6, 1, 210, 244, 145, 6, 1, 235, 184, 4, 210, 183, 145,
- 6, 1, 251, 249, 210, 183, 145, 6, 1, 235, 184, 251, 249, 210, 183, 145,
- 6, 1, 244, 82, 145, 6, 1, 235, 146, 145, 6, 1, 219, 227, 145, 6, 1, 215,
- 202, 61, 145, 6, 1, 233, 75, 230, 29, 145, 4, 1, 253, 159, 145, 4, 1,
- 251, 117, 145, 4, 1, 213, 253, 145, 4, 1, 242, 185, 145, 4, 1, 247, 140,
- 145, 4, 1, 211, 21, 145, 4, 1, 210, 68, 145, 4, 1, 246, 34, 145, 4, 1,
- 210, 91, 145, 4, 1, 235, 148, 145, 4, 1, 65, 235, 148, 145, 4, 1, 73,
- 145, 4, 1, 247, 160, 145, 4, 1, 234, 240, 145, 4, 1, 232, 186, 145, 4, 1,
- 230, 29, 145, 4, 1, 229, 191, 145, 4, 1, 226, 185, 145, 4, 1, 225, 4,
- 145, 4, 1, 222, 227, 145, 4, 1, 219, 83, 145, 4, 1, 215, 81, 145, 4, 1,
- 214, 201, 145, 4, 1, 243, 246, 145, 4, 1, 241, 199, 145, 4, 1, 226, 135,
- 145, 4, 1, 225, 221, 145, 4, 1, 219, 228, 145, 4, 1, 215, 167, 145, 4, 1,
- 250, 75, 145, 4, 1, 220, 102, 145, 4, 1, 211, 27, 145, 4, 1, 211, 29,
- 145, 4, 1, 211, 57, 145, 4, 1, 218, 253, 162, 145, 4, 1, 210, 212, 145,
- 4, 1, 4, 210, 183, 145, 4, 1, 4, 210, 184, 2, 217, 77, 145, 4, 1, 210,
- 244, 145, 4, 1, 235, 184, 4, 210, 183, 145, 4, 1, 251, 249, 210, 183,
- 145, 4, 1, 235, 184, 251, 249, 210, 183, 145, 4, 1, 244, 82, 145, 4, 1,
- 235, 146, 145, 4, 1, 219, 227, 145, 4, 1, 215, 202, 61, 145, 4, 1, 233,
- 75, 230, 29, 7, 6, 1, 233, 149, 2, 52, 130, 7, 4, 1, 233, 149, 2, 52,
- 130, 7, 6, 1, 233, 149, 2, 230, 224, 182, 7, 6, 1, 226, 106, 2, 91, 7, 6,
- 1, 223, 224, 2, 217, 77, 7, 4, 1, 115, 2, 91, 7, 4, 1, 217, 153, 2, 247,
- 255, 91, 7, 6, 1, 242, 61, 2, 248, 39, 7, 4, 1, 242, 61, 2, 248, 39, 7,
- 6, 1, 235, 24, 2, 248, 39, 7, 4, 1, 235, 24, 2, 248, 39, 7, 6, 1, 210,
- 160, 2, 248, 39, 7, 4, 1, 210, 160, 2, 248, 39, 7, 6, 1, 254, 143, 7, 6,
- 1, 232, 50, 2, 103, 7, 6, 1, 215, 94, 61, 7, 6, 1, 215, 94, 254, 143, 7,
- 4, 1, 214, 106, 2, 44, 103, 7, 6, 1, 212, 99, 2, 103, 7, 4, 1, 212, 99,
- 2, 103, 7, 4, 1, 214, 106, 2, 249, 100, 7, 6, 1, 163, 242, 60, 7, 4, 1,
- 163, 242, 60, 7, 4, 1, 217, 75, 225, 133, 7, 4, 1, 160, 2, 228, 50, 7, 4,
- 1, 215, 94, 223, 224, 2, 217, 77, 7, 4, 1, 144, 2, 121, 222, 234, 235,
- 215, 7, 1, 4, 6, 215, 94, 75, 7, 218, 65, 4, 1, 235, 144, 58, 1, 6, 214,
- 105, 7, 6, 1, 222, 92, 2, 217, 250, 217, 77, 7, 6, 1, 210, 160, 2, 217,
- 250, 217, 77, 81, 6, 1, 254, 164, 81, 4, 1, 254, 164, 81, 6, 1, 213, 173,
- 81, 4, 1, 213, 173, 81, 6, 1, 243, 107, 81, 4, 1, 243, 107, 81, 6, 1,
- 248, 191, 81, 4, 1, 248, 191, 81, 6, 1, 245, 194, 81, 4, 1, 245, 194, 81,
- 6, 1, 219, 33, 81, 4, 1, 219, 33, 81, 6, 1, 210, 101, 81, 4, 1, 210, 101,
- 81, 6, 1, 241, 248, 81, 4, 1, 241, 248, 81, 6, 1, 216, 177, 81, 4, 1,
- 216, 177, 81, 6, 1, 240, 116, 81, 4, 1, 240, 116, 81, 6, 1, 234, 227, 81,
- 4, 1, 234, 227, 81, 6, 1, 233, 72, 81, 4, 1, 233, 72, 81, 6, 1, 230, 230,
- 81, 4, 1, 230, 230, 81, 6, 1, 228, 233, 81, 4, 1, 228, 233, 81, 6, 1,
- 233, 233, 81, 4, 1, 233, 233, 81, 6, 1, 76, 81, 4, 1, 76, 81, 6, 1, 225,
- 108, 81, 4, 1, 225, 108, 81, 6, 1, 222, 211, 81, 4, 1, 222, 211, 81, 6,
- 1, 219, 165, 81, 4, 1, 219, 165, 81, 6, 1, 217, 41, 81, 4, 1, 217, 41,
- 81, 6, 1, 214, 229, 81, 4, 1, 214, 229, 81, 6, 1, 244, 121, 81, 4, 1,
- 244, 121, 81, 6, 1, 234, 112, 81, 4, 1, 234, 112, 81, 6, 1, 224, 161, 81,
- 4, 1, 224, 161, 81, 6, 1, 226, 178, 81, 4, 1, 226, 178, 81, 6, 1, 247,
- 253, 254, 170, 81, 4, 1, 247, 253, 254, 170, 81, 6, 1, 55, 81, 254, 196,
- 81, 4, 1, 55, 81, 254, 196, 81, 6, 1, 249, 115, 245, 194, 81, 4, 1, 249,
- 115, 245, 194, 81, 6, 1, 247, 253, 234, 227, 81, 4, 1, 247, 253, 234,
- 227, 81, 6, 1, 247, 253, 228, 233, 81, 4, 1, 247, 253, 228, 233, 81, 6,
- 1, 249, 115, 228, 233, 81, 4, 1, 249, 115, 228, 233, 81, 6, 1, 55, 81,
- 226, 178, 81, 4, 1, 55, 81, 226, 178, 81, 6, 1, 221, 246, 81, 4, 1, 221,
- 246, 81, 6, 1, 249, 128, 220, 55, 81, 4, 1, 249, 128, 220, 55, 81, 6, 1,
- 55, 81, 220, 55, 81, 4, 1, 55, 81, 220, 55, 81, 6, 1, 55, 81, 245, 75,
- 81, 4, 1, 55, 81, 245, 75, 81, 6, 1, 254, 182, 234, 117, 81, 4, 1, 254,
- 182, 234, 117, 81, 6, 1, 247, 253, 241, 45, 81, 4, 1, 247, 253, 241, 45,
- 81, 6, 1, 55, 81, 241, 45, 81, 4, 1, 55, 81, 241, 45, 81, 6, 1, 55, 81,
- 162, 81, 4, 1, 55, 81, 162, 81, 6, 1, 233, 148, 162, 81, 4, 1, 233, 148,
- 162, 81, 6, 1, 55, 81, 241, 217, 81, 4, 1, 55, 81, 241, 217, 81, 6, 1,
- 55, 81, 241, 251, 81, 4, 1, 55, 81, 241, 251, 81, 6, 1, 55, 81, 243, 102,
- 81, 4, 1, 55, 81, 243, 102, 81, 6, 1, 55, 81, 247, 163, 81, 4, 1, 55, 81,
- 247, 163, 81, 6, 1, 55, 81, 220, 22, 81, 4, 1, 55, 81, 220, 22, 81, 6, 1,
- 55, 227, 208, 220, 22, 81, 4, 1, 55, 227, 208, 220, 22, 81, 6, 1, 55,
- 227, 208, 229, 27, 81, 4, 1, 55, 227, 208, 229, 27, 81, 6, 1, 55, 227,
- 208, 227, 148, 81, 4, 1, 55, 227, 208, 227, 148, 81, 6, 1, 55, 227, 208,
- 212, 37, 81, 4, 1, 55, 227, 208, 212, 37, 81, 16, 234, 246, 81, 16, 230,
- 231, 222, 211, 81, 16, 225, 109, 222, 211, 81, 16, 218, 147, 81, 16, 217,
- 42, 222, 211, 81, 16, 234, 113, 222, 211, 81, 16, 220, 23, 219, 165, 81,
- 6, 1, 249, 115, 220, 55, 81, 4, 1, 249, 115, 220, 55, 81, 6, 1, 249, 115,
- 243, 102, 81, 4, 1, 249, 115, 243, 102, 81, 38, 228, 234, 48, 81, 38,
- 218, 247, 253, 224, 81, 38, 218, 247, 233, 21, 81, 6, 1, 251, 199, 234,
- 117, 81, 4, 1, 251, 199, 234, 117, 81, 55, 227, 208, 243, 229, 218, 129,
- 81, 55, 227, 208, 247, 197, 224, 13, 78, 81, 55, 227, 208, 235, 237, 224,
- 13, 78, 81, 55, 227, 208, 213, 241, 247, 172, 81, 244, 2, 123, 242, 27,
- 81, 243, 229, 218, 129, 81, 230, 124, 247, 172, 98, 4, 1, 254, 123, 98,
- 4, 1, 252, 152, 98, 4, 1, 243, 106, 98, 4, 1, 247, 128, 98, 4, 1, 245,
- 150, 98, 4, 1, 213, 160, 98, 4, 1, 210, 89, 98, 4, 1, 217, 60, 98, 4, 1,
- 235, 255, 98, 4, 1, 234, 234, 98, 4, 1, 233, 81, 98, 4, 1, 231, 185, 98,
- 4, 1, 229, 195, 98, 4, 1, 226, 196, 98, 4, 1, 226, 17, 98, 4, 1, 210, 78,
- 98, 4, 1, 223, 171, 98, 4, 1, 221, 243, 98, 4, 1, 217, 50, 98, 4, 1, 214,
- 190, 98, 4, 1, 225, 140, 98, 4, 1, 234, 121, 98, 4, 1, 242, 241, 98, 4,
- 1, 224, 73, 98, 4, 1, 220, 20, 98, 4, 1, 250, 97, 98, 4, 1, 251, 7, 98,
- 4, 1, 235, 100, 98, 4, 1, 250, 40, 98, 4, 1, 250, 143, 98, 4, 1, 211,
- 163, 98, 4, 1, 235, 111, 98, 4, 1, 242, 43, 98, 4, 1, 241, 238, 98, 4, 1,
- 241, 175, 98, 4, 1, 212, 22, 98, 4, 1, 242, 4, 98, 4, 1, 241, 65, 98, 4,
- 1, 210, 246, 98, 4, 1, 254, 232, 216, 108, 1, 191, 216, 108, 1, 211, 99,
- 216, 108, 1, 211, 98, 216, 108, 1, 211, 88, 216, 108, 1, 211, 86, 216,
- 108, 1, 252, 32, 255, 16, 211, 81, 216, 108, 1, 211, 81, 216, 108, 1,
- 211, 96, 216, 108, 1, 211, 93, 216, 108, 1, 211, 95, 216, 108, 1, 211,
- 94, 216, 108, 1, 211, 12, 216, 108, 1, 211, 90, 216, 108, 1, 211, 79,
- 216, 108, 1, 215, 115, 211, 79, 216, 108, 1, 211, 76, 216, 108, 1, 211,
- 84, 216, 108, 1, 252, 32, 255, 16, 211, 84, 216, 108, 1, 215, 115, 211,
- 84, 216, 108, 1, 211, 83, 216, 108, 1, 211, 103, 216, 108, 1, 211, 77,
- 216, 108, 1, 215, 115, 211, 77, 216, 108, 1, 211, 66, 216, 108, 1, 215,
- 115, 211, 66, 216, 108, 1, 211, 8, 216, 108, 1, 211, 49, 216, 108, 1,
- 254, 207, 211, 49, 216, 108, 1, 215, 115, 211, 49, 216, 108, 1, 211, 75,
- 216, 108, 1, 211, 74, 216, 108, 1, 211, 71, 216, 108, 1, 215, 115, 211,
- 85, 216, 108, 1, 215, 115, 211, 69, 216, 108, 1, 211, 67, 216, 108, 1,
- 210, 212, 216, 108, 1, 211, 64, 216, 108, 1, 211, 63, 216, 108, 1, 211,
- 87, 216, 108, 1, 215, 115, 211, 87, 216, 108, 1, 253, 163, 211, 87, 216,
- 108, 1, 211, 62, 216, 108, 1, 211, 60, 216, 108, 1, 211, 61, 216, 108, 1,
- 211, 59, 216, 108, 1, 211, 58, 216, 108, 1, 211, 97, 216, 108, 1, 211,
- 56, 216, 108, 1, 211, 54, 216, 108, 1, 211, 53, 216, 108, 1, 211, 52,
- 216, 108, 1, 211, 50, 216, 108, 1, 217, 34, 211, 50, 216, 108, 1, 211,
- 48, 216, 108, 1, 211, 47, 216, 108, 1, 210, 244, 216, 108, 58, 1, 233,
- 126, 78, 216, 108, 220, 138, 78, 216, 108, 116, 235, 63, 29, 3, 232, 155,
- 29, 3, 230, 160, 29, 3, 222, 209, 29, 3, 219, 57, 29, 3, 220, 6, 29, 3,
- 251, 204, 29, 3, 216, 41, 29, 3, 249, 237, 29, 3, 228, 72, 29, 3, 227,
- 133, 29, 3, 242, 180, 227, 0, 29, 3, 210, 22, 29, 3, 247, 143, 29, 3,
- 248, 104, 29, 3, 235, 67, 29, 3, 216, 155, 29, 3, 250, 85, 29, 3, 225,
- 120, 29, 3, 225, 15, 29, 3, 242, 255, 29, 3, 242, 251, 29, 3, 242, 252,
- 29, 3, 242, 253, 29, 3, 218, 223, 29, 3, 218, 179, 29, 3, 218, 192, 29,
- 3, 218, 222, 29, 3, 218, 196, 29, 3, 218, 197, 29, 3, 218, 184, 29, 3,
- 250, 213, 29, 3, 250, 192, 29, 3, 250, 194, 29, 3, 250, 212, 29, 3, 250,
- 210, 29, 3, 250, 211, 29, 3, 250, 193, 29, 3, 209, 243, 29, 3, 209, 221,
- 29, 3, 209, 234, 29, 3, 209, 242, 29, 3, 209, 237, 29, 3, 209, 238, 29,
- 3, 209, 226, 29, 3, 250, 208, 29, 3, 250, 195, 29, 3, 250, 197, 29, 3,
- 250, 207, 29, 3, 250, 205, 29, 3, 250, 206, 29, 3, 250, 196, 29, 3, 223,
- 236, 29, 3, 223, 226, 29, 3, 223, 232, 29, 3, 223, 235, 29, 3, 223, 233,
- 29, 3, 223, 234, 29, 3, 223, 231, 29, 3, 233, 159, 29, 3, 233, 151, 29,
- 3, 233, 154, 29, 3, 233, 158, 29, 3, 233, 155, 29, 3, 233, 156, 29, 3,
- 233, 152, 29, 3, 211, 130, 29, 3, 211, 120, 29, 3, 211, 126, 29, 3, 211,
- 129, 29, 3, 211, 127, 29, 3, 211, 128, 29, 3, 211, 125, 29, 3, 242, 71,
- 29, 3, 242, 62, 29, 3, 242, 65, 29, 3, 242, 70, 29, 3, 242, 67, 29, 3,
- 242, 68, 29, 3, 242, 64, 38, 33, 1, 252, 75, 38, 33, 1, 213, 255, 38, 33,
- 1, 242, 236, 38, 33, 1, 248, 90, 38, 33, 1, 210, 74, 38, 33, 1, 210, 94,
- 38, 33, 1, 176, 38, 33, 1, 245, 174, 38, 33, 1, 245, 159, 38, 33, 1, 245,
- 150, 38, 33, 1, 76, 38, 33, 1, 225, 221, 38, 33, 1, 245, 92, 38, 33, 1,
- 245, 82, 38, 33, 1, 217, 22, 38, 33, 1, 162, 38, 33, 1, 215, 178, 38, 33,
- 1, 250, 131, 38, 33, 1, 220, 102, 38, 33, 1, 220, 65, 38, 33, 1, 244, 82,
- 38, 33, 1, 245, 81, 38, 33, 1, 61, 38, 33, 1, 236, 60, 38, 33, 1, 247,
- 161, 38, 33, 1, 230, 140, 214, 205, 38, 33, 1, 211, 59, 38, 33, 1, 210,
- 212, 38, 33, 1, 235, 183, 61, 38, 33, 1, 232, 192, 210, 183, 38, 33, 1,
- 251, 249, 210, 183, 38, 33, 1, 235, 183, 251, 249, 210, 183, 44, 254,
- 110, 218, 60, 231, 154, 44, 254, 110, 246, 118, 218, 60, 231, 154, 43,
- 218, 60, 127, 44, 218, 60, 127, 43, 246, 118, 218, 60, 127, 44, 246, 118,
- 218, 60, 127, 223, 157, 235, 202, 231, 154, 223, 157, 246, 118, 235, 202,
- 231, 154, 246, 118, 215, 241, 231, 154, 43, 215, 241, 127, 44, 215, 241,
- 127, 223, 157, 218, 234, 43, 223, 157, 226, 198, 127, 44, 223, 157, 226,
- 198, 127, 245, 210, 249, 158, 226, 13, 244, 22, 226, 13, 223, 49, 244,
- 22, 226, 13, 240, 165, 246, 118, 226, 251, 246, 104, 254, 119, 214, 153,
- 254, 119, 246, 118, 222, 247, 254, 109, 52, 226, 248, 240, 168, 235, 193,
- 235, 201, 226, 59, 251, 154, 240, 169, 2, 248, 1, 216, 89, 2, 222, 234,
- 48, 43, 121, 226, 5, 127, 44, 121, 226, 5, 127, 216, 89, 2, 59, 48, 216,
- 89, 2, 59, 51, 43, 67, 252, 141, 2, 224, 7, 44, 67, 252, 141, 2, 224, 7,
- 216, 14, 43, 163, 127, 216, 14, 44, 163, 127, 251, 175, 43, 163, 127,
- 251, 175, 44, 163, 127, 43, 219, 187, 104, 127, 44, 219, 187, 104, 127,
- 43, 52, 226, 3, 44, 52, 226, 3, 113, 170, 117, 123, 59, 224, 140, 123,
- 59, 117, 113, 170, 224, 140, 92, 244, 11, 59, 224, 140, 244, 81, 59, 78,
- 223, 49, 224, 13, 78, 67, 182, 222, 234, 225, 10, 211, 209, 220, 138,
- 230, 224, 247, 120, 215, 94, 249, 219, 223, 157, 247, 120, 223, 157, 249,
- 219, 215, 94, 220, 150, 248, 206, 2, 43, 242, 108, 248, 206, 2, 44, 242,
- 108, 215, 94, 248, 205, 216, 14, 163, 221, 173, 50, 215, 59, 248, 156,
- 216, 143, 248, 156, 9, 34, 223, 76, 9, 34, 250, 10, 9, 34, 221, 176, 110,
- 9, 34, 221, 176, 105, 9, 34, 221, 176, 158, 9, 34, 225, 167, 9, 34, 251,
- 163, 9, 34, 217, 92, 9, 34, 234, 33, 110, 9, 34, 234, 33, 105, 9, 34,
- 247, 170, 9, 34, 221, 179, 9, 34, 4, 110, 9, 34, 4, 105, 9, 34, 233, 97,
- 110, 9, 34, 233, 97, 105, 9, 34, 233, 97, 158, 9, 34, 233, 97, 161, 9,
- 34, 219, 68, 9, 34, 216, 145, 9, 34, 219, 66, 110, 9, 34, 219, 66, 105,
- 9, 34, 241, 228, 110, 9, 34, 241, 228, 105, 9, 34, 242, 15, 9, 34, 223,
- 147, 9, 34, 250, 82, 9, 34, 218, 37, 9, 34, 230, 128, 9, 34, 248, 88, 9,
- 34, 230, 120, 9, 34, 250, 25, 9, 34, 212, 41, 110, 9, 34, 212, 41, 105,
- 9, 34, 244, 96, 9, 34, 225, 232, 110, 9, 34, 225, 232, 105, 9, 34, 219,
- 160, 163, 215, 236, 215, 188, 9, 34, 249, 145, 9, 34, 247, 136, 9, 34,
- 235, 137, 9, 34, 251, 198, 64, 249, 250, 9, 34, 245, 15, 9, 34, 218, 249,
- 110, 9, 34, 218, 249, 105, 9, 34, 252, 154, 9, 34, 219, 167, 9, 34, 251,
- 63, 219, 167, 9, 34, 229, 90, 110, 9, 34, 229, 90, 105, 9, 34, 229, 90,
- 158, 9, 34, 229, 90, 161, 9, 34, 231, 46, 9, 34, 220, 57, 9, 34, 223,
- 153, 9, 34, 245, 37, 9, 34, 226, 209, 9, 34, 251, 133, 110, 9, 34, 251,
- 133, 105, 9, 34, 231, 86, 9, 34, 230, 123, 9, 34, 242, 140, 110, 9, 34,
- 242, 140, 105, 9, 34, 242, 140, 158, 9, 34, 216, 106, 9, 34, 249, 249, 9,
- 34, 212, 9, 110, 9, 34, 212, 9, 105, 9, 34, 251, 63, 221, 170, 9, 34,
- 219, 160, 240, 248, 9, 34, 240, 248, 9, 34, 251, 63, 219, 2, 9, 34, 251,
- 63, 220, 52, 9, 34, 244, 32, 9, 34, 251, 63, 250, 228, 9, 34, 219, 160,
- 212, 57, 9, 34, 212, 58, 110, 9, 34, 212, 58, 105, 9, 34, 250, 27, 9, 34,
- 251, 63, 242, 166, 9, 34, 199, 110, 9, 34, 199, 105, 9, 34, 251, 63, 232,
- 137, 9, 34, 251, 63, 243, 88, 9, 34, 230, 119, 110, 9, 34, 230, 119, 105,
- 9, 34, 223, 159, 9, 34, 251, 207, 9, 34, 251, 63, 217, 56, 233, 52, 9,
- 34, 251, 63, 233, 53, 9, 34, 251, 63, 211, 239, 9, 34, 251, 63, 244, 46,
- 9, 34, 245, 218, 110, 9, 34, 245, 218, 105, 9, 34, 245, 218, 158, 9, 34,
- 251, 63, 245, 217, 9, 34, 241, 235, 9, 34, 251, 63, 240, 245, 9, 34, 251,
- 194, 9, 34, 242, 222, 9, 34, 251, 63, 244, 90, 9, 34, 251, 63, 251, 237,
- 9, 34, 251, 63, 222, 1, 9, 34, 219, 160, 212, 2, 9, 34, 219, 160, 211,
- 41, 9, 34, 251, 63, 243, 244, 9, 34, 235, 143, 245, 41, 9, 34, 251, 63,
- 245, 41, 9, 34, 235, 143, 216, 15, 9, 34, 251, 63, 216, 15, 9, 34, 235,
- 143, 246, 96, 9, 34, 251, 63, 246, 96, 9, 34, 215, 91, 9, 34, 235, 143,
- 215, 91, 9, 34, 251, 63, 215, 91, 60, 34, 110, 60, 34, 232, 213, 60, 34,
- 247, 120, 60, 34, 219, 95, 60, 34, 221, 175, 60, 34, 103, 60, 34, 105,
- 60, 34, 232, 237, 60, 34, 231, 185, 60, 34, 233, 33, 60, 34, 245, 129,
- 60, 34, 195, 60, 34, 124, 251, 163, 60, 34, 249, 147, 60, 34, 240, 111,
- 60, 34, 217, 92, 60, 34, 204, 251, 163, 60, 34, 234, 32, 60, 34, 224,
- 224, 60, 34, 211, 202, 60, 34, 218, 243, 60, 34, 44, 204, 251, 163, 60,
- 34, 241, 176, 245, 145, 60, 34, 216, 247, 60, 34, 247, 170, 60, 34, 221,
- 179, 60, 34, 250, 10, 60, 34, 224, 182, 60, 34, 254, 215, 60, 34, 230,
- 110, 60, 34, 245, 145, 60, 34, 245, 223, 60, 34, 221, 200, 60, 34, 242,
- 174, 60, 34, 242, 175, 219, 81, 60, 34, 245, 40, 60, 34, 251, 248, 60,
- 34, 211, 221, 60, 34, 250, 101, 60, 34, 222, 196, 60, 34, 235, 251, 60,
- 34, 219, 79, 60, 34, 233, 96, 60, 34, 249, 156, 60, 34, 218, 237, 60, 34,
- 230, 115, 60, 34, 222, 224, 60, 34, 211, 206, 60, 34, 226, 190, 60, 34,
- 215, 97, 60, 34, 246, 80, 60, 34, 219, 251, 216, 145, 60, 34, 246, 118,
- 250, 10, 60, 34, 199, 218, 108, 60, 34, 113, 242, 10, 60, 34, 220, 0, 60,
- 34, 251, 169, 60, 34, 219, 65, 60, 34, 251, 137, 60, 34, 218, 138, 60,
- 34, 241, 227, 60, 34, 242, 28, 60, 34, 247, 123, 60, 34, 242, 15, 60, 34,
- 251, 154, 60, 34, 223, 147, 60, 34, 221, 187, 60, 34, 247, 199, 60, 34,
- 253, 168, 60, 34, 218, 234, 60, 34, 228, 51, 60, 34, 218, 37, 60, 34,
- 221, 211, 60, 34, 230, 128, 60, 34, 215, 235, 60, 34, 233, 122, 60, 34,
- 218, 129, 60, 34, 248, 88, 60, 34, 212, 21, 60, 34, 247, 146, 228, 51,
- 60, 34, 249, 215, 60, 34, 243, 222, 60, 34, 250, 21, 60, 34, 218, 142,
- 60, 34, 212, 40, 60, 34, 244, 96, 60, 34, 250, 18, 60, 34, 244, 161, 60,
- 34, 52, 211, 178, 60, 34, 163, 215, 236, 215, 188, 60, 34, 219, 89, 60,
- 34, 244, 171, 60, 34, 249, 145, 60, 34, 247, 136, 60, 34, 224, 179, 60,
- 34, 235, 137, 60, 34, 231, 67, 60, 34, 216, 88, 60, 34, 217, 245, 60, 34,
- 232, 231, 60, 34, 214, 131, 60, 34, 244, 120, 60, 34, 251, 198, 64, 249,
- 250, 60, 34, 219, 188, 60, 34, 246, 118, 216, 242, 60, 34, 211, 253, 60,
- 34, 219, 103, 60, 34, 247, 187, 60, 34, 245, 15, 60, 34, 219, 5, 60, 34,
- 74, 60, 34, 218, 131, 60, 34, 218, 248, 60, 34, 215, 255, 60, 34, 242,
- 147, 60, 34, 250, 218, 60, 34, 218, 160, 60, 34, 252, 154, 60, 34, 223,
- 31, 60, 34, 219, 167, 60, 34, 235, 130, 60, 34, 229, 89, 60, 34, 220, 57,
- 60, 34, 244, 149, 60, 34, 226, 209, 60, 34, 254, 118, 60, 34, 225, 29,
- 60, 34, 245, 227, 60, 34, 251, 132, 60, 34, 231, 86, 60, 34, 230, 183,
- 60, 34, 220, 156, 60, 34, 253, 252, 60, 34, 230, 123, 60, 34, 216, 19,
- 60, 34, 226, 165, 60, 34, 251, 201, 60, 34, 218, 127, 60, 34, 249, 225,
- 60, 34, 242, 139, 60, 34, 216, 106, 60, 34, 235, 217, 60, 34, 251, 211,
- 60, 34, 212, 58, 245, 145, 60, 34, 249, 249, 60, 34, 212, 8, 60, 34, 221,
- 170, 60, 34, 240, 248, 60, 34, 219, 2, 60, 34, 214, 22, 60, 34, 252, 72,
- 60, 34, 225, 73, 60, 34, 252, 174, 60, 34, 220, 52, 60, 34, 223, 110, 60,
- 34, 222, 126, 60, 34, 244, 32, 60, 34, 251, 200, 60, 34, 250, 228, 60,
- 34, 251, 226, 60, 34, 230, 125, 60, 34, 212, 57, 60, 34, 250, 27, 60, 34,
- 211, 236, 60, 34, 247, 180, 60, 34, 213, 161, 60, 34, 242, 166, 60, 34,
- 232, 137, 60, 34, 243, 88, 60, 34, 230, 118, 60, 34, 219, 94, 60, 34,
- 219, 251, 217, 76, 251, 237, 60, 34, 223, 159, 60, 34, 251, 207, 60, 34,
- 211, 197, 60, 34, 244, 190, 60, 34, 233, 52, 60, 34, 217, 56, 233, 52,
- 60, 34, 233, 48, 60, 34, 219, 30, 60, 34, 233, 53, 60, 34, 211, 239, 60,
- 34, 244, 46, 60, 34, 245, 217, 60, 34, 241, 235, 60, 34, 244, 0, 60, 34,
- 240, 245, 60, 34, 251, 194, 60, 34, 217, 63, 60, 34, 242, 34, 60, 34,
- 244, 113, 60, 34, 222, 28, 211, 236, 60, 34, 250, 220, 60, 34, 242, 222,
- 60, 34, 244, 90, 60, 34, 251, 237, 60, 34, 222, 1, 60, 34, 248, 74, 60,
- 34, 212, 2, 60, 34, 241, 210, 60, 34, 211, 41, 60, 34, 230, 192, 60, 34,
- 251, 221, 60, 34, 245, 155, 60, 34, 243, 244, 60, 34, 215, 209, 60, 34,
- 246, 82, 60, 34, 223, 141, 60, 34, 228, 53, 60, 34, 245, 41, 60, 34, 216,
- 15, 60, 34, 246, 96, 60, 34, 215, 91, 60, 34, 244, 48, 109, 248, 37, 135,
- 43, 216, 42, 222, 251, 109, 248, 37, 135, 77, 216, 42, 51, 109, 248, 37,
- 135, 43, 216, 42, 230, 224, 22, 222, 251, 109, 248, 37, 135, 77, 216, 42,
- 230, 224, 22, 51, 109, 248, 37, 135, 243, 229, 218, 10, 109, 248, 37,
- 135, 218, 11, 243, 243, 48, 109, 248, 37, 135, 218, 11, 243, 243, 51,
- 109, 248, 37, 135, 218, 11, 243, 243, 233, 46, 109, 248, 37, 135, 218,
- 11, 243, 243, 214, 160, 233, 46, 109, 248, 37, 135, 218, 11, 243, 243,
- 214, 160, 222, 251, 109, 248, 37, 135, 218, 11, 243, 243, 232, 108, 233,
- 46, 109, 248, 37, 135, 226, 122, 109, 219, 18, 109, 249, 219, 109, 243,
- 229, 218, 129, 247, 177, 78, 235, 131, 235, 236, 218, 159, 87, 109, 235,
- 158, 78, 109, 249, 252, 78, 109, 54, 210, 86, 43, 254, 110, 127, 44, 254,
- 110, 127, 43, 52, 254, 110, 127, 44, 52, 254, 110, 127, 43, 249, 161,
- 127, 44, 249, 161, 127, 43, 71, 249, 161, 127, 44, 71, 249, 161, 127, 43,
- 85, 233, 20, 127, 44, 85, 233, 20, 127, 224, 237, 78, 243, 32, 78, 43,
- 216, 6, 220, 53, 127, 44, 216, 6, 220, 53, 127, 43, 71, 233, 20, 127, 44,
- 71, 233, 20, 127, 43, 71, 216, 6, 220, 53, 127, 44, 71, 216, 6, 220, 53,
- 127, 43, 71, 42, 127, 44, 71, 42, 127, 212, 36, 248, 156, 223, 49, 52,
- 224, 191, 223, 254, 78, 52, 224, 191, 223, 254, 78, 121, 52, 224, 191,
- 223, 254, 78, 224, 237, 164, 244, 190, 242, 8, 227, 198, 110, 242, 8,
- 227, 198, 105, 242, 8, 227, 198, 158, 242, 8, 227, 198, 161, 242, 8, 227,
- 198, 189, 242, 8, 227, 198, 194, 242, 8, 227, 198, 198, 242, 8, 227, 198,
- 195, 242, 8, 227, 198, 200, 109, 233, 3, 138, 78, 109, 222, 228, 138, 78,
- 109, 248, 44, 138, 78, 109, 245, 128, 138, 78, 24, 219, 155, 59, 138, 78,
- 24, 52, 59, 138, 78, 212, 32, 248, 156, 67, 234, 233, 223, 77, 78, 67,
- 234, 233, 223, 77, 2, 213, 135, 219, 31, 78, 67, 234, 233, 223, 77, 164,
- 214, 160, 242, 27, 67, 234, 233, 223, 77, 2, 213, 135, 219, 31, 164, 214,
- 160, 242, 27, 67, 234, 233, 223, 77, 164, 232, 108, 242, 27, 37, 224,
- 237, 78, 109, 217, 3, 232, 214, 244, 146, 220, 138, 87, 242, 8, 227, 198,
- 216, 247, 242, 8, 227, 198, 215, 73, 242, 8, 227, 198, 216, 162, 67, 109,
- 235, 158, 78, 231, 140, 78, 225, 255, 254, 140, 78, 109, 45, 235, 238,
- 109, 163, 244, 106, 219, 18, 141, 1, 4, 61, 141, 1, 61, 141, 1, 4, 73,
- 141, 1, 73, 141, 1, 4, 70, 141, 1, 70, 141, 1, 4, 75, 141, 1, 75, 141, 1,
- 4, 76, 141, 1, 76, 141, 1, 176, 141, 1, 243, 135, 141, 1, 234, 92, 141,
- 1, 242, 214, 141, 1, 233, 217, 141, 1, 242, 113, 141, 1, 234, 182, 141,
- 1, 243, 62, 141, 1, 234, 28, 141, 1, 242, 174, 141, 1, 206, 141, 1, 210,
- 116, 141, 1, 219, 191, 141, 1, 210, 44, 141, 1, 218, 83, 141, 1, 210, 13,
- 141, 1, 221, 181, 141, 1, 210, 94, 141, 1, 219, 58, 141, 1, 210, 23, 141,
- 1, 217, 105, 141, 1, 248, 221, 141, 1, 216, 117, 141, 1, 248, 3, 141, 1,
- 4, 215, 118, 141, 1, 215, 118, 141, 1, 246, 78, 141, 1, 217, 22, 141, 1,
- 248, 90, 141, 1, 111, 141, 1, 247, 145, 141, 1, 197, 141, 1, 228, 233,
- 141, 1, 227, 237, 141, 1, 229, 107, 141, 1, 228, 74, 141, 1, 162, 141, 1,
- 252, 191, 141, 1, 190, 141, 1, 241, 180, 141, 1, 252, 6, 141, 1, 225,
- 108, 141, 1, 240, 222, 141, 1, 251, 125, 141, 1, 224, 150, 141, 1, 241,
- 238, 141, 1, 252, 75, 141, 1, 225, 221, 141, 1, 241, 68, 141, 1, 251,
- 205, 141, 1, 225, 16, 141, 1, 184, 141, 1, 230, 230, 141, 1, 230, 102,
- 141, 1, 231, 91, 141, 1, 230, 161, 141, 1, 4, 191, 141, 1, 191, 141, 1,
- 4, 210, 212, 141, 1, 210, 212, 141, 1, 4, 210, 244, 141, 1, 210, 244,
- 141, 1, 205, 141, 1, 223, 35, 141, 1, 222, 140, 141, 1, 223, 128, 141, 1,
- 222, 211, 141, 1, 4, 212, 65, 141, 1, 212, 65, 141, 1, 211, 250, 141, 1,
- 212, 22, 141, 1, 211, 227, 141, 1, 230, 25, 141, 1, 212, 116, 141, 1, 4,
- 176, 141, 1, 4, 234, 182, 38, 234, 201, 213, 135, 219, 31, 78, 38, 234,
- 201, 220, 155, 219, 31, 78, 234, 201, 213, 135, 219, 31, 78, 234, 201,
- 220, 155, 219, 31, 78, 141, 235, 158, 78, 141, 213, 135, 235, 158, 78,
- 141, 247, 221, 210, 225, 234, 201, 52, 240, 168, 56, 1, 4, 61, 56, 1, 61,
- 56, 1, 4, 73, 56, 1, 73, 56, 1, 4, 70, 56, 1, 70, 56, 1, 4, 75, 56, 1,
- 75, 56, 1, 4, 76, 56, 1, 76, 56, 1, 176, 56, 1, 243, 135, 56, 1, 234, 92,
- 56, 1, 242, 214, 56, 1, 233, 217, 56, 1, 242, 113, 56, 1, 234, 182, 56,
- 1, 243, 62, 56, 1, 234, 28, 56, 1, 242, 174, 56, 1, 206, 56, 1, 210, 116,
- 56, 1, 219, 191, 56, 1, 210, 44, 56, 1, 218, 83, 56, 1, 210, 13, 56, 1,
- 221, 181, 56, 1, 210, 94, 56, 1, 219, 58, 56, 1, 210, 23, 56, 1, 217,
- 105, 56, 1, 248, 221, 56, 1, 216, 117, 56, 1, 248, 3, 56, 1, 4, 215, 118,
- 56, 1, 215, 118, 56, 1, 246, 78, 56, 1, 217, 22, 56, 1, 248, 90, 56, 1,
- 111, 56, 1, 247, 145, 56, 1, 197, 56, 1, 228, 233, 56, 1, 227, 237, 56,
- 1, 229, 107, 56, 1, 228, 74, 56, 1, 162, 56, 1, 252, 191, 56, 1, 190, 56,
- 1, 241, 180, 56, 1, 252, 6, 56, 1, 225, 108, 56, 1, 240, 222, 56, 1, 251,
- 125, 56, 1, 224, 150, 56, 1, 241, 238, 56, 1, 252, 75, 56, 1, 225, 221,
- 56, 1, 241, 68, 56, 1, 251, 205, 56, 1, 225, 16, 56, 1, 184, 56, 1, 230,
- 230, 56, 1, 230, 102, 56, 1, 231, 91, 56, 1, 230, 161, 56, 1, 4, 191, 56,
- 1, 191, 56, 1, 4, 210, 212, 56, 1, 210, 212, 56, 1, 4, 210, 244, 56, 1,
- 210, 244, 56, 1, 205, 56, 1, 223, 35, 56, 1, 222, 140, 56, 1, 223, 128,
- 56, 1, 222, 211, 56, 1, 4, 212, 65, 56, 1, 212, 65, 56, 1, 211, 250, 56,
- 1, 212, 22, 56, 1, 211, 227, 56, 1, 230, 25, 56, 1, 212, 116, 56, 1, 4,
- 176, 56, 1, 4, 234, 182, 56, 1, 214, 27, 56, 1, 213, 176, 56, 1, 213,
- 255, 56, 1, 213, 138, 56, 230, 224, 247, 120, 234, 201, 224, 173, 219,
- 31, 78, 56, 235, 158, 78, 56, 213, 135, 235, 158, 78, 56, 247, 221, 233,
- 255, 251, 184, 1, 253, 158, 251, 184, 1, 226, 105, 251, 184, 1, 193, 251,
- 184, 1, 245, 6, 251, 184, 1, 249, 60, 251, 184, 1, 217, 152, 251, 184, 1,
- 230, 25, 251, 184, 1, 156, 251, 184, 1, 243, 202, 251, 184, 1, 235, 23,
- 251, 184, 1, 242, 60, 251, 184, 1, 235, 144, 251, 184, 1, 224, 96, 251,
- 184, 1, 211, 178, 251, 184, 1, 210, 83, 251, 184, 1, 250, 158, 251, 184,
- 1, 220, 104, 251, 184, 1, 153, 251, 184, 1, 210, 159, 251, 184, 1, 251,
- 66, 251, 184, 1, 222, 91, 251, 184, 1, 61, 251, 184, 1, 76, 251, 184, 1,
- 75, 251, 184, 1, 245, 197, 251, 184, 1, 254, 201, 251, 184, 1, 245, 195,
- 251, 184, 1, 253, 192, 251, 184, 1, 226, 134, 251, 184, 1, 254, 123, 251,
- 184, 1, 245, 150, 251, 184, 1, 254, 115, 251, 184, 1, 245, 138, 251, 184,
- 1, 245, 92, 251, 184, 1, 73, 251, 184, 1, 70, 251, 184, 1, 235, 156, 251,
- 184, 1, 214, 105, 251, 184, 1, 229, 79, 251, 184, 1, 242, 178, 251, 184,
- 1, 236, 34, 24, 1, 234, 58, 24, 1, 218, 215, 24, 1, 234, 51, 24, 1, 228,
- 226, 24, 1, 228, 224, 24, 1, 228, 223, 24, 1, 216, 101, 24, 1, 218, 204,
- 24, 1, 223, 26, 24, 1, 223, 21, 24, 1, 223, 18, 24, 1, 223, 11, 24, 1,
- 223, 6, 24, 1, 223, 1, 24, 1, 223, 12, 24, 1, 223, 24, 24, 1, 230, 217,
- 24, 1, 225, 95, 24, 1, 218, 212, 24, 1, 225, 84, 24, 1, 219, 148, 24, 1,
- 218, 209, 24, 1, 236, 56, 24, 1, 250, 46, 24, 1, 218, 219, 24, 1, 250,
- 106, 24, 1, 234, 110, 24, 1, 216, 173, 24, 1, 225, 131, 24, 1, 241, 172,
- 24, 1, 61, 24, 1, 254, 243, 24, 1, 191, 24, 1, 211, 92, 24, 1, 245, 117,
- 24, 1, 75, 24, 1, 211, 36, 24, 1, 211, 47, 24, 1, 76, 24, 1, 212, 65, 24,
- 1, 212, 62, 24, 1, 226, 234, 24, 1, 210, 244, 24, 1, 70, 24, 1, 212, 11,
- 24, 1, 212, 22, 24, 1, 211, 250, 24, 1, 210, 212, 24, 1, 245, 55, 24, 1,
- 211, 8, 24, 1, 73, 24, 244, 103, 24, 1, 218, 213, 24, 1, 228, 216, 24, 1,
- 228, 218, 24, 1, 228, 221, 24, 1, 223, 19, 24, 1, 223, 0, 24, 1, 223, 8,
- 24, 1, 223, 13, 24, 1, 222, 254, 24, 1, 230, 210, 24, 1, 230, 207, 24, 1,
- 230, 211, 24, 1, 234, 221, 24, 1, 225, 90, 24, 1, 225, 76, 24, 1, 225,
- 82, 24, 1, 225, 79, 24, 1, 225, 93, 24, 1, 225, 77, 24, 1, 234, 219, 24,
- 1, 234, 217, 24, 1, 219, 141, 24, 1, 219, 139, 24, 1, 219, 131, 24, 1,
- 219, 136, 24, 1, 219, 146, 24, 1, 226, 32, 24, 1, 218, 216, 24, 1, 211,
- 26, 24, 1, 211, 22, 24, 1, 211, 23, 24, 1, 234, 220, 24, 1, 218, 217, 24,
+ 67, 91, 43, 44, 52, 80, 2, 67, 91, 97, 215, 58, 80, 243, 244, 130, 140,
+ 52, 80, 243, 244, 130, 97, 52, 80, 243, 244, 130, 246, 105, 80, 2, 203,
+ 91, 214, 153, 80, 2, 203, 91, 214, 153, 215, 212, 74, 246, 105, 215, 212,
+ 74, 140, 52, 248, 158, 74, 97, 52, 248, 158, 74, 140, 215, 212, 248, 158,
+ 74, 97, 215, 212, 248, 158, 74, 97, 215, 58, 215, 212, 248, 158, 74, 97,
+ 80, 2, 246, 119, 218, 140, 214, 153, 80, 216, 43, 130, 246, 105, 80, 216,
+ 43, 130, 97, 80, 2, 217, 79, 2, 67, 91, 97, 80, 2, 217, 79, 2, 52, 67,
+ 91, 97, 215, 58, 80, 2, 217, 78, 97, 215, 58, 80, 2, 217, 79, 2, 67, 91,
+ 97, 215, 58, 80, 2, 217, 79, 2, 52, 67, 91, 140, 253, 252, 97, 253, 252,
+ 140, 52, 253, 252, 97, 52, 253, 252, 140, 80, 216, 43, 85, 247, 249, 97,
+ 80, 216, 43, 85, 247, 249, 140, 80, 243, 244, 252, 142, 216, 43, 85, 247,
+ 249, 97, 80, 243, 244, 252, 142, 216, 43, 85, 247, 249, 228, 57, 212, 9,
+ 22, 219, 29, 245, 221, 74, 228, 57, 245, 221, 22, 219, 29, 212, 9, 74,
+ 228, 57, 212, 9, 80, 2, 103, 228, 57, 245, 221, 80, 2, 103, 219, 29, 245,
+ 221, 80, 2, 103, 219, 29, 212, 9, 80, 2, 103, 228, 57, 212, 9, 80, 22,
+ 228, 57, 245, 221, 74, 228, 57, 245, 221, 80, 22, 219, 29, 245, 221, 74,
+ 219, 29, 245, 221, 80, 22, 219, 29, 212, 9, 74, 219, 29, 212, 9, 80, 22,
+ 228, 57, 212, 9, 74, 222, 229, 248, 0, 249, 126, 244, 176, 247, 255, 244,
+ 176, 248, 0, 249, 126, 222, 229, 247, 255, 219, 29, 245, 221, 80, 249,
+ 126, 228, 57, 245, 221, 74, 228, 57, 245, 221, 80, 249, 126, 219, 29,
+ 245, 221, 74, 244, 176, 248, 0, 249, 126, 228, 57, 245, 221, 74, 222,
+ 229, 248, 0, 249, 126, 219, 29, 245, 221, 74, 228, 57, 245, 221, 80, 249,
+ 126, 228, 57, 212, 9, 74, 228, 57, 212, 9, 80, 249, 126, 228, 57, 245,
+ 221, 74, 212, 36, 80, 225, 8, 247, 196, 222, 252, 80, 225, 8, 97, 216,
+ 189, 249, 91, 214, 152, 80, 225, 8, 97, 216, 189, 249, 91, 246, 104, 80,
+ 225, 8, 246, 105, 216, 189, 249, 91, 233, 38, 80, 225, 8, 246, 105, 216,
+ 189, 249, 91, 222, 242, 222, 245, 254, 27, 250, 3, 74, 233, 41, 254, 27,
+ 254, 89, 74, 216, 15, 254, 27, 254, 89, 74, 251, 176, 254, 27, 254, 89,
+ 74, 216, 15, 254, 27, 250, 3, 80, 2, 230, 182, 216, 15, 254, 27, 254, 89,
+ 80, 2, 225, 23, 232, 109, 44, 220, 153, 250, 3, 74, 232, 109, 43, 220,
+ 153, 254, 89, 74, 254, 89, 250, 1, 250, 37, 74, 250, 3, 250, 1, 250, 37,
+ 74, 97, 80, 77, 219, 252, 140, 74, 140, 80, 77, 219, 252, 97, 74, 219,
+ 252, 97, 80, 77, 140, 74, 97, 80, 2, 96, 51, 140, 80, 2, 96, 51, 97, 80,
+ 216, 140, 211, 178, 43, 44, 80, 216, 140, 4, 250, 36, 214, 153, 215, 58,
+ 80, 243, 244, 4, 250, 36, 43, 252, 140, 120, 44, 252, 140, 124, 241, 255,
+ 43, 252, 140, 124, 44, 252, 140, 120, 241, 255, 120, 252, 140, 44, 124,
+ 252, 140, 43, 241, 255, 120, 252, 140, 43, 124, 252, 140, 44, 241, 255,
+ 43, 252, 140, 120, 44, 252, 140, 120, 241, 255, 120, 252, 140, 44, 124,
+ 252, 140, 44, 241, 255, 43, 252, 140, 124, 44, 252, 140, 124, 241, 255,
+ 120, 252, 140, 43, 124, 252, 140, 43, 241, 255, 140, 242, 0, 2, 252, 140,
+ 120, 216, 43, 130, 97, 242, 0, 2, 252, 140, 120, 216, 43, 130, 214, 153,
+ 242, 0, 2, 252, 140, 44, 216, 43, 130, 246, 105, 242, 0, 2, 252, 140, 44,
+ 216, 43, 130, 140, 242, 0, 2, 252, 140, 124, 216, 43, 130, 97, 242, 0, 2,
+ 252, 140, 124, 216, 43, 130, 214, 153, 242, 0, 2, 252, 140, 43, 216, 43,
+ 130, 246, 105, 242, 0, 2, 252, 140, 43, 216, 43, 130, 140, 242, 0, 2,
+ 252, 140, 120, 243, 244, 130, 97, 242, 0, 2, 252, 140, 120, 243, 244,
+ 130, 214, 153, 242, 0, 2, 252, 140, 44, 243, 244, 130, 246, 105, 242, 0,
+ 2, 252, 140, 44, 243, 244, 130, 140, 242, 0, 2, 252, 140, 124, 243, 244,
+ 130, 97, 242, 0, 2, 252, 140, 124, 243, 244, 130, 214, 153, 242, 0, 2,
+ 252, 140, 43, 243, 244, 130, 246, 105, 242, 0, 2, 252, 140, 43, 243, 244,
+ 130, 140, 242, 0, 2, 252, 140, 120, 77, 140, 242, 0, 2, 252, 140, 246,
+ 107, 214, 153, 242, 0, 2, 252, 140, 43, 252, 31, 214, 153, 242, 0, 2,
+ 252, 140, 222, 252, 97, 242, 0, 2, 252, 140, 120, 77, 97, 242, 0, 2, 252,
+ 140, 246, 107, 246, 105, 242, 0, 2, 252, 140, 43, 252, 31, 246, 105, 242,
+ 0, 2, 252, 140, 222, 252, 140, 242, 0, 2, 252, 140, 120, 77, 97, 242, 0,
+ 2, 252, 140, 214, 163, 140, 242, 0, 2, 252, 140, 124, 77, 97, 242, 0, 2,
+ 252, 140, 246, 107, 97, 242, 0, 2, 252, 140, 120, 77, 140, 242, 0, 2,
+ 252, 140, 214, 163, 97, 242, 0, 2, 252, 140, 124, 77, 140, 242, 0, 2,
+ 252, 140, 246, 107, 140, 242, 0, 2, 252, 140, 120, 77, 199, 248, 157,
+ 140, 242, 0, 2, 252, 140, 124, 252, 44, 199, 248, 157, 97, 242, 0, 2,
+ 252, 140, 120, 77, 199, 248, 157, 97, 242, 0, 2, 252, 140, 124, 252, 44,
+ 199, 248, 157, 214, 153, 242, 0, 2, 252, 140, 43, 252, 31, 246, 105, 242,
+ 0, 2, 252, 140, 222, 252, 246, 105, 242, 0, 2, 252, 140, 43, 252, 31,
+ 214, 153, 242, 0, 2, 252, 140, 222, 252, 44, 52, 80, 2, 222, 184, 241,
+ 236, 245, 99, 5, 77, 97, 74, 216, 90, 226, 169, 77, 97, 74, 140, 80, 77,
+ 216, 90, 226, 168, 97, 80, 77, 216, 90, 226, 168, 97, 80, 77, 254, 149,
+ 128, 111, 233, 16, 77, 140, 74, 140, 80, 216, 140, 233, 15, 242, 131, 77,
+ 97, 74, 218, 65, 77, 97, 74, 140, 80, 216, 140, 218, 64, 218, 23, 77,
+ 140, 74, 43, 244, 92, 217, 78, 44, 244, 92, 217, 78, 120, 244, 92, 217,
+ 78, 124, 244, 92, 217, 78, 215, 212, 67, 252, 142, 248, 61, 210, 160,
+ 188, 218, 243, 210, 160, 188, 215, 49, 249, 227, 43, 71, 249, 100, 127,
+ 44, 71, 249, 100, 127, 43, 71, 226, 4, 44, 71, 226, 4, 210, 160, 188, 43,
+ 236, 16, 127, 210, 160, 188, 44, 236, 16, 127, 210, 160, 188, 43, 251,
+ 243, 127, 210, 160, 188, 44, 251, 243, 127, 43, 42, 251, 159, 2, 214,
+ 183, 44, 42, 251, 159, 2, 214, 183, 43, 42, 251, 159, 2, 216, 116, 236,
+ 1, 216, 15, 249, 161, 44, 42, 251, 159, 2, 216, 116, 236, 1, 251, 176,
+ 249, 161, 43, 42, 251, 159, 2, 216, 116, 236, 1, 251, 176, 249, 161, 44,
+ 42, 251, 159, 2, 216, 116, 236, 1, 216, 15, 249, 161, 43, 254, 111, 251,
+ 159, 2, 247, 121, 44, 254, 111, 251, 159, 2, 247, 121, 43, 254, 27, 233,
+ 16, 127, 44, 254, 27, 242, 131, 127, 52, 43, 254, 27, 242, 131, 127, 52,
+ 44, 254, 27, 233, 16, 127, 43, 85, 216, 7, 220, 54, 127, 44, 85, 216, 7,
+ 220, 54, 127, 246, 119, 244, 136, 67, 210, 35, 232, 214, 231, 89, 254,
+ 111, 226, 171, 233, 47, 44, 254, 111, 214, 12, 2, 218, 235, 231, 89, 44,
+ 254, 111, 2, 247, 121, 254, 111, 2, 222, 93, 235, 216, 255, 4, 254, 110,
+ 219, 0, 254, 111, 226, 171, 233, 47, 219, 0, 254, 111, 226, 171, 214,
+ 163, 215, 94, 254, 110, 223, 50, 254, 110, 254, 111, 2, 214, 183, 223,
+ 50, 254, 111, 2, 214, 183, 226, 249, 254, 111, 226, 171, 214, 163, 226,
+ 249, 254, 111, 226, 171, 246, 107, 231, 89, 254, 111, 2, 204, 254, 6,
+ 245, 141, 236, 1, 80, 225, 8, 120, 22, 222, 252, 231, 89, 254, 111, 2,
+ 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, 120, 22, 233, 47, 231, 89,
+ 254, 111, 2, 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, 124, 22, 222,
+ 252, 231, 89, 254, 111, 2, 204, 254, 6, 245, 141, 236, 1, 80, 225, 8,
+ 124, 22, 233, 47, 231, 89, 254, 111, 2, 204, 254, 6, 245, 141, 236, 1,
+ 80, 225, 8, 44, 22, 214, 163, 231, 89, 254, 111, 2, 204, 254, 6, 245,
+ 141, 236, 1, 80, 225, 8, 43, 22, 214, 163, 231, 89, 254, 111, 2, 204,
+ 254, 6, 245, 141, 236, 1, 80, 225, 8, 44, 22, 246, 107, 231, 89, 254,
+ 111, 2, 204, 254, 6, 245, 141, 236, 1, 80, 225, 8, 43, 22, 246, 107, 223,
+ 50, 245, 153, 220, 128, 245, 153, 220, 129, 2, 226, 124, 245, 153, 220,
+ 129, 2, 4, 250, 37, 48, 245, 153, 220, 129, 2, 44, 80, 48, 245, 153, 220,
+ 129, 2, 43, 80, 48, 250, 37, 2, 203, 130, 37, 67, 130, 37, 226, 8, 37,
+ 223, 51, 219, 47, 37, 225, 172, 250, 37, 247, 174, 251, 79, 203, 252,
+ 142, 22, 216, 15, 163, 247, 174, 251, 79, 67, 130, 250, 37, 2, 218, 25,
+ 211, 178, 37, 254, 88, 247, 170, 50, 120, 80, 216, 140, 250, 36, 37, 71,
+ 251, 114, 37, 251, 114, 37, 233, 15, 37, 242, 130, 250, 37, 2, 4, 250,
+ 37, 216, 43, 216, 197, 222, 252, 250, 37, 2, 113, 203, 218, 92, 216, 43,
+ 216, 197, 222, 252, 92, 222, 229, 248, 0, 219, 96, 92, 244, 176, 248, 0,
+ 219, 96, 92, 253, 217, 92, 4, 250, 36, 92, 218, 235, 113, 235, 66, 218,
+ 233, 215, 227, 2, 59, 48, 215, 227, 2, 214, 183, 222, 93, 236, 1, 215,
+ 226, 215, 227, 2, 220, 135, 253, 208, 251, 175, 44, 215, 227, 77, 43,
+ 215, 226, 43, 215, 227, 252, 31, 67, 130, 67, 252, 142, 252, 31, 44, 215,
+ 226, 251, 166, 2, 43, 163, 251, 222, 251, 166, 2, 44, 163, 251, 222, 85,
+ 251, 165, 30, 2, 43, 163, 251, 222, 30, 2, 44, 163, 251, 222, 71, 240,
+ 237, 85, 240, 237, 43, 211, 244, 244, 136, 44, 211, 244, 244, 136, 43,
+ 52, 211, 244, 244, 136, 44, 52, 211, 244, 244, 136, 235, 249, 235, 235,
+ 216, 113, 117, 235, 235, 235, 236, 229, 103, 2, 67, 130, 246, 113, 230,
+ 88, 42, 2, 249, 182, 226, 128, 235, 247, 253, 238, 219, 220, 224, 181,
+ 245, 99, 5, 22, 219, 98, 226, 8, 245, 99, 5, 22, 219, 98, 226, 9, 2, 216,
+ 90, 48, 240, 105, 216, 43, 22, 219, 98, 226, 8, 242, 184, 218, 156, 216,
+ 186, 246, 106, 215, 227, 2, 43, 163, 251, 222, 246, 106, 215, 227, 2, 44,
+ 163, 251, 222, 85, 247, 250, 2, 124, 74, 85, 232, 105, 71, 250, 37, 2,
+ 124, 74, 85, 250, 37, 2, 124, 74, 245, 86, 71, 218, 235, 245, 86, 85,
+ 218, 235, 245, 86, 71, 247, 249, 245, 86, 85, 247, 249, 245, 86, 71, 250,
+ 36, 245, 86, 85, 250, 36, 222, 133, 223, 51, 219, 48, 226, 168, 219, 48,
+ 2, 226, 124, 223, 51, 219, 48, 2, 203, 91, 251, 250, 219, 47, 251, 250,
+ 223, 51, 219, 47, 52, 225, 23, 215, 212, 225, 23, 233, 43, 249, 92, 254,
+ 111, 127, 222, 248, 249, 92, 254, 111, 127, 216, 79, 230, 180, 230, 25,
+ 37, 59, 226, 168, 230, 25, 37, 96, 226, 168, 230, 25, 37, 30, 226, 168,
+ 230, 25, 214, 176, 226, 169, 2, 247, 121, 230, 25, 214, 176, 226, 169, 2,
+ 225, 23, 230, 25, 42, 235, 200, 226, 168, 230, 25, 42, 214, 176, 226,
+ 168, 113, 232, 147, 22, 226, 168, 113, 232, 147, 177, 226, 168, 230, 25,
+ 30, 226, 168, 230, 155, 113, 218, 44, 218, 42, 2, 235, 212, 224, 25, 235,
+ 213, 226, 168, 244, 100, 226, 0, 235, 212, 235, 213, 2, 52, 91, 235, 213,
+ 253, 174, 2, 219, 96, 250, 33, 243, 227, 254, 89, 235, 210, 232, 215,
+ 235, 211, 2, 223, 116, 225, 238, 254, 3, 225, 2, 232, 215, 235, 211, 2,
+ 220, 153, 225, 238, 254, 3, 225, 2, 232, 215, 235, 211, 228, 53, 235,
+ 251, 216, 197, 225, 2, 235, 213, 254, 3, 115, 225, 12, 226, 168, 224, 19,
+ 235, 213, 226, 168, 235, 213, 2, 140, 80, 2, 103, 235, 213, 2, 30, 50,
+ 235, 213, 2, 235, 199, 235, 213, 2, 214, 175, 235, 213, 2, 226, 124, 235,
+ 213, 2, 214, 183, 235, 67, 233, 86, 43, 215, 227, 226, 168, 210, 160,
+ 188, 221, 202, 249, 210, 210, 160, 188, 221, 202, 225, 57, 210, 160, 188,
+ 221, 202, 224, 177, 96, 5, 2, 4, 250, 37, 48, 96, 5, 2, 250, 32, 255, 16,
+ 48, 96, 5, 2, 216, 90, 48, 96, 5, 2, 59, 51, 96, 5, 2, 216, 90, 51, 96,
+ 5, 2, 218, 66, 105, 96, 5, 2, 85, 215, 226, 230, 183, 5, 2, 249, 221, 48,
+ 230, 183, 5, 2, 59, 51, 230, 183, 5, 2, 244, 176, 247, 119, 230, 183, 5,
+ 2, 222, 229, 247, 119, 96, 5, 236, 1, 43, 163, 250, 36, 96, 5, 236, 1,
+ 44, 163, 250, 36, 213, 254, 177, 249, 132, 224, 181, 230, 85, 5, 2, 59,
+ 48, 230, 85, 5, 2, 214, 183, 220, 150, 224, 182, 2, 251, 176, 250, 0,
+ 219, 78, 224, 181, 230, 85, 5, 236, 1, 43, 163, 250, 36, 230, 85, 5, 236,
+ 1, 44, 163, 250, 36, 37, 230, 85, 5, 2, 250, 32, 255, 15, 230, 85, 5,
+ 236, 1, 52, 250, 36, 37, 247, 170, 50, 96, 5, 236, 1, 215, 226, 230, 183,
+ 5, 236, 1, 215, 226, 230, 85, 5, 236, 1, 215, 226, 235, 207, 224, 181,
+ 222, 243, 235, 207, 224, 181, 210, 160, 188, 223, 91, 249, 210, 254, 135,
+ 177, 249, 166, 235, 200, 2, 247, 121, 214, 176, 2, 230, 183, 50, 214,
+ 176, 2, 226, 124, 235, 200, 2, 226, 124, 235, 200, 2, 232, 147, 254, 119,
+ 214, 176, 2, 232, 147, 226, 159, 214, 176, 77, 235, 199, 235, 200, 77,
+ 214, 175, 214, 176, 77, 252, 142, 77, 235, 199, 235, 200, 77, 252, 142,
+ 77, 214, 175, 214, 176, 252, 31, 22, 235, 66, 2, 214, 175, 235, 200, 252,
+ 31, 22, 235, 66, 2, 235, 199, 250, 1, 214, 176, 2, 220, 134, 250, 1, 235,
+ 200, 2, 220, 134, 52, 42, 235, 199, 52, 42, 214, 175, 250, 1, 214, 176,
+ 2, 220, 135, 22, 219, 78, 224, 181, 232, 147, 22, 2, 59, 48, 232, 147,
+ 177, 2, 59, 48, 52, 232, 147, 254, 119, 52, 232, 147, 226, 159, 113, 235,
+ 201, 232, 147, 254, 119, 113, 235, 201, 232, 147, 226, 159, 219, 86, 233,
+ 86, 226, 159, 219, 86, 233, 86, 254, 119, 232, 147, 177, 226, 122, 232,
+ 147, 254, 119, 232, 147, 22, 2, 230, 225, 218, 140, 232, 147, 177, 2,
+ 230, 225, 218, 140, 232, 147, 22, 2, 203, 248, 157, 232, 147, 177, 2,
+ 203, 248, 157, 232, 147, 22, 2, 52, 226, 124, 232, 147, 22, 2, 214, 183,
+ 232, 147, 22, 2, 52, 214, 183, 4, 213, 251, 2, 214, 183, 232, 147, 177,
+ 2, 52, 226, 124, 232, 147, 177, 2, 52, 214, 183, 210, 160, 188, 247, 130,
+ 254, 80, 210, 160, 188, 223, 149, 254, 80, 245, 99, 5, 2, 59, 51, 240,
+ 105, 2, 59, 48, 215, 212, 203, 252, 142, 2, 52, 67, 91, 215, 212, 203,
+ 252, 142, 2, 215, 212, 67, 91, 216, 90, 226, 169, 2, 59, 48, 216, 90,
+ 226, 169, 2, 222, 229, 247, 119, 219, 163, 230, 183, 219, 162, 249, 200,
+ 2, 59, 48, 245, 99, 2, 253, 217, 254, 149, 128, 216, 43, 2, 250, 32, 255,
+ 15, 254, 49, 128, 177, 128, 111, 245, 99, 5, 77, 96, 50, 96, 5, 77, 245,
+ 99, 50, 245, 99, 5, 77, 216, 90, 226, 168, 52, 249, 228, 245, 100, 113,
+ 249, 195, 245, 99, 219, 177, 134, 249, 195, 245, 99, 219, 177, 245, 99,
+ 5, 2, 113, 170, 77, 22, 113, 170, 51, 245, 95, 2, 244, 12, 170, 48, 233,
+ 16, 2, 250, 37, 235, 216, 242, 131, 2, 250, 37, 235, 216, 233, 16, 2,
+ 224, 14, 164, 48, 242, 131, 2, 224, 14, 164, 48, 233, 16, 177, 219, 98,
+ 128, 111, 242, 131, 177, 219, 98, 128, 111, 233, 16, 177, 219, 98, 128,
+ 216, 43, 2, 59, 235, 216, 242, 131, 177, 219, 98, 128, 216, 43, 2, 59,
+ 235, 216, 233, 16, 177, 219, 98, 128, 216, 43, 2, 59, 48, 242, 131, 177,
+ 219, 98, 128, 216, 43, 2, 59, 48, 233, 16, 177, 219, 98, 128, 216, 43, 2,
+ 59, 77, 222, 252, 242, 131, 177, 219, 98, 128, 216, 43, 2, 59, 77, 233,
+ 47, 233, 16, 177, 254, 50, 242, 131, 177, 254, 50, 233, 16, 22, 219, 154,
+ 228, 53, 128, 111, 242, 131, 22, 219, 154, 228, 53, 128, 111, 233, 16,
+ 22, 228, 53, 254, 50, 242, 131, 22, 228, 53, 254, 50, 233, 16, 77, 246,
+ 112, 128, 77, 242, 130, 242, 131, 77, 246, 112, 128, 77, 233, 15, 233,
+ 16, 77, 219, 163, 177, 245, 100, 242, 131, 77, 219, 163, 177, 245, 100,
+ 233, 16, 77, 219, 163, 77, 242, 130, 242, 131, 77, 219, 163, 77, 233, 15,
+ 233, 16, 77, 242, 131, 77, 246, 112, 245, 100, 242, 131, 77, 233, 16, 77,
+ 246, 112, 245, 100, 233, 16, 77, 219, 98, 128, 77, 242, 131, 77, 219, 98,
+ 245, 100, 242, 131, 77, 219, 98, 128, 77, 233, 16, 77, 219, 98, 245, 100,
+ 219, 98, 128, 216, 43, 177, 233, 15, 219, 98, 128, 216, 43, 177, 242,
+ 130, 219, 98, 128, 216, 43, 177, 233, 16, 2, 59, 235, 216, 219, 98, 128,
+ 216, 43, 177, 242, 131, 2, 59, 235, 216, 246, 112, 128, 216, 43, 177,
+ 233, 15, 246, 112, 128, 216, 43, 177, 242, 130, 246, 112, 219, 98, 128,
+ 216, 43, 177, 233, 15, 246, 112, 219, 98, 128, 216, 43, 177, 242, 130,
+ 219, 163, 177, 233, 15, 219, 163, 177, 242, 130, 219, 163, 77, 233, 16,
+ 77, 245, 99, 50, 219, 163, 77, 242, 131, 77, 245, 99, 50, 52, 229, 92,
+ 233, 15, 52, 229, 92, 242, 130, 52, 229, 92, 233, 16, 2, 214, 183, 242,
+ 131, 226, 122, 233, 15, 242, 131, 252, 31, 233, 15, 233, 16, 250, 1, 251,
+ 79, 249, 93, 242, 131, 250, 1, 251, 79, 249, 93, 233, 16, 250, 1, 251,
+ 79, 249, 94, 77, 219, 98, 245, 100, 242, 131, 250, 1, 251, 79, 249, 94,
+ 77, 219, 98, 245, 100, 219, 79, 216, 201, 233, 84, 216, 201, 219, 79,
+ 216, 202, 177, 128, 111, 233, 84, 216, 202, 177, 128, 111, 245, 99, 5, 2,
+ 251, 109, 48, 224, 204, 77, 219, 154, 245, 99, 50, 218, 57, 77, 219, 154,
+ 245, 99, 50, 224, 204, 77, 219, 154, 228, 53, 128, 111, 218, 57, 77, 219,
+ 154, 228, 53, 128, 111, 224, 204, 77, 245, 99, 50, 218, 57, 77, 245, 99,
+ 50, 224, 204, 77, 228, 53, 128, 111, 218, 57, 77, 228, 53, 128, 111, 224,
+ 204, 77, 254, 149, 128, 111, 218, 57, 77, 254, 149, 128, 111, 224, 204,
+ 77, 228, 53, 254, 149, 128, 111, 218, 57, 77, 228, 53, 254, 149, 128,
+ 111, 52, 224, 203, 52, 218, 56, 218, 65, 2, 247, 121, 218, 23, 2, 247,
+ 121, 218, 65, 2, 96, 5, 51, 218, 23, 2, 96, 5, 51, 218, 65, 2, 230, 85,
+ 5, 51, 218, 23, 2, 230, 85, 5, 51, 218, 65, 64, 177, 128, 216, 43, 2, 59,
+ 48, 218, 23, 64, 177, 128, 216, 43, 2, 59, 48, 218, 65, 64, 77, 245, 99,
+ 50, 218, 23, 64, 77, 245, 99, 50, 218, 65, 64, 77, 216, 90, 226, 168,
+ 218, 23, 64, 77, 216, 90, 226, 168, 218, 65, 64, 77, 254, 149, 128, 111,
+ 218, 23, 64, 77, 254, 149, 128, 111, 218, 65, 64, 77, 228, 53, 128, 111,
+ 218, 23, 64, 77, 228, 53, 128, 111, 42, 43, 204, 93, 226, 168, 42, 44,
+ 204, 93, 226, 168, 250, 1, 218, 64, 250, 1, 218, 22, 250, 1, 218, 65,
+ 177, 128, 111, 250, 1, 218, 23, 177, 128, 111, 218, 65, 77, 218, 22, 218,
+ 23, 77, 218, 64, 218, 65, 77, 218, 64, 218, 23, 77, 218, 22, 218, 23,
+ 252, 31, 218, 64, 218, 23, 252, 31, 22, 235, 66, 251, 79, 248, 158, 2,
+ 218, 64, 245, 171, 64, 226, 171, 246, 104, 225, 49, 2, 217, 13, 216, 14,
+ 215, 241, 235, 199, 244, 22, 228, 66, 219, 252, 43, 217, 88, 219, 252,
+ 124, 217, 88, 219, 252, 120, 217, 88, 225, 173, 2, 222, 92, 67, 252, 142,
+ 215, 212, 44, 215, 93, 52, 67, 252, 142, 43, 215, 93, 67, 252, 142, 52,
+ 43, 215, 93, 52, 67, 252, 142, 52, 43, 215, 93, 199, 248, 158, 243, 244,
+ 43, 231, 64, 64, 52, 213, 239, 219, 252, 124, 217, 89, 2, 226, 124, 219,
+ 252, 120, 217, 89, 2, 214, 183, 219, 252, 120, 217, 89, 77, 219, 252,
+ 124, 217, 88, 52, 124, 217, 88, 52, 120, 217, 88, 52, 218, 104, 228, 53,
+ 50, 223, 50, 52, 218, 104, 228, 53, 50, 247, 139, 228, 53, 247, 176, 2,
+ 223, 50, 229, 102, 219, 96, 67, 232, 215, 2, 250, 37, 48, 67, 232, 215,
+ 2, 250, 37, 51, 124, 217, 89, 2, 250, 37, 51, 226, 9, 2, 203, 91, 226, 9,
+ 2, 216, 90, 226, 168, 215, 212, 67, 252, 142, 251, 245, 223, 92, 215,
+ 212, 67, 252, 142, 2, 203, 91, 215, 212, 249, 228, 226, 168, 215, 212,
+ 229, 92, 233, 15, 215, 212, 229, 92, 242, 130, 246, 112, 219, 98, 233,
+ 16, 177, 128, 111, 246, 112, 219, 98, 242, 131, 177, 128, 111, 215, 212,
+ 219, 48, 251, 245, 223, 92, 233, 86, 215, 212, 67, 252, 142, 226, 168,
+ 52, 219, 48, 226, 168, 71, 67, 130, 230, 25, 71, 67, 130, 228, 57, 245,
+ 221, 71, 74, 228, 57, 212, 9, 71, 74, 219, 29, 245, 221, 71, 74, 219, 29,
+ 212, 9, 71, 74, 43, 44, 71, 74, 140, 85, 74, 214, 153, 85, 74, 246, 105,
+ 85, 74, 228, 57, 245, 221, 85, 74, 228, 57, 212, 9, 85, 74, 219, 29, 245,
+ 221, 85, 74, 219, 29, 212, 9, 85, 74, 43, 44, 85, 74, 120, 124, 85, 74,
+ 97, 80, 2, 216, 78, 246, 104, 97, 80, 2, 216, 78, 214, 152, 140, 80, 2,
+ 216, 78, 246, 104, 140, 80, 2, 216, 78, 214, 152, 42, 2, 216, 15, 163,
+ 251, 222, 42, 2, 251, 176, 163, 251, 222, 42, 2, 214, 160, 44, 248, 0,
+ 163, 251, 222, 42, 2, 232, 109, 43, 248, 0, 163, 251, 222, 247, 250, 2,
+ 43, 163, 251, 222, 247, 250, 2, 44, 163, 251, 222, 247, 250, 2, 216, 15,
+ 163, 251, 222, 247, 250, 2, 251, 176, 163, 251, 222, 246, 119, 218, 235,
+ 85, 233, 86, 218, 235, 71, 233, 86, 218, 235, 85, 213, 187, 4, 218, 235,
+ 71, 213, 187, 4, 218, 235, 85, 225, 191, 71, 225, 191, 71, 241, 194, 85,
+ 241, 194, 203, 85, 241, 194, 85, 233, 86, 250, 36, 85, 231, 83, 247, 249,
+ 71, 231, 83, 247, 249, 85, 231, 83, 232, 105, 71, 231, 83, 232, 105, 85,
+ 4, 247, 249, 85, 4, 232, 105, 71, 4, 232, 105, 85, 203, 245, 165, 71,
+ 203, 245, 165, 85, 67, 245, 165, 71, 67, 245, 165, 43, 80, 2, 4, 250, 36,
+ 134, 140, 253, 248, 43, 80, 2, 37, 225, 23, 199, 140, 218, 231, 74, 140,
+ 215, 58, 80, 2, 67, 91, 140, 215, 58, 80, 2, 52, 67, 91, 140, 215, 58,
+ 80, 243, 244, 130, 140, 215, 58, 215, 212, 248, 158, 74, 140, 80, 2, 246,
+ 119, 218, 140, 140, 80, 2, 217, 79, 2, 67, 91, 140, 80, 2, 217, 79, 2,
+ 52, 67, 91, 140, 215, 58, 80, 2, 217, 78, 140, 215, 58, 80, 2, 217, 79,
+ 2, 67, 91, 140, 215, 58, 80, 2, 217, 79, 2, 52, 67, 91, 140, 80, 216,
+ 140, 211, 178, 212, 36, 80, 225, 8, 247, 196, 233, 47, 245, 99, 5, 77,
+ 140, 74, 223, 51, 216, 90, 226, 169, 77, 140, 74, 140, 80, 77, 223, 51,
+ 254, 149, 128, 111, 97, 80, 216, 140, 242, 130, 97, 80, 216, 140, 218,
+ 22, 140, 224, 25, 74, 97, 224, 25, 74, 223, 51, 216, 90, 226, 169, 77,
+ 97, 74, 97, 80, 77, 223, 51, 254, 149, 128, 111, 216, 90, 226, 169, 77,
+ 140, 74, 140, 80, 77, 254, 149, 128, 111, 140, 80, 77, 223, 51, 216, 90,
+ 226, 168, 97, 80, 77, 223, 51, 216, 90, 226, 168, 71, 231, 83, 218, 157,
+ 85, 4, 218, 157, 71, 4, 218, 157, 85, 222, 248, 225, 191, 71, 222, 248,
+ 225, 191, 114, 233, 86, 250, 36, 114, 226, 125, 2, 226, 125, 235, 216,
+ 114, 250, 37, 2, 250, 37, 235, 216, 114, 250, 36, 114, 37, 221, 255, 145,
+ 6, 1, 253, 160, 145, 6, 1, 251, 118, 145, 6, 1, 213, 253, 145, 6, 1, 242,
+ 186, 145, 6, 1, 247, 141, 145, 6, 1, 211, 21, 145, 6, 1, 210, 68, 145, 6,
+ 1, 246, 35, 145, 6, 1, 210, 91, 145, 6, 1, 235, 149, 145, 6, 1, 65, 235,
+ 149, 145, 6, 1, 73, 145, 6, 1, 247, 161, 145, 6, 1, 234, 241, 145, 6, 1,
+ 232, 187, 145, 6, 1, 230, 30, 145, 6, 1, 229, 192, 145, 6, 1, 226, 186,
+ 145, 6, 1, 225, 5, 145, 6, 1, 222, 228, 145, 6, 1, 219, 84, 145, 6, 1,
+ 215, 81, 145, 6, 1, 214, 201, 145, 6, 1, 243, 247, 145, 6, 1, 241, 200,
+ 145, 6, 1, 226, 136, 145, 6, 1, 225, 222, 145, 6, 1, 219, 229, 145, 6, 1,
+ 215, 168, 145, 6, 1, 250, 76, 145, 6, 1, 220, 103, 145, 6, 1, 211, 27,
+ 145, 6, 1, 211, 29, 145, 6, 1, 211, 57, 145, 6, 1, 218, 254, 162, 145, 6,
+ 1, 210, 212, 145, 6, 1, 4, 210, 183, 145, 6, 1, 4, 210, 184, 2, 217, 78,
+ 145, 6, 1, 210, 244, 145, 6, 1, 235, 185, 4, 210, 183, 145, 6, 1, 251,
+ 250, 210, 183, 145, 6, 1, 235, 185, 251, 250, 210, 183, 145, 6, 1, 244,
+ 83, 145, 6, 1, 235, 147, 145, 6, 1, 219, 228, 145, 6, 1, 215, 203, 61,
+ 145, 6, 1, 233, 76, 230, 30, 145, 4, 1, 253, 160, 145, 4, 1, 251, 118,
+ 145, 4, 1, 213, 253, 145, 4, 1, 242, 186, 145, 4, 1, 247, 141, 145, 4, 1,
+ 211, 21, 145, 4, 1, 210, 68, 145, 4, 1, 246, 35, 145, 4, 1, 210, 91, 145,
+ 4, 1, 235, 149, 145, 4, 1, 65, 235, 149, 145, 4, 1, 73, 145, 4, 1, 247,
+ 161, 145, 4, 1, 234, 241, 145, 4, 1, 232, 187, 145, 4, 1, 230, 30, 145,
+ 4, 1, 229, 192, 145, 4, 1, 226, 186, 145, 4, 1, 225, 5, 145, 4, 1, 222,
+ 228, 145, 4, 1, 219, 84, 145, 4, 1, 215, 81, 145, 4, 1, 214, 201, 145, 4,
+ 1, 243, 247, 145, 4, 1, 241, 200, 145, 4, 1, 226, 136, 145, 4, 1, 225,
+ 222, 145, 4, 1, 219, 229, 145, 4, 1, 215, 168, 145, 4, 1, 250, 76, 145,
+ 4, 1, 220, 103, 145, 4, 1, 211, 27, 145, 4, 1, 211, 29, 145, 4, 1, 211,
+ 57, 145, 4, 1, 218, 254, 162, 145, 4, 1, 210, 212, 145, 4, 1, 4, 210,
+ 183, 145, 4, 1, 4, 210, 184, 2, 217, 78, 145, 4, 1, 210, 244, 145, 4, 1,
+ 235, 185, 4, 210, 183, 145, 4, 1, 251, 250, 210, 183, 145, 4, 1, 235,
+ 185, 251, 250, 210, 183, 145, 4, 1, 244, 83, 145, 4, 1, 235, 147, 145, 4,
+ 1, 219, 228, 145, 4, 1, 215, 203, 61, 145, 4, 1, 233, 76, 230, 30, 7, 6,
+ 1, 233, 150, 2, 52, 130, 7, 4, 1, 233, 150, 2, 52, 130, 7, 6, 1, 233,
+ 150, 2, 230, 225, 183, 7, 6, 1, 226, 107, 2, 91, 7, 6, 1, 223, 225, 2,
+ 217, 78, 7, 4, 1, 115, 2, 91, 7, 4, 1, 217, 154, 2, 248, 0, 91, 7, 6, 1,
+ 242, 62, 2, 248, 40, 7, 4, 1, 242, 62, 2, 248, 40, 7, 6, 1, 235, 25, 2,
+ 248, 40, 7, 4, 1, 235, 25, 2, 248, 40, 7, 6, 1, 210, 160, 2, 248, 40, 7,
+ 4, 1, 210, 160, 2, 248, 40, 7, 6, 1, 254, 144, 7, 6, 1, 232, 51, 2, 103,
+ 7, 6, 1, 215, 94, 61, 7, 6, 1, 215, 94, 254, 144, 7, 4, 1, 214, 106, 2,
+ 44, 103, 7, 6, 1, 212, 99, 2, 103, 7, 4, 1, 212, 99, 2, 103, 7, 4, 1,
+ 214, 106, 2, 249, 101, 7, 6, 1, 163, 242, 61, 7, 4, 1, 163, 242, 61, 7,
+ 4, 1, 217, 76, 225, 134, 7, 4, 1, 160, 2, 228, 51, 7, 4, 1, 215, 94, 223,
+ 225, 2, 217, 78, 7, 4, 1, 144, 2, 121, 222, 235, 235, 216, 7, 1, 4, 6,
+ 215, 94, 75, 7, 218, 66, 4, 1, 235, 145, 58, 1, 6, 214, 105, 7, 6, 1,
+ 222, 93, 2, 217, 251, 217, 78, 7, 6, 1, 210, 160, 2, 217, 251, 217, 78,
+ 81, 6, 1, 254, 165, 81, 4, 1, 254, 165, 81, 6, 1, 213, 173, 81, 4, 1,
+ 213, 173, 81, 6, 1, 243, 108, 81, 4, 1, 243, 108, 81, 6, 1, 248, 192, 81,
+ 4, 1, 248, 192, 81, 6, 1, 245, 195, 81, 4, 1, 245, 195, 81, 6, 1, 219,
+ 34, 81, 4, 1, 219, 34, 81, 6, 1, 210, 101, 81, 4, 1, 210, 101, 81, 6, 1,
+ 241, 249, 81, 4, 1, 241, 249, 81, 6, 1, 216, 178, 81, 4, 1, 216, 178, 81,
+ 6, 1, 240, 117, 81, 4, 1, 240, 117, 81, 6, 1, 234, 228, 81, 4, 1, 234,
+ 228, 81, 6, 1, 233, 73, 81, 4, 1, 233, 73, 81, 6, 1, 230, 231, 81, 4, 1,
+ 230, 231, 81, 6, 1, 228, 234, 81, 4, 1, 228, 234, 81, 6, 1, 233, 234, 81,
+ 4, 1, 233, 234, 81, 6, 1, 76, 81, 4, 1, 76, 81, 6, 1, 225, 109, 81, 4, 1,
+ 225, 109, 81, 6, 1, 222, 212, 81, 4, 1, 222, 212, 81, 6, 1, 219, 166, 81,
+ 4, 1, 219, 166, 81, 6, 1, 217, 42, 81, 4, 1, 217, 42, 81, 6, 1, 214, 229,
+ 81, 4, 1, 214, 229, 81, 6, 1, 244, 122, 81, 4, 1, 244, 122, 81, 6, 1,
+ 234, 113, 81, 4, 1, 234, 113, 81, 6, 1, 224, 162, 81, 4, 1, 224, 162, 81,
+ 6, 1, 226, 179, 81, 4, 1, 226, 179, 81, 6, 1, 247, 254, 254, 171, 81, 4,
+ 1, 247, 254, 254, 171, 81, 6, 1, 55, 81, 254, 197, 81, 4, 1, 55, 81, 254,
+ 197, 81, 6, 1, 249, 116, 245, 195, 81, 4, 1, 249, 116, 245, 195, 81, 6,
+ 1, 247, 254, 234, 228, 81, 4, 1, 247, 254, 234, 228, 81, 6, 1, 247, 254,
+ 228, 234, 81, 4, 1, 247, 254, 228, 234, 81, 6, 1, 249, 116, 228, 234, 81,
+ 4, 1, 249, 116, 228, 234, 81, 6, 1, 55, 81, 226, 179, 81, 4, 1, 55, 81,
+ 226, 179, 81, 6, 1, 221, 247, 81, 4, 1, 221, 247, 81, 6, 1, 249, 129,
+ 220, 56, 81, 4, 1, 249, 129, 220, 56, 81, 6, 1, 55, 81, 220, 56, 81, 4,
+ 1, 55, 81, 220, 56, 81, 6, 1, 55, 81, 245, 76, 81, 4, 1, 55, 81, 245, 76,
+ 81, 6, 1, 254, 183, 234, 118, 81, 4, 1, 254, 183, 234, 118, 81, 6, 1,
+ 247, 254, 241, 46, 81, 4, 1, 247, 254, 241, 46, 81, 6, 1, 55, 81, 241,
+ 46, 81, 4, 1, 55, 81, 241, 46, 81, 6, 1, 55, 81, 162, 81, 4, 1, 55, 81,
+ 162, 81, 6, 1, 233, 149, 162, 81, 4, 1, 233, 149, 162, 81, 6, 1, 55, 81,
+ 241, 218, 81, 4, 1, 55, 81, 241, 218, 81, 6, 1, 55, 81, 241, 252, 81, 4,
+ 1, 55, 81, 241, 252, 81, 6, 1, 55, 81, 243, 103, 81, 4, 1, 55, 81, 243,
+ 103, 81, 6, 1, 55, 81, 247, 164, 81, 4, 1, 55, 81, 247, 164, 81, 6, 1,
+ 55, 81, 220, 23, 81, 4, 1, 55, 81, 220, 23, 81, 6, 1, 55, 227, 209, 220,
+ 23, 81, 4, 1, 55, 227, 209, 220, 23, 81, 6, 1, 55, 227, 209, 229, 28, 81,
+ 4, 1, 55, 227, 209, 229, 28, 81, 6, 1, 55, 227, 209, 227, 149, 81, 4, 1,
+ 55, 227, 209, 227, 149, 81, 6, 1, 55, 227, 209, 212, 37, 81, 4, 1, 55,
+ 227, 209, 212, 37, 81, 16, 234, 247, 81, 16, 230, 232, 222, 212, 81, 16,
+ 225, 110, 222, 212, 81, 16, 218, 148, 81, 16, 217, 43, 222, 212, 81, 16,
+ 234, 114, 222, 212, 81, 16, 220, 24, 219, 166, 81, 6, 1, 249, 116, 220,
+ 56, 81, 4, 1, 249, 116, 220, 56, 81, 6, 1, 249, 116, 243, 103, 81, 4, 1,
+ 249, 116, 243, 103, 81, 38, 228, 235, 48, 81, 38, 218, 248, 253, 225, 81,
+ 38, 218, 248, 233, 22, 81, 6, 1, 251, 200, 234, 118, 81, 4, 1, 251, 200,
+ 234, 118, 81, 55, 227, 209, 243, 230, 218, 130, 81, 55, 227, 209, 247,
+ 198, 224, 14, 78, 81, 55, 227, 209, 235, 238, 224, 14, 78, 81, 55, 227,
+ 209, 213, 241, 247, 173, 81, 244, 3, 123, 242, 28, 81, 243, 230, 218,
+ 130, 81, 230, 125, 247, 173, 98, 4, 1, 254, 124, 98, 4, 1, 252, 153, 98,
+ 4, 1, 243, 107, 98, 4, 1, 247, 129, 98, 4, 1, 245, 151, 98, 4, 1, 213,
+ 160, 98, 4, 1, 210, 89, 98, 4, 1, 217, 61, 98, 4, 1, 236, 0, 98, 4, 1,
+ 234, 235, 98, 4, 1, 233, 82, 98, 4, 1, 231, 186, 98, 4, 1, 229, 196, 98,
+ 4, 1, 226, 197, 98, 4, 1, 226, 18, 98, 4, 1, 210, 78, 98, 4, 1, 223, 172,
+ 98, 4, 1, 221, 244, 98, 4, 1, 217, 51, 98, 4, 1, 214, 190, 98, 4, 1, 225,
+ 141, 98, 4, 1, 234, 122, 98, 4, 1, 242, 242, 98, 4, 1, 224, 74, 98, 4, 1,
+ 220, 21, 98, 4, 1, 250, 98, 98, 4, 1, 251, 8, 98, 4, 1, 235, 101, 98, 4,
+ 1, 250, 41, 98, 4, 1, 250, 144, 98, 4, 1, 211, 163, 98, 4, 1, 235, 112,
+ 98, 4, 1, 242, 44, 98, 4, 1, 241, 239, 98, 4, 1, 241, 176, 98, 4, 1, 212,
+ 22, 98, 4, 1, 242, 5, 98, 4, 1, 241, 66, 98, 4, 1, 210, 246, 98, 4, 1,
+ 254, 233, 216, 109, 1, 191, 216, 109, 1, 211, 99, 216, 109, 1, 211, 98,
+ 216, 109, 1, 211, 88, 216, 109, 1, 211, 86, 216, 109, 1, 252, 33, 255,
+ 17, 211, 81, 216, 109, 1, 211, 81, 216, 109, 1, 211, 96, 216, 109, 1,
+ 211, 93, 216, 109, 1, 211, 95, 216, 109, 1, 211, 94, 216, 109, 1, 211,
+ 12, 216, 109, 1, 211, 90, 216, 109, 1, 211, 79, 216, 109, 1, 215, 116,
+ 211, 79, 216, 109, 1, 211, 76, 216, 109, 1, 211, 84, 216, 109, 1, 252,
+ 33, 255, 17, 211, 84, 216, 109, 1, 215, 116, 211, 84, 216, 109, 1, 211,
+ 83, 216, 109, 1, 211, 103, 216, 109, 1, 211, 77, 216, 109, 1, 215, 116,
+ 211, 77, 216, 109, 1, 211, 66, 216, 109, 1, 215, 116, 211, 66, 216, 109,
+ 1, 211, 8, 216, 109, 1, 211, 49, 216, 109, 1, 254, 208, 211, 49, 216,
+ 109, 1, 215, 116, 211, 49, 216, 109, 1, 211, 75, 216, 109, 1, 211, 74,
+ 216, 109, 1, 211, 71, 216, 109, 1, 215, 116, 211, 85, 216, 109, 1, 215,
+ 116, 211, 69, 216, 109, 1, 211, 67, 216, 109, 1, 210, 212, 216, 109, 1,
+ 211, 64, 216, 109, 1, 211, 63, 216, 109, 1, 211, 87, 216, 109, 1, 215,
+ 116, 211, 87, 216, 109, 1, 253, 164, 211, 87, 216, 109, 1, 211, 62, 216,
+ 109, 1, 211, 60, 216, 109, 1, 211, 61, 216, 109, 1, 211, 59, 216, 109, 1,
+ 211, 58, 216, 109, 1, 211, 97, 216, 109, 1, 211, 56, 216, 109, 1, 211,
+ 54, 216, 109, 1, 211, 53, 216, 109, 1, 211, 52, 216, 109, 1, 211, 50,
+ 216, 109, 1, 217, 35, 211, 50, 216, 109, 1, 211, 48, 216, 109, 1, 211,
+ 47, 216, 109, 1, 210, 244, 216, 109, 58, 1, 233, 127, 78, 216, 109, 220,
+ 139, 78, 216, 109, 116, 235, 64, 29, 3, 232, 156, 29, 3, 230, 161, 29, 3,
+ 222, 210, 29, 3, 219, 58, 29, 3, 220, 7, 29, 3, 251, 205, 29, 3, 216, 42,
+ 29, 3, 249, 238, 29, 3, 228, 73, 29, 3, 227, 134, 29, 3, 242, 181, 227,
+ 1, 29, 3, 210, 22, 29, 3, 247, 144, 29, 3, 248, 105, 29, 3, 235, 68, 29,
+ 3, 216, 156, 29, 3, 250, 86, 29, 3, 225, 121, 29, 3, 225, 16, 29, 3, 243,
+ 0, 29, 3, 242, 252, 29, 3, 242, 253, 29, 3, 242, 254, 29, 3, 218, 224,
+ 29, 3, 218, 180, 29, 3, 218, 193, 29, 3, 218, 223, 29, 3, 218, 197, 29,
+ 3, 218, 198, 29, 3, 218, 185, 29, 3, 250, 214, 29, 3, 250, 193, 29, 3,
+ 250, 195, 29, 3, 250, 213, 29, 3, 250, 211, 29, 3, 250, 212, 29, 3, 250,
+ 194, 29, 3, 209, 243, 29, 3, 209, 221, 29, 3, 209, 234, 29, 3, 209, 242,
+ 29, 3, 209, 237, 29, 3, 209, 238, 29, 3, 209, 226, 29, 3, 250, 209, 29,
+ 3, 250, 196, 29, 3, 250, 198, 29, 3, 250, 208, 29, 3, 250, 206, 29, 3,
+ 250, 207, 29, 3, 250, 197, 29, 3, 223, 237, 29, 3, 223, 227, 29, 3, 223,
+ 233, 29, 3, 223, 236, 29, 3, 223, 234, 29, 3, 223, 235, 29, 3, 223, 232,
+ 29, 3, 233, 160, 29, 3, 233, 152, 29, 3, 233, 155, 29, 3, 233, 159, 29,
+ 3, 233, 156, 29, 3, 233, 157, 29, 3, 233, 153, 29, 3, 211, 130, 29, 3,
+ 211, 120, 29, 3, 211, 126, 29, 3, 211, 129, 29, 3, 211, 127, 29, 3, 211,
+ 128, 29, 3, 211, 125, 29, 3, 242, 72, 29, 3, 242, 63, 29, 3, 242, 66, 29,
+ 3, 242, 71, 29, 3, 242, 68, 29, 3, 242, 69, 29, 3, 242, 65, 38, 33, 1,
+ 252, 76, 38, 33, 1, 213, 255, 38, 33, 1, 242, 237, 38, 33, 1, 248, 91,
+ 38, 33, 1, 210, 74, 38, 33, 1, 210, 94, 38, 33, 1, 176, 38, 33, 1, 245,
+ 175, 38, 33, 1, 245, 160, 38, 33, 1, 245, 151, 38, 33, 1, 76, 38, 33, 1,
+ 225, 222, 38, 33, 1, 245, 93, 38, 33, 1, 245, 83, 38, 33, 1, 217, 23, 38,
+ 33, 1, 162, 38, 33, 1, 215, 179, 38, 33, 1, 250, 132, 38, 33, 1, 220,
+ 103, 38, 33, 1, 220, 66, 38, 33, 1, 244, 83, 38, 33, 1, 245, 82, 38, 33,
+ 1, 61, 38, 33, 1, 236, 61, 38, 33, 1, 247, 162, 38, 33, 1, 230, 141, 214,
+ 205, 38, 33, 1, 211, 59, 38, 33, 1, 210, 212, 38, 33, 1, 235, 184, 61,
+ 38, 33, 1, 232, 193, 210, 183, 38, 33, 1, 251, 250, 210, 183, 38, 33, 1,
+ 235, 184, 251, 250, 210, 183, 44, 254, 111, 218, 61, 231, 155, 44, 254,
+ 111, 246, 119, 218, 61, 231, 155, 43, 218, 61, 127, 44, 218, 61, 127, 43,
+ 246, 119, 218, 61, 127, 44, 246, 119, 218, 61, 127, 223, 158, 235, 203,
+ 231, 155, 223, 158, 246, 119, 235, 203, 231, 155, 246, 119, 215, 242,
+ 231, 155, 43, 215, 242, 127, 44, 215, 242, 127, 223, 158, 218, 235, 43,
+ 223, 158, 226, 199, 127, 44, 223, 158, 226, 199, 127, 245, 211, 249, 159,
+ 226, 14, 244, 23, 226, 14, 223, 50, 244, 23, 226, 14, 240, 166, 246, 119,
+ 226, 252, 246, 105, 254, 120, 214, 153, 254, 120, 246, 119, 222, 248,
+ 254, 110, 52, 226, 249, 240, 169, 235, 194, 235, 202, 226, 60, 251, 155,
+ 240, 170, 2, 248, 2, 216, 90, 2, 222, 235, 48, 43, 121, 226, 6, 127, 44,
+ 121, 226, 6, 127, 216, 90, 2, 59, 48, 216, 90, 2, 59, 51, 43, 67, 252,
+ 142, 2, 224, 8, 44, 67, 252, 142, 2, 224, 8, 216, 15, 43, 163, 127, 216,
+ 15, 44, 163, 127, 251, 176, 43, 163, 127, 251, 176, 44, 163, 127, 43,
+ 219, 188, 104, 127, 44, 219, 188, 104, 127, 43, 52, 226, 4, 44, 52, 226,
+ 4, 113, 170, 117, 123, 59, 224, 141, 123, 59, 117, 113, 170, 224, 141,
+ 92, 244, 12, 59, 224, 141, 244, 82, 59, 78, 223, 50, 224, 14, 78, 67,
+ 183, 222, 235, 225, 11, 211, 209, 220, 139, 230, 225, 247, 121, 215, 94,
+ 249, 220, 223, 158, 247, 121, 223, 158, 249, 220, 215, 94, 220, 151, 248,
+ 207, 2, 43, 242, 109, 248, 207, 2, 44, 242, 109, 215, 94, 248, 206, 216,
+ 15, 163, 221, 174, 50, 215, 59, 248, 157, 216, 144, 248, 157, 9, 34, 223,
+ 77, 9, 34, 250, 11, 9, 34, 221, 177, 110, 9, 34, 221, 177, 105, 9, 34,
+ 221, 177, 158, 9, 34, 225, 168, 9, 34, 251, 164, 9, 34, 217, 93, 9, 34,
+ 234, 34, 110, 9, 34, 234, 34, 105, 9, 34, 247, 171, 9, 34, 221, 180, 9,
+ 34, 4, 110, 9, 34, 4, 105, 9, 34, 233, 98, 110, 9, 34, 233, 98, 105, 9,
+ 34, 233, 98, 158, 9, 34, 233, 98, 161, 9, 34, 219, 69, 9, 34, 216, 146,
+ 9, 34, 219, 67, 110, 9, 34, 219, 67, 105, 9, 34, 241, 229, 110, 9, 34,
+ 241, 229, 105, 9, 34, 242, 16, 9, 34, 223, 148, 9, 34, 250, 83, 9, 34,
+ 218, 38, 9, 34, 230, 129, 9, 34, 248, 89, 9, 34, 230, 121, 9, 34, 250,
+ 26, 9, 34, 212, 41, 110, 9, 34, 212, 41, 105, 9, 34, 244, 97, 9, 34, 225,
+ 233, 110, 9, 34, 225, 233, 105, 9, 34, 219, 161, 163, 215, 237, 215, 189,
+ 9, 34, 249, 146, 9, 34, 247, 137, 9, 34, 235, 138, 9, 34, 251, 199, 64,
+ 249, 251, 9, 34, 245, 16, 9, 34, 218, 250, 110, 9, 34, 218, 250, 105, 9,
+ 34, 252, 155, 9, 34, 219, 168, 9, 34, 251, 64, 219, 168, 9, 34, 229, 91,
+ 110, 9, 34, 229, 91, 105, 9, 34, 229, 91, 158, 9, 34, 229, 91, 161, 9,
+ 34, 231, 47, 9, 34, 220, 58, 9, 34, 223, 154, 9, 34, 245, 38, 9, 34, 226,
+ 210, 9, 34, 251, 134, 110, 9, 34, 251, 134, 105, 9, 34, 231, 87, 9, 34,
+ 230, 124, 9, 34, 242, 141, 110, 9, 34, 242, 141, 105, 9, 34, 242, 141,
+ 158, 9, 34, 216, 107, 9, 34, 249, 250, 9, 34, 212, 9, 110, 9, 34, 212, 9,
+ 105, 9, 34, 251, 64, 221, 171, 9, 34, 219, 161, 240, 249, 9, 34, 240,
+ 249, 9, 34, 251, 64, 219, 3, 9, 34, 251, 64, 220, 53, 9, 34, 244, 33, 9,
+ 34, 251, 64, 250, 229, 9, 34, 219, 161, 212, 57, 9, 34, 212, 58, 110, 9,
+ 34, 212, 58, 105, 9, 34, 250, 28, 9, 34, 251, 64, 242, 167, 9, 34, 199,
+ 110, 9, 34, 199, 105, 9, 34, 251, 64, 232, 138, 9, 34, 251, 64, 243, 89,
+ 9, 34, 230, 120, 110, 9, 34, 230, 120, 105, 9, 34, 223, 160, 9, 34, 251,
+ 208, 9, 34, 251, 64, 217, 57, 233, 53, 9, 34, 251, 64, 233, 54, 9, 34,
+ 251, 64, 211, 239, 9, 34, 251, 64, 244, 47, 9, 34, 245, 219, 110, 9, 34,
+ 245, 219, 105, 9, 34, 245, 219, 158, 9, 34, 251, 64, 245, 218, 9, 34,
+ 241, 236, 9, 34, 251, 64, 240, 246, 9, 34, 251, 195, 9, 34, 242, 223, 9,
+ 34, 251, 64, 244, 91, 9, 34, 251, 64, 251, 238, 9, 34, 251, 64, 222, 2,
+ 9, 34, 219, 161, 212, 2, 9, 34, 219, 161, 211, 41, 9, 34, 251, 64, 243,
+ 245, 9, 34, 235, 144, 245, 42, 9, 34, 251, 64, 245, 42, 9, 34, 235, 144,
+ 216, 16, 9, 34, 251, 64, 216, 16, 9, 34, 235, 144, 246, 97, 9, 34, 251,
+ 64, 246, 97, 9, 34, 215, 91, 9, 34, 235, 144, 215, 91, 9, 34, 251, 64,
+ 215, 91, 60, 34, 110, 60, 34, 232, 214, 60, 34, 247, 121, 60, 34, 219,
+ 96, 60, 34, 221, 176, 60, 34, 103, 60, 34, 105, 60, 34, 232, 238, 60, 34,
+ 231, 186, 60, 34, 233, 34, 60, 34, 245, 130, 60, 34, 195, 60, 34, 124,
+ 251, 164, 60, 34, 249, 148, 60, 34, 240, 112, 60, 34, 217, 93, 60, 34,
+ 204, 251, 164, 60, 34, 234, 33, 60, 34, 224, 225, 60, 34, 211, 202, 60,
+ 34, 218, 244, 60, 34, 44, 204, 251, 164, 60, 34, 241, 177, 245, 146, 60,
+ 34, 216, 248, 60, 34, 247, 171, 60, 34, 221, 180, 60, 34, 250, 11, 60,
+ 34, 224, 183, 60, 34, 254, 216, 60, 34, 230, 111, 60, 34, 245, 146, 60,
+ 34, 245, 224, 60, 34, 221, 201, 60, 34, 242, 175, 60, 34, 242, 176, 219,
+ 82, 60, 34, 245, 41, 60, 34, 251, 249, 60, 34, 211, 221, 60, 34, 250,
+ 102, 60, 34, 222, 197, 60, 34, 235, 252, 60, 34, 219, 80, 60, 34, 233,
+ 97, 60, 34, 249, 157, 60, 34, 218, 238, 60, 34, 230, 116, 60, 34, 222,
+ 225, 60, 34, 211, 206, 60, 34, 226, 191, 60, 34, 215, 98, 60, 34, 246,
+ 81, 60, 34, 219, 252, 216, 146, 60, 34, 246, 119, 250, 11, 60, 34, 199,
+ 218, 109, 60, 34, 113, 242, 11, 60, 34, 220, 1, 60, 34, 251, 170, 60, 34,
+ 219, 66, 60, 34, 251, 138, 60, 34, 218, 139, 60, 34, 241, 228, 60, 34,
+ 242, 29, 60, 34, 247, 124, 60, 34, 242, 16, 60, 34, 251, 155, 60, 34,
+ 223, 148, 60, 34, 221, 188, 60, 34, 247, 200, 60, 34, 253, 169, 60, 34,
+ 218, 235, 60, 34, 228, 52, 60, 34, 218, 38, 60, 34, 221, 212, 60, 34,
+ 230, 129, 60, 34, 215, 236, 60, 34, 233, 123, 60, 34, 218, 130, 60, 34,
+ 248, 89, 60, 34, 212, 21, 60, 34, 247, 147, 228, 52, 60, 34, 249, 216,
+ 60, 34, 243, 223, 60, 34, 250, 22, 60, 34, 218, 143, 60, 34, 212, 40, 60,
+ 34, 244, 97, 60, 34, 250, 19, 60, 34, 244, 162, 60, 34, 52, 211, 178, 60,
+ 34, 163, 215, 237, 215, 189, 60, 34, 219, 90, 60, 34, 244, 172, 60, 34,
+ 249, 146, 60, 34, 247, 137, 60, 34, 224, 180, 60, 34, 235, 138, 60, 34,
+ 231, 68, 60, 34, 216, 89, 60, 34, 217, 246, 60, 34, 232, 232, 60, 34,
+ 214, 131, 60, 34, 244, 121, 60, 34, 251, 199, 64, 249, 251, 60, 34, 219,
+ 189, 60, 34, 246, 119, 216, 243, 60, 34, 211, 253, 60, 34, 219, 104, 60,
+ 34, 247, 188, 60, 34, 245, 16, 60, 34, 219, 6, 60, 34, 74, 60, 34, 218,
+ 132, 60, 34, 218, 249, 60, 34, 216, 0, 60, 34, 242, 148, 60, 34, 250,
+ 219, 60, 34, 218, 161, 60, 34, 252, 155, 60, 34, 223, 32, 60, 34, 219,
+ 168, 60, 34, 235, 131, 60, 34, 229, 90, 60, 34, 220, 58, 60, 34, 244,
+ 150, 60, 34, 226, 210, 60, 34, 254, 119, 60, 34, 225, 30, 60, 34, 245,
+ 228, 60, 34, 251, 133, 60, 34, 231, 87, 60, 34, 230, 184, 60, 34, 220,
+ 157, 60, 34, 253, 253, 60, 34, 230, 124, 60, 34, 216, 20, 60, 34, 226,
+ 166, 60, 34, 251, 202, 60, 34, 218, 128, 60, 34, 249, 226, 60, 34, 242,
+ 140, 60, 34, 216, 107, 60, 34, 235, 218, 60, 34, 251, 212, 60, 34, 212,
+ 58, 245, 146, 60, 34, 249, 250, 60, 34, 212, 8, 60, 34, 221, 171, 60, 34,
+ 240, 249, 60, 34, 219, 3, 60, 34, 214, 22, 60, 34, 252, 73, 60, 34, 225,
+ 74, 60, 34, 252, 175, 60, 34, 220, 53, 60, 34, 223, 111, 60, 34, 222,
+ 127, 60, 34, 244, 33, 60, 34, 251, 201, 60, 34, 250, 229, 60, 34, 251,
+ 227, 60, 34, 230, 126, 60, 34, 212, 57, 60, 34, 250, 28, 60, 34, 211,
+ 236, 60, 34, 247, 181, 60, 34, 213, 161, 60, 34, 242, 167, 60, 34, 232,
+ 138, 60, 34, 243, 89, 60, 34, 230, 119, 60, 34, 219, 95, 60, 34, 219,
+ 252, 217, 77, 251, 238, 60, 34, 223, 160, 60, 34, 251, 208, 60, 34, 211,
+ 197, 60, 34, 244, 191, 60, 34, 233, 53, 60, 34, 217, 57, 233, 53, 60, 34,
+ 233, 49, 60, 34, 219, 31, 60, 34, 233, 54, 60, 34, 211, 239, 60, 34, 244,
+ 47, 60, 34, 245, 218, 60, 34, 241, 236, 60, 34, 244, 1, 60, 34, 240, 246,
+ 60, 34, 251, 195, 60, 34, 217, 64, 60, 34, 242, 35, 60, 34, 244, 114, 60,
+ 34, 222, 29, 211, 236, 60, 34, 250, 221, 60, 34, 242, 223, 60, 34, 244,
+ 91, 60, 34, 251, 238, 60, 34, 222, 2, 60, 34, 248, 75, 60, 34, 212, 2,
+ 60, 34, 241, 211, 60, 34, 211, 41, 60, 34, 230, 193, 60, 34, 251, 222,
+ 60, 34, 245, 156, 60, 34, 243, 245, 60, 34, 215, 210, 60, 34, 246, 83,
+ 60, 34, 223, 142, 60, 34, 228, 54, 60, 34, 245, 42, 60, 34, 216, 16, 60,
+ 34, 246, 97, 60, 34, 215, 91, 60, 34, 244, 49, 109, 248, 38, 135, 43,
+ 216, 43, 222, 252, 109, 248, 38, 135, 77, 216, 43, 51, 109, 248, 38, 135,
+ 43, 216, 43, 230, 225, 22, 222, 252, 109, 248, 38, 135, 77, 216, 43, 230,
+ 225, 22, 51, 109, 248, 38, 135, 243, 230, 218, 11, 109, 248, 38, 135,
+ 218, 12, 243, 244, 48, 109, 248, 38, 135, 218, 12, 243, 244, 51, 109,
+ 248, 38, 135, 218, 12, 243, 244, 233, 47, 109, 248, 38, 135, 218, 12,
+ 243, 244, 214, 160, 233, 47, 109, 248, 38, 135, 218, 12, 243, 244, 214,
+ 160, 222, 252, 109, 248, 38, 135, 218, 12, 243, 244, 232, 109, 233, 47,
+ 109, 248, 38, 135, 226, 123, 109, 219, 19, 109, 249, 220, 109, 243, 230,
+ 218, 130, 247, 178, 78, 235, 132, 235, 237, 218, 160, 87, 109, 235, 159,
+ 78, 109, 249, 253, 78, 109, 54, 210, 86, 43, 254, 111, 127, 44, 254, 111,
+ 127, 43, 52, 254, 111, 127, 44, 52, 254, 111, 127, 43, 249, 162, 127, 44,
+ 249, 162, 127, 43, 71, 249, 162, 127, 44, 71, 249, 162, 127, 43, 85, 233,
+ 21, 127, 44, 85, 233, 21, 127, 224, 238, 78, 243, 33, 78, 43, 216, 7,
+ 220, 54, 127, 44, 216, 7, 220, 54, 127, 43, 71, 233, 21, 127, 44, 71,
+ 233, 21, 127, 43, 71, 216, 7, 220, 54, 127, 44, 71, 216, 7, 220, 54, 127,
+ 43, 71, 42, 127, 44, 71, 42, 127, 212, 36, 248, 157, 223, 50, 52, 224,
+ 192, 223, 255, 78, 52, 224, 192, 223, 255, 78, 121, 52, 224, 192, 223,
+ 255, 78, 224, 238, 164, 244, 191, 242, 9, 227, 199, 110, 242, 9, 227,
+ 199, 105, 242, 9, 227, 199, 158, 242, 9, 227, 199, 161, 242, 9, 227, 199,
+ 189, 242, 9, 227, 199, 194, 242, 9, 227, 199, 198, 242, 9, 227, 199, 195,
+ 242, 9, 227, 199, 200, 109, 233, 4, 138, 78, 109, 222, 229, 138, 78, 109,
+ 248, 45, 138, 78, 109, 245, 129, 138, 78, 24, 219, 156, 59, 138, 78, 24,
+ 52, 59, 138, 78, 212, 32, 248, 157, 67, 234, 234, 223, 78, 78, 67, 234,
+ 234, 223, 78, 2, 213, 135, 219, 32, 78, 67, 234, 234, 223, 78, 164, 214,
+ 160, 242, 28, 67, 234, 234, 223, 78, 2, 213, 135, 219, 32, 164, 214, 160,
+ 242, 28, 67, 234, 234, 223, 78, 164, 232, 109, 242, 28, 37, 224, 238, 78,
+ 109, 217, 4, 232, 215, 244, 147, 220, 139, 87, 242, 9, 227, 199, 216,
+ 248, 242, 9, 227, 199, 215, 73, 242, 9, 227, 199, 216, 163, 67, 109, 235,
+ 159, 78, 231, 141, 78, 226, 0, 254, 141, 78, 109, 45, 235, 239, 109, 163,
+ 244, 107, 219, 19, 141, 1, 4, 61, 141, 1, 61, 141, 1, 4, 73, 141, 1, 73,
+ 141, 1, 4, 70, 141, 1, 70, 141, 1, 4, 75, 141, 1, 75, 141, 1, 4, 76, 141,
+ 1, 76, 141, 1, 176, 141, 1, 243, 136, 141, 1, 234, 93, 141, 1, 242, 215,
+ 141, 1, 233, 218, 141, 1, 242, 114, 141, 1, 234, 183, 141, 1, 243, 63,
+ 141, 1, 234, 29, 141, 1, 242, 175, 141, 1, 206, 141, 1, 210, 116, 141, 1,
+ 219, 192, 141, 1, 210, 44, 141, 1, 218, 84, 141, 1, 210, 13, 141, 1, 221,
+ 182, 141, 1, 210, 94, 141, 1, 219, 59, 141, 1, 210, 23, 141, 1, 217, 106,
+ 141, 1, 248, 222, 141, 1, 216, 118, 141, 1, 248, 4, 141, 1, 4, 215, 119,
+ 141, 1, 215, 119, 141, 1, 246, 79, 141, 1, 217, 23, 141, 1, 248, 91, 141,
+ 1, 111, 141, 1, 247, 146, 141, 1, 197, 141, 1, 228, 234, 141, 1, 227,
+ 238, 141, 1, 229, 108, 141, 1, 228, 75, 141, 1, 162, 141, 1, 252, 192,
+ 141, 1, 190, 141, 1, 241, 181, 141, 1, 252, 7, 141, 1, 225, 109, 141, 1,
+ 240, 223, 141, 1, 251, 126, 141, 1, 224, 151, 141, 1, 241, 239, 141, 1,
+ 252, 76, 141, 1, 225, 222, 141, 1, 241, 69, 141, 1, 251, 206, 141, 1,
+ 225, 17, 141, 1, 185, 141, 1, 230, 231, 141, 1, 230, 103, 141, 1, 231,
+ 92, 141, 1, 230, 162, 141, 1, 4, 191, 141, 1, 191, 141, 1, 4, 210, 212,
+ 141, 1, 210, 212, 141, 1, 4, 210, 244, 141, 1, 210, 244, 141, 1, 205,
+ 141, 1, 223, 36, 141, 1, 222, 141, 141, 1, 223, 129, 141, 1, 222, 212,
+ 141, 1, 4, 212, 65, 141, 1, 212, 65, 141, 1, 211, 250, 141, 1, 212, 22,
+ 141, 1, 211, 227, 141, 1, 230, 26, 141, 1, 212, 116, 141, 1, 4, 176, 141,
+ 1, 4, 234, 183, 38, 234, 202, 213, 135, 219, 32, 78, 38, 234, 202, 220,
+ 156, 219, 32, 78, 234, 202, 213, 135, 219, 32, 78, 234, 202, 220, 156,
+ 219, 32, 78, 141, 235, 159, 78, 141, 213, 135, 235, 159, 78, 141, 247,
+ 222, 210, 225, 234, 202, 52, 240, 169, 56, 1, 4, 61, 56, 1, 61, 56, 1, 4,
+ 73, 56, 1, 73, 56, 1, 4, 70, 56, 1, 70, 56, 1, 4, 75, 56, 1, 75, 56, 1,
+ 4, 76, 56, 1, 76, 56, 1, 176, 56, 1, 243, 136, 56, 1, 234, 93, 56, 1,
+ 242, 215, 56, 1, 233, 218, 56, 1, 242, 114, 56, 1, 234, 183, 56, 1, 243,
+ 63, 56, 1, 234, 29, 56, 1, 242, 175, 56, 1, 206, 56, 1, 210, 116, 56, 1,
+ 219, 192, 56, 1, 210, 44, 56, 1, 218, 84, 56, 1, 210, 13, 56, 1, 221,
+ 182, 56, 1, 210, 94, 56, 1, 219, 59, 56, 1, 210, 23, 56, 1, 217, 106, 56,
+ 1, 248, 222, 56, 1, 216, 118, 56, 1, 248, 4, 56, 1, 4, 215, 119, 56, 1,
+ 215, 119, 56, 1, 246, 79, 56, 1, 217, 23, 56, 1, 248, 91, 56, 1, 111, 56,
+ 1, 247, 146, 56, 1, 197, 56, 1, 228, 234, 56, 1, 227, 238, 56, 1, 229,
+ 108, 56, 1, 228, 75, 56, 1, 162, 56, 1, 252, 192, 56, 1, 190, 56, 1, 241,
+ 181, 56, 1, 252, 7, 56, 1, 225, 109, 56, 1, 240, 223, 56, 1, 251, 126,
+ 56, 1, 224, 151, 56, 1, 241, 239, 56, 1, 252, 76, 56, 1, 225, 222, 56, 1,
+ 241, 69, 56, 1, 251, 206, 56, 1, 225, 17, 56, 1, 185, 56, 1, 230, 231,
+ 56, 1, 230, 103, 56, 1, 231, 92, 56, 1, 230, 162, 56, 1, 4, 191, 56, 1,
+ 191, 56, 1, 4, 210, 212, 56, 1, 210, 212, 56, 1, 4, 210, 244, 56, 1, 210,
+ 244, 56, 1, 205, 56, 1, 223, 36, 56, 1, 222, 141, 56, 1, 223, 129, 56, 1,
+ 222, 212, 56, 1, 4, 212, 65, 56, 1, 212, 65, 56, 1, 211, 250, 56, 1, 212,
+ 22, 56, 1, 211, 227, 56, 1, 230, 26, 56, 1, 212, 116, 56, 1, 4, 176, 56,
+ 1, 4, 234, 183, 56, 1, 214, 27, 56, 1, 213, 176, 56, 1, 213, 255, 56, 1,
+ 213, 138, 56, 230, 225, 247, 121, 234, 202, 224, 174, 219, 32, 78, 56,
+ 235, 159, 78, 56, 213, 135, 235, 159, 78, 56, 247, 222, 234, 0, 251, 185,
+ 1, 253, 159, 251, 185, 1, 226, 106, 251, 185, 1, 193, 251, 185, 1, 245,
+ 7, 251, 185, 1, 249, 61, 251, 185, 1, 217, 153, 251, 185, 1, 230, 26,
+ 251, 185, 1, 156, 251, 185, 1, 243, 203, 251, 185, 1, 235, 24, 251, 185,
+ 1, 242, 61, 251, 185, 1, 235, 145, 251, 185, 1, 224, 97, 251, 185, 1,
+ 211, 178, 251, 185, 1, 210, 83, 251, 185, 1, 250, 159, 251, 185, 1, 220,
+ 105, 251, 185, 1, 153, 251, 185, 1, 210, 159, 251, 185, 1, 251, 67, 251,
+ 185, 1, 222, 92, 251, 185, 1, 61, 251, 185, 1, 76, 251, 185, 1, 75, 251,
+ 185, 1, 245, 198, 251, 185, 1, 254, 202, 251, 185, 1, 245, 196, 251, 185,
+ 1, 253, 193, 251, 185, 1, 226, 135, 251, 185, 1, 254, 124, 251, 185, 1,
+ 245, 151, 251, 185, 1, 254, 116, 251, 185, 1, 245, 139, 251, 185, 1, 245,
+ 93, 251, 185, 1, 73, 251, 185, 1, 70, 251, 185, 1, 235, 157, 251, 185, 1,
+ 214, 105, 251, 185, 1, 229, 80, 251, 185, 1, 242, 179, 251, 185, 1, 236,
+ 35, 24, 1, 234, 59, 24, 1, 218, 216, 24, 1, 234, 52, 24, 1, 228, 227, 24,
+ 1, 228, 225, 24, 1, 228, 224, 24, 1, 216, 102, 24, 1, 218, 205, 24, 1,
+ 223, 27, 24, 1, 223, 22, 24, 1, 223, 19, 24, 1, 223, 12, 24, 1, 223, 7,
+ 24, 1, 223, 2, 24, 1, 223, 13, 24, 1, 223, 25, 24, 1, 230, 218, 24, 1,
+ 225, 96, 24, 1, 218, 213, 24, 1, 225, 85, 24, 1, 219, 149, 24, 1, 218,
+ 210, 24, 1, 236, 57, 24, 1, 250, 47, 24, 1, 218, 220, 24, 1, 250, 107,
+ 24, 1, 234, 111, 24, 1, 216, 174, 24, 1, 225, 132, 24, 1, 241, 173, 24,
+ 1, 61, 24, 1, 254, 244, 24, 1, 191, 24, 1, 211, 92, 24, 1, 245, 118, 24,
+ 1, 75, 24, 1, 211, 36, 24, 1, 211, 47, 24, 1, 76, 24, 1, 212, 65, 24, 1,
+ 212, 62, 24, 1, 226, 235, 24, 1, 210, 244, 24, 1, 70, 24, 1, 212, 11, 24,
+ 1, 212, 22, 24, 1, 211, 250, 24, 1, 210, 212, 24, 1, 245, 56, 24, 1, 211,
+ 8, 24, 1, 73, 24, 244, 104, 24, 1, 218, 214, 24, 1, 228, 217, 24, 1, 228,
+ 219, 24, 1, 228, 222, 24, 1, 223, 20, 24, 1, 223, 1, 24, 1, 223, 9, 24,
+ 1, 223, 14, 24, 1, 222, 255, 24, 1, 230, 211, 24, 1, 230, 208, 24, 1,
+ 230, 212, 24, 1, 234, 222, 24, 1, 225, 91, 24, 1, 225, 77, 24, 1, 225,
+ 83, 24, 1, 225, 80, 24, 1, 225, 94, 24, 1, 225, 78, 24, 1, 234, 220, 24,
+ 1, 234, 218, 24, 1, 219, 142, 24, 1, 219, 140, 24, 1, 219, 132, 24, 1,
+ 219, 137, 24, 1, 219, 147, 24, 1, 226, 33, 24, 1, 218, 217, 24, 1, 211,
+ 26, 24, 1, 211, 22, 24, 1, 211, 23, 24, 1, 234, 221, 24, 1, 218, 218, 24,
1, 211, 32, 24, 1, 210, 238, 24, 1, 210, 237, 24, 1, 210, 240, 24, 1,
- 210, 203, 24, 1, 210, 204, 24, 1, 210, 207, 24, 1, 254, 34, 24, 1, 254,
- 28, 109, 254, 99, 232, 203, 78, 109, 254, 99, 223, 50, 78, 109, 254, 99,
- 123, 78, 109, 254, 99, 113, 78, 109, 254, 99, 134, 78, 109, 254, 99, 244,
- 11, 78, 109, 254, 99, 216, 14, 78, 109, 254, 99, 230, 224, 78, 109, 254,
- 99, 251, 175, 78, 109, 254, 99, 244, 92, 78, 109, 254, 99, 221, 176, 78,
- 109, 254, 99, 216, 169, 78, 109, 254, 99, 244, 4, 78, 109, 254, 99, 241,
- 224, 78, 109, 254, 99, 245, 224, 78, 109, 254, 99, 231, 186, 78, 251,
- 184, 1, 251, 125, 251, 184, 1, 210, 44, 251, 184, 1, 235, 108, 251, 184,
- 1, 242, 113, 251, 184, 1, 245, 209, 251, 184, 1, 245, 135, 251, 184, 1,
- 226, 183, 251, 184, 1, 226, 187, 251, 184, 1, 235, 179, 251, 184, 1, 254,
- 101, 251, 184, 1, 235, 224, 251, 184, 1, 214, 168, 251, 184, 1, 236, 16,
- 251, 184, 1, 229, 57, 251, 184, 1, 254, 195, 251, 184, 1, 253, 187, 251,
- 184, 1, 254, 136, 251, 184, 1, 226, 204, 251, 184, 1, 226, 189, 251, 184,
- 1, 235, 221, 251, 184, 40, 1, 226, 105, 251, 184, 40, 1, 217, 152, 251,
- 184, 40, 1, 235, 23, 251, 184, 40, 1, 242, 60, 251, 184, 1, 242, 250,
- 251, 184, 1, 232, 255, 251, 184, 1, 209, 250, 9, 218, 103, 217, 152, 9,
- 218, 103, 212, 4, 9, 218, 103, 211, 158, 9, 218, 103, 251, 79, 9, 218,
- 103, 217, 254, 9, 218, 103, 240, 158, 9, 218, 103, 240, 162, 9, 218, 103,
- 240, 231, 9, 218, 103, 240, 159, 9, 218, 103, 217, 155, 9, 218, 103, 240,
- 161, 9, 218, 103, 240, 157, 9, 218, 103, 240, 229, 9, 218, 103, 240, 160,
- 9, 218, 103, 240, 156, 9, 218, 103, 230, 25, 9, 218, 103, 242, 60, 9,
- 218, 103, 222, 91, 9, 218, 103, 226, 105, 9, 218, 103, 219, 21, 9, 218,
- 103, 249, 60, 9, 218, 103, 240, 163, 9, 218, 103, 241, 190, 9, 218, 103,
- 217, 164, 9, 218, 103, 217, 233, 9, 218, 103, 218, 168, 9, 218, 103, 220,
- 110, 9, 218, 103, 225, 224, 9, 218, 103, 224, 98, 9, 218, 103, 216, 43,
- 9, 218, 103, 217, 154, 9, 218, 103, 217, 244, 9, 218, 103, 240, 170, 9,
- 218, 103, 240, 155, 9, 218, 103, 225, 149, 9, 218, 103, 224, 96, 56, 1,
- 4, 233, 217, 56, 1, 4, 219, 191, 56, 1, 4, 218, 83, 56, 1, 4, 111, 56, 1,
- 4, 227, 237, 56, 1, 4, 162, 56, 1, 4, 241, 180, 56, 1, 4, 240, 222, 56,
- 1, 4, 241, 238, 56, 1, 4, 241, 68, 56, 1, 4, 230, 102, 56, 1, 4, 205, 56,
- 1, 4, 223, 35, 56, 1, 4, 222, 140, 56, 1, 4, 223, 128, 56, 1, 4, 222,
- 211, 88, 24, 234, 58, 88, 24, 228, 226, 88, 24, 216, 101, 88, 24, 223,
- 26, 88, 24, 230, 217, 88, 24, 225, 95, 88, 24, 219, 148, 88, 24, 236, 56,
- 88, 24, 250, 46, 88, 24, 250, 106, 88, 24, 234, 110, 88, 24, 216, 173,
- 88, 24, 225, 131, 88, 24, 241, 172, 88, 24, 234, 59, 61, 88, 24, 228,
- 227, 61, 88, 24, 216, 102, 61, 88, 24, 223, 27, 61, 88, 24, 230, 218, 61,
- 88, 24, 225, 96, 61, 88, 24, 219, 149, 61, 88, 24, 236, 57, 61, 88, 24,
- 250, 47, 61, 88, 24, 250, 107, 61, 88, 24, 234, 111, 61, 88, 24, 216,
- 174, 61, 88, 24, 225, 132, 61, 88, 24, 241, 173, 61, 88, 24, 250, 47, 70,
- 88, 234, 3, 135, 226, 217, 88, 234, 3, 135, 144, 240, 222, 88, 154, 110,
- 88, 154, 105, 88, 154, 158, 88, 154, 161, 88, 154, 189, 88, 154, 194, 88,
- 154, 198, 88, 154, 195, 88, 154, 200, 88, 154, 216, 247, 88, 154, 230,
- 128, 88, 154, 244, 96, 88, 154, 212, 40, 88, 154, 211, 214, 88, 154, 231,
- 39, 88, 154, 245, 223, 88, 154, 218, 37, 88, 154, 218, 132, 88, 154, 241,
- 244, 88, 154, 219, 54, 88, 154, 229, 204, 88, 154, 219, 4, 88, 154, 244,
- 102, 88, 154, 249, 200, 88, 154, 233, 125, 88, 154, 223, 71, 88, 154,
- 251, 15, 88, 154, 218, 87, 88, 154, 218, 20, 88, 154, 245, 127, 88, 154,
- 223, 63, 88, 154, 254, 150, 88, 154, 244, 128, 88, 154, 223, 61, 88, 154,
- 220, 156, 88, 154, 223, 127, 37, 154, 224, 12, 37, 154, 234, 80, 37, 154,
- 221, 198, 37, 154, 233, 255, 37, 54, 216, 248, 226, 197, 85, 218, 234,
- 37, 54, 215, 74, 226, 197, 85, 218, 234, 37, 54, 216, 163, 226, 197, 85,
- 218, 234, 37, 54, 244, 16, 226, 197, 85, 218, 234, 37, 54, 244, 115, 226,
- 197, 85, 218, 234, 37, 54, 219, 112, 226, 197, 85, 218, 234, 37, 54, 220,
- 117, 226, 197, 85, 218, 234, 37, 54, 245, 185, 226, 197, 85, 218, 234,
- 225, 251, 50, 37, 54, 215, 74, 110, 37, 54, 215, 74, 105, 37, 54, 215,
- 74, 158, 37, 54, 215, 74, 161, 37, 54, 215, 74, 189, 37, 54, 215, 74,
- 194, 37, 54, 215, 74, 198, 37, 54, 215, 74, 195, 37, 54, 215, 74, 200,
- 37, 54, 216, 162, 37, 54, 216, 163, 110, 37, 54, 216, 163, 105, 37, 54,
- 216, 163, 158, 37, 54, 216, 163, 161, 37, 54, 216, 163, 189, 37, 24, 234,
- 58, 37, 24, 228, 226, 37, 24, 216, 101, 37, 24, 223, 26, 37, 24, 230,
- 217, 37, 24, 225, 95, 37, 24, 219, 148, 37, 24, 236, 56, 37, 24, 250, 46,
- 37, 24, 250, 106, 37, 24, 234, 110, 37, 24, 216, 173, 37, 24, 225, 131,
- 37, 24, 241, 172, 37, 24, 234, 59, 61, 37, 24, 228, 227, 61, 37, 24, 216,
- 102, 61, 37, 24, 223, 27, 61, 37, 24, 230, 218, 61, 37, 24, 225, 96, 61,
- 37, 24, 219, 149, 61, 37, 24, 236, 57, 61, 37, 24, 250, 47, 61, 37, 24,
- 250, 107, 61, 37, 24, 234, 111, 61, 37, 24, 216, 174, 61, 37, 24, 225,
- 132, 61, 37, 24, 241, 173, 61, 37, 234, 3, 135, 250, 148, 37, 234, 3,
- 135, 235, 47, 37, 24, 236, 57, 70, 234, 3, 218, 159, 87, 37, 154, 110,
- 37, 154, 105, 37, 154, 158, 37, 154, 161, 37, 154, 189, 37, 154, 194, 37,
- 154, 198, 37, 154, 195, 37, 154, 200, 37, 154, 216, 247, 37, 154, 230,
- 128, 37, 154, 244, 96, 37, 154, 212, 40, 37, 154, 211, 214, 37, 154, 231,
- 39, 37, 154, 245, 223, 37, 154, 218, 37, 37, 154, 218, 132, 37, 154, 241,
- 244, 37, 154, 219, 54, 37, 154, 229, 204, 37, 154, 219, 4, 37, 154, 244,
- 102, 37, 154, 249, 200, 37, 154, 233, 125, 37, 154, 221, 174, 37, 154,
- 231, 189, 37, 154, 244, 137, 37, 154, 218, 49, 37, 154, 245, 34, 37, 154,
- 224, 187, 37, 154, 253, 196, 37, 154, 235, 159, 37, 154, 223, 61, 37,
- 154, 249, 164, 37, 154, 249, 155, 37, 154, 241, 165, 37, 154, 250, 174,
- 37, 154, 232, 110, 37, 154, 233, 46, 37, 154, 222, 251, 37, 154, 231, 83,
- 37, 154, 223, 87, 37, 154, 218, 87, 37, 154, 218, 20, 37, 154, 245, 127,
- 37, 154, 223, 63, 37, 154, 254, 150, 37, 154, 228, 212, 37, 54, 216, 163,
- 194, 37, 54, 216, 163, 198, 37, 54, 216, 163, 195, 37, 54, 216, 163, 200,
- 37, 54, 244, 15, 37, 54, 244, 16, 110, 37, 54, 244, 16, 105, 37, 54, 244,
- 16, 158, 37, 54, 244, 16, 161, 37, 54, 244, 16, 189, 37, 54, 244, 16,
- 194, 37, 54, 244, 16, 198, 37, 54, 244, 16, 195, 37, 54, 244, 16, 200,
- 37, 54, 244, 114, 109, 217, 3, 16, 31, 235, 133, 109, 217, 3, 16, 31,
- 244, 148, 109, 217, 3, 16, 31, 231, 160, 109, 217, 3, 16, 31, 254, 47,
- 109, 217, 3, 16, 31, 231, 132, 109, 217, 3, 16, 31, 235, 45, 109, 217, 3,
- 16, 31, 235, 46, 109, 217, 3, 16, 31, 253, 188, 109, 217, 3, 16, 31, 220,
- 136, 109, 217, 3, 16, 31, 226, 239, 109, 217, 3, 16, 31, 228, 40, 109,
- 217, 3, 16, 31, 248, 85, 42, 241, 190, 42, 245, 88, 42, 245, 43, 232,
- 219, 232, 240, 50, 37, 56, 61, 37, 56, 73, 37, 56, 70, 37, 56, 75, 37,
- 56, 76, 37, 56, 176, 37, 56, 234, 92, 37, 56, 233, 217, 37, 56, 234, 182,
- 37, 56, 234, 28, 37, 56, 206, 37, 56, 219, 191, 37, 56, 218, 83, 37, 56,
- 221, 181, 37, 56, 219, 58, 37, 56, 217, 105, 37, 56, 216, 117, 37, 56,
- 215, 118, 37, 56, 217, 22, 37, 56, 111, 37, 56, 197, 37, 56, 228, 233,
- 37, 56, 227, 237, 37, 56, 229, 107, 37, 56, 228, 74, 37, 56, 162, 37, 56,
- 241, 180, 37, 56, 240, 222, 37, 56, 241, 238, 37, 56, 241, 68, 37, 56,
- 184, 37, 56, 230, 230, 37, 56, 230, 102, 37, 56, 231, 91, 37, 56, 230,
- 161, 37, 56, 191, 37, 56, 210, 212, 37, 56, 210, 244, 37, 56, 205, 37,
- 56, 223, 35, 37, 56, 222, 140, 37, 56, 223, 128, 37, 56, 222, 211, 37,
- 56, 212, 65, 37, 56, 211, 250, 37, 56, 212, 22, 37, 56, 211, 227, 42,
- 254, 71, 42, 253, 239, 42, 254, 95, 42, 255, 31, 42, 235, 226, 42, 235,
- 196, 42, 214, 166, 42, 245, 66, 42, 245, 206, 42, 226, 186, 42, 226, 180,
- 42, 234, 245, 42, 234, 214, 42, 234, 211, 42, 243, 92, 42, 243, 101, 42,
- 242, 204, 42, 242, 200, 42, 233, 150, 42, 242, 193, 42, 234, 72, 42, 234,
- 71, 42, 234, 70, 42, 234, 69, 42, 242, 86, 42, 242, 85, 42, 233, 193, 42,
- 233, 195, 42, 234, 178, 42, 234, 1, 42, 234, 8, 42, 222, 16, 42, 221,
- 237, 42, 219, 129, 42, 220, 141, 42, 220, 140, 42, 248, 218, 42, 248, 36,
- 42, 247, 121, 42, 216, 32, 42, 229, 200, 42, 228, 41, 42, 242, 32, 42,
- 226, 84, 42, 226, 83, 42, 252, 188, 42, 225, 105, 42, 225, 69, 42, 225,
- 70, 42, 251, 234, 42, 240, 221, 42, 240, 217, 42, 251, 91, 42, 240, 204,
- 42, 241, 215, 42, 225, 159, 42, 225, 194, 42, 241, 198, 42, 225, 191, 42,
- 225, 207, 42, 252, 61, 42, 225, 6, 42, 251, 180, 42, 241, 56, 42, 224,
- 250, 42, 241, 48, 42, 241, 50, 42, 231, 201, 42, 231, 197, 42, 231, 206,
- 42, 231, 150, 42, 231, 175, 42, 230, 197, 42, 230, 176, 42, 230, 175, 42,
- 231, 74, 42, 231, 71, 42, 231, 75, 42, 211, 102, 42, 211, 100, 42, 210,
- 201, 42, 222, 226, 42, 222, 230, 42, 222, 117, 42, 222, 111, 42, 223, 85,
- 42, 223, 82, 42, 212, 38, 109, 217, 3, 16, 31, 240, 239, 210, 86, 109,
- 217, 3, 16, 31, 240, 239, 110, 109, 217, 3, 16, 31, 240, 239, 105, 109,
- 217, 3, 16, 31, 240, 239, 158, 109, 217, 3, 16, 31, 240, 239, 161, 109,
- 217, 3, 16, 31, 240, 239, 189, 109, 217, 3, 16, 31, 240, 239, 194, 109,
- 217, 3, 16, 31, 240, 239, 198, 109, 217, 3, 16, 31, 240, 239, 195, 109,
- 217, 3, 16, 31, 240, 239, 200, 109, 217, 3, 16, 31, 240, 239, 216, 247,
- 109, 217, 3, 16, 31, 240, 239, 245, 167, 109, 217, 3, 16, 31, 240, 239,
- 215, 76, 109, 217, 3, 16, 31, 240, 239, 216, 164, 109, 217, 3, 16, 31,
- 240, 239, 244, 5, 109, 217, 3, 16, 31, 240, 239, 244, 118, 109, 217, 3,
- 16, 31, 240, 239, 219, 119, 109, 217, 3, 16, 31, 240, 239, 220, 119, 109,
- 217, 3, 16, 31, 240, 239, 245, 190, 109, 217, 3, 16, 31, 240, 239, 228,
- 197, 109, 217, 3, 16, 31, 240, 239, 215, 73, 109, 217, 3, 16, 31, 240,
- 239, 215, 67, 109, 217, 3, 16, 31, 240, 239, 215, 63, 109, 217, 3, 16,
- 31, 240, 239, 215, 64, 109, 217, 3, 16, 31, 240, 239, 215, 69, 42, 240,
- 230, 42, 248, 221, 42, 253, 192, 42, 130, 42, 226, 125, 42, 225, 225, 42,
- 247, 147, 42, 247, 148, 218, 233, 42, 247, 148, 249, 108, 42, 235, 156,
- 42, 245, 91, 229, 205, 241, 216, 42, 245, 91, 229, 205, 217, 174, 42,
- 245, 91, 229, 205, 217, 74, 42, 245, 91, 229, 205, 231, 70, 42, 249, 157,
- 42, 226, 90, 254, 125, 42, 197, 42, 230, 103, 61, 42, 184, 42, 176, 42,
- 234, 185, 42, 231, 129, 42, 243, 80, 42, 251, 18, 42, 234, 184, 42, 225,
- 150, 42, 229, 81, 42, 230, 103, 245, 6, 42, 230, 103, 243, 202, 42, 231,
- 15, 42, 234, 134, 42, 240, 163, 42, 234, 94, 42, 230, 232, 42, 242, 216,
- 42, 216, 119, 42, 230, 103, 156, 42, 230, 169, 42, 247, 157, 42, 234, 40,
- 42, 244, 45, 42, 228, 112, 42, 230, 103, 193, 42, 230, 166, 42, 249, 239,
- 42, 234, 34, 42, 230, 167, 218, 233, 42, 249, 240, 218, 233, 42, 232, 50,
- 218, 233, 42, 234, 35, 218, 233, 42, 230, 167, 249, 108, 42, 249, 240,
- 249, 108, 42, 232, 50, 249, 108, 42, 234, 35, 249, 108, 42, 232, 50, 117,
- 222, 91, 42, 232, 50, 117, 222, 92, 218, 233, 42, 190, 42, 233, 251, 42,
- 230, 105, 42, 242, 151, 42, 223, 176, 42, 223, 177, 117, 222, 91, 42,
- 223, 177, 117, 222, 92, 218, 233, 42, 224, 162, 42, 228, 13, 42, 230,
- 103, 222, 91, 42, 230, 104, 42, 224, 116, 42, 227, 176, 42, 230, 103,
- 214, 105, 42, 230, 49, 42, 233, 185, 42, 230, 50, 231, 74, 42, 224, 115,
- 42, 227, 175, 42, 230, 103, 212, 98, 42, 230, 43, 42, 233, 183, 42, 230,
- 44, 231, 74, 42, 235, 24, 226, 220, 42, 232, 50, 226, 220, 42, 254, 136,
- 42, 251, 160, 42, 250, 214, 42, 250, 191, 42, 251, 67, 117, 234, 134, 42,
- 249, 238, 42, 248, 142, 42, 242, 72, 42, 162, 42, 240, 231, 42, 235, 255,
- 42, 234, 47, 42, 234, 35, 250, 250, 42, 233, 219, 42, 232, 159, 42, 232,
- 158, 42, 232, 147, 42, 232, 63, 42, 231, 130, 219, 79, 42, 230, 196, 42,
- 230, 152, 42, 225, 148, 42, 225, 19, 42, 224, 219, 42, 224, 217, 42, 218,
- 227, 42, 218, 2, 42, 212, 24, 42, 214, 106, 117, 193, 42, 115, 117, 193,
- 109, 217, 3, 16, 31, 248, 146, 110, 109, 217, 3, 16, 31, 248, 146, 105,
- 109, 217, 3, 16, 31, 248, 146, 158, 109, 217, 3, 16, 31, 248, 146, 161,
- 109, 217, 3, 16, 31, 248, 146, 189, 109, 217, 3, 16, 31, 248, 146, 194,
- 109, 217, 3, 16, 31, 248, 146, 198, 109, 217, 3, 16, 31, 248, 146, 195,
- 109, 217, 3, 16, 31, 248, 146, 200, 109, 217, 3, 16, 31, 248, 146, 216,
- 247, 109, 217, 3, 16, 31, 248, 146, 245, 167, 109, 217, 3, 16, 31, 248,
- 146, 215, 76, 109, 217, 3, 16, 31, 248, 146, 216, 164, 109, 217, 3, 16,
- 31, 248, 146, 244, 5, 109, 217, 3, 16, 31, 248, 146, 244, 118, 109, 217,
- 3, 16, 31, 248, 146, 219, 119, 109, 217, 3, 16, 31, 248, 146, 220, 119,
- 109, 217, 3, 16, 31, 248, 146, 245, 190, 109, 217, 3, 16, 31, 248, 146,
- 228, 197, 109, 217, 3, 16, 31, 248, 146, 215, 73, 109, 217, 3, 16, 31,
- 248, 146, 215, 67, 109, 217, 3, 16, 31, 248, 146, 215, 63, 109, 217, 3,
- 16, 31, 248, 146, 215, 64, 109, 217, 3, 16, 31, 248, 146, 215, 69, 109,
- 217, 3, 16, 31, 248, 146, 215, 70, 109, 217, 3, 16, 31, 248, 146, 215,
- 65, 109, 217, 3, 16, 31, 248, 146, 215, 66, 109, 217, 3, 16, 31, 248,
- 146, 215, 72, 109, 217, 3, 16, 31, 248, 146, 215, 68, 109, 217, 3, 16,
- 31, 248, 146, 216, 162, 109, 217, 3, 16, 31, 248, 146, 216, 161, 42, 243,
- 118, 241, 192, 31, 216, 196, 249, 140, 241, 223, 241, 192, 31, 216, 196,
- 223, 122, 245, 223, 241, 192, 31, 247, 231, 253, 207, 216, 196, 252, 56,
- 241, 192, 31, 210, 223, 244, 38, 241, 192, 31, 212, 59, 241, 192, 31,
- 249, 203, 241, 192, 31, 216, 196, 254, 3, 241, 192, 31, 241, 60, 216, 38,
- 241, 192, 31, 4, 217, 61, 241, 192, 31, 215, 237, 241, 192, 31, 225, 219,
- 241, 192, 31, 218, 158, 241, 192, 31, 244, 139, 241, 192, 31, 242, 132,
- 224, 240, 241, 192, 31, 230, 155, 241, 192, 31, 245, 126, 241, 192, 31,
- 244, 39, 241, 192, 31, 211, 207, 226, 197, 216, 196, 248, 86, 241, 192,
- 31, 254, 51, 241, 192, 31, 249, 185, 241, 192, 31, 251, 227, 216, 138,
- 241, 192, 31, 242, 149, 241, 192, 31, 218, 245, 254, 70, 241, 192, 31,
- 223, 53, 241, 192, 31, 235, 220, 241, 192, 31, 242, 132, 217, 61, 241,
- 192, 31, 230, 111, 249, 159, 241, 192, 31, 242, 132, 224, 197, 241, 192,
- 31, 216, 196, 255, 18, 212, 40, 241, 192, 31, 216, 196, 250, 8, 244, 96,
- 241, 192, 31, 235, 233, 241, 192, 31, 246, 57, 241, 192, 31, 223, 56,
- 241, 192, 31, 242, 132, 224, 224, 241, 192, 31, 224, 177, 241, 192, 31,
- 248, 161, 64, 216, 196, 232, 230, 241, 192, 31, 216, 196, 244, 174, 241,
- 192, 31, 226, 163, 241, 192, 31, 226, 244, 241, 192, 31, 248, 59, 241,
- 192, 31, 248, 79, 241, 192, 31, 235, 247, 241, 192, 31, 251, 149, 241,
- 192, 31, 249, 221, 216, 42, 231, 76, 241, 192, 31, 243, 87, 216, 38, 241,
- 192, 31, 224, 125, 214, 154, 241, 192, 31, 226, 162, 241, 192, 31, 216,
- 196, 212, 13, 241, 192, 31, 223, 45, 241, 192, 31, 216, 196, 250, 220,
- 241, 192, 31, 216, 196, 253, 255, 216, 133, 241, 192, 31, 216, 196, 234,
- 179, 218, 134, 230, 115, 241, 192, 31, 248, 32, 241, 192, 31, 216, 196,
- 231, 152, 231, 202, 241, 192, 31, 255, 19, 241, 192, 31, 216, 196, 212,
- 54, 241, 192, 31, 216, 196, 243, 47, 211, 239, 241, 192, 31, 216, 196,
- 235, 52, 233, 107, 241, 192, 31, 247, 184, 241, 192, 31, 232, 220, 241,
- 192, 31, 235, 223, 215, 187, 241, 192, 31, 4, 224, 197, 241, 192, 31,
- 254, 217, 249, 212, 241, 192, 31, 252, 59, 249, 212, 8, 3, 235, 160, 8,
- 3, 235, 153, 8, 3, 73, 8, 3, 235, 182, 8, 3, 236, 58, 8, 3, 236, 41, 8,
- 3, 236, 60, 8, 3, 236, 59, 8, 3, 253, 206, 8, 3, 253, 169, 8, 3, 61, 8,
- 3, 254, 72, 8, 3, 214, 164, 8, 3, 214, 167, 8, 3, 214, 165, 8, 3, 226,
- 140, 8, 3, 226, 114, 8, 3, 76, 8, 3, 226, 175, 8, 3, 245, 35, 8, 3, 75,
- 8, 3, 211, 195, 8, 3, 251, 228, 8, 3, 251, 225, 8, 3, 252, 6, 8, 3, 251,
- 238, 8, 3, 251, 251, 8, 3, 251, 250, 8, 3, 251, 253, 8, 3, 251, 252, 8,
- 3, 252, 121, 8, 3, 252, 113, 8, 3, 252, 191, 8, 3, 252, 142, 8, 3, 251,
- 101, 8, 3, 251, 105, 8, 3, 251, 102, 8, 3, 251, 179, 8, 3, 251, 163, 8,
- 3, 251, 205, 8, 3, 251, 185, 8, 3, 252, 21, 8, 3, 252, 75, 8, 3, 252, 33,
- 8, 3, 251, 87, 8, 3, 251, 84, 8, 3, 251, 125, 8, 3, 251, 100, 8, 3, 251,
- 94, 8, 3, 251, 98, 8, 3, 251, 72, 8, 3, 251, 70, 8, 3, 251, 77, 8, 3,
- 251, 75, 8, 3, 251, 73, 8, 3, 251, 74, 8, 3, 225, 49, 8, 3, 225, 45, 8,
- 3, 225, 108, 8, 3, 225, 59, 8, 3, 225, 75, 8, 3, 225, 102, 8, 3, 225, 98,
- 8, 3, 225, 240, 8, 3, 225, 230, 8, 3, 190, 8, 3, 226, 21, 8, 3, 224, 135,
- 8, 3, 224, 137, 8, 3, 224, 136, 8, 3, 224, 233, 8, 3, 224, 222, 8, 3,
- 225, 16, 8, 3, 224, 245, 8, 3, 224, 121, 8, 3, 224, 117, 8, 3, 224, 150,
- 8, 3, 224, 134, 8, 3, 224, 126, 8, 3, 224, 132, 8, 3, 224, 100, 8, 3,
- 224, 99, 8, 3, 224, 104, 8, 3, 224, 103, 8, 3, 224, 101, 8, 3, 224, 102,
- 8, 3, 252, 96, 8, 3, 252, 95, 8, 3, 252, 102, 8, 3, 252, 97, 8, 3, 252,
- 99, 8, 3, 252, 98, 8, 3, 252, 101, 8, 3, 252, 100, 8, 3, 252, 108, 8, 3,
- 252, 107, 8, 3, 252, 111, 8, 3, 252, 109, 8, 3, 252, 87, 8, 3, 252, 89,
- 8, 3, 252, 88, 8, 3, 252, 92, 8, 3, 252, 91, 8, 3, 252, 94, 8, 3, 252,
- 93, 8, 3, 252, 103, 8, 3, 252, 106, 8, 3, 252, 104, 8, 3, 252, 83, 8, 3,
- 252, 82, 8, 3, 252, 90, 8, 3, 252, 86, 8, 3, 252, 84, 8, 3, 252, 85, 8,
- 3, 252, 79, 8, 3, 252, 78, 8, 3, 252, 81, 8, 3, 252, 80, 8, 3, 229, 169,
- 8, 3, 229, 168, 8, 3, 229, 174, 8, 3, 229, 170, 8, 3, 229, 171, 8, 3,
- 229, 173, 8, 3, 229, 172, 8, 3, 229, 177, 8, 3, 229, 176, 8, 3, 229, 179,
- 8, 3, 229, 178, 8, 3, 229, 165, 8, 3, 229, 164, 8, 3, 229, 167, 8, 3,
- 229, 166, 8, 3, 229, 158, 8, 3, 229, 157, 8, 3, 229, 162, 8, 3, 229, 161,
- 8, 3, 229, 159, 8, 3, 229, 160, 8, 3, 229, 152, 8, 3, 229, 151, 8, 3,
- 229, 156, 8, 3, 229, 155, 8, 3, 229, 153, 8, 3, 229, 154, 8, 3, 241, 110,
- 8, 3, 241, 109, 8, 3, 241, 115, 8, 3, 241, 111, 8, 3, 241, 112, 8, 3,
- 241, 114, 8, 3, 241, 113, 8, 3, 241, 118, 8, 3, 241, 117, 8, 3, 241, 120,
- 8, 3, 241, 119, 8, 3, 241, 101, 8, 3, 241, 103, 8, 3, 241, 102, 8, 3,
- 241, 106, 8, 3, 241, 105, 8, 3, 241, 108, 8, 3, 241, 107, 8, 3, 241, 97,
- 8, 3, 241, 96, 8, 3, 241, 104, 8, 3, 241, 100, 8, 3, 241, 98, 8, 3, 241,
- 99, 8, 3, 241, 91, 8, 3, 241, 95, 8, 3, 241, 94, 8, 3, 241, 92, 8, 3,
- 241, 93, 8, 3, 230, 172, 8, 3, 230, 171, 8, 3, 230, 230, 8, 3, 230, 178,
- 8, 3, 230, 203, 8, 3, 230, 221, 8, 3, 230, 219, 8, 3, 231, 139, 8, 3,
- 231, 134, 8, 3, 184, 8, 3, 231, 172, 8, 3, 230, 74, 8, 3, 230, 73, 8, 3,
- 230, 77, 8, 3, 230, 75, 8, 3, 230, 121, 8, 3, 230, 107, 8, 3, 230, 161,
- 8, 3, 230, 126, 8, 3, 231, 26, 8, 3, 231, 91, 8, 3, 230, 55, 8, 3, 230,
- 51, 8, 3, 230, 102, 8, 3, 230, 70, 8, 3, 230, 63, 8, 3, 230, 68, 8, 3,
- 230, 28, 8, 3, 230, 27, 8, 3, 230, 33, 8, 3, 230, 30, 8, 3, 244, 83, 8,
- 3, 244, 78, 8, 3, 244, 121, 8, 3, 244, 98, 8, 3, 244, 167, 8, 3, 244,
- 158, 8, 3, 244, 196, 8, 3, 244, 170, 8, 3, 244, 3, 8, 3, 244, 43, 8, 3,
- 244, 27, 8, 3, 243, 218, 8, 3, 243, 217, 8, 3, 243, 234, 8, 3, 243, 223,
- 8, 3, 243, 221, 8, 3, 243, 222, 8, 3, 243, 205, 8, 3, 243, 204, 8, 3,
- 243, 208, 8, 3, 243, 206, 8, 3, 213, 144, 8, 3, 213, 139, 8, 3, 213, 176,
- 8, 3, 213, 153, 8, 3, 213, 166, 8, 3, 213, 163, 8, 3, 213, 168, 8, 3,
- 213, 167, 8, 3, 214, 7, 8, 3, 214, 2, 8, 3, 214, 27, 8, 3, 214, 18, 8, 3,
- 213, 125, 8, 3, 213, 121, 8, 3, 213, 138, 8, 3, 213, 126, 8, 3, 213, 178,
- 8, 3, 213, 244, 8, 3, 212, 110, 8, 3, 212, 108, 8, 3, 212, 116, 8, 3,
- 212, 113, 8, 3, 212, 111, 8, 3, 212, 112, 8, 3, 212, 102, 8, 3, 212, 101,
- 8, 3, 212, 106, 8, 3, 212, 105, 8, 3, 212, 103, 8, 3, 212, 104, 8, 3,
- 247, 178, 8, 3, 247, 166, 8, 3, 248, 3, 8, 3, 247, 203, 8, 3, 247, 236,
- 8, 3, 247, 240, 8, 3, 247, 239, 8, 3, 248, 152, 8, 3, 248, 147, 8, 3,
- 248, 221, 8, 3, 248, 172, 8, 3, 246, 62, 8, 3, 246, 63, 8, 3, 247, 120,
- 8, 3, 246, 102, 8, 3, 247, 145, 8, 3, 247, 122, 8, 3, 248, 30, 8, 3, 248,
- 90, 8, 3, 248, 45, 8, 3, 246, 53, 8, 3, 246, 51, 8, 3, 246, 78, 8, 3,
- 246, 61, 8, 3, 246, 56, 8, 3, 246, 59, 8, 3, 216, 67, 8, 3, 216, 61, 8,
- 3, 216, 117, 8, 3, 216, 76, 8, 3, 216, 109, 8, 3, 216, 111, 8, 3, 216,
- 110, 8, 3, 217, 46, 8, 3, 217, 33, 8, 3, 217, 105, 8, 3, 217, 54, 8, 3,
- 215, 102, 8, 3, 215, 101, 8, 3, 215, 104, 8, 3, 215, 103, 8, 3, 216, 5,
- 8, 3, 216, 1, 8, 3, 111, 8, 3, 216, 13, 8, 3, 216, 213, 8, 3, 217, 22, 8,
- 3, 216, 237, 8, 3, 215, 88, 8, 3, 215, 83, 8, 3, 215, 118, 8, 3, 215,
- 100, 8, 3, 215, 89, 8, 3, 215, 98, 8, 3, 248, 107, 8, 3, 248, 106, 8, 3,
- 248, 112, 8, 3, 248, 108, 8, 3, 248, 109, 8, 3, 248, 111, 8, 3, 248, 110,
- 8, 3, 248, 128, 8, 3, 248, 127, 8, 3, 248, 135, 8, 3, 248, 129, 8, 3,
- 248, 97, 8, 3, 248, 99, 8, 3, 248, 98, 8, 3, 248, 102, 8, 3, 248, 101, 8,
- 3, 248, 105, 8, 3, 248, 103, 8, 3, 248, 120, 8, 3, 248, 123, 8, 3, 248,
- 121, 8, 3, 248, 93, 8, 3, 248, 92, 8, 3, 248, 100, 8, 3, 248, 96, 8, 3,
- 248, 94, 8, 3, 248, 95, 8, 3, 229, 126, 8, 3, 229, 125, 8, 3, 229, 133,
- 8, 3, 229, 128, 8, 3, 229, 129, 8, 3, 229, 130, 8, 3, 229, 142, 8, 3,
- 229, 141, 8, 3, 229, 148, 8, 3, 229, 143, 8, 3, 229, 118, 8, 3, 229, 117,
- 8, 3, 229, 124, 8, 3, 229, 119, 8, 3, 229, 134, 8, 3, 229, 140, 8, 3,
- 229, 138, 8, 3, 229, 110, 8, 3, 229, 109, 8, 3, 229, 115, 8, 3, 229, 113,
- 8, 3, 229, 111, 8, 3, 229, 112, 8, 3, 241, 77, 8, 3, 241, 76, 8, 3, 241,
- 83, 8, 3, 241, 78, 8, 3, 241, 80, 8, 3, 241, 79, 8, 3, 241, 82, 8, 3,
- 241, 81, 8, 3, 241, 88, 8, 3, 241, 87, 8, 3, 241, 90, 8, 3, 241, 89, 8,
- 3, 241, 71, 8, 3, 241, 72, 8, 3, 241, 74, 8, 3, 241, 73, 8, 3, 241, 75,
- 8, 3, 241, 84, 8, 3, 241, 86, 8, 3, 241, 85, 8, 3, 241, 70, 8, 3, 228,
- 189, 8, 3, 228, 187, 8, 3, 228, 233, 8, 3, 228, 192, 8, 3, 228, 215, 8,
- 3, 228, 229, 8, 3, 228, 228, 8, 3, 229, 183, 8, 3, 197, 8, 3, 229, 197,
- 8, 3, 227, 186, 8, 3, 227, 188, 8, 3, 227, 187, 8, 3, 228, 51, 8, 3, 228,
- 38, 8, 3, 228, 74, 8, 3, 228, 60, 8, 3, 229, 83, 8, 3, 229, 107, 8, 3,
- 229, 94, 8, 3, 227, 181, 8, 3, 227, 177, 8, 3, 227, 237, 8, 3, 227, 185,
- 8, 3, 227, 183, 8, 3, 227, 184, 8, 3, 241, 141, 8, 3, 241, 140, 8, 3,
- 241, 146, 8, 3, 241, 142, 8, 3, 241, 143, 8, 3, 241, 145, 8, 3, 241, 144,
- 8, 3, 241, 151, 8, 3, 241, 150, 8, 3, 241, 153, 8, 3, 241, 152, 8, 3,
- 241, 133, 8, 3, 241, 135, 8, 3, 241, 134, 8, 3, 241, 137, 8, 3, 241, 139,
- 8, 3, 241, 138, 8, 3, 241, 147, 8, 3, 241, 149, 8, 3, 241, 148, 8, 3,
- 241, 129, 8, 3, 241, 128, 8, 3, 241, 136, 8, 3, 241, 132, 8, 3, 241, 130,
- 8, 3, 241, 131, 8, 3, 241, 123, 8, 3, 241, 122, 8, 3, 241, 127, 8, 3,
- 241, 126, 8, 3, 241, 124, 8, 3, 241, 125, 8, 3, 232, 195, 8, 3, 232, 189,
- 8, 3, 232, 241, 8, 3, 232, 202, 8, 3, 232, 233, 8, 3, 232, 232, 8, 3,
- 232, 236, 8, 3, 232, 234, 8, 3, 233, 79, 8, 3, 233, 69, 8, 3, 233, 135,
- 8, 3, 233, 88, 8, 3, 232, 79, 8, 3, 232, 78, 8, 3, 232, 81, 8, 3, 232,
- 80, 8, 3, 232, 116, 8, 3, 232, 106, 8, 3, 232, 156, 8, 3, 232, 120, 8, 3,
- 233, 2, 8, 3, 233, 58, 8, 3, 233, 17, 8, 3, 232, 74, 8, 3, 232, 72, 8, 3,
- 232, 98, 8, 3, 232, 77, 8, 3, 232, 75, 8, 3, 232, 76, 8, 3, 232, 54, 8,
- 3, 232, 53, 8, 3, 232, 62, 8, 3, 232, 57, 8, 3, 232, 55, 8, 3, 232, 56,
- 8, 3, 242, 189, 8, 3, 242, 188, 8, 3, 242, 214, 8, 3, 242, 199, 8, 3,
- 242, 206, 8, 3, 242, 205, 8, 3, 242, 208, 8, 3, 242, 207, 8, 3, 243, 89,
- 8, 3, 243, 84, 8, 3, 243, 135, 8, 3, 243, 99, 8, 3, 242, 91, 8, 3, 242,
- 90, 8, 3, 242, 93, 8, 3, 242, 92, 8, 3, 242, 154, 8, 3, 242, 152, 8, 3,
- 242, 174, 8, 3, 242, 162, 8, 3, 243, 33, 8, 3, 243, 31, 8, 3, 243, 62, 8,
- 3, 243, 44, 8, 3, 242, 81, 8, 3, 242, 80, 8, 3, 242, 113, 8, 3, 242, 89,
- 8, 3, 242, 82, 8, 3, 242, 88, 8, 3, 234, 61, 8, 3, 234, 60, 8, 3, 234,
- 92, 8, 3, 234, 75, 8, 3, 234, 85, 8, 3, 234, 88, 8, 3, 234, 86, 8, 3,
- 234, 202, 8, 3, 234, 190, 8, 3, 176, 8, 3, 234, 228, 8, 3, 233, 200, 8,
- 3, 233, 205, 8, 3, 233, 202, 8, 3, 234, 0, 8, 3, 233, 252, 8, 3, 234, 28,
- 8, 3, 234, 7, 8, 3, 234, 156, 8, 3, 234, 140, 8, 3, 234, 182, 8, 3, 234,
- 159, 8, 3, 233, 189, 8, 3, 233, 186, 8, 3, 233, 217, 8, 3, 233, 199, 8,
- 3, 233, 192, 8, 3, 233, 196, 8, 3, 243, 15, 8, 3, 243, 14, 8, 3, 243, 19,
- 8, 3, 243, 16, 8, 3, 243, 18, 8, 3, 243, 17, 8, 3, 243, 26, 8, 3, 243,
- 25, 8, 3, 243, 29, 8, 3, 243, 27, 8, 3, 243, 6, 8, 3, 243, 5, 8, 3, 243,
- 8, 8, 3, 243, 7, 8, 3, 243, 11, 8, 3, 243, 10, 8, 3, 243, 13, 8, 3, 243,
- 12, 8, 3, 243, 21, 8, 3, 243, 20, 8, 3, 243, 24, 8, 3, 243, 22, 8, 3,
- 243, 1, 8, 3, 243, 0, 8, 3, 243, 9, 8, 3, 243, 4, 8, 3, 243, 2, 8, 3,
- 243, 3, 8, 3, 230, 249, 8, 3, 230, 250, 8, 3, 231, 12, 8, 3, 231, 11, 8,
- 3, 231, 14, 8, 3, 231, 13, 8, 3, 230, 240, 8, 3, 230, 242, 8, 3, 230,
- 241, 8, 3, 230, 245, 8, 3, 230, 244, 8, 3, 230, 247, 8, 3, 230, 246, 8,
- 3, 230, 251, 8, 3, 230, 253, 8, 3, 230, 252, 8, 3, 230, 236, 8, 3, 230,
- 235, 8, 3, 230, 243, 8, 3, 230, 239, 8, 3, 230, 237, 8, 3, 230, 238, 8,
- 3, 240, 180, 8, 3, 240, 179, 8, 3, 240, 186, 8, 3, 240, 181, 8, 3, 240,
- 183, 8, 3, 240, 182, 8, 3, 240, 185, 8, 3, 240, 184, 8, 3, 240, 191, 8,
- 3, 240, 190, 8, 3, 240, 193, 8, 3, 240, 192, 8, 3, 240, 172, 8, 3, 240,
- 171, 8, 3, 240, 174, 8, 3, 240, 173, 8, 3, 240, 176, 8, 3, 240, 175, 8,
- 3, 240, 178, 8, 3, 240, 177, 8, 3, 240, 187, 8, 3, 240, 189, 8, 3, 240,
- 188, 8, 3, 229, 24, 8, 3, 229, 26, 8, 3, 229, 25, 8, 3, 229, 67, 8, 3,
- 229, 65, 8, 3, 229, 77, 8, 3, 229, 70, 8, 3, 228, 243, 8, 3, 228, 242, 8,
- 3, 228, 244, 8, 3, 228, 252, 8, 3, 228, 249, 8, 3, 229, 4, 8, 3, 228,
- 254, 8, 3, 229, 58, 8, 3, 229, 64, 8, 3, 229, 60, 8, 3, 241, 156, 8, 3,
- 241, 166, 8, 3, 241, 175, 8, 3, 241, 251, 8, 3, 241, 243, 8, 3, 162, 8,
- 3, 242, 6, 8, 3, 240, 206, 8, 3, 240, 205, 8, 3, 240, 208, 8, 3, 240,
- 207, 8, 3, 240, 242, 8, 3, 240, 233, 8, 3, 241, 68, 8, 3, 241, 47, 8, 3,
- 241, 194, 8, 3, 241, 238, 8, 3, 241, 206, 8, 3, 212, 43, 8, 3, 212, 28,
- 8, 3, 212, 65, 8, 3, 212, 51, 8, 3, 211, 185, 8, 3, 211, 187, 8, 3, 211,
- 186, 8, 3, 211, 203, 8, 3, 211, 227, 8, 3, 211, 210, 8, 3, 212, 5, 8, 3,
- 212, 22, 8, 3, 212, 10, 8, 3, 210, 30, 8, 3, 210, 29, 8, 3, 210, 44, 8,
- 3, 210, 32, 8, 3, 210, 37, 8, 3, 210, 39, 8, 3, 210, 38, 8, 3, 210, 102,
- 8, 3, 210, 99, 8, 3, 210, 116, 8, 3, 210, 105, 8, 3, 210, 6, 8, 3, 210,
- 8, 8, 3, 210, 7, 8, 3, 210, 19, 8, 3, 210, 18, 8, 3, 210, 23, 8, 3, 210,
- 20, 8, 3, 210, 84, 8, 3, 210, 94, 8, 3, 210, 88, 8, 3, 210, 2, 8, 3, 210,
- 1, 8, 3, 210, 13, 8, 3, 210, 5, 8, 3, 210, 3, 8, 3, 210, 4, 8, 3, 209,
- 245, 8, 3, 209, 244, 8, 3, 209, 250, 8, 3, 209, 248, 8, 3, 209, 246, 8,
- 3, 209, 247, 8, 3, 250, 28, 8, 3, 250, 24, 8, 3, 250, 51, 8, 3, 250, 37,
- 8, 3, 250, 48, 8, 3, 250, 42, 8, 3, 250, 50, 8, 3, 250, 49, 8, 3, 250,
- 224, 8, 3, 250, 217, 8, 3, 251, 33, 8, 3, 250, 251, 8, 3, 249, 104, 8, 3,
- 249, 106, 8, 3, 249, 105, 8, 3, 249, 153, 8, 3, 249, 144, 8, 3, 249, 238,
- 8, 3, 249, 169, 8, 3, 250, 160, 8, 3, 250, 190, 8, 3, 250, 165, 8, 3,
- 249, 84, 8, 3, 249, 82, 8, 3, 249, 112, 8, 3, 249, 102, 8, 3, 249, 89, 8,
- 3, 249, 101, 8, 3, 249, 63, 8, 3, 249, 62, 8, 3, 249, 73, 8, 3, 249, 69,
- 8, 3, 249, 64, 8, 3, 249, 66, 8, 3, 209, 228, 8, 3, 209, 227, 8, 3, 209,
- 234, 8, 3, 209, 229, 8, 3, 209, 231, 8, 3, 209, 230, 8, 3, 209, 233, 8,
- 3, 209, 232, 8, 3, 209, 240, 8, 3, 209, 239, 8, 3, 209, 243, 8, 3, 209,
- 241, 8, 3, 209, 224, 8, 3, 209, 226, 8, 3, 209, 225, 8, 3, 209, 235, 8,
- 3, 209, 238, 8, 3, 209, 236, 8, 3, 209, 217, 8, 3, 209, 221, 8, 3, 209,
- 220, 8, 3, 209, 218, 8, 3, 209, 219, 8, 3, 209, 211, 8, 3, 209, 210, 8,
- 3, 209, 216, 8, 3, 209, 214, 8, 3, 209, 212, 8, 3, 209, 213, 8, 3, 227,
- 104, 8, 3, 227, 103, 8, 3, 227, 109, 8, 3, 227, 105, 8, 3, 227, 106, 8,
- 3, 227, 108, 8, 3, 227, 107, 8, 3, 227, 114, 8, 3, 227, 113, 8, 3, 227,
- 117, 8, 3, 227, 116, 8, 3, 227, 97, 8, 3, 227, 98, 8, 3, 227, 101, 8, 3,
- 227, 102, 8, 3, 227, 110, 8, 3, 227, 112, 8, 3, 227, 92, 8, 3, 227, 100,
- 8, 3, 227, 96, 8, 3, 227, 93, 8, 3, 227, 94, 8, 3, 227, 87, 8, 3, 227,
- 86, 8, 3, 227, 91, 8, 3, 227, 90, 8, 3, 227, 88, 8, 3, 227, 89, 8, 3,
- 219, 127, 8, 3, 194, 8, 3, 219, 191, 8, 3, 219, 130, 8, 3, 219, 183, 8,
- 3, 219, 186, 8, 3, 219, 184, 8, 3, 221, 226, 8, 3, 221, 214, 8, 3, 206,
- 8, 3, 221, 234, 8, 3, 218, 28, 8, 3, 218, 30, 8, 3, 218, 29, 8, 3, 219,
- 34, 8, 3, 219, 23, 8, 3, 219, 58, 8, 3, 219, 38, 8, 3, 220, 114, 8, 3,
- 221, 181, 8, 3, 220, 139, 8, 3, 218, 5, 8, 3, 218, 3, 8, 3, 218, 83, 8,
- 3, 218, 27, 8, 3, 218, 9, 8, 3, 218, 17, 8, 3, 217, 166, 8, 3, 217, 165,
- 8, 3, 217, 232, 8, 3, 217, 173, 8, 3, 217, 168, 8, 3, 217, 172, 8, 3,
- 218, 186, 8, 3, 218, 185, 8, 3, 218, 192, 8, 3, 218, 187, 8, 3, 218, 189,
- 8, 3, 218, 191, 8, 3, 218, 190, 8, 3, 218, 200, 8, 3, 218, 198, 8, 3,
- 218, 223, 8, 3, 218, 201, 8, 3, 218, 181, 8, 3, 218, 180, 8, 3, 218, 184,
- 8, 3, 218, 182, 8, 3, 218, 194, 8, 3, 218, 197, 8, 3, 218, 195, 8, 3,
- 218, 177, 8, 3, 218, 175, 8, 3, 218, 179, 8, 3, 218, 178, 8, 3, 218, 170,
- 8, 3, 218, 169, 8, 3, 218, 174, 8, 3, 218, 173, 8, 3, 218, 171, 8, 3,
- 218, 172, 8, 3, 210, 77, 8, 3, 210, 76, 8, 3, 210, 82, 8, 3, 210, 79, 8,
- 3, 210, 59, 8, 3, 210, 61, 8, 3, 210, 60, 8, 3, 210, 64, 8, 3, 210, 63,
- 8, 3, 210, 67, 8, 3, 210, 65, 8, 3, 210, 71, 8, 3, 210, 70, 8, 3, 210,
- 74, 8, 3, 210, 72, 8, 3, 210, 55, 8, 3, 210, 54, 8, 3, 210, 62, 8, 3,
- 210, 58, 8, 3, 210, 56, 8, 3, 210, 57, 8, 3, 210, 47, 8, 3, 210, 46, 8,
- 3, 210, 51, 8, 3, 210, 50, 8, 3, 210, 48, 8, 3, 210, 49, 8, 3, 250, 136,
- 8, 3, 250, 133, 8, 3, 250, 157, 8, 3, 250, 144, 8, 3, 250, 65, 8, 3, 250,
- 64, 8, 3, 250, 67, 8, 3, 250, 66, 8, 3, 250, 79, 8, 3, 250, 78, 8, 3,
- 250, 86, 8, 3, 250, 81, 8, 3, 250, 115, 8, 3, 250, 113, 8, 3, 250, 131,
- 8, 3, 250, 121, 8, 3, 250, 59, 8, 3, 250, 69, 8, 3, 250, 63, 8, 3, 250,
- 60, 8, 3, 250, 62, 8, 3, 250, 53, 8, 3, 250, 52, 8, 3, 250, 57, 8, 3,
- 250, 56, 8, 3, 250, 54, 8, 3, 250, 55, 8, 3, 222, 175, 8, 3, 222, 179, 8,
- 3, 222, 158, 8, 3, 222, 159, 8, 3, 222, 162, 8, 3, 222, 161, 8, 3, 222,
- 165, 8, 3, 222, 163, 8, 3, 222, 169, 8, 3, 222, 168, 8, 3, 222, 174, 8,
- 3, 222, 170, 8, 3, 222, 154, 8, 3, 222, 152, 8, 3, 222, 160, 8, 3, 222,
- 157, 8, 3, 222, 155, 8, 3, 222, 156, 8, 3, 222, 147, 8, 3, 222, 146, 8,
- 3, 222, 151, 8, 3, 222, 150, 8, 3, 222, 148, 8, 3, 222, 149, 8, 3, 228,
- 34, 8, 3, 228, 33, 8, 3, 228, 36, 8, 3, 228, 35, 8, 3, 228, 26, 8, 3,
- 228, 28, 8, 3, 228, 27, 8, 3, 228, 30, 8, 3, 228, 29, 8, 3, 228, 32, 8,
- 3, 228, 31, 8, 3, 228, 21, 8, 3, 228, 20, 8, 3, 228, 25, 8, 3, 228, 24,
- 8, 3, 228, 22, 8, 3, 228, 23, 8, 3, 228, 15, 8, 3, 228, 14, 8, 3, 228,
- 19, 8, 3, 228, 18, 8, 3, 228, 16, 8, 3, 228, 17, 8, 3, 220, 72, 8, 3,
- 220, 67, 8, 3, 220, 102, 8, 3, 220, 83, 8, 3, 219, 215, 8, 3, 219, 217,
- 8, 3, 219, 216, 8, 3, 219, 236, 8, 3, 219, 233, 8, 3, 220, 7, 8, 3, 219,
- 254, 8, 3, 220, 42, 8, 3, 220, 35, 8, 3, 220, 63, 8, 3, 220, 50, 8, 3,
- 219, 211, 8, 3, 219, 209, 8, 3, 219, 225, 8, 3, 219, 214, 8, 3, 219, 212,
- 8, 3, 219, 213, 8, 3, 219, 194, 8, 3, 219, 193, 8, 3, 219, 200, 8, 3,
- 219, 197, 8, 3, 219, 195, 8, 3, 219, 196, 8, 3, 223, 141, 8, 3, 223, 135,
- 8, 3, 205, 8, 3, 223, 147, 8, 3, 222, 120, 8, 3, 222, 122, 8, 3, 222,
- 121, 8, 3, 222, 188, 8, 3, 222, 181, 8, 3, 222, 211, 8, 3, 222, 192, 8,
- 3, 223, 43, 8, 3, 223, 128, 8, 3, 223, 81, 8, 3, 222, 113, 8, 3, 222,
- 110, 8, 3, 222, 140, 8, 3, 222, 119, 8, 3, 222, 115, 8, 3, 222, 116, 8,
- 3, 222, 95, 8, 3, 222, 94, 8, 3, 222, 100, 8, 3, 222, 98, 8, 3, 222, 96,
- 8, 3, 222, 97, 8, 3, 235, 98, 8, 3, 235, 97, 8, 3, 235, 108, 8, 3, 235,
- 99, 8, 3, 235, 104, 8, 3, 235, 103, 8, 3, 235, 106, 8, 3, 235, 105, 8, 3,
- 235, 41, 8, 3, 235, 40, 8, 3, 235, 43, 8, 3, 235, 42, 8, 3, 235, 56, 8,
- 3, 235, 54, 8, 3, 235, 68, 8, 3, 235, 58, 8, 3, 235, 34, 8, 3, 235, 32,
- 8, 3, 235, 51, 8, 3, 235, 39, 8, 3, 235, 36, 8, 3, 235, 37, 8, 3, 235,
- 26, 8, 3, 235, 25, 8, 3, 235, 30, 8, 3, 235, 29, 8, 3, 235, 27, 8, 3,
- 235, 28, 8, 3, 224, 46, 8, 3, 224, 44, 8, 3, 224, 53, 8, 3, 224, 47, 8,
- 3, 224, 50, 8, 3, 224, 49, 8, 3, 224, 52, 8, 3, 224, 51, 8, 3, 223, 255,
- 8, 3, 223, 252, 8, 3, 224, 1, 8, 3, 224, 0, 8, 3, 224, 33, 8, 3, 224, 32,
- 8, 3, 224, 42, 8, 3, 224, 36, 8, 3, 223, 247, 8, 3, 223, 243, 8, 3, 224,
- 30, 8, 3, 223, 251, 8, 3, 223, 249, 8, 3, 223, 250, 8, 3, 223, 227, 8, 3,
- 223, 225, 8, 3, 223, 237, 8, 3, 223, 230, 8, 3, 223, 228, 8, 3, 223, 229,
- 8, 3, 235, 87, 8, 3, 235, 86, 8, 3, 235, 93, 8, 3, 235, 88, 8, 3, 235,
- 90, 8, 3, 235, 89, 8, 3, 235, 92, 8, 3, 235, 91, 8, 3, 235, 78, 8, 3,
- 235, 80, 8, 3, 235, 79, 8, 3, 235, 83, 8, 3, 235, 82, 8, 3, 235, 85, 8,
- 3, 235, 84, 8, 3, 235, 74, 8, 3, 235, 73, 8, 3, 235, 81, 8, 3, 235, 77,
- 8, 3, 235, 75, 8, 3, 235, 76, 8, 3, 235, 70, 8, 3, 235, 69, 8, 3, 235,
- 72, 8, 3, 235, 71, 8, 3, 228, 162, 8, 3, 228, 161, 8, 3, 228, 169, 8, 3,
- 228, 163, 8, 3, 228, 165, 8, 3, 228, 164, 8, 3, 228, 168, 8, 3, 228, 166,
- 8, 3, 228, 151, 8, 3, 228, 152, 8, 3, 228, 157, 8, 3, 228, 156, 8, 3,
- 228, 160, 8, 3, 228, 158, 8, 3, 228, 146, 8, 3, 228, 155, 8, 3, 228, 150,
- 8, 3, 228, 147, 8, 3, 228, 148, 8, 3, 228, 141, 8, 3, 228, 140, 8, 3,
- 228, 145, 8, 3, 228, 144, 8, 3, 228, 142, 8, 3, 228, 143, 8, 3, 227, 137,
- 8, 3, 227, 136, 8, 3, 227, 148, 8, 3, 227, 141, 8, 3, 227, 145, 8, 3,
- 227, 144, 8, 3, 227, 147, 8, 3, 227, 146, 8, 3, 227, 124, 8, 3, 227, 126,
- 8, 3, 227, 125, 8, 3, 227, 130, 8, 3, 227, 129, 8, 3, 227, 134, 8, 3,
- 227, 131, 8, 3, 227, 122, 8, 3, 227, 120, 8, 3, 227, 128, 8, 3, 227, 123,
- 8, 3, 211, 150, 8, 3, 211, 149, 8, 3, 211, 157, 8, 3, 211, 152, 8, 3,
- 211, 154, 8, 3, 211, 153, 8, 3, 211, 156, 8, 3, 211, 155, 8, 3, 211, 139,
- 8, 3, 211, 140, 8, 3, 211, 144, 8, 3, 211, 143, 8, 3, 211, 148, 8, 3,
- 211, 146, 8, 3, 211, 121, 8, 3, 211, 119, 8, 3, 211, 131, 8, 3, 211, 124,
- 8, 3, 211, 122, 8, 3, 211, 123, 8, 3, 210, 250, 8, 3, 210, 248, 8, 3,
- 211, 8, 8, 3, 210, 251, 8, 3, 211, 2, 8, 3, 211, 1, 8, 3, 211, 5, 8, 3,
- 211, 3, 8, 3, 210, 191, 8, 3, 210, 190, 8, 3, 210, 194, 8, 3, 210, 192,
- 8, 3, 210, 224, 8, 3, 210, 221, 8, 3, 210, 244, 8, 3, 210, 228, 8, 3,
- 210, 182, 8, 3, 210, 178, 8, 3, 210, 212, 8, 3, 210, 189, 8, 3, 210, 185,
- 8, 3, 210, 186, 8, 3, 210, 162, 8, 3, 210, 161, 8, 3, 210, 169, 8, 3,
- 210, 165, 8, 3, 210, 163, 8, 3, 210, 164, 8, 34, 224, 33, 8, 34, 232,
- 241, 8, 34, 234, 61, 8, 34, 227, 141, 8, 34, 249, 69, 8, 34, 218, 192, 8,
- 34, 243, 12, 8, 34, 243, 44, 8, 34, 230, 230, 8, 34, 240, 180, 8, 34,
- 232, 56, 8, 34, 252, 83, 8, 34, 230, 126, 8, 34, 210, 244, 8, 34, 224,
- 121, 8, 34, 240, 174, 8, 34, 217, 46, 8, 34, 243, 135, 8, 34, 210, 5, 8,
- 34, 249, 63, 8, 34, 248, 95, 8, 34, 251, 98, 8, 34, 243, 8, 8, 34, 227,
- 131, 8, 34, 215, 118, 8, 34, 226, 175, 8, 34, 235, 74, 8, 34, 210, 19, 8,
- 34, 224, 100, 8, 34, 241, 108, 8, 34, 210, 250, 8, 34, 212, 112, 8, 34,
- 219, 200, 8, 34, 213, 244, 8, 34, 210, 116, 8, 34, 235, 68, 8, 34, 227,
- 96, 8, 34, 235, 72, 8, 34, 242, 154, 8, 34, 235, 92, 8, 34, 211, 227, 8,
- 34, 246, 78, 8, 34, 219, 213, 8, 34, 232, 236, 8, 34, 249, 73, 8, 34,
- 249, 105, 8, 34, 250, 37, 8, 34, 240, 177, 8, 34, 220, 72, 8, 34, 210, 4,
- 8, 34, 219, 254, 8, 34, 250, 131, 8, 34, 209, 231, 8, 34, 229, 173, 8,
- 34, 234, 182, 232, 196, 1, 252, 191, 232, 196, 1, 190, 232, 196, 1, 225,
- 147, 232, 196, 1, 248, 221, 232, 196, 1, 217, 105, 232, 196, 1, 216, 208,
- 232, 196, 1, 243, 135, 232, 196, 1, 176, 232, 196, 1, 234, 132, 232, 196,
- 1, 235, 141, 232, 196, 1, 251, 33, 232, 196, 1, 250, 157, 232, 196, 1,
- 246, 38, 232, 196, 1, 215, 183, 232, 196, 1, 215, 175, 232, 196, 1, 184,
- 232, 196, 1, 197, 232, 196, 1, 233, 135, 232, 196, 1, 206, 232, 196, 1,
- 210, 82, 232, 196, 1, 210, 116, 232, 196, 1, 229, 77, 232, 196, 1, 162,
- 232, 196, 1, 211, 165, 232, 196, 1, 241, 189, 232, 196, 1, 244, 196, 232,
- 196, 1, 212, 65, 232, 196, 1, 220, 102, 232, 196, 1, 191, 232, 196, 1,
- 242, 249, 232, 196, 1, 61, 232, 196, 1, 254, 243, 232, 196, 1, 75, 232,
- 196, 1, 245, 55, 232, 196, 1, 73, 232, 196, 1, 76, 232, 196, 1, 70, 232,
- 196, 1, 214, 214, 232, 196, 1, 214, 208, 232, 196, 1, 226, 234, 232, 196,
- 1, 138, 230, 32, 216, 117, 232, 196, 1, 138, 229, 229, 225, 16, 232, 196,
- 1, 138, 230, 32, 249, 72, 232, 196, 1, 138, 230, 32, 251, 205, 232, 196,
- 1, 138, 230, 32, 197, 232, 196, 1, 138, 230, 32, 235, 115, 232, 196, 224,
- 141, 249, 219, 232, 196, 224, 141, 243, 229, 218, 129, 41, 3, 245, 209,
- 41, 3, 245, 205, 41, 3, 241, 220, 41, 3, 212, 17, 41, 3, 212, 16, 41, 3,
- 225, 211, 41, 3, 252, 13, 41, 3, 252, 66, 41, 3, 231, 116, 41, 3, 233,
- 247, 41, 3, 231, 6, 41, 3, 243, 75, 41, 3, 244, 147, 41, 3, 213, 250, 41,
- 3, 217, 11, 41, 3, 216, 194, 41, 3, 248, 16, 41, 3, 248, 13, 41, 3, 233,
- 50, 41, 3, 223, 108, 41, 3, 248, 77, 41, 3, 229, 139, 41, 3, 221, 170,
- 41, 3, 220, 61, 41, 3, 210, 92, 41, 3, 210, 73, 41, 3, 250, 182, 41, 3,
- 235, 124, 41, 3, 228, 176, 41, 3, 211, 44, 41, 3, 234, 181, 41, 3, 229,
- 51, 41, 3, 243, 55, 41, 3, 231, 80, 41, 3, 229, 103, 41, 3, 227, 155, 41,
- 3, 73, 41, 3, 235, 255, 41, 3, 241, 180, 41, 3, 241, 160, 41, 3, 211,
- 250, 41, 3, 211, 241, 41, 3, 225, 108, 41, 3, 252, 11, 41, 3, 252, 6, 41,
- 3, 231, 109, 41, 3, 233, 244, 41, 3, 231, 3, 41, 3, 243, 71, 41, 3, 244,
- 121, 41, 3, 213, 176, 41, 3, 216, 117, 41, 3, 216, 175, 41, 3, 248, 8,
- 41, 3, 248, 12, 41, 3, 232, 241, 41, 3, 223, 35, 41, 3, 248, 3, 41, 3,
- 229, 133, 41, 3, 219, 191, 41, 3, 220, 32, 41, 3, 210, 44, 41, 3, 210,
- 69, 41, 3, 250, 51, 41, 3, 235, 108, 41, 3, 228, 169, 41, 3, 211, 8, 41,
- 3, 234, 92, 41, 3, 229, 43, 41, 3, 242, 214, 41, 3, 230, 230, 41, 3, 228,
- 233, 41, 3, 227, 148, 41, 3, 61, 41, 3, 254, 123, 41, 3, 229, 72, 41, 3,
- 162, 41, 3, 242, 18, 41, 3, 212, 65, 41, 3, 212, 55, 41, 3, 190, 41, 3,
- 252, 18, 41, 3, 252, 191, 41, 3, 231, 124, 41, 3, 233, 251, 41, 3, 233,
- 250, 41, 3, 231, 10, 41, 3, 243, 79, 41, 3, 244, 196, 41, 3, 214, 27, 41,
- 3, 217, 105, 41, 3, 216, 208, 41, 3, 248, 25, 41, 3, 248, 15, 41, 3, 233,
- 135, 41, 3, 205, 41, 3, 248, 221, 41, 3, 229, 148, 41, 3, 206, 41, 3,
- 220, 102, 41, 3, 210, 116, 41, 3, 210, 82, 41, 3, 251, 33, 41, 3, 235,
- 141, 41, 3, 228, 185, 41, 3, 191, 41, 3, 176, 41, 3, 234, 234, 41, 3,
- 229, 56, 41, 3, 243, 135, 41, 3, 184, 41, 3, 197, 41, 3, 227, 165, 41, 3,
- 226, 183, 41, 3, 226, 179, 41, 3, 241, 53, 41, 3, 211, 215, 41, 3, 211,
- 211, 41, 3, 224, 249, 41, 3, 252, 9, 41, 3, 251, 193, 41, 3, 231, 104,
- 41, 3, 233, 242, 41, 3, 230, 255, 41, 3, 243, 67, 41, 3, 244, 34, 41, 3,
- 213, 127, 41, 3, 216, 17, 41, 3, 216, 153, 41, 3, 248, 6, 41, 3, 248, 10,
- 41, 3, 232, 127, 41, 3, 222, 197, 41, 3, 247, 125, 41, 3, 229, 120, 41,
- 3, 219, 40, 41, 3, 220, 1, 41, 3, 210, 21, 41, 3, 210, 66, 41, 3, 249,
- 174, 41, 3, 235, 59, 41, 3, 228, 159, 41, 3, 210, 229, 41, 3, 234, 10,
- 41, 3, 229, 41, 41, 3, 242, 164, 41, 3, 230, 132, 41, 3, 228, 64, 41, 3,
- 227, 132, 41, 3, 70, 41, 3, 214, 190, 41, 3, 240, 222, 41, 3, 240, 212,
- 41, 3, 211, 195, 41, 3, 211, 189, 41, 3, 224, 150, 41, 3, 252, 8, 41, 3,
- 251, 125, 41, 3, 231, 103, 41, 3, 233, 240, 41, 3, 230, 254, 41, 3, 243,
- 66, 41, 3, 243, 234, 41, 3, 212, 116, 41, 3, 215, 118, 41, 3, 216, 136,
- 41, 3, 248, 4, 41, 3, 248, 9, 41, 3, 232, 98, 41, 3, 222, 140, 41, 3,
- 246, 78, 41, 3, 229, 115, 41, 3, 218, 83, 41, 3, 219, 225, 41, 3, 210,
- 13, 41, 3, 210, 62, 41, 3, 249, 112, 41, 3, 235, 51, 41, 3, 228, 155, 41,
- 3, 210, 212, 41, 3, 233, 217, 41, 3, 229, 40, 41, 3, 242, 113, 41, 3,
- 230, 102, 41, 3, 227, 237, 41, 3, 227, 128, 41, 3, 76, 41, 3, 226, 196,
- 41, 3, 229, 0, 41, 3, 241, 68, 41, 3, 241, 56, 41, 3, 211, 227, 41, 3,
- 211, 216, 41, 3, 225, 16, 41, 3, 252, 10, 41, 3, 251, 205, 41, 3, 231,
- 105, 41, 3, 233, 243, 41, 3, 231, 1, 41, 3, 243, 69, 41, 3, 243, 68, 41,
- 3, 244, 43, 41, 3, 213, 138, 41, 3, 111, 41, 3, 216, 156, 41, 3, 248, 7,
- 41, 3, 248, 11, 41, 3, 232, 156, 41, 3, 222, 211, 41, 3, 247, 145, 41, 3,
- 229, 124, 41, 3, 219, 58, 41, 3, 220, 7, 41, 3, 210, 23, 41, 3, 210, 67,
- 41, 3, 249, 238, 41, 3, 235, 68, 41, 3, 228, 160, 41, 3, 210, 244, 41, 3,
- 234, 28, 41, 3, 229, 42, 41, 3, 242, 174, 41, 3, 230, 161, 41, 3, 228,
- 74, 41, 3, 227, 134, 41, 3, 75, 41, 3, 245, 150, 41, 3, 229, 61, 41, 3,
- 241, 238, 41, 3, 241, 209, 41, 3, 212, 22, 41, 3, 212, 12, 41, 3, 225,
- 221, 41, 3, 252, 14, 41, 3, 252, 75, 41, 3, 231, 117, 41, 3, 233, 248,
- 41, 3, 233, 246, 41, 3, 231, 7, 41, 3, 243, 76, 41, 3, 243, 74, 41, 3,
- 244, 154, 41, 3, 213, 255, 41, 3, 217, 22, 41, 3, 216, 195, 41, 3, 248,
- 17, 41, 3, 248, 14, 41, 3, 233, 58, 41, 3, 223, 128, 41, 3, 248, 90, 41,
- 3, 229, 140, 41, 3, 221, 181, 41, 3, 220, 63, 41, 3, 210, 94, 41, 3, 210,
- 74, 41, 3, 250, 190, 41, 3, 235, 126, 41, 3, 228, 178, 41, 3, 211, 47,
- 41, 3, 234, 182, 41, 3, 229, 52, 41, 3, 229, 48, 41, 3, 243, 62, 41, 3,
- 243, 51, 41, 3, 231, 91, 41, 3, 229, 107, 41, 3, 227, 156, 41, 3, 229,
- 79, 41, 3, 233, 22, 41, 249, 219, 41, 243, 229, 218, 129, 41, 224, 13,
- 78, 41, 3, 229, 123, 244, 196, 41, 3, 229, 123, 176, 41, 3, 229, 123,
- 219, 40, 41, 16, 244, 144, 41, 16, 234, 180, 41, 16, 216, 81, 41, 16,
- 228, 208, 41, 16, 252, 147, 41, 16, 244, 195, 41, 16, 217, 101, 41, 16,
- 248, 176, 41, 16, 247, 124, 41, 16, 233, 206, 41, 16, 216, 21, 41, 16,
- 247, 144, 41, 16, 235, 60, 41, 21, 210, 86, 41, 21, 110, 41, 21, 105, 41,
- 21, 158, 41, 21, 161, 41, 21, 189, 41, 21, 194, 41, 21, 198, 41, 21, 195,
- 41, 21, 200, 41, 3, 229, 123, 184, 41, 3, 229, 123, 247, 145, 33, 6, 1,
- 210, 90, 33, 4, 1, 210, 90, 33, 6, 1, 246, 34, 33, 4, 1, 246, 34, 33, 6,
- 1, 223, 49, 246, 36, 33, 4, 1, 223, 49, 246, 36, 33, 6, 1, 235, 185, 33,
- 4, 1, 235, 185, 33, 6, 1, 247, 161, 33, 4, 1, 247, 161, 33, 6, 1, 230,
- 140, 214, 205, 33, 4, 1, 230, 140, 214, 205, 33, 6, 1, 251, 136, 226,
- 201, 33, 4, 1, 251, 136, 226, 201, 33, 6, 1, 229, 87, 211, 31, 33, 4, 1,
- 229, 87, 211, 31, 33, 6, 1, 211, 28, 2, 252, 185, 211, 31, 33, 4, 1, 211,
- 28, 2, 252, 185, 211, 31, 33, 6, 1, 235, 183, 211, 59, 33, 4, 1, 235,
- 183, 211, 59, 33, 6, 1, 223, 49, 210, 212, 33, 4, 1, 223, 49, 210, 212,
- 33, 6, 1, 235, 183, 61, 33, 4, 1, 235, 183, 61, 33, 6, 1, 250, 0, 232,
- 192, 210, 183, 33, 4, 1, 250, 0, 232, 192, 210, 183, 33, 6, 1, 251, 214,
- 210, 183, 33, 4, 1, 251, 214, 210, 183, 33, 6, 1, 235, 183, 250, 0, 232,
- 192, 210, 183, 33, 4, 1, 235, 183, 250, 0, 232, 192, 210, 183, 33, 6, 1,
- 210, 246, 33, 4, 1, 210, 246, 33, 6, 1, 223, 49, 215, 178, 33, 4, 1, 223,
- 49, 215, 178, 33, 6, 1, 219, 52, 248, 90, 33, 4, 1, 219, 52, 248, 90, 33,
- 6, 1, 219, 52, 245, 174, 33, 4, 1, 219, 52, 245, 174, 33, 6, 1, 219, 52,
- 245, 159, 33, 4, 1, 219, 52, 245, 159, 33, 6, 1, 230, 144, 76, 33, 4, 1,
- 230, 144, 76, 33, 6, 1, 251, 240, 76, 33, 4, 1, 251, 240, 76, 33, 6, 1,
- 52, 230, 144, 76, 33, 4, 1, 52, 230, 144, 76, 33, 1, 230, 86, 76, 38, 33,
- 212, 100, 38, 33, 216, 248, 230, 191, 50, 38, 33, 240, 211, 230, 191, 50,
- 38, 33, 216, 148, 230, 191, 50, 219, 93, 253, 216, 38, 33, 1, 214, 202,
- 236, 60, 38, 33, 1, 73, 38, 33, 1, 211, 8, 38, 33, 1, 70, 38, 33, 1, 242,
- 3, 50, 38, 33, 1, 211, 27, 38, 33, 1, 219, 52, 50, 38, 33, 1, 226, 201,
- 38, 33, 234, 192, 38, 33, 225, 227, 33, 234, 192, 33, 225, 227, 33, 6, 1,
- 246, 46, 33, 4, 1, 246, 46, 33, 6, 1, 246, 27, 33, 4, 1, 246, 27, 33, 6,
- 1, 210, 52, 33, 4, 1, 210, 52, 33, 6, 1, 250, 206, 33, 4, 1, 250, 206,
- 33, 6, 1, 246, 25, 33, 4, 1, 246, 25, 33, 6, 1, 217, 23, 2, 230, 224,
- 103, 33, 4, 1, 217, 23, 2, 230, 224, 103, 33, 6, 1, 215, 78, 33, 4, 1,
- 215, 78, 33, 6, 1, 215, 160, 33, 4, 1, 215, 160, 33, 6, 1, 215, 164, 33,
- 4, 1, 215, 164, 33, 6, 1, 217, 28, 33, 4, 1, 217, 28, 33, 6, 1, 240, 198,
- 33, 4, 1, 240, 198, 33, 6, 1, 219, 206, 33, 4, 1, 219, 206, 38, 33, 1,
- 235, 183, 75, 20, 1, 61, 20, 1, 176, 20, 1, 70, 20, 1, 233, 217, 20, 1,
- 245, 209, 20, 1, 223, 108, 20, 1, 217, 86, 20, 1, 76, 20, 1, 227, 148,
- 20, 1, 73, 20, 1, 233, 135, 20, 1, 190, 20, 1, 222, 239, 20, 1, 223, 29,
- 20, 1, 233, 49, 20, 1, 231, 79, 20, 1, 217, 101, 20, 1, 229, 146, 20, 1,
- 228, 183, 20, 1, 193, 20, 1, 218, 4, 20, 1, 230, 102, 20, 1, 220, 27, 20,
- 1, 219, 191, 20, 1, 220, 37, 20, 1, 220, 123, 20, 1, 233, 155, 20, 1,
- 234, 156, 20, 1, 227, 209, 20, 1, 227, 237, 20, 1, 228, 154, 20, 1, 210,
- 226, 20, 1, 219, 225, 20, 1, 210, 187, 20, 1, 191, 20, 1, 228, 9, 20, 1,
- 234, 142, 20, 1, 225, 151, 20, 1, 228, 176, 20, 1, 227, 246, 20, 1, 224,
- 144, 20, 1, 211, 192, 20, 1, 225, 211, 20, 1, 244, 147, 20, 1, 222, 140,
- 20, 1, 232, 98, 20, 1, 230, 230, 20, 1, 228, 233, 20, 1, 223, 51, 20, 1,
- 223, 171, 20, 1, 234, 165, 20, 1, 229, 7, 20, 1, 229, 56, 20, 1, 229, 77,
- 20, 1, 220, 7, 20, 1, 224, 147, 20, 1, 243, 234, 20, 1, 244, 37, 20, 1,
- 212, 65, 20, 1, 197, 20, 1, 232, 241, 20, 1, 225, 108, 20, 1, 232, 119,
- 20, 1, 234, 28, 20, 1, 231, 114, 20, 1, 223, 83, 20, 1, 231, 58, 20, 1,
- 184, 20, 1, 216, 117, 20, 1, 234, 92, 20, 1, 230, 161, 20, 1, 231, 122,
- 20, 1, 216, 230, 20, 1, 233, 251, 20, 1, 216, 247, 20, 1, 227, 238, 20,
- 1, 221, 251, 20, 1, 244, 192, 20, 1, 233, 253, 20, 1, 234, 24, 20, 38,
- 164, 234, 5, 20, 38, 164, 215, 110, 20, 228, 182, 20, 243, 229, 218, 129,
- 20, 249, 226, 20, 249, 219, 20, 220, 150, 20, 224, 13, 78, 58, 1, 250,
- 96, 138, 210, 254, 225, 61, 58, 1, 250, 96, 138, 211, 70, 225, 61, 58, 1,
- 250, 96, 138, 210, 254, 220, 84, 58, 1, 250, 96, 138, 211, 70, 220, 84,
- 58, 1, 250, 96, 138, 210, 254, 224, 30, 58, 1, 250, 96, 138, 211, 70,
- 224, 30, 58, 1, 250, 96, 138, 210, 254, 222, 140, 58, 1, 250, 96, 138,
- 211, 70, 222, 140, 58, 1, 245, 20, 246, 118, 138, 130, 58, 1, 125, 246,
- 118, 138, 130, 58, 1, 230, 225, 246, 118, 138, 130, 58, 1, 121, 246, 118,
- 138, 130, 58, 1, 245, 19, 246, 118, 138, 130, 58, 1, 245, 20, 246, 118,
- 233, 39, 138, 130, 58, 1, 125, 246, 118, 233, 39, 138, 130, 58, 1, 230,
- 225, 246, 118, 233, 39, 138, 130, 58, 1, 121, 246, 118, 233, 39, 138,
- 130, 58, 1, 245, 19, 246, 118, 233, 39, 138, 130, 58, 1, 245, 20, 233,
- 39, 138, 130, 58, 1, 125, 233, 39, 138, 130, 58, 1, 230, 225, 233, 39,
- 138, 130, 58, 1, 121, 233, 39, 138, 130, 58, 1, 245, 19, 233, 39, 138,
- 130, 58, 1, 59, 67, 130, 58, 1, 59, 219, 95, 58, 1, 59, 203, 130, 58, 1,
- 232, 108, 44, 249, 161, 254, 109, 58, 1, 223, 157, 120, 74, 58, 1, 223,
- 157, 124, 74, 58, 1, 223, 157, 245, 31, 78, 58, 1, 223, 157, 235, 193,
- 245, 31, 78, 58, 1, 121, 235, 193, 245, 31, 78, 58, 1, 218, 111, 22, 125,
- 216, 30, 58, 1, 218, 111, 22, 121, 216, 30, 7, 6, 1, 245, 199, 254, 170,
- 7, 4, 1, 245, 199, 254, 170, 7, 6, 1, 245, 199, 254, 196, 7, 4, 1, 245,
- 199, 254, 196, 7, 6, 1, 241, 207, 7, 4, 1, 241, 207, 7, 6, 1, 215, 40, 7,
- 4, 1, 215, 40, 7, 6, 1, 215, 229, 7, 4, 1, 215, 229, 7, 6, 1, 249, 110,
- 7, 4, 1, 249, 110, 7, 6, 1, 249, 111, 2, 249, 219, 7, 4, 1, 249, 111, 2,
- 249, 219, 7, 1, 4, 6, 245, 6, 7, 1, 4, 6, 222, 91, 7, 6, 1, 255, 73, 7,
- 4, 1, 255, 73, 7, 6, 1, 254, 73, 7, 4, 1, 254, 73, 7, 6, 1, 253, 192, 7,
- 4, 1, 253, 192, 7, 6, 1, 253, 176, 7, 4, 1, 253, 176, 7, 6, 1, 253, 177,
- 2, 203, 130, 7, 4, 1, 253, 177, 2, 203, 130, 7, 6, 1, 253, 167, 7, 4, 1,
- 253, 167, 7, 6, 1, 223, 49, 251, 67, 2, 247, 120, 7, 4, 1, 223, 49, 251,
- 67, 2, 247, 120, 7, 6, 1, 235, 24, 2, 91, 7, 4, 1, 235, 24, 2, 91, 7, 6,
- 1, 235, 24, 2, 247, 255, 91, 7, 4, 1, 235, 24, 2, 247, 255, 91, 7, 6, 1,
- 235, 24, 2, 218, 103, 22, 247, 255, 91, 7, 4, 1, 235, 24, 2, 218, 103,
- 22, 247, 255, 91, 7, 6, 1, 251, 135, 156, 7, 4, 1, 251, 135, 156, 7, 6,
- 1, 233, 149, 2, 125, 91, 7, 4, 1, 233, 149, 2, 125, 91, 7, 6, 1, 144, 2,
- 199, 218, 103, 226, 120, 7, 4, 1, 144, 2, 199, 218, 103, 226, 120, 7, 6,
- 1, 144, 2, 232, 123, 7, 4, 1, 144, 2, 232, 123, 7, 6, 1, 226, 183, 7, 4,
- 1, 226, 183, 7, 6, 1, 226, 106, 2, 218, 103, 216, 139, 248, 39, 7, 4, 1,
- 226, 106, 2, 218, 103, 216, 139, 248, 39, 7, 6, 1, 226, 106, 2, 244, 53,
- 7, 4, 1, 226, 106, 2, 244, 53, 7, 6, 1, 226, 106, 2, 218, 229, 217, 77,
- 7, 4, 1, 226, 106, 2, 218, 229, 217, 77, 7, 6, 1, 224, 97, 2, 218, 103,
- 216, 139, 248, 39, 7, 4, 1, 224, 97, 2, 218, 103, 216, 139, 248, 39, 7,
- 6, 1, 224, 97, 2, 247, 255, 91, 7, 4, 1, 224, 97, 2, 247, 255, 91, 7, 6,
- 1, 223, 224, 222, 186, 7, 4, 1, 223, 224, 222, 186, 7, 6, 1, 222, 130,
- 222, 186, 7, 4, 1, 222, 130, 222, 186, 7, 6, 1, 214, 106, 2, 247, 255,
- 91, 7, 4, 1, 214, 106, 2, 247, 255, 91, 7, 6, 1, 212, 106, 7, 4, 1, 212,
- 106, 7, 6, 1, 213, 145, 210, 159, 7, 4, 1, 213, 145, 210, 159, 7, 6, 1,
- 216, 152, 2, 91, 7, 4, 1, 216, 152, 2, 91, 7, 6, 1, 216, 152, 2, 218,
- 103, 216, 139, 248, 39, 7, 4, 1, 216, 152, 2, 218, 103, 216, 139, 248,
- 39, 7, 6, 1, 213, 245, 7, 4, 1, 213, 245, 7, 6, 1, 245, 65, 7, 4, 1, 245,
- 65, 7, 6, 1, 235, 171, 7, 4, 1, 235, 171, 7, 6, 1, 249, 207, 7, 4, 1,
- 249, 207, 58, 1, 214, 133, 7, 4, 1, 246, 69, 7, 4, 1, 232, 84, 7, 4, 1,
- 230, 80, 7, 4, 1, 227, 201, 7, 4, 1, 222, 129, 7, 1, 4, 6, 222, 129, 7,
- 4, 1, 215, 108, 7, 4, 1, 214, 197, 7, 6, 1, 235, 213, 249, 60, 7, 4, 1,
- 235, 213, 249, 60, 7, 6, 1, 235, 213, 245, 6, 7, 4, 1, 235, 213, 245, 6,
- 7, 6, 1, 235, 213, 243, 202, 7, 6, 1, 215, 94, 235, 213, 243, 202, 7, 4,
- 1, 215, 94, 235, 213, 243, 202, 7, 6, 1, 215, 94, 156, 7, 4, 1, 215, 94,
- 156, 7, 6, 1, 235, 213, 153, 7, 4, 1, 235, 213, 153, 7, 6, 1, 235, 213,
- 222, 91, 7, 4, 1, 235, 213, 222, 91, 7, 6, 1, 235, 213, 217, 152, 7, 4,
- 1, 235, 213, 217, 152, 58, 1, 121, 250, 31, 255, 14, 58, 1, 249, 226, 58,
- 1, 219, 251, 245, 98, 50, 7, 6, 1, 221, 255, 7, 4, 1, 221, 255, 7, 6, 1,
- 215, 94, 242, 60, 7, 4, 1, 233, 149, 2, 223, 55, 241, 52, 22, 252, 41, 7,
- 6, 1, 230, 26, 2, 248, 39, 7, 4, 1, 230, 26, 2, 248, 39, 7, 6, 1, 251,
- 67, 2, 130, 7, 4, 1, 251, 67, 2, 130, 7, 6, 1, 243, 203, 2, 226, 248, 91,
- 7, 4, 1, 243, 203, 2, 226, 248, 91, 7, 6, 1, 235, 24, 2, 226, 248, 91, 7,
- 4, 1, 235, 24, 2, 226, 248, 91, 7, 6, 1, 230, 26, 2, 226, 248, 91, 7, 4,
- 1, 230, 26, 2, 226, 248, 91, 7, 6, 1, 223, 224, 2, 226, 248, 91, 7, 4, 1,
- 223, 224, 2, 226, 248, 91, 7, 6, 1, 222, 92, 2, 226, 248, 91, 7, 4, 1,
- 222, 92, 2, 226, 248, 91, 7, 6, 1, 242, 61, 2, 103, 58, 1, 6, 242, 61, 2,
- 91, 58, 1, 4, 27, 226, 234, 7, 1, 4, 6, 215, 94, 193, 7, 245, 103, 1,
- 223, 49, 245, 6, 7, 245, 103, 1, 223, 49, 226, 105, 7, 245, 103, 1, 235,
- 193, 193, 7, 245, 103, 1, 240, 154, 232, 129, 7, 245, 103, 1, 254, 23,
- 193, 217, 230, 229, 214, 1, 61, 217, 230, 229, 214, 1, 73, 217, 230, 229,
- 214, 5, 246, 48, 217, 230, 229, 214, 1, 70, 217, 230, 229, 214, 1, 75,
- 217, 230, 229, 214, 1, 76, 217, 230, 229, 214, 5, 241, 253, 217, 230,
- 229, 214, 1, 234, 28, 217, 230, 229, 214, 1, 234, 105, 217, 230, 229,
- 214, 1, 242, 174, 217, 230, 229, 214, 1, 242, 224, 217, 230, 229, 214, 5,
- 254, 75, 217, 230, 229, 214, 1, 249, 238, 217, 230, 229, 214, 1, 250, 86,
- 217, 230, 229, 214, 1, 235, 68, 217, 230, 229, 214, 1, 235, 109, 217,
- 230, 229, 214, 1, 215, 133, 217, 230, 229, 214, 1, 215, 139, 217, 230,
- 229, 214, 1, 248, 105, 217, 230, 229, 214, 1, 248, 114, 217, 230, 229,
- 214, 1, 111, 217, 230, 229, 214, 1, 216, 156, 217, 230, 229, 214, 1, 247,
- 145, 217, 230, 229, 214, 1, 248, 7, 217, 230, 229, 214, 1, 228, 74, 217,
- 230, 229, 214, 1, 225, 16, 217, 230, 229, 214, 1, 225, 121, 217, 230,
- 229, 214, 1, 251, 205, 217, 230, 229, 214, 1, 252, 10, 217, 230, 229,
- 214, 1, 230, 161, 217, 230, 229, 214, 1, 222, 211, 217, 230, 229, 214, 1,
- 232, 156, 217, 230, 229, 214, 1, 222, 165, 217, 230, 229, 214, 1, 219,
- 58, 217, 230, 229, 214, 1, 241, 68, 217, 230, 229, 214, 25, 5, 61, 217,
- 230, 229, 214, 25, 5, 73, 217, 230, 229, 214, 25, 5, 70, 217, 230, 229,
- 214, 25, 5, 75, 217, 230, 229, 214, 25, 5, 226, 183, 217, 230, 229, 214,
- 225, 12, 231, 158, 217, 230, 229, 214, 225, 12, 231, 157, 217, 230, 229,
- 214, 225, 12, 231, 156, 217, 230, 229, 214, 225, 12, 231, 155, 228, 56,
- 235, 240, 244, 2, 123, 224, 21, 228, 56, 235, 240, 244, 2, 123, 242, 27,
- 228, 56, 235, 240, 244, 2, 134, 224, 19, 228, 56, 235, 240, 244, 2, 123,
- 219, 117, 228, 56, 235, 240, 244, 2, 123, 245, 188, 228, 56, 235, 240,
- 244, 2, 134, 219, 116, 228, 56, 235, 240, 224, 22, 78, 228, 56, 235, 240,
- 225, 40, 78, 228, 56, 235, 240, 222, 118, 78, 228, 56, 235, 240, 224, 23,
- 78, 225, 144, 1, 176, 225, 144, 1, 234, 132, 225, 144, 1, 243, 135, 225,
- 144, 1, 229, 77, 225, 144, 1, 251, 33, 225, 144, 1, 250, 157, 225, 144,
- 1, 235, 141, 225, 144, 1, 227, 165, 225, 144, 1, 217, 105, 225, 144, 1,
- 216, 208, 225, 144, 1, 248, 221, 225, 144, 1, 197, 225, 144, 1, 190, 225,
- 144, 1, 225, 147, 225, 144, 1, 252, 191, 225, 144, 1, 184, 225, 144, 1,
- 215, 183, 225, 144, 1, 215, 175, 225, 144, 1, 246, 38, 225, 144, 1, 212,
- 65, 225, 144, 1, 210, 82, 225, 144, 1, 210, 116, 225, 144, 1, 4, 61, 225,
- 144, 1, 191, 225, 144, 1, 205, 225, 144, 1, 233, 135, 225, 144, 1, 220,
- 102, 225, 144, 1, 206, 225, 144, 1, 162, 225, 144, 1, 61, 225, 144, 1,
- 73, 225, 144, 1, 70, 225, 144, 1, 75, 225, 144, 1, 76, 225, 144, 1, 224,
- 88, 225, 144, 1, 211, 165, 225, 144, 1, 244, 196, 225, 144, 1, 243, 29,
- 225, 144, 1, 245, 209, 225, 144, 218, 73, 1, 212, 65, 225, 144, 218, 73,
- 1, 191, 225, 144, 1, 215, 156, 225, 144, 1, 215, 144, 225, 144, 1, 248,
- 135, 225, 144, 1, 228, 110, 225, 144, 1, 254, 141, 191, 225, 144, 1, 213,
- 134, 220, 102, 225, 144, 1, 213, 135, 162, 225, 144, 1, 253, 223, 244,
- 196, 225, 144, 218, 73, 1, 205, 225, 144, 218, 25, 1, 205, 225, 144, 1,
- 250, 255, 225, 144, 219, 155, 241, 236, 78, 225, 144, 52, 241, 236, 78,
- 225, 144, 164, 220, 95, 225, 144, 164, 52, 220, 95, 179, 5, 254, 75, 179,
- 5, 213, 147, 179, 1, 61, 179, 1, 255, 73, 179, 1, 73, 179, 1, 236, 33,
- 179, 1, 70, 179, 1, 214, 118, 179, 1, 149, 153, 179, 1, 149, 222, 180,
- 179, 1, 149, 156, 179, 1, 149, 232, 185, 179, 1, 75, 179, 1, 245, 209,
- 179, 1, 254, 201, 179, 1, 76, 179, 1, 226, 183, 179, 1, 253, 192, 179, 1,
- 176, 179, 1, 234, 132, 179, 1, 243, 135, 179, 1, 242, 249, 179, 1, 229,
- 77, 179, 1, 251, 33, 179, 1, 250, 157, 179, 1, 235, 141, 179, 1, 235,
- 114, 179, 1, 227, 165, 179, 1, 215, 156, 179, 1, 215, 144, 179, 1, 248,
- 135, 179, 1, 248, 119, 179, 1, 228, 110, 179, 1, 217, 105, 179, 1, 216,
- 208, 179, 1, 248, 221, 179, 1, 248, 25, 179, 1, 197, 179, 1, 190, 179, 1,
- 225, 147, 179, 1, 252, 191, 179, 1, 252, 18, 179, 1, 184, 179, 1, 191,
- 179, 1, 205, 179, 1, 233, 135, 179, 1, 214, 27, 179, 1, 220, 102, 179, 1,
- 218, 223, 179, 1, 206, 179, 1, 162, 179, 1, 232, 184, 179, 116, 5, 242,
- 44, 179, 25, 5, 255, 73, 179, 25, 5, 73, 179, 25, 5, 236, 33, 179, 25, 5,
+ 210, 203, 24, 1, 210, 204, 24, 1, 210, 207, 24, 1, 254, 35, 24, 1, 254,
+ 29, 109, 254, 100, 232, 204, 78, 109, 254, 100, 223, 51, 78, 109, 254,
+ 100, 123, 78, 109, 254, 100, 113, 78, 109, 254, 100, 134, 78, 109, 254,
+ 100, 244, 12, 78, 109, 254, 100, 216, 15, 78, 109, 254, 100, 230, 225,
+ 78, 109, 254, 100, 251, 176, 78, 109, 254, 100, 244, 93, 78, 109, 254,
+ 100, 221, 177, 78, 109, 254, 100, 216, 170, 78, 109, 254, 100, 244, 5,
+ 78, 109, 254, 100, 241, 225, 78, 109, 254, 100, 245, 225, 78, 109, 254,
+ 100, 231, 187, 78, 251, 185, 1, 251, 126, 251, 185, 1, 210, 44, 251, 185,
+ 1, 235, 109, 251, 185, 1, 242, 114, 251, 185, 1, 245, 210, 251, 185, 1,
+ 245, 136, 251, 185, 1, 226, 184, 251, 185, 1, 226, 188, 251, 185, 1, 235,
+ 180, 251, 185, 1, 254, 102, 251, 185, 1, 235, 225, 251, 185, 1, 214, 168,
+ 251, 185, 1, 236, 17, 251, 185, 1, 229, 58, 251, 185, 1, 254, 196, 251,
+ 185, 1, 253, 188, 251, 185, 1, 254, 137, 251, 185, 1, 226, 205, 251, 185,
+ 1, 226, 190, 251, 185, 1, 235, 222, 251, 185, 40, 1, 226, 106, 251, 185,
+ 40, 1, 217, 153, 251, 185, 40, 1, 235, 24, 251, 185, 40, 1, 242, 61, 251,
+ 185, 1, 242, 251, 251, 185, 1, 233, 0, 251, 185, 1, 209, 250, 9, 218,
+ 104, 217, 153, 9, 218, 104, 212, 4, 9, 218, 104, 211, 158, 9, 218, 104,
+ 251, 80, 9, 218, 104, 217, 255, 9, 218, 104, 240, 159, 9, 218, 104, 240,
+ 163, 9, 218, 104, 240, 232, 9, 218, 104, 240, 160, 9, 218, 104, 217, 156,
+ 9, 218, 104, 240, 162, 9, 218, 104, 240, 158, 9, 218, 104, 240, 230, 9,
+ 218, 104, 240, 161, 9, 218, 104, 240, 157, 9, 218, 104, 230, 26, 9, 218,
+ 104, 242, 61, 9, 218, 104, 222, 92, 9, 218, 104, 226, 106, 9, 218, 104,
+ 219, 22, 9, 218, 104, 249, 61, 9, 218, 104, 240, 164, 9, 218, 104, 241,
+ 191, 9, 218, 104, 217, 165, 9, 218, 104, 217, 234, 9, 218, 104, 218, 169,
+ 9, 218, 104, 220, 111, 9, 218, 104, 225, 225, 9, 218, 104, 224, 99, 9,
+ 218, 104, 216, 44, 9, 218, 104, 217, 155, 9, 218, 104, 217, 245, 9, 218,
+ 104, 240, 171, 9, 218, 104, 240, 156, 9, 218, 104, 225, 150, 9, 218, 104,
+ 224, 97, 56, 1, 4, 233, 218, 56, 1, 4, 219, 192, 56, 1, 4, 218, 84, 56,
+ 1, 4, 111, 56, 1, 4, 227, 238, 56, 1, 4, 162, 56, 1, 4, 241, 181, 56, 1,
+ 4, 240, 223, 56, 1, 4, 241, 239, 56, 1, 4, 241, 69, 56, 1, 4, 230, 103,
+ 56, 1, 4, 205, 56, 1, 4, 223, 36, 56, 1, 4, 222, 141, 56, 1, 4, 223, 129,
+ 56, 1, 4, 222, 212, 88, 24, 234, 59, 88, 24, 228, 227, 88, 24, 216, 102,
+ 88, 24, 223, 27, 88, 24, 230, 218, 88, 24, 225, 96, 88, 24, 219, 149, 88,
+ 24, 236, 57, 88, 24, 250, 47, 88, 24, 250, 107, 88, 24, 234, 111, 88, 24,
+ 216, 174, 88, 24, 225, 132, 88, 24, 241, 173, 88, 24, 234, 60, 61, 88,
+ 24, 228, 228, 61, 88, 24, 216, 103, 61, 88, 24, 223, 28, 61, 88, 24, 230,
+ 219, 61, 88, 24, 225, 97, 61, 88, 24, 219, 150, 61, 88, 24, 236, 58, 61,
+ 88, 24, 250, 48, 61, 88, 24, 250, 108, 61, 88, 24, 234, 112, 61, 88, 24,
+ 216, 175, 61, 88, 24, 225, 133, 61, 88, 24, 241, 174, 61, 88, 24, 250,
+ 48, 70, 88, 234, 4, 135, 226, 218, 88, 234, 4, 135, 144, 240, 223, 88,
+ 154, 110, 88, 154, 105, 88, 154, 158, 88, 154, 161, 88, 154, 189, 88,
+ 154, 194, 88, 154, 198, 88, 154, 195, 88, 154, 200, 88, 154, 216, 248,
+ 88, 154, 230, 129, 88, 154, 244, 97, 88, 154, 212, 40, 88, 154, 211, 214,
+ 88, 154, 231, 40, 88, 154, 245, 224, 88, 154, 218, 38, 88, 154, 218, 133,
+ 88, 154, 241, 245, 88, 154, 219, 55, 88, 154, 229, 205, 88, 154, 219, 5,
+ 88, 154, 244, 103, 88, 154, 249, 201, 88, 154, 233, 126, 88, 154, 223,
+ 72, 88, 154, 251, 16, 88, 154, 218, 88, 88, 154, 218, 21, 88, 154, 245,
+ 128, 88, 154, 223, 64, 88, 154, 254, 151, 88, 154, 244, 129, 88, 154,
+ 223, 62, 88, 154, 220, 157, 88, 154, 223, 128, 37, 154, 224, 13, 37, 154,
+ 234, 81, 37, 154, 221, 199, 37, 154, 234, 0, 37, 54, 216, 249, 226, 198,
+ 85, 218, 235, 37, 54, 215, 74, 226, 198, 85, 218, 235, 37, 54, 216, 164,
+ 226, 198, 85, 218, 235, 37, 54, 244, 17, 226, 198, 85, 218, 235, 37, 54,
+ 244, 116, 226, 198, 85, 218, 235, 37, 54, 219, 113, 226, 198, 85, 218,
+ 235, 37, 54, 220, 118, 226, 198, 85, 218, 235, 37, 54, 245, 186, 226,
+ 198, 85, 218, 235, 225, 252, 50, 37, 54, 215, 74, 110, 37, 54, 215, 74,
+ 105, 37, 54, 215, 74, 158, 37, 54, 215, 74, 161, 37, 54, 215, 74, 189,
+ 37, 54, 215, 74, 194, 37, 54, 215, 74, 198, 37, 54, 215, 74, 195, 37, 54,
+ 215, 74, 200, 37, 54, 216, 163, 37, 54, 216, 164, 110, 37, 54, 216, 164,
+ 105, 37, 54, 216, 164, 158, 37, 54, 216, 164, 161, 37, 54, 216, 164, 189,
+ 37, 24, 234, 59, 37, 24, 228, 227, 37, 24, 216, 102, 37, 24, 223, 27, 37,
+ 24, 230, 218, 37, 24, 225, 96, 37, 24, 219, 149, 37, 24, 236, 57, 37, 24,
+ 250, 47, 37, 24, 250, 107, 37, 24, 234, 111, 37, 24, 216, 174, 37, 24,
+ 225, 132, 37, 24, 241, 173, 37, 24, 234, 60, 61, 37, 24, 228, 228, 61,
+ 37, 24, 216, 103, 61, 37, 24, 223, 28, 61, 37, 24, 230, 219, 61, 37, 24,
+ 225, 97, 61, 37, 24, 219, 150, 61, 37, 24, 236, 58, 61, 37, 24, 250, 48,
+ 61, 37, 24, 250, 108, 61, 37, 24, 234, 112, 61, 37, 24, 216, 175, 61, 37,
+ 24, 225, 133, 61, 37, 24, 241, 174, 61, 37, 234, 4, 135, 250, 149, 37,
+ 234, 4, 135, 235, 48, 37, 24, 236, 58, 70, 234, 4, 218, 160, 87, 37, 154,
+ 110, 37, 154, 105, 37, 154, 158, 37, 154, 161, 37, 154, 189, 37, 154,
+ 194, 37, 154, 198, 37, 154, 195, 37, 154, 200, 37, 154, 216, 248, 37,
+ 154, 230, 129, 37, 154, 244, 97, 37, 154, 212, 40, 37, 154, 211, 214, 37,
+ 154, 231, 40, 37, 154, 245, 224, 37, 154, 218, 38, 37, 154, 218, 133, 37,
+ 154, 241, 245, 37, 154, 219, 55, 37, 154, 229, 205, 37, 154, 219, 5, 37,
+ 154, 244, 103, 37, 154, 249, 201, 37, 154, 233, 126, 37, 154, 221, 175,
+ 37, 154, 231, 190, 37, 154, 244, 138, 37, 154, 218, 50, 37, 154, 245, 35,
+ 37, 154, 224, 188, 37, 154, 253, 197, 37, 154, 235, 160, 37, 154, 223,
+ 62, 37, 154, 249, 165, 37, 154, 249, 156, 37, 154, 241, 166, 37, 154,
+ 250, 175, 37, 154, 232, 111, 37, 154, 233, 47, 37, 154, 222, 252, 37,
+ 154, 231, 84, 37, 154, 223, 88, 37, 154, 218, 88, 37, 154, 218, 21, 37,
+ 154, 245, 128, 37, 154, 223, 64, 37, 154, 254, 151, 37, 154, 228, 213,
+ 37, 54, 216, 164, 194, 37, 54, 216, 164, 198, 37, 54, 216, 164, 195, 37,
+ 54, 216, 164, 200, 37, 54, 244, 16, 37, 54, 244, 17, 110, 37, 54, 244,
+ 17, 105, 37, 54, 244, 17, 158, 37, 54, 244, 17, 161, 37, 54, 244, 17,
+ 189, 37, 54, 244, 17, 194, 37, 54, 244, 17, 198, 37, 54, 244, 17, 195,
+ 37, 54, 244, 17, 200, 37, 54, 244, 115, 109, 217, 4, 16, 31, 235, 134,
+ 109, 217, 4, 16, 31, 244, 149, 109, 217, 4, 16, 31, 231, 161, 109, 217,
+ 4, 16, 31, 254, 48, 109, 217, 4, 16, 31, 231, 133, 109, 217, 4, 16, 31,
+ 235, 46, 109, 217, 4, 16, 31, 235, 47, 109, 217, 4, 16, 31, 253, 189,
+ 109, 217, 4, 16, 31, 220, 137, 109, 217, 4, 16, 31, 226, 240, 109, 217,
+ 4, 16, 31, 228, 41, 109, 217, 4, 16, 31, 248, 86, 42, 241, 191, 42, 245,
+ 89, 42, 245, 44, 232, 220, 232, 241, 50, 37, 56, 61, 37, 56, 73, 37, 56,
+ 70, 37, 56, 75, 37, 56, 76, 37, 56, 176, 37, 56, 234, 93, 37, 56, 233,
+ 218, 37, 56, 234, 183, 37, 56, 234, 29, 37, 56, 206, 37, 56, 219, 192,
+ 37, 56, 218, 84, 37, 56, 221, 182, 37, 56, 219, 59, 37, 56, 217, 106, 37,
+ 56, 216, 118, 37, 56, 215, 119, 37, 56, 217, 23, 37, 56, 111, 37, 56,
+ 197, 37, 56, 228, 234, 37, 56, 227, 238, 37, 56, 229, 108, 37, 56, 228,
+ 75, 37, 56, 162, 37, 56, 241, 181, 37, 56, 240, 223, 37, 56, 241, 239,
+ 37, 56, 241, 69, 37, 56, 185, 37, 56, 230, 231, 37, 56, 230, 103, 37, 56,
+ 231, 92, 37, 56, 230, 162, 37, 56, 191, 37, 56, 210, 212, 37, 56, 210,
+ 244, 37, 56, 205, 37, 56, 223, 36, 37, 56, 222, 141, 37, 56, 223, 129,
+ 37, 56, 222, 212, 37, 56, 212, 65, 37, 56, 211, 250, 37, 56, 212, 22, 37,
+ 56, 211, 227, 42, 254, 72, 42, 253, 240, 42, 254, 96, 42, 255, 32, 42,
+ 235, 227, 42, 235, 197, 42, 214, 166, 42, 245, 67, 42, 245, 207, 42, 226,
+ 187, 42, 226, 181, 42, 234, 246, 42, 234, 215, 42, 234, 212, 42, 243, 93,
+ 42, 243, 102, 42, 242, 205, 42, 242, 201, 42, 233, 151, 42, 242, 194, 42,
+ 234, 73, 42, 234, 72, 42, 234, 71, 42, 234, 70, 42, 242, 87, 42, 242, 86,
+ 42, 233, 194, 42, 233, 196, 42, 234, 179, 42, 234, 2, 42, 234, 9, 42,
+ 222, 17, 42, 221, 238, 42, 219, 130, 42, 220, 142, 42, 220, 141, 42, 248,
+ 219, 42, 248, 37, 42, 247, 122, 42, 216, 33, 42, 229, 201, 42, 228, 42,
+ 42, 242, 33, 42, 226, 85, 42, 226, 84, 42, 252, 189, 42, 225, 106, 42,
+ 225, 70, 42, 225, 71, 42, 251, 235, 42, 240, 222, 42, 240, 218, 42, 251,
+ 92, 42, 240, 205, 42, 241, 216, 42, 225, 160, 42, 225, 195, 42, 241, 199,
+ 42, 225, 192, 42, 225, 208, 42, 252, 62, 42, 225, 7, 42, 251, 181, 42,
+ 241, 57, 42, 224, 251, 42, 241, 49, 42, 241, 51, 42, 231, 202, 42, 231,
+ 198, 42, 231, 207, 42, 231, 151, 42, 231, 176, 42, 230, 198, 42, 230,
+ 177, 42, 230, 176, 42, 231, 75, 42, 231, 72, 42, 231, 76, 42, 211, 102,
+ 42, 211, 100, 42, 210, 201, 42, 222, 227, 42, 222, 231, 42, 222, 118, 42,
+ 222, 112, 42, 223, 86, 42, 223, 83, 42, 212, 38, 109, 217, 4, 16, 31,
+ 240, 240, 210, 86, 109, 217, 4, 16, 31, 240, 240, 110, 109, 217, 4, 16,
+ 31, 240, 240, 105, 109, 217, 4, 16, 31, 240, 240, 158, 109, 217, 4, 16,
+ 31, 240, 240, 161, 109, 217, 4, 16, 31, 240, 240, 189, 109, 217, 4, 16,
+ 31, 240, 240, 194, 109, 217, 4, 16, 31, 240, 240, 198, 109, 217, 4, 16,
+ 31, 240, 240, 195, 109, 217, 4, 16, 31, 240, 240, 200, 109, 217, 4, 16,
+ 31, 240, 240, 216, 248, 109, 217, 4, 16, 31, 240, 240, 245, 168, 109,
+ 217, 4, 16, 31, 240, 240, 215, 76, 109, 217, 4, 16, 31, 240, 240, 216,
+ 165, 109, 217, 4, 16, 31, 240, 240, 244, 6, 109, 217, 4, 16, 31, 240,
+ 240, 244, 119, 109, 217, 4, 16, 31, 240, 240, 219, 120, 109, 217, 4, 16,
+ 31, 240, 240, 220, 120, 109, 217, 4, 16, 31, 240, 240, 245, 191, 109,
+ 217, 4, 16, 31, 240, 240, 228, 198, 109, 217, 4, 16, 31, 240, 240, 215,
+ 73, 109, 217, 4, 16, 31, 240, 240, 215, 67, 109, 217, 4, 16, 31, 240,
+ 240, 215, 63, 109, 217, 4, 16, 31, 240, 240, 215, 64, 109, 217, 4, 16,
+ 31, 240, 240, 215, 69, 42, 240, 231, 42, 248, 222, 42, 253, 193, 42, 130,
+ 42, 226, 126, 42, 225, 226, 42, 247, 148, 42, 247, 149, 218, 234, 42,
+ 247, 149, 249, 109, 42, 235, 157, 42, 245, 92, 229, 206, 241, 217, 42,
+ 245, 92, 229, 206, 217, 175, 42, 245, 92, 229, 206, 217, 75, 42, 245, 92,
+ 229, 206, 231, 71, 42, 249, 158, 42, 226, 91, 254, 126, 42, 197, 42, 230,
+ 104, 61, 42, 185, 42, 176, 42, 234, 186, 42, 231, 130, 42, 243, 81, 42,
+ 251, 19, 42, 234, 185, 42, 225, 151, 42, 229, 82, 42, 230, 104, 245, 7,
+ 42, 230, 104, 243, 203, 42, 231, 16, 42, 234, 135, 42, 240, 164, 42, 234,
+ 95, 42, 230, 233, 42, 242, 217, 42, 216, 120, 42, 230, 104, 156, 42, 230,
+ 170, 42, 247, 158, 42, 234, 41, 42, 244, 46, 42, 228, 113, 42, 230, 104,
+ 193, 42, 230, 167, 42, 249, 240, 42, 234, 35, 42, 230, 168, 218, 234, 42,
+ 249, 241, 218, 234, 42, 232, 51, 218, 234, 42, 234, 36, 218, 234, 42,
+ 230, 168, 249, 109, 42, 249, 241, 249, 109, 42, 232, 51, 249, 109, 42,
+ 234, 36, 249, 109, 42, 232, 51, 117, 222, 92, 42, 232, 51, 117, 222, 93,
+ 218, 234, 42, 190, 42, 233, 252, 42, 230, 106, 42, 242, 152, 42, 223,
+ 177, 42, 223, 178, 117, 222, 92, 42, 223, 178, 117, 222, 93, 218, 234,
+ 42, 224, 163, 42, 228, 14, 42, 230, 104, 222, 92, 42, 230, 105, 42, 224,
+ 117, 42, 227, 177, 42, 230, 104, 214, 105, 42, 230, 50, 42, 233, 186, 42,
+ 230, 51, 231, 75, 42, 224, 116, 42, 227, 176, 42, 230, 104, 212, 98, 42,
+ 230, 44, 42, 233, 184, 42, 230, 45, 231, 75, 42, 235, 25, 226, 221, 42,
+ 232, 51, 226, 221, 42, 254, 137, 42, 251, 161, 42, 250, 215, 42, 250,
+ 192, 42, 251, 68, 117, 234, 135, 42, 249, 239, 42, 248, 143, 42, 242, 73,
+ 42, 162, 42, 240, 232, 42, 236, 0, 42, 234, 48, 42, 234, 36, 250, 251,
+ 42, 233, 220, 42, 232, 160, 42, 232, 159, 42, 232, 148, 42, 232, 64, 42,
+ 231, 131, 219, 80, 42, 230, 197, 42, 230, 153, 42, 225, 149, 42, 225, 20,
+ 42, 224, 220, 42, 224, 218, 42, 218, 228, 42, 218, 3, 42, 212, 24, 42,
+ 214, 106, 117, 193, 42, 115, 117, 193, 109, 217, 4, 16, 31, 248, 147,
+ 110, 109, 217, 4, 16, 31, 248, 147, 105, 109, 217, 4, 16, 31, 248, 147,
+ 158, 109, 217, 4, 16, 31, 248, 147, 161, 109, 217, 4, 16, 31, 248, 147,
+ 189, 109, 217, 4, 16, 31, 248, 147, 194, 109, 217, 4, 16, 31, 248, 147,
+ 198, 109, 217, 4, 16, 31, 248, 147, 195, 109, 217, 4, 16, 31, 248, 147,
+ 200, 109, 217, 4, 16, 31, 248, 147, 216, 248, 109, 217, 4, 16, 31, 248,
+ 147, 245, 168, 109, 217, 4, 16, 31, 248, 147, 215, 76, 109, 217, 4, 16,
+ 31, 248, 147, 216, 165, 109, 217, 4, 16, 31, 248, 147, 244, 6, 109, 217,
+ 4, 16, 31, 248, 147, 244, 119, 109, 217, 4, 16, 31, 248, 147, 219, 120,
+ 109, 217, 4, 16, 31, 248, 147, 220, 120, 109, 217, 4, 16, 31, 248, 147,
+ 245, 191, 109, 217, 4, 16, 31, 248, 147, 228, 198, 109, 217, 4, 16, 31,
+ 248, 147, 215, 73, 109, 217, 4, 16, 31, 248, 147, 215, 67, 109, 217, 4,
+ 16, 31, 248, 147, 215, 63, 109, 217, 4, 16, 31, 248, 147, 215, 64, 109,
+ 217, 4, 16, 31, 248, 147, 215, 69, 109, 217, 4, 16, 31, 248, 147, 215,
+ 70, 109, 217, 4, 16, 31, 248, 147, 215, 65, 109, 217, 4, 16, 31, 248,
+ 147, 215, 66, 109, 217, 4, 16, 31, 248, 147, 215, 72, 109, 217, 4, 16,
+ 31, 248, 147, 215, 68, 109, 217, 4, 16, 31, 248, 147, 216, 163, 109, 217,
+ 4, 16, 31, 248, 147, 216, 162, 42, 243, 119, 241, 193, 31, 216, 197, 249,
+ 141, 241, 224, 241, 193, 31, 216, 197, 223, 123, 245, 224, 241, 193, 31,
+ 247, 232, 253, 208, 216, 197, 252, 57, 241, 193, 31, 210, 223, 244, 39,
+ 241, 193, 31, 212, 59, 241, 193, 31, 249, 204, 241, 193, 31, 216, 197,
+ 254, 4, 241, 193, 31, 241, 61, 216, 39, 241, 193, 31, 4, 217, 62, 241,
+ 193, 31, 215, 238, 241, 193, 31, 225, 220, 241, 193, 31, 218, 159, 241,
+ 193, 31, 244, 140, 241, 193, 31, 242, 133, 224, 241, 241, 193, 31, 230,
+ 156, 241, 193, 31, 245, 127, 241, 193, 31, 244, 40, 241, 193, 31, 211,
+ 207, 226, 198, 216, 197, 248, 87, 241, 193, 31, 254, 52, 241, 193, 31,
+ 249, 186, 241, 193, 31, 251, 228, 216, 139, 241, 193, 31, 242, 150, 241,
+ 193, 31, 218, 246, 254, 71, 241, 193, 31, 223, 54, 241, 193, 31, 235,
+ 221, 241, 193, 31, 242, 133, 217, 62, 241, 193, 31, 230, 112, 249, 160,
+ 241, 193, 31, 242, 133, 224, 198, 241, 193, 31, 216, 197, 255, 19, 212,
+ 40, 241, 193, 31, 216, 197, 250, 9, 244, 97, 241, 193, 31, 235, 234, 241,
+ 193, 31, 246, 58, 241, 193, 31, 223, 57, 241, 193, 31, 242, 133, 224,
+ 225, 241, 193, 31, 224, 178, 241, 193, 31, 248, 162, 64, 216, 197, 232,
+ 231, 241, 193, 31, 216, 197, 244, 175, 241, 193, 31, 226, 164, 241, 193,
+ 31, 226, 245, 241, 193, 31, 248, 60, 241, 193, 31, 248, 80, 241, 193, 31,
+ 235, 248, 241, 193, 31, 251, 150, 241, 193, 31, 249, 222, 216, 43, 231,
+ 77, 241, 193, 31, 243, 88, 216, 39, 241, 193, 31, 224, 126, 214, 154,
+ 241, 193, 31, 226, 163, 241, 193, 31, 216, 197, 212, 13, 241, 193, 31,
+ 223, 46, 241, 193, 31, 216, 197, 250, 221, 241, 193, 31, 216, 197, 254,
+ 0, 216, 134, 241, 193, 31, 216, 197, 234, 180, 218, 135, 230, 116, 241,
+ 193, 31, 248, 33, 241, 193, 31, 216, 197, 231, 153, 231, 203, 241, 193,
+ 31, 255, 20, 241, 193, 31, 216, 197, 212, 54, 241, 193, 31, 216, 197,
+ 243, 48, 211, 239, 241, 193, 31, 216, 197, 235, 53, 233, 108, 241, 193,
+ 31, 247, 185, 241, 193, 31, 232, 221, 241, 193, 31, 235, 224, 215, 188,
+ 241, 193, 31, 4, 224, 198, 241, 193, 31, 254, 218, 249, 213, 241, 193,
+ 31, 252, 60, 249, 213, 8, 3, 235, 161, 8, 3, 235, 154, 8, 3, 73, 8, 3,
+ 235, 183, 8, 3, 236, 59, 8, 3, 236, 42, 8, 3, 236, 61, 8, 3, 236, 60, 8,
+ 3, 253, 207, 8, 3, 253, 170, 8, 3, 61, 8, 3, 254, 73, 8, 3, 214, 164, 8,
+ 3, 214, 167, 8, 3, 214, 165, 8, 3, 226, 141, 8, 3, 226, 115, 8, 3, 76, 8,
+ 3, 226, 176, 8, 3, 245, 36, 8, 3, 75, 8, 3, 211, 195, 8, 3, 251, 229, 8,
+ 3, 251, 226, 8, 3, 252, 7, 8, 3, 251, 239, 8, 3, 251, 252, 8, 3, 251,
+ 251, 8, 3, 251, 254, 8, 3, 251, 253, 8, 3, 252, 122, 8, 3, 252, 114, 8,
+ 3, 252, 192, 8, 3, 252, 143, 8, 3, 251, 102, 8, 3, 251, 106, 8, 3, 251,
+ 103, 8, 3, 251, 180, 8, 3, 251, 164, 8, 3, 251, 206, 8, 3, 251, 186, 8,
+ 3, 252, 22, 8, 3, 252, 76, 8, 3, 252, 34, 8, 3, 251, 88, 8, 3, 251, 85,
+ 8, 3, 251, 126, 8, 3, 251, 101, 8, 3, 251, 95, 8, 3, 251, 99, 8, 3, 251,
+ 73, 8, 3, 251, 71, 8, 3, 251, 78, 8, 3, 251, 76, 8, 3, 251, 74, 8, 3,
+ 251, 75, 8, 3, 225, 50, 8, 3, 225, 46, 8, 3, 225, 109, 8, 3, 225, 60, 8,
+ 3, 225, 76, 8, 3, 225, 103, 8, 3, 225, 99, 8, 3, 225, 241, 8, 3, 225,
+ 231, 8, 3, 190, 8, 3, 226, 22, 8, 3, 224, 136, 8, 3, 224, 138, 8, 3, 224,
+ 137, 8, 3, 224, 234, 8, 3, 224, 223, 8, 3, 225, 17, 8, 3, 224, 246, 8, 3,
+ 224, 122, 8, 3, 224, 118, 8, 3, 224, 151, 8, 3, 224, 135, 8, 3, 224, 127,
+ 8, 3, 224, 133, 8, 3, 224, 101, 8, 3, 224, 100, 8, 3, 224, 105, 8, 3,
+ 224, 104, 8, 3, 224, 102, 8, 3, 224, 103, 8, 3, 252, 97, 8, 3, 252, 96,
+ 8, 3, 252, 103, 8, 3, 252, 98, 8, 3, 252, 100, 8, 3, 252, 99, 8, 3, 252,
+ 102, 8, 3, 252, 101, 8, 3, 252, 109, 8, 3, 252, 108, 8, 3, 252, 112, 8,
+ 3, 252, 110, 8, 3, 252, 88, 8, 3, 252, 90, 8, 3, 252, 89, 8, 3, 252, 93,
+ 8, 3, 252, 92, 8, 3, 252, 95, 8, 3, 252, 94, 8, 3, 252, 104, 8, 3, 252,
+ 107, 8, 3, 252, 105, 8, 3, 252, 84, 8, 3, 252, 83, 8, 3, 252, 91, 8, 3,
+ 252, 87, 8, 3, 252, 85, 8, 3, 252, 86, 8, 3, 252, 80, 8, 3, 252, 79, 8,
+ 3, 252, 82, 8, 3, 252, 81, 8, 3, 229, 170, 8, 3, 229, 169, 8, 3, 229,
+ 175, 8, 3, 229, 171, 8, 3, 229, 172, 8, 3, 229, 174, 8, 3, 229, 173, 8,
+ 3, 229, 178, 8, 3, 229, 177, 8, 3, 229, 180, 8, 3, 229, 179, 8, 3, 229,
+ 166, 8, 3, 229, 165, 8, 3, 229, 168, 8, 3, 229, 167, 8, 3, 229, 159, 8,
+ 3, 229, 158, 8, 3, 229, 163, 8, 3, 229, 162, 8, 3, 229, 160, 8, 3, 229,
+ 161, 8, 3, 229, 153, 8, 3, 229, 152, 8, 3, 229, 157, 8, 3, 229, 156, 8,
+ 3, 229, 154, 8, 3, 229, 155, 8, 3, 241, 111, 8, 3, 241, 110, 8, 3, 241,
+ 116, 8, 3, 241, 112, 8, 3, 241, 113, 8, 3, 241, 115, 8, 3, 241, 114, 8,
+ 3, 241, 119, 8, 3, 241, 118, 8, 3, 241, 121, 8, 3, 241, 120, 8, 3, 241,
+ 102, 8, 3, 241, 104, 8, 3, 241, 103, 8, 3, 241, 107, 8, 3, 241, 106, 8,
+ 3, 241, 109, 8, 3, 241, 108, 8, 3, 241, 98, 8, 3, 241, 97, 8, 3, 241,
+ 105, 8, 3, 241, 101, 8, 3, 241, 99, 8, 3, 241, 100, 8, 3, 241, 92, 8, 3,
+ 241, 96, 8, 3, 241, 95, 8, 3, 241, 93, 8, 3, 241, 94, 8, 3, 230, 173, 8,
+ 3, 230, 172, 8, 3, 230, 231, 8, 3, 230, 179, 8, 3, 230, 204, 8, 3, 230,
+ 222, 8, 3, 230, 220, 8, 3, 231, 140, 8, 3, 231, 135, 8, 3, 185, 8, 3,
+ 231, 173, 8, 3, 230, 75, 8, 3, 230, 74, 8, 3, 230, 78, 8, 3, 230, 76, 8,
+ 3, 230, 122, 8, 3, 230, 108, 8, 3, 230, 162, 8, 3, 230, 127, 8, 3, 231,
+ 27, 8, 3, 231, 92, 8, 3, 230, 56, 8, 3, 230, 52, 8, 3, 230, 103, 8, 3,
+ 230, 71, 8, 3, 230, 64, 8, 3, 230, 69, 8, 3, 230, 29, 8, 3, 230, 28, 8,
+ 3, 230, 34, 8, 3, 230, 31, 8, 3, 244, 84, 8, 3, 244, 79, 8, 3, 244, 122,
+ 8, 3, 244, 99, 8, 3, 244, 168, 8, 3, 244, 159, 8, 3, 244, 197, 8, 3, 244,
+ 171, 8, 3, 244, 4, 8, 3, 244, 44, 8, 3, 244, 28, 8, 3, 243, 219, 8, 3,
+ 243, 218, 8, 3, 243, 235, 8, 3, 243, 224, 8, 3, 243, 222, 8, 3, 243, 223,
+ 8, 3, 243, 206, 8, 3, 243, 205, 8, 3, 243, 209, 8, 3, 243, 207, 8, 3,
+ 213, 144, 8, 3, 213, 139, 8, 3, 213, 176, 8, 3, 213, 153, 8, 3, 213, 166,
+ 8, 3, 213, 163, 8, 3, 213, 168, 8, 3, 213, 167, 8, 3, 214, 7, 8, 3, 214,
+ 2, 8, 3, 214, 27, 8, 3, 214, 18, 8, 3, 213, 125, 8, 3, 213, 121, 8, 3,
+ 213, 138, 8, 3, 213, 126, 8, 3, 213, 178, 8, 3, 213, 244, 8, 3, 212, 110,
+ 8, 3, 212, 108, 8, 3, 212, 116, 8, 3, 212, 113, 8, 3, 212, 111, 8, 3,
+ 212, 112, 8, 3, 212, 102, 8, 3, 212, 101, 8, 3, 212, 106, 8, 3, 212, 105,
+ 8, 3, 212, 103, 8, 3, 212, 104, 8, 3, 247, 179, 8, 3, 247, 167, 8, 3,
+ 248, 4, 8, 3, 247, 204, 8, 3, 247, 237, 8, 3, 247, 241, 8, 3, 247, 240,
+ 8, 3, 248, 153, 8, 3, 248, 148, 8, 3, 248, 222, 8, 3, 248, 173, 8, 3,
+ 246, 63, 8, 3, 246, 64, 8, 3, 247, 121, 8, 3, 246, 103, 8, 3, 247, 146,
+ 8, 3, 247, 123, 8, 3, 248, 31, 8, 3, 248, 91, 8, 3, 248, 46, 8, 3, 246,
+ 54, 8, 3, 246, 52, 8, 3, 246, 79, 8, 3, 246, 62, 8, 3, 246, 57, 8, 3,
+ 246, 60, 8, 3, 216, 68, 8, 3, 216, 62, 8, 3, 216, 118, 8, 3, 216, 77, 8,
+ 3, 216, 110, 8, 3, 216, 112, 8, 3, 216, 111, 8, 3, 217, 47, 8, 3, 217,
+ 34, 8, 3, 217, 106, 8, 3, 217, 55, 8, 3, 215, 103, 8, 3, 215, 102, 8, 3,
+ 215, 105, 8, 3, 215, 104, 8, 3, 216, 6, 8, 3, 216, 2, 8, 3, 111, 8, 3,
+ 216, 14, 8, 3, 216, 214, 8, 3, 217, 23, 8, 3, 216, 238, 8, 3, 215, 88, 8,
+ 3, 215, 83, 8, 3, 215, 119, 8, 3, 215, 101, 8, 3, 215, 89, 8, 3, 215, 99,
+ 8, 3, 248, 108, 8, 3, 248, 107, 8, 3, 248, 113, 8, 3, 248, 109, 8, 3,
+ 248, 110, 8, 3, 248, 112, 8, 3, 248, 111, 8, 3, 248, 129, 8, 3, 248, 128,
+ 8, 3, 248, 136, 8, 3, 248, 130, 8, 3, 248, 98, 8, 3, 248, 100, 8, 3, 248,
+ 99, 8, 3, 248, 103, 8, 3, 248, 102, 8, 3, 248, 106, 8, 3, 248, 104, 8, 3,
+ 248, 121, 8, 3, 248, 124, 8, 3, 248, 122, 8, 3, 248, 94, 8, 3, 248, 93,
+ 8, 3, 248, 101, 8, 3, 248, 97, 8, 3, 248, 95, 8, 3, 248, 96, 8, 3, 229,
+ 127, 8, 3, 229, 126, 8, 3, 229, 134, 8, 3, 229, 129, 8, 3, 229, 130, 8,
+ 3, 229, 131, 8, 3, 229, 143, 8, 3, 229, 142, 8, 3, 229, 149, 8, 3, 229,
+ 144, 8, 3, 229, 119, 8, 3, 229, 118, 8, 3, 229, 125, 8, 3, 229, 120, 8,
+ 3, 229, 135, 8, 3, 229, 141, 8, 3, 229, 139, 8, 3, 229, 111, 8, 3, 229,
+ 110, 8, 3, 229, 116, 8, 3, 229, 114, 8, 3, 229, 112, 8, 3, 229, 113, 8,
+ 3, 241, 78, 8, 3, 241, 77, 8, 3, 241, 84, 8, 3, 241, 79, 8, 3, 241, 81,
+ 8, 3, 241, 80, 8, 3, 241, 83, 8, 3, 241, 82, 8, 3, 241, 89, 8, 3, 241,
+ 88, 8, 3, 241, 91, 8, 3, 241, 90, 8, 3, 241, 72, 8, 3, 241, 73, 8, 3,
+ 241, 75, 8, 3, 241, 74, 8, 3, 241, 76, 8, 3, 241, 85, 8, 3, 241, 87, 8,
+ 3, 241, 86, 8, 3, 241, 71, 8, 3, 228, 190, 8, 3, 228, 188, 8, 3, 228,
+ 234, 8, 3, 228, 193, 8, 3, 228, 216, 8, 3, 228, 230, 8, 3, 228, 229, 8,
+ 3, 229, 184, 8, 3, 197, 8, 3, 229, 198, 8, 3, 227, 187, 8, 3, 227, 189,
+ 8, 3, 227, 188, 8, 3, 228, 52, 8, 3, 228, 39, 8, 3, 228, 75, 8, 3, 228,
+ 61, 8, 3, 229, 84, 8, 3, 229, 108, 8, 3, 229, 95, 8, 3, 227, 182, 8, 3,
+ 227, 178, 8, 3, 227, 238, 8, 3, 227, 186, 8, 3, 227, 184, 8, 3, 227, 185,
+ 8, 3, 241, 142, 8, 3, 241, 141, 8, 3, 241, 147, 8, 3, 241, 143, 8, 3,
+ 241, 144, 8, 3, 241, 146, 8, 3, 241, 145, 8, 3, 241, 152, 8, 3, 241, 151,
+ 8, 3, 241, 154, 8, 3, 241, 153, 8, 3, 241, 134, 8, 3, 241, 136, 8, 3,
+ 241, 135, 8, 3, 241, 138, 8, 3, 241, 140, 8, 3, 241, 139, 8, 3, 241, 148,
+ 8, 3, 241, 150, 8, 3, 241, 149, 8, 3, 241, 130, 8, 3, 241, 129, 8, 3,
+ 241, 137, 8, 3, 241, 133, 8, 3, 241, 131, 8, 3, 241, 132, 8, 3, 241, 124,
+ 8, 3, 241, 123, 8, 3, 241, 128, 8, 3, 241, 127, 8, 3, 241, 125, 8, 3,
+ 241, 126, 8, 3, 232, 196, 8, 3, 232, 190, 8, 3, 232, 242, 8, 3, 232, 203,
+ 8, 3, 232, 234, 8, 3, 232, 233, 8, 3, 232, 237, 8, 3, 232, 235, 8, 3,
+ 233, 80, 8, 3, 233, 70, 8, 3, 233, 136, 8, 3, 233, 89, 8, 3, 232, 80, 8,
+ 3, 232, 79, 8, 3, 232, 82, 8, 3, 232, 81, 8, 3, 232, 117, 8, 3, 232, 107,
+ 8, 3, 232, 157, 8, 3, 232, 121, 8, 3, 233, 3, 8, 3, 233, 59, 8, 3, 233,
+ 18, 8, 3, 232, 75, 8, 3, 232, 73, 8, 3, 232, 99, 8, 3, 232, 78, 8, 3,
+ 232, 76, 8, 3, 232, 77, 8, 3, 232, 55, 8, 3, 232, 54, 8, 3, 232, 63, 8,
+ 3, 232, 58, 8, 3, 232, 56, 8, 3, 232, 57, 8, 3, 242, 190, 8, 3, 242, 189,
+ 8, 3, 242, 215, 8, 3, 242, 200, 8, 3, 242, 207, 8, 3, 242, 206, 8, 3,
+ 242, 209, 8, 3, 242, 208, 8, 3, 243, 90, 8, 3, 243, 85, 8, 3, 243, 136,
+ 8, 3, 243, 100, 8, 3, 242, 92, 8, 3, 242, 91, 8, 3, 242, 94, 8, 3, 242,
+ 93, 8, 3, 242, 155, 8, 3, 242, 153, 8, 3, 242, 175, 8, 3, 242, 163, 8, 3,
+ 243, 34, 8, 3, 243, 32, 8, 3, 243, 63, 8, 3, 243, 45, 8, 3, 242, 82, 8,
+ 3, 242, 81, 8, 3, 242, 114, 8, 3, 242, 90, 8, 3, 242, 83, 8, 3, 242, 89,
+ 8, 3, 234, 62, 8, 3, 234, 61, 8, 3, 234, 93, 8, 3, 234, 76, 8, 3, 234,
+ 86, 8, 3, 234, 89, 8, 3, 234, 87, 8, 3, 234, 203, 8, 3, 234, 191, 8, 3,
+ 176, 8, 3, 234, 229, 8, 3, 233, 201, 8, 3, 233, 206, 8, 3, 233, 203, 8,
+ 3, 234, 1, 8, 3, 233, 253, 8, 3, 234, 29, 8, 3, 234, 8, 8, 3, 234, 157,
+ 8, 3, 234, 141, 8, 3, 234, 183, 8, 3, 234, 160, 8, 3, 233, 190, 8, 3,
+ 233, 187, 8, 3, 233, 218, 8, 3, 233, 200, 8, 3, 233, 193, 8, 3, 233, 197,
+ 8, 3, 243, 16, 8, 3, 243, 15, 8, 3, 243, 20, 8, 3, 243, 17, 8, 3, 243,
+ 19, 8, 3, 243, 18, 8, 3, 243, 27, 8, 3, 243, 26, 8, 3, 243, 30, 8, 3,
+ 243, 28, 8, 3, 243, 7, 8, 3, 243, 6, 8, 3, 243, 9, 8, 3, 243, 8, 8, 3,
+ 243, 12, 8, 3, 243, 11, 8, 3, 243, 14, 8, 3, 243, 13, 8, 3, 243, 22, 8,
+ 3, 243, 21, 8, 3, 243, 25, 8, 3, 243, 23, 8, 3, 243, 2, 8, 3, 243, 1, 8,
+ 3, 243, 10, 8, 3, 243, 5, 8, 3, 243, 3, 8, 3, 243, 4, 8, 3, 230, 250, 8,
+ 3, 230, 251, 8, 3, 231, 13, 8, 3, 231, 12, 8, 3, 231, 15, 8, 3, 231, 14,
+ 8, 3, 230, 241, 8, 3, 230, 243, 8, 3, 230, 242, 8, 3, 230, 246, 8, 3,
+ 230, 245, 8, 3, 230, 248, 8, 3, 230, 247, 8, 3, 230, 252, 8, 3, 230, 254,
+ 8, 3, 230, 253, 8, 3, 230, 237, 8, 3, 230, 236, 8, 3, 230, 244, 8, 3,
+ 230, 240, 8, 3, 230, 238, 8, 3, 230, 239, 8, 3, 240, 181, 8, 3, 240, 180,
+ 8, 3, 240, 187, 8, 3, 240, 182, 8, 3, 240, 184, 8, 3, 240, 183, 8, 3,
+ 240, 186, 8, 3, 240, 185, 8, 3, 240, 192, 8, 3, 240, 191, 8, 3, 240, 194,
+ 8, 3, 240, 193, 8, 3, 240, 173, 8, 3, 240, 172, 8, 3, 240, 175, 8, 3,
+ 240, 174, 8, 3, 240, 177, 8, 3, 240, 176, 8, 3, 240, 179, 8, 3, 240, 178,
+ 8, 3, 240, 188, 8, 3, 240, 190, 8, 3, 240, 189, 8, 3, 229, 25, 8, 3, 229,
+ 27, 8, 3, 229, 26, 8, 3, 229, 68, 8, 3, 229, 66, 8, 3, 229, 78, 8, 3,
+ 229, 71, 8, 3, 228, 244, 8, 3, 228, 243, 8, 3, 228, 245, 8, 3, 228, 253,
+ 8, 3, 228, 250, 8, 3, 229, 5, 8, 3, 228, 255, 8, 3, 229, 59, 8, 3, 229,
+ 65, 8, 3, 229, 61, 8, 3, 241, 157, 8, 3, 241, 167, 8, 3, 241, 176, 8, 3,
+ 241, 252, 8, 3, 241, 244, 8, 3, 162, 8, 3, 242, 7, 8, 3, 240, 207, 8, 3,
+ 240, 206, 8, 3, 240, 209, 8, 3, 240, 208, 8, 3, 240, 243, 8, 3, 240, 234,
+ 8, 3, 241, 69, 8, 3, 241, 48, 8, 3, 241, 195, 8, 3, 241, 239, 8, 3, 241,
+ 207, 8, 3, 212, 43, 8, 3, 212, 28, 8, 3, 212, 65, 8, 3, 212, 51, 8, 3,
+ 211, 185, 8, 3, 211, 187, 8, 3, 211, 186, 8, 3, 211, 203, 8, 3, 211, 227,
+ 8, 3, 211, 210, 8, 3, 212, 5, 8, 3, 212, 22, 8, 3, 212, 10, 8, 3, 210,
+ 30, 8, 3, 210, 29, 8, 3, 210, 44, 8, 3, 210, 32, 8, 3, 210, 37, 8, 3,
+ 210, 39, 8, 3, 210, 38, 8, 3, 210, 102, 8, 3, 210, 99, 8, 3, 210, 116, 8,
+ 3, 210, 105, 8, 3, 210, 6, 8, 3, 210, 8, 8, 3, 210, 7, 8, 3, 210, 19, 8,
+ 3, 210, 18, 8, 3, 210, 23, 8, 3, 210, 20, 8, 3, 210, 84, 8, 3, 210, 94,
+ 8, 3, 210, 88, 8, 3, 210, 2, 8, 3, 210, 1, 8, 3, 210, 13, 8, 3, 210, 5,
+ 8, 3, 210, 3, 8, 3, 210, 4, 8, 3, 209, 245, 8, 3, 209, 244, 8, 3, 209,
+ 250, 8, 3, 209, 248, 8, 3, 209, 246, 8, 3, 209, 247, 8, 3, 250, 29, 8, 3,
+ 250, 25, 8, 3, 250, 52, 8, 3, 250, 38, 8, 3, 250, 49, 8, 3, 250, 43, 8,
+ 3, 250, 51, 8, 3, 250, 50, 8, 3, 250, 225, 8, 3, 250, 218, 8, 3, 251, 34,
+ 8, 3, 250, 252, 8, 3, 249, 105, 8, 3, 249, 107, 8, 3, 249, 106, 8, 3,
+ 249, 154, 8, 3, 249, 145, 8, 3, 249, 239, 8, 3, 249, 170, 8, 3, 250, 161,
+ 8, 3, 250, 191, 8, 3, 250, 166, 8, 3, 249, 85, 8, 3, 249, 83, 8, 3, 249,
+ 113, 8, 3, 249, 103, 8, 3, 249, 90, 8, 3, 249, 102, 8, 3, 249, 64, 8, 3,
+ 249, 63, 8, 3, 249, 74, 8, 3, 249, 70, 8, 3, 249, 65, 8, 3, 249, 67, 8,
+ 3, 209, 228, 8, 3, 209, 227, 8, 3, 209, 234, 8, 3, 209, 229, 8, 3, 209,
+ 231, 8, 3, 209, 230, 8, 3, 209, 233, 8, 3, 209, 232, 8, 3, 209, 240, 8,
+ 3, 209, 239, 8, 3, 209, 243, 8, 3, 209, 241, 8, 3, 209, 224, 8, 3, 209,
+ 226, 8, 3, 209, 225, 8, 3, 209, 235, 8, 3, 209, 238, 8, 3, 209, 236, 8,
+ 3, 209, 217, 8, 3, 209, 221, 8, 3, 209, 220, 8, 3, 209, 218, 8, 3, 209,
+ 219, 8, 3, 209, 211, 8, 3, 209, 210, 8, 3, 209, 216, 8, 3, 209, 214, 8,
+ 3, 209, 212, 8, 3, 209, 213, 8, 3, 227, 105, 8, 3, 227, 104, 8, 3, 227,
+ 110, 8, 3, 227, 106, 8, 3, 227, 107, 8, 3, 227, 109, 8, 3, 227, 108, 8,
+ 3, 227, 115, 8, 3, 227, 114, 8, 3, 227, 118, 8, 3, 227, 117, 8, 3, 227,
+ 98, 8, 3, 227, 99, 8, 3, 227, 102, 8, 3, 227, 103, 8, 3, 227, 111, 8, 3,
+ 227, 113, 8, 3, 227, 93, 8, 3, 227, 101, 8, 3, 227, 97, 8, 3, 227, 94, 8,
+ 3, 227, 95, 8, 3, 227, 88, 8, 3, 227, 87, 8, 3, 227, 92, 8, 3, 227, 91,
+ 8, 3, 227, 89, 8, 3, 227, 90, 8, 3, 219, 128, 8, 3, 194, 8, 3, 219, 192,
+ 8, 3, 219, 131, 8, 3, 219, 184, 8, 3, 219, 187, 8, 3, 219, 185, 8, 3,
+ 221, 227, 8, 3, 221, 215, 8, 3, 206, 8, 3, 221, 235, 8, 3, 218, 29, 8, 3,
+ 218, 31, 8, 3, 218, 30, 8, 3, 219, 35, 8, 3, 219, 24, 8, 3, 219, 59, 8,
+ 3, 219, 39, 8, 3, 220, 115, 8, 3, 221, 182, 8, 3, 220, 140, 8, 3, 218, 6,
+ 8, 3, 218, 4, 8, 3, 218, 84, 8, 3, 218, 28, 8, 3, 218, 10, 8, 3, 218, 18,
+ 8, 3, 217, 167, 8, 3, 217, 166, 8, 3, 217, 233, 8, 3, 217, 174, 8, 3,
+ 217, 169, 8, 3, 217, 173, 8, 3, 218, 187, 8, 3, 218, 186, 8, 3, 218, 193,
+ 8, 3, 218, 188, 8, 3, 218, 190, 8, 3, 218, 192, 8, 3, 218, 191, 8, 3,
+ 218, 201, 8, 3, 218, 199, 8, 3, 218, 224, 8, 3, 218, 202, 8, 3, 218, 182,
+ 8, 3, 218, 181, 8, 3, 218, 185, 8, 3, 218, 183, 8, 3, 218, 195, 8, 3,
+ 218, 198, 8, 3, 218, 196, 8, 3, 218, 178, 8, 3, 218, 176, 8, 3, 218, 180,
+ 8, 3, 218, 179, 8, 3, 218, 171, 8, 3, 218, 170, 8, 3, 218, 175, 8, 3,
+ 218, 174, 8, 3, 218, 172, 8, 3, 218, 173, 8, 3, 210, 77, 8, 3, 210, 76,
+ 8, 3, 210, 82, 8, 3, 210, 79, 8, 3, 210, 59, 8, 3, 210, 61, 8, 3, 210,
+ 60, 8, 3, 210, 64, 8, 3, 210, 63, 8, 3, 210, 67, 8, 3, 210, 65, 8, 3,
+ 210, 71, 8, 3, 210, 70, 8, 3, 210, 74, 8, 3, 210, 72, 8, 3, 210, 55, 8,
+ 3, 210, 54, 8, 3, 210, 62, 8, 3, 210, 58, 8, 3, 210, 56, 8, 3, 210, 57,
+ 8, 3, 210, 47, 8, 3, 210, 46, 8, 3, 210, 51, 8, 3, 210, 50, 8, 3, 210,
+ 48, 8, 3, 210, 49, 8, 3, 250, 137, 8, 3, 250, 134, 8, 3, 250, 158, 8, 3,
+ 250, 145, 8, 3, 250, 66, 8, 3, 250, 65, 8, 3, 250, 68, 8, 3, 250, 67, 8,
+ 3, 250, 80, 8, 3, 250, 79, 8, 3, 250, 87, 8, 3, 250, 82, 8, 3, 250, 116,
+ 8, 3, 250, 114, 8, 3, 250, 132, 8, 3, 250, 122, 8, 3, 250, 60, 8, 3, 250,
+ 70, 8, 3, 250, 64, 8, 3, 250, 61, 8, 3, 250, 63, 8, 3, 250, 54, 8, 3,
+ 250, 53, 8, 3, 250, 58, 8, 3, 250, 57, 8, 3, 250, 55, 8, 3, 250, 56, 8,
+ 3, 222, 176, 8, 3, 222, 180, 8, 3, 222, 159, 8, 3, 222, 160, 8, 3, 222,
+ 163, 8, 3, 222, 162, 8, 3, 222, 166, 8, 3, 222, 164, 8, 3, 222, 170, 8,
+ 3, 222, 169, 8, 3, 222, 175, 8, 3, 222, 171, 8, 3, 222, 155, 8, 3, 222,
+ 153, 8, 3, 222, 161, 8, 3, 222, 158, 8, 3, 222, 156, 8, 3, 222, 157, 8,
+ 3, 222, 148, 8, 3, 222, 147, 8, 3, 222, 152, 8, 3, 222, 151, 8, 3, 222,
+ 149, 8, 3, 222, 150, 8, 3, 228, 35, 8, 3, 228, 34, 8, 3, 228, 37, 8, 3,
+ 228, 36, 8, 3, 228, 27, 8, 3, 228, 29, 8, 3, 228, 28, 8, 3, 228, 31, 8,
+ 3, 228, 30, 8, 3, 228, 33, 8, 3, 228, 32, 8, 3, 228, 22, 8, 3, 228, 21,
+ 8, 3, 228, 26, 8, 3, 228, 25, 8, 3, 228, 23, 8, 3, 228, 24, 8, 3, 228,
+ 16, 8, 3, 228, 15, 8, 3, 228, 20, 8, 3, 228, 19, 8, 3, 228, 17, 8, 3,
+ 228, 18, 8, 3, 220, 73, 8, 3, 220, 68, 8, 3, 220, 103, 8, 3, 220, 84, 8,
+ 3, 219, 216, 8, 3, 219, 218, 8, 3, 219, 217, 8, 3, 219, 237, 8, 3, 219,
+ 234, 8, 3, 220, 8, 8, 3, 219, 255, 8, 3, 220, 43, 8, 3, 220, 36, 8, 3,
+ 220, 64, 8, 3, 220, 51, 8, 3, 219, 212, 8, 3, 219, 210, 8, 3, 219, 226,
+ 8, 3, 219, 215, 8, 3, 219, 213, 8, 3, 219, 214, 8, 3, 219, 195, 8, 3,
+ 219, 194, 8, 3, 219, 201, 8, 3, 219, 198, 8, 3, 219, 196, 8, 3, 219, 197,
+ 8, 3, 223, 142, 8, 3, 223, 136, 8, 3, 205, 8, 3, 223, 148, 8, 3, 222,
+ 121, 8, 3, 222, 123, 8, 3, 222, 122, 8, 3, 222, 189, 8, 3, 222, 182, 8,
+ 3, 222, 212, 8, 3, 222, 193, 8, 3, 223, 44, 8, 3, 223, 129, 8, 3, 223,
+ 82, 8, 3, 222, 114, 8, 3, 222, 111, 8, 3, 222, 141, 8, 3, 222, 120, 8, 3,
+ 222, 116, 8, 3, 222, 117, 8, 3, 222, 96, 8, 3, 222, 95, 8, 3, 222, 101,
+ 8, 3, 222, 99, 8, 3, 222, 97, 8, 3, 222, 98, 8, 3, 235, 99, 8, 3, 235,
+ 98, 8, 3, 235, 109, 8, 3, 235, 100, 8, 3, 235, 105, 8, 3, 235, 104, 8, 3,
+ 235, 107, 8, 3, 235, 106, 8, 3, 235, 42, 8, 3, 235, 41, 8, 3, 235, 44, 8,
+ 3, 235, 43, 8, 3, 235, 57, 8, 3, 235, 55, 8, 3, 235, 69, 8, 3, 235, 59,
+ 8, 3, 235, 35, 8, 3, 235, 33, 8, 3, 235, 52, 8, 3, 235, 40, 8, 3, 235,
+ 37, 8, 3, 235, 38, 8, 3, 235, 27, 8, 3, 235, 26, 8, 3, 235, 31, 8, 3,
+ 235, 30, 8, 3, 235, 28, 8, 3, 235, 29, 8, 3, 224, 47, 8, 3, 224, 45, 8,
+ 3, 224, 54, 8, 3, 224, 48, 8, 3, 224, 51, 8, 3, 224, 50, 8, 3, 224, 53,
+ 8, 3, 224, 52, 8, 3, 224, 0, 8, 3, 223, 253, 8, 3, 224, 2, 8, 3, 224, 1,
+ 8, 3, 224, 34, 8, 3, 224, 33, 8, 3, 224, 43, 8, 3, 224, 37, 8, 3, 223,
+ 248, 8, 3, 223, 244, 8, 3, 224, 31, 8, 3, 223, 252, 8, 3, 223, 250, 8, 3,
+ 223, 251, 8, 3, 223, 228, 8, 3, 223, 226, 8, 3, 223, 238, 8, 3, 223, 231,
+ 8, 3, 223, 229, 8, 3, 223, 230, 8, 3, 235, 88, 8, 3, 235, 87, 8, 3, 235,
+ 94, 8, 3, 235, 89, 8, 3, 235, 91, 8, 3, 235, 90, 8, 3, 235, 93, 8, 3,
+ 235, 92, 8, 3, 235, 79, 8, 3, 235, 81, 8, 3, 235, 80, 8, 3, 235, 84, 8,
+ 3, 235, 83, 8, 3, 235, 86, 8, 3, 235, 85, 8, 3, 235, 75, 8, 3, 235, 74,
+ 8, 3, 235, 82, 8, 3, 235, 78, 8, 3, 235, 76, 8, 3, 235, 77, 8, 3, 235,
+ 71, 8, 3, 235, 70, 8, 3, 235, 73, 8, 3, 235, 72, 8, 3, 228, 163, 8, 3,
+ 228, 162, 8, 3, 228, 170, 8, 3, 228, 164, 8, 3, 228, 166, 8, 3, 228, 165,
+ 8, 3, 228, 169, 8, 3, 228, 167, 8, 3, 228, 152, 8, 3, 228, 153, 8, 3,
+ 228, 158, 8, 3, 228, 157, 8, 3, 228, 161, 8, 3, 228, 159, 8, 3, 228, 147,
+ 8, 3, 228, 156, 8, 3, 228, 151, 8, 3, 228, 148, 8, 3, 228, 149, 8, 3,
+ 228, 142, 8, 3, 228, 141, 8, 3, 228, 146, 8, 3, 228, 145, 8, 3, 228, 143,
+ 8, 3, 228, 144, 8, 3, 227, 138, 8, 3, 227, 137, 8, 3, 227, 149, 8, 3,
+ 227, 142, 8, 3, 227, 146, 8, 3, 227, 145, 8, 3, 227, 148, 8, 3, 227, 147,
+ 8, 3, 227, 125, 8, 3, 227, 127, 8, 3, 227, 126, 8, 3, 227, 131, 8, 3,
+ 227, 130, 8, 3, 227, 135, 8, 3, 227, 132, 8, 3, 227, 123, 8, 3, 227, 121,
+ 8, 3, 227, 129, 8, 3, 227, 124, 8, 3, 211, 150, 8, 3, 211, 149, 8, 3,
+ 211, 157, 8, 3, 211, 152, 8, 3, 211, 154, 8, 3, 211, 153, 8, 3, 211, 156,
+ 8, 3, 211, 155, 8, 3, 211, 139, 8, 3, 211, 140, 8, 3, 211, 144, 8, 3,
+ 211, 143, 8, 3, 211, 148, 8, 3, 211, 146, 8, 3, 211, 121, 8, 3, 211, 119,
+ 8, 3, 211, 131, 8, 3, 211, 124, 8, 3, 211, 122, 8, 3, 211, 123, 8, 3,
+ 210, 250, 8, 3, 210, 248, 8, 3, 211, 8, 8, 3, 210, 251, 8, 3, 211, 2, 8,
+ 3, 211, 1, 8, 3, 211, 5, 8, 3, 211, 3, 8, 3, 210, 191, 8, 3, 210, 190, 8,
+ 3, 210, 194, 8, 3, 210, 192, 8, 3, 210, 224, 8, 3, 210, 221, 8, 3, 210,
+ 244, 8, 3, 210, 228, 8, 3, 210, 182, 8, 3, 210, 178, 8, 3, 210, 212, 8,
+ 3, 210, 189, 8, 3, 210, 185, 8, 3, 210, 186, 8, 3, 210, 162, 8, 3, 210,
+ 161, 8, 3, 210, 169, 8, 3, 210, 165, 8, 3, 210, 163, 8, 3, 210, 164, 8,
+ 34, 224, 34, 8, 34, 232, 242, 8, 34, 234, 62, 8, 34, 227, 142, 8, 34,
+ 249, 70, 8, 34, 218, 193, 8, 34, 243, 13, 8, 34, 243, 45, 8, 34, 230,
+ 231, 8, 34, 240, 181, 8, 34, 232, 57, 8, 34, 252, 84, 8, 34, 230, 127, 8,
+ 34, 210, 244, 8, 34, 224, 122, 8, 34, 240, 175, 8, 34, 217, 47, 8, 34,
+ 243, 136, 8, 34, 210, 5, 8, 34, 249, 64, 8, 34, 248, 96, 8, 34, 251, 99,
+ 8, 34, 243, 9, 8, 34, 227, 132, 8, 34, 215, 119, 8, 34, 226, 176, 8, 34,
+ 235, 75, 8, 34, 210, 19, 8, 34, 224, 101, 8, 34, 241, 109, 8, 34, 210,
+ 250, 8, 34, 212, 112, 8, 34, 219, 201, 8, 34, 213, 244, 8, 34, 210, 116,
+ 8, 34, 235, 69, 8, 34, 227, 97, 8, 34, 235, 73, 8, 34, 242, 155, 8, 34,
+ 235, 93, 8, 34, 211, 227, 8, 34, 246, 79, 8, 34, 219, 214, 8, 34, 232,
+ 237, 8, 34, 249, 74, 8, 34, 249, 106, 8, 34, 250, 38, 8, 34, 240, 178, 8,
+ 34, 220, 73, 8, 34, 210, 4, 8, 34, 219, 255, 8, 34, 250, 132, 8, 34, 209,
+ 231, 8, 34, 229, 174, 8, 34, 234, 183, 232, 197, 1, 252, 192, 232, 197,
+ 1, 190, 232, 197, 1, 225, 148, 232, 197, 1, 248, 222, 232, 197, 1, 217,
+ 106, 232, 197, 1, 216, 209, 232, 197, 1, 243, 136, 232, 197, 1, 176, 232,
+ 197, 1, 234, 133, 232, 197, 1, 235, 142, 232, 197, 1, 251, 34, 232, 197,
+ 1, 250, 158, 232, 197, 1, 246, 39, 232, 197, 1, 215, 184, 232, 197, 1,
+ 215, 176, 232, 197, 1, 185, 232, 197, 1, 197, 232, 197, 1, 233, 136, 232,
+ 197, 1, 206, 232, 197, 1, 210, 82, 232, 197, 1, 210, 116, 232, 197, 1,
+ 229, 78, 232, 197, 1, 162, 232, 197, 1, 211, 165, 232, 197, 1, 241, 190,
+ 232, 197, 1, 244, 197, 232, 197, 1, 212, 65, 232, 197, 1, 220, 103, 232,
+ 197, 1, 191, 232, 197, 1, 242, 250, 232, 197, 1, 61, 232, 197, 1, 254,
+ 244, 232, 197, 1, 75, 232, 197, 1, 245, 56, 232, 197, 1, 73, 232, 197, 1,
+ 76, 232, 197, 1, 70, 232, 197, 1, 214, 214, 232, 197, 1, 214, 208, 232,
+ 197, 1, 226, 235, 232, 197, 1, 138, 230, 33, 216, 118, 232, 197, 1, 138,
+ 229, 230, 225, 17, 232, 197, 1, 138, 230, 33, 249, 73, 232, 197, 1, 138,
+ 230, 33, 251, 206, 232, 197, 1, 138, 230, 33, 197, 232, 197, 1, 138, 230,
+ 33, 235, 116, 232, 197, 224, 142, 249, 220, 232, 197, 224, 142, 243, 230,
+ 218, 130, 41, 3, 245, 210, 41, 3, 245, 206, 41, 3, 241, 221, 41, 3, 212,
+ 17, 41, 3, 212, 16, 41, 3, 225, 212, 41, 3, 252, 14, 41, 3, 252, 67, 41,
+ 3, 231, 117, 41, 3, 233, 248, 41, 3, 231, 7, 41, 3, 243, 76, 41, 3, 244,
+ 148, 41, 3, 213, 250, 41, 3, 217, 12, 41, 3, 216, 195, 41, 3, 248, 17,
+ 41, 3, 248, 14, 41, 3, 233, 51, 41, 3, 223, 109, 41, 3, 248, 78, 41, 3,
+ 229, 140, 41, 3, 221, 171, 41, 3, 220, 62, 41, 3, 210, 92, 41, 3, 210,
+ 73, 41, 3, 250, 183, 41, 3, 235, 125, 41, 3, 228, 177, 41, 3, 211, 44,
+ 41, 3, 234, 182, 41, 3, 229, 52, 41, 3, 243, 56, 41, 3, 231, 81, 41, 3,
+ 229, 104, 41, 3, 227, 156, 41, 3, 73, 41, 3, 236, 0, 41, 3, 241, 181, 41,
+ 3, 241, 161, 41, 3, 211, 250, 41, 3, 211, 241, 41, 3, 225, 109, 41, 3,
+ 252, 12, 41, 3, 252, 7, 41, 3, 231, 110, 41, 3, 233, 245, 41, 3, 231, 4,
+ 41, 3, 243, 72, 41, 3, 244, 122, 41, 3, 213, 176, 41, 3, 216, 118, 41, 3,
+ 216, 176, 41, 3, 248, 9, 41, 3, 248, 13, 41, 3, 232, 242, 41, 3, 223, 36,
+ 41, 3, 248, 4, 41, 3, 229, 134, 41, 3, 219, 192, 41, 3, 220, 33, 41, 3,
+ 210, 44, 41, 3, 210, 69, 41, 3, 250, 52, 41, 3, 235, 109, 41, 3, 228,
+ 170, 41, 3, 211, 8, 41, 3, 234, 93, 41, 3, 229, 44, 41, 3, 242, 215, 41,
+ 3, 230, 231, 41, 3, 228, 234, 41, 3, 227, 149, 41, 3, 61, 41, 3, 254,
+ 124, 41, 3, 229, 73, 41, 3, 162, 41, 3, 242, 19, 41, 3, 212, 65, 41, 3,
+ 212, 55, 41, 3, 190, 41, 3, 252, 19, 41, 3, 252, 192, 41, 3, 231, 125,
+ 41, 3, 233, 252, 41, 3, 233, 251, 41, 3, 231, 11, 41, 3, 243, 80, 41, 3,
+ 244, 197, 41, 3, 214, 27, 41, 3, 217, 106, 41, 3, 216, 209, 41, 3, 248,
+ 26, 41, 3, 248, 16, 41, 3, 233, 136, 41, 3, 205, 41, 3, 248, 222, 41, 3,
+ 229, 149, 41, 3, 206, 41, 3, 220, 103, 41, 3, 210, 116, 41, 3, 210, 82,
+ 41, 3, 251, 34, 41, 3, 235, 142, 41, 3, 228, 186, 41, 3, 191, 41, 3, 176,
+ 41, 3, 234, 235, 41, 3, 229, 57, 41, 3, 243, 136, 41, 3, 185, 41, 3, 197,
+ 41, 3, 227, 166, 41, 3, 226, 184, 41, 3, 226, 180, 41, 3, 241, 54, 41, 3,
+ 211, 215, 41, 3, 211, 211, 41, 3, 224, 250, 41, 3, 252, 10, 41, 3, 251,
+ 194, 41, 3, 231, 105, 41, 3, 233, 243, 41, 3, 231, 0, 41, 3, 243, 68, 41,
+ 3, 244, 35, 41, 3, 213, 127, 41, 3, 216, 18, 41, 3, 216, 154, 41, 3, 248,
+ 7, 41, 3, 248, 11, 41, 3, 232, 128, 41, 3, 222, 198, 41, 3, 247, 126, 41,
+ 3, 229, 121, 41, 3, 219, 41, 41, 3, 220, 2, 41, 3, 210, 21, 41, 3, 210,
+ 66, 41, 3, 249, 175, 41, 3, 235, 60, 41, 3, 228, 160, 41, 3, 210, 229,
+ 41, 3, 234, 11, 41, 3, 229, 42, 41, 3, 242, 165, 41, 3, 230, 133, 41, 3,
+ 228, 65, 41, 3, 227, 133, 41, 3, 70, 41, 3, 214, 190, 41, 3, 240, 223,
+ 41, 3, 240, 213, 41, 3, 211, 195, 41, 3, 211, 189, 41, 3, 224, 151, 41,
+ 3, 252, 9, 41, 3, 251, 126, 41, 3, 231, 104, 41, 3, 233, 241, 41, 3, 230,
+ 255, 41, 3, 243, 67, 41, 3, 243, 235, 41, 3, 212, 116, 41, 3, 215, 119,
+ 41, 3, 216, 137, 41, 3, 248, 5, 41, 3, 248, 10, 41, 3, 232, 99, 41, 3,
+ 222, 141, 41, 3, 246, 79, 41, 3, 229, 116, 41, 3, 218, 84, 41, 3, 219,
+ 226, 41, 3, 210, 13, 41, 3, 210, 62, 41, 3, 249, 113, 41, 3, 235, 52, 41,
+ 3, 228, 156, 41, 3, 210, 212, 41, 3, 233, 218, 41, 3, 229, 41, 41, 3,
+ 242, 114, 41, 3, 230, 103, 41, 3, 227, 238, 41, 3, 227, 129, 41, 3, 76,
+ 41, 3, 226, 197, 41, 3, 229, 1, 41, 3, 241, 69, 41, 3, 241, 57, 41, 3,
+ 211, 227, 41, 3, 211, 216, 41, 3, 225, 17, 41, 3, 252, 11, 41, 3, 251,
+ 206, 41, 3, 231, 106, 41, 3, 233, 244, 41, 3, 231, 2, 41, 3, 243, 70, 41,
+ 3, 243, 69, 41, 3, 244, 44, 41, 3, 213, 138, 41, 3, 111, 41, 3, 216, 157,
+ 41, 3, 248, 8, 41, 3, 248, 12, 41, 3, 232, 157, 41, 3, 222, 212, 41, 3,
+ 247, 146, 41, 3, 229, 125, 41, 3, 219, 59, 41, 3, 220, 8, 41, 3, 210, 23,
+ 41, 3, 210, 67, 41, 3, 249, 239, 41, 3, 235, 69, 41, 3, 228, 161, 41, 3,
+ 210, 244, 41, 3, 234, 29, 41, 3, 229, 43, 41, 3, 242, 175, 41, 3, 230,
+ 162, 41, 3, 228, 75, 41, 3, 227, 135, 41, 3, 75, 41, 3, 245, 151, 41, 3,
+ 229, 62, 41, 3, 241, 239, 41, 3, 241, 210, 41, 3, 212, 22, 41, 3, 212,
+ 12, 41, 3, 225, 222, 41, 3, 252, 15, 41, 3, 252, 76, 41, 3, 231, 118, 41,
+ 3, 233, 249, 41, 3, 233, 247, 41, 3, 231, 8, 41, 3, 243, 77, 41, 3, 243,
+ 75, 41, 3, 244, 155, 41, 3, 213, 255, 41, 3, 217, 23, 41, 3, 216, 196,
+ 41, 3, 248, 18, 41, 3, 248, 15, 41, 3, 233, 59, 41, 3, 223, 129, 41, 3,
+ 248, 91, 41, 3, 229, 141, 41, 3, 221, 182, 41, 3, 220, 64, 41, 3, 210,
+ 94, 41, 3, 210, 74, 41, 3, 250, 191, 41, 3, 235, 127, 41, 3, 228, 179,
+ 41, 3, 211, 47, 41, 3, 234, 183, 41, 3, 229, 53, 41, 3, 229, 49, 41, 3,
+ 243, 63, 41, 3, 243, 52, 41, 3, 231, 92, 41, 3, 229, 108, 41, 3, 227,
+ 157, 41, 3, 229, 80, 41, 3, 233, 23, 41, 249, 220, 41, 243, 230, 218,
+ 130, 41, 224, 14, 78, 41, 3, 229, 124, 244, 197, 41, 3, 229, 124, 176,
+ 41, 3, 229, 124, 219, 41, 41, 16, 244, 145, 41, 16, 234, 181, 41, 16,
+ 216, 82, 41, 16, 228, 209, 41, 16, 252, 148, 41, 16, 244, 196, 41, 16,
+ 217, 102, 41, 16, 248, 177, 41, 16, 247, 125, 41, 16, 233, 207, 41, 16,
+ 216, 22, 41, 16, 247, 145, 41, 16, 235, 61, 41, 21, 210, 86, 41, 21, 110,
+ 41, 21, 105, 41, 21, 158, 41, 21, 161, 41, 21, 189, 41, 21, 194, 41, 21,
+ 198, 41, 21, 195, 41, 21, 200, 41, 3, 229, 124, 185, 41, 3, 229, 124,
+ 247, 146, 33, 6, 1, 210, 90, 33, 4, 1, 210, 90, 33, 6, 1, 246, 35, 33, 4,
+ 1, 246, 35, 33, 6, 1, 223, 50, 246, 37, 33, 4, 1, 223, 50, 246, 37, 33,
+ 6, 1, 235, 186, 33, 4, 1, 235, 186, 33, 6, 1, 247, 162, 33, 4, 1, 247,
+ 162, 33, 6, 1, 230, 141, 214, 205, 33, 4, 1, 230, 141, 214, 205, 33, 6,
+ 1, 251, 137, 226, 202, 33, 4, 1, 251, 137, 226, 202, 33, 6, 1, 229, 88,
+ 211, 31, 33, 4, 1, 229, 88, 211, 31, 33, 6, 1, 211, 28, 2, 252, 186, 211,
+ 31, 33, 4, 1, 211, 28, 2, 252, 186, 211, 31, 33, 6, 1, 235, 184, 211, 59,
+ 33, 4, 1, 235, 184, 211, 59, 33, 6, 1, 223, 50, 210, 212, 33, 4, 1, 223,
+ 50, 210, 212, 33, 6, 1, 235, 184, 61, 33, 4, 1, 235, 184, 61, 33, 6, 1,
+ 250, 1, 232, 193, 210, 183, 33, 4, 1, 250, 1, 232, 193, 210, 183, 33, 6,
+ 1, 251, 215, 210, 183, 33, 4, 1, 251, 215, 210, 183, 33, 6, 1, 235, 184,
+ 250, 1, 232, 193, 210, 183, 33, 4, 1, 235, 184, 250, 1, 232, 193, 210,
+ 183, 33, 6, 1, 210, 246, 33, 4, 1, 210, 246, 33, 6, 1, 223, 50, 215, 179,
+ 33, 4, 1, 223, 50, 215, 179, 33, 6, 1, 219, 53, 248, 91, 33, 4, 1, 219,
+ 53, 248, 91, 33, 6, 1, 219, 53, 245, 175, 33, 4, 1, 219, 53, 245, 175,
+ 33, 6, 1, 219, 53, 245, 160, 33, 4, 1, 219, 53, 245, 160, 33, 6, 1, 230,
+ 145, 76, 33, 4, 1, 230, 145, 76, 33, 6, 1, 251, 241, 76, 33, 4, 1, 251,
+ 241, 76, 33, 6, 1, 52, 230, 145, 76, 33, 4, 1, 52, 230, 145, 76, 33, 1,
+ 230, 87, 76, 38, 33, 212, 100, 38, 33, 216, 249, 230, 192, 50, 38, 33,
+ 240, 212, 230, 192, 50, 38, 33, 216, 149, 230, 192, 50, 219, 94, 253,
+ 217, 38, 33, 1, 214, 202, 236, 61, 38, 33, 1, 73, 38, 33, 1, 211, 8, 38,
+ 33, 1, 70, 38, 33, 1, 242, 4, 50, 38, 33, 1, 211, 27, 38, 33, 1, 219, 53,
+ 50, 38, 33, 1, 226, 202, 38, 33, 234, 193, 38, 33, 225, 228, 33, 234,
+ 193, 33, 225, 228, 33, 6, 1, 246, 47, 33, 4, 1, 246, 47, 33, 6, 1, 246,
+ 28, 33, 4, 1, 246, 28, 33, 6, 1, 210, 52, 33, 4, 1, 210, 52, 33, 6, 1,
+ 250, 207, 33, 4, 1, 250, 207, 33, 6, 1, 246, 26, 33, 4, 1, 246, 26, 33,
+ 6, 1, 217, 24, 2, 230, 225, 103, 33, 4, 1, 217, 24, 2, 230, 225, 103, 33,
+ 6, 1, 215, 78, 33, 4, 1, 215, 78, 33, 6, 1, 215, 161, 33, 4, 1, 215, 161,
+ 33, 6, 1, 215, 165, 33, 4, 1, 215, 165, 33, 6, 1, 217, 29, 33, 4, 1, 217,
+ 29, 33, 6, 1, 240, 199, 33, 4, 1, 240, 199, 33, 6, 1, 219, 207, 33, 4, 1,
+ 219, 207, 38, 33, 1, 235, 184, 75, 20, 1, 61, 20, 1, 176, 20, 1, 70, 20,
+ 1, 233, 218, 20, 1, 245, 210, 20, 1, 223, 109, 20, 1, 217, 87, 20, 1, 76,
+ 20, 1, 227, 149, 20, 1, 73, 20, 1, 233, 136, 20, 1, 190, 20, 1, 222, 240,
+ 20, 1, 223, 30, 20, 1, 233, 50, 20, 1, 231, 80, 20, 1, 217, 102, 20, 1,
+ 229, 147, 20, 1, 228, 184, 20, 1, 193, 20, 1, 218, 5, 20, 1, 230, 103,
+ 20, 1, 220, 28, 20, 1, 219, 192, 20, 1, 220, 38, 20, 1, 220, 124, 20, 1,
+ 233, 156, 20, 1, 234, 157, 20, 1, 227, 210, 20, 1, 227, 238, 20, 1, 228,
+ 155, 20, 1, 210, 226, 20, 1, 219, 226, 20, 1, 210, 187, 20, 1, 191, 20,
+ 1, 228, 10, 20, 1, 234, 143, 20, 1, 225, 152, 20, 1, 228, 177, 20, 1,
+ 227, 247, 20, 1, 224, 145, 20, 1, 211, 192, 20, 1, 225, 212, 20, 1, 244,
+ 148, 20, 1, 222, 141, 20, 1, 232, 99, 20, 1, 230, 231, 20, 1, 228, 234,
+ 20, 1, 223, 52, 20, 1, 223, 172, 20, 1, 234, 166, 20, 1, 229, 8, 20, 1,
+ 229, 57, 20, 1, 229, 78, 20, 1, 220, 8, 20, 1, 224, 148, 20, 1, 243, 235,
+ 20, 1, 244, 38, 20, 1, 212, 65, 20, 1, 197, 20, 1, 232, 242, 20, 1, 225,
+ 109, 20, 1, 232, 120, 20, 1, 234, 29, 20, 1, 231, 115, 20, 1, 223, 84,
+ 20, 1, 231, 59, 20, 1, 185, 20, 1, 216, 118, 20, 1, 234, 93, 20, 1, 230,
+ 162, 20, 1, 231, 123, 20, 1, 216, 231, 20, 1, 233, 252, 20, 1, 216, 248,
+ 20, 1, 227, 239, 20, 1, 221, 252, 20, 1, 244, 193, 20, 1, 233, 254, 20,
+ 1, 234, 25, 20, 38, 164, 234, 6, 20, 38, 164, 215, 111, 20, 228, 183, 20,
+ 243, 230, 218, 130, 20, 249, 227, 20, 249, 220, 20, 220, 151, 20, 224,
+ 14, 78, 58, 1, 250, 97, 138, 210, 254, 225, 62, 58, 1, 250, 97, 138, 211,
+ 70, 225, 62, 58, 1, 250, 97, 138, 210, 254, 220, 85, 58, 1, 250, 97, 138,
+ 211, 70, 220, 85, 58, 1, 250, 97, 138, 210, 254, 224, 31, 58, 1, 250, 97,
+ 138, 211, 70, 224, 31, 58, 1, 250, 97, 138, 210, 254, 222, 141, 58, 1,
+ 250, 97, 138, 211, 70, 222, 141, 58, 1, 245, 21, 246, 119, 138, 130, 58,
+ 1, 125, 246, 119, 138, 130, 58, 1, 230, 226, 246, 119, 138, 130, 58, 1,
+ 121, 246, 119, 138, 130, 58, 1, 245, 20, 246, 119, 138, 130, 58, 1, 245,
+ 21, 246, 119, 233, 40, 138, 130, 58, 1, 125, 246, 119, 233, 40, 138, 130,
+ 58, 1, 230, 226, 246, 119, 233, 40, 138, 130, 58, 1, 121, 246, 119, 233,
+ 40, 138, 130, 58, 1, 245, 20, 246, 119, 233, 40, 138, 130, 58, 1, 245,
+ 21, 233, 40, 138, 130, 58, 1, 125, 233, 40, 138, 130, 58, 1, 230, 226,
+ 233, 40, 138, 130, 58, 1, 121, 233, 40, 138, 130, 58, 1, 245, 20, 233,
+ 40, 138, 130, 58, 1, 59, 67, 130, 58, 1, 59, 219, 96, 58, 1, 59, 203,
+ 130, 58, 1, 232, 109, 44, 249, 162, 254, 110, 58, 1, 223, 158, 120, 74,
+ 58, 1, 223, 158, 124, 74, 58, 1, 223, 158, 245, 32, 78, 58, 1, 223, 158,
+ 235, 194, 245, 32, 78, 58, 1, 121, 235, 194, 245, 32, 78, 58, 1, 218,
+ 112, 22, 125, 216, 31, 58, 1, 218, 112, 22, 121, 216, 31, 7, 6, 1, 245,
+ 200, 254, 171, 7, 4, 1, 245, 200, 254, 171, 7, 6, 1, 245, 200, 254, 197,
+ 7, 4, 1, 245, 200, 254, 197, 7, 6, 1, 241, 208, 7, 4, 1, 241, 208, 7, 6,
+ 1, 215, 40, 7, 4, 1, 215, 40, 7, 6, 1, 215, 230, 7, 4, 1, 215, 230, 7, 6,
+ 1, 249, 111, 7, 4, 1, 249, 111, 7, 6, 1, 249, 112, 2, 249, 220, 7, 4, 1,
+ 249, 112, 2, 249, 220, 7, 1, 4, 6, 245, 7, 7, 1, 4, 6, 222, 92, 7, 6, 1,
+ 255, 74, 7, 4, 1, 255, 74, 7, 6, 1, 254, 74, 7, 4, 1, 254, 74, 7, 6, 1,
+ 253, 193, 7, 4, 1, 253, 193, 7, 6, 1, 253, 177, 7, 4, 1, 253, 177, 7, 6,
+ 1, 253, 178, 2, 203, 130, 7, 4, 1, 253, 178, 2, 203, 130, 7, 6, 1, 253,
+ 168, 7, 4, 1, 253, 168, 7, 6, 1, 223, 50, 251, 68, 2, 247, 121, 7, 4, 1,
+ 223, 50, 251, 68, 2, 247, 121, 7, 6, 1, 235, 25, 2, 91, 7, 4, 1, 235, 25,
+ 2, 91, 7, 6, 1, 235, 25, 2, 248, 0, 91, 7, 4, 1, 235, 25, 2, 248, 0, 91,
+ 7, 6, 1, 235, 25, 2, 218, 104, 22, 248, 0, 91, 7, 4, 1, 235, 25, 2, 218,
+ 104, 22, 248, 0, 91, 7, 6, 1, 251, 136, 156, 7, 4, 1, 251, 136, 156, 7,
+ 6, 1, 233, 150, 2, 125, 91, 7, 4, 1, 233, 150, 2, 125, 91, 7, 6, 1, 144,
+ 2, 199, 218, 104, 226, 121, 7, 4, 1, 144, 2, 199, 218, 104, 226, 121, 7,
+ 6, 1, 144, 2, 232, 124, 7, 4, 1, 144, 2, 232, 124, 7, 6, 1, 226, 184, 7,
+ 4, 1, 226, 184, 7, 6, 1, 226, 107, 2, 218, 104, 216, 140, 248, 40, 7, 4,
+ 1, 226, 107, 2, 218, 104, 216, 140, 248, 40, 7, 6, 1, 226, 107, 2, 244,
+ 54, 7, 4, 1, 226, 107, 2, 244, 54, 7, 6, 1, 226, 107, 2, 218, 230, 217,
+ 78, 7, 4, 1, 226, 107, 2, 218, 230, 217, 78, 7, 6, 1, 224, 98, 2, 218,
+ 104, 216, 140, 248, 40, 7, 4, 1, 224, 98, 2, 218, 104, 216, 140, 248, 40,
+ 7, 6, 1, 224, 98, 2, 248, 0, 91, 7, 4, 1, 224, 98, 2, 248, 0, 91, 7, 6,
+ 1, 223, 225, 222, 187, 7, 4, 1, 223, 225, 222, 187, 7, 6, 1, 222, 131,
+ 222, 187, 7, 4, 1, 222, 131, 222, 187, 7, 6, 1, 214, 106, 2, 248, 0, 91,
+ 7, 4, 1, 214, 106, 2, 248, 0, 91, 7, 6, 1, 212, 106, 7, 4, 1, 212, 106,
+ 7, 6, 1, 213, 145, 210, 159, 7, 4, 1, 213, 145, 210, 159, 7, 6, 1, 216,
+ 153, 2, 91, 7, 4, 1, 216, 153, 2, 91, 7, 6, 1, 216, 153, 2, 218, 104,
+ 216, 140, 248, 40, 7, 4, 1, 216, 153, 2, 218, 104, 216, 140, 248, 40, 7,
+ 6, 1, 213, 245, 7, 4, 1, 213, 245, 7, 6, 1, 245, 66, 7, 4, 1, 245, 66, 7,
+ 6, 1, 235, 172, 7, 4, 1, 235, 172, 7, 6, 1, 249, 208, 7, 4, 1, 249, 208,
+ 58, 1, 214, 133, 7, 4, 1, 246, 70, 7, 4, 1, 232, 85, 7, 4, 1, 230, 81, 7,
+ 4, 1, 227, 202, 7, 4, 1, 222, 130, 7, 1, 4, 6, 222, 130, 7, 4, 1, 215,
+ 109, 7, 4, 1, 214, 197, 7, 6, 1, 235, 214, 249, 61, 7, 4, 1, 235, 214,
+ 249, 61, 7, 6, 1, 235, 214, 245, 7, 7, 4, 1, 235, 214, 245, 7, 7, 6, 1,
+ 235, 214, 243, 203, 7, 6, 1, 215, 94, 235, 214, 243, 203, 7, 4, 1, 215,
+ 94, 235, 214, 243, 203, 7, 6, 1, 215, 94, 156, 7, 4, 1, 215, 94, 156, 7,
+ 6, 1, 235, 214, 153, 7, 4, 1, 235, 214, 153, 7, 6, 1, 235, 214, 222, 92,
+ 7, 4, 1, 235, 214, 222, 92, 7, 6, 1, 235, 214, 217, 153, 7, 4, 1, 235,
+ 214, 217, 153, 58, 1, 121, 250, 32, 255, 15, 58, 1, 249, 227, 58, 1, 219,
+ 252, 245, 99, 50, 7, 6, 1, 222, 0, 7, 4, 1, 222, 0, 7, 6, 1, 215, 94,
+ 242, 61, 7, 4, 1, 233, 150, 2, 223, 56, 241, 53, 22, 252, 42, 7, 6, 1,
+ 230, 27, 2, 248, 40, 7, 4, 1, 230, 27, 2, 248, 40, 7, 6, 1, 251, 68, 2,
+ 130, 7, 4, 1, 251, 68, 2, 130, 7, 6, 1, 243, 204, 2, 226, 249, 91, 7, 4,
+ 1, 243, 204, 2, 226, 249, 91, 7, 6, 1, 235, 25, 2, 226, 249, 91, 7, 4, 1,
+ 235, 25, 2, 226, 249, 91, 7, 6, 1, 230, 27, 2, 226, 249, 91, 7, 4, 1,
+ 230, 27, 2, 226, 249, 91, 7, 6, 1, 223, 225, 2, 226, 249, 91, 7, 4, 1,
+ 223, 225, 2, 226, 249, 91, 7, 6, 1, 222, 93, 2, 226, 249, 91, 7, 4, 1,
+ 222, 93, 2, 226, 249, 91, 7, 6, 1, 242, 62, 2, 103, 58, 1, 6, 242, 62, 2,
+ 91, 58, 1, 4, 27, 226, 235, 7, 1, 4, 6, 215, 94, 193, 7, 245, 104, 1,
+ 223, 50, 245, 7, 7, 245, 104, 1, 223, 50, 226, 106, 7, 245, 104, 1, 235,
+ 194, 193, 7, 245, 104, 1, 240, 155, 232, 130, 7, 245, 104, 1, 254, 24,
+ 193, 217, 231, 229, 215, 1, 61, 217, 231, 229, 215, 1, 73, 217, 231, 229,
+ 215, 5, 246, 49, 217, 231, 229, 215, 1, 70, 217, 231, 229, 215, 1, 75,
+ 217, 231, 229, 215, 1, 76, 217, 231, 229, 215, 5, 241, 254, 217, 231,
+ 229, 215, 1, 234, 29, 217, 231, 229, 215, 1, 234, 106, 217, 231, 229,
+ 215, 1, 242, 175, 217, 231, 229, 215, 1, 242, 225, 217, 231, 229, 215, 5,
+ 254, 76, 217, 231, 229, 215, 1, 249, 239, 217, 231, 229, 215, 1, 250, 87,
+ 217, 231, 229, 215, 1, 235, 69, 217, 231, 229, 215, 1, 235, 110, 217,
+ 231, 229, 215, 1, 215, 134, 217, 231, 229, 215, 1, 215, 140, 217, 231,
+ 229, 215, 1, 248, 106, 217, 231, 229, 215, 1, 248, 115, 217, 231, 229,
+ 215, 1, 111, 217, 231, 229, 215, 1, 216, 157, 217, 231, 229, 215, 1, 247,
+ 146, 217, 231, 229, 215, 1, 248, 8, 217, 231, 229, 215, 1, 228, 75, 217,
+ 231, 229, 215, 1, 225, 17, 217, 231, 229, 215, 1, 225, 122, 217, 231,
+ 229, 215, 1, 251, 206, 217, 231, 229, 215, 1, 252, 11, 217, 231, 229,
+ 215, 1, 230, 162, 217, 231, 229, 215, 1, 222, 212, 217, 231, 229, 215, 1,
+ 232, 157, 217, 231, 229, 215, 1, 222, 166, 217, 231, 229, 215, 1, 219,
+ 59, 217, 231, 229, 215, 1, 241, 69, 217, 231, 229, 215, 25, 5, 61, 217,
+ 231, 229, 215, 25, 5, 73, 217, 231, 229, 215, 25, 5, 70, 217, 231, 229,
+ 215, 25, 5, 75, 217, 231, 229, 215, 25, 5, 226, 184, 217, 231, 229, 215,
+ 225, 13, 231, 159, 217, 231, 229, 215, 225, 13, 231, 158, 217, 231, 229,
+ 215, 225, 13, 231, 157, 217, 231, 229, 215, 225, 13, 231, 156, 228, 57,
+ 235, 241, 244, 3, 123, 224, 22, 228, 57, 235, 241, 244, 3, 123, 242, 28,
+ 228, 57, 235, 241, 244, 3, 134, 224, 20, 228, 57, 235, 241, 244, 3, 123,
+ 219, 118, 228, 57, 235, 241, 244, 3, 123, 245, 189, 228, 57, 235, 241,
+ 244, 3, 134, 219, 117, 228, 57, 235, 241, 224, 23, 78, 228, 57, 235, 241,
+ 225, 41, 78, 228, 57, 235, 241, 222, 119, 78, 228, 57, 235, 241, 224, 24,
+ 78, 225, 145, 1, 176, 225, 145, 1, 234, 133, 225, 145, 1, 243, 136, 225,
+ 145, 1, 229, 78, 225, 145, 1, 251, 34, 225, 145, 1, 250, 158, 225, 145,
+ 1, 235, 142, 225, 145, 1, 227, 166, 225, 145, 1, 217, 106, 225, 145, 1,
+ 216, 209, 225, 145, 1, 248, 222, 225, 145, 1, 197, 225, 145, 1, 190, 225,
+ 145, 1, 225, 148, 225, 145, 1, 252, 192, 225, 145, 1, 185, 225, 145, 1,
+ 215, 184, 225, 145, 1, 215, 176, 225, 145, 1, 246, 39, 225, 145, 1, 212,
+ 65, 225, 145, 1, 210, 82, 225, 145, 1, 210, 116, 225, 145, 1, 4, 61, 225,
+ 145, 1, 191, 225, 145, 1, 205, 225, 145, 1, 233, 136, 225, 145, 1, 220,
+ 103, 225, 145, 1, 206, 225, 145, 1, 162, 225, 145, 1, 61, 225, 145, 1,
+ 73, 225, 145, 1, 70, 225, 145, 1, 75, 225, 145, 1, 76, 225, 145, 1, 224,
+ 89, 225, 145, 1, 211, 165, 225, 145, 1, 244, 197, 225, 145, 1, 243, 30,
+ 225, 145, 1, 245, 210, 225, 145, 218, 74, 1, 212, 65, 225, 145, 218, 74,
+ 1, 191, 225, 145, 1, 215, 157, 225, 145, 1, 215, 145, 225, 145, 1, 248,
+ 136, 225, 145, 1, 228, 111, 225, 145, 1, 254, 142, 191, 225, 145, 1, 213,
+ 134, 220, 103, 225, 145, 1, 213, 135, 162, 225, 145, 1, 253, 224, 244,
+ 197, 225, 145, 218, 74, 1, 205, 225, 145, 218, 26, 1, 205, 225, 145, 1,
+ 251, 0, 225, 145, 219, 156, 241, 237, 78, 225, 145, 52, 241, 237, 78,
+ 225, 145, 164, 220, 96, 225, 145, 164, 52, 220, 96, 179, 5, 254, 76, 179,
+ 5, 213, 147, 179, 1, 61, 179, 1, 255, 74, 179, 1, 73, 179, 1, 236, 34,
+ 179, 1, 70, 179, 1, 214, 118, 179, 1, 149, 153, 179, 1, 149, 222, 181,
+ 179, 1, 149, 156, 179, 1, 149, 232, 186, 179, 1, 75, 179, 1, 245, 210,
+ 179, 1, 254, 202, 179, 1, 76, 179, 1, 226, 184, 179, 1, 253, 193, 179, 1,
+ 176, 179, 1, 234, 133, 179, 1, 243, 136, 179, 1, 242, 250, 179, 1, 229,
+ 78, 179, 1, 251, 34, 179, 1, 250, 158, 179, 1, 235, 142, 179, 1, 235,
+ 115, 179, 1, 227, 166, 179, 1, 215, 157, 179, 1, 215, 145, 179, 1, 248,
+ 136, 179, 1, 248, 120, 179, 1, 228, 111, 179, 1, 217, 106, 179, 1, 216,
+ 209, 179, 1, 248, 222, 179, 1, 248, 26, 179, 1, 197, 179, 1, 190, 179, 1,
+ 225, 148, 179, 1, 252, 192, 179, 1, 252, 19, 179, 1, 185, 179, 1, 191,
+ 179, 1, 205, 179, 1, 233, 136, 179, 1, 214, 27, 179, 1, 220, 103, 179, 1,
+ 218, 224, 179, 1, 206, 179, 1, 162, 179, 1, 232, 185, 179, 116, 5, 242,
+ 45, 179, 25, 5, 255, 74, 179, 25, 5, 73, 179, 25, 5, 236, 34, 179, 25, 5,
70, 179, 25, 5, 214, 118, 179, 25, 5, 149, 153, 179, 25, 5, 149, 222,
- 180, 179, 25, 5, 149, 156, 179, 25, 5, 149, 232, 185, 179, 25, 5, 75,
- 179, 25, 5, 245, 209, 179, 25, 5, 254, 201, 179, 25, 5, 76, 179, 25, 5,
- 226, 183, 179, 25, 5, 253, 192, 179, 5, 213, 152, 179, 248, 178, 179, 52,
- 248, 178, 179, 21, 210, 86, 179, 21, 110, 179, 21, 105, 179, 21, 158,
+ 181, 179, 25, 5, 149, 156, 179, 25, 5, 149, 232, 186, 179, 25, 5, 75,
+ 179, 25, 5, 245, 210, 179, 25, 5, 254, 202, 179, 25, 5, 76, 179, 25, 5,
+ 226, 184, 179, 25, 5, 253, 193, 179, 5, 213, 152, 179, 248, 179, 179, 52,
+ 248, 179, 179, 21, 210, 86, 179, 21, 110, 179, 21, 105, 179, 21, 158,
179, 21, 161, 179, 21, 189, 179, 21, 194, 179, 21, 198, 179, 21, 195,
179, 21, 200, 38, 84, 21, 210, 86, 38, 84, 21, 110, 38, 84, 21, 105, 38,
84, 21, 158, 38, 84, 21, 161, 38, 84, 21, 189, 38, 84, 21, 194, 38, 84,
21, 198, 38, 84, 21, 195, 38, 84, 21, 200, 38, 84, 1, 61, 38, 84, 1, 70,
38, 84, 1, 176, 38, 84, 1, 197, 38, 84, 1, 190, 38, 84, 1, 205, 38, 84,
- 1, 213, 176, 38, 84, 5, 253, 175, 84, 5, 219, 17, 250, 255, 84, 5, 251,
- 0, 213, 152, 84, 5, 52, 251, 0, 213, 152, 84, 5, 251, 0, 105, 84, 5, 251,
- 0, 158, 84, 5, 251, 0, 253, 175, 84, 5, 224, 124, 84, 243, 100, 244, 103,
- 84, 250, 238, 84, 241, 230, 234, 188, 232, 242, 21, 210, 86, 234, 188,
- 232, 242, 21, 110, 234, 188, 232, 242, 21, 105, 234, 188, 232, 242, 21,
- 158, 234, 188, 232, 242, 21, 161, 234, 188, 232, 242, 21, 189, 234, 188,
- 232, 242, 21, 194, 234, 188, 232, 242, 21, 198, 234, 188, 232, 242, 21,
- 195, 234, 188, 232, 242, 21, 200, 234, 188, 232, 242, 1, 176, 234, 188,
- 232, 242, 1, 234, 132, 234, 188, 232, 242, 1, 243, 135, 234, 188, 232,
- 242, 1, 229, 77, 234, 188, 232, 242, 1, 206, 234, 188, 232, 242, 1, 220,
- 102, 234, 188, 232, 242, 1, 210, 116, 234, 188, 232, 242, 1, 227, 165,
- 234, 188, 232, 242, 1, 217, 105, 234, 188, 232, 242, 1, 240, 226, 234,
- 188, 232, 242, 1, 197, 234, 188, 232, 242, 1, 190, 234, 188, 232, 242, 1,
- 225, 147, 234, 188, 232, 242, 1, 184, 234, 188, 232, 242, 1, 248, 221,
- 234, 188, 232, 242, 1, 252, 191, 234, 188, 232, 242, 1, 205, 234, 188,
- 232, 242, 1, 191, 234, 188, 232, 242, 1, 233, 135, 234, 188, 232, 242, 1,
- 212, 65, 234, 188, 232, 242, 1, 216, 208, 234, 188, 232, 242, 1, 162,
- 234, 188, 232, 242, 1, 214, 27, 234, 188, 232, 242, 1, 251, 33, 234, 188,
- 232, 242, 1, 61, 234, 188, 232, 242, 1, 226, 234, 234, 188, 232, 242, 1,
- 73, 234, 188, 232, 242, 1, 226, 183, 234, 188, 232, 242, 25, 214, 214,
- 234, 188, 232, 242, 25, 75, 234, 188, 232, 242, 25, 70, 234, 188, 232,
- 242, 25, 245, 209, 234, 188, 232, 242, 25, 76, 234, 188, 232, 242, 138,
- 225, 30, 234, 188, 232, 242, 138, 251, 12, 234, 188, 232, 242, 138, 251,
- 13, 225, 30, 234, 188, 232, 242, 5, 249, 77, 234, 188, 232, 242, 5, 219,
- 199, 223, 93, 1, 176, 223, 93, 1, 243, 135, 223, 93, 1, 229, 77, 223, 93,
- 1, 217, 105, 223, 93, 1, 248, 221, 223, 93, 1, 197, 223, 93, 1, 190, 223,
- 93, 1, 252, 191, 223, 93, 1, 184, 223, 93, 1, 251, 33, 223, 93, 1, 235,
- 141, 223, 93, 1, 227, 165, 223, 93, 1, 206, 223, 93, 1, 205, 223, 93, 1,
- 233, 135, 223, 93, 1, 191, 223, 93, 1, 212, 65, 223, 93, 1, 162, 223, 93,
- 1, 231, 124, 223, 93, 1, 229, 56, 223, 93, 1, 229, 148, 223, 93, 1, 227,
- 135, 223, 93, 1, 61, 223, 93, 25, 5, 73, 223, 93, 25, 5, 70, 223, 93, 25,
- 5, 75, 223, 93, 25, 5, 254, 201, 223, 93, 25, 5, 76, 223, 93, 25, 5, 253,
- 192, 223, 93, 25, 5, 245, 55, 223, 93, 25, 5, 245, 233, 223, 93, 116, 5,
- 229, 79, 223, 93, 116, 5, 230, 25, 223, 93, 116, 5, 153, 223, 93, 116, 5,
- 242, 60, 223, 93, 213, 152, 223, 93, 221, 173, 78, 24, 100, 216, 97, 24,
- 100, 216, 96, 24, 100, 216, 94, 24, 100, 216, 99, 24, 100, 223, 21, 24,
- 100, 223, 5, 24, 100, 223, 0, 24, 100, 223, 2, 24, 100, 223, 18, 24, 100,
- 223, 11, 24, 100, 223, 4, 24, 100, 223, 23, 24, 100, 223, 6, 24, 100,
- 223, 25, 24, 100, 223, 22, 24, 100, 230, 213, 24, 100, 230, 204, 24, 100,
- 230, 207, 24, 100, 225, 80, 24, 100, 225, 91, 24, 100, 225, 92, 24, 100,
- 218, 207, 24, 100, 236, 46, 24, 100, 236, 53, 24, 100, 218, 218, 24, 100,
- 218, 205, 24, 100, 225, 130, 24, 100, 241, 167, 24, 100, 218, 202, 155,
- 5, 226, 27, 155, 5, 250, 187, 155, 5, 233, 66, 155, 5, 211, 243, 155, 1,
- 61, 155, 1, 240, 154, 234, 191, 155, 1, 73, 155, 1, 236, 33, 155, 1, 70,
- 155, 1, 226, 90, 250, 163, 155, 1, 229, 78, 233, 28, 155, 1, 229, 78,
- 233, 29, 223, 142, 155, 1, 75, 155, 1, 254, 201, 155, 1, 76, 155, 1, 176,
- 155, 1, 235, 13, 221, 228, 155, 1, 235, 13, 230, 66, 155, 1, 243, 135,
- 155, 1, 243, 136, 230, 66, 155, 1, 229, 77, 155, 1, 251, 33, 155, 1, 251,
- 34, 230, 66, 155, 1, 235, 141, 155, 1, 227, 166, 230, 66, 155, 1, 235,
- 142, 231, 207, 155, 1, 227, 165, 155, 1, 215, 156, 155, 1, 215, 157, 231,
- 207, 155, 1, 248, 135, 155, 1, 248, 136, 231, 207, 155, 1, 229, 229, 230,
- 66, 155, 1, 217, 105, 155, 1, 217, 106, 230, 66, 155, 1, 248, 221, 155,
- 1, 248, 222, 231, 207, 155, 1, 197, 155, 1, 190, 155, 1, 226, 90, 230,
- 66, 155, 1, 252, 191, 155, 1, 252, 192, 230, 66, 155, 1, 184, 155, 1,
- 191, 155, 1, 205, 155, 1, 223, 188, 254, 210, 155, 1, 233, 135, 155, 1,
- 212, 65, 155, 1, 222, 34, 230, 66, 155, 1, 222, 34, 231, 207, 155, 1,
- 206, 155, 1, 162, 155, 5, 250, 188, 216, 250, 155, 25, 5, 217, 47, 155,
- 25, 5, 216, 35, 155, 25, 5, 211, 190, 155, 25, 5, 211, 191, 231, 69, 155,
- 25, 5, 218, 47, 155, 25, 5, 218, 48, 231, 57, 155, 25, 5, 217, 65, 155,
- 25, 5, 247, 194, 230, 65, 155, 25, 5, 225, 184, 155, 116, 5, 234, 158,
- 155, 116, 5, 225, 196, 155, 116, 5, 251, 19, 155, 226, 40, 155, 43, 223,
- 69, 155, 44, 223, 69, 155, 226, 79, 254, 117, 155, 226, 79, 231, 224,
- 155, 226, 79, 232, 88, 155, 226, 79, 211, 238, 155, 226, 79, 226, 41,
- 155, 226, 79, 232, 205, 155, 226, 79, 232, 82, 155, 226, 79, 254, 249,
- 155, 226, 79, 254, 250, 254, 249, 155, 226, 79, 225, 51, 155, 215, 94,
- 226, 79, 225, 51, 155, 226, 36, 155, 21, 210, 86, 155, 21, 110, 155, 21,
+ 1, 213, 176, 38, 84, 5, 253, 176, 84, 5, 219, 18, 251, 0, 84, 5, 251, 1,
+ 213, 152, 84, 5, 52, 251, 1, 213, 152, 84, 5, 251, 1, 105, 84, 5, 251, 1,
+ 158, 84, 5, 251, 1, 253, 176, 84, 5, 224, 125, 84, 243, 101, 244, 104,
+ 84, 250, 239, 84, 241, 231, 234, 189, 232, 243, 21, 210, 86, 234, 189,
+ 232, 243, 21, 110, 234, 189, 232, 243, 21, 105, 234, 189, 232, 243, 21,
+ 158, 234, 189, 232, 243, 21, 161, 234, 189, 232, 243, 21, 189, 234, 189,
+ 232, 243, 21, 194, 234, 189, 232, 243, 21, 198, 234, 189, 232, 243, 21,
+ 195, 234, 189, 232, 243, 21, 200, 234, 189, 232, 243, 1, 176, 234, 189,
+ 232, 243, 1, 234, 133, 234, 189, 232, 243, 1, 243, 136, 234, 189, 232,
+ 243, 1, 229, 78, 234, 189, 232, 243, 1, 206, 234, 189, 232, 243, 1, 220,
+ 103, 234, 189, 232, 243, 1, 210, 116, 234, 189, 232, 243, 1, 227, 166,
+ 234, 189, 232, 243, 1, 217, 106, 234, 189, 232, 243, 1, 240, 227, 234,
+ 189, 232, 243, 1, 197, 234, 189, 232, 243, 1, 190, 234, 189, 232, 243, 1,
+ 225, 148, 234, 189, 232, 243, 1, 185, 234, 189, 232, 243, 1, 248, 222,
+ 234, 189, 232, 243, 1, 252, 192, 234, 189, 232, 243, 1, 205, 234, 189,
+ 232, 243, 1, 191, 234, 189, 232, 243, 1, 233, 136, 234, 189, 232, 243, 1,
+ 212, 65, 234, 189, 232, 243, 1, 216, 209, 234, 189, 232, 243, 1, 162,
+ 234, 189, 232, 243, 1, 214, 27, 234, 189, 232, 243, 1, 251, 34, 234, 189,
+ 232, 243, 1, 61, 234, 189, 232, 243, 1, 226, 235, 234, 189, 232, 243, 1,
+ 73, 234, 189, 232, 243, 1, 226, 184, 234, 189, 232, 243, 25, 214, 214,
+ 234, 189, 232, 243, 25, 75, 234, 189, 232, 243, 25, 70, 234, 189, 232,
+ 243, 25, 245, 210, 234, 189, 232, 243, 25, 76, 234, 189, 232, 243, 138,
+ 225, 31, 234, 189, 232, 243, 138, 251, 13, 234, 189, 232, 243, 138, 251,
+ 14, 225, 31, 234, 189, 232, 243, 5, 249, 78, 234, 189, 232, 243, 5, 219,
+ 200, 223, 94, 1, 176, 223, 94, 1, 243, 136, 223, 94, 1, 229, 78, 223, 94,
+ 1, 217, 106, 223, 94, 1, 248, 222, 223, 94, 1, 197, 223, 94, 1, 190, 223,
+ 94, 1, 252, 192, 223, 94, 1, 185, 223, 94, 1, 251, 34, 223, 94, 1, 235,
+ 142, 223, 94, 1, 227, 166, 223, 94, 1, 206, 223, 94, 1, 205, 223, 94, 1,
+ 233, 136, 223, 94, 1, 191, 223, 94, 1, 212, 65, 223, 94, 1, 162, 223, 94,
+ 1, 231, 125, 223, 94, 1, 229, 57, 223, 94, 1, 229, 149, 223, 94, 1, 227,
+ 136, 223, 94, 1, 61, 223, 94, 25, 5, 73, 223, 94, 25, 5, 70, 223, 94, 25,
+ 5, 75, 223, 94, 25, 5, 254, 202, 223, 94, 25, 5, 76, 223, 94, 25, 5, 253,
+ 193, 223, 94, 25, 5, 245, 56, 223, 94, 25, 5, 245, 234, 223, 94, 116, 5,
+ 229, 80, 223, 94, 116, 5, 230, 26, 223, 94, 116, 5, 153, 223, 94, 116, 5,
+ 242, 61, 223, 94, 213, 152, 223, 94, 221, 174, 78, 24, 100, 216, 98, 24,
+ 100, 216, 97, 24, 100, 216, 95, 24, 100, 216, 100, 24, 100, 223, 22, 24,
+ 100, 223, 6, 24, 100, 223, 1, 24, 100, 223, 3, 24, 100, 223, 19, 24, 100,
+ 223, 12, 24, 100, 223, 5, 24, 100, 223, 24, 24, 100, 223, 7, 24, 100,
+ 223, 26, 24, 100, 223, 23, 24, 100, 230, 214, 24, 100, 230, 205, 24, 100,
+ 230, 208, 24, 100, 225, 81, 24, 100, 225, 92, 24, 100, 225, 93, 24, 100,
+ 218, 208, 24, 100, 236, 47, 24, 100, 236, 54, 24, 100, 218, 219, 24, 100,
+ 218, 206, 24, 100, 225, 131, 24, 100, 241, 168, 24, 100, 218, 203, 155,
+ 5, 226, 28, 155, 5, 250, 188, 155, 5, 233, 67, 155, 5, 211, 243, 155, 1,
+ 61, 155, 1, 240, 155, 234, 192, 155, 1, 73, 155, 1, 236, 34, 155, 1, 70,
+ 155, 1, 226, 91, 250, 164, 155, 1, 229, 79, 233, 29, 155, 1, 229, 79,
+ 233, 30, 223, 143, 155, 1, 75, 155, 1, 254, 202, 155, 1, 76, 155, 1, 176,
+ 155, 1, 235, 14, 221, 229, 155, 1, 235, 14, 230, 67, 155, 1, 243, 136,
+ 155, 1, 243, 137, 230, 67, 155, 1, 229, 78, 155, 1, 251, 34, 155, 1, 251,
+ 35, 230, 67, 155, 1, 235, 142, 155, 1, 227, 167, 230, 67, 155, 1, 235,
+ 143, 231, 208, 155, 1, 227, 166, 155, 1, 215, 157, 155, 1, 215, 158, 231,
+ 208, 155, 1, 248, 136, 155, 1, 248, 137, 231, 208, 155, 1, 229, 230, 230,
+ 67, 155, 1, 217, 106, 155, 1, 217, 107, 230, 67, 155, 1, 248, 222, 155,
+ 1, 248, 223, 231, 208, 155, 1, 197, 155, 1, 190, 155, 1, 226, 91, 230,
+ 67, 155, 1, 252, 192, 155, 1, 252, 193, 230, 67, 155, 1, 185, 155, 1,
+ 191, 155, 1, 205, 155, 1, 223, 189, 254, 211, 155, 1, 233, 136, 155, 1,
+ 212, 65, 155, 1, 222, 35, 230, 67, 155, 1, 222, 35, 231, 208, 155, 1,
+ 206, 155, 1, 162, 155, 5, 250, 189, 216, 251, 155, 25, 5, 217, 48, 155,
+ 25, 5, 216, 36, 155, 25, 5, 211, 190, 155, 25, 5, 211, 191, 231, 70, 155,
+ 25, 5, 218, 48, 155, 25, 5, 218, 49, 231, 58, 155, 25, 5, 217, 66, 155,
+ 25, 5, 247, 195, 230, 66, 155, 25, 5, 225, 185, 155, 116, 5, 234, 159,
+ 155, 116, 5, 225, 197, 155, 116, 5, 251, 20, 155, 226, 41, 155, 43, 223,
+ 70, 155, 44, 223, 70, 155, 226, 80, 254, 118, 155, 226, 80, 231, 225,
+ 155, 226, 80, 232, 89, 155, 226, 80, 211, 238, 155, 226, 80, 226, 42,
+ 155, 226, 80, 232, 206, 155, 226, 80, 232, 83, 155, 226, 80, 254, 250,
+ 155, 226, 80, 254, 251, 254, 250, 155, 226, 80, 225, 52, 155, 215, 94,
+ 226, 80, 225, 52, 155, 226, 37, 155, 21, 210, 86, 155, 21, 110, 155, 21,
105, 155, 21, 158, 155, 21, 161, 155, 21, 189, 155, 21, 194, 155, 21,
- 198, 155, 21, 195, 155, 21, 200, 155, 226, 79, 216, 69, 215, 106, 155,
- 226, 79, 235, 167, 172, 1, 61, 172, 1, 73, 172, 1, 70, 172, 1, 75, 172,
- 1, 254, 201, 172, 1, 76, 172, 1, 176, 172, 1, 234, 132, 172, 1, 243, 135,
- 172, 1, 242, 249, 172, 1, 228, 245, 172, 1, 229, 77, 172, 1, 250, 157,
- 172, 1, 250, 112, 172, 1, 235, 141, 172, 1, 235, 114, 172, 1, 228, 235,
- 172, 1, 228, 237, 172, 1, 228, 236, 172, 1, 217, 105, 172, 1, 216, 208,
- 172, 1, 248, 221, 172, 1, 248, 25, 172, 1, 227, 207, 172, 1, 197, 172, 1,
- 248, 135, 172, 1, 190, 172, 1, 224, 220, 172, 1, 225, 147, 172, 1, 252,
- 191, 172, 1, 252, 18, 172, 1, 230, 95, 172, 1, 184, 172, 1, 252, 111,
- 172, 1, 191, 172, 1, 205, 172, 1, 233, 135, 172, 1, 214, 27, 172, 1, 218,
- 223, 172, 1, 206, 172, 1, 162, 172, 25, 5, 255, 73, 172, 25, 5, 73, 172,
- 25, 5, 236, 33, 172, 25, 5, 245, 195, 172, 25, 5, 70, 172, 25, 5, 226,
- 234, 172, 25, 5, 76, 172, 25, 5, 254, 201, 172, 25, 5, 253, 192, 172, 25,
- 5, 214, 214, 172, 116, 5, 191, 172, 116, 5, 205, 172, 116, 5, 233, 135,
- 172, 116, 5, 212, 65, 172, 1, 40, 235, 23, 172, 1, 40, 243, 202, 172, 1,
- 40, 229, 79, 172, 116, 5, 40, 229, 79, 172, 1, 40, 250, 158, 172, 1, 40,
- 217, 152, 172, 1, 40, 230, 25, 172, 1, 40, 226, 105, 172, 1, 40, 211,
- 117, 172, 1, 40, 153, 172, 1, 40, 156, 172, 1, 40, 218, 226, 172, 116, 5,
- 40, 193, 172, 116, 5, 40, 242, 60, 172, 21, 210, 86, 172, 21, 110, 172,
+ 198, 155, 21, 195, 155, 21, 200, 155, 226, 80, 216, 70, 215, 107, 155,
+ 226, 80, 235, 168, 172, 1, 61, 172, 1, 73, 172, 1, 70, 172, 1, 75, 172,
+ 1, 254, 202, 172, 1, 76, 172, 1, 176, 172, 1, 234, 133, 172, 1, 243, 136,
+ 172, 1, 242, 250, 172, 1, 228, 246, 172, 1, 229, 78, 172, 1, 250, 158,
+ 172, 1, 250, 113, 172, 1, 235, 142, 172, 1, 235, 115, 172, 1, 228, 236,
+ 172, 1, 228, 238, 172, 1, 228, 237, 172, 1, 217, 106, 172, 1, 216, 209,
+ 172, 1, 248, 222, 172, 1, 248, 26, 172, 1, 227, 208, 172, 1, 197, 172, 1,
+ 248, 136, 172, 1, 190, 172, 1, 224, 221, 172, 1, 225, 148, 172, 1, 252,
+ 192, 172, 1, 252, 19, 172, 1, 230, 96, 172, 1, 185, 172, 1, 252, 112,
+ 172, 1, 191, 172, 1, 205, 172, 1, 233, 136, 172, 1, 214, 27, 172, 1, 218,
+ 224, 172, 1, 206, 172, 1, 162, 172, 25, 5, 255, 74, 172, 25, 5, 73, 172,
+ 25, 5, 236, 34, 172, 25, 5, 245, 196, 172, 25, 5, 70, 172, 25, 5, 226,
+ 235, 172, 25, 5, 76, 172, 25, 5, 254, 202, 172, 25, 5, 253, 193, 172, 25,
+ 5, 214, 214, 172, 116, 5, 191, 172, 116, 5, 205, 172, 116, 5, 233, 136,
+ 172, 116, 5, 212, 65, 172, 1, 40, 235, 24, 172, 1, 40, 243, 203, 172, 1,
+ 40, 229, 80, 172, 116, 5, 40, 229, 80, 172, 1, 40, 250, 159, 172, 1, 40,
+ 217, 153, 172, 1, 40, 230, 26, 172, 1, 40, 226, 106, 172, 1, 40, 211,
+ 117, 172, 1, 40, 153, 172, 1, 40, 156, 172, 1, 40, 218, 227, 172, 116, 5,
+ 40, 193, 172, 116, 5, 40, 242, 61, 172, 21, 210, 86, 172, 21, 110, 172,
21, 105, 172, 21, 158, 172, 21, 161, 172, 21, 189, 172, 21, 194, 172, 21,
- 198, 172, 21, 195, 172, 21, 200, 172, 224, 141, 218, 251, 172, 224, 141,
- 248, 178, 172, 224, 141, 52, 248, 178, 172, 224, 141, 215, 211, 248, 178,
- 68, 1, 234, 126, 243, 135, 68, 1, 234, 126, 251, 33, 68, 1, 234, 126,
- 250, 157, 68, 1, 234, 126, 235, 141, 68, 1, 234, 126, 235, 114, 68, 1,
- 234, 126, 227, 165, 68, 1, 234, 126, 215, 156, 68, 1, 234, 126, 215, 144,
- 68, 1, 234, 126, 248, 135, 68, 1, 234, 126, 248, 119, 68, 1, 234, 126,
- 248, 25, 68, 1, 234, 126, 197, 68, 1, 234, 126, 206, 68, 1, 234, 126,
- 162, 68, 1, 234, 126, 241, 189, 68, 1, 234, 126, 244, 196, 68, 58, 1,
- 234, 126, 223, 109, 68, 1, 234, 126, 211, 165, 68, 1, 234, 126, 210, 116,
- 68, 1, 234, 126, 205, 68, 232, 145, 234, 126, 226, 253, 68, 232, 145,
- 234, 126, 224, 43, 68, 232, 145, 234, 126, 241, 121, 68, 16, 254, 190,
- 245, 30, 68, 16, 254, 190, 110, 68, 16, 254, 190, 105, 68, 1, 254, 190,
- 205, 68, 5, 226, 23, 234, 213, 216, 30, 39, 208, 1, 121, 234, 28, 39,
- 208, 1, 125, 234, 28, 39, 208, 1, 121, 234, 105, 39, 208, 1, 125, 234,
- 105, 39, 208, 1, 121, 234, 114, 39, 208, 1, 125, 234, 114, 39, 208, 1,
- 121, 242, 174, 39, 208, 1, 125, 242, 174, 39, 208, 1, 121, 229, 4, 39,
- 208, 1, 125, 229, 4, 39, 208, 1, 121, 249, 238, 39, 208, 1, 125, 249,
- 238, 39, 208, 1, 121, 250, 86, 39, 208, 1, 125, 250, 86, 39, 208, 1, 121,
- 219, 58, 39, 208, 1, 125, 219, 58, 39, 208, 1, 121, 227, 134, 39, 208, 1,
- 125, 227, 134, 39, 208, 1, 121, 247, 145, 39, 208, 1, 125, 247, 145, 39,
- 208, 1, 121, 111, 39, 208, 1, 125, 111, 39, 208, 1, 121, 216, 156, 39,
- 208, 1, 125, 216, 156, 39, 208, 1, 121, 228, 74, 39, 208, 1, 125, 228,
- 74, 39, 208, 1, 121, 251, 205, 39, 208, 1, 125, 251, 205, 39, 208, 1,
- 121, 225, 16, 39, 208, 1, 125, 225, 16, 39, 208, 1, 121, 225, 121, 39,
- 208, 1, 125, 225, 121, 39, 208, 1, 121, 244, 43, 39, 208, 1, 125, 244,
- 43, 39, 208, 1, 121, 230, 161, 39, 208, 1, 125, 230, 161, 39, 208, 1,
- 121, 210, 244, 39, 208, 1, 125, 210, 244, 39, 208, 1, 121, 222, 211, 39,
- 208, 1, 125, 222, 211, 39, 208, 1, 121, 232, 156, 39, 208, 1, 125, 232,
- 156, 39, 208, 1, 121, 213, 138, 39, 208, 1, 125, 213, 138, 39, 208, 1,
- 121, 241, 68, 39, 208, 1, 125, 241, 68, 39, 208, 1, 121, 76, 39, 208, 1,
- 125, 76, 39, 208, 231, 204, 234, 230, 39, 208, 25, 255, 73, 39, 208, 25,
+ 198, 172, 21, 195, 172, 21, 200, 172, 224, 142, 218, 252, 172, 224, 142,
+ 248, 179, 172, 224, 142, 52, 248, 179, 172, 224, 142, 215, 212, 248, 179,
+ 68, 1, 234, 127, 243, 136, 68, 1, 234, 127, 251, 34, 68, 1, 234, 127,
+ 250, 158, 68, 1, 234, 127, 235, 142, 68, 1, 234, 127, 235, 115, 68, 1,
+ 234, 127, 227, 166, 68, 1, 234, 127, 215, 157, 68, 1, 234, 127, 215, 145,
+ 68, 1, 234, 127, 248, 136, 68, 1, 234, 127, 248, 120, 68, 1, 234, 127,
+ 248, 26, 68, 1, 234, 127, 197, 68, 1, 234, 127, 206, 68, 1, 234, 127,
+ 162, 68, 1, 234, 127, 241, 190, 68, 1, 234, 127, 244, 197, 68, 58, 1,
+ 234, 127, 223, 110, 68, 1, 234, 127, 211, 165, 68, 1, 234, 127, 210, 116,
+ 68, 1, 234, 127, 205, 68, 232, 146, 234, 127, 226, 254, 68, 232, 146,
+ 234, 127, 224, 44, 68, 232, 146, 234, 127, 241, 122, 68, 16, 254, 191,
+ 245, 31, 68, 16, 254, 191, 110, 68, 16, 254, 191, 105, 68, 1, 254, 191,
+ 205, 68, 5, 226, 24, 234, 214, 216, 31, 39, 208, 1, 121, 234, 29, 39,
+ 208, 1, 125, 234, 29, 39, 208, 1, 121, 234, 106, 39, 208, 1, 125, 234,
+ 106, 39, 208, 1, 121, 234, 115, 39, 208, 1, 125, 234, 115, 39, 208, 1,
+ 121, 242, 175, 39, 208, 1, 125, 242, 175, 39, 208, 1, 121, 229, 5, 39,
+ 208, 1, 125, 229, 5, 39, 208, 1, 121, 249, 239, 39, 208, 1, 125, 249,
+ 239, 39, 208, 1, 121, 250, 87, 39, 208, 1, 125, 250, 87, 39, 208, 1, 121,
+ 219, 59, 39, 208, 1, 125, 219, 59, 39, 208, 1, 121, 227, 135, 39, 208, 1,
+ 125, 227, 135, 39, 208, 1, 121, 247, 146, 39, 208, 1, 125, 247, 146, 39,
+ 208, 1, 121, 111, 39, 208, 1, 125, 111, 39, 208, 1, 121, 216, 157, 39,
+ 208, 1, 125, 216, 157, 39, 208, 1, 121, 228, 75, 39, 208, 1, 125, 228,
+ 75, 39, 208, 1, 121, 251, 206, 39, 208, 1, 125, 251, 206, 39, 208, 1,
+ 121, 225, 17, 39, 208, 1, 125, 225, 17, 39, 208, 1, 121, 225, 122, 39,
+ 208, 1, 125, 225, 122, 39, 208, 1, 121, 244, 44, 39, 208, 1, 125, 244,
+ 44, 39, 208, 1, 121, 230, 162, 39, 208, 1, 125, 230, 162, 39, 208, 1,
+ 121, 210, 244, 39, 208, 1, 125, 210, 244, 39, 208, 1, 121, 222, 212, 39,
+ 208, 1, 125, 222, 212, 39, 208, 1, 121, 232, 157, 39, 208, 1, 125, 232,
+ 157, 39, 208, 1, 121, 213, 138, 39, 208, 1, 125, 213, 138, 39, 208, 1,
+ 121, 241, 69, 39, 208, 1, 125, 241, 69, 39, 208, 1, 121, 76, 39, 208, 1,
+ 125, 76, 39, 208, 231, 205, 234, 231, 39, 208, 25, 255, 74, 39, 208, 25,
73, 39, 208, 25, 214, 214, 39, 208, 25, 70, 39, 208, 25, 75, 39, 208, 25,
- 76, 39, 208, 231, 204, 234, 108, 39, 208, 25, 240, 119, 39, 208, 25, 214,
- 213, 39, 208, 25, 214, 229, 39, 208, 25, 253, 190, 39, 208, 25, 253, 167,
- 39, 208, 25, 254, 123, 39, 208, 25, 254, 136, 39, 208, 138, 231, 204,
- 245, 180, 39, 208, 138, 231, 204, 227, 206, 39, 208, 138, 231, 204, 216,
- 156, 39, 208, 138, 231, 204, 219, 42, 39, 208, 16, 234, 13, 39, 208, 16,
- 227, 206, 39, 208, 16, 221, 253, 39, 208, 16, 241, 69, 241, 64, 39, 208,
- 16, 234, 22, 234, 21, 186, 185, 1, 75, 186, 185, 1, 76, 186, 185, 1, 250,
- 157, 186, 185, 1, 227, 165, 186, 185, 1, 215, 156, 186, 185, 1, 215, 144,
- 186, 185, 1, 248, 135, 186, 185, 1, 248, 119, 186, 185, 1, 228, 110, 186,
- 185, 1, 220, 102, 186, 185, 1, 218, 223, 186, 185, 25, 5, 236, 33, 186,
- 185, 25, 5, 214, 118, 186, 185, 25, 5, 255, 37, 186, 185, 25, 5, 253,
- 192, 186, 185, 25, 5, 255, 30, 186, 185, 250, 125, 186, 185, 254, 206,
- 234, 98, 186, 185, 254, 103, 186, 185, 3, 223, 74, 78, 186, 185, 211,
- 209, 223, 74, 78, 186, 185, 25, 5, 213, 147, 186, 185, 213, 152, 29, 3,
- 215, 137, 29, 3, 215, 140, 29, 3, 215, 143, 29, 3, 215, 141, 29, 3, 215,
- 142, 29, 3, 215, 139, 29, 3, 248, 113, 29, 3, 248, 115, 29, 3, 248, 118,
- 29, 3, 248, 116, 29, 3, 248, 117, 29, 3, 248, 114, 29, 3, 246, 28, 29, 3,
- 246, 31, 29, 3, 246, 37, 29, 3, 246, 35, 29, 3, 246, 36, 29, 3, 246, 29,
- 29, 3, 250, 204, 29, 3, 250, 198, 29, 3, 250, 200, 29, 3, 250, 203, 29,
- 3, 250, 201, 29, 3, 250, 202, 29, 3, 250, 199, 29, 3, 252, 111, 29, 3,
- 252, 90, 29, 3, 252, 102, 29, 3, 252, 110, 29, 3, 252, 105, 29, 3, 252,
- 106, 29, 3, 252, 94, 186, 185, 1, 234, 19, 186, 185, 1, 221, 253, 186,
- 185, 1, 233, 109, 186, 185, 1, 230, 172, 186, 185, 1, 190, 186, 185, 1,
- 197, 186, 185, 1, 250, 102, 186, 185, 1, 216, 90, 186, 185, 1, 234, 101,
- 186, 185, 1, 228, 250, 186, 185, 1, 216, 150, 186, 185, 1, 212, 60, 186,
- 185, 1, 211, 69, 186, 185, 1, 240, 216, 186, 185, 1, 214, 190, 186, 185,
- 1, 73, 186, 185, 1, 225, 142, 186, 185, 1, 253, 202, 186, 185, 1, 242,
- 167, 186, 185, 1, 235, 112, 186, 185, 1, 223, 166, 186, 185, 1, 252, 191,
- 186, 185, 1, 235, 100, 186, 185, 1, 247, 219, 186, 185, 1, 242, 221, 186,
- 185, 1, 248, 5, 186, 185, 1, 252, 16, 186, 185, 1, 234, 20, 232, 128,
- 186, 185, 1, 233, 110, 232, 128, 186, 185, 1, 230, 173, 232, 128, 186,
- 185, 1, 226, 90, 232, 128, 186, 185, 1, 229, 229, 232, 128, 186, 185, 1,
- 216, 91, 232, 128, 186, 185, 1, 228, 251, 232, 128, 186, 185, 1, 240,
- 154, 232, 128, 186, 185, 25, 5, 226, 195, 186, 185, 25, 5, 235, 253, 186,
- 185, 25, 5, 254, 122, 186, 185, 25, 5, 211, 38, 186, 185, 25, 5, 219, 32,
- 186, 185, 25, 5, 214, 187, 186, 185, 25, 5, 250, 123, 186, 185, 25, 5,
- 227, 191, 186, 185, 250, 124, 186, 185, 232, 85, 235, 150, 186, 185, 254,
- 46, 235, 150, 186, 185, 21, 210, 86, 186, 185, 21, 110, 186, 185, 21,
- 105, 186, 185, 21, 158, 186, 185, 21, 161, 186, 185, 21, 189, 186, 185,
- 21, 194, 186, 185, 21, 198, 186, 185, 21, 195, 186, 185, 21, 200, 24,
- 143, 227, 77, 24, 143, 227, 82, 24, 143, 210, 243, 24, 143, 210, 242, 24,
+ 76, 39, 208, 231, 205, 234, 109, 39, 208, 25, 240, 120, 39, 208, 25, 214,
+ 213, 39, 208, 25, 214, 229, 39, 208, 25, 253, 191, 39, 208, 25, 253, 168,
+ 39, 208, 25, 254, 124, 39, 208, 25, 254, 137, 39, 208, 138, 231, 205,
+ 245, 181, 39, 208, 138, 231, 205, 227, 207, 39, 208, 138, 231, 205, 216,
+ 157, 39, 208, 138, 231, 205, 219, 43, 39, 208, 16, 234, 14, 39, 208, 16,
+ 227, 207, 39, 208, 16, 221, 254, 39, 208, 16, 241, 70, 241, 65, 39, 208,
+ 16, 234, 23, 234, 22, 187, 186, 1, 75, 187, 186, 1, 76, 187, 186, 1, 250,
+ 158, 187, 186, 1, 227, 166, 187, 186, 1, 215, 157, 187, 186, 1, 215, 145,
+ 187, 186, 1, 248, 136, 187, 186, 1, 248, 120, 187, 186, 1, 228, 111, 187,
+ 186, 1, 220, 103, 187, 186, 1, 218, 224, 187, 186, 25, 5, 236, 34, 187,
+ 186, 25, 5, 214, 118, 187, 186, 25, 5, 255, 38, 187, 186, 25, 5, 253,
+ 193, 187, 186, 25, 5, 255, 31, 187, 186, 250, 126, 187, 186, 254, 207,
+ 234, 99, 187, 186, 254, 104, 187, 186, 3, 223, 75, 78, 187, 186, 211,
+ 209, 223, 75, 78, 187, 186, 25, 5, 213, 147, 187, 186, 213, 152, 29, 3,
+ 215, 138, 29, 3, 215, 141, 29, 3, 215, 144, 29, 3, 215, 142, 29, 3, 215,
+ 143, 29, 3, 215, 140, 29, 3, 248, 114, 29, 3, 248, 116, 29, 3, 248, 119,
+ 29, 3, 248, 117, 29, 3, 248, 118, 29, 3, 248, 115, 29, 3, 246, 29, 29, 3,
+ 246, 32, 29, 3, 246, 38, 29, 3, 246, 36, 29, 3, 246, 37, 29, 3, 246, 30,
+ 29, 3, 250, 205, 29, 3, 250, 199, 29, 3, 250, 201, 29, 3, 250, 204, 29,
+ 3, 250, 202, 29, 3, 250, 203, 29, 3, 250, 200, 29, 3, 252, 112, 29, 3,
+ 252, 91, 29, 3, 252, 103, 29, 3, 252, 111, 29, 3, 252, 106, 29, 3, 252,
+ 107, 29, 3, 252, 95, 187, 186, 1, 234, 20, 187, 186, 1, 221, 254, 187,
+ 186, 1, 233, 110, 187, 186, 1, 230, 173, 187, 186, 1, 190, 187, 186, 1,
+ 197, 187, 186, 1, 250, 103, 187, 186, 1, 216, 91, 187, 186, 1, 234, 102,
+ 187, 186, 1, 228, 251, 187, 186, 1, 216, 151, 187, 186, 1, 212, 60, 187,
+ 186, 1, 211, 69, 187, 186, 1, 240, 217, 187, 186, 1, 214, 190, 187, 186,
+ 1, 73, 187, 186, 1, 225, 143, 187, 186, 1, 253, 203, 187, 186, 1, 242,
+ 168, 187, 186, 1, 235, 113, 187, 186, 1, 223, 167, 187, 186, 1, 252, 192,
+ 187, 186, 1, 235, 101, 187, 186, 1, 247, 220, 187, 186, 1, 242, 222, 187,
+ 186, 1, 248, 6, 187, 186, 1, 252, 17, 187, 186, 1, 234, 21, 232, 129,
+ 187, 186, 1, 233, 111, 232, 129, 187, 186, 1, 230, 174, 232, 129, 187,
+ 186, 1, 226, 91, 232, 129, 187, 186, 1, 229, 230, 232, 129, 187, 186, 1,
+ 216, 92, 232, 129, 187, 186, 1, 228, 252, 232, 129, 187, 186, 1, 240,
+ 155, 232, 129, 187, 186, 25, 5, 226, 196, 187, 186, 25, 5, 235, 254, 187,
+ 186, 25, 5, 254, 123, 187, 186, 25, 5, 211, 38, 187, 186, 25, 5, 219, 33,
+ 187, 186, 25, 5, 214, 187, 187, 186, 25, 5, 250, 124, 187, 186, 25, 5,
+ 227, 192, 187, 186, 250, 125, 187, 186, 232, 86, 235, 151, 187, 186, 254,
+ 47, 235, 151, 187, 186, 21, 210, 86, 187, 186, 21, 110, 187, 186, 21,
+ 105, 187, 186, 21, 158, 187, 186, 21, 161, 187, 186, 21, 189, 187, 186,
+ 21, 194, 187, 186, 21, 198, 187, 186, 21, 195, 187, 186, 21, 200, 24,
+ 143, 227, 78, 24, 143, 227, 83, 24, 143, 210, 243, 24, 143, 210, 242, 24,
143, 210, 241, 24, 143, 215, 23, 24, 143, 215, 26, 24, 143, 210, 210, 24,
- 143, 210, 206, 24, 143, 245, 54, 24, 143, 245, 52, 24, 143, 245, 53, 24,
- 143, 245, 50, 24, 143, 240, 144, 24, 143, 240, 143, 24, 143, 240, 141,
- 24, 143, 240, 142, 24, 143, 240, 147, 24, 143, 240, 140, 24, 143, 240,
- 139, 24, 143, 240, 149, 24, 143, 254, 33, 24, 143, 254, 32, 24, 90, 228,
- 219, 24, 90, 228, 225, 24, 90, 218, 204, 24, 90, 218, 203, 24, 90, 216,
- 96, 24, 90, 216, 94, 24, 90, 216, 93, 24, 90, 216, 99, 24, 90, 216, 100,
- 24, 90, 216, 92, 24, 90, 223, 5, 24, 90, 223, 20, 24, 90, 218, 210, 24,
- 90, 223, 17, 24, 90, 223, 7, 24, 90, 223, 9, 24, 90, 222, 252, 24, 90,
- 222, 253, 24, 90, 234, 218, 24, 90, 230, 212, 24, 90, 230, 206, 24, 90,
- 218, 214, 24, 90, 230, 209, 24, 90, 230, 215, 24, 90, 225, 76, 24, 90,
- 225, 85, 24, 90, 225, 89, 24, 90, 218, 212, 24, 90, 225, 79, 24, 90, 225,
- 93, 24, 90, 225, 94, 24, 90, 219, 140, 24, 90, 219, 143, 24, 90, 218,
- 208, 24, 90, 218, 206, 24, 90, 219, 138, 24, 90, 219, 146, 24, 90, 219,
- 147, 24, 90, 219, 132, 24, 90, 219, 145, 24, 90, 226, 30, 24, 90, 226,
- 31, 24, 90, 211, 24, 24, 90, 211, 25, 24, 90, 250, 44, 24, 90, 250, 43,
- 24, 90, 218, 219, 24, 90, 225, 128, 24, 90, 225, 127, 9, 14, 238, 24, 9,
- 14, 238, 23, 9, 14, 238, 22, 9, 14, 238, 21, 9, 14, 238, 20, 9, 14, 238,
- 19, 9, 14, 238, 18, 9, 14, 238, 17, 9, 14, 238, 16, 9, 14, 238, 15, 9,
- 14, 238, 14, 9, 14, 238, 13, 9, 14, 238, 12, 9, 14, 238, 11, 9, 14, 238,
- 10, 9, 14, 238, 9, 9, 14, 238, 8, 9, 14, 238, 7, 9, 14, 238, 6, 9, 14,
- 238, 5, 9, 14, 238, 4, 9, 14, 238, 3, 9, 14, 238, 2, 9, 14, 238, 1, 9,
- 14, 238, 0, 9, 14, 237, 255, 9, 14, 237, 254, 9, 14, 237, 253, 9, 14,
- 237, 252, 9, 14, 237, 251, 9, 14, 237, 250, 9, 14, 237, 249, 9, 14, 237,
- 248, 9, 14, 237, 247, 9, 14, 237, 246, 9, 14, 237, 245, 9, 14, 237, 244,
- 9, 14, 237, 243, 9, 14, 237, 242, 9, 14, 237, 241, 9, 14, 237, 240, 9,
- 14, 237, 239, 9, 14, 237, 238, 9, 14, 237, 237, 9, 14, 237, 236, 9, 14,
- 237, 235, 9, 14, 237, 234, 9, 14, 237, 233, 9, 14, 237, 232, 9, 14, 237,
- 231, 9, 14, 237, 230, 9, 14, 237, 229, 9, 14, 237, 228, 9, 14, 237, 227,
- 9, 14, 237, 226, 9, 14, 237, 225, 9, 14, 237, 224, 9, 14, 237, 223, 9,
- 14, 237, 222, 9, 14, 237, 221, 9, 14, 237, 220, 9, 14, 237, 219, 9, 14,
- 237, 218, 9, 14, 237, 217, 9, 14, 237, 216, 9, 14, 237, 215, 9, 14, 237,
- 214, 9, 14, 237, 213, 9, 14, 237, 212, 9, 14, 237, 211, 9, 14, 237, 210,
- 9, 14, 237, 209, 9, 14, 237, 208, 9, 14, 237, 207, 9, 14, 237, 206, 9,
- 14, 237, 205, 9, 14, 237, 204, 9, 14, 237, 203, 9, 14, 237, 202, 9, 14,
- 237, 201, 9, 14, 237, 200, 9, 14, 237, 199, 9, 14, 237, 198, 9, 14, 237,
- 197, 9, 14, 237, 196, 9, 14, 237, 195, 9, 14, 237, 194, 9, 14, 237, 193,
- 9, 14, 237, 192, 9, 14, 237, 191, 9, 14, 237, 190, 9, 14, 237, 189, 9,
- 14, 237, 188, 9, 14, 237, 187, 9, 14, 237, 186, 9, 14, 237, 185, 9, 14,
- 237, 184, 9, 14, 237, 183, 9, 14, 237, 182, 9, 14, 237, 181, 9, 14, 237,
- 180, 9, 14, 237, 179, 9, 14, 237, 178, 9, 14, 237, 177, 9, 14, 237, 176,
- 9, 14, 237, 175, 9, 14, 237, 174, 9, 14, 237, 173, 9, 14, 237, 172, 9,
- 14, 237, 171, 9, 14, 237, 170, 9, 14, 237, 169, 9, 14, 237, 168, 9, 14,
- 237, 167, 9, 14, 237, 166, 9, 14, 237, 165, 9, 14, 237, 164, 9, 14, 237,
- 163, 9, 14, 237, 162, 9, 14, 237, 161, 9, 14, 237, 160, 9, 14, 237, 159,
- 9, 14, 237, 158, 9, 14, 237, 157, 9, 14, 237, 156, 9, 14, 237, 155, 9,
- 14, 237, 154, 9, 14, 237, 153, 9, 14, 237, 152, 9, 14, 237, 151, 9, 14,
- 237, 150, 9, 14, 237, 149, 9, 14, 237, 148, 9, 14, 237, 147, 9, 14, 237,
- 146, 9, 14, 237, 145, 9, 14, 237, 144, 9, 14, 237, 143, 9, 14, 237, 142,
- 9, 14, 237, 141, 9, 14, 237, 140, 9, 14, 237, 139, 9, 14, 237, 138, 9,
- 14, 237, 137, 9, 14, 237, 136, 9, 14, 237, 135, 9, 14, 237, 134, 9, 14,
- 237, 133, 9, 14, 237, 132, 9, 14, 237, 131, 9, 14, 237, 130, 9, 14, 237,
- 129, 9, 14, 237, 128, 9, 14, 237, 127, 9, 14, 237, 126, 9, 14, 237, 125,
- 9, 14, 237, 124, 9, 14, 237, 123, 9, 14, 237, 122, 9, 14, 237, 121, 9,
- 14, 237, 120, 9, 14, 237, 119, 9, 14, 237, 118, 9, 14, 237, 117, 9, 14,
- 237, 116, 9, 14, 237, 115, 9, 14, 237, 114, 9, 14, 237, 113, 9, 14, 237,
- 112, 9, 14, 237, 111, 9, 14, 237, 110, 9, 14, 237, 109, 9, 14, 237, 108,
- 9, 14, 237, 107, 9, 14, 237, 106, 9, 14, 237, 105, 9, 14, 237, 104, 9,
- 14, 237, 103, 9, 14, 237, 102, 9, 14, 237, 101, 9, 14, 237, 100, 9, 14,
- 237, 99, 9, 14, 237, 98, 9, 14, 237, 97, 9, 14, 237, 96, 9, 14, 237, 95,
- 9, 14, 237, 94, 9, 14, 237, 93, 9, 14, 237, 92, 9, 14, 237, 91, 9, 14,
- 237, 90, 9, 14, 237, 89, 9, 14, 237, 88, 9, 14, 237, 87, 9, 14, 237, 86,
- 9, 14, 237, 85, 9, 14, 237, 84, 9, 14, 237, 83, 9, 14, 237, 82, 9, 14,
- 237, 81, 9, 14, 237, 80, 9, 14, 237, 79, 9, 14, 237, 78, 9, 14, 237, 77,
- 9, 14, 237, 76, 9, 14, 237, 75, 9, 14, 237, 74, 9, 14, 237, 73, 9, 14,
- 237, 72, 9, 14, 237, 71, 9, 14, 237, 70, 9, 14, 237, 69, 9, 14, 237, 68,
- 9, 14, 237, 67, 9, 14, 237, 66, 9, 14, 237, 65, 9, 14, 237, 64, 9, 14,
- 237, 63, 9, 14, 237, 62, 9, 14, 237, 61, 9, 14, 237, 60, 9, 14, 237, 59,
- 9, 14, 237, 58, 9, 14, 237, 57, 9, 14, 237, 56, 9, 14, 237, 55, 9, 14,
- 237, 54, 9, 14, 237, 53, 9, 14, 237, 52, 9, 14, 237, 51, 9, 14, 237, 50,
- 9, 14, 237, 49, 9, 14, 237, 48, 9, 14, 237, 47, 9, 14, 237, 46, 9, 14,
- 237, 45, 9, 14, 237, 44, 9, 14, 237, 43, 9, 14, 237, 42, 9, 14, 237, 41,
- 9, 14, 237, 40, 9, 14, 237, 39, 9, 14, 237, 38, 9, 14, 237, 37, 9, 14,
- 237, 36, 9, 14, 237, 35, 9, 14, 237, 34, 9, 14, 237, 33, 9, 14, 237, 32,
- 9, 14, 237, 31, 9, 14, 237, 30, 9, 14, 237, 29, 9, 14, 237, 28, 9, 14,
- 237, 27, 9, 14, 237, 26, 9, 14, 237, 25, 9, 14, 237, 24, 9, 14, 237, 23,
- 9, 14, 237, 22, 9, 14, 237, 21, 9, 14, 237, 20, 9, 14, 237, 19, 9, 14,
- 237, 18, 9, 14, 237, 17, 9, 14, 237, 16, 9, 14, 237, 15, 9, 14, 237, 14,
- 9, 14, 237, 13, 9, 14, 237, 12, 9, 14, 237, 11, 9, 14, 237, 10, 9, 14,
- 237, 9, 9, 14, 237, 8, 9, 14, 237, 7, 9, 14, 237, 6, 9, 14, 237, 5, 9,
- 14, 237, 4, 9, 14, 237, 3, 9, 14, 237, 2, 9, 14, 237, 1, 9, 14, 237, 0,
- 9, 14, 236, 255, 9, 14, 236, 254, 9, 14, 236, 253, 9, 14, 236, 252, 9,
- 14, 236, 251, 9, 14, 236, 250, 9, 14, 236, 249, 9, 14, 236, 248, 9, 14,
- 236, 247, 9, 14, 236, 246, 9, 14, 236, 245, 9, 14, 236, 244, 9, 14, 236,
- 243, 9, 14, 236, 242, 9, 14, 236, 241, 9, 14, 236, 240, 9, 14, 236, 239,
- 9, 14, 236, 238, 9, 14, 236, 237, 9, 14, 236, 236, 9, 14, 236, 235, 9,
- 14, 236, 234, 9, 14, 236, 233, 9, 14, 236, 232, 9, 14, 236, 231, 9, 14,
- 236, 230, 9, 14, 236, 229, 9, 14, 236, 228, 9, 14, 236, 227, 9, 14, 236,
- 226, 9, 14, 236, 225, 9, 14, 236, 224, 9, 14, 236, 223, 9, 14, 236, 222,
- 9, 14, 236, 221, 9, 14, 236, 220, 9, 14, 236, 219, 9, 14, 236, 218, 9,
- 14, 236, 217, 9, 14, 236, 216, 9, 14, 236, 215, 9, 14, 236, 214, 9, 14,
- 236, 213, 9, 14, 236, 212, 9, 14, 236, 211, 9, 14, 236, 210, 9, 14, 236,
- 209, 9, 14, 236, 208, 9, 14, 236, 207, 9, 14, 236, 206, 9, 14, 236, 205,
- 9, 14, 236, 204, 9, 14, 236, 203, 9, 14, 236, 202, 9, 14, 236, 201, 9,
- 14, 236, 200, 9, 14, 236, 199, 9, 14, 236, 198, 9, 14, 236, 197, 9, 14,
- 236, 196, 9, 14, 236, 195, 9, 14, 236, 194, 9, 14, 236, 193, 9, 14, 236,
- 192, 9, 14, 236, 191, 9, 14, 236, 190, 9, 14, 236, 189, 9, 14, 236, 188,
- 9, 14, 236, 187, 9, 14, 236, 186, 9, 14, 236, 185, 9, 14, 236, 184, 9,
- 14, 236, 183, 9, 14, 236, 182, 9, 14, 236, 181, 9, 14, 236, 180, 9, 14,
- 236, 179, 9, 14, 236, 178, 9, 14, 236, 177, 9, 14, 236, 176, 9, 14, 236,
- 175, 9, 14, 236, 174, 9, 14, 236, 173, 9, 14, 236, 172, 9, 14, 236, 171,
- 9, 14, 236, 170, 9, 14, 236, 169, 9, 14, 236, 168, 9, 14, 236, 167, 9,
- 14, 236, 166, 9, 14, 236, 165, 9, 14, 236, 164, 9, 14, 236, 163, 9, 14,
- 236, 162, 9, 14, 236, 161, 9, 14, 236, 160, 9, 14, 236, 159, 9, 14, 236,
- 158, 9, 14, 236, 157, 9, 14, 236, 156, 9, 14, 236, 155, 9, 14, 236, 154,
- 9, 14, 236, 153, 9, 14, 236, 152, 9, 14, 236, 151, 9, 14, 236, 150, 9,
- 14, 236, 149, 9, 14, 236, 148, 9, 14, 236, 147, 9, 14, 236, 146, 9, 14,
- 236, 145, 9, 14, 236, 144, 9, 14, 236, 143, 9, 14, 236, 142, 9, 14, 236,
- 141, 9, 14, 236, 140, 9, 14, 236, 139, 9, 14, 236, 138, 9, 14, 236, 137,
- 9, 14, 236, 136, 9, 14, 236, 135, 9, 14, 236, 134, 9, 14, 236, 133, 9,
- 14, 236, 132, 9, 14, 236, 131, 9, 14, 236, 130, 9, 14, 236, 129, 9, 14,
- 236, 128, 9, 14, 236, 127, 9, 14, 236, 126, 9, 14, 236, 125, 9, 14, 236,
- 124, 9, 14, 236, 123, 9, 14, 236, 122, 9, 14, 236, 121, 9, 14, 236, 120,
- 9, 14, 236, 119, 9, 14, 236, 118, 9, 14, 236, 117, 9, 14, 236, 116, 9,
- 14, 236, 115, 9, 14, 236, 114, 9, 14, 236, 113, 9, 14, 236, 112, 9, 14,
- 236, 111, 9, 14, 236, 110, 9, 14, 236, 109, 9, 14, 236, 108, 9, 14, 236,
- 107, 9, 14, 236, 106, 9, 14, 236, 105, 9, 14, 236, 104, 9, 14, 236, 103,
- 9, 14, 236, 102, 9, 14, 236, 101, 9, 14, 236, 100, 9, 14, 236, 99, 9, 14,
- 236, 98, 9, 14, 236, 97, 9, 14, 236, 96, 9, 14, 236, 95, 9, 14, 236, 94,
- 9, 14, 236, 93, 9, 14, 236, 92, 9, 14, 236, 91, 9, 14, 236, 90, 9, 14,
- 236, 89, 9, 14, 236, 88, 9, 14, 236, 87, 9, 14, 236, 86, 9, 14, 236, 85,
- 9, 14, 236, 84, 9, 14, 236, 83, 9, 14, 236, 82, 9, 14, 236, 81, 9, 14,
- 236, 80, 9, 14, 236, 79, 9, 14, 236, 78, 9, 14, 236, 77, 9, 14, 236, 76,
- 9, 14, 236, 75, 9, 14, 236, 74, 9, 14, 236, 73, 9, 14, 236, 72, 9, 14,
- 236, 71, 9, 14, 236, 70, 9, 14, 236, 69, 9, 14, 236, 68, 9, 14, 236, 67,
- 9, 14, 236, 66, 9, 14, 236, 65, 7, 4, 27, 244, 125, 7, 4, 27, 244, 121,
- 7, 4, 27, 244, 76, 7, 4, 27, 244, 124, 7, 4, 27, 244, 123, 7, 4, 27, 199,
- 222, 92, 217, 152, 7, 4, 27, 218, 168, 150, 4, 27, 231, 59, 228, 39, 150,
- 4, 27, 231, 59, 245, 213, 150, 4, 27, 231, 59, 235, 227, 150, 4, 27, 213,
- 180, 228, 39, 150, 4, 27, 231, 59, 211, 160, 94, 1, 210, 234, 2, 241,
- 158, 94, 225, 11, 235, 50, 214, 11, 94, 27, 211, 6, 210, 234, 210, 234,
- 225, 239, 94, 1, 254, 139, 253, 162, 94, 1, 211, 247, 254, 170, 94, 1,
- 211, 247, 248, 189, 94, 1, 211, 247, 241, 238, 94, 1, 211, 247, 234, 250,
- 94, 1, 211, 247, 233, 94, 94, 1, 211, 247, 40, 231, 65, 94, 1, 211, 247,
- 223, 67, 94, 1, 211, 247, 217, 38, 94, 1, 254, 139, 96, 50, 94, 1, 220,
- 21, 2, 220, 21, 247, 120, 94, 1, 220, 21, 2, 219, 159, 247, 120, 94, 1,
- 220, 21, 2, 248, 208, 22, 220, 21, 247, 120, 94, 1, 220, 21, 2, 248, 208,
- 22, 219, 159, 247, 120, 94, 1, 112, 2, 225, 239, 94, 1, 112, 2, 224, 76,
- 94, 1, 112, 2, 231, 171, 94, 1, 252, 29, 2, 248, 207, 94, 1, 242, 202, 2,
- 248, 207, 94, 1, 248, 190, 2, 248, 207, 94, 1, 241, 239, 2, 231, 171, 94,
- 1, 214, 4, 2, 248, 207, 94, 1, 210, 98, 2, 248, 207, 94, 1, 216, 231, 2,
- 248, 207, 94, 1, 210, 234, 2, 248, 207, 94, 1, 40, 234, 251, 2, 248, 207,
- 94, 1, 234, 251, 2, 248, 207, 94, 1, 233, 95, 2, 248, 207, 94, 1, 231,
- 66, 2, 248, 207, 94, 1, 227, 195, 2, 248, 207, 94, 1, 221, 250, 2, 248,
- 207, 94, 1, 40, 225, 222, 2, 248, 207, 94, 1, 225, 222, 2, 248, 207, 94,
- 1, 215, 180, 2, 248, 207, 94, 1, 224, 40, 2, 248, 207, 94, 1, 223, 68, 2,
- 248, 207, 94, 1, 220, 21, 2, 248, 207, 94, 1, 217, 39, 2, 248, 207, 94,
- 1, 214, 4, 2, 241, 61, 94, 1, 252, 29, 2, 223, 169, 94, 1, 234, 251, 2,
- 223, 169, 94, 1, 225, 222, 2, 223, 169, 94, 27, 112, 233, 94, 10, 1, 112,
- 212, 47, 53, 17, 10, 1, 112, 212, 47, 40, 17, 10, 1, 252, 65, 53, 17, 10,
- 1, 252, 65, 40, 17, 10, 1, 252, 65, 65, 17, 10, 1, 252, 65, 147, 17, 10,
- 1, 225, 206, 53, 17, 10, 1, 225, 206, 40, 17, 10, 1, 225, 206, 65, 17,
- 10, 1, 225, 206, 147, 17, 10, 1, 252, 53, 53, 17, 10, 1, 252, 53, 40, 17,
- 10, 1, 252, 53, 65, 17, 10, 1, 252, 53, 147, 17, 10, 1, 215, 147, 53, 17,
- 10, 1, 215, 147, 40, 17, 10, 1, 215, 147, 65, 17, 10, 1, 215, 147, 147,
- 17, 10, 1, 217, 6, 53, 17, 10, 1, 217, 6, 40, 17, 10, 1, 217, 6, 65, 17,
- 10, 1, 217, 6, 147, 17, 10, 1, 215, 149, 53, 17, 10, 1, 215, 149, 40, 17,
- 10, 1, 215, 149, 65, 17, 10, 1, 215, 149, 147, 17, 10, 1, 213, 249, 53,
+ 143, 210, 206, 24, 143, 245, 55, 24, 143, 245, 53, 24, 143, 245, 54, 24,
+ 143, 245, 51, 24, 143, 240, 145, 24, 143, 240, 144, 24, 143, 240, 142,
+ 24, 143, 240, 143, 24, 143, 240, 148, 24, 143, 240, 141, 24, 143, 240,
+ 140, 24, 143, 240, 150, 24, 143, 254, 34, 24, 143, 254, 33, 24, 90, 228,
+ 220, 24, 90, 228, 226, 24, 90, 218, 205, 24, 90, 218, 204, 24, 90, 216,
+ 97, 24, 90, 216, 95, 24, 90, 216, 94, 24, 90, 216, 100, 24, 90, 216, 101,
+ 24, 90, 216, 93, 24, 90, 223, 6, 24, 90, 223, 21, 24, 90, 218, 211, 24,
+ 90, 223, 18, 24, 90, 223, 8, 24, 90, 223, 10, 24, 90, 222, 253, 24, 90,
+ 222, 254, 24, 90, 234, 219, 24, 90, 230, 213, 24, 90, 230, 207, 24, 90,
+ 218, 215, 24, 90, 230, 210, 24, 90, 230, 216, 24, 90, 225, 77, 24, 90,
+ 225, 86, 24, 90, 225, 90, 24, 90, 218, 213, 24, 90, 225, 80, 24, 90, 225,
+ 94, 24, 90, 225, 95, 24, 90, 219, 141, 24, 90, 219, 144, 24, 90, 218,
+ 209, 24, 90, 218, 207, 24, 90, 219, 139, 24, 90, 219, 147, 24, 90, 219,
+ 148, 24, 90, 219, 133, 24, 90, 219, 146, 24, 90, 226, 31, 24, 90, 226,
+ 32, 24, 90, 211, 24, 24, 90, 211, 25, 24, 90, 250, 45, 24, 90, 250, 44,
+ 24, 90, 218, 220, 24, 90, 225, 129, 24, 90, 225, 128, 9, 14, 238, 25, 9,
+ 14, 238, 24, 9, 14, 238, 23, 9, 14, 238, 22, 9, 14, 238, 21, 9, 14, 238,
+ 20, 9, 14, 238, 19, 9, 14, 238, 18, 9, 14, 238, 17, 9, 14, 238, 16, 9,
+ 14, 238, 15, 9, 14, 238, 14, 9, 14, 238, 13, 9, 14, 238, 12, 9, 14, 238,
+ 11, 9, 14, 238, 10, 9, 14, 238, 9, 9, 14, 238, 8, 9, 14, 238, 7, 9, 14,
+ 238, 6, 9, 14, 238, 5, 9, 14, 238, 4, 9, 14, 238, 3, 9, 14, 238, 2, 9,
+ 14, 238, 1, 9, 14, 238, 0, 9, 14, 237, 255, 9, 14, 237, 254, 9, 14, 237,
+ 253, 9, 14, 237, 252, 9, 14, 237, 251, 9, 14, 237, 250, 9, 14, 237, 249,
+ 9, 14, 237, 248, 9, 14, 237, 247, 9, 14, 237, 246, 9, 14, 237, 245, 9,
+ 14, 237, 244, 9, 14, 237, 243, 9, 14, 237, 242, 9, 14, 237, 241, 9, 14,
+ 237, 240, 9, 14, 237, 239, 9, 14, 237, 238, 9, 14, 237, 237, 9, 14, 237,
+ 236, 9, 14, 237, 235, 9, 14, 237, 234, 9, 14, 237, 233, 9, 14, 237, 232,
+ 9, 14, 237, 231, 9, 14, 237, 230, 9, 14, 237, 229, 9, 14, 237, 228, 9,
+ 14, 237, 227, 9, 14, 237, 226, 9, 14, 237, 225, 9, 14, 237, 224, 9, 14,
+ 237, 223, 9, 14, 237, 222, 9, 14, 237, 221, 9, 14, 237, 220, 9, 14, 237,
+ 219, 9, 14, 237, 218, 9, 14, 237, 217, 9, 14, 237, 216, 9, 14, 237, 215,
+ 9, 14, 237, 214, 9, 14, 237, 213, 9, 14, 237, 212, 9, 14, 237, 211, 9,
+ 14, 237, 210, 9, 14, 237, 209, 9, 14, 237, 208, 9, 14, 237, 207, 9, 14,
+ 237, 206, 9, 14, 237, 205, 9, 14, 237, 204, 9, 14, 237, 203, 9, 14, 237,
+ 202, 9, 14, 237, 201, 9, 14, 237, 200, 9, 14, 237, 199, 9, 14, 237, 198,
+ 9, 14, 237, 197, 9, 14, 237, 196, 9, 14, 237, 195, 9, 14, 237, 194, 9,
+ 14, 237, 193, 9, 14, 237, 192, 9, 14, 237, 191, 9, 14, 237, 190, 9, 14,
+ 237, 189, 9, 14, 237, 188, 9, 14, 237, 187, 9, 14, 237, 186, 9, 14, 237,
+ 185, 9, 14, 237, 184, 9, 14, 237, 183, 9, 14, 237, 182, 9, 14, 237, 181,
+ 9, 14, 237, 180, 9, 14, 237, 179, 9, 14, 237, 178, 9, 14, 237, 177, 9,
+ 14, 237, 176, 9, 14, 237, 175, 9, 14, 237, 174, 9, 14, 237, 173, 9, 14,
+ 237, 172, 9, 14, 237, 171, 9, 14, 237, 170, 9, 14, 237, 169, 9, 14, 237,
+ 168, 9, 14, 237, 167, 9, 14, 237, 166, 9, 14, 237, 165, 9, 14, 237, 164,
+ 9, 14, 237, 163, 9, 14, 237, 162, 9, 14, 237, 161, 9, 14, 237, 160, 9,
+ 14, 237, 159, 9, 14, 237, 158, 9, 14, 237, 157, 9, 14, 237, 156, 9, 14,
+ 237, 155, 9, 14, 237, 154, 9, 14, 237, 153, 9, 14, 237, 152, 9, 14, 237,
+ 151, 9, 14, 237, 150, 9, 14, 237, 149, 9, 14, 237, 148, 9, 14, 237, 147,
+ 9, 14, 237, 146, 9, 14, 237, 145, 9, 14, 237, 144, 9, 14, 237, 143, 9,
+ 14, 237, 142, 9, 14, 237, 141, 9, 14, 237, 140, 9, 14, 237, 139, 9, 14,
+ 237, 138, 9, 14, 237, 137, 9, 14, 237, 136, 9, 14, 237, 135, 9, 14, 237,
+ 134, 9, 14, 237, 133, 9, 14, 237, 132, 9, 14, 237, 131, 9, 14, 237, 130,
+ 9, 14, 237, 129, 9, 14, 237, 128, 9, 14, 237, 127, 9, 14, 237, 126, 9,
+ 14, 237, 125, 9, 14, 237, 124, 9, 14, 237, 123, 9, 14, 237, 122, 9, 14,
+ 237, 121, 9, 14, 237, 120, 9, 14, 237, 119, 9, 14, 237, 118, 9, 14, 237,
+ 117, 9, 14, 237, 116, 9, 14, 237, 115, 9, 14, 237, 114, 9, 14, 237, 113,
+ 9, 14, 237, 112, 9, 14, 237, 111, 9, 14, 237, 110, 9, 14, 237, 109, 9,
+ 14, 237, 108, 9, 14, 237, 107, 9, 14, 237, 106, 9, 14, 237, 105, 9, 14,
+ 237, 104, 9, 14, 237, 103, 9, 14, 237, 102, 9, 14, 237, 101, 9, 14, 237,
+ 100, 9, 14, 237, 99, 9, 14, 237, 98, 9, 14, 237, 97, 9, 14, 237, 96, 9,
+ 14, 237, 95, 9, 14, 237, 94, 9, 14, 237, 93, 9, 14, 237, 92, 9, 14, 237,
+ 91, 9, 14, 237, 90, 9, 14, 237, 89, 9, 14, 237, 88, 9, 14, 237, 87, 9,
+ 14, 237, 86, 9, 14, 237, 85, 9, 14, 237, 84, 9, 14, 237, 83, 9, 14, 237,
+ 82, 9, 14, 237, 81, 9, 14, 237, 80, 9, 14, 237, 79, 9, 14, 237, 78, 9,
+ 14, 237, 77, 9, 14, 237, 76, 9, 14, 237, 75, 9, 14, 237, 74, 9, 14, 237,
+ 73, 9, 14, 237, 72, 9, 14, 237, 71, 9, 14, 237, 70, 9, 14, 237, 69, 9,
+ 14, 237, 68, 9, 14, 237, 67, 9, 14, 237, 66, 9, 14, 237, 65, 9, 14, 237,
+ 64, 9, 14, 237, 63, 9, 14, 237, 62, 9, 14, 237, 61, 9, 14, 237, 60, 9,
+ 14, 237, 59, 9, 14, 237, 58, 9, 14, 237, 57, 9, 14, 237, 56, 9, 14, 237,
+ 55, 9, 14, 237, 54, 9, 14, 237, 53, 9, 14, 237, 52, 9, 14, 237, 51, 9,
+ 14, 237, 50, 9, 14, 237, 49, 9, 14, 237, 48, 9, 14, 237, 47, 9, 14, 237,
+ 46, 9, 14, 237, 45, 9, 14, 237, 44, 9, 14, 237, 43, 9, 14, 237, 42, 9,
+ 14, 237, 41, 9, 14, 237, 40, 9, 14, 237, 39, 9, 14, 237, 38, 9, 14, 237,
+ 37, 9, 14, 237, 36, 9, 14, 237, 35, 9, 14, 237, 34, 9, 14, 237, 33, 9,
+ 14, 237, 32, 9, 14, 237, 31, 9, 14, 237, 30, 9, 14, 237, 29, 9, 14, 237,
+ 28, 9, 14, 237, 27, 9, 14, 237, 26, 9, 14, 237, 25, 9, 14, 237, 24, 9,
+ 14, 237, 23, 9, 14, 237, 22, 9, 14, 237, 21, 9, 14, 237, 20, 9, 14, 237,
+ 19, 9, 14, 237, 18, 9, 14, 237, 17, 9, 14, 237, 16, 9, 14, 237, 15, 9,
+ 14, 237, 14, 9, 14, 237, 13, 9, 14, 237, 12, 9, 14, 237, 11, 9, 14, 237,
+ 10, 9, 14, 237, 9, 9, 14, 237, 8, 9, 14, 237, 7, 9, 14, 237, 6, 9, 14,
+ 237, 5, 9, 14, 237, 4, 9, 14, 237, 3, 9, 14, 237, 2, 9, 14, 237, 1, 9,
+ 14, 237, 0, 9, 14, 236, 255, 9, 14, 236, 254, 9, 14, 236, 253, 9, 14,
+ 236, 252, 9, 14, 236, 251, 9, 14, 236, 250, 9, 14, 236, 249, 9, 14, 236,
+ 248, 9, 14, 236, 247, 9, 14, 236, 246, 9, 14, 236, 245, 9, 14, 236, 244,
+ 9, 14, 236, 243, 9, 14, 236, 242, 9, 14, 236, 241, 9, 14, 236, 240, 9,
+ 14, 236, 239, 9, 14, 236, 238, 9, 14, 236, 237, 9, 14, 236, 236, 9, 14,
+ 236, 235, 9, 14, 236, 234, 9, 14, 236, 233, 9, 14, 236, 232, 9, 14, 236,
+ 231, 9, 14, 236, 230, 9, 14, 236, 229, 9, 14, 236, 228, 9, 14, 236, 227,
+ 9, 14, 236, 226, 9, 14, 236, 225, 9, 14, 236, 224, 9, 14, 236, 223, 9,
+ 14, 236, 222, 9, 14, 236, 221, 9, 14, 236, 220, 9, 14, 236, 219, 9, 14,
+ 236, 218, 9, 14, 236, 217, 9, 14, 236, 216, 9, 14, 236, 215, 9, 14, 236,
+ 214, 9, 14, 236, 213, 9, 14, 236, 212, 9, 14, 236, 211, 9, 14, 236, 210,
+ 9, 14, 236, 209, 9, 14, 236, 208, 9, 14, 236, 207, 9, 14, 236, 206, 9,
+ 14, 236, 205, 9, 14, 236, 204, 9, 14, 236, 203, 9, 14, 236, 202, 9, 14,
+ 236, 201, 9, 14, 236, 200, 9, 14, 236, 199, 9, 14, 236, 198, 9, 14, 236,
+ 197, 9, 14, 236, 196, 9, 14, 236, 195, 9, 14, 236, 194, 9, 14, 236, 193,
+ 9, 14, 236, 192, 9, 14, 236, 191, 9, 14, 236, 190, 9, 14, 236, 189, 9,
+ 14, 236, 188, 9, 14, 236, 187, 9, 14, 236, 186, 9, 14, 236, 185, 9, 14,
+ 236, 184, 9, 14, 236, 183, 9, 14, 236, 182, 9, 14, 236, 181, 9, 14, 236,
+ 180, 9, 14, 236, 179, 9, 14, 236, 178, 9, 14, 236, 177, 9, 14, 236, 176,
+ 9, 14, 236, 175, 9, 14, 236, 174, 9, 14, 236, 173, 9, 14, 236, 172, 9,
+ 14, 236, 171, 9, 14, 236, 170, 9, 14, 236, 169, 9, 14, 236, 168, 9, 14,
+ 236, 167, 9, 14, 236, 166, 9, 14, 236, 165, 9, 14, 236, 164, 9, 14, 236,
+ 163, 9, 14, 236, 162, 9, 14, 236, 161, 9, 14, 236, 160, 9, 14, 236, 159,
+ 9, 14, 236, 158, 9, 14, 236, 157, 9, 14, 236, 156, 9, 14, 236, 155, 9,
+ 14, 236, 154, 9, 14, 236, 153, 9, 14, 236, 152, 9, 14, 236, 151, 9, 14,
+ 236, 150, 9, 14, 236, 149, 9, 14, 236, 148, 9, 14, 236, 147, 9, 14, 236,
+ 146, 9, 14, 236, 145, 9, 14, 236, 144, 9, 14, 236, 143, 9, 14, 236, 142,
+ 9, 14, 236, 141, 9, 14, 236, 140, 9, 14, 236, 139, 9, 14, 236, 138, 9,
+ 14, 236, 137, 9, 14, 236, 136, 9, 14, 236, 135, 9, 14, 236, 134, 9, 14,
+ 236, 133, 9, 14, 236, 132, 9, 14, 236, 131, 9, 14, 236, 130, 9, 14, 236,
+ 129, 9, 14, 236, 128, 9, 14, 236, 127, 9, 14, 236, 126, 9, 14, 236, 125,
+ 9, 14, 236, 124, 9, 14, 236, 123, 9, 14, 236, 122, 9, 14, 236, 121, 9,
+ 14, 236, 120, 9, 14, 236, 119, 9, 14, 236, 118, 9, 14, 236, 117, 9, 14,
+ 236, 116, 9, 14, 236, 115, 9, 14, 236, 114, 9, 14, 236, 113, 9, 14, 236,
+ 112, 9, 14, 236, 111, 9, 14, 236, 110, 9, 14, 236, 109, 9, 14, 236, 108,
+ 9, 14, 236, 107, 9, 14, 236, 106, 9, 14, 236, 105, 9, 14, 236, 104, 9,
+ 14, 236, 103, 9, 14, 236, 102, 9, 14, 236, 101, 9, 14, 236, 100, 9, 14,
+ 236, 99, 9, 14, 236, 98, 9, 14, 236, 97, 9, 14, 236, 96, 9, 14, 236, 95,
+ 9, 14, 236, 94, 9, 14, 236, 93, 9, 14, 236, 92, 9, 14, 236, 91, 9, 14,
+ 236, 90, 9, 14, 236, 89, 9, 14, 236, 88, 9, 14, 236, 87, 9, 14, 236, 86,
+ 9, 14, 236, 85, 9, 14, 236, 84, 9, 14, 236, 83, 9, 14, 236, 82, 9, 14,
+ 236, 81, 9, 14, 236, 80, 9, 14, 236, 79, 9, 14, 236, 78, 9, 14, 236, 77,
+ 9, 14, 236, 76, 9, 14, 236, 75, 9, 14, 236, 74, 9, 14, 236, 73, 9, 14,
+ 236, 72, 9, 14, 236, 71, 9, 14, 236, 70, 9, 14, 236, 69, 9, 14, 236, 68,
+ 9, 14, 236, 67, 9, 14, 236, 66, 7, 4, 27, 244, 126, 7, 4, 27, 244, 122,
+ 7, 4, 27, 244, 77, 7, 4, 27, 244, 125, 7, 4, 27, 244, 124, 7, 4, 27, 199,
+ 222, 93, 217, 153, 7, 4, 27, 218, 169, 150, 4, 27, 231, 60, 228, 40, 150,
+ 4, 27, 231, 60, 245, 214, 150, 4, 27, 231, 60, 235, 228, 150, 4, 27, 213,
+ 180, 228, 40, 150, 4, 27, 231, 60, 211, 160, 94, 1, 210, 234, 2, 241,
+ 159, 94, 225, 12, 235, 51, 214, 11, 94, 27, 211, 6, 210, 234, 210, 234,
+ 225, 240, 94, 1, 254, 140, 253, 163, 94, 1, 211, 247, 254, 171, 94, 1,
+ 211, 247, 248, 190, 94, 1, 211, 247, 241, 239, 94, 1, 211, 247, 234, 251,
+ 94, 1, 211, 247, 233, 95, 94, 1, 211, 247, 40, 231, 66, 94, 1, 211, 247,
+ 223, 68, 94, 1, 211, 247, 217, 39, 94, 1, 254, 140, 96, 50, 94, 1, 220,
+ 22, 2, 220, 22, 247, 121, 94, 1, 220, 22, 2, 219, 160, 247, 121, 94, 1,
+ 220, 22, 2, 248, 209, 22, 220, 22, 247, 121, 94, 1, 220, 22, 2, 248, 209,
+ 22, 219, 160, 247, 121, 94, 1, 112, 2, 225, 240, 94, 1, 112, 2, 224, 77,
+ 94, 1, 112, 2, 231, 172, 94, 1, 252, 30, 2, 248, 208, 94, 1, 242, 203, 2,
+ 248, 208, 94, 1, 248, 191, 2, 248, 208, 94, 1, 241, 240, 2, 231, 172, 94,
+ 1, 214, 4, 2, 248, 208, 94, 1, 210, 98, 2, 248, 208, 94, 1, 216, 232, 2,
+ 248, 208, 94, 1, 210, 234, 2, 248, 208, 94, 1, 40, 234, 252, 2, 248, 208,
+ 94, 1, 234, 252, 2, 248, 208, 94, 1, 233, 96, 2, 248, 208, 94, 1, 231,
+ 67, 2, 248, 208, 94, 1, 227, 196, 2, 248, 208, 94, 1, 221, 251, 2, 248,
+ 208, 94, 1, 40, 225, 223, 2, 248, 208, 94, 1, 225, 223, 2, 248, 208, 94,
+ 1, 215, 181, 2, 248, 208, 94, 1, 224, 41, 2, 248, 208, 94, 1, 223, 69, 2,
+ 248, 208, 94, 1, 220, 22, 2, 248, 208, 94, 1, 217, 40, 2, 248, 208, 94,
+ 1, 214, 4, 2, 241, 62, 94, 1, 252, 30, 2, 223, 170, 94, 1, 234, 252, 2,
+ 223, 170, 94, 1, 225, 223, 2, 223, 170, 94, 27, 112, 233, 95, 10, 1, 112,
+ 212, 47, 53, 17, 10, 1, 112, 212, 47, 40, 17, 10, 1, 252, 66, 53, 17, 10,
+ 1, 252, 66, 40, 17, 10, 1, 252, 66, 65, 17, 10, 1, 252, 66, 147, 17, 10,
+ 1, 225, 207, 53, 17, 10, 1, 225, 207, 40, 17, 10, 1, 225, 207, 65, 17,
+ 10, 1, 225, 207, 147, 17, 10, 1, 252, 54, 53, 17, 10, 1, 252, 54, 40, 17,
+ 10, 1, 252, 54, 65, 17, 10, 1, 252, 54, 147, 17, 10, 1, 215, 148, 53, 17,
+ 10, 1, 215, 148, 40, 17, 10, 1, 215, 148, 65, 17, 10, 1, 215, 148, 147,
+ 17, 10, 1, 217, 7, 53, 17, 10, 1, 217, 7, 40, 17, 10, 1, 217, 7, 65, 17,
+ 10, 1, 217, 7, 147, 17, 10, 1, 215, 150, 53, 17, 10, 1, 215, 150, 40, 17,
+ 10, 1, 215, 150, 65, 17, 10, 1, 215, 150, 147, 17, 10, 1, 213, 249, 53,
17, 10, 1, 213, 249, 40, 17, 10, 1, 213, 249, 65, 17, 10, 1, 213, 249,
- 147, 17, 10, 1, 225, 204, 53, 17, 10, 1, 225, 204, 40, 17, 10, 1, 225,
- 204, 65, 17, 10, 1, 225, 204, 147, 17, 10, 1, 246, 44, 53, 17, 10, 1,
- 246, 44, 40, 17, 10, 1, 246, 44, 65, 17, 10, 1, 246, 44, 147, 17, 10, 1,
- 227, 154, 53, 17, 10, 1, 227, 154, 40, 17, 10, 1, 227, 154, 65, 17, 10,
- 1, 227, 154, 147, 17, 10, 1, 217, 27, 53, 17, 10, 1, 217, 27, 40, 17, 10,
- 1, 217, 27, 65, 17, 10, 1, 217, 27, 147, 17, 10, 1, 217, 25, 53, 17, 10,
- 1, 217, 25, 40, 17, 10, 1, 217, 25, 65, 17, 10, 1, 217, 25, 147, 17, 10,
- 1, 248, 133, 53, 17, 10, 1, 248, 133, 40, 17, 10, 1, 248, 202, 53, 17,
- 10, 1, 248, 202, 40, 17, 10, 1, 246, 71, 53, 17, 10, 1, 246, 71, 40, 17,
- 10, 1, 248, 131, 53, 17, 10, 1, 248, 131, 40, 17, 10, 1, 235, 121, 53,
- 17, 10, 1, 235, 121, 40, 17, 10, 1, 222, 172, 53, 17, 10, 1, 222, 172,
- 40, 17, 10, 1, 234, 175, 53, 17, 10, 1, 234, 175, 40, 17, 10, 1, 234,
- 175, 65, 17, 10, 1, 234, 175, 147, 17, 10, 1, 243, 123, 53, 17, 10, 1,
- 243, 123, 40, 17, 10, 1, 243, 123, 65, 17, 10, 1, 243, 123, 147, 17, 10,
- 1, 242, 102, 53, 17, 10, 1, 242, 102, 40, 17, 10, 1, 242, 102, 65, 17,
- 10, 1, 242, 102, 147, 17, 10, 1, 229, 3, 53, 17, 10, 1, 229, 3, 40, 17,
- 10, 1, 229, 3, 65, 17, 10, 1, 229, 3, 147, 17, 10, 1, 228, 63, 242, 219,
- 53, 17, 10, 1, 228, 63, 242, 219, 40, 17, 10, 1, 222, 215, 53, 17, 10, 1,
- 222, 215, 40, 17, 10, 1, 222, 215, 65, 17, 10, 1, 222, 215, 147, 17, 10,
- 1, 241, 219, 2, 79, 77, 53, 17, 10, 1, 241, 219, 2, 79, 77, 40, 17, 10,
- 1, 241, 219, 242, 172, 53, 17, 10, 1, 241, 219, 242, 172, 40, 17, 10, 1,
- 241, 219, 242, 172, 65, 17, 10, 1, 241, 219, 242, 172, 147, 17, 10, 1,
- 241, 219, 247, 142, 53, 17, 10, 1, 241, 219, 247, 142, 40, 17, 10, 1,
- 241, 219, 247, 142, 65, 17, 10, 1, 241, 219, 247, 142, 147, 17, 10, 1,
- 79, 252, 133, 53, 17, 10, 1, 79, 252, 133, 40, 17, 10, 1, 79, 252, 133,
- 2, 202, 77, 53, 17, 10, 1, 79, 252, 133, 2, 202, 77, 40, 17, 10, 16, 59,
+ 147, 17, 10, 1, 225, 205, 53, 17, 10, 1, 225, 205, 40, 17, 10, 1, 225,
+ 205, 65, 17, 10, 1, 225, 205, 147, 17, 10, 1, 246, 45, 53, 17, 10, 1,
+ 246, 45, 40, 17, 10, 1, 246, 45, 65, 17, 10, 1, 246, 45, 147, 17, 10, 1,
+ 227, 155, 53, 17, 10, 1, 227, 155, 40, 17, 10, 1, 227, 155, 65, 17, 10,
+ 1, 227, 155, 147, 17, 10, 1, 217, 28, 53, 17, 10, 1, 217, 28, 40, 17, 10,
+ 1, 217, 28, 65, 17, 10, 1, 217, 28, 147, 17, 10, 1, 217, 26, 53, 17, 10,
+ 1, 217, 26, 40, 17, 10, 1, 217, 26, 65, 17, 10, 1, 217, 26, 147, 17, 10,
+ 1, 248, 134, 53, 17, 10, 1, 248, 134, 40, 17, 10, 1, 248, 203, 53, 17,
+ 10, 1, 248, 203, 40, 17, 10, 1, 246, 72, 53, 17, 10, 1, 246, 72, 40, 17,
+ 10, 1, 248, 132, 53, 17, 10, 1, 248, 132, 40, 17, 10, 1, 235, 122, 53,
+ 17, 10, 1, 235, 122, 40, 17, 10, 1, 222, 173, 53, 17, 10, 1, 222, 173,
+ 40, 17, 10, 1, 234, 176, 53, 17, 10, 1, 234, 176, 40, 17, 10, 1, 234,
+ 176, 65, 17, 10, 1, 234, 176, 147, 17, 10, 1, 243, 124, 53, 17, 10, 1,
+ 243, 124, 40, 17, 10, 1, 243, 124, 65, 17, 10, 1, 243, 124, 147, 17, 10,
+ 1, 242, 103, 53, 17, 10, 1, 242, 103, 40, 17, 10, 1, 242, 103, 65, 17,
+ 10, 1, 242, 103, 147, 17, 10, 1, 229, 4, 53, 17, 10, 1, 229, 4, 40, 17,
+ 10, 1, 229, 4, 65, 17, 10, 1, 229, 4, 147, 17, 10, 1, 228, 64, 242, 220,
+ 53, 17, 10, 1, 228, 64, 242, 220, 40, 17, 10, 1, 222, 216, 53, 17, 10, 1,
+ 222, 216, 40, 17, 10, 1, 222, 216, 65, 17, 10, 1, 222, 216, 147, 17, 10,
+ 1, 241, 220, 2, 79, 77, 53, 17, 10, 1, 241, 220, 2, 79, 77, 40, 17, 10,
+ 1, 241, 220, 242, 173, 53, 17, 10, 1, 241, 220, 242, 173, 40, 17, 10, 1,
+ 241, 220, 242, 173, 65, 17, 10, 1, 241, 220, 242, 173, 147, 17, 10, 1,
+ 241, 220, 247, 143, 53, 17, 10, 1, 241, 220, 247, 143, 40, 17, 10, 1,
+ 241, 220, 247, 143, 65, 17, 10, 1, 241, 220, 247, 143, 147, 17, 10, 1,
+ 79, 252, 134, 53, 17, 10, 1, 79, 252, 134, 40, 17, 10, 1, 79, 252, 134,
+ 2, 202, 77, 53, 17, 10, 1, 79, 252, 134, 2, 202, 77, 40, 17, 10, 16, 59,
48, 10, 16, 59, 51, 10, 16, 113, 170, 48, 10, 16, 113, 170, 51, 10, 16,
- 134, 170, 48, 10, 16, 134, 170, 51, 10, 16, 134, 170, 225, 7, 246, 104,
- 48, 10, 16, 134, 170, 225, 7, 246, 104, 51, 10, 16, 244, 11, 170, 48, 10,
- 16, 244, 11, 170, 51, 10, 16, 52, 67, 252, 141, 51, 10, 16, 113, 170,
- 213, 189, 48, 10, 16, 113, 170, 213, 189, 51, 10, 16, 222, 233, 10, 16,
- 4, 217, 81, 48, 10, 16, 4, 217, 81, 51, 10, 1, 229, 80, 53, 17, 10, 1,
- 229, 80, 40, 17, 10, 1, 229, 80, 65, 17, 10, 1, 229, 80, 147, 17, 10, 1,
- 104, 53, 17, 10, 1, 104, 40, 17, 10, 1, 226, 235, 53, 17, 10, 1, 226,
- 235, 40, 17, 10, 1, 210, 213, 53, 17, 10, 1, 210, 213, 40, 17, 10, 1,
+ 134, 170, 48, 10, 16, 134, 170, 51, 10, 16, 134, 170, 225, 8, 246, 105,
+ 48, 10, 16, 134, 170, 225, 8, 246, 105, 51, 10, 16, 244, 12, 170, 48, 10,
+ 16, 244, 12, 170, 51, 10, 16, 52, 67, 252, 142, 51, 10, 16, 113, 170,
+ 213, 189, 48, 10, 16, 113, 170, 213, 189, 51, 10, 16, 222, 234, 10, 16,
+ 4, 217, 82, 48, 10, 16, 4, 217, 82, 51, 10, 1, 229, 81, 53, 17, 10, 1,
+ 229, 81, 40, 17, 10, 1, 229, 81, 65, 17, 10, 1, 229, 81, 147, 17, 10, 1,
+ 104, 53, 17, 10, 1, 104, 40, 17, 10, 1, 226, 236, 53, 17, 10, 1, 226,
+ 236, 40, 17, 10, 1, 210, 213, 53, 17, 10, 1, 210, 213, 40, 17, 10, 1,
104, 2, 202, 77, 53, 17, 10, 1, 214, 0, 53, 17, 10, 1, 214, 0, 40, 17,
- 10, 1, 234, 73, 226, 235, 53, 17, 10, 1, 234, 73, 226, 235, 40, 17, 10,
- 1, 234, 73, 210, 213, 53, 17, 10, 1, 234, 73, 210, 213, 40, 17, 10, 1,
+ 10, 1, 234, 74, 226, 236, 53, 17, 10, 1, 234, 74, 226, 236, 40, 17, 10,
+ 1, 234, 74, 210, 213, 53, 17, 10, 1, 234, 74, 210, 213, 40, 17, 10, 1,
160, 53, 17, 10, 1, 160, 40, 17, 10, 1, 160, 65, 17, 10, 1, 160, 147, 17,
- 10, 1, 214, 207, 234, 186, 234, 73, 112, 231, 193, 65, 17, 10, 1, 214,
- 207, 234, 186, 234, 73, 112, 231, 193, 147, 17, 10, 27, 79, 2, 202, 77,
+ 10, 1, 214, 207, 234, 187, 234, 74, 112, 231, 194, 65, 17, 10, 1, 214,
+ 207, 234, 187, 234, 74, 112, 231, 194, 147, 17, 10, 27, 79, 2, 202, 77,
2, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 112, 40, 17, 10, 27, 79, 2,
- 202, 77, 2, 254, 244, 53, 17, 10, 27, 79, 2, 202, 77, 2, 254, 244, 40,
+ 202, 77, 2, 254, 245, 53, 17, 10, 27, 79, 2, 202, 77, 2, 254, 245, 40,
17, 10, 27, 79, 2, 202, 77, 2, 212, 31, 53, 17, 10, 27, 79, 2, 202, 77,
2, 212, 31, 40, 17, 10, 27, 79, 2, 202, 77, 2, 104, 53, 17, 10, 27, 79,
- 2, 202, 77, 2, 104, 40, 17, 10, 27, 79, 2, 202, 77, 2, 226, 235, 53, 17,
- 10, 27, 79, 2, 202, 77, 2, 226, 235, 40, 17, 10, 27, 79, 2, 202, 77, 2,
+ 2, 202, 77, 2, 104, 40, 17, 10, 27, 79, 2, 202, 77, 2, 226, 236, 53, 17,
+ 10, 27, 79, 2, 202, 77, 2, 226, 236, 40, 17, 10, 27, 79, 2, 202, 77, 2,
210, 213, 53, 17, 10, 27, 79, 2, 202, 77, 2, 210, 213, 40, 17, 10, 27,
79, 2, 202, 77, 2, 160, 53, 17, 10, 27, 79, 2, 202, 77, 2, 160, 40, 17,
- 10, 27, 79, 2, 202, 77, 2, 160, 65, 17, 10, 27, 214, 207, 234, 73, 79, 2,
- 202, 77, 2, 112, 231, 193, 53, 17, 10, 27, 214, 207, 234, 73, 79, 2, 202,
- 77, 2, 112, 231, 193, 40, 17, 10, 27, 214, 207, 234, 73, 79, 2, 202, 77,
- 2, 112, 231, 193, 65, 17, 10, 1, 244, 168, 79, 53, 17, 10, 1, 244, 168,
- 79, 40, 17, 10, 1, 244, 168, 79, 65, 17, 10, 1, 244, 168, 79, 147, 17,
+ 10, 27, 79, 2, 202, 77, 2, 160, 65, 17, 10, 27, 214, 207, 234, 74, 79, 2,
+ 202, 77, 2, 112, 231, 194, 53, 17, 10, 27, 214, 207, 234, 74, 79, 2, 202,
+ 77, 2, 112, 231, 194, 40, 17, 10, 27, 214, 207, 234, 74, 79, 2, 202, 77,
+ 2, 112, 231, 194, 65, 17, 10, 1, 244, 169, 79, 53, 17, 10, 1, 244, 169,
+ 79, 40, 17, 10, 1, 244, 169, 79, 65, 17, 10, 1, 244, 169, 79, 147, 17,
10, 27, 79, 2, 202, 77, 2, 151, 53, 17, 10, 27, 79, 2, 202, 77, 2, 122,
53, 17, 10, 27, 79, 2, 202, 77, 2, 66, 53, 17, 10, 27, 79, 2, 202, 77, 2,
- 112, 231, 193, 53, 17, 10, 27, 79, 2, 202, 77, 2, 79, 53, 17, 10, 27,
- 252, 55, 2, 151, 53, 17, 10, 27, 252, 55, 2, 122, 53, 17, 10, 27, 252,
- 55, 2, 234, 130, 53, 17, 10, 27, 252, 55, 2, 66, 53, 17, 10, 27, 252, 55,
- 2, 112, 231, 193, 53, 17, 10, 27, 252, 55, 2, 79, 53, 17, 10, 27, 217, 8,
- 2, 151, 53, 17, 10, 27, 217, 8, 2, 122, 53, 17, 10, 27, 217, 8, 2, 234,
- 130, 53, 17, 10, 27, 217, 8, 2, 66, 53, 17, 10, 27, 217, 8, 2, 112, 231,
- 193, 53, 17, 10, 27, 217, 8, 2, 79, 53, 17, 10, 27, 216, 193, 2, 151, 53,
- 17, 10, 27, 216, 193, 2, 66, 53, 17, 10, 27, 216, 193, 2, 112, 231, 193,
- 53, 17, 10, 27, 216, 193, 2, 79, 53, 17, 10, 27, 151, 2, 122, 53, 17, 10,
+ 112, 231, 194, 53, 17, 10, 27, 79, 2, 202, 77, 2, 79, 53, 17, 10, 27,
+ 252, 56, 2, 151, 53, 17, 10, 27, 252, 56, 2, 122, 53, 17, 10, 27, 252,
+ 56, 2, 234, 131, 53, 17, 10, 27, 252, 56, 2, 66, 53, 17, 10, 27, 252, 56,
+ 2, 112, 231, 194, 53, 17, 10, 27, 252, 56, 2, 79, 53, 17, 10, 27, 217, 9,
+ 2, 151, 53, 17, 10, 27, 217, 9, 2, 122, 53, 17, 10, 27, 217, 9, 2, 234,
+ 131, 53, 17, 10, 27, 217, 9, 2, 66, 53, 17, 10, 27, 217, 9, 2, 112, 231,
+ 194, 53, 17, 10, 27, 217, 9, 2, 79, 53, 17, 10, 27, 216, 194, 2, 151, 53,
+ 17, 10, 27, 216, 194, 2, 66, 53, 17, 10, 27, 216, 194, 2, 112, 231, 194,
+ 53, 17, 10, 27, 216, 194, 2, 79, 53, 17, 10, 27, 151, 2, 122, 53, 17, 10,
27, 151, 2, 66, 53, 17, 10, 27, 122, 2, 151, 53, 17, 10, 27, 122, 2, 66,
- 53, 17, 10, 27, 234, 130, 2, 151, 53, 17, 10, 27, 234, 130, 2, 122, 53,
- 17, 10, 27, 234, 130, 2, 66, 53, 17, 10, 27, 221, 167, 2, 151, 53, 17,
- 10, 27, 221, 167, 2, 122, 53, 17, 10, 27, 221, 167, 2, 234, 130, 53, 17,
- 10, 27, 221, 167, 2, 66, 53, 17, 10, 27, 222, 27, 2, 122, 53, 17, 10, 27,
- 222, 27, 2, 66, 53, 17, 10, 27, 248, 217, 2, 151, 53, 17, 10, 27, 248,
- 217, 2, 122, 53, 17, 10, 27, 248, 217, 2, 234, 130, 53, 17, 10, 27, 248,
- 217, 2, 66, 53, 17, 10, 27, 217, 81, 2, 122, 53, 17, 10, 27, 217, 81, 2,
- 66, 53, 17, 10, 27, 210, 112, 2, 66, 53, 17, 10, 27, 254, 197, 2, 151,
- 53, 17, 10, 27, 254, 197, 2, 66, 53, 17, 10, 27, 242, 245, 2, 151, 53,
- 17, 10, 27, 242, 245, 2, 66, 53, 17, 10, 27, 244, 143, 2, 151, 53, 17,
- 10, 27, 244, 143, 2, 122, 53, 17, 10, 27, 244, 143, 2, 234, 130, 53, 17,
- 10, 27, 244, 143, 2, 66, 53, 17, 10, 27, 244, 143, 2, 112, 231, 193, 53,
- 17, 10, 27, 244, 143, 2, 79, 53, 17, 10, 27, 224, 82, 2, 122, 53, 17, 10,
- 27, 224, 82, 2, 66, 53, 17, 10, 27, 224, 82, 2, 112, 231, 193, 53, 17,
- 10, 27, 224, 82, 2, 79, 53, 17, 10, 27, 234, 251, 2, 112, 53, 17, 10, 27,
- 234, 251, 2, 151, 53, 17, 10, 27, 234, 251, 2, 122, 53, 17, 10, 27, 234,
- 251, 2, 234, 130, 53, 17, 10, 27, 234, 251, 2, 233, 103, 53, 17, 10, 27,
- 234, 251, 2, 66, 53, 17, 10, 27, 234, 251, 2, 112, 231, 193, 53, 17, 10,
- 27, 234, 251, 2, 79, 53, 17, 10, 27, 233, 103, 2, 151, 53, 17, 10, 27,
- 233, 103, 2, 122, 53, 17, 10, 27, 233, 103, 2, 234, 130, 53, 17, 10, 27,
- 233, 103, 2, 66, 53, 17, 10, 27, 233, 103, 2, 112, 231, 193, 53, 17, 10,
- 27, 233, 103, 2, 79, 53, 17, 10, 27, 66, 2, 151, 53, 17, 10, 27, 66, 2,
- 122, 53, 17, 10, 27, 66, 2, 234, 130, 53, 17, 10, 27, 66, 2, 66, 53, 17,
- 10, 27, 66, 2, 112, 231, 193, 53, 17, 10, 27, 66, 2, 79, 53, 17, 10, 27,
- 228, 63, 2, 151, 53, 17, 10, 27, 228, 63, 2, 122, 53, 17, 10, 27, 228,
- 63, 2, 234, 130, 53, 17, 10, 27, 228, 63, 2, 66, 53, 17, 10, 27, 228, 63,
- 2, 112, 231, 193, 53, 17, 10, 27, 228, 63, 2, 79, 53, 17, 10, 27, 241,
- 219, 2, 151, 53, 17, 10, 27, 241, 219, 2, 66, 53, 17, 10, 27, 241, 219,
- 2, 112, 231, 193, 53, 17, 10, 27, 241, 219, 2, 79, 53, 17, 10, 27, 79, 2,
- 151, 53, 17, 10, 27, 79, 2, 122, 53, 17, 10, 27, 79, 2, 234, 130, 53, 17,
- 10, 27, 79, 2, 66, 53, 17, 10, 27, 79, 2, 112, 231, 193, 53, 17, 10, 27,
- 79, 2, 79, 53, 17, 10, 27, 216, 203, 2, 218, 23, 112, 53, 17, 10, 27,
- 223, 96, 2, 218, 23, 112, 53, 17, 10, 27, 112, 231, 193, 2, 218, 23, 112,
- 53, 17, 10, 27, 220, 94, 2, 248, 183, 53, 17, 10, 27, 220, 94, 2, 234,
- 204, 53, 17, 10, 27, 220, 94, 2, 244, 166, 53, 17, 10, 27, 220, 94, 2,
- 248, 185, 53, 17, 10, 27, 220, 94, 2, 234, 206, 53, 17, 10, 27, 220, 94,
- 2, 218, 23, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 223, 96, 40, 17, 10,
+ 53, 17, 10, 27, 234, 131, 2, 151, 53, 17, 10, 27, 234, 131, 2, 122, 53,
+ 17, 10, 27, 234, 131, 2, 66, 53, 17, 10, 27, 221, 168, 2, 151, 53, 17,
+ 10, 27, 221, 168, 2, 122, 53, 17, 10, 27, 221, 168, 2, 234, 131, 53, 17,
+ 10, 27, 221, 168, 2, 66, 53, 17, 10, 27, 222, 28, 2, 122, 53, 17, 10, 27,
+ 222, 28, 2, 66, 53, 17, 10, 27, 248, 218, 2, 151, 53, 17, 10, 27, 248,
+ 218, 2, 122, 53, 17, 10, 27, 248, 218, 2, 234, 131, 53, 17, 10, 27, 248,
+ 218, 2, 66, 53, 17, 10, 27, 217, 82, 2, 122, 53, 17, 10, 27, 217, 82, 2,
+ 66, 53, 17, 10, 27, 210, 112, 2, 66, 53, 17, 10, 27, 254, 198, 2, 151,
+ 53, 17, 10, 27, 254, 198, 2, 66, 53, 17, 10, 27, 242, 246, 2, 151, 53,
+ 17, 10, 27, 242, 246, 2, 66, 53, 17, 10, 27, 244, 144, 2, 151, 53, 17,
+ 10, 27, 244, 144, 2, 122, 53, 17, 10, 27, 244, 144, 2, 234, 131, 53, 17,
+ 10, 27, 244, 144, 2, 66, 53, 17, 10, 27, 244, 144, 2, 112, 231, 194, 53,
+ 17, 10, 27, 244, 144, 2, 79, 53, 17, 10, 27, 224, 83, 2, 122, 53, 17, 10,
+ 27, 224, 83, 2, 66, 53, 17, 10, 27, 224, 83, 2, 112, 231, 194, 53, 17,
+ 10, 27, 224, 83, 2, 79, 53, 17, 10, 27, 234, 252, 2, 112, 53, 17, 10, 27,
+ 234, 252, 2, 151, 53, 17, 10, 27, 234, 252, 2, 122, 53, 17, 10, 27, 234,
+ 252, 2, 234, 131, 53, 17, 10, 27, 234, 252, 2, 233, 104, 53, 17, 10, 27,
+ 234, 252, 2, 66, 53, 17, 10, 27, 234, 252, 2, 112, 231, 194, 53, 17, 10,
+ 27, 234, 252, 2, 79, 53, 17, 10, 27, 233, 104, 2, 151, 53, 17, 10, 27,
+ 233, 104, 2, 122, 53, 17, 10, 27, 233, 104, 2, 234, 131, 53, 17, 10, 27,
+ 233, 104, 2, 66, 53, 17, 10, 27, 233, 104, 2, 112, 231, 194, 53, 17, 10,
+ 27, 233, 104, 2, 79, 53, 17, 10, 27, 66, 2, 151, 53, 17, 10, 27, 66, 2,
+ 122, 53, 17, 10, 27, 66, 2, 234, 131, 53, 17, 10, 27, 66, 2, 66, 53, 17,
+ 10, 27, 66, 2, 112, 231, 194, 53, 17, 10, 27, 66, 2, 79, 53, 17, 10, 27,
+ 228, 64, 2, 151, 53, 17, 10, 27, 228, 64, 2, 122, 53, 17, 10, 27, 228,
+ 64, 2, 234, 131, 53, 17, 10, 27, 228, 64, 2, 66, 53, 17, 10, 27, 228, 64,
+ 2, 112, 231, 194, 53, 17, 10, 27, 228, 64, 2, 79, 53, 17, 10, 27, 241,
+ 220, 2, 151, 53, 17, 10, 27, 241, 220, 2, 66, 53, 17, 10, 27, 241, 220,
+ 2, 112, 231, 194, 53, 17, 10, 27, 241, 220, 2, 79, 53, 17, 10, 27, 79, 2,
+ 151, 53, 17, 10, 27, 79, 2, 122, 53, 17, 10, 27, 79, 2, 234, 131, 53, 17,
+ 10, 27, 79, 2, 66, 53, 17, 10, 27, 79, 2, 112, 231, 194, 53, 17, 10, 27,
+ 79, 2, 79, 53, 17, 10, 27, 216, 204, 2, 218, 24, 112, 53, 17, 10, 27,
+ 223, 97, 2, 218, 24, 112, 53, 17, 10, 27, 112, 231, 194, 2, 218, 24, 112,
+ 53, 17, 10, 27, 220, 95, 2, 248, 184, 53, 17, 10, 27, 220, 95, 2, 234,
+ 205, 53, 17, 10, 27, 220, 95, 2, 244, 167, 53, 17, 10, 27, 220, 95, 2,
+ 248, 186, 53, 17, 10, 27, 220, 95, 2, 234, 207, 53, 17, 10, 27, 220, 95,
+ 2, 218, 24, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 223, 97, 40, 17, 10,
27, 79, 2, 202, 77, 2, 210, 109, 40, 17, 10, 27, 79, 2, 202, 77, 2, 66,
- 40, 17, 10, 27, 79, 2, 202, 77, 2, 228, 63, 40, 17, 10, 27, 79, 2, 202,
- 77, 2, 112, 231, 193, 40, 17, 10, 27, 79, 2, 202, 77, 2, 79, 40, 17, 10,
- 27, 252, 55, 2, 223, 96, 40, 17, 10, 27, 252, 55, 2, 210, 109, 40, 17,
- 10, 27, 252, 55, 2, 66, 40, 17, 10, 27, 252, 55, 2, 228, 63, 40, 17, 10,
- 27, 252, 55, 2, 112, 231, 193, 40, 17, 10, 27, 252, 55, 2, 79, 40, 17,
- 10, 27, 217, 8, 2, 223, 96, 40, 17, 10, 27, 217, 8, 2, 210, 109, 40, 17,
- 10, 27, 217, 8, 2, 66, 40, 17, 10, 27, 217, 8, 2, 228, 63, 40, 17, 10,
- 27, 217, 8, 2, 112, 231, 193, 40, 17, 10, 27, 217, 8, 2, 79, 40, 17, 10,
- 27, 216, 193, 2, 223, 96, 40, 17, 10, 27, 216, 193, 2, 210, 109, 40, 17,
- 10, 27, 216, 193, 2, 66, 40, 17, 10, 27, 216, 193, 2, 228, 63, 40, 17,
- 10, 27, 216, 193, 2, 112, 231, 193, 40, 17, 10, 27, 216, 193, 2, 79, 40,
- 17, 10, 27, 244, 143, 2, 112, 231, 193, 40, 17, 10, 27, 244, 143, 2, 79,
- 40, 17, 10, 27, 224, 82, 2, 112, 231, 193, 40, 17, 10, 27, 224, 82, 2,
- 79, 40, 17, 10, 27, 234, 251, 2, 112, 40, 17, 10, 27, 234, 251, 2, 233,
- 103, 40, 17, 10, 27, 234, 251, 2, 66, 40, 17, 10, 27, 234, 251, 2, 112,
- 231, 193, 40, 17, 10, 27, 234, 251, 2, 79, 40, 17, 10, 27, 233, 103, 2,
- 66, 40, 17, 10, 27, 233, 103, 2, 112, 231, 193, 40, 17, 10, 27, 233, 103,
+ 40, 17, 10, 27, 79, 2, 202, 77, 2, 228, 64, 40, 17, 10, 27, 79, 2, 202,
+ 77, 2, 112, 231, 194, 40, 17, 10, 27, 79, 2, 202, 77, 2, 79, 40, 17, 10,
+ 27, 252, 56, 2, 223, 97, 40, 17, 10, 27, 252, 56, 2, 210, 109, 40, 17,
+ 10, 27, 252, 56, 2, 66, 40, 17, 10, 27, 252, 56, 2, 228, 64, 40, 17, 10,
+ 27, 252, 56, 2, 112, 231, 194, 40, 17, 10, 27, 252, 56, 2, 79, 40, 17,
+ 10, 27, 217, 9, 2, 223, 97, 40, 17, 10, 27, 217, 9, 2, 210, 109, 40, 17,
+ 10, 27, 217, 9, 2, 66, 40, 17, 10, 27, 217, 9, 2, 228, 64, 40, 17, 10,
+ 27, 217, 9, 2, 112, 231, 194, 40, 17, 10, 27, 217, 9, 2, 79, 40, 17, 10,
+ 27, 216, 194, 2, 223, 97, 40, 17, 10, 27, 216, 194, 2, 210, 109, 40, 17,
+ 10, 27, 216, 194, 2, 66, 40, 17, 10, 27, 216, 194, 2, 228, 64, 40, 17,
+ 10, 27, 216, 194, 2, 112, 231, 194, 40, 17, 10, 27, 216, 194, 2, 79, 40,
+ 17, 10, 27, 244, 144, 2, 112, 231, 194, 40, 17, 10, 27, 244, 144, 2, 79,
+ 40, 17, 10, 27, 224, 83, 2, 112, 231, 194, 40, 17, 10, 27, 224, 83, 2,
+ 79, 40, 17, 10, 27, 234, 252, 2, 112, 40, 17, 10, 27, 234, 252, 2, 233,
+ 104, 40, 17, 10, 27, 234, 252, 2, 66, 40, 17, 10, 27, 234, 252, 2, 112,
+ 231, 194, 40, 17, 10, 27, 234, 252, 2, 79, 40, 17, 10, 27, 233, 104, 2,
+ 66, 40, 17, 10, 27, 233, 104, 2, 112, 231, 194, 40, 17, 10, 27, 233, 104,
2, 79, 40, 17, 10, 27, 66, 2, 112, 40, 17, 10, 27, 66, 2, 66, 40, 17, 10,
- 27, 228, 63, 2, 223, 96, 40, 17, 10, 27, 228, 63, 2, 210, 109, 40, 17,
- 10, 27, 228, 63, 2, 66, 40, 17, 10, 27, 228, 63, 2, 228, 63, 40, 17, 10,
- 27, 228, 63, 2, 112, 231, 193, 40, 17, 10, 27, 228, 63, 2, 79, 40, 17,
- 10, 27, 112, 231, 193, 2, 218, 23, 112, 40, 17, 10, 27, 79, 2, 223, 96,
+ 27, 228, 64, 2, 223, 97, 40, 17, 10, 27, 228, 64, 2, 210, 109, 40, 17,
+ 10, 27, 228, 64, 2, 66, 40, 17, 10, 27, 228, 64, 2, 228, 64, 40, 17, 10,
+ 27, 228, 64, 2, 112, 231, 194, 40, 17, 10, 27, 228, 64, 2, 79, 40, 17,
+ 10, 27, 112, 231, 194, 2, 218, 24, 112, 40, 17, 10, 27, 79, 2, 223, 97,
40, 17, 10, 27, 79, 2, 210, 109, 40, 17, 10, 27, 79, 2, 66, 40, 17, 10,
- 27, 79, 2, 228, 63, 40, 17, 10, 27, 79, 2, 112, 231, 193, 40, 17, 10, 27,
+ 27, 79, 2, 228, 64, 40, 17, 10, 27, 79, 2, 112, 231, 194, 40, 17, 10, 27,
79, 2, 79, 40, 17, 10, 27, 79, 2, 202, 77, 2, 151, 65, 17, 10, 27, 79, 2,
- 202, 77, 2, 122, 65, 17, 10, 27, 79, 2, 202, 77, 2, 234, 130, 65, 17, 10,
- 27, 79, 2, 202, 77, 2, 66, 65, 17, 10, 27, 79, 2, 202, 77, 2, 241, 219,
- 65, 17, 10, 27, 252, 55, 2, 151, 65, 17, 10, 27, 252, 55, 2, 122, 65, 17,
- 10, 27, 252, 55, 2, 234, 130, 65, 17, 10, 27, 252, 55, 2, 66, 65, 17, 10,
- 27, 252, 55, 2, 241, 219, 65, 17, 10, 27, 217, 8, 2, 151, 65, 17, 10, 27,
- 217, 8, 2, 122, 65, 17, 10, 27, 217, 8, 2, 234, 130, 65, 17, 10, 27, 217,
- 8, 2, 66, 65, 17, 10, 27, 217, 8, 2, 241, 219, 65, 17, 10, 27, 216, 193,
+ 202, 77, 2, 122, 65, 17, 10, 27, 79, 2, 202, 77, 2, 234, 131, 65, 17, 10,
+ 27, 79, 2, 202, 77, 2, 66, 65, 17, 10, 27, 79, 2, 202, 77, 2, 241, 220,
+ 65, 17, 10, 27, 252, 56, 2, 151, 65, 17, 10, 27, 252, 56, 2, 122, 65, 17,
+ 10, 27, 252, 56, 2, 234, 131, 65, 17, 10, 27, 252, 56, 2, 66, 65, 17, 10,
+ 27, 252, 56, 2, 241, 220, 65, 17, 10, 27, 217, 9, 2, 151, 65, 17, 10, 27,
+ 217, 9, 2, 122, 65, 17, 10, 27, 217, 9, 2, 234, 131, 65, 17, 10, 27, 217,
+ 9, 2, 66, 65, 17, 10, 27, 217, 9, 2, 241, 220, 65, 17, 10, 27, 216, 194,
2, 66, 65, 17, 10, 27, 151, 2, 122, 65, 17, 10, 27, 151, 2, 66, 65, 17,
10, 27, 122, 2, 151, 65, 17, 10, 27, 122, 2, 66, 65, 17, 10, 27, 234,
- 130, 2, 151, 65, 17, 10, 27, 234, 130, 2, 66, 65, 17, 10, 27, 221, 167,
- 2, 151, 65, 17, 10, 27, 221, 167, 2, 122, 65, 17, 10, 27, 221, 167, 2,
- 234, 130, 65, 17, 10, 27, 221, 167, 2, 66, 65, 17, 10, 27, 222, 27, 2,
- 122, 65, 17, 10, 27, 222, 27, 2, 234, 130, 65, 17, 10, 27, 222, 27, 2,
- 66, 65, 17, 10, 27, 248, 217, 2, 151, 65, 17, 10, 27, 248, 217, 2, 122,
- 65, 17, 10, 27, 248, 217, 2, 234, 130, 65, 17, 10, 27, 248, 217, 2, 66,
- 65, 17, 10, 27, 217, 81, 2, 122, 65, 17, 10, 27, 210, 112, 2, 66, 65, 17,
- 10, 27, 254, 197, 2, 151, 65, 17, 10, 27, 254, 197, 2, 66, 65, 17, 10,
- 27, 242, 245, 2, 151, 65, 17, 10, 27, 242, 245, 2, 66, 65, 17, 10, 27,
- 244, 143, 2, 151, 65, 17, 10, 27, 244, 143, 2, 122, 65, 17, 10, 27, 244,
- 143, 2, 234, 130, 65, 17, 10, 27, 244, 143, 2, 66, 65, 17, 10, 27, 224,
- 82, 2, 122, 65, 17, 10, 27, 224, 82, 2, 66, 65, 17, 10, 27, 234, 251, 2,
- 151, 65, 17, 10, 27, 234, 251, 2, 122, 65, 17, 10, 27, 234, 251, 2, 234,
- 130, 65, 17, 10, 27, 234, 251, 2, 233, 103, 65, 17, 10, 27, 234, 251, 2,
- 66, 65, 17, 10, 27, 233, 103, 2, 151, 65, 17, 10, 27, 233, 103, 2, 122,
- 65, 17, 10, 27, 233, 103, 2, 234, 130, 65, 17, 10, 27, 233, 103, 2, 66,
- 65, 17, 10, 27, 233, 103, 2, 241, 219, 65, 17, 10, 27, 66, 2, 151, 65,
- 17, 10, 27, 66, 2, 122, 65, 17, 10, 27, 66, 2, 234, 130, 65, 17, 10, 27,
- 66, 2, 66, 65, 17, 10, 27, 228, 63, 2, 151, 65, 17, 10, 27, 228, 63, 2,
- 122, 65, 17, 10, 27, 228, 63, 2, 234, 130, 65, 17, 10, 27, 228, 63, 2,
- 66, 65, 17, 10, 27, 228, 63, 2, 241, 219, 65, 17, 10, 27, 241, 219, 2,
- 151, 65, 17, 10, 27, 241, 219, 2, 66, 65, 17, 10, 27, 241, 219, 2, 218,
- 23, 112, 65, 17, 10, 27, 79, 2, 151, 65, 17, 10, 27, 79, 2, 122, 65, 17,
- 10, 27, 79, 2, 234, 130, 65, 17, 10, 27, 79, 2, 66, 65, 17, 10, 27, 79,
- 2, 241, 219, 65, 17, 10, 27, 79, 2, 202, 77, 2, 66, 147, 17, 10, 27, 79,
- 2, 202, 77, 2, 241, 219, 147, 17, 10, 27, 252, 55, 2, 66, 147, 17, 10,
- 27, 252, 55, 2, 241, 219, 147, 17, 10, 27, 217, 8, 2, 66, 147, 17, 10,
- 27, 217, 8, 2, 241, 219, 147, 17, 10, 27, 216, 193, 2, 66, 147, 17, 10,
- 27, 216, 193, 2, 241, 219, 147, 17, 10, 27, 221, 167, 2, 66, 147, 17, 10,
- 27, 221, 167, 2, 241, 219, 147, 17, 10, 27, 220, 60, 2, 66, 147, 17, 10,
- 27, 220, 60, 2, 241, 219, 147, 17, 10, 27, 234, 251, 2, 233, 103, 147,
- 17, 10, 27, 234, 251, 2, 66, 147, 17, 10, 27, 233, 103, 2, 66, 147, 17,
- 10, 27, 228, 63, 2, 66, 147, 17, 10, 27, 228, 63, 2, 241, 219, 147, 17,
- 10, 27, 79, 2, 66, 147, 17, 10, 27, 79, 2, 241, 219, 147, 17, 10, 27,
- 220, 94, 2, 244, 166, 147, 17, 10, 27, 220, 94, 2, 248, 185, 147, 17, 10,
- 27, 220, 94, 2, 234, 206, 147, 17, 10, 27, 217, 81, 2, 112, 231, 193, 53,
- 17, 10, 27, 217, 81, 2, 79, 53, 17, 10, 27, 254, 197, 2, 112, 231, 193,
- 53, 17, 10, 27, 254, 197, 2, 79, 53, 17, 10, 27, 242, 245, 2, 112, 231,
- 193, 53, 17, 10, 27, 242, 245, 2, 79, 53, 17, 10, 27, 221, 167, 2, 112,
- 231, 193, 53, 17, 10, 27, 221, 167, 2, 79, 53, 17, 10, 27, 220, 60, 2,
- 112, 231, 193, 53, 17, 10, 27, 220, 60, 2, 79, 53, 17, 10, 27, 122, 2,
- 112, 231, 193, 53, 17, 10, 27, 122, 2, 79, 53, 17, 10, 27, 151, 2, 112,
- 231, 193, 53, 17, 10, 27, 151, 2, 79, 53, 17, 10, 27, 234, 130, 2, 112,
- 231, 193, 53, 17, 10, 27, 234, 130, 2, 79, 53, 17, 10, 27, 222, 27, 2,
- 112, 231, 193, 53, 17, 10, 27, 222, 27, 2, 79, 53, 17, 10, 27, 248, 217,
- 2, 112, 231, 193, 53, 17, 10, 27, 248, 217, 2, 79, 53, 17, 10, 27, 220,
- 60, 2, 151, 53, 17, 10, 27, 220, 60, 2, 122, 53, 17, 10, 27, 220, 60, 2,
- 234, 130, 53, 17, 10, 27, 220, 60, 2, 66, 53, 17, 10, 27, 220, 60, 2,
- 223, 96, 53, 17, 10, 27, 221, 167, 2, 223, 96, 53, 17, 10, 27, 222, 27,
- 2, 223, 96, 53, 17, 10, 27, 248, 217, 2, 223, 96, 53, 17, 10, 27, 217,
- 81, 2, 112, 231, 193, 40, 17, 10, 27, 217, 81, 2, 79, 40, 17, 10, 27,
- 254, 197, 2, 112, 231, 193, 40, 17, 10, 27, 254, 197, 2, 79, 40, 17, 10,
- 27, 242, 245, 2, 112, 231, 193, 40, 17, 10, 27, 242, 245, 2, 79, 40, 17,
- 10, 27, 221, 167, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 79, 40,
- 17, 10, 27, 220, 60, 2, 112, 231, 193, 40, 17, 10, 27, 220, 60, 2, 79,
- 40, 17, 10, 27, 122, 2, 112, 231, 193, 40, 17, 10, 27, 122, 2, 79, 40,
- 17, 10, 27, 151, 2, 112, 231, 193, 40, 17, 10, 27, 151, 2, 79, 40, 17,
- 10, 27, 234, 130, 2, 112, 231, 193, 40, 17, 10, 27, 234, 130, 2, 79, 40,
- 17, 10, 27, 222, 27, 2, 112, 231, 193, 40, 17, 10, 27, 222, 27, 2, 79,
- 40, 17, 10, 27, 248, 217, 2, 112, 231, 193, 40, 17, 10, 27, 248, 217, 2,
- 79, 40, 17, 10, 27, 220, 60, 2, 151, 40, 17, 10, 27, 220, 60, 2, 122, 40,
- 17, 10, 27, 220, 60, 2, 234, 130, 40, 17, 10, 27, 220, 60, 2, 66, 40, 17,
- 10, 27, 220, 60, 2, 223, 96, 40, 17, 10, 27, 221, 167, 2, 223, 96, 40,
- 17, 10, 27, 222, 27, 2, 223, 96, 40, 17, 10, 27, 248, 217, 2, 223, 96,
- 40, 17, 10, 27, 220, 60, 2, 151, 65, 17, 10, 27, 220, 60, 2, 122, 65, 17,
- 10, 27, 220, 60, 2, 234, 130, 65, 17, 10, 27, 220, 60, 2, 66, 65, 17, 10,
- 27, 221, 167, 2, 241, 219, 65, 17, 10, 27, 220, 60, 2, 241, 219, 65, 17,
- 10, 27, 217, 81, 2, 66, 65, 17, 10, 27, 221, 167, 2, 151, 147, 17, 10,
- 27, 221, 167, 2, 122, 147, 17, 10, 27, 221, 167, 2, 234, 130, 147, 17,
- 10, 27, 220, 60, 2, 151, 147, 17, 10, 27, 220, 60, 2, 122, 147, 17, 10,
- 27, 220, 60, 2, 234, 130, 147, 17, 10, 27, 217, 81, 2, 66, 147, 17, 10,
- 27, 210, 112, 2, 66, 147, 17, 10, 27, 112, 2, 244, 164, 40, 17, 10, 27,
- 112, 2, 244, 164, 53, 17, 226, 146, 43, 226, 3, 226, 146, 44, 226, 3, 10,
- 27, 217, 8, 2, 151, 2, 66, 65, 17, 10, 27, 217, 8, 2, 122, 2, 151, 40,
- 17, 10, 27, 217, 8, 2, 122, 2, 151, 65, 17, 10, 27, 217, 8, 2, 122, 2,
- 66, 65, 17, 10, 27, 217, 8, 2, 234, 130, 2, 66, 65, 17, 10, 27, 217, 8,
- 2, 66, 2, 151, 65, 17, 10, 27, 217, 8, 2, 66, 2, 122, 65, 17, 10, 27,
- 217, 8, 2, 66, 2, 234, 130, 65, 17, 10, 27, 151, 2, 66, 2, 122, 40, 17,
+ 131, 2, 151, 65, 17, 10, 27, 234, 131, 2, 66, 65, 17, 10, 27, 221, 168,
+ 2, 151, 65, 17, 10, 27, 221, 168, 2, 122, 65, 17, 10, 27, 221, 168, 2,
+ 234, 131, 65, 17, 10, 27, 221, 168, 2, 66, 65, 17, 10, 27, 222, 28, 2,
+ 122, 65, 17, 10, 27, 222, 28, 2, 234, 131, 65, 17, 10, 27, 222, 28, 2,
+ 66, 65, 17, 10, 27, 248, 218, 2, 151, 65, 17, 10, 27, 248, 218, 2, 122,
+ 65, 17, 10, 27, 248, 218, 2, 234, 131, 65, 17, 10, 27, 248, 218, 2, 66,
+ 65, 17, 10, 27, 217, 82, 2, 122, 65, 17, 10, 27, 210, 112, 2, 66, 65, 17,
+ 10, 27, 254, 198, 2, 151, 65, 17, 10, 27, 254, 198, 2, 66, 65, 17, 10,
+ 27, 242, 246, 2, 151, 65, 17, 10, 27, 242, 246, 2, 66, 65, 17, 10, 27,
+ 244, 144, 2, 151, 65, 17, 10, 27, 244, 144, 2, 122, 65, 17, 10, 27, 244,
+ 144, 2, 234, 131, 65, 17, 10, 27, 244, 144, 2, 66, 65, 17, 10, 27, 224,
+ 83, 2, 122, 65, 17, 10, 27, 224, 83, 2, 66, 65, 17, 10, 27, 234, 252, 2,
+ 151, 65, 17, 10, 27, 234, 252, 2, 122, 65, 17, 10, 27, 234, 252, 2, 234,
+ 131, 65, 17, 10, 27, 234, 252, 2, 233, 104, 65, 17, 10, 27, 234, 252, 2,
+ 66, 65, 17, 10, 27, 233, 104, 2, 151, 65, 17, 10, 27, 233, 104, 2, 122,
+ 65, 17, 10, 27, 233, 104, 2, 234, 131, 65, 17, 10, 27, 233, 104, 2, 66,
+ 65, 17, 10, 27, 233, 104, 2, 241, 220, 65, 17, 10, 27, 66, 2, 151, 65,
+ 17, 10, 27, 66, 2, 122, 65, 17, 10, 27, 66, 2, 234, 131, 65, 17, 10, 27,
+ 66, 2, 66, 65, 17, 10, 27, 228, 64, 2, 151, 65, 17, 10, 27, 228, 64, 2,
+ 122, 65, 17, 10, 27, 228, 64, 2, 234, 131, 65, 17, 10, 27, 228, 64, 2,
+ 66, 65, 17, 10, 27, 228, 64, 2, 241, 220, 65, 17, 10, 27, 241, 220, 2,
+ 151, 65, 17, 10, 27, 241, 220, 2, 66, 65, 17, 10, 27, 241, 220, 2, 218,
+ 24, 112, 65, 17, 10, 27, 79, 2, 151, 65, 17, 10, 27, 79, 2, 122, 65, 17,
+ 10, 27, 79, 2, 234, 131, 65, 17, 10, 27, 79, 2, 66, 65, 17, 10, 27, 79,
+ 2, 241, 220, 65, 17, 10, 27, 79, 2, 202, 77, 2, 66, 147, 17, 10, 27, 79,
+ 2, 202, 77, 2, 241, 220, 147, 17, 10, 27, 252, 56, 2, 66, 147, 17, 10,
+ 27, 252, 56, 2, 241, 220, 147, 17, 10, 27, 217, 9, 2, 66, 147, 17, 10,
+ 27, 217, 9, 2, 241, 220, 147, 17, 10, 27, 216, 194, 2, 66, 147, 17, 10,
+ 27, 216, 194, 2, 241, 220, 147, 17, 10, 27, 221, 168, 2, 66, 147, 17, 10,
+ 27, 221, 168, 2, 241, 220, 147, 17, 10, 27, 220, 61, 2, 66, 147, 17, 10,
+ 27, 220, 61, 2, 241, 220, 147, 17, 10, 27, 234, 252, 2, 233, 104, 147,
+ 17, 10, 27, 234, 252, 2, 66, 147, 17, 10, 27, 233, 104, 2, 66, 147, 17,
+ 10, 27, 228, 64, 2, 66, 147, 17, 10, 27, 228, 64, 2, 241, 220, 147, 17,
+ 10, 27, 79, 2, 66, 147, 17, 10, 27, 79, 2, 241, 220, 147, 17, 10, 27,
+ 220, 95, 2, 244, 167, 147, 17, 10, 27, 220, 95, 2, 248, 186, 147, 17, 10,
+ 27, 220, 95, 2, 234, 207, 147, 17, 10, 27, 217, 82, 2, 112, 231, 194, 53,
+ 17, 10, 27, 217, 82, 2, 79, 53, 17, 10, 27, 254, 198, 2, 112, 231, 194,
+ 53, 17, 10, 27, 254, 198, 2, 79, 53, 17, 10, 27, 242, 246, 2, 112, 231,
+ 194, 53, 17, 10, 27, 242, 246, 2, 79, 53, 17, 10, 27, 221, 168, 2, 112,
+ 231, 194, 53, 17, 10, 27, 221, 168, 2, 79, 53, 17, 10, 27, 220, 61, 2,
+ 112, 231, 194, 53, 17, 10, 27, 220, 61, 2, 79, 53, 17, 10, 27, 122, 2,
+ 112, 231, 194, 53, 17, 10, 27, 122, 2, 79, 53, 17, 10, 27, 151, 2, 112,
+ 231, 194, 53, 17, 10, 27, 151, 2, 79, 53, 17, 10, 27, 234, 131, 2, 112,
+ 231, 194, 53, 17, 10, 27, 234, 131, 2, 79, 53, 17, 10, 27, 222, 28, 2,
+ 112, 231, 194, 53, 17, 10, 27, 222, 28, 2, 79, 53, 17, 10, 27, 248, 218,
+ 2, 112, 231, 194, 53, 17, 10, 27, 248, 218, 2, 79, 53, 17, 10, 27, 220,
+ 61, 2, 151, 53, 17, 10, 27, 220, 61, 2, 122, 53, 17, 10, 27, 220, 61, 2,
+ 234, 131, 53, 17, 10, 27, 220, 61, 2, 66, 53, 17, 10, 27, 220, 61, 2,
+ 223, 97, 53, 17, 10, 27, 221, 168, 2, 223, 97, 53, 17, 10, 27, 222, 28,
+ 2, 223, 97, 53, 17, 10, 27, 248, 218, 2, 223, 97, 53, 17, 10, 27, 217,
+ 82, 2, 112, 231, 194, 40, 17, 10, 27, 217, 82, 2, 79, 40, 17, 10, 27,
+ 254, 198, 2, 112, 231, 194, 40, 17, 10, 27, 254, 198, 2, 79, 40, 17, 10,
+ 27, 242, 246, 2, 112, 231, 194, 40, 17, 10, 27, 242, 246, 2, 79, 40, 17,
+ 10, 27, 221, 168, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 79, 40,
+ 17, 10, 27, 220, 61, 2, 112, 231, 194, 40, 17, 10, 27, 220, 61, 2, 79,
+ 40, 17, 10, 27, 122, 2, 112, 231, 194, 40, 17, 10, 27, 122, 2, 79, 40,
+ 17, 10, 27, 151, 2, 112, 231, 194, 40, 17, 10, 27, 151, 2, 79, 40, 17,
+ 10, 27, 234, 131, 2, 112, 231, 194, 40, 17, 10, 27, 234, 131, 2, 79, 40,
+ 17, 10, 27, 222, 28, 2, 112, 231, 194, 40, 17, 10, 27, 222, 28, 2, 79,
+ 40, 17, 10, 27, 248, 218, 2, 112, 231, 194, 40, 17, 10, 27, 248, 218, 2,
+ 79, 40, 17, 10, 27, 220, 61, 2, 151, 40, 17, 10, 27, 220, 61, 2, 122, 40,
+ 17, 10, 27, 220, 61, 2, 234, 131, 40, 17, 10, 27, 220, 61, 2, 66, 40, 17,
+ 10, 27, 220, 61, 2, 223, 97, 40, 17, 10, 27, 221, 168, 2, 223, 97, 40,
+ 17, 10, 27, 222, 28, 2, 223, 97, 40, 17, 10, 27, 248, 218, 2, 223, 97,
+ 40, 17, 10, 27, 220, 61, 2, 151, 65, 17, 10, 27, 220, 61, 2, 122, 65, 17,
+ 10, 27, 220, 61, 2, 234, 131, 65, 17, 10, 27, 220, 61, 2, 66, 65, 17, 10,
+ 27, 221, 168, 2, 241, 220, 65, 17, 10, 27, 220, 61, 2, 241, 220, 65, 17,
+ 10, 27, 217, 82, 2, 66, 65, 17, 10, 27, 221, 168, 2, 151, 147, 17, 10,
+ 27, 221, 168, 2, 122, 147, 17, 10, 27, 221, 168, 2, 234, 131, 147, 17,
+ 10, 27, 220, 61, 2, 151, 147, 17, 10, 27, 220, 61, 2, 122, 147, 17, 10,
+ 27, 220, 61, 2, 234, 131, 147, 17, 10, 27, 217, 82, 2, 66, 147, 17, 10,
+ 27, 210, 112, 2, 66, 147, 17, 10, 27, 112, 2, 244, 165, 40, 17, 10, 27,
+ 112, 2, 244, 165, 53, 17, 226, 147, 43, 226, 4, 226, 147, 44, 226, 4, 10,
+ 27, 217, 9, 2, 151, 2, 66, 65, 17, 10, 27, 217, 9, 2, 122, 2, 151, 40,
+ 17, 10, 27, 217, 9, 2, 122, 2, 151, 65, 17, 10, 27, 217, 9, 2, 122, 2,
+ 66, 65, 17, 10, 27, 217, 9, 2, 234, 131, 2, 66, 65, 17, 10, 27, 217, 9,
+ 2, 66, 2, 151, 65, 17, 10, 27, 217, 9, 2, 66, 2, 122, 65, 17, 10, 27,
+ 217, 9, 2, 66, 2, 234, 131, 65, 17, 10, 27, 151, 2, 66, 2, 122, 40, 17,
10, 27, 151, 2, 66, 2, 122, 65, 17, 10, 27, 122, 2, 66, 2, 79, 40, 17,
- 10, 27, 122, 2, 66, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 122,
- 2, 151, 65, 17, 10, 27, 221, 167, 2, 151, 2, 122, 65, 17, 10, 27, 221,
- 167, 2, 151, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 66, 2, 122,
- 40, 17, 10, 27, 221, 167, 2, 66, 2, 122, 65, 17, 10, 27, 221, 167, 2, 66,
- 2, 151, 65, 17, 10, 27, 221, 167, 2, 66, 2, 66, 40, 17, 10, 27, 221, 167,
- 2, 66, 2, 66, 65, 17, 10, 27, 222, 27, 2, 122, 2, 122, 40, 17, 10, 27,
- 222, 27, 2, 122, 2, 122, 65, 17, 10, 27, 222, 27, 2, 66, 2, 66, 40, 17,
- 10, 27, 220, 60, 2, 122, 2, 66, 40, 17, 10, 27, 220, 60, 2, 122, 2, 66,
- 65, 17, 10, 27, 220, 60, 2, 151, 2, 79, 40, 17, 10, 27, 220, 60, 2, 66,
- 2, 234, 130, 40, 17, 10, 27, 220, 60, 2, 66, 2, 234, 130, 65, 17, 10, 27,
- 220, 60, 2, 66, 2, 66, 40, 17, 10, 27, 220, 60, 2, 66, 2, 66, 65, 17, 10,
- 27, 248, 217, 2, 122, 2, 112, 231, 193, 40, 17, 10, 27, 248, 217, 2, 234,
- 130, 2, 66, 40, 17, 10, 27, 248, 217, 2, 234, 130, 2, 66, 65, 17, 10, 27,
- 217, 81, 2, 66, 2, 122, 40, 17, 10, 27, 217, 81, 2, 66, 2, 122, 65, 17,
- 10, 27, 217, 81, 2, 66, 2, 66, 65, 17, 10, 27, 217, 81, 2, 66, 2, 79, 40,
- 17, 10, 27, 254, 197, 2, 151, 2, 66, 40, 17, 10, 27, 254, 197, 2, 66, 2,
- 66, 40, 17, 10, 27, 254, 197, 2, 66, 2, 66, 65, 17, 10, 27, 254, 197, 2,
- 66, 2, 112, 231, 193, 40, 17, 10, 27, 242, 245, 2, 66, 2, 66, 40, 17, 10,
- 27, 242, 245, 2, 66, 2, 79, 40, 17, 10, 27, 242, 245, 2, 66, 2, 112, 231,
- 193, 40, 17, 10, 27, 244, 143, 2, 234, 130, 2, 66, 40, 17, 10, 27, 244,
- 143, 2, 234, 130, 2, 66, 65, 17, 10, 27, 224, 82, 2, 66, 2, 122, 40, 17,
- 10, 27, 224, 82, 2, 66, 2, 66, 40, 17, 10, 27, 233, 103, 2, 122, 2, 66,
- 40, 17, 10, 27, 233, 103, 2, 122, 2, 79, 40, 17, 10, 27, 233, 103, 2,
- 122, 2, 112, 231, 193, 40, 17, 10, 27, 233, 103, 2, 151, 2, 151, 65, 17,
- 10, 27, 233, 103, 2, 151, 2, 151, 40, 17, 10, 27, 233, 103, 2, 234, 130,
- 2, 66, 40, 17, 10, 27, 233, 103, 2, 234, 130, 2, 66, 65, 17, 10, 27, 233,
- 103, 2, 66, 2, 122, 40, 17, 10, 27, 233, 103, 2, 66, 2, 122, 65, 17, 10,
+ 10, 27, 122, 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 122,
+ 2, 151, 65, 17, 10, 27, 221, 168, 2, 151, 2, 122, 65, 17, 10, 27, 221,
+ 168, 2, 151, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 66, 2, 122,
+ 40, 17, 10, 27, 221, 168, 2, 66, 2, 122, 65, 17, 10, 27, 221, 168, 2, 66,
+ 2, 151, 65, 17, 10, 27, 221, 168, 2, 66, 2, 66, 40, 17, 10, 27, 221, 168,
+ 2, 66, 2, 66, 65, 17, 10, 27, 222, 28, 2, 122, 2, 122, 40, 17, 10, 27,
+ 222, 28, 2, 122, 2, 122, 65, 17, 10, 27, 222, 28, 2, 66, 2, 66, 40, 17,
+ 10, 27, 220, 61, 2, 122, 2, 66, 40, 17, 10, 27, 220, 61, 2, 122, 2, 66,
+ 65, 17, 10, 27, 220, 61, 2, 151, 2, 79, 40, 17, 10, 27, 220, 61, 2, 66,
+ 2, 234, 131, 40, 17, 10, 27, 220, 61, 2, 66, 2, 234, 131, 65, 17, 10, 27,
+ 220, 61, 2, 66, 2, 66, 40, 17, 10, 27, 220, 61, 2, 66, 2, 66, 65, 17, 10,
+ 27, 248, 218, 2, 122, 2, 112, 231, 194, 40, 17, 10, 27, 248, 218, 2, 234,
+ 131, 2, 66, 40, 17, 10, 27, 248, 218, 2, 234, 131, 2, 66, 65, 17, 10, 27,
+ 217, 82, 2, 66, 2, 122, 40, 17, 10, 27, 217, 82, 2, 66, 2, 122, 65, 17,
+ 10, 27, 217, 82, 2, 66, 2, 66, 65, 17, 10, 27, 217, 82, 2, 66, 2, 79, 40,
+ 17, 10, 27, 254, 198, 2, 151, 2, 66, 40, 17, 10, 27, 254, 198, 2, 66, 2,
+ 66, 40, 17, 10, 27, 254, 198, 2, 66, 2, 66, 65, 17, 10, 27, 254, 198, 2,
+ 66, 2, 112, 231, 194, 40, 17, 10, 27, 242, 246, 2, 66, 2, 66, 40, 17, 10,
+ 27, 242, 246, 2, 66, 2, 79, 40, 17, 10, 27, 242, 246, 2, 66, 2, 112, 231,
+ 194, 40, 17, 10, 27, 244, 144, 2, 234, 131, 2, 66, 40, 17, 10, 27, 244,
+ 144, 2, 234, 131, 2, 66, 65, 17, 10, 27, 224, 83, 2, 66, 2, 122, 40, 17,
+ 10, 27, 224, 83, 2, 66, 2, 66, 40, 17, 10, 27, 233, 104, 2, 122, 2, 66,
+ 40, 17, 10, 27, 233, 104, 2, 122, 2, 79, 40, 17, 10, 27, 233, 104, 2,
+ 122, 2, 112, 231, 194, 40, 17, 10, 27, 233, 104, 2, 151, 2, 151, 65, 17,
+ 10, 27, 233, 104, 2, 151, 2, 151, 40, 17, 10, 27, 233, 104, 2, 234, 131,
+ 2, 66, 40, 17, 10, 27, 233, 104, 2, 234, 131, 2, 66, 65, 17, 10, 27, 233,
+ 104, 2, 66, 2, 122, 40, 17, 10, 27, 233, 104, 2, 66, 2, 122, 65, 17, 10,
27, 66, 2, 122, 2, 151, 65, 17, 10, 27, 66, 2, 122, 2, 66, 65, 17, 10,
27, 66, 2, 122, 2, 79, 40, 17, 10, 27, 66, 2, 151, 2, 122, 65, 17, 10,
- 27, 66, 2, 151, 2, 66, 65, 17, 10, 27, 66, 2, 234, 130, 2, 151, 65, 17,
- 10, 27, 66, 2, 234, 130, 2, 66, 65, 17, 10, 27, 66, 2, 151, 2, 234, 130,
- 65, 17, 10, 27, 241, 219, 2, 66, 2, 151, 65, 17, 10, 27, 241, 219, 2, 66,
- 2, 66, 65, 17, 10, 27, 228, 63, 2, 122, 2, 66, 65, 17, 10, 27, 228, 63,
- 2, 122, 2, 112, 231, 193, 40, 17, 10, 27, 228, 63, 2, 151, 2, 66, 40, 17,
- 10, 27, 228, 63, 2, 151, 2, 66, 65, 17, 10, 27, 228, 63, 2, 151, 2, 112,
- 231, 193, 40, 17, 10, 27, 228, 63, 2, 66, 2, 79, 40, 17, 10, 27, 228, 63,
- 2, 66, 2, 112, 231, 193, 40, 17, 10, 27, 79, 2, 66, 2, 66, 40, 17, 10,
- 27, 79, 2, 66, 2, 66, 65, 17, 10, 27, 252, 55, 2, 234, 130, 2, 79, 40,
- 17, 10, 27, 217, 8, 2, 151, 2, 79, 40, 17, 10, 27, 217, 8, 2, 151, 2,
- 112, 231, 193, 40, 17, 10, 27, 217, 8, 2, 234, 130, 2, 79, 40, 17, 10,
- 27, 217, 8, 2, 234, 130, 2, 112, 231, 193, 40, 17, 10, 27, 217, 8, 2, 66,
- 2, 79, 40, 17, 10, 27, 217, 8, 2, 66, 2, 112, 231, 193, 40, 17, 10, 27,
- 151, 2, 66, 2, 79, 40, 17, 10, 27, 151, 2, 122, 2, 112, 231, 193, 40, 17,
- 10, 27, 151, 2, 66, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 234,
- 130, 2, 112, 231, 193, 40, 17, 10, 27, 222, 27, 2, 122, 2, 79, 40, 17,
- 10, 27, 220, 60, 2, 122, 2, 79, 40, 17, 10, 27, 248, 217, 2, 122, 2, 79,
- 40, 17, 10, 27, 233, 103, 2, 151, 2, 79, 40, 17, 10, 27, 233, 103, 2, 66,
+ 27, 66, 2, 151, 2, 66, 65, 17, 10, 27, 66, 2, 234, 131, 2, 151, 65, 17,
+ 10, 27, 66, 2, 234, 131, 2, 66, 65, 17, 10, 27, 66, 2, 151, 2, 234, 131,
+ 65, 17, 10, 27, 241, 220, 2, 66, 2, 151, 65, 17, 10, 27, 241, 220, 2, 66,
+ 2, 66, 65, 17, 10, 27, 228, 64, 2, 122, 2, 66, 65, 17, 10, 27, 228, 64,
+ 2, 122, 2, 112, 231, 194, 40, 17, 10, 27, 228, 64, 2, 151, 2, 66, 40, 17,
+ 10, 27, 228, 64, 2, 151, 2, 66, 65, 17, 10, 27, 228, 64, 2, 151, 2, 112,
+ 231, 194, 40, 17, 10, 27, 228, 64, 2, 66, 2, 79, 40, 17, 10, 27, 228, 64,
+ 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, 79, 2, 66, 2, 66, 40, 17, 10,
+ 27, 79, 2, 66, 2, 66, 65, 17, 10, 27, 252, 56, 2, 234, 131, 2, 79, 40,
+ 17, 10, 27, 217, 9, 2, 151, 2, 79, 40, 17, 10, 27, 217, 9, 2, 151, 2,
+ 112, 231, 194, 40, 17, 10, 27, 217, 9, 2, 234, 131, 2, 79, 40, 17, 10,
+ 27, 217, 9, 2, 234, 131, 2, 112, 231, 194, 40, 17, 10, 27, 217, 9, 2, 66,
+ 2, 79, 40, 17, 10, 27, 217, 9, 2, 66, 2, 112, 231, 194, 40, 17, 10, 27,
+ 151, 2, 66, 2, 79, 40, 17, 10, 27, 151, 2, 122, 2, 112, 231, 194, 40, 17,
+ 10, 27, 151, 2, 66, 2, 112, 231, 194, 40, 17, 10, 27, 221, 168, 2, 234,
+ 131, 2, 112, 231, 194, 40, 17, 10, 27, 222, 28, 2, 122, 2, 79, 40, 17,
+ 10, 27, 220, 61, 2, 122, 2, 79, 40, 17, 10, 27, 248, 218, 2, 122, 2, 79,
+ 40, 17, 10, 27, 233, 104, 2, 151, 2, 79, 40, 17, 10, 27, 233, 104, 2, 66,
2, 79, 40, 17, 10, 27, 79, 2, 122, 2, 79, 40, 17, 10, 27, 79, 2, 151, 2,
79, 40, 17, 10, 27, 79, 2, 66, 2, 79, 40, 17, 10, 27, 66, 2, 66, 2, 79,
- 40, 17, 10, 27, 224, 82, 2, 66, 2, 79, 40, 17, 10, 27, 228, 63, 2, 122,
- 2, 79, 40, 17, 10, 27, 224, 82, 2, 66, 2, 122, 65, 17, 10, 27, 233, 103,
- 2, 122, 2, 66, 65, 17, 10, 27, 254, 197, 2, 66, 2, 79, 40, 17, 10, 27,
- 234, 251, 2, 66, 2, 79, 40, 17, 10, 27, 228, 63, 2, 151, 2, 122, 65, 17,
- 10, 27, 66, 2, 234, 130, 2, 79, 40, 17, 10, 27, 233, 103, 2, 151, 2, 66,
- 65, 17, 10, 27, 234, 251, 2, 66, 2, 66, 40, 17, 10, 27, 233, 103, 2, 151,
- 2, 66, 40, 17, 10, 27, 228, 63, 2, 151, 2, 122, 40, 17, 10, 27, 151, 2,
+ 40, 17, 10, 27, 224, 83, 2, 66, 2, 79, 40, 17, 10, 27, 228, 64, 2, 122,
+ 2, 79, 40, 17, 10, 27, 224, 83, 2, 66, 2, 122, 65, 17, 10, 27, 233, 104,
+ 2, 122, 2, 66, 65, 17, 10, 27, 254, 198, 2, 66, 2, 79, 40, 17, 10, 27,
+ 234, 252, 2, 66, 2, 79, 40, 17, 10, 27, 228, 64, 2, 151, 2, 122, 65, 17,
+ 10, 27, 66, 2, 234, 131, 2, 79, 40, 17, 10, 27, 233, 104, 2, 151, 2, 66,
+ 65, 17, 10, 27, 234, 252, 2, 66, 2, 66, 40, 17, 10, 27, 233, 104, 2, 151,
+ 2, 66, 40, 17, 10, 27, 228, 64, 2, 151, 2, 122, 40, 17, 10, 27, 151, 2,
122, 2, 79, 40, 17, 10, 27, 122, 2, 151, 2, 79, 40, 17, 10, 27, 66, 2,
- 151, 2, 79, 40, 17, 10, 27, 244, 143, 2, 66, 2, 79, 40, 17, 10, 27, 252,
- 55, 2, 122, 2, 79, 40, 17, 10, 27, 234, 251, 2, 66, 2, 66, 65, 17, 10,
- 27, 254, 197, 2, 151, 2, 66, 65, 17, 10, 27, 222, 27, 2, 66, 2, 66, 65,
- 17, 10, 27, 221, 167, 2, 234, 130, 2, 79, 40, 17, 10, 27, 228, 63, 2,
- 151, 2, 79, 40, 17, 10, 27, 222, 4, 214, 128, 253, 238, 234, 4, 218, 130,
- 5, 53, 17, 10, 27, 224, 78, 214, 128, 253, 238, 234, 4, 218, 130, 5, 53,
- 17, 10, 27, 254, 153, 53, 17, 10, 27, 254, 183, 53, 17, 10, 27, 230, 153,
- 53, 17, 10, 27, 222, 5, 53, 17, 10, 27, 223, 143, 53, 17, 10, 27, 254,
- 172, 53, 17, 10, 27, 212, 49, 53, 17, 10, 27, 222, 4, 53, 17, 10, 27,
- 222, 3, 254, 172, 212, 48, 10, 27, 235, 134, 223, 34, 50, 10, 27, 251,
- 230, 254, 39, 254, 40, 45, 221, 156, 45, 221, 45, 45, 220, 233, 45, 220,
- 222, 45, 220, 211, 45, 220, 200, 45, 220, 189, 45, 220, 178, 45, 220,
- 167, 45, 221, 155, 45, 221, 144, 45, 221, 133, 45, 221, 122, 45, 221,
- 111, 45, 221, 100, 45, 221, 89, 224, 194, 244, 20, 31, 67, 249, 219, 224,
- 194, 244, 20, 31, 67, 109, 249, 219, 224, 194, 244, 20, 31, 67, 109, 243,
- 229, 218, 129, 224, 194, 244, 20, 31, 67, 249, 226, 224, 194, 244, 20,
- 31, 67, 220, 150, 224, 194, 244, 20, 31, 67, 245, 31, 78, 224, 194, 244,
- 20, 31, 67, 224, 13, 78, 224, 194, 244, 20, 31, 67, 43, 71, 233, 20, 127,
- 224, 194, 244, 20, 31, 67, 44, 71, 233, 20, 251, 156, 224, 194, 244, 20,
- 31, 67, 203, 245, 163, 38, 27, 43, 242, 27, 38, 27, 44, 242, 27, 38, 52,
- 216, 89, 43, 242, 27, 38, 52, 216, 89, 44, 242, 27, 38, 231, 233, 43,
- 242, 27, 38, 231, 233, 44, 242, 27, 38, 249, 197, 231, 232, 224, 194,
- 244, 20, 31, 67, 113, 59, 233, 56, 224, 194, 244, 20, 31, 67, 245, 160,
- 248, 156, 224, 194, 244, 20, 31, 67, 245, 151, 248, 156, 224, 194, 244,
- 20, 31, 67, 121, 232, 213, 224, 194, 244, 20, 31, 67, 212, 32, 121, 232,
- 213, 224, 194, 244, 20, 31, 67, 43, 226, 3, 224, 194, 244, 20, 31, 67,
- 44, 226, 3, 224, 194, 244, 20, 31, 67, 43, 249, 99, 127, 224, 194, 244,
- 20, 31, 67, 44, 249, 99, 127, 224, 194, 244, 20, 31, 67, 43, 216, 6, 220,
- 53, 127, 224, 194, 244, 20, 31, 67, 44, 216, 6, 220, 53, 127, 224, 194,
- 244, 20, 31, 67, 43, 85, 233, 20, 127, 224, 194, 244, 20, 31, 67, 44, 85,
- 233, 20, 127, 224, 194, 244, 20, 31, 67, 43, 52, 254, 110, 127, 224, 194,
- 244, 20, 31, 67, 44, 52, 254, 110, 127, 224, 194, 244, 20, 31, 67, 43,
- 254, 110, 127, 224, 194, 244, 20, 31, 67, 44, 254, 110, 127, 224, 194,
- 244, 20, 31, 67, 43, 249, 161, 127, 224, 194, 244, 20, 31, 67, 44, 249,
- 161, 127, 224, 194, 244, 20, 31, 67, 43, 71, 249, 161, 127, 224, 194,
- 244, 20, 31, 67, 44, 71, 249, 161, 127, 220, 131, 247, 120, 71, 220, 131,
- 247, 120, 224, 194, 244, 20, 31, 67, 43, 42, 127, 224, 194, 244, 20, 31,
- 67, 44, 42, 127, 248, 155, 226, 119, 250, 172, 226, 119, 212, 32, 226,
- 119, 52, 212, 32, 226, 119, 248, 155, 121, 232, 213, 250, 172, 121, 232,
- 213, 212, 32, 121, 232, 213, 4, 249, 219, 4, 109, 249, 219, 4, 243, 229,
- 218, 129, 4, 220, 150, 4, 249, 226, 4, 224, 13, 78, 4, 245, 31, 78, 4,
- 245, 160, 248, 156, 4, 43, 226, 3, 4, 44, 226, 3, 4, 43, 249, 99, 127, 4,
- 44, 249, 99, 127, 4, 43, 216, 6, 220, 53, 127, 4, 44, 216, 6, 220, 53,
- 127, 4, 54, 50, 4, 254, 126, 4, 253, 216, 4, 96, 50, 4, 240, 167, 4, 233,
- 15, 50, 4, 242, 130, 50, 4, 245, 98, 50, 4, 223, 50, 219, 46, 4, 247,
- 132, 50, 4, 225, 182, 50, 4, 249, 217, 253, 206, 10, 244, 164, 53, 17,
- 10, 217, 44, 2, 244, 164, 48, 10, 248, 183, 53, 17, 10, 217, 78, 244, 1,
- 10, 234, 204, 53, 17, 10, 244, 166, 53, 17, 10, 244, 166, 147, 17, 10,
- 248, 185, 53, 17, 10, 248, 185, 147, 17, 10, 234, 206, 53, 17, 10, 234,
- 206, 147, 17, 10, 220, 94, 53, 17, 10, 220, 94, 147, 17, 10, 218, 46, 53,
- 17, 10, 218, 46, 147, 17, 10, 1, 202, 53, 17, 10, 1, 112, 2, 231, 228,
- 77, 53, 17, 10, 1, 112, 2, 231, 228, 77, 40, 17, 10, 1, 112, 2, 202, 77,
- 53, 17, 10, 1, 112, 2, 202, 77, 40, 17, 10, 1, 212, 31, 2, 202, 77, 53,
- 17, 10, 1, 212, 31, 2, 202, 77, 40, 17, 10, 1, 112, 2, 202, 252, 43, 53,
- 17, 10, 1, 112, 2, 202, 252, 43, 40, 17, 10, 1, 79, 2, 202, 77, 53, 17,
- 10, 1, 79, 2, 202, 77, 40, 17, 10, 1, 79, 2, 202, 77, 65, 17, 10, 1, 79,
- 2, 202, 77, 147, 17, 10, 1, 112, 53, 17, 10, 1, 112, 40, 17, 10, 1, 252,
- 55, 53, 17, 10, 1, 252, 55, 40, 17, 10, 1, 252, 55, 65, 17, 10, 1, 252,
- 55, 147, 17, 10, 1, 217, 8, 231, 165, 53, 17, 10, 1, 217, 8, 231, 165,
- 40, 17, 10, 1, 217, 8, 53, 17, 10, 1, 217, 8, 40, 17, 10, 1, 217, 8, 65,
- 17, 10, 1, 217, 8, 147, 17, 10, 1, 216, 193, 53, 17, 10, 1, 216, 193, 40,
- 17, 10, 1, 216, 193, 65, 17, 10, 1, 216, 193, 147, 17, 10, 1, 151, 53,
- 17, 10, 1, 151, 40, 17, 10, 1, 151, 65, 17, 10, 1, 151, 147, 17, 10, 1,
- 122, 53, 17, 10, 1, 122, 40, 17, 10, 1, 122, 65, 17, 10, 1, 122, 147, 17,
- 10, 1, 234, 130, 53, 17, 10, 1, 234, 130, 40, 17, 10, 1, 234, 130, 65,
- 17, 10, 1, 234, 130, 147, 17, 10, 1, 248, 196, 53, 17, 10, 1, 248, 196,
- 40, 17, 10, 1, 216, 203, 53, 17, 10, 1, 216, 203, 40, 17, 10, 1, 223, 96,
- 53, 17, 10, 1, 223, 96, 40, 17, 10, 1, 210, 109, 53, 17, 10, 1, 210, 109,
- 40, 17, 10, 1, 221, 167, 53, 17, 10, 1, 221, 167, 40, 17, 10, 1, 221,
- 167, 65, 17, 10, 1, 221, 167, 147, 17, 10, 1, 220, 60, 53, 17, 10, 1,
- 220, 60, 40, 17, 10, 1, 220, 60, 65, 17, 10, 1, 220, 60, 147, 17, 10, 1,
- 222, 27, 53, 17, 10, 1, 222, 27, 40, 17, 10, 1, 222, 27, 65, 17, 10, 1,
- 222, 27, 147, 17, 10, 1, 248, 217, 53, 17, 10, 1, 248, 217, 40, 17, 10,
- 1, 248, 217, 65, 17, 10, 1, 248, 217, 147, 17, 10, 1, 217, 81, 53, 17,
- 10, 1, 217, 81, 40, 17, 10, 1, 217, 81, 65, 17, 10, 1, 217, 81, 147, 17,
- 10, 1, 210, 112, 53, 17, 10, 1, 210, 112, 40, 17, 10, 1, 210, 112, 65,
- 17, 10, 1, 210, 112, 147, 17, 10, 1, 254, 197, 53, 17, 10, 1, 254, 197,
- 40, 17, 10, 1, 254, 197, 65, 17, 10, 1, 254, 197, 147, 17, 10, 1, 242,
- 245, 53, 17, 10, 1, 242, 245, 40, 17, 10, 1, 242, 245, 65, 17, 10, 1,
- 242, 245, 147, 17, 10, 1, 244, 143, 53, 17, 10, 1, 244, 143, 40, 17, 10,
- 1, 244, 143, 65, 17, 10, 1, 244, 143, 147, 17, 10, 1, 224, 82, 53, 17,
- 10, 1, 224, 82, 40, 17, 10, 1, 224, 82, 65, 17, 10, 1, 224, 82, 147, 17,
- 10, 1, 234, 251, 53, 17, 10, 1, 234, 251, 40, 17, 10, 1, 234, 251, 65,
- 17, 10, 1, 234, 251, 147, 17, 10, 1, 233, 103, 53, 17, 10, 1, 233, 103,
- 40, 17, 10, 1, 233, 103, 65, 17, 10, 1, 233, 103, 147, 17, 10, 1, 66, 53,
- 17, 10, 1, 66, 40, 17, 10, 1, 66, 65, 17, 10, 1, 66, 147, 17, 10, 1, 228,
- 63, 53, 17, 10, 1, 228, 63, 40, 17, 10, 1, 228, 63, 65, 17, 10, 1, 228,
- 63, 147, 17, 10, 1, 241, 219, 53, 17, 10, 1, 241, 219, 40, 17, 10, 1,
- 241, 219, 65, 17, 10, 1, 241, 219, 147, 17, 10, 1, 212, 31, 53, 17, 10,
- 1, 212, 31, 40, 17, 10, 1, 112, 231, 193, 53, 17, 10, 1, 112, 231, 193,
- 40, 17, 10, 1, 79, 53, 17, 10, 1, 79, 40, 17, 10, 1, 79, 65, 17, 10, 1,
- 79, 147, 17, 10, 27, 233, 103, 2, 112, 2, 231, 228, 77, 53, 17, 10, 27,
- 233, 103, 2, 112, 2, 231, 228, 77, 40, 17, 10, 27, 233, 103, 2, 112, 2,
- 202, 77, 53, 17, 10, 27, 233, 103, 2, 112, 2, 202, 77, 40, 17, 10, 27,
- 233, 103, 2, 112, 2, 202, 252, 43, 53, 17, 10, 27, 233, 103, 2, 112, 2,
- 202, 252, 43, 40, 17, 10, 27, 233, 103, 2, 112, 53, 17, 10, 27, 233, 103,
- 2, 112, 40, 17, 210, 87, 211, 245, 228, 73, 219, 18, 126, 245, 31, 78,
- 126, 223, 254, 78, 126, 54, 50, 126, 247, 132, 50, 126, 225, 182, 50,
- 126, 254, 126, 126, 254, 57, 126, 43, 226, 3, 126, 44, 226, 3, 126, 253,
- 216, 126, 96, 50, 126, 249, 219, 126, 240, 167, 126, 243, 229, 218, 129,
- 126, 219, 46, 126, 21, 210, 86, 126, 21, 110, 126, 21, 105, 126, 21, 158,
- 126, 21, 161, 126, 21, 189, 126, 21, 194, 126, 21, 198, 126, 21, 195,
- 126, 21, 200, 126, 249, 226, 126, 220, 150, 126, 233, 15, 50, 126, 245,
- 98, 50, 126, 242, 130, 50, 126, 224, 13, 78, 126, 249, 217, 253, 206,
- 126, 7, 6, 1, 61, 126, 7, 6, 1, 253, 158, 126, 7, 6, 1, 251, 66, 126, 7,
- 6, 1, 249, 60, 126, 7, 6, 1, 75, 126, 7, 6, 1, 245, 6, 126, 7, 6, 1, 243,
- 202, 126, 7, 6, 1, 242, 60, 126, 7, 6, 1, 73, 126, 7, 6, 1, 235, 144,
- 126, 7, 6, 1, 235, 23, 126, 7, 6, 1, 156, 126, 7, 6, 1, 193, 126, 7, 6,
- 1, 230, 25, 126, 7, 6, 1, 76, 126, 7, 6, 1, 226, 105, 126, 7, 6, 1, 224,
- 96, 126, 7, 6, 1, 153, 126, 7, 6, 1, 222, 91, 126, 7, 6, 1, 217, 152,
- 126, 7, 6, 1, 70, 126, 7, 6, 1, 214, 105, 126, 7, 6, 1, 212, 98, 126, 7,
- 6, 1, 211, 178, 126, 7, 6, 1, 211, 117, 126, 7, 6, 1, 210, 159, 126, 43,
- 42, 127, 126, 223, 50, 219, 46, 126, 44, 42, 127, 126, 250, 31, 255, 14,
- 126, 121, 232, 213, 126, 242, 137, 255, 14, 126, 7, 4, 1, 61, 126, 7, 4,
- 1, 253, 158, 126, 7, 4, 1, 251, 66, 126, 7, 4, 1, 249, 60, 126, 7, 4, 1,
- 75, 126, 7, 4, 1, 245, 6, 126, 7, 4, 1, 243, 202, 126, 7, 4, 1, 242, 60,
- 126, 7, 4, 1, 73, 126, 7, 4, 1, 235, 144, 126, 7, 4, 1, 235, 23, 126, 7,
- 4, 1, 156, 126, 7, 4, 1, 193, 126, 7, 4, 1, 230, 25, 126, 7, 4, 1, 76,
- 126, 7, 4, 1, 226, 105, 126, 7, 4, 1, 224, 96, 126, 7, 4, 1, 153, 126, 7,
- 4, 1, 222, 91, 126, 7, 4, 1, 217, 152, 126, 7, 4, 1, 70, 126, 7, 4, 1,
- 214, 105, 126, 7, 4, 1, 212, 98, 126, 7, 4, 1, 211, 178, 126, 7, 4, 1,
- 211, 117, 126, 7, 4, 1, 210, 159, 126, 43, 249, 99, 127, 126, 67, 232,
- 213, 126, 44, 249, 99, 127, 126, 182, 126, 43, 71, 226, 3, 126, 44, 71,
- 226, 3, 101, 109, 243, 229, 218, 129, 101, 43, 249, 161, 127, 101, 44,
- 249, 161, 127, 101, 109, 249, 219, 101, 56, 230, 224, 247, 120, 101, 56,
- 1, 211, 227, 101, 56, 1, 4, 61, 101, 56, 1, 4, 73, 101, 56, 1, 4, 70,
- 101, 56, 1, 4, 75, 101, 56, 1, 4, 76, 101, 56, 1, 4, 191, 101, 56, 1, 4,
- 210, 212, 101, 56, 1, 4, 210, 244, 101, 56, 1, 4, 215, 118, 101, 234,
- 201, 224, 173, 219, 31, 78, 101, 56, 1, 61, 101, 56, 1, 73, 101, 56, 1,
- 70, 101, 56, 1, 75, 101, 56, 1, 76, 101, 56, 1, 176, 101, 56, 1, 234, 92,
- 101, 56, 1, 233, 217, 101, 56, 1, 234, 182, 101, 56, 1, 234, 28, 101, 56,
- 1, 206, 101, 56, 1, 219, 191, 101, 56, 1, 218, 83, 101, 56, 1, 221, 181,
- 101, 56, 1, 219, 58, 101, 56, 1, 217, 105, 101, 56, 1, 216, 117, 101, 56,
- 1, 215, 118, 101, 56, 1, 217, 22, 101, 56, 1, 111, 101, 56, 1, 197, 101,
- 56, 1, 228, 233, 101, 56, 1, 227, 237, 101, 56, 1, 229, 107, 101, 56, 1,
- 228, 74, 101, 56, 1, 162, 101, 56, 1, 241, 180, 101, 56, 1, 240, 222,
- 101, 56, 1, 241, 238, 101, 56, 1, 241, 68, 101, 56, 1, 184, 101, 56, 1,
- 230, 230, 101, 56, 1, 230, 102, 101, 56, 1, 231, 91, 101, 56, 1, 230,
- 161, 101, 56, 1, 191, 101, 56, 1, 210, 212, 101, 56, 1, 210, 244, 101,
- 56, 1, 205, 101, 56, 1, 223, 35, 101, 56, 1, 222, 140, 101, 56, 1, 223,
- 128, 101, 56, 1, 222, 211, 101, 56, 1, 212, 65, 101, 56, 1, 230, 25, 101,
- 56, 213, 135, 219, 31, 78, 101, 56, 220, 155, 219, 31, 78, 101, 24, 244,
- 103, 101, 24, 1, 234, 58, 101, 24, 1, 218, 215, 101, 24, 1, 234, 51, 101,
- 24, 1, 228, 226, 101, 24, 1, 228, 224, 101, 24, 1, 228, 223, 101, 24, 1,
- 216, 101, 101, 24, 1, 218, 204, 101, 24, 1, 223, 26, 101, 24, 1, 223, 21,
- 101, 24, 1, 223, 18, 101, 24, 1, 223, 11, 101, 24, 1, 223, 6, 101, 24, 1,
- 223, 1, 101, 24, 1, 223, 12, 101, 24, 1, 223, 24, 101, 24, 1, 230, 217,
- 101, 24, 1, 225, 95, 101, 24, 1, 218, 212, 101, 24, 1, 225, 84, 101, 24,
- 1, 219, 148, 101, 24, 1, 218, 209, 101, 24, 1, 236, 56, 101, 24, 1, 250,
- 46, 101, 24, 1, 218, 219, 101, 24, 1, 250, 106, 101, 24, 1, 234, 110,
- 101, 24, 1, 216, 173, 101, 24, 1, 225, 131, 101, 24, 1, 241, 172, 101,
- 24, 1, 61, 101, 24, 1, 254, 243, 101, 24, 1, 191, 101, 24, 1, 211, 92,
- 101, 24, 1, 245, 117, 101, 24, 1, 75, 101, 24, 1, 211, 36, 101, 24, 1,
- 211, 47, 101, 24, 1, 76, 101, 24, 1, 212, 65, 101, 24, 1, 212, 62, 101,
- 24, 1, 226, 234, 101, 24, 1, 210, 244, 101, 24, 1, 70, 101, 24, 1, 212,
- 11, 101, 24, 1, 212, 22, 101, 24, 1, 211, 250, 101, 24, 1, 210, 212, 101,
- 24, 1, 245, 55, 101, 24, 1, 211, 8, 101, 24, 1, 73, 126, 250, 176, 50,
- 126, 224, 228, 50, 126, 228, 52, 50, 126, 231, 232, 126, 251, 135, 130,
- 126, 211, 40, 50, 126, 211, 217, 50, 101, 244, 18, 192, 213, 239, 101,
- 140, 74, 101, 214, 153, 74, 101, 97, 74, 101, 246, 104, 74, 101, 85, 218,
- 234, 101, 71, 250, 35, 235, 204, 254, 99, 254, 120, 235, 204, 254, 99,
- 220, 137, 235, 204, 254, 99, 216, 236, 226, 249, 223, 72, 250, 142, 223,
- 72, 250, 142, 62, 57, 3, 253, 142, 61, 62, 57, 3, 253, 111, 75, 62, 57,
- 3, 253, 120, 73, 62, 57, 3, 253, 88, 76, 62, 57, 3, 253, 138, 70, 62, 57,
- 3, 253, 157, 248, 221, 62, 57, 3, 253, 104, 248, 90, 62, 57, 3, 253, 144,
- 248, 3, 62, 57, 3, 253, 134, 247, 145, 62, 57, 3, 253, 98, 246, 78, 62,
- 57, 3, 253, 92, 235, 141, 62, 57, 3, 253, 103, 235, 126, 62, 57, 3, 253,
- 113, 235, 68, 62, 57, 3, 253, 84, 235, 51, 62, 57, 3, 253, 72, 176, 62,
- 57, 3, 253, 105, 234, 182, 62, 57, 3, 253, 82, 234, 92, 62, 57, 3, 253,
- 79, 234, 28, 62, 57, 3, 253, 68, 233, 217, 62, 57, 3, 253, 69, 184, 62,
- 57, 3, 253, 135, 231, 91, 62, 57, 3, 253, 76, 230, 230, 62, 57, 3, 253,
- 133, 230, 161, 62, 57, 3, 253, 125, 230, 102, 62, 57, 3, 253, 146, 197,
- 62, 57, 3, 253, 124, 229, 107, 62, 57, 3, 253, 118, 228, 233, 62, 57, 3,
- 253, 97, 228, 74, 62, 57, 3, 253, 94, 227, 237, 62, 57, 3, 253, 153, 190,
- 62, 57, 3, 253, 77, 225, 221, 62, 57, 3, 253, 110, 225, 108, 62, 57, 3,
- 253, 137, 225, 16, 62, 57, 3, 253, 99, 224, 150, 62, 57, 3, 253, 132,
- 224, 88, 62, 57, 3, 253, 71, 224, 69, 62, 57, 3, 253, 127, 224, 53, 62,
- 57, 3, 253, 116, 224, 42, 62, 57, 3, 253, 89, 205, 62, 57, 3, 253, 121,
- 223, 128, 62, 57, 3, 253, 96, 223, 35, 62, 57, 3, 253, 155, 222, 211, 62,
- 57, 3, 253, 122, 222, 140, 62, 57, 3, 253, 117, 206, 62, 57, 3, 253, 140,
- 221, 181, 62, 57, 3, 253, 108, 219, 191, 62, 57, 3, 253, 136, 219, 58,
- 62, 57, 3, 253, 91, 218, 83, 62, 57, 3, 253, 90, 217, 105, 62, 57, 3,
- 253, 151, 217, 22, 62, 57, 3, 253, 112, 216, 117, 62, 57, 3, 253, 149,
- 111, 62, 57, 3, 253, 80, 215, 118, 62, 57, 3, 253, 95, 212, 65, 62, 57,
- 3, 253, 74, 212, 22, 62, 57, 3, 253, 109, 211, 250, 62, 57, 3, 253, 107,
- 211, 227, 62, 57, 3, 253, 131, 210, 116, 62, 57, 3, 253, 75, 210, 94, 62,
- 57, 3, 253, 128, 210, 23, 62, 57, 3, 253, 123, 255, 75, 62, 57, 3, 253,
- 106, 255, 74, 62, 57, 3, 253, 65, 253, 192, 62, 57, 3, 253, 78, 246, 46,
- 62, 57, 3, 253, 61, 246, 45, 62, 57, 3, 253, 101, 227, 174, 62, 57, 3,
- 253, 119, 224, 148, 62, 57, 3, 253, 87, 224, 152, 62, 57, 3, 253, 73,
- 223, 186, 62, 57, 3, 253, 115, 223, 185, 62, 57, 3, 253, 81, 222, 210,
- 62, 57, 3, 253, 83, 217, 102, 62, 57, 3, 253, 63, 215, 78, 62, 57, 3,
- 253, 60, 105, 62, 57, 16, 253, 130, 62, 57, 16, 253, 129, 62, 57, 16,
- 253, 126, 62, 57, 16, 253, 114, 62, 57, 16, 253, 102, 62, 57, 16, 253,
- 100, 62, 57, 16, 253, 93, 62, 57, 16, 253, 86, 62, 57, 16, 253, 85, 62,
- 57, 16, 253, 70, 62, 57, 16, 253, 67, 62, 57, 16, 253, 66, 62, 57, 16,
- 253, 64, 62, 57, 16, 253, 62, 62, 57, 106, 253, 59, 231, 185, 62, 57,
- 106, 253, 58, 211, 221, 62, 57, 106, 253, 57, 248, 74, 62, 57, 106, 253,
- 56, 245, 95, 62, 57, 106, 253, 55, 231, 159, 62, 57, 106, 253, 54, 218,
- 162, 62, 57, 106, 253, 53, 245, 37, 62, 57, 106, 253, 52, 223, 153, 62,
- 57, 106, 253, 51, 220, 62, 62, 57, 106, 253, 50, 241, 237, 62, 57, 106,
- 253, 49, 219, 25, 62, 57, 106, 253, 48, 251, 203, 62, 57, 106, 253, 47,
- 249, 145, 62, 57, 106, 253, 46, 251, 115, 62, 57, 106, 253, 45, 212, 2,
- 62, 57, 106, 253, 44, 252, 136, 62, 57, 106, 253, 43, 226, 205, 62, 57,
- 106, 253, 42, 218, 254, 62, 57, 106, 253, 41, 249, 68, 62, 57, 230, 142,
- 253, 40, 234, 224, 62, 57, 230, 142, 253, 39, 234, 232, 62, 57, 106, 253,
- 38, 226, 218, 62, 57, 106, 253, 37, 211, 236, 62, 57, 106, 253, 36, 62,
- 57, 230, 142, 253, 35, 254, 17, 62, 57, 230, 142, 253, 34, 231, 52, 62,
- 57, 106, 253, 33, 251, 134, 62, 57, 106, 253, 32, 242, 166, 62, 57, 106,
- 253, 31, 62, 57, 106, 253, 30, 211, 212, 62, 57, 106, 253, 29, 62, 57,
- 106, 253, 28, 62, 57, 106, 253, 27, 240, 248, 62, 57, 106, 253, 26, 62,
- 57, 106, 253, 25, 62, 57, 106, 253, 24, 62, 57, 230, 142, 253, 22, 215,
- 92, 62, 57, 106, 253, 21, 62, 57, 106, 253, 20, 62, 57, 106, 253, 19,
- 249, 250, 62, 57, 106, 253, 18, 62, 57, 106, 253, 17, 62, 57, 106, 253,
- 16, 243, 93, 62, 57, 106, 253, 15, 254, 4, 62, 57, 106, 253, 14, 62, 57,
- 106, 253, 13, 62, 57, 106, 253, 12, 62, 57, 106, 253, 11, 62, 57, 106,
- 253, 10, 62, 57, 106, 253, 9, 62, 57, 106, 253, 8, 62, 57, 106, 253, 7,
- 62, 57, 106, 253, 6, 62, 57, 106, 253, 5, 230, 134, 62, 57, 106, 253, 4,
- 62, 57, 106, 253, 3, 215, 235, 62, 57, 106, 253, 2, 62, 57, 106, 253, 1,
- 62, 57, 106, 253, 0, 62, 57, 106, 252, 255, 62, 57, 106, 252, 254, 62,
- 57, 106, 252, 253, 62, 57, 106, 252, 252, 62, 57, 106, 252, 251, 62, 57,
- 106, 252, 250, 62, 57, 106, 252, 249, 62, 57, 106, 252, 248, 62, 57, 106,
- 252, 247, 241, 211, 62, 57, 106, 252, 226, 244, 28, 62, 57, 106, 252,
- 223, 252, 116, 62, 57, 106, 252, 218, 219, 5, 62, 57, 106, 252, 217, 74,
- 62, 57, 106, 252, 216, 62, 57, 106, 252, 215, 217, 236, 62, 57, 106, 252,
- 214, 62, 57, 106, 252, 213, 62, 57, 106, 252, 212, 211, 254, 250, 139,
- 62, 57, 106, 252, 211, 250, 139, 62, 57, 106, 252, 210, 250, 140, 243,
- 255, 62, 57, 106, 252, 209, 212, 0, 62, 57, 106, 252, 208, 62, 57, 106,
- 252, 207, 62, 57, 230, 142, 252, 206, 247, 198, 62, 57, 106, 252, 205,
- 62, 57, 106, 252, 204, 62, 57, 106, 252, 202, 62, 57, 106, 252, 201, 62,
- 57, 106, 252, 200, 62, 57, 106, 252, 199, 248, 159, 62, 57, 106, 252,
- 198, 62, 57, 106, 252, 197, 62, 57, 106, 252, 196, 62, 57, 106, 252, 195,
- 62, 57, 106, 252, 194, 62, 57, 106, 213, 186, 253, 23, 62, 57, 106, 213,
- 186, 252, 246, 62, 57, 106, 213, 186, 252, 245, 62, 57, 106, 213, 186,
- 252, 244, 62, 57, 106, 213, 186, 252, 243, 62, 57, 106, 213, 186, 252,
- 242, 62, 57, 106, 213, 186, 252, 241, 62, 57, 106, 213, 186, 252, 240,
- 62, 57, 106, 213, 186, 252, 239, 62, 57, 106, 213, 186, 252, 238, 62, 57,
- 106, 213, 186, 252, 237, 62, 57, 106, 213, 186, 252, 236, 62, 57, 106,
- 213, 186, 252, 235, 62, 57, 106, 213, 186, 252, 234, 62, 57, 106, 213,
- 186, 252, 233, 62, 57, 106, 213, 186, 252, 232, 62, 57, 106, 213, 186,
- 252, 231, 62, 57, 106, 213, 186, 252, 230, 62, 57, 106, 213, 186, 252,
- 229, 62, 57, 106, 213, 186, 252, 228, 62, 57, 106, 213, 186, 252, 227,
- 62, 57, 106, 213, 186, 252, 225, 62, 57, 106, 213, 186, 252, 224, 62, 57,
- 106, 213, 186, 252, 222, 62, 57, 106, 213, 186, 252, 221, 62, 57, 106,
- 213, 186, 252, 220, 62, 57, 106, 213, 186, 252, 219, 62, 57, 106, 213,
- 186, 252, 203, 62, 57, 106, 213, 186, 252, 193, 254, 236, 211, 209, 220,
- 138, 232, 213, 254, 236, 211, 209, 220, 138, 247, 120, 254, 236, 250,
- 130, 78, 254, 236, 54, 110, 254, 236, 54, 105, 254, 236, 54, 158, 254,
- 236, 54, 161, 254, 236, 54, 189, 254, 236, 54, 194, 254, 236, 54, 198,
- 254, 236, 54, 195, 254, 236, 54, 200, 254, 236, 54, 216, 247, 254, 236,
- 54, 215, 73, 254, 236, 54, 216, 162, 254, 236, 54, 244, 15, 254, 236, 54,
- 244, 114, 254, 236, 54, 219, 111, 254, 236, 54, 220, 116, 254, 236, 54,
- 245, 184, 254, 236, 54, 228, 195, 254, 236, 54, 123, 240, 210, 254, 236,
- 54, 113, 240, 210, 254, 236, 54, 134, 240, 210, 254, 236, 54, 244, 11,
- 240, 210, 254, 236, 54, 244, 81, 240, 210, 254, 236, 54, 219, 125, 240,
- 210, 254, 236, 54, 220, 122, 240, 210, 254, 236, 54, 245, 193, 240, 210,
- 254, 236, 54, 228, 200, 240, 210, 254, 236, 54, 123, 216, 147, 254, 236,
- 54, 113, 216, 147, 254, 236, 54, 134, 216, 147, 254, 236, 54, 244, 11,
- 216, 147, 254, 236, 54, 244, 81, 216, 147, 254, 236, 54, 219, 125, 216,
- 147, 254, 236, 54, 220, 122, 216, 147, 254, 236, 54, 245, 193, 216, 147,
- 254, 236, 54, 228, 200, 216, 147, 254, 236, 54, 216, 248, 216, 147, 254,
- 236, 54, 215, 74, 216, 147, 254, 236, 54, 216, 163, 216, 147, 254, 236,
- 54, 244, 16, 216, 147, 254, 236, 54, 244, 115, 216, 147, 254, 236, 54,
- 219, 112, 216, 147, 254, 236, 54, 220, 117, 216, 147, 254, 236, 54, 245,
- 185, 216, 147, 254, 236, 54, 228, 196, 216, 147, 254, 236, 212, 14, 252,
- 128, 214, 173, 254, 236, 212, 14, 244, 92, 218, 59, 254, 236, 212, 14,
- 221, 176, 218, 59, 254, 236, 212, 14, 216, 169, 218, 59, 254, 236, 212,
- 14, 244, 4, 218, 59, 254, 236, 246, 81, 231, 90, 244, 92, 218, 59, 254,
- 236, 232, 199, 231, 90, 244, 92, 218, 59, 254, 236, 231, 90, 221, 176,
- 218, 59, 254, 236, 231, 90, 216, 169, 218, 59, 26, 255, 6, 253, 194, 123,
- 224, 21, 26, 255, 6, 253, 194, 123, 242, 27, 26, 255, 6, 253, 194, 123,
- 246, 100, 26, 255, 6, 253, 194, 189, 26, 255, 6, 253, 194, 244, 114, 26,
- 255, 6, 253, 194, 244, 81, 240, 210, 26, 255, 6, 253, 194, 244, 81, 216,
- 147, 26, 255, 6, 253, 194, 244, 115, 216, 147, 26, 255, 6, 253, 194, 244,
- 81, 217, 67, 26, 255, 6, 253, 194, 216, 248, 217, 67, 26, 255, 6, 253,
- 194, 244, 115, 217, 67, 26, 255, 6, 253, 194, 123, 240, 211, 217, 67, 26,
- 255, 6, 253, 194, 244, 81, 240, 211, 217, 67, 26, 255, 6, 253, 194, 123,
- 216, 148, 217, 67, 26, 255, 6, 253, 194, 244, 81, 216, 148, 217, 67, 26,
- 255, 6, 253, 194, 244, 81, 218, 150, 26, 255, 6, 253, 194, 216, 248, 218,
- 150, 26, 255, 6, 253, 194, 244, 115, 218, 150, 26, 255, 6, 253, 194, 123,
- 240, 211, 218, 150, 26, 255, 6, 253, 194, 244, 81, 240, 211, 218, 150,
- 26, 255, 6, 253, 194, 123, 216, 148, 218, 150, 26, 255, 6, 253, 194, 216,
- 248, 216, 148, 218, 150, 26, 255, 6, 253, 194, 244, 115, 216, 148, 218,
- 150, 26, 255, 6, 253, 194, 216, 248, 230, 164, 26, 255, 6, 241, 205, 123,
- 225, 31, 26, 255, 6, 216, 181, 110, 26, 255, 6, 241, 201, 110, 26, 255,
- 6, 245, 104, 105, 26, 255, 6, 216, 181, 105, 26, 255, 6, 249, 65, 113,
- 246, 99, 26, 255, 6, 245, 104, 113, 246, 99, 26, 255, 6, 215, 203, 189,
- 26, 255, 6, 215, 203, 216, 247, 26, 255, 6, 215, 203, 216, 248, 254, 141,
- 17, 26, 255, 6, 241, 201, 216, 247, 26, 255, 6, 231, 41, 216, 247, 26,
- 255, 6, 216, 181, 216, 247, 26, 255, 6, 216, 181, 216, 162, 26, 255, 6,
- 215, 203, 244, 114, 26, 255, 6, 215, 203, 244, 115, 254, 141, 17, 26,
- 255, 6, 241, 201, 244, 114, 26, 255, 6, 216, 181, 244, 114, 26, 255, 6,
- 216, 181, 123, 240, 210, 26, 255, 6, 216, 181, 134, 240, 210, 26, 255, 6,
- 245, 104, 244, 81, 240, 210, 26, 255, 6, 215, 203, 244, 81, 240, 210, 26,
- 255, 6, 216, 181, 244, 81, 240, 210, 26, 255, 6, 250, 227, 244, 81, 240,
- 210, 26, 255, 6, 229, 182, 244, 81, 240, 210, 26, 255, 6, 216, 181, 123,
- 216, 147, 26, 255, 6, 216, 181, 244, 81, 216, 147, 26, 255, 6, 248, 57,
- 244, 81, 230, 164, 26, 255, 6, 218, 118, 244, 115, 230, 164, 26, 123,
- 163, 50, 26, 123, 163, 5, 254, 141, 17, 26, 113, 216, 167, 50, 26, 134,
- 224, 20, 50, 26, 211, 45, 50, 26, 217, 68, 50, 26, 246, 101, 50, 26, 226,
- 246, 50, 26, 113, 226, 245, 50, 26, 134, 226, 245, 50, 26, 244, 11, 226,
- 245, 50, 26, 244, 81, 226, 245, 50, 26, 231, 35, 50, 26, 233, 157, 252,
- 128, 50, 26, 232, 194, 50, 26, 226, 131, 50, 26, 211, 159, 50, 26, 253,
- 243, 50, 26, 254, 0, 50, 26, 242, 144, 50, 26, 215, 186, 252, 128, 50,
- 26, 210, 87, 50, 222, 198, 220, 113, 50, 222, 198, 214, 185, 50, 222,
- 198, 220, 142, 50, 222, 198, 220, 111, 50, 222, 198, 247, 213, 220, 111,
- 50, 222, 198, 219, 168, 50, 222, 198, 248, 53, 50, 222, 198, 224, 6, 50,
- 222, 198, 220, 129, 50, 222, 198, 246, 60, 50, 222, 198, 253, 238, 50,
- 222, 198, 250, 171, 50, 225, 143, 247, 191, 5, 225, 213, 225, 143, 247,
- 191, 5, 225, 24, 241, 235, 225, 143, 247, 191, 5, 217, 45, 241, 235, 225,
- 143, 247, 191, 5, 250, 247, 225, 143, 247, 191, 5, 250, 101, 225, 143,
- 247, 191, 5, 211, 221, 225, 143, 247, 191, 5, 241, 211, 225, 143, 247,
- 191, 5, 243, 85, 225, 143, 247, 191, 5, 216, 116, 225, 143, 247, 191, 5,
- 74, 225, 143, 247, 191, 5, 251, 169, 225, 143, 247, 191, 5, 220, 29, 225,
- 143, 247, 191, 5, 249, 244, 225, 143, 247, 191, 5, 231, 184, 225, 143,
- 247, 191, 5, 231, 136, 225, 143, 247, 191, 5, 221, 216, 225, 143, 247,
- 191, 5, 232, 237, 225, 143, 247, 191, 5, 251, 188, 225, 143, 247, 191, 5,
- 250, 231, 225, 35, 225, 143, 247, 191, 5, 247, 133, 225, 143, 247, 191,
- 5, 249, 223, 225, 143, 247, 191, 5, 219, 87, 225, 143, 247, 191, 5, 249,
- 224, 225, 143, 247, 191, 5, 252, 63, 225, 143, 247, 191, 5, 220, 16, 225,
- 143, 247, 191, 5, 240, 248, 225, 143, 247, 191, 5, 241, 178, 225, 143,
- 247, 191, 5, 251, 112, 233, 36, 225, 143, 247, 191, 5, 250, 224, 225,
- 143, 247, 191, 5, 223, 153, 225, 143, 247, 191, 5, 245, 230, 225, 143,
- 247, 191, 5, 246, 107, 225, 143, 247, 191, 5, 215, 105, 225, 143, 247,
- 191, 5, 252, 66, 225, 143, 247, 191, 5, 225, 36, 215, 235, 225, 143, 247,
- 191, 5, 213, 159, 225, 143, 247, 191, 5, 226, 18, 225, 143, 247, 191, 5,
- 222, 190, 225, 143, 247, 191, 5, 232, 224, 225, 143, 247, 191, 5, 226,
- 115, 252, 184, 225, 143, 247, 191, 5, 244, 48, 225, 143, 247, 191, 5,
- 242, 138, 225, 143, 247, 191, 5, 218, 119, 225, 143, 247, 191, 5, 4, 253,
- 168, 225, 143, 247, 191, 5, 212, 32, 252, 148, 225, 143, 247, 191, 5, 38,
- 226, 248, 91, 232, 60, 1, 61, 232, 60, 1, 75, 232, 60, 1, 253, 158, 232,
- 60, 1, 252, 19, 232, 60, 1, 243, 202, 232, 60, 1, 249, 60, 232, 60, 1,
- 73, 232, 60, 1, 212, 98, 232, 60, 1, 210, 159, 232, 60, 1, 216, 210, 232,
- 60, 1, 235, 144, 232, 60, 1, 235, 23, 232, 60, 1, 224, 96, 232, 60, 1,
- 156, 232, 60, 1, 193, 232, 60, 1, 230, 25, 232, 60, 1, 230, 166, 232, 60,
- 1, 228, 111, 232, 60, 1, 70, 232, 60, 1, 226, 105, 232, 60, 1, 234, 47,
- 232, 60, 1, 153, 232, 60, 1, 222, 91, 232, 60, 1, 217, 152, 232, 60, 1,
- 215, 159, 232, 60, 1, 254, 123, 232, 60, 1, 245, 150, 232, 60, 1, 242,
- 60, 232, 60, 1, 211, 178, 250, 237, 1, 61, 250, 237, 1, 226, 91, 250,
- 237, 1, 249, 60, 250, 237, 1, 156, 250, 237, 1, 214, 116, 250, 237, 1,
- 153, 250, 237, 1, 233, 62, 250, 237, 1, 255, 75, 250, 237, 1, 224, 96,
- 250, 237, 1, 253, 158, 250, 237, 1, 193, 250, 237, 1, 76, 250, 237, 1,
- 248, 223, 250, 237, 1, 217, 152, 250, 237, 1, 220, 104, 250, 237, 1, 220,
- 103, 250, 237, 1, 222, 91, 250, 237, 1, 251, 65, 250, 237, 1, 70, 250,
- 237, 1, 228, 111, 250, 237, 1, 211, 178, 250, 237, 1, 230, 25, 250, 237,
- 1, 215, 158, 250, 237, 1, 226, 105, 250, 237, 1, 218, 226, 250, 237, 1,
- 73, 250, 237, 1, 75, 250, 237, 1, 214, 113, 250, 237, 1, 235, 23, 250,
- 237, 1, 235, 14, 250, 237, 1, 229, 150, 250, 237, 1, 214, 118, 250, 237,
- 1, 243, 202, 250, 237, 1, 243, 137, 250, 237, 1, 218, 168, 250, 237, 1,
- 218, 167, 250, 237, 1, 229, 79, 250, 237, 1, 236, 33, 250, 237, 1, 251,
- 64, 250, 237, 1, 215, 159, 250, 237, 1, 214, 115, 250, 237, 1, 222, 180,
- 250, 237, 1, 231, 129, 250, 237, 1, 231, 128, 250, 237, 1, 231, 127, 250,
- 237, 1, 231, 126, 250, 237, 1, 233, 61, 250, 237, 1, 245, 234, 250, 237,
- 1, 214, 114, 55, 32, 1, 61, 55, 32, 1, 252, 75, 55, 32, 1, 234, 182, 55,
- 32, 1, 248, 90, 55, 32, 1, 75, 55, 32, 1, 213, 255, 55, 32, 1, 210, 94,
- 55, 32, 1, 241, 238, 55, 32, 1, 216, 195, 55, 32, 1, 73, 55, 32, 1, 176,
- 55, 32, 1, 245, 174, 55, 32, 1, 245, 159, 55, 32, 1, 245, 150, 55, 32, 1,
- 245, 75, 55, 32, 1, 76, 55, 32, 1, 225, 221, 55, 32, 1, 220, 63, 55, 32,
- 1, 233, 217, 55, 32, 1, 245, 92, 55, 32, 1, 245, 82, 55, 32, 1, 217, 22,
- 55, 32, 1, 70, 55, 32, 1, 245, 177, 55, 32, 1, 225, 136, 55, 32, 1, 234,
- 119, 55, 32, 1, 245, 202, 55, 32, 1, 245, 84, 55, 32, 1, 250, 131, 55,
- 32, 1, 236, 33, 55, 32, 1, 214, 118, 55, 32, 227, 198, 110, 55, 32, 227,
- 198, 189, 55, 32, 227, 198, 216, 247, 55, 32, 227, 198, 244, 114, 242,
- 153, 1, 254, 204, 242, 153, 1, 252, 163, 242, 153, 1, 242, 211, 242, 153,
- 1, 248, 204, 242, 153, 1, 254, 200, 242, 153, 1, 224, 79, 242, 153, 1,
- 235, 155, 242, 153, 1, 242, 39, 242, 153, 1, 216, 158, 242, 153, 1, 245,
- 183, 242, 153, 1, 233, 190, 242, 153, 1, 233, 113, 242, 153, 1, 231, 179,
- 242, 153, 1, 229, 184, 242, 153, 1, 235, 119, 242, 153, 1, 214, 136, 242,
- 153, 1, 226, 69, 242, 153, 1, 228, 195, 242, 153, 1, 223, 165, 242, 153,
- 1, 221, 218, 242, 153, 1, 217, 4, 242, 153, 1, 211, 234, 242, 153, 1,
- 244, 178, 242, 153, 1, 236, 37, 242, 153, 1, 240, 199, 242, 153, 1, 226,
- 139, 242, 153, 1, 228, 200, 240, 210, 214, 209, 1, 254, 147, 214, 209, 1,
- 252, 26, 214, 209, 1, 243, 108, 214, 209, 1, 234, 132, 214, 209, 1, 248,
- 54, 214, 209, 1, 241, 68, 214, 209, 1, 211, 227, 214, 209, 1, 210, 85,
- 214, 209, 1, 240, 241, 214, 209, 1, 216, 230, 214, 209, 1, 210, 233, 214,
- 209, 1, 234, 250, 214, 209, 1, 220, 20, 214, 209, 1, 233, 98, 214, 209,
- 1, 231, 65, 214, 209, 1, 248, 21, 214, 209, 1, 227, 194, 214, 209, 1,
- 210, 13, 214, 209, 1, 221, 248, 214, 209, 1, 254, 196, 214, 209, 1, 224,
- 150, 214, 209, 1, 222, 25, 214, 209, 1, 224, 35, 214, 209, 1, 223, 144,
- 214, 209, 1, 216, 199, 214, 209, 1, 242, 244, 214, 209, 1, 111, 214, 209,
- 1, 73, 214, 209, 1, 70, 214, 209, 1, 218, 179, 214, 209, 211, 209, 247,
- 172, 55, 225, 169, 5, 61, 55, 225, 169, 5, 73, 55, 225, 169, 5, 70, 55,
- 225, 169, 5, 176, 55, 225, 169, 5, 233, 217, 55, 225, 169, 5, 243, 135,
- 55, 225, 169, 5, 242, 113, 55, 225, 169, 5, 211, 165, 55, 225, 169, 5,
- 251, 33, 55, 225, 169, 5, 235, 141, 55, 225, 169, 5, 235, 108, 55, 225,
- 169, 5, 217, 105, 55, 225, 169, 5, 215, 118, 55, 225, 169, 5, 248, 221,
- 55, 225, 169, 5, 248, 3, 55, 225, 169, 5, 246, 78, 55, 225, 169, 5, 216,
- 208, 55, 225, 169, 5, 190, 55, 225, 169, 5, 252, 191, 55, 225, 169, 5,
- 244, 196, 55, 225, 169, 5, 197, 55, 225, 169, 5, 227, 237, 55, 225, 169,
- 5, 184, 55, 225, 169, 5, 230, 230, 55, 225, 169, 5, 230, 102, 55, 225,
- 169, 5, 191, 55, 225, 169, 5, 214, 27, 55, 225, 169, 5, 213, 176, 55,
- 225, 169, 5, 205, 55, 225, 169, 5, 222, 140, 55, 225, 169, 5, 233, 135,
- 55, 225, 169, 5, 206, 55, 225, 169, 5, 210, 116, 55, 225, 169, 5, 220,
- 102, 55, 225, 169, 5, 218, 223, 55, 225, 169, 5, 162, 55, 225, 169, 5,
- 253, 186, 55, 225, 169, 5, 253, 185, 55, 225, 169, 5, 253, 184, 55, 225,
- 169, 5, 211, 142, 55, 225, 169, 5, 248, 200, 55, 225, 169, 5, 248, 199,
- 55, 225, 169, 5, 252, 170, 55, 225, 169, 5, 251, 85, 55, 225, 169, 211,
- 209, 247, 172, 55, 225, 169, 54, 110, 55, 225, 169, 54, 105, 55, 225,
- 169, 54, 216, 247, 55, 225, 169, 54, 215, 73, 55, 225, 169, 54, 240, 210,
+ 151, 2, 79, 40, 17, 10, 27, 244, 144, 2, 66, 2, 79, 40, 17, 10, 27, 252,
+ 56, 2, 122, 2, 79, 40, 17, 10, 27, 234, 252, 2, 66, 2, 66, 65, 17, 10,
+ 27, 254, 198, 2, 151, 2, 66, 65, 17, 10, 27, 222, 28, 2, 66, 2, 66, 65,
+ 17, 10, 27, 221, 168, 2, 234, 131, 2, 79, 40, 17, 10, 27, 228, 64, 2,
+ 151, 2, 79, 40, 17, 10, 27, 222, 5, 214, 128, 253, 239, 234, 5, 218, 131,
+ 5, 53, 17, 10, 27, 224, 79, 214, 128, 253, 239, 234, 5, 218, 131, 5, 53,
+ 17, 10, 27, 254, 154, 53, 17, 10, 27, 254, 184, 53, 17, 10, 27, 230, 154,
+ 53, 17, 10, 27, 222, 6, 53, 17, 10, 27, 223, 144, 53, 17, 10, 27, 254,
+ 173, 53, 17, 10, 27, 212, 49, 53, 17, 10, 27, 222, 5, 53, 17, 10, 27,
+ 222, 4, 254, 173, 212, 48, 10, 27, 235, 135, 223, 35, 50, 10, 27, 251,
+ 231, 254, 40, 254, 41, 45, 221, 157, 45, 221, 46, 45, 220, 234, 45, 220,
+ 223, 45, 220, 212, 45, 220, 201, 45, 220, 190, 45, 220, 179, 45, 220,
+ 168, 45, 221, 156, 45, 221, 145, 45, 221, 134, 45, 221, 123, 45, 221,
+ 112, 45, 221, 101, 45, 221, 90, 224, 195, 244, 21, 31, 67, 249, 220, 224,
+ 195, 244, 21, 31, 67, 109, 249, 220, 224, 195, 244, 21, 31, 67, 109, 243,
+ 230, 218, 130, 224, 195, 244, 21, 31, 67, 249, 227, 224, 195, 244, 21,
+ 31, 67, 220, 151, 224, 195, 244, 21, 31, 67, 245, 32, 78, 224, 195, 244,
+ 21, 31, 67, 224, 14, 78, 224, 195, 244, 21, 31, 67, 43, 71, 233, 21, 127,
+ 224, 195, 244, 21, 31, 67, 44, 71, 233, 21, 251, 157, 224, 195, 244, 21,
+ 31, 67, 203, 245, 164, 38, 27, 43, 242, 28, 38, 27, 44, 242, 28, 38, 52,
+ 216, 90, 43, 242, 28, 38, 52, 216, 90, 44, 242, 28, 38, 231, 234, 43,
+ 242, 28, 38, 231, 234, 44, 242, 28, 38, 249, 198, 231, 233, 224, 195,
+ 244, 21, 31, 67, 113, 59, 233, 57, 224, 195, 244, 21, 31, 67, 245, 161,
+ 248, 157, 224, 195, 244, 21, 31, 67, 245, 152, 248, 157, 224, 195, 244,
+ 21, 31, 67, 121, 232, 214, 224, 195, 244, 21, 31, 67, 212, 32, 121, 232,
+ 214, 224, 195, 244, 21, 31, 67, 43, 226, 4, 224, 195, 244, 21, 31, 67,
+ 44, 226, 4, 224, 195, 244, 21, 31, 67, 43, 249, 100, 127, 224, 195, 244,
+ 21, 31, 67, 44, 249, 100, 127, 224, 195, 244, 21, 31, 67, 43, 216, 7,
+ 220, 54, 127, 224, 195, 244, 21, 31, 67, 44, 216, 7, 220, 54, 127, 224,
+ 195, 244, 21, 31, 67, 43, 85, 233, 21, 127, 224, 195, 244, 21, 31, 67,
+ 44, 85, 233, 21, 127, 224, 195, 244, 21, 31, 67, 43, 52, 254, 111, 127,
+ 224, 195, 244, 21, 31, 67, 44, 52, 254, 111, 127, 224, 195, 244, 21, 31,
+ 67, 43, 254, 111, 127, 224, 195, 244, 21, 31, 67, 44, 254, 111, 127, 224,
+ 195, 244, 21, 31, 67, 43, 249, 162, 127, 224, 195, 244, 21, 31, 67, 44,
+ 249, 162, 127, 224, 195, 244, 21, 31, 67, 43, 71, 249, 162, 127, 224,
+ 195, 244, 21, 31, 67, 44, 71, 249, 162, 127, 220, 132, 247, 121, 71, 220,
+ 132, 247, 121, 224, 195, 244, 21, 31, 67, 43, 42, 127, 224, 195, 244, 21,
+ 31, 67, 44, 42, 127, 248, 156, 226, 120, 250, 173, 226, 120, 212, 32,
+ 226, 120, 52, 212, 32, 226, 120, 248, 156, 121, 232, 214, 250, 173, 121,
+ 232, 214, 212, 32, 121, 232, 214, 4, 249, 220, 4, 109, 249, 220, 4, 243,
+ 230, 218, 130, 4, 220, 151, 4, 249, 227, 4, 224, 14, 78, 4, 245, 32, 78,
+ 4, 245, 161, 248, 157, 4, 43, 226, 4, 4, 44, 226, 4, 4, 43, 249, 100,
+ 127, 4, 44, 249, 100, 127, 4, 43, 216, 7, 220, 54, 127, 4, 44, 216, 7,
+ 220, 54, 127, 4, 54, 50, 4, 254, 127, 4, 253, 217, 4, 96, 50, 4, 240,
+ 168, 4, 233, 16, 50, 4, 242, 131, 50, 4, 245, 99, 50, 4, 223, 51, 219,
+ 47, 4, 247, 133, 50, 4, 225, 183, 50, 4, 249, 218, 253, 207, 10, 244,
+ 165, 53, 17, 10, 217, 45, 2, 244, 165, 48, 10, 248, 184, 53, 17, 10, 217,
+ 79, 244, 2, 10, 234, 205, 53, 17, 10, 244, 167, 53, 17, 10, 244, 167,
+ 147, 17, 10, 248, 186, 53, 17, 10, 248, 186, 147, 17, 10, 234, 207, 53,
+ 17, 10, 234, 207, 147, 17, 10, 220, 95, 53, 17, 10, 220, 95, 147, 17, 10,
+ 218, 47, 53, 17, 10, 218, 47, 147, 17, 10, 1, 202, 53, 17, 10, 1, 112, 2,
+ 231, 229, 77, 53, 17, 10, 1, 112, 2, 231, 229, 77, 40, 17, 10, 1, 112, 2,
+ 202, 77, 53, 17, 10, 1, 112, 2, 202, 77, 40, 17, 10, 1, 212, 31, 2, 202,
+ 77, 53, 17, 10, 1, 212, 31, 2, 202, 77, 40, 17, 10, 1, 112, 2, 202, 252,
+ 44, 53, 17, 10, 1, 112, 2, 202, 252, 44, 40, 17, 10, 1, 79, 2, 202, 77,
+ 53, 17, 10, 1, 79, 2, 202, 77, 40, 17, 10, 1, 79, 2, 202, 77, 65, 17, 10,
+ 1, 79, 2, 202, 77, 147, 17, 10, 1, 112, 53, 17, 10, 1, 112, 40, 17, 10,
+ 1, 252, 56, 53, 17, 10, 1, 252, 56, 40, 17, 10, 1, 252, 56, 65, 17, 10,
+ 1, 252, 56, 147, 17, 10, 1, 217, 9, 231, 166, 53, 17, 10, 1, 217, 9, 231,
+ 166, 40, 17, 10, 1, 217, 9, 53, 17, 10, 1, 217, 9, 40, 17, 10, 1, 217, 9,
+ 65, 17, 10, 1, 217, 9, 147, 17, 10, 1, 216, 194, 53, 17, 10, 1, 216, 194,
+ 40, 17, 10, 1, 216, 194, 65, 17, 10, 1, 216, 194, 147, 17, 10, 1, 151,
+ 53, 17, 10, 1, 151, 40, 17, 10, 1, 151, 65, 17, 10, 1, 151, 147, 17, 10,
+ 1, 122, 53, 17, 10, 1, 122, 40, 17, 10, 1, 122, 65, 17, 10, 1, 122, 147,
+ 17, 10, 1, 234, 131, 53, 17, 10, 1, 234, 131, 40, 17, 10, 1, 234, 131,
+ 65, 17, 10, 1, 234, 131, 147, 17, 10, 1, 248, 197, 53, 17, 10, 1, 248,
+ 197, 40, 17, 10, 1, 216, 204, 53, 17, 10, 1, 216, 204, 40, 17, 10, 1,
+ 223, 97, 53, 17, 10, 1, 223, 97, 40, 17, 10, 1, 210, 109, 53, 17, 10, 1,
+ 210, 109, 40, 17, 10, 1, 221, 168, 53, 17, 10, 1, 221, 168, 40, 17, 10,
+ 1, 221, 168, 65, 17, 10, 1, 221, 168, 147, 17, 10, 1, 220, 61, 53, 17,
+ 10, 1, 220, 61, 40, 17, 10, 1, 220, 61, 65, 17, 10, 1, 220, 61, 147, 17,
+ 10, 1, 222, 28, 53, 17, 10, 1, 222, 28, 40, 17, 10, 1, 222, 28, 65, 17,
+ 10, 1, 222, 28, 147, 17, 10, 1, 248, 218, 53, 17, 10, 1, 248, 218, 40,
+ 17, 10, 1, 248, 218, 65, 17, 10, 1, 248, 218, 147, 17, 10, 1, 217, 82,
+ 53, 17, 10, 1, 217, 82, 40, 17, 10, 1, 217, 82, 65, 17, 10, 1, 217, 82,
+ 147, 17, 10, 1, 210, 112, 53, 17, 10, 1, 210, 112, 40, 17, 10, 1, 210,
+ 112, 65, 17, 10, 1, 210, 112, 147, 17, 10, 1, 254, 198, 53, 17, 10, 1,
+ 254, 198, 40, 17, 10, 1, 254, 198, 65, 17, 10, 1, 254, 198, 147, 17, 10,
+ 1, 242, 246, 53, 17, 10, 1, 242, 246, 40, 17, 10, 1, 242, 246, 65, 17,
+ 10, 1, 242, 246, 147, 17, 10, 1, 244, 144, 53, 17, 10, 1, 244, 144, 40,
+ 17, 10, 1, 244, 144, 65, 17, 10, 1, 244, 144, 147, 17, 10, 1, 224, 83,
+ 53, 17, 10, 1, 224, 83, 40, 17, 10, 1, 224, 83, 65, 17, 10, 1, 224, 83,
+ 147, 17, 10, 1, 234, 252, 53, 17, 10, 1, 234, 252, 40, 17, 10, 1, 234,
+ 252, 65, 17, 10, 1, 234, 252, 147, 17, 10, 1, 233, 104, 53, 17, 10, 1,
+ 233, 104, 40, 17, 10, 1, 233, 104, 65, 17, 10, 1, 233, 104, 147, 17, 10,
+ 1, 66, 53, 17, 10, 1, 66, 40, 17, 10, 1, 66, 65, 17, 10, 1, 66, 147, 17,
+ 10, 1, 228, 64, 53, 17, 10, 1, 228, 64, 40, 17, 10, 1, 228, 64, 65, 17,
+ 10, 1, 228, 64, 147, 17, 10, 1, 241, 220, 53, 17, 10, 1, 241, 220, 40,
+ 17, 10, 1, 241, 220, 65, 17, 10, 1, 241, 220, 147, 17, 10, 1, 212, 31,
+ 53, 17, 10, 1, 212, 31, 40, 17, 10, 1, 112, 231, 194, 53, 17, 10, 1, 112,
+ 231, 194, 40, 17, 10, 1, 79, 53, 17, 10, 1, 79, 40, 17, 10, 1, 79, 65,
+ 17, 10, 1, 79, 147, 17, 10, 27, 233, 104, 2, 112, 2, 231, 229, 77, 53,
+ 17, 10, 27, 233, 104, 2, 112, 2, 231, 229, 77, 40, 17, 10, 27, 233, 104,
+ 2, 112, 2, 202, 77, 53, 17, 10, 27, 233, 104, 2, 112, 2, 202, 77, 40, 17,
+ 10, 27, 233, 104, 2, 112, 2, 202, 252, 44, 53, 17, 10, 27, 233, 104, 2,
+ 112, 2, 202, 252, 44, 40, 17, 10, 27, 233, 104, 2, 112, 53, 17, 10, 27,
+ 233, 104, 2, 112, 40, 17, 210, 87, 211, 245, 228, 74, 219, 19, 126, 245,
+ 32, 78, 126, 223, 255, 78, 126, 54, 50, 126, 247, 133, 50, 126, 225, 183,
+ 50, 126, 254, 127, 126, 254, 58, 126, 43, 226, 4, 126, 44, 226, 4, 126,
+ 253, 217, 126, 96, 50, 126, 249, 220, 126, 240, 168, 126, 243, 230, 218,
+ 130, 126, 219, 47, 126, 21, 210, 86, 126, 21, 110, 126, 21, 105, 126, 21,
+ 158, 126, 21, 161, 126, 21, 189, 126, 21, 194, 126, 21, 198, 126, 21,
+ 195, 126, 21, 200, 126, 249, 227, 126, 220, 151, 126, 233, 16, 50, 126,
+ 245, 99, 50, 126, 242, 131, 50, 126, 224, 14, 78, 126, 249, 218, 253,
+ 207, 126, 7, 6, 1, 61, 126, 7, 6, 1, 253, 159, 126, 7, 6, 1, 251, 67,
+ 126, 7, 6, 1, 249, 61, 126, 7, 6, 1, 75, 126, 7, 6, 1, 245, 7, 126, 7, 6,
+ 1, 243, 203, 126, 7, 6, 1, 242, 61, 126, 7, 6, 1, 73, 126, 7, 6, 1, 235,
+ 145, 126, 7, 6, 1, 235, 24, 126, 7, 6, 1, 156, 126, 7, 6, 1, 193, 126, 7,
+ 6, 1, 230, 26, 126, 7, 6, 1, 76, 126, 7, 6, 1, 226, 106, 126, 7, 6, 1,
+ 224, 97, 126, 7, 6, 1, 153, 126, 7, 6, 1, 222, 92, 126, 7, 6, 1, 217,
+ 153, 126, 7, 6, 1, 70, 126, 7, 6, 1, 214, 105, 126, 7, 6, 1, 212, 98,
+ 126, 7, 6, 1, 211, 178, 126, 7, 6, 1, 211, 117, 126, 7, 6, 1, 210, 159,
+ 126, 43, 42, 127, 126, 223, 51, 219, 47, 126, 44, 42, 127, 126, 250, 32,
+ 255, 15, 126, 121, 232, 214, 126, 242, 138, 255, 15, 126, 7, 4, 1, 61,
+ 126, 7, 4, 1, 253, 159, 126, 7, 4, 1, 251, 67, 126, 7, 4, 1, 249, 61,
+ 126, 7, 4, 1, 75, 126, 7, 4, 1, 245, 7, 126, 7, 4, 1, 243, 203, 126, 7,
+ 4, 1, 242, 61, 126, 7, 4, 1, 73, 126, 7, 4, 1, 235, 145, 126, 7, 4, 1,
+ 235, 24, 126, 7, 4, 1, 156, 126, 7, 4, 1, 193, 126, 7, 4, 1, 230, 26,
+ 126, 7, 4, 1, 76, 126, 7, 4, 1, 226, 106, 126, 7, 4, 1, 224, 97, 126, 7,
+ 4, 1, 153, 126, 7, 4, 1, 222, 92, 126, 7, 4, 1, 217, 153, 126, 7, 4, 1,
+ 70, 126, 7, 4, 1, 214, 105, 126, 7, 4, 1, 212, 98, 126, 7, 4, 1, 211,
+ 178, 126, 7, 4, 1, 211, 117, 126, 7, 4, 1, 210, 159, 126, 43, 249, 100,
+ 127, 126, 67, 232, 214, 126, 44, 249, 100, 127, 126, 183, 126, 43, 71,
+ 226, 4, 126, 44, 71, 226, 4, 101, 109, 243, 230, 218, 130, 101, 43, 249,
+ 162, 127, 101, 44, 249, 162, 127, 101, 109, 249, 220, 101, 56, 230, 225,
+ 247, 121, 101, 56, 1, 211, 227, 101, 56, 1, 4, 61, 101, 56, 1, 4, 73,
+ 101, 56, 1, 4, 70, 101, 56, 1, 4, 75, 101, 56, 1, 4, 76, 101, 56, 1, 4,
+ 191, 101, 56, 1, 4, 210, 212, 101, 56, 1, 4, 210, 244, 101, 56, 1, 4,
+ 215, 119, 101, 234, 202, 224, 174, 219, 32, 78, 101, 56, 1, 61, 101, 56,
+ 1, 73, 101, 56, 1, 70, 101, 56, 1, 75, 101, 56, 1, 76, 101, 56, 1, 176,
+ 101, 56, 1, 234, 93, 101, 56, 1, 233, 218, 101, 56, 1, 234, 183, 101, 56,
+ 1, 234, 29, 101, 56, 1, 206, 101, 56, 1, 219, 192, 101, 56, 1, 218, 84,
+ 101, 56, 1, 221, 182, 101, 56, 1, 219, 59, 101, 56, 1, 217, 106, 101, 56,
+ 1, 216, 118, 101, 56, 1, 215, 119, 101, 56, 1, 217, 23, 101, 56, 1, 111,
+ 101, 56, 1, 197, 101, 56, 1, 228, 234, 101, 56, 1, 227, 238, 101, 56, 1,
+ 229, 108, 101, 56, 1, 228, 75, 101, 56, 1, 162, 101, 56, 1, 241, 181,
+ 101, 56, 1, 240, 223, 101, 56, 1, 241, 239, 101, 56, 1, 241, 69, 101, 56,
+ 1, 185, 101, 56, 1, 230, 231, 101, 56, 1, 230, 103, 101, 56, 1, 231, 92,
+ 101, 56, 1, 230, 162, 101, 56, 1, 191, 101, 56, 1, 210, 212, 101, 56, 1,
+ 210, 244, 101, 56, 1, 205, 101, 56, 1, 223, 36, 101, 56, 1, 222, 141,
+ 101, 56, 1, 223, 129, 101, 56, 1, 222, 212, 101, 56, 1, 212, 65, 101, 56,
+ 1, 230, 26, 101, 56, 213, 135, 219, 32, 78, 101, 56, 220, 156, 219, 32,
+ 78, 101, 24, 244, 104, 101, 24, 1, 234, 59, 101, 24, 1, 218, 216, 101,
+ 24, 1, 234, 52, 101, 24, 1, 228, 227, 101, 24, 1, 228, 225, 101, 24, 1,
+ 228, 224, 101, 24, 1, 216, 102, 101, 24, 1, 218, 205, 101, 24, 1, 223,
+ 27, 101, 24, 1, 223, 22, 101, 24, 1, 223, 19, 101, 24, 1, 223, 12, 101,
+ 24, 1, 223, 7, 101, 24, 1, 223, 2, 101, 24, 1, 223, 13, 101, 24, 1, 223,
+ 25, 101, 24, 1, 230, 218, 101, 24, 1, 225, 96, 101, 24, 1, 218, 213, 101,
+ 24, 1, 225, 85, 101, 24, 1, 219, 149, 101, 24, 1, 218, 210, 101, 24, 1,
+ 236, 57, 101, 24, 1, 250, 47, 101, 24, 1, 218, 220, 101, 24, 1, 250, 107,
+ 101, 24, 1, 234, 111, 101, 24, 1, 216, 174, 101, 24, 1, 225, 132, 101,
+ 24, 1, 241, 173, 101, 24, 1, 61, 101, 24, 1, 254, 244, 101, 24, 1, 191,
+ 101, 24, 1, 211, 92, 101, 24, 1, 245, 118, 101, 24, 1, 75, 101, 24, 1,
+ 211, 36, 101, 24, 1, 211, 47, 101, 24, 1, 76, 101, 24, 1, 212, 65, 101,
+ 24, 1, 212, 62, 101, 24, 1, 226, 235, 101, 24, 1, 210, 244, 101, 24, 1,
+ 70, 101, 24, 1, 212, 11, 101, 24, 1, 212, 22, 101, 24, 1, 211, 250, 101,
+ 24, 1, 210, 212, 101, 24, 1, 245, 56, 101, 24, 1, 211, 8, 101, 24, 1, 73,
+ 126, 250, 177, 50, 126, 224, 229, 50, 126, 228, 53, 50, 126, 231, 233,
+ 126, 251, 136, 130, 126, 211, 40, 50, 126, 211, 217, 50, 101, 244, 19,
+ 192, 213, 239, 101, 140, 74, 101, 214, 153, 74, 101, 97, 74, 101, 246,
+ 105, 74, 101, 85, 218, 235, 101, 71, 250, 36, 235, 205, 254, 100, 254,
+ 121, 235, 205, 254, 100, 220, 138, 235, 205, 254, 100, 216, 237, 226,
+ 250, 223, 73, 250, 143, 223, 73, 250, 143, 62, 57, 3, 253, 143, 61, 62,
+ 57, 3, 253, 112, 75, 62, 57, 3, 253, 121, 73, 62, 57, 3, 253, 89, 76, 62,
+ 57, 3, 253, 139, 70, 62, 57, 3, 253, 158, 248, 222, 62, 57, 3, 253, 105,
+ 248, 91, 62, 57, 3, 253, 145, 248, 4, 62, 57, 3, 253, 135, 247, 146, 62,
+ 57, 3, 253, 99, 246, 79, 62, 57, 3, 253, 93, 235, 142, 62, 57, 3, 253,
+ 104, 235, 127, 62, 57, 3, 253, 114, 235, 69, 62, 57, 3, 253, 85, 235, 52,
+ 62, 57, 3, 253, 73, 176, 62, 57, 3, 253, 106, 234, 183, 62, 57, 3, 253,
+ 83, 234, 93, 62, 57, 3, 253, 80, 234, 29, 62, 57, 3, 253, 69, 233, 218,
+ 62, 57, 3, 253, 70, 185, 62, 57, 3, 253, 136, 231, 92, 62, 57, 3, 253,
+ 77, 230, 231, 62, 57, 3, 253, 134, 230, 162, 62, 57, 3, 253, 126, 230,
+ 103, 62, 57, 3, 253, 147, 197, 62, 57, 3, 253, 125, 229, 108, 62, 57, 3,
+ 253, 119, 228, 234, 62, 57, 3, 253, 98, 228, 75, 62, 57, 3, 253, 95, 227,
+ 238, 62, 57, 3, 253, 154, 190, 62, 57, 3, 253, 78, 225, 222, 62, 57, 3,
+ 253, 111, 225, 109, 62, 57, 3, 253, 138, 225, 17, 62, 57, 3, 253, 100,
+ 224, 151, 62, 57, 3, 253, 133, 224, 89, 62, 57, 3, 253, 72, 224, 70, 62,
+ 57, 3, 253, 128, 224, 54, 62, 57, 3, 253, 117, 224, 43, 62, 57, 3, 253,
+ 90, 205, 62, 57, 3, 253, 122, 223, 129, 62, 57, 3, 253, 97, 223, 36, 62,
+ 57, 3, 253, 156, 222, 212, 62, 57, 3, 253, 123, 222, 141, 62, 57, 3, 253,
+ 118, 206, 62, 57, 3, 253, 141, 221, 182, 62, 57, 3, 253, 109, 219, 192,
+ 62, 57, 3, 253, 137, 219, 59, 62, 57, 3, 253, 92, 218, 84, 62, 57, 3,
+ 253, 91, 217, 106, 62, 57, 3, 253, 152, 217, 23, 62, 57, 3, 253, 113,
+ 216, 118, 62, 57, 3, 253, 150, 111, 62, 57, 3, 253, 81, 215, 119, 62, 57,
+ 3, 253, 96, 212, 65, 62, 57, 3, 253, 75, 212, 22, 62, 57, 3, 253, 110,
+ 211, 250, 62, 57, 3, 253, 108, 211, 227, 62, 57, 3, 253, 132, 210, 116,
+ 62, 57, 3, 253, 76, 210, 94, 62, 57, 3, 253, 129, 210, 23, 62, 57, 3,
+ 253, 124, 255, 76, 62, 57, 3, 253, 107, 255, 75, 62, 57, 3, 253, 66, 253,
+ 193, 62, 57, 3, 253, 79, 246, 47, 62, 57, 3, 253, 62, 246, 46, 62, 57, 3,
+ 253, 102, 227, 175, 62, 57, 3, 253, 120, 224, 149, 62, 57, 3, 253, 88,
+ 224, 153, 62, 57, 3, 253, 74, 223, 187, 62, 57, 3, 253, 116, 223, 186,
+ 62, 57, 3, 253, 82, 222, 211, 62, 57, 3, 253, 84, 217, 103, 62, 57, 3,
+ 253, 64, 215, 78, 62, 57, 3, 253, 61, 105, 62, 57, 16, 253, 131, 62, 57,
+ 16, 253, 130, 62, 57, 16, 253, 127, 62, 57, 16, 253, 115, 62, 57, 16,
+ 253, 103, 62, 57, 16, 253, 101, 62, 57, 16, 253, 94, 62, 57, 16, 253, 87,
+ 62, 57, 16, 253, 86, 62, 57, 16, 253, 71, 62, 57, 16, 253, 68, 62, 57,
+ 16, 253, 67, 62, 57, 16, 253, 65, 62, 57, 16, 253, 63, 62, 57, 106, 253,
+ 60, 231, 186, 62, 57, 106, 253, 59, 211, 221, 62, 57, 106, 253, 58, 248,
+ 75, 62, 57, 106, 253, 57, 245, 96, 62, 57, 106, 253, 56, 231, 160, 62,
+ 57, 106, 253, 55, 218, 163, 62, 57, 106, 253, 54, 245, 38, 62, 57, 106,
+ 253, 53, 223, 154, 62, 57, 106, 253, 52, 220, 63, 62, 57, 106, 253, 51,
+ 241, 238, 62, 57, 106, 253, 50, 219, 26, 62, 57, 106, 253, 49, 251, 204,
+ 62, 57, 106, 253, 48, 249, 146, 62, 57, 106, 253, 47, 251, 116, 62, 57,
+ 106, 253, 46, 212, 2, 62, 57, 106, 253, 45, 252, 137, 62, 57, 106, 253,
+ 44, 226, 206, 62, 57, 106, 253, 43, 218, 255, 62, 57, 106, 253, 42, 249,
+ 69, 62, 57, 230, 143, 253, 41, 234, 225, 62, 57, 230, 143, 253, 40, 234,
+ 233, 62, 57, 106, 253, 39, 226, 219, 62, 57, 106, 253, 38, 211, 236, 62,
+ 57, 106, 253, 37, 62, 57, 230, 143, 253, 36, 254, 18, 62, 57, 230, 143,
+ 253, 35, 231, 53, 62, 57, 106, 253, 34, 251, 135, 62, 57, 106, 253, 33,
+ 242, 167, 62, 57, 106, 253, 32, 62, 57, 106, 253, 31, 211, 212, 62, 57,
+ 106, 253, 30, 62, 57, 106, 253, 29, 62, 57, 106, 253, 28, 240, 249, 62,
+ 57, 106, 253, 27, 62, 57, 106, 253, 26, 62, 57, 106, 253, 25, 62, 57,
+ 230, 143, 253, 23, 215, 92, 62, 57, 106, 253, 22, 62, 57, 106, 253, 21,
+ 62, 57, 106, 253, 20, 249, 251, 62, 57, 106, 253, 19, 62, 57, 106, 253,
+ 18, 62, 57, 106, 253, 17, 243, 94, 62, 57, 106, 253, 16, 254, 5, 62, 57,
+ 106, 253, 15, 62, 57, 106, 253, 14, 62, 57, 106, 253, 13, 62, 57, 106,
+ 253, 12, 62, 57, 106, 253, 11, 62, 57, 106, 253, 10, 62, 57, 106, 253, 9,
+ 62, 57, 106, 253, 8, 62, 57, 106, 253, 7, 62, 57, 106, 253, 6, 230, 135,
+ 62, 57, 106, 253, 5, 62, 57, 106, 253, 4, 215, 236, 62, 57, 106, 253, 3,
+ 62, 57, 106, 253, 2, 62, 57, 106, 253, 1, 62, 57, 106, 253, 0, 62, 57,
+ 106, 252, 255, 62, 57, 106, 252, 254, 62, 57, 106, 252, 253, 62, 57, 106,
+ 252, 252, 62, 57, 106, 252, 251, 62, 57, 106, 252, 250, 62, 57, 106, 252,
+ 249, 62, 57, 106, 252, 248, 241, 212, 62, 57, 106, 252, 227, 244, 29, 62,
+ 57, 106, 252, 224, 252, 117, 62, 57, 106, 252, 219, 219, 6, 62, 57, 106,
+ 252, 218, 74, 62, 57, 106, 252, 217, 62, 57, 106, 252, 216, 217, 237, 62,
+ 57, 106, 252, 215, 62, 57, 106, 252, 214, 62, 57, 106, 252, 213, 211,
+ 254, 250, 140, 62, 57, 106, 252, 212, 250, 140, 62, 57, 106, 252, 211,
+ 250, 141, 244, 0, 62, 57, 106, 252, 210, 212, 0, 62, 57, 106, 252, 209,
+ 62, 57, 106, 252, 208, 62, 57, 230, 143, 252, 207, 247, 199, 62, 57, 106,
+ 252, 206, 62, 57, 106, 252, 205, 62, 57, 106, 252, 203, 62, 57, 106, 252,
+ 202, 62, 57, 106, 252, 201, 62, 57, 106, 252, 200, 248, 160, 62, 57, 106,
+ 252, 199, 62, 57, 106, 252, 198, 62, 57, 106, 252, 197, 62, 57, 106, 252,
+ 196, 62, 57, 106, 252, 195, 62, 57, 106, 213, 186, 253, 24, 62, 57, 106,
+ 213, 186, 252, 247, 62, 57, 106, 213, 186, 252, 246, 62, 57, 106, 213,
+ 186, 252, 245, 62, 57, 106, 213, 186, 252, 244, 62, 57, 106, 213, 186,
+ 252, 243, 62, 57, 106, 213, 186, 252, 242, 62, 57, 106, 213, 186, 252,
+ 241, 62, 57, 106, 213, 186, 252, 240, 62, 57, 106, 213, 186, 252, 239,
+ 62, 57, 106, 213, 186, 252, 238, 62, 57, 106, 213, 186, 252, 237, 62, 57,
+ 106, 213, 186, 252, 236, 62, 57, 106, 213, 186, 252, 235, 62, 57, 106,
+ 213, 186, 252, 234, 62, 57, 106, 213, 186, 252, 233, 62, 57, 106, 213,
+ 186, 252, 232, 62, 57, 106, 213, 186, 252, 231, 62, 57, 106, 213, 186,
+ 252, 230, 62, 57, 106, 213, 186, 252, 229, 62, 57, 106, 213, 186, 252,
+ 228, 62, 57, 106, 213, 186, 252, 226, 62, 57, 106, 213, 186, 252, 225,
+ 62, 57, 106, 213, 186, 252, 223, 62, 57, 106, 213, 186, 252, 222, 62, 57,
+ 106, 213, 186, 252, 221, 62, 57, 106, 213, 186, 252, 220, 62, 57, 106,
+ 213, 186, 252, 204, 62, 57, 106, 213, 186, 252, 194, 254, 237, 211, 209,
+ 220, 139, 232, 214, 254, 237, 211, 209, 220, 139, 247, 121, 254, 237,
+ 250, 131, 78, 254, 237, 54, 110, 254, 237, 54, 105, 254, 237, 54, 158,
+ 254, 237, 54, 161, 254, 237, 54, 189, 254, 237, 54, 194, 254, 237, 54,
+ 198, 254, 237, 54, 195, 254, 237, 54, 200, 254, 237, 54, 216, 248, 254,
+ 237, 54, 215, 73, 254, 237, 54, 216, 163, 254, 237, 54, 244, 16, 254,
+ 237, 54, 244, 115, 254, 237, 54, 219, 112, 254, 237, 54, 220, 117, 254,
+ 237, 54, 245, 185, 254, 237, 54, 228, 196, 254, 237, 54, 123, 240, 211,
+ 254, 237, 54, 113, 240, 211, 254, 237, 54, 134, 240, 211, 254, 237, 54,
+ 244, 12, 240, 211, 254, 237, 54, 244, 82, 240, 211, 254, 237, 54, 219,
+ 126, 240, 211, 254, 237, 54, 220, 123, 240, 211, 254, 237, 54, 245, 194,
+ 240, 211, 254, 237, 54, 228, 201, 240, 211, 254, 237, 54, 123, 216, 148,
+ 254, 237, 54, 113, 216, 148, 254, 237, 54, 134, 216, 148, 254, 237, 54,
+ 244, 12, 216, 148, 254, 237, 54, 244, 82, 216, 148, 254, 237, 54, 219,
+ 126, 216, 148, 254, 237, 54, 220, 123, 216, 148, 254, 237, 54, 245, 194,
+ 216, 148, 254, 237, 54, 228, 201, 216, 148, 254, 237, 54, 216, 249, 216,
+ 148, 254, 237, 54, 215, 74, 216, 148, 254, 237, 54, 216, 164, 216, 148,
+ 254, 237, 54, 244, 17, 216, 148, 254, 237, 54, 244, 116, 216, 148, 254,
+ 237, 54, 219, 113, 216, 148, 254, 237, 54, 220, 118, 216, 148, 254, 237,
+ 54, 245, 186, 216, 148, 254, 237, 54, 228, 197, 216, 148, 254, 237, 212,
+ 14, 252, 129, 214, 173, 254, 237, 212, 14, 244, 93, 218, 60, 254, 237,
+ 212, 14, 221, 177, 218, 60, 254, 237, 212, 14, 216, 170, 218, 60, 254,
+ 237, 212, 14, 244, 5, 218, 60, 254, 237, 246, 82, 231, 91, 244, 93, 218,
+ 60, 254, 237, 232, 200, 231, 91, 244, 93, 218, 60, 254, 237, 231, 91,
+ 221, 177, 218, 60, 254, 237, 231, 91, 216, 170, 218, 60, 26, 255, 7, 253,
+ 195, 123, 224, 22, 26, 255, 7, 253, 195, 123, 242, 28, 26, 255, 7, 253,
+ 195, 123, 246, 101, 26, 255, 7, 253, 195, 189, 26, 255, 7, 253, 195, 244,
+ 115, 26, 255, 7, 253, 195, 244, 82, 240, 211, 26, 255, 7, 253, 195, 244,
+ 82, 216, 148, 26, 255, 7, 253, 195, 244, 116, 216, 148, 26, 255, 7, 253,
+ 195, 244, 82, 217, 68, 26, 255, 7, 253, 195, 216, 249, 217, 68, 26, 255,
+ 7, 253, 195, 244, 116, 217, 68, 26, 255, 7, 253, 195, 123, 240, 212, 217,
+ 68, 26, 255, 7, 253, 195, 244, 82, 240, 212, 217, 68, 26, 255, 7, 253,
+ 195, 123, 216, 149, 217, 68, 26, 255, 7, 253, 195, 244, 82, 216, 149,
+ 217, 68, 26, 255, 7, 253, 195, 244, 82, 218, 151, 26, 255, 7, 253, 195,
+ 216, 249, 218, 151, 26, 255, 7, 253, 195, 244, 116, 218, 151, 26, 255, 7,
+ 253, 195, 123, 240, 212, 218, 151, 26, 255, 7, 253, 195, 244, 82, 240,
+ 212, 218, 151, 26, 255, 7, 253, 195, 123, 216, 149, 218, 151, 26, 255, 7,
+ 253, 195, 216, 249, 216, 149, 218, 151, 26, 255, 7, 253, 195, 244, 116,
+ 216, 149, 218, 151, 26, 255, 7, 253, 195, 216, 249, 230, 165, 26, 255, 7,
+ 241, 206, 123, 225, 32, 26, 255, 7, 216, 182, 110, 26, 255, 7, 241, 202,
+ 110, 26, 255, 7, 245, 105, 105, 26, 255, 7, 216, 182, 105, 26, 255, 7,
+ 249, 66, 113, 246, 100, 26, 255, 7, 245, 105, 113, 246, 100, 26, 255, 7,
+ 215, 204, 189, 26, 255, 7, 215, 204, 216, 248, 26, 255, 7, 215, 204, 216,
+ 249, 254, 142, 17, 26, 255, 7, 241, 202, 216, 248, 26, 255, 7, 231, 42,
+ 216, 248, 26, 255, 7, 216, 182, 216, 248, 26, 255, 7, 216, 182, 216, 163,
+ 26, 255, 7, 215, 204, 244, 115, 26, 255, 7, 215, 204, 244, 116, 254, 142,
+ 17, 26, 255, 7, 241, 202, 244, 115, 26, 255, 7, 216, 182, 244, 115, 26,
+ 255, 7, 216, 182, 123, 240, 211, 26, 255, 7, 216, 182, 134, 240, 211, 26,
+ 255, 7, 245, 105, 244, 82, 240, 211, 26, 255, 7, 215, 204, 244, 82, 240,
+ 211, 26, 255, 7, 216, 182, 244, 82, 240, 211, 26, 255, 7, 250, 228, 244,
+ 82, 240, 211, 26, 255, 7, 229, 183, 244, 82, 240, 211, 26, 255, 7, 216,
+ 182, 123, 216, 148, 26, 255, 7, 216, 182, 244, 82, 216, 148, 26, 255, 7,
+ 248, 58, 244, 82, 230, 165, 26, 255, 7, 218, 119, 244, 116, 230, 165, 26,
+ 123, 163, 50, 26, 123, 163, 5, 254, 142, 17, 26, 113, 216, 168, 50, 26,
+ 134, 224, 21, 50, 26, 211, 45, 50, 26, 217, 69, 50, 26, 246, 102, 50, 26,
+ 226, 247, 50, 26, 113, 226, 246, 50, 26, 134, 226, 246, 50, 26, 244, 12,
+ 226, 246, 50, 26, 244, 82, 226, 246, 50, 26, 231, 36, 50, 26, 233, 158,
+ 252, 129, 50, 26, 232, 195, 50, 26, 226, 132, 50, 26, 211, 159, 50, 26,
+ 253, 244, 50, 26, 254, 1, 50, 26, 242, 145, 50, 26, 215, 187, 252, 129,
+ 50, 26, 210, 87, 50, 222, 199, 220, 114, 50, 222, 199, 214, 185, 50, 222,
+ 199, 220, 143, 50, 222, 199, 220, 112, 50, 222, 199, 247, 214, 220, 112,
+ 50, 222, 199, 219, 169, 50, 222, 199, 248, 54, 50, 222, 199, 224, 7, 50,
+ 222, 199, 220, 130, 50, 222, 199, 246, 61, 50, 222, 199, 253, 239, 50,
+ 222, 199, 250, 172, 50, 225, 144, 247, 192, 5, 225, 214, 225, 144, 247,
+ 192, 5, 225, 25, 241, 236, 225, 144, 247, 192, 5, 217, 46, 241, 236, 225,
+ 144, 247, 192, 5, 250, 248, 225, 144, 247, 192, 5, 250, 102, 225, 144,
+ 247, 192, 5, 211, 221, 225, 144, 247, 192, 5, 241, 212, 225, 144, 247,
+ 192, 5, 243, 86, 225, 144, 247, 192, 5, 216, 117, 225, 144, 247, 192, 5,
+ 74, 225, 144, 247, 192, 5, 251, 170, 225, 144, 247, 192, 5, 220, 30, 225,
+ 144, 247, 192, 5, 249, 245, 225, 144, 247, 192, 5, 231, 185, 225, 144,
+ 247, 192, 5, 231, 137, 225, 144, 247, 192, 5, 221, 217, 225, 144, 247,
+ 192, 5, 232, 238, 225, 144, 247, 192, 5, 251, 189, 225, 144, 247, 192, 5,
+ 250, 232, 225, 36, 225, 144, 247, 192, 5, 247, 134, 225, 144, 247, 192,
+ 5, 249, 224, 225, 144, 247, 192, 5, 219, 88, 225, 144, 247, 192, 5, 249,
+ 225, 225, 144, 247, 192, 5, 252, 64, 225, 144, 247, 192, 5, 220, 17, 225,
+ 144, 247, 192, 5, 240, 249, 225, 144, 247, 192, 5, 241, 179, 225, 144,
+ 247, 192, 5, 251, 113, 233, 37, 225, 144, 247, 192, 5, 250, 225, 225,
+ 144, 247, 192, 5, 223, 154, 225, 144, 247, 192, 5, 245, 231, 225, 144,
+ 247, 192, 5, 246, 108, 225, 144, 247, 192, 5, 215, 106, 225, 144, 247,
+ 192, 5, 252, 67, 225, 144, 247, 192, 5, 225, 37, 215, 236, 225, 144, 247,
+ 192, 5, 213, 159, 225, 144, 247, 192, 5, 226, 19, 225, 144, 247, 192, 5,
+ 222, 191, 225, 144, 247, 192, 5, 232, 225, 225, 144, 247, 192, 5, 226,
+ 116, 252, 185, 225, 144, 247, 192, 5, 244, 49, 225, 144, 247, 192, 5,
+ 242, 139, 225, 144, 247, 192, 5, 218, 120, 225, 144, 247, 192, 5, 4, 253,
+ 169, 225, 144, 247, 192, 5, 212, 32, 252, 149, 225, 144, 247, 192, 5, 38,
+ 226, 249, 91, 232, 61, 1, 61, 232, 61, 1, 75, 232, 61, 1, 253, 159, 232,
+ 61, 1, 252, 20, 232, 61, 1, 243, 203, 232, 61, 1, 249, 61, 232, 61, 1,
+ 73, 232, 61, 1, 212, 98, 232, 61, 1, 210, 159, 232, 61, 1, 216, 211, 232,
+ 61, 1, 235, 145, 232, 61, 1, 235, 24, 232, 61, 1, 224, 97, 232, 61, 1,
+ 156, 232, 61, 1, 193, 232, 61, 1, 230, 26, 232, 61, 1, 230, 167, 232, 61,
+ 1, 228, 112, 232, 61, 1, 70, 232, 61, 1, 226, 106, 232, 61, 1, 234, 48,
+ 232, 61, 1, 153, 232, 61, 1, 222, 92, 232, 61, 1, 217, 153, 232, 61, 1,
+ 215, 160, 232, 61, 1, 254, 124, 232, 61, 1, 245, 151, 232, 61, 1, 242,
+ 61, 232, 61, 1, 211, 178, 250, 238, 1, 61, 250, 238, 1, 226, 92, 250,
+ 238, 1, 249, 61, 250, 238, 1, 156, 250, 238, 1, 214, 116, 250, 238, 1,
+ 153, 250, 238, 1, 233, 63, 250, 238, 1, 255, 76, 250, 238, 1, 224, 97,
+ 250, 238, 1, 253, 159, 250, 238, 1, 193, 250, 238, 1, 76, 250, 238, 1,
+ 248, 224, 250, 238, 1, 217, 153, 250, 238, 1, 220, 105, 250, 238, 1, 220,
+ 104, 250, 238, 1, 222, 92, 250, 238, 1, 251, 66, 250, 238, 1, 70, 250,
+ 238, 1, 228, 112, 250, 238, 1, 211, 178, 250, 238, 1, 230, 26, 250, 238,
+ 1, 215, 159, 250, 238, 1, 226, 106, 250, 238, 1, 218, 227, 250, 238, 1,
+ 73, 250, 238, 1, 75, 250, 238, 1, 214, 113, 250, 238, 1, 235, 24, 250,
+ 238, 1, 235, 15, 250, 238, 1, 229, 151, 250, 238, 1, 214, 118, 250, 238,
+ 1, 243, 203, 250, 238, 1, 243, 138, 250, 238, 1, 218, 169, 250, 238, 1,
+ 218, 168, 250, 238, 1, 229, 80, 250, 238, 1, 236, 34, 250, 238, 1, 251,
+ 65, 250, 238, 1, 215, 160, 250, 238, 1, 214, 115, 250, 238, 1, 222, 181,
+ 250, 238, 1, 231, 130, 250, 238, 1, 231, 129, 250, 238, 1, 231, 128, 250,
+ 238, 1, 231, 127, 250, 238, 1, 233, 62, 250, 238, 1, 245, 235, 250, 238,
+ 1, 214, 114, 55, 32, 1, 61, 55, 32, 1, 252, 76, 55, 32, 1, 234, 183, 55,
+ 32, 1, 248, 91, 55, 32, 1, 75, 55, 32, 1, 213, 255, 55, 32, 1, 210, 94,
+ 55, 32, 1, 241, 239, 55, 32, 1, 216, 196, 55, 32, 1, 73, 55, 32, 1, 176,
+ 55, 32, 1, 245, 175, 55, 32, 1, 245, 160, 55, 32, 1, 245, 151, 55, 32, 1,
+ 245, 76, 55, 32, 1, 76, 55, 32, 1, 225, 222, 55, 32, 1, 220, 64, 55, 32,
+ 1, 233, 218, 55, 32, 1, 245, 93, 55, 32, 1, 245, 83, 55, 32, 1, 217, 23,
+ 55, 32, 1, 70, 55, 32, 1, 245, 178, 55, 32, 1, 225, 137, 55, 32, 1, 234,
+ 120, 55, 32, 1, 245, 203, 55, 32, 1, 245, 85, 55, 32, 1, 250, 132, 55,
+ 32, 1, 236, 34, 55, 32, 1, 214, 118, 55, 32, 227, 199, 110, 55, 32, 227,
+ 199, 189, 55, 32, 227, 199, 216, 248, 55, 32, 227, 199, 244, 115, 242,
+ 154, 1, 254, 205, 242, 154, 1, 252, 164, 242, 154, 1, 242, 212, 242, 154,
+ 1, 248, 205, 242, 154, 1, 254, 201, 242, 154, 1, 224, 80, 242, 154, 1,
+ 235, 156, 242, 154, 1, 242, 40, 242, 154, 1, 216, 159, 242, 154, 1, 245,
+ 184, 242, 154, 1, 233, 191, 242, 154, 1, 233, 114, 242, 154, 1, 231, 180,
+ 242, 154, 1, 229, 185, 242, 154, 1, 235, 120, 242, 154, 1, 214, 136, 242,
+ 154, 1, 226, 70, 242, 154, 1, 228, 196, 242, 154, 1, 223, 166, 242, 154,
+ 1, 221, 219, 242, 154, 1, 217, 5, 242, 154, 1, 211, 234, 242, 154, 1,
+ 244, 179, 242, 154, 1, 236, 38, 242, 154, 1, 240, 200, 242, 154, 1, 226,
+ 140, 242, 154, 1, 228, 201, 240, 211, 214, 209, 1, 254, 148, 214, 209, 1,
+ 252, 27, 214, 209, 1, 243, 109, 214, 209, 1, 234, 133, 214, 209, 1, 248,
+ 55, 214, 209, 1, 241, 69, 214, 209, 1, 211, 227, 214, 209, 1, 210, 85,
+ 214, 209, 1, 240, 242, 214, 209, 1, 216, 231, 214, 209, 1, 210, 233, 214,
+ 209, 1, 234, 251, 214, 209, 1, 220, 21, 214, 209, 1, 233, 99, 214, 209,
+ 1, 231, 66, 214, 209, 1, 248, 22, 214, 209, 1, 227, 195, 214, 209, 1,
+ 210, 13, 214, 209, 1, 221, 249, 214, 209, 1, 254, 197, 214, 209, 1, 224,
+ 151, 214, 209, 1, 222, 26, 214, 209, 1, 224, 36, 214, 209, 1, 223, 145,
+ 214, 209, 1, 216, 200, 214, 209, 1, 242, 245, 214, 209, 1, 111, 214, 209,
+ 1, 73, 214, 209, 1, 70, 214, 209, 1, 218, 180, 214, 209, 211, 209, 247,
+ 173, 55, 225, 170, 5, 61, 55, 225, 170, 5, 73, 55, 225, 170, 5, 70, 55,
+ 225, 170, 5, 176, 55, 225, 170, 5, 233, 218, 55, 225, 170, 5, 243, 136,
+ 55, 225, 170, 5, 242, 114, 55, 225, 170, 5, 211, 165, 55, 225, 170, 5,
+ 251, 34, 55, 225, 170, 5, 235, 142, 55, 225, 170, 5, 235, 109, 55, 225,
+ 170, 5, 217, 106, 55, 225, 170, 5, 215, 119, 55, 225, 170, 5, 248, 222,
+ 55, 225, 170, 5, 248, 4, 55, 225, 170, 5, 246, 79, 55, 225, 170, 5, 216,
+ 209, 55, 225, 170, 5, 190, 55, 225, 170, 5, 252, 192, 55, 225, 170, 5,
+ 244, 197, 55, 225, 170, 5, 197, 55, 225, 170, 5, 227, 238, 55, 225, 170,
+ 5, 185, 55, 225, 170, 5, 230, 231, 55, 225, 170, 5, 230, 103, 55, 225,
+ 170, 5, 191, 55, 225, 170, 5, 214, 27, 55, 225, 170, 5, 213, 176, 55,
+ 225, 170, 5, 205, 55, 225, 170, 5, 222, 141, 55, 225, 170, 5, 233, 136,
+ 55, 225, 170, 5, 206, 55, 225, 170, 5, 210, 116, 55, 225, 170, 5, 220,
+ 103, 55, 225, 170, 5, 218, 224, 55, 225, 170, 5, 162, 55, 225, 170, 5,
+ 253, 187, 55, 225, 170, 5, 253, 186, 55, 225, 170, 5, 253, 185, 55, 225,
+ 170, 5, 211, 142, 55, 225, 170, 5, 248, 201, 55, 225, 170, 5, 248, 200,
+ 55, 225, 170, 5, 252, 171, 55, 225, 170, 5, 251, 86, 55, 225, 170, 211,
+ 209, 247, 173, 55, 225, 170, 54, 110, 55, 225, 170, 54, 105, 55, 225,
+ 170, 54, 216, 248, 55, 225, 170, 54, 215, 73, 55, 225, 170, 54, 240, 211,
181, 6, 1, 199, 73, 181, 6, 1, 199, 75, 181, 6, 1, 199, 61, 181, 6, 1,
- 199, 254, 209, 181, 6, 1, 199, 76, 181, 6, 1, 199, 226, 183, 181, 6, 1,
- 219, 251, 73, 181, 6, 1, 219, 251, 75, 181, 6, 1, 219, 251, 61, 181, 6,
- 1, 219, 251, 254, 209, 181, 6, 1, 219, 251, 76, 181, 6, 1, 219, 251, 226,
- 183, 181, 6, 1, 253, 167, 181, 6, 1, 226, 116, 181, 6, 1, 211, 195, 181,
- 6, 1, 211, 44, 181, 6, 1, 242, 60, 181, 6, 1, 225, 211, 181, 6, 1, 252,
- 66, 181, 6, 1, 217, 11, 181, 6, 1, 248, 77, 181, 6, 1, 250, 128, 181, 6,
- 1, 235, 124, 181, 6, 1, 234, 189, 181, 6, 1, 243, 83, 181, 6, 1, 245,
- 202, 181, 6, 1, 213, 250, 181, 6, 1, 245, 59, 181, 6, 1, 216, 194, 181,
- 6, 1, 245, 82, 181, 6, 1, 210, 92, 181, 6, 1, 245, 75, 181, 6, 1, 210,
- 73, 181, 6, 1, 245, 92, 181, 6, 1, 245, 174, 181, 6, 1, 245, 159, 181, 6,
- 1, 245, 150, 181, 6, 1, 245, 138, 181, 6, 1, 226, 219, 181, 6, 1, 245,
- 38, 181, 4, 1, 199, 73, 181, 4, 1, 199, 75, 181, 4, 1, 199, 61, 181, 4,
- 1, 199, 254, 209, 181, 4, 1, 199, 76, 181, 4, 1, 199, 226, 183, 181, 4,
- 1, 219, 251, 73, 181, 4, 1, 219, 251, 75, 181, 4, 1, 219, 251, 61, 181,
- 4, 1, 219, 251, 254, 209, 181, 4, 1, 219, 251, 76, 181, 4, 1, 219, 251,
- 226, 183, 181, 4, 1, 253, 167, 181, 4, 1, 226, 116, 181, 4, 1, 211, 195,
- 181, 4, 1, 211, 44, 181, 4, 1, 242, 60, 181, 4, 1, 225, 211, 181, 4, 1,
- 252, 66, 181, 4, 1, 217, 11, 181, 4, 1, 248, 77, 181, 4, 1, 250, 128,
- 181, 4, 1, 235, 124, 181, 4, 1, 234, 189, 181, 4, 1, 243, 83, 181, 4, 1,
- 245, 202, 181, 4, 1, 213, 250, 181, 4, 1, 245, 59, 181, 4, 1, 216, 194,
- 181, 4, 1, 245, 82, 181, 4, 1, 210, 92, 181, 4, 1, 245, 75, 181, 4, 1,
- 210, 73, 181, 4, 1, 245, 92, 181, 4, 1, 245, 174, 181, 4, 1, 245, 159,
- 181, 4, 1, 245, 150, 181, 4, 1, 245, 138, 181, 4, 1, 226, 219, 181, 4, 1,
- 245, 38, 220, 69, 1, 225, 209, 220, 69, 1, 216, 5, 220, 69, 1, 234, 91,
- 220, 69, 1, 244, 147, 220, 69, 1, 216, 172, 220, 69, 1, 219, 58, 220, 69,
- 1, 218, 14, 220, 69, 1, 250, 61, 220, 69, 1, 211, 46, 220, 69, 1, 240,
- 209, 220, 69, 1, 252, 5, 220, 69, 1, 248, 89, 220, 69, 1, 243, 121, 220,
- 69, 1, 213, 123, 220, 69, 1, 216, 176, 220, 69, 1, 210, 21, 220, 69, 1,
- 231, 89, 220, 69, 1, 235, 49, 220, 69, 1, 211, 225, 220, 69, 1, 242, 48,
- 220, 69, 1, 232, 142, 220, 69, 1, 230, 189, 220, 69, 1, 236, 40, 220, 69,
- 1, 245, 201, 220, 69, 1, 253, 231, 220, 69, 1, 254, 247, 220, 69, 1, 226,
- 196, 220, 69, 1, 211, 212, 220, 69, 1, 226, 130, 220, 69, 1, 254, 209,
- 220, 69, 1, 222, 208, 220, 69, 1, 227, 194, 220, 69, 1, 245, 217, 220,
- 69, 1, 254, 214, 220, 69, 1, 240, 111, 220, 69, 1, 214, 163, 220, 69, 1,
- 226, 254, 220, 69, 1, 226, 176, 220, 69, 1, 226, 218, 220, 69, 1, 253,
- 170, 220, 69, 1, 254, 19, 220, 69, 1, 226, 158, 220, 69, 1, 254, 192,
- 220, 69, 1, 245, 86, 220, 69, 1, 253, 253, 220, 69, 1, 245, 227, 220, 69,
- 1, 240, 118, 220, 69, 1, 211, 13, 226, 141, 1, 254, 170, 226, 141, 1,
- 252, 191, 226, 141, 1, 217, 105, 226, 141, 1, 235, 141, 226, 141, 1, 211,
- 165, 226, 141, 1, 234, 132, 226, 141, 1, 248, 76, 226, 141, 1, 205, 226,
- 141, 1, 206, 226, 141, 1, 220, 26, 226, 141, 1, 248, 25, 226, 141, 1,
- 250, 215, 226, 141, 1, 243, 135, 226, 141, 1, 244, 196, 226, 141, 1, 224,
- 86, 226, 141, 1, 235, 9, 226, 141, 1, 233, 130, 226, 141, 1, 230, 200,
- 226, 141, 1, 227, 178, 226, 141, 1, 212, 30, 226, 141, 1, 162, 226, 141,
- 1, 191, 226, 141, 1, 61, 226, 141, 1, 75, 226, 141, 1, 73, 226, 141, 1,
- 76, 226, 141, 1, 70, 226, 141, 1, 255, 73, 226, 141, 1, 245, 209, 226,
- 141, 1, 226, 183, 226, 141, 21, 210, 86, 226, 141, 21, 110, 226, 141, 21,
- 105, 226, 141, 21, 158, 226, 141, 21, 161, 226, 141, 21, 189, 226, 141,
- 21, 194, 226, 141, 21, 198, 226, 141, 21, 195, 226, 141, 21, 200, 249,
- 67, 3, 61, 249, 67, 3, 75, 249, 67, 3, 73, 249, 67, 3, 76, 249, 67, 3,
- 70, 249, 67, 3, 235, 141, 249, 67, 3, 235, 68, 249, 67, 3, 176, 249, 67,
- 3, 234, 182, 249, 67, 3, 234, 92, 249, 67, 3, 234, 28, 249, 67, 3, 233,
- 217, 249, 67, 3, 233, 135, 249, 67, 3, 233, 58, 249, 67, 3, 232, 241,
- 249, 67, 3, 232, 156, 249, 67, 3, 232, 98, 249, 67, 3, 184, 249, 67, 3,
- 231, 91, 249, 67, 3, 230, 230, 249, 67, 3, 230, 161, 249, 67, 3, 230,
- 102, 249, 67, 3, 197, 249, 67, 3, 229, 107, 249, 67, 3, 228, 233, 249,
- 67, 3, 228, 74, 249, 67, 3, 227, 237, 249, 67, 3, 190, 249, 67, 3, 225,
- 221, 249, 67, 3, 225, 108, 249, 67, 3, 225, 16, 249, 67, 3, 224, 150,
- 249, 67, 3, 205, 249, 67, 3, 223, 128, 249, 67, 3, 223, 35, 249, 67, 3,
- 222, 211, 249, 67, 3, 222, 140, 249, 67, 3, 206, 249, 67, 3, 221, 181,
- 249, 67, 3, 219, 191, 249, 67, 3, 219, 58, 249, 67, 3, 218, 83, 249, 67,
- 3, 217, 105, 249, 67, 3, 217, 22, 249, 67, 3, 216, 117, 249, 67, 3, 111,
- 249, 67, 3, 215, 118, 249, 67, 3, 212, 65, 249, 67, 3, 212, 22, 249, 67,
- 3, 211, 250, 249, 67, 3, 211, 227, 249, 67, 3, 211, 165, 249, 67, 3, 211,
- 162, 249, 67, 3, 210, 116, 249, 67, 3, 210, 23, 236, 1, 254, 27, 1, 254,
- 168, 236, 1, 254, 27, 1, 252, 25, 236, 1, 254, 27, 1, 242, 201, 236, 1,
- 254, 27, 1, 248, 188, 236, 1, 254, 27, 1, 241, 238, 236, 1, 254, 27, 1,
- 212, 30, 236, 1, 254, 27, 1, 210, 97, 236, 1, 254, 27, 1, 241, 195, 236,
- 1, 254, 27, 1, 216, 226, 236, 1, 254, 27, 1, 210, 232, 236, 1, 254, 27,
- 1, 234, 225, 236, 1, 254, 27, 1, 233, 93, 236, 1, 254, 27, 1, 231, 65,
- 236, 1, 254, 27, 1, 227, 194, 236, 1, 254, 27, 1, 221, 249, 236, 1, 254,
- 27, 1, 253, 162, 236, 1, 254, 27, 1, 225, 221, 236, 1, 254, 27, 1, 222,
- 24, 236, 1, 254, 27, 1, 224, 34, 236, 1, 254, 27, 1, 223, 67, 236, 1,
- 254, 27, 1, 220, 20, 236, 1, 254, 27, 1, 217, 36, 236, 1, 254, 27, 221,
- 173, 50, 236, 1, 254, 27, 54, 110, 236, 1, 254, 27, 54, 105, 236, 1, 254,
- 27, 54, 158, 236, 1, 254, 27, 54, 216, 247, 236, 1, 254, 27, 54, 215, 73,
- 236, 1, 254, 27, 54, 123, 240, 210, 236, 1, 254, 27, 54, 123, 216, 147,
- 236, 1, 254, 27, 54, 216, 248, 216, 147, 225, 119, 1, 254, 165, 225, 119,
- 1, 252, 28, 225, 119, 1, 243, 109, 225, 119, 1, 248, 56, 225, 119, 1,
- 241, 238, 225, 119, 1, 212, 37, 225, 119, 1, 210, 110, 225, 119, 1, 241,
- 197, 225, 119, 1, 216, 230, 225, 119, 1, 210, 233, 225, 119, 1, 234, 250,
- 225, 119, 1, 233, 99, 225, 119, 1, 231, 65, 225, 119, 1, 227, 194, 225,
- 119, 1, 220, 144, 225, 119, 1, 254, 196, 225, 119, 1, 225, 221, 225, 119,
- 1, 222, 25, 225, 119, 1, 224, 39, 225, 119, 1, 222, 189, 225, 119, 1,
- 220, 20, 225, 119, 1, 217, 41, 225, 119, 54, 110, 225, 119, 54, 216, 247,
- 225, 119, 54, 215, 73, 225, 119, 54, 123, 240, 210, 225, 119, 54, 105,
- 225, 119, 54, 158, 225, 119, 211, 209, 220, 137, 232, 59, 1, 61, 232, 59,
- 1, 253, 158, 232, 59, 1, 243, 202, 232, 59, 1, 249, 60, 232, 59, 1, 75,
- 232, 59, 1, 214, 105, 232, 59, 1, 73, 232, 59, 1, 211, 117, 232, 59, 1,
- 235, 23, 232, 59, 1, 156, 232, 59, 1, 193, 232, 59, 1, 230, 25, 232, 59,
- 1, 76, 232, 59, 1, 153, 232, 59, 1, 218, 226, 232, 59, 1, 217, 152, 232,
- 59, 1, 70, 232, 59, 1, 245, 6, 232, 59, 1, 224, 96, 232, 59, 1, 222, 91,
- 232, 59, 1, 215, 159, 232, 59, 1, 254, 123, 232, 59, 1, 245, 150, 232,
- 59, 1, 232, 62, 232, 59, 1, 228, 111, 232, 59, 1, 251, 66, 232, 59, 215,
- 222, 78, 231, 48, 241, 174, 1, 61, 231, 48, 241, 174, 1, 75, 231, 48,
- 241, 174, 1, 73, 231, 48, 241, 174, 1, 76, 231, 48, 241, 174, 1, 191,
- 231, 48, 241, 174, 1, 212, 65, 231, 48, 241, 174, 1, 252, 191, 231, 48,
- 241, 174, 1, 252, 190, 231, 48, 241, 174, 1, 190, 231, 48, 241, 174, 1,
- 184, 231, 48, 241, 174, 1, 197, 231, 48, 241, 174, 1, 229, 228, 231, 48,
- 241, 174, 1, 229, 107, 231, 48, 241, 174, 1, 229, 106, 231, 48, 241, 174,
- 1, 205, 231, 48, 241, 174, 1, 223, 187, 231, 48, 241, 174, 1, 233, 135,
- 231, 48, 241, 174, 1, 234, 132, 231, 48, 241, 174, 1, 241, 189, 231, 48,
- 241, 174, 1, 206, 231, 48, 241, 174, 1, 222, 33, 231, 48, 241, 174, 1,
- 221, 181, 231, 48, 241, 174, 1, 176, 231, 48, 241, 174, 1, 224, 88, 231,
- 48, 241, 174, 1, 217, 105, 231, 48, 241, 174, 1, 217, 104, 231, 48, 241,
- 174, 1, 217, 22, 231, 48, 241, 174, 1, 217, 21, 231, 48, 241, 174, 1,
- 111, 231, 48, 241, 174, 1, 248, 221, 231, 48, 241, 174, 16, 213, 170,
- 231, 48, 241, 174, 16, 213, 169, 231, 48, 249, 94, 1, 61, 231, 48, 249,
- 94, 1, 75, 231, 48, 249, 94, 1, 73, 231, 48, 249, 94, 1, 76, 231, 48,
- 249, 94, 1, 191, 231, 48, 249, 94, 1, 212, 65, 231, 48, 249, 94, 1, 252,
- 191, 231, 48, 249, 94, 1, 190, 231, 48, 249, 94, 1, 184, 231, 48, 249,
- 94, 1, 197, 231, 48, 249, 94, 1, 229, 107, 231, 48, 249, 94, 1, 205, 231,
- 48, 249, 94, 1, 233, 135, 231, 48, 249, 94, 1, 234, 132, 231, 48, 249,
- 94, 1, 241, 189, 231, 48, 249, 94, 1, 206, 231, 48, 249, 94, 1, 254, 23,
- 206, 231, 48, 249, 94, 1, 221, 181, 231, 48, 249, 94, 1, 176, 231, 48,
- 249, 94, 1, 224, 88, 231, 48, 249, 94, 1, 217, 105, 231, 48, 249, 94, 1,
- 217, 22, 231, 48, 249, 94, 1, 111, 231, 48, 249, 94, 1, 248, 221, 231,
- 48, 249, 94, 232, 145, 222, 217, 231, 48, 249, 94, 232, 145, 236, 6, 234,
- 120, 1, 61, 234, 120, 25, 5, 73, 234, 120, 25, 5, 70, 234, 120, 25, 5,
- 149, 153, 234, 120, 25, 5, 75, 234, 120, 25, 5, 76, 234, 120, 25, 233,
- 23, 78, 234, 120, 5, 52, 222, 234, 51, 234, 120, 5, 254, 75, 234, 120, 5,
- 213, 147, 234, 120, 1, 176, 234, 120, 1, 234, 132, 234, 120, 1, 243, 135,
- 234, 120, 1, 242, 249, 234, 120, 1, 251, 33, 234, 120, 1, 250, 157, 234,
- 120, 1, 235, 141, 234, 120, 1, 227, 165, 234, 120, 1, 215, 156, 234, 120,
- 1, 215, 144, 234, 120, 1, 248, 135, 234, 120, 1, 248, 119, 234, 120, 1,
- 228, 110, 234, 120, 1, 217, 105, 234, 120, 1, 216, 208, 234, 120, 1, 248,
- 221, 234, 120, 1, 248, 25, 234, 120, 1, 197, 234, 120, 1, 190, 234, 120,
- 1, 225, 147, 234, 120, 1, 252, 191, 234, 120, 1, 252, 18, 234, 120, 1,
- 184, 234, 120, 1, 191, 234, 120, 1, 205, 234, 120, 1, 233, 135, 234, 120,
- 1, 214, 27, 234, 120, 1, 220, 102, 234, 120, 1, 218, 223, 234, 120, 1,
- 206, 234, 120, 1, 210, 116, 234, 120, 1, 162, 234, 120, 1, 234, 46, 234,
- 120, 1, 215, 124, 234, 120, 5, 252, 141, 48, 234, 120, 5, 250, 221, 234,
- 120, 5, 59, 51, 234, 120, 213, 152, 234, 120, 21, 110, 234, 120, 21, 105,
- 234, 120, 21, 158, 234, 120, 21, 161, 234, 120, 54, 216, 247, 234, 120,
- 54, 215, 73, 234, 120, 54, 123, 240, 210, 234, 120, 54, 123, 216, 147,
- 234, 120, 224, 141, 247, 120, 234, 120, 224, 141, 4, 250, 35, 234, 120,
- 224, 141, 250, 35, 234, 120, 224, 141, 249, 137, 130, 234, 120, 224, 141,
- 231, 180, 234, 120, 224, 141, 232, 115, 234, 120, 224, 141, 248, 178,
- 234, 120, 224, 141, 52, 248, 178, 234, 120, 224, 141, 232, 207, 55, 219,
- 28, 254, 38, 1, 241, 238, 55, 219, 28, 254, 38, 1, 233, 93, 55, 219, 28,
- 254, 38, 1, 241, 195, 55, 219, 28, 254, 38, 1, 231, 65, 55, 219, 28, 254,
- 38, 1, 224, 34, 55, 219, 28, 254, 38, 1, 212, 30, 55, 219, 28, 254, 38,
- 1, 220, 20, 55, 219, 28, 254, 38, 1, 223, 67, 55, 219, 28, 254, 38, 1,
- 252, 25, 55, 219, 28, 254, 38, 1, 217, 36, 55, 219, 28, 254, 38, 1, 221,
- 226, 55, 219, 28, 254, 38, 1, 234, 225, 55, 219, 28, 254, 38, 1, 227,
- 194, 55, 219, 28, 254, 38, 1, 234, 116, 55, 219, 28, 254, 38, 1, 222, 24,
- 55, 219, 28, 254, 38, 1, 221, 249, 55, 219, 28, 254, 38, 1, 244, 154, 55,
- 219, 28, 254, 38, 1, 254, 170, 55, 219, 28, 254, 38, 1, 253, 161, 55,
- 219, 28, 254, 38, 1, 248, 22, 55, 219, 28, 254, 38, 1, 242, 201, 55, 219,
- 28, 254, 38, 1, 248, 188, 55, 219, 28, 254, 38, 1, 242, 238, 55, 219, 28,
- 254, 38, 1, 216, 226, 55, 219, 28, 254, 38, 1, 210, 96, 55, 219, 28, 254,
- 38, 1, 248, 19, 55, 219, 28, 254, 38, 1, 210, 232, 55, 219, 28, 254, 38,
- 1, 216, 197, 55, 219, 28, 254, 38, 1, 216, 178, 55, 219, 28, 254, 38, 54,
- 110, 55, 219, 28, 254, 38, 54, 244, 114, 55, 219, 28, 254, 38, 132, 235,
- 238, 253, 172, 1, 61, 253, 172, 1, 255, 73, 253, 172, 1, 254, 73, 253,
- 172, 1, 255, 32, 253, 172, 1, 254, 123, 253, 172, 1, 255, 33, 253, 172,
- 1, 254, 243, 253, 172, 1, 254, 239, 253, 172, 1, 75, 253, 172, 1, 245,
- 209, 253, 172, 1, 76, 253, 172, 1, 226, 183, 253, 172, 1, 73, 253, 172,
- 1, 236, 33, 253, 172, 1, 70, 253, 172, 1, 214, 118, 253, 172, 1, 234,
- 182, 253, 172, 1, 211, 162, 253, 172, 1, 211, 128, 253, 172, 1, 211, 137,
- 253, 172, 1, 243, 62, 253, 172, 1, 243, 24, 253, 172, 1, 242, 236, 253,
- 172, 1, 250, 190, 253, 172, 1, 235, 126, 253, 172, 1, 217, 22, 253, 172,
- 1, 216, 195, 253, 172, 1, 248, 90, 253, 172, 1, 248, 17, 253, 172, 1,
- 215, 151, 253, 172, 1, 225, 221, 253, 172, 1, 244, 154, 253, 172, 1, 252,
- 75, 253, 172, 1, 252, 14, 253, 172, 1, 229, 64, 253, 172, 1, 228, 239,
- 253, 172, 1, 228, 240, 253, 172, 1, 229, 107, 253, 172, 1, 227, 156, 253,
- 172, 1, 228, 105, 253, 172, 1, 231, 91, 253, 172, 1, 241, 116, 253, 172,
- 1, 210, 166, 253, 172, 1, 211, 47, 253, 172, 1, 213, 255, 253, 172, 1,
- 223, 128, 253, 172, 1, 233, 58, 253, 172, 1, 221, 181, 253, 172, 1, 210,
- 94, 253, 172, 1, 220, 63, 253, 172, 1, 210, 74, 253, 172, 1, 219, 198,
- 253, 172, 1, 218, 193, 253, 172, 1, 241, 238, 253, 172, 255, 21, 78, 216,
- 79, 113, 170, 117, 123, 59, 224, 140, 4, 113, 170, 117, 123, 59, 224,
- 140, 233, 85, 113, 170, 117, 123, 59, 224, 140, 233, 85, 123, 59, 117,
- 113, 170, 224, 140, 233, 85, 113, 222, 232, 117, 123, 222, 234, 224, 140,
- 233, 85, 123, 222, 234, 117, 113, 222, 232, 224, 140, 235, 218, 225, 254,
- 1, 254, 168, 235, 218, 225, 254, 1, 252, 25, 235, 218, 225, 254, 1, 242,
- 201, 235, 218, 225, 254, 1, 248, 188, 235, 218, 225, 254, 1, 241, 238,
- 235, 218, 225, 254, 1, 212, 30, 235, 218, 225, 254, 1, 210, 97, 235, 218,
- 225, 254, 1, 241, 195, 235, 218, 225, 254, 1, 216, 226, 235, 218, 225,
- 254, 1, 210, 232, 235, 218, 225, 254, 1, 234, 225, 235, 218, 225, 254, 1,
- 233, 93, 235, 218, 225, 254, 1, 231, 65, 235, 218, 225, 254, 1, 227, 194,
- 235, 218, 225, 254, 1, 221, 249, 235, 218, 225, 254, 1, 253, 162, 235,
- 218, 225, 254, 1, 225, 221, 235, 218, 225, 254, 1, 222, 24, 235, 218,
- 225, 254, 1, 224, 34, 235, 218, 225, 254, 1, 223, 67, 235, 218, 225, 254,
- 1, 220, 20, 235, 218, 225, 254, 1, 217, 36, 235, 218, 225, 254, 54, 110,
- 235, 218, 225, 254, 54, 105, 235, 218, 225, 254, 54, 158, 235, 218, 225,
- 254, 54, 161, 235, 218, 225, 254, 54, 216, 247, 235, 218, 225, 254, 54,
- 215, 73, 235, 218, 225, 254, 54, 123, 240, 210, 235, 218, 225, 254, 54,
- 123, 216, 147, 235, 218, 226, 72, 1, 254, 168, 235, 218, 226, 72, 1, 252,
- 25, 235, 218, 226, 72, 1, 242, 201, 235, 218, 226, 72, 1, 248, 188, 235,
- 218, 226, 72, 1, 241, 238, 235, 218, 226, 72, 1, 212, 29, 235, 218, 226,
- 72, 1, 210, 97, 235, 218, 226, 72, 1, 241, 195, 235, 218, 226, 72, 1,
- 216, 226, 235, 218, 226, 72, 1, 210, 232, 235, 218, 226, 72, 1, 234, 225,
- 235, 218, 226, 72, 1, 233, 93, 235, 218, 226, 72, 1, 231, 64, 235, 218,
- 226, 72, 1, 227, 194, 235, 218, 226, 72, 1, 221, 249, 235, 218, 226, 72,
- 1, 225, 221, 235, 218, 226, 72, 1, 222, 24, 235, 218, 226, 72, 1, 220,
- 20, 235, 218, 226, 72, 1, 217, 36, 235, 218, 226, 72, 54, 110, 235, 218,
- 226, 72, 54, 105, 235, 218, 226, 72, 54, 158, 235, 218, 226, 72, 54, 161,
- 235, 218, 226, 72, 54, 216, 247, 235, 218, 226, 72, 54, 215, 73, 235,
- 218, 226, 72, 54, 123, 240, 210, 235, 218, 226, 72, 54, 123, 216, 147,
- 55, 201, 1, 226, 149, 61, 55, 201, 1, 211, 37, 61, 55, 201, 1, 211, 37,
- 254, 243, 55, 201, 1, 226, 149, 73, 55, 201, 1, 211, 37, 73, 55, 201, 1,
- 211, 37, 75, 55, 201, 1, 226, 149, 76, 55, 201, 1, 226, 149, 226, 234,
- 55, 201, 1, 211, 37, 226, 234, 55, 201, 1, 226, 149, 255, 25, 55, 201, 1,
- 211, 37, 255, 25, 55, 201, 1, 226, 149, 254, 242, 55, 201, 1, 211, 37,
- 254, 242, 55, 201, 1, 226, 149, 254, 216, 55, 201, 1, 211, 37, 254, 216,
- 55, 201, 1, 226, 149, 254, 237, 55, 201, 1, 211, 37, 254, 237, 55, 201,
- 1, 226, 149, 254, 255, 55, 201, 1, 211, 37, 254, 255, 55, 201, 1, 226,
- 149, 254, 241, 55, 201, 1, 226, 149, 245, 12, 55, 201, 1, 211, 37, 245,
- 12, 55, 201, 1, 226, 149, 253, 167, 55, 201, 1, 211, 37, 253, 167, 55,
- 201, 1, 226, 149, 254, 224, 55, 201, 1, 211, 37, 254, 224, 55, 201, 1,
- 226, 149, 254, 235, 55, 201, 1, 211, 37, 254, 235, 55, 201, 1, 226, 149,
- 226, 233, 55, 201, 1, 211, 37, 226, 233, 55, 201, 1, 226, 149, 254, 178,
- 55, 201, 1, 211, 37, 254, 178, 55, 201, 1, 226, 149, 254, 234, 55, 201,
- 1, 226, 149, 245, 161, 55, 201, 1, 226, 149, 245, 159, 55, 201, 1, 226,
- 149, 254, 123, 55, 201, 1, 226, 149, 254, 232, 55, 201, 1, 211, 37, 254,
- 232, 55, 201, 1, 226, 149, 245, 131, 55, 201, 1, 211, 37, 245, 131, 55,
- 201, 1, 226, 149, 245, 147, 55, 201, 1, 211, 37, 245, 147, 55, 201, 1,
- 226, 149, 245, 118, 55, 201, 1, 211, 37, 245, 118, 55, 201, 1, 211, 37,
- 254, 115, 55, 201, 1, 226, 149, 245, 138, 55, 201, 1, 211, 37, 254, 231,
- 55, 201, 1, 226, 149, 245, 108, 55, 201, 1, 226, 149, 226, 175, 55, 201,
- 1, 226, 149, 240, 113, 55, 201, 1, 226, 149, 245, 215, 55, 201, 1, 211,
- 37, 245, 215, 55, 201, 1, 226, 149, 254, 45, 55, 201, 1, 211, 37, 254,
- 45, 55, 201, 1, 226, 149, 235, 181, 55, 201, 1, 211, 37, 235, 181, 55,
- 201, 1, 226, 149, 226, 159, 55, 201, 1, 211, 37, 226, 159, 55, 201, 1,
- 226, 149, 254, 41, 55, 201, 1, 211, 37, 254, 41, 55, 201, 1, 226, 149,
- 254, 230, 55, 201, 1, 226, 149, 253, 237, 55, 201, 1, 226, 149, 254, 228,
- 55, 201, 1, 226, 149, 253, 231, 55, 201, 1, 211, 37, 253, 231, 55, 201,
- 1, 226, 149, 245, 75, 55, 201, 1, 211, 37, 245, 75, 55, 201, 1, 226, 149,
- 253, 206, 55, 201, 1, 211, 37, 253, 206, 55, 201, 1, 226, 149, 254, 225,
- 55, 201, 1, 211, 37, 254, 225, 55, 201, 1, 226, 149, 226, 140, 55, 201,
- 1, 226, 149, 252, 125, 222, 127, 21, 110, 222, 127, 21, 105, 222, 127,
- 21, 158, 222, 127, 21, 161, 222, 127, 21, 189, 222, 127, 21, 194, 222,
- 127, 21, 198, 222, 127, 21, 195, 222, 127, 21, 200, 222, 127, 54, 216,
- 247, 222, 127, 54, 215, 73, 222, 127, 54, 216, 162, 222, 127, 54, 244,
- 15, 222, 127, 54, 244, 114, 222, 127, 54, 219, 111, 222, 127, 54, 220,
- 116, 222, 127, 54, 245, 184, 222, 127, 54, 228, 195, 222, 127, 54, 123,
- 240, 210, 222, 127, 54, 113, 240, 210, 222, 127, 54, 134, 240, 210, 222,
- 127, 54, 244, 11, 240, 210, 222, 127, 54, 244, 81, 240, 210, 222, 127,
- 54, 219, 125, 240, 210, 222, 127, 54, 220, 122, 240, 210, 222, 127, 54,
- 245, 193, 240, 210, 222, 127, 54, 228, 200, 240, 210, 222, 127, 244, 2,
- 123, 242, 27, 222, 127, 244, 2, 123, 224, 21, 222, 127, 244, 2, 123, 216,
- 168, 222, 127, 244, 2, 113, 216, 166, 118, 5, 250, 255, 118, 5, 254, 75,
- 118, 5, 213, 147, 118, 5, 235, 102, 118, 5, 214, 161, 118, 1, 61, 118, 1,
- 255, 73, 118, 1, 73, 118, 1, 236, 33, 118, 1, 70, 118, 1, 214, 118, 118,
- 1, 149, 153, 118, 1, 149, 222, 180, 118, 1, 149, 156, 118, 1, 149, 232,
- 185, 118, 1, 75, 118, 1, 254, 201, 118, 1, 76, 118, 1, 253, 192, 118, 1,
- 176, 118, 1, 234, 132, 118, 1, 243, 135, 118, 1, 242, 249, 118, 1, 229,
- 77, 118, 1, 251, 33, 118, 1, 250, 157, 118, 1, 235, 141, 118, 1, 235,
- 114, 118, 1, 227, 165, 118, 1, 215, 156, 118, 1, 215, 144, 118, 1, 248,
- 135, 118, 1, 248, 119, 118, 1, 228, 110, 118, 1, 217, 105, 118, 1, 216,
- 208, 118, 1, 248, 221, 118, 1, 248, 25, 118, 1, 197, 118, 1, 190, 118, 1,
- 225, 147, 118, 1, 252, 191, 118, 1, 252, 18, 118, 1, 184, 118, 1, 191,
- 118, 1, 205, 118, 1, 233, 135, 118, 1, 214, 27, 118, 1, 220, 102, 118, 1,
- 218, 223, 118, 1, 206, 118, 1, 162, 118, 1, 232, 184, 118, 1, 55, 36,
- 232, 175, 118, 1, 55, 36, 222, 179, 118, 1, 55, 36, 228, 92, 118, 25, 5,
- 255, 73, 118, 25, 5, 252, 15, 255, 73, 118, 25, 5, 73, 118, 25, 5, 236,
- 33, 118, 25, 5, 70, 118, 25, 5, 214, 118, 118, 25, 5, 149, 153, 118, 25,
- 5, 149, 222, 180, 118, 25, 5, 149, 156, 118, 25, 5, 149, 232, 185, 118,
- 25, 5, 75, 118, 25, 5, 254, 201, 118, 25, 5, 76, 118, 25, 5, 253, 192,
- 118, 213, 152, 118, 248, 178, 118, 52, 248, 178, 118, 224, 141, 247, 120,
- 118, 224, 141, 52, 247, 120, 118, 224, 141, 232, 213, 118, 224, 141, 249,
- 137, 130, 118, 224, 141, 232, 115, 118, 54, 110, 118, 54, 105, 118, 54,
+ 199, 254, 210, 181, 6, 1, 199, 76, 181, 6, 1, 199, 226, 184, 181, 6, 1,
+ 219, 252, 73, 181, 6, 1, 219, 252, 75, 181, 6, 1, 219, 252, 61, 181, 6,
+ 1, 219, 252, 254, 210, 181, 6, 1, 219, 252, 76, 181, 6, 1, 219, 252, 226,
+ 184, 181, 6, 1, 253, 168, 181, 6, 1, 226, 117, 181, 6, 1, 211, 195, 181,
+ 6, 1, 211, 44, 181, 6, 1, 242, 61, 181, 6, 1, 225, 212, 181, 6, 1, 252,
+ 67, 181, 6, 1, 217, 12, 181, 6, 1, 248, 78, 181, 6, 1, 250, 129, 181, 6,
+ 1, 235, 125, 181, 6, 1, 234, 190, 181, 6, 1, 243, 84, 181, 6, 1, 245,
+ 203, 181, 6, 1, 213, 250, 181, 6, 1, 245, 60, 181, 6, 1, 216, 195, 181,
+ 6, 1, 245, 83, 181, 6, 1, 210, 92, 181, 6, 1, 245, 76, 181, 6, 1, 210,
+ 73, 181, 6, 1, 245, 93, 181, 6, 1, 245, 175, 181, 6, 1, 245, 160, 181, 6,
+ 1, 245, 151, 181, 6, 1, 245, 139, 181, 6, 1, 226, 220, 181, 6, 1, 245,
+ 39, 181, 4, 1, 199, 73, 181, 4, 1, 199, 75, 181, 4, 1, 199, 61, 181, 4,
+ 1, 199, 254, 210, 181, 4, 1, 199, 76, 181, 4, 1, 199, 226, 184, 181, 4,
+ 1, 219, 252, 73, 181, 4, 1, 219, 252, 75, 181, 4, 1, 219, 252, 61, 181,
+ 4, 1, 219, 252, 254, 210, 181, 4, 1, 219, 252, 76, 181, 4, 1, 219, 252,
+ 226, 184, 181, 4, 1, 253, 168, 181, 4, 1, 226, 117, 181, 4, 1, 211, 195,
+ 181, 4, 1, 211, 44, 181, 4, 1, 242, 61, 181, 4, 1, 225, 212, 181, 4, 1,
+ 252, 67, 181, 4, 1, 217, 12, 181, 4, 1, 248, 78, 181, 4, 1, 250, 129,
+ 181, 4, 1, 235, 125, 181, 4, 1, 234, 190, 181, 4, 1, 243, 84, 181, 4, 1,
+ 245, 203, 181, 4, 1, 213, 250, 181, 4, 1, 245, 60, 181, 4, 1, 216, 195,
+ 181, 4, 1, 245, 83, 181, 4, 1, 210, 92, 181, 4, 1, 245, 76, 181, 4, 1,
+ 210, 73, 181, 4, 1, 245, 93, 181, 4, 1, 245, 175, 181, 4, 1, 245, 160,
+ 181, 4, 1, 245, 151, 181, 4, 1, 245, 139, 181, 4, 1, 226, 220, 181, 4, 1,
+ 245, 39, 220, 70, 1, 225, 210, 220, 70, 1, 216, 6, 220, 70, 1, 234, 92,
+ 220, 70, 1, 244, 148, 220, 70, 1, 216, 173, 220, 70, 1, 219, 59, 220, 70,
+ 1, 218, 15, 220, 70, 1, 250, 62, 220, 70, 1, 211, 46, 220, 70, 1, 240,
+ 210, 220, 70, 1, 252, 6, 220, 70, 1, 248, 90, 220, 70, 1, 243, 122, 220,
+ 70, 1, 213, 123, 220, 70, 1, 216, 177, 220, 70, 1, 210, 21, 220, 70, 1,
+ 231, 90, 220, 70, 1, 235, 50, 220, 70, 1, 211, 225, 220, 70, 1, 242, 49,
+ 220, 70, 1, 232, 143, 220, 70, 1, 230, 190, 220, 70, 1, 236, 41, 220, 70,
+ 1, 245, 202, 220, 70, 1, 253, 232, 220, 70, 1, 254, 248, 220, 70, 1, 226,
+ 197, 220, 70, 1, 211, 212, 220, 70, 1, 226, 131, 220, 70, 1, 254, 210,
+ 220, 70, 1, 222, 209, 220, 70, 1, 227, 195, 220, 70, 1, 245, 218, 220,
+ 70, 1, 254, 215, 220, 70, 1, 240, 112, 220, 70, 1, 214, 163, 220, 70, 1,
+ 226, 255, 220, 70, 1, 226, 177, 220, 70, 1, 226, 219, 220, 70, 1, 253,
+ 171, 220, 70, 1, 254, 20, 220, 70, 1, 226, 159, 220, 70, 1, 254, 193,
+ 220, 70, 1, 245, 87, 220, 70, 1, 253, 254, 220, 70, 1, 245, 228, 220, 70,
+ 1, 240, 119, 220, 70, 1, 211, 13, 226, 142, 1, 254, 171, 226, 142, 1,
+ 252, 192, 226, 142, 1, 217, 106, 226, 142, 1, 235, 142, 226, 142, 1, 211,
+ 165, 226, 142, 1, 234, 133, 226, 142, 1, 248, 77, 226, 142, 1, 205, 226,
+ 142, 1, 206, 226, 142, 1, 220, 27, 226, 142, 1, 248, 26, 226, 142, 1,
+ 250, 216, 226, 142, 1, 243, 136, 226, 142, 1, 244, 197, 226, 142, 1, 224,
+ 87, 226, 142, 1, 235, 10, 226, 142, 1, 233, 131, 226, 142, 1, 230, 201,
+ 226, 142, 1, 227, 179, 226, 142, 1, 212, 30, 226, 142, 1, 162, 226, 142,
+ 1, 191, 226, 142, 1, 61, 226, 142, 1, 75, 226, 142, 1, 73, 226, 142, 1,
+ 76, 226, 142, 1, 70, 226, 142, 1, 255, 74, 226, 142, 1, 245, 210, 226,
+ 142, 1, 226, 184, 226, 142, 21, 210, 86, 226, 142, 21, 110, 226, 142, 21,
+ 105, 226, 142, 21, 158, 226, 142, 21, 161, 226, 142, 21, 189, 226, 142,
+ 21, 194, 226, 142, 21, 198, 226, 142, 21, 195, 226, 142, 21, 200, 249,
+ 68, 3, 61, 249, 68, 3, 75, 249, 68, 3, 73, 249, 68, 3, 76, 249, 68, 3,
+ 70, 249, 68, 3, 235, 142, 249, 68, 3, 235, 69, 249, 68, 3, 176, 249, 68,
+ 3, 234, 183, 249, 68, 3, 234, 93, 249, 68, 3, 234, 29, 249, 68, 3, 233,
+ 218, 249, 68, 3, 233, 136, 249, 68, 3, 233, 59, 249, 68, 3, 232, 242,
+ 249, 68, 3, 232, 157, 249, 68, 3, 232, 99, 249, 68, 3, 185, 249, 68, 3,
+ 231, 92, 249, 68, 3, 230, 231, 249, 68, 3, 230, 162, 249, 68, 3, 230,
+ 103, 249, 68, 3, 197, 249, 68, 3, 229, 108, 249, 68, 3, 228, 234, 249,
+ 68, 3, 228, 75, 249, 68, 3, 227, 238, 249, 68, 3, 190, 249, 68, 3, 225,
+ 222, 249, 68, 3, 225, 109, 249, 68, 3, 225, 17, 249, 68, 3, 224, 151,
+ 249, 68, 3, 205, 249, 68, 3, 223, 129, 249, 68, 3, 223, 36, 249, 68, 3,
+ 222, 212, 249, 68, 3, 222, 141, 249, 68, 3, 206, 249, 68, 3, 221, 182,
+ 249, 68, 3, 219, 192, 249, 68, 3, 219, 59, 249, 68, 3, 218, 84, 249, 68,
+ 3, 217, 106, 249, 68, 3, 217, 23, 249, 68, 3, 216, 118, 249, 68, 3, 111,
+ 249, 68, 3, 215, 119, 249, 68, 3, 212, 65, 249, 68, 3, 212, 22, 249, 68,
+ 3, 211, 250, 249, 68, 3, 211, 227, 249, 68, 3, 211, 165, 249, 68, 3, 211,
+ 162, 249, 68, 3, 210, 116, 249, 68, 3, 210, 23, 236, 2, 254, 28, 1, 254,
+ 169, 236, 2, 254, 28, 1, 252, 26, 236, 2, 254, 28, 1, 242, 202, 236, 2,
+ 254, 28, 1, 248, 189, 236, 2, 254, 28, 1, 241, 239, 236, 2, 254, 28, 1,
+ 212, 30, 236, 2, 254, 28, 1, 210, 97, 236, 2, 254, 28, 1, 241, 196, 236,
+ 2, 254, 28, 1, 216, 227, 236, 2, 254, 28, 1, 210, 232, 236, 2, 254, 28,
+ 1, 234, 226, 236, 2, 254, 28, 1, 233, 94, 236, 2, 254, 28, 1, 231, 66,
+ 236, 2, 254, 28, 1, 227, 195, 236, 2, 254, 28, 1, 221, 250, 236, 2, 254,
+ 28, 1, 253, 163, 236, 2, 254, 28, 1, 225, 222, 236, 2, 254, 28, 1, 222,
+ 25, 236, 2, 254, 28, 1, 224, 35, 236, 2, 254, 28, 1, 223, 68, 236, 2,
+ 254, 28, 1, 220, 21, 236, 2, 254, 28, 1, 217, 37, 236, 2, 254, 28, 221,
+ 174, 50, 236, 2, 254, 28, 54, 110, 236, 2, 254, 28, 54, 105, 236, 2, 254,
+ 28, 54, 158, 236, 2, 254, 28, 54, 216, 248, 236, 2, 254, 28, 54, 215, 73,
+ 236, 2, 254, 28, 54, 123, 240, 211, 236, 2, 254, 28, 54, 123, 216, 148,
+ 236, 2, 254, 28, 54, 216, 249, 216, 148, 225, 120, 1, 254, 166, 225, 120,
+ 1, 252, 29, 225, 120, 1, 243, 110, 225, 120, 1, 248, 57, 225, 120, 1,
+ 241, 239, 225, 120, 1, 212, 37, 225, 120, 1, 210, 110, 225, 120, 1, 241,
+ 198, 225, 120, 1, 216, 231, 225, 120, 1, 210, 233, 225, 120, 1, 234, 251,
+ 225, 120, 1, 233, 100, 225, 120, 1, 231, 66, 225, 120, 1, 227, 195, 225,
+ 120, 1, 220, 145, 225, 120, 1, 254, 197, 225, 120, 1, 225, 222, 225, 120,
+ 1, 222, 26, 225, 120, 1, 224, 40, 225, 120, 1, 222, 190, 225, 120, 1,
+ 220, 21, 225, 120, 1, 217, 42, 225, 120, 54, 110, 225, 120, 54, 216, 248,
+ 225, 120, 54, 215, 73, 225, 120, 54, 123, 240, 211, 225, 120, 54, 105,
+ 225, 120, 54, 158, 225, 120, 211, 209, 220, 138, 232, 60, 1, 61, 232, 60,
+ 1, 253, 159, 232, 60, 1, 243, 203, 232, 60, 1, 249, 61, 232, 60, 1, 75,
+ 232, 60, 1, 214, 105, 232, 60, 1, 73, 232, 60, 1, 211, 117, 232, 60, 1,
+ 235, 24, 232, 60, 1, 156, 232, 60, 1, 193, 232, 60, 1, 230, 26, 232, 60,
+ 1, 76, 232, 60, 1, 153, 232, 60, 1, 218, 227, 232, 60, 1, 217, 153, 232,
+ 60, 1, 70, 232, 60, 1, 245, 7, 232, 60, 1, 224, 97, 232, 60, 1, 222, 92,
+ 232, 60, 1, 215, 160, 232, 60, 1, 254, 124, 232, 60, 1, 245, 151, 232,
+ 60, 1, 232, 63, 232, 60, 1, 228, 112, 232, 60, 1, 251, 67, 232, 60, 215,
+ 223, 78, 231, 49, 241, 175, 1, 61, 231, 49, 241, 175, 1, 75, 231, 49,
+ 241, 175, 1, 73, 231, 49, 241, 175, 1, 76, 231, 49, 241, 175, 1, 191,
+ 231, 49, 241, 175, 1, 212, 65, 231, 49, 241, 175, 1, 252, 192, 231, 49,
+ 241, 175, 1, 252, 191, 231, 49, 241, 175, 1, 190, 231, 49, 241, 175, 1,
+ 185, 231, 49, 241, 175, 1, 197, 231, 49, 241, 175, 1, 229, 229, 231, 49,
+ 241, 175, 1, 229, 108, 231, 49, 241, 175, 1, 229, 107, 231, 49, 241, 175,
+ 1, 205, 231, 49, 241, 175, 1, 223, 188, 231, 49, 241, 175, 1, 233, 136,
+ 231, 49, 241, 175, 1, 234, 133, 231, 49, 241, 175, 1, 241, 190, 231, 49,
+ 241, 175, 1, 206, 231, 49, 241, 175, 1, 222, 34, 231, 49, 241, 175, 1,
+ 221, 182, 231, 49, 241, 175, 1, 176, 231, 49, 241, 175, 1, 224, 89, 231,
+ 49, 241, 175, 1, 217, 106, 231, 49, 241, 175, 1, 217, 105, 231, 49, 241,
+ 175, 1, 217, 23, 231, 49, 241, 175, 1, 217, 22, 231, 49, 241, 175, 1,
+ 111, 231, 49, 241, 175, 1, 248, 222, 231, 49, 241, 175, 16, 213, 170,
+ 231, 49, 241, 175, 16, 213, 169, 231, 49, 249, 95, 1, 61, 231, 49, 249,
+ 95, 1, 75, 231, 49, 249, 95, 1, 73, 231, 49, 249, 95, 1, 76, 231, 49,
+ 249, 95, 1, 191, 231, 49, 249, 95, 1, 212, 65, 231, 49, 249, 95, 1, 252,
+ 192, 231, 49, 249, 95, 1, 190, 231, 49, 249, 95, 1, 185, 231, 49, 249,
+ 95, 1, 197, 231, 49, 249, 95, 1, 229, 108, 231, 49, 249, 95, 1, 205, 231,
+ 49, 249, 95, 1, 233, 136, 231, 49, 249, 95, 1, 234, 133, 231, 49, 249,
+ 95, 1, 241, 190, 231, 49, 249, 95, 1, 206, 231, 49, 249, 95, 1, 254, 24,
+ 206, 231, 49, 249, 95, 1, 221, 182, 231, 49, 249, 95, 1, 176, 231, 49,
+ 249, 95, 1, 224, 89, 231, 49, 249, 95, 1, 217, 106, 231, 49, 249, 95, 1,
+ 217, 23, 231, 49, 249, 95, 1, 111, 231, 49, 249, 95, 1, 248, 222, 231,
+ 49, 249, 95, 232, 146, 222, 218, 231, 49, 249, 95, 232, 146, 236, 7, 234,
+ 121, 1, 61, 234, 121, 25, 5, 73, 234, 121, 25, 5, 70, 234, 121, 25, 5,
+ 149, 153, 234, 121, 25, 5, 75, 234, 121, 25, 5, 76, 234, 121, 25, 233,
+ 24, 78, 234, 121, 5, 52, 222, 235, 51, 234, 121, 5, 254, 76, 234, 121, 5,
+ 213, 147, 234, 121, 1, 176, 234, 121, 1, 234, 133, 234, 121, 1, 243, 136,
+ 234, 121, 1, 242, 250, 234, 121, 1, 251, 34, 234, 121, 1, 250, 158, 234,
+ 121, 1, 235, 142, 234, 121, 1, 227, 166, 234, 121, 1, 215, 157, 234, 121,
+ 1, 215, 145, 234, 121, 1, 248, 136, 234, 121, 1, 248, 120, 234, 121, 1,
+ 228, 111, 234, 121, 1, 217, 106, 234, 121, 1, 216, 209, 234, 121, 1, 248,
+ 222, 234, 121, 1, 248, 26, 234, 121, 1, 197, 234, 121, 1, 190, 234, 121,
+ 1, 225, 148, 234, 121, 1, 252, 192, 234, 121, 1, 252, 19, 234, 121, 1,
+ 185, 234, 121, 1, 191, 234, 121, 1, 205, 234, 121, 1, 233, 136, 234, 121,
+ 1, 214, 27, 234, 121, 1, 220, 103, 234, 121, 1, 218, 224, 234, 121, 1,
+ 206, 234, 121, 1, 210, 116, 234, 121, 1, 162, 234, 121, 1, 234, 47, 234,
+ 121, 1, 215, 125, 234, 121, 5, 252, 142, 48, 234, 121, 5, 250, 222, 234,
+ 121, 5, 59, 51, 234, 121, 213, 152, 234, 121, 21, 110, 234, 121, 21, 105,
+ 234, 121, 21, 158, 234, 121, 21, 161, 234, 121, 54, 216, 248, 234, 121,
+ 54, 215, 73, 234, 121, 54, 123, 240, 211, 234, 121, 54, 123, 216, 148,
+ 234, 121, 224, 142, 247, 121, 234, 121, 224, 142, 4, 250, 36, 234, 121,
+ 224, 142, 250, 36, 234, 121, 224, 142, 249, 138, 130, 234, 121, 224, 142,
+ 231, 181, 234, 121, 224, 142, 232, 116, 234, 121, 224, 142, 248, 179,
+ 234, 121, 224, 142, 52, 248, 179, 234, 121, 224, 142, 232, 208, 55, 219,
+ 29, 254, 39, 1, 241, 239, 55, 219, 29, 254, 39, 1, 233, 94, 55, 219, 29,
+ 254, 39, 1, 241, 196, 55, 219, 29, 254, 39, 1, 231, 66, 55, 219, 29, 254,
+ 39, 1, 224, 35, 55, 219, 29, 254, 39, 1, 212, 30, 55, 219, 29, 254, 39,
+ 1, 220, 21, 55, 219, 29, 254, 39, 1, 223, 68, 55, 219, 29, 254, 39, 1,
+ 252, 26, 55, 219, 29, 254, 39, 1, 217, 37, 55, 219, 29, 254, 39, 1, 221,
+ 227, 55, 219, 29, 254, 39, 1, 234, 226, 55, 219, 29, 254, 39, 1, 227,
+ 195, 55, 219, 29, 254, 39, 1, 234, 117, 55, 219, 29, 254, 39, 1, 222, 25,
+ 55, 219, 29, 254, 39, 1, 221, 250, 55, 219, 29, 254, 39, 1, 244, 155, 55,
+ 219, 29, 254, 39, 1, 254, 171, 55, 219, 29, 254, 39, 1, 253, 162, 55,
+ 219, 29, 254, 39, 1, 248, 23, 55, 219, 29, 254, 39, 1, 242, 202, 55, 219,
+ 29, 254, 39, 1, 248, 189, 55, 219, 29, 254, 39, 1, 242, 239, 55, 219, 29,
+ 254, 39, 1, 216, 227, 55, 219, 29, 254, 39, 1, 210, 96, 55, 219, 29, 254,
+ 39, 1, 248, 20, 55, 219, 29, 254, 39, 1, 210, 232, 55, 219, 29, 254, 39,
+ 1, 216, 198, 55, 219, 29, 254, 39, 1, 216, 179, 55, 219, 29, 254, 39, 54,
+ 110, 55, 219, 29, 254, 39, 54, 244, 115, 55, 219, 29, 254, 39, 132, 235,
+ 239, 253, 173, 1, 61, 253, 173, 1, 255, 74, 253, 173, 1, 254, 74, 253,
+ 173, 1, 255, 33, 253, 173, 1, 254, 124, 253, 173, 1, 255, 34, 253, 173,
+ 1, 254, 244, 253, 173, 1, 254, 240, 253, 173, 1, 75, 253, 173, 1, 245,
+ 210, 253, 173, 1, 76, 253, 173, 1, 226, 184, 253, 173, 1, 73, 253, 173,
+ 1, 236, 34, 253, 173, 1, 70, 253, 173, 1, 214, 118, 253, 173, 1, 234,
+ 183, 253, 173, 1, 211, 162, 253, 173, 1, 211, 128, 253, 173, 1, 211, 137,
+ 253, 173, 1, 243, 63, 253, 173, 1, 243, 25, 253, 173, 1, 242, 237, 253,
+ 173, 1, 250, 191, 253, 173, 1, 235, 127, 253, 173, 1, 217, 23, 253, 173,
+ 1, 216, 196, 253, 173, 1, 248, 91, 253, 173, 1, 248, 18, 253, 173, 1,
+ 215, 152, 253, 173, 1, 225, 222, 253, 173, 1, 244, 155, 253, 173, 1, 252,
+ 76, 253, 173, 1, 252, 15, 253, 173, 1, 229, 65, 253, 173, 1, 228, 240,
+ 253, 173, 1, 228, 241, 253, 173, 1, 229, 108, 253, 173, 1, 227, 157, 253,
+ 173, 1, 228, 106, 253, 173, 1, 231, 92, 253, 173, 1, 241, 117, 253, 173,
+ 1, 210, 166, 253, 173, 1, 211, 47, 253, 173, 1, 213, 255, 253, 173, 1,
+ 223, 129, 253, 173, 1, 233, 59, 253, 173, 1, 221, 182, 253, 173, 1, 210,
+ 94, 253, 173, 1, 220, 64, 253, 173, 1, 210, 74, 253, 173, 1, 219, 199,
+ 253, 173, 1, 218, 194, 253, 173, 1, 241, 239, 253, 173, 255, 22, 78, 216,
+ 80, 113, 170, 117, 123, 59, 224, 141, 4, 113, 170, 117, 123, 59, 224,
+ 141, 233, 86, 113, 170, 117, 123, 59, 224, 141, 233, 86, 123, 59, 117,
+ 113, 170, 224, 141, 233, 86, 113, 222, 233, 117, 123, 222, 235, 224, 141,
+ 233, 86, 123, 222, 235, 117, 113, 222, 233, 224, 141, 235, 219, 225, 255,
+ 1, 254, 169, 235, 219, 225, 255, 1, 252, 26, 235, 219, 225, 255, 1, 242,
+ 202, 235, 219, 225, 255, 1, 248, 189, 235, 219, 225, 255, 1, 241, 239,
+ 235, 219, 225, 255, 1, 212, 30, 235, 219, 225, 255, 1, 210, 97, 235, 219,
+ 225, 255, 1, 241, 196, 235, 219, 225, 255, 1, 216, 227, 235, 219, 225,
+ 255, 1, 210, 232, 235, 219, 225, 255, 1, 234, 226, 235, 219, 225, 255, 1,
+ 233, 94, 235, 219, 225, 255, 1, 231, 66, 235, 219, 225, 255, 1, 227, 195,
+ 235, 219, 225, 255, 1, 221, 250, 235, 219, 225, 255, 1, 253, 163, 235,
+ 219, 225, 255, 1, 225, 222, 235, 219, 225, 255, 1, 222, 25, 235, 219,
+ 225, 255, 1, 224, 35, 235, 219, 225, 255, 1, 223, 68, 235, 219, 225, 255,
+ 1, 220, 21, 235, 219, 225, 255, 1, 217, 37, 235, 219, 225, 255, 54, 110,
+ 235, 219, 225, 255, 54, 105, 235, 219, 225, 255, 54, 158, 235, 219, 225,
+ 255, 54, 161, 235, 219, 225, 255, 54, 216, 248, 235, 219, 225, 255, 54,
+ 215, 73, 235, 219, 225, 255, 54, 123, 240, 211, 235, 219, 225, 255, 54,
+ 123, 216, 148, 235, 219, 226, 73, 1, 254, 169, 235, 219, 226, 73, 1, 252,
+ 26, 235, 219, 226, 73, 1, 242, 202, 235, 219, 226, 73, 1, 248, 189, 235,
+ 219, 226, 73, 1, 241, 239, 235, 219, 226, 73, 1, 212, 29, 235, 219, 226,
+ 73, 1, 210, 97, 235, 219, 226, 73, 1, 241, 196, 235, 219, 226, 73, 1,
+ 216, 227, 235, 219, 226, 73, 1, 210, 232, 235, 219, 226, 73, 1, 234, 226,
+ 235, 219, 226, 73, 1, 233, 94, 235, 219, 226, 73, 1, 231, 65, 235, 219,
+ 226, 73, 1, 227, 195, 235, 219, 226, 73, 1, 221, 250, 235, 219, 226, 73,
+ 1, 225, 222, 235, 219, 226, 73, 1, 222, 25, 235, 219, 226, 73, 1, 220,
+ 21, 235, 219, 226, 73, 1, 217, 37, 235, 219, 226, 73, 54, 110, 235, 219,
+ 226, 73, 54, 105, 235, 219, 226, 73, 54, 158, 235, 219, 226, 73, 54, 161,
+ 235, 219, 226, 73, 54, 216, 248, 235, 219, 226, 73, 54, 215, 73, 235,
+ 219, 226, 73, 54, 123, 240, 211, 235, 219, 226, 73, 54, 123, 216, 148,
+ 55, 201, 1, 226, 150, 61, 55, 201, 1, 211, 37, 61, 55, 201, 1, 211, 37,
+ 254, 244, 55, 201, 1, 226, 150, 73, 55, 201, 1, 211, 37, 73, 55, 201, 1,
+ 211, 37, 75, 55, 201, 1, 226, 150, 76, 55, 201, 1, 226, 150, 226, 235,
+ 55, 201, 1, 211, 37, 226, 235, 55, 201, 1, 226, 150, 255, 26, 55, 201, 1,
+ 211, 37, 255, 26, 55, 201, 1, 226, 150, 254, 243, 55, 201, 1, 211, 37,
+ 254, 243, 55, 201, 1, 226, 150, 254, 217, 55, 201, 1, 211, 37, 254, 217,
+ 55, 201, 1, 226, 150, 254, 238, 55, 201, 1, 211, 37, 254, 238, 55, 201,
+ 1, 226, 150, 255, 0, 55, 201, 1, 211, 37, 255, 0, 55, 201, 1, 226, 150,
+ 254, 242, 55, 201, 1, 226, 150, 245, 13, 55, 201, 1, 211, 37, 245, 13,
+ 55, 201, 1, 226, 150, 253, 168, 55, 201, 1, 211, 37, 253, 168, 55, 201,
+ 1, 226, 150, 254, 225, 55, 201, 1, 211, 37, 254, 225, 55, 201, 1, 226,
+ 150, 254, 236, 55, 201, 1, 211, 37, 254, 236, 55, 201, 1, 226, 150, 226,
+ 234, 55, 201, 1, 211, 37, 226, 234, 55, 201, 1, 226, 150, 254, 179, 55,
+ 201, 1, 211, 37, 254, 179, 55, 201, 1, 226, 150, 254, 235, 55, 201, 1,
+ 226, 150, 245, 162, 55, 201, 1, 226, 150, 245, 160, 55, 201, 1, 226, 150,
+ 254, 124, 55, 201, 1, 226, 150, 254, 233, 55, 201, 1, 211, 37, 254, 233,
+ 55, 201, 1, 226, 150, 245, 132, 55, 201, 1, 211, 37, 245, 132, 55, 201,
+ 1, 226, 150, 245, 148, 55, 201, 1, 211, 37, 245, 148, 55, 201, 1, 226,
+ 150, 245, 119, 55, 201, 1, 211, 37, 245, 119, 55, 201, 1, 211, 37, 254,
+ 116, 55, 201, 1, 226, 150, 245, 139, 55, 201, 1, 211, 37, 254, 232, 55,
+ 201, 1, 226, 150, 245, 109, 55, 201, 1, 226, 150, 226, 176, 55, 201, 1,
+ 226, 150, 240, 114, 55, 201, 1, 226, 150, 245, 216, 55, 201, 1, 211, 37,
+ 245, 216, 55, 201, 1, 226, 150, 254, 46, 55, 201, 1, 211, 37, 254, 46,
+ 55, 201, 1, 226, 150, 235, 182, 55, 201, 1, 211, 37, 235, 182, 55, 201,
+ 1, 226, 150, 226, 160, 55, 201, 1, 211, 37, 226, 160, 55, 201, 1, 226,
+ 150, 254, 42, 55, 201, 1, 211, 37, 254, 42, 55, 201, 1, 226, 150, 254,
+ 231, 55, 201, 1, 226, 150, 253, 238, 55, 201, 1, 226, 150, 254, 229, 55,
+ 201, 1, 226, 150, 253, 232, 55, 201, 1, 211, 37, 253, 232, 55, 201, 1,
+ 226, 150, 245, 76, 55, 201, 1, 211, 37, 245, 76, 55, 201, 1, 226, 150,
+ 253, 207, 55, 201, 1, 211, 37, 253, 207, 55, 201, 1, 226, 150, 254, 226,
+ 55, 201, 1, 211, 37, 254, 226, 55, 201, 1, 226, 150, 226, 141, 55, 201,
+ 1, 226, 150, 252, 126, 222, 128, 21, 110, 222, 128, 21, 105, 222, 128,
+ 21, 158, 222, 128, 21, 161, 222, 128, 21, 189, 222, 128, 21, 194, 222,
+ 128, 21, 198, 222, 128, 21, 195, 222, 128, 21, 200, 222, 128, 54, 216,
+ 248, 222, 128, 54, 215, 73, 222, 128, 54, 216, 163, 222, 128, 54, 244,
+ 16, 222, 128, 54, 244, 115, 222, 128, 54, 219, 112, 222, 128, 54, 220,
+ 117, 222, 128, 54, 245, 185, 222, 128, 54, 228, 196, 222, 128, 54, 123,
+ 240, 211, 222, 128, 54, 113, 240, 211, 222, 128, 54, 134, 240, 211, 222,
+ 128, 54, 244, 12, 240, 211, 222, 128, 54, 244, 82, 240, 211, 222, 128,
+ 54, 219, 126, 240, 211, 222, 128, 54, 220, 123, 240, 211, 222, 128, 54,
+ 245, 194, 240, 211, 222, 128, 54, 228, 201, 240, 211, 222, 128, 244, 3,
+ 123, 242, 28, 222, 128, 244, 3, 123, 224, 22, 222, 128, 244, 3, 123, 216,
+ 169, 222, 128, 244, 3, 113, 216, 167, 118, 5, 251, 0, 118, 5, 254, 76,
+ 118, 5, 213, 147, 118, 5, 235, 103, 118, 5, 214, 161, 118, 1, 61, 118, 1,
+ 255, 74, 118, 1, 73, 118, 1, 236, 34, 118, 1, 70, 118, 1, 214, 118, 118,
+ 1, 149, 153, 118, 1, 149, 222, 181, 118, 1, 149, 156, 118, 1, 149, 232,
+ 186, 118, 1, 75, 118, 1, 254, 202, 118, 1, 76, 118, 1, 253, 193, 118, 1,
+ 176, 118, 1, 234, 133, 118, 1, 243, 136, 118, 1, 242, 250, 118, 1, 229,
+ 78, 118, 1, 251, 34, 118, 1, 250, 158, 118, 1, 235, 142, 118, 1, 235,
+ 115, 118, 1, 227, 166, 118, 1, 215, 157, 118, 1, 215, 145, 118, 1, 248,
+ 136, 118, 1, 248, 120, 118, 1, 228, 111, 118, 1, 217, 106, 118, 1, 216,
+ 209, 118, 1, 248, 222, 118, 1, 248, 26, 118, 1, 197, 118, 1, 190, 118, 1,
+ 225, 148, 118, 1, 252, 192, 118, 1, 252, 19, 118, 1, 185, 118, 1, 191,
+ 118, 1, 205, 118, 1, 233, 136, 118, 1, 214, 27, 118, 1, 220, 103, 118, 1,
+ 218, 224, 118, 1, 206, 118, 1, 162, 118, 1, 232, 185, 118, 1, 55, 36,
+ 232, 176, 118, 1, 55, 36, 222, 180, 118, 1, 55, 36, 228, 93, 118, 25, 5,
+ 255, 74, 118, 25, 5, 252, 16, 255, 74, 118, 25, 5, 73, 118, 25, 5, 236,
+ 34, 118, 25, 5, 70, 118, 25, 5, 214, 118, 118, 25, 5, 149, 153, 118, 25,
+ 5, 149, 222, 181, 118, 25, 5, 149, 156, 118, 25, 5, 149, 232, 186, 118,
+ 25, 5, 75, 118, 25, 5, 254, 202, 118, 25, 5, 76, 118, 25, 5, 253, 193,
+ 118, 213, 152, 118, 248, 179, 118, 52, 248, 179, 118, 224, 142, 247, 121,
+ 118, 224, 142, 52, 247, 121, 118, 224, 142, 232, 214, 118, 224, 142, 249,
+ 138, 130, 118, 224, 142, 232, 116, 118, 54, 110, 118, 54, 105, 118, 54,
158, 118, 54, 161, 118, 54, 189, 118, 54, 194, 118, 54, 198, 118, 54,
- 195, 118, 54, 200, 118, 54, 216, 247, 118, 54, 215, 73, 118, 54, 216,
- 162, 118, 54, 244, 15, 118, 54, 244, 114, 118, 54, 219, 111, 118, 54,
- 220, 116, 118, 54, 245, 184, 118, 54, 228, 195, 118, 54, 123, 240, 210,
- 118, 54, 123, 216, 147, 118, 21, 210, 86, 118, 21, 110, 118, 21, 105,
+ 195, 118, 54, 200, 118, 54, 216, 248, 118, 54, 215, 73, 118, 54, 216,
+ 163, 118, 54, 244, 16, 118, 54, 244, 115, 118, 54, 219, 112, 118, 54,
+ 220, 117, 118, 54, 245, 185, 118, 54, 228, 196, 118, 54, 123, 240, 211,
+ 118, 54, 123, 216, 148, 118, 21, 210, 86, 118, 21, 110, 118, 21, 105,
118, 21, 158, 118, 21, 161, 118, 21, 189, 118, 21, 194, 118, 21, 198,
- 118, 21, 195, 118, 21, 200, 234, 244, 5, 250, 255, 234, 244, 5, 254, 75,
- 234, 244, 5, 213, 147, 234, 244, 1, 61, 234, 244, 1, 255, 73, 234, 244,
- 1, 73, 234, 244, 1, 236, 33, 234, 244, 1, 70, 234, 244, 1, 214, 118, 234,
- 244, 1, 75, 234, 244, 1, 254, 201, 234, 244, 1, 76, 234, 244, 1, 253,
- 192, 234, 244, 1, 176, 234, 244, 1, 234, 132, 234, 244, 1, 243, 135, 234,
- 244, 1, 242, 249, 234, 244, 1, 229, 77, 234, 244, 1, 251, 33, 234, 244,
- 1, 250, 157, 234, 244, 1, 235, 141, 234, 244, 1, 235, 114, 234, 244, 1,
- 227, 165, 234, 244, 1, 215, 156, 234, 244, 1, 215, 144, 234, 244, 1, 248,
- 135, 234, 244, 1, 248, 124, 234, 244, 1, 248, 119, 234, 244, 1, 223, 39,
- 234, 244, 1, 228, 110, 234, 244, 1, 217, 105, 234, 244, 1, 216, 208, 234,
- 244, 1, 248, 221, 234, 244, 1, 248, 25, 234, 244, 1, 197, 234, 244, 1,
- 190, 234, 244, 1, 225, 147, 234, 244, 1, 252, 191, 234, 244, 1, 252, 18,
- 234, 244, 1, 184, 234, 244, 1, 191, 234, 244, 1, 205, 234, 244, 1, 233,
- 135, 234, 244, 1, 214, 27, 234, 244, 1, 220, 102, 234, 244, 1, 218, 223,
- 234, 244, 1, 206, 234, 244, 1, 162, 234, 244, 25, 5, 255, 73, 234, 244,
- 25, 5, 73, 234, 244, 25, 5, 236, 33, 234, 244, 25, 5, 70, 234, 244, 25,
- 5, 214, 118, 234, 244, 25, 5, 75, 234, 244, 25, 5, 254, 201, 234, 244,
- 25, 5, 76, 234, 244, 25, 5, 253, 192, 234, 244, 5, 213, 152, 234, 244, 5,
- 227, 205, 234, 244, 255, 21, 50, 234, 244, 245, 121, 50, 234, 244, 54,
- 50, 234, 244, 221, 173, 78, 234, 244, 52, 221, 173, 78, 234, 244, 248,
- 178, 234, 244, 52, 248, 178, 219, 36, 219, 44, 1, 222, 18, 219, 36, 219,
- 44, 1, 217, 80, 219, 36, 219, 44, 1, 252, 168, 219, 36, 219, 44, 1, 251,
- 23, 219, 36, 219, 44, 1, 248, 203, 219, 36, 219, 44, 1, 243, 120, 219,
- 36, 219, 44, 1, 231, 210, 219, 36, 219, 44, 1, 229, 74, 219, 36, 219, 44,
- 1, 233, 112, 219, 36, 219, 44, 1, 229, 213, 219, 36, 219, 44, 1, 214, 24,
- 219, 36, 219, 44, 1, 226, 73, 219, 36, 219, 44, 1, 211, 84, 219, 36, 219,
- 44, 1, 223, 168, 219, 36, 219, 44, 1, 242, 37, 219, 36, 219, 44, 1, 234,
- 248, 219, 36, 219, 44, 1, 235, 136, 219, 36, 219, 44, 1, 227, 162, 219,
- 36, 219, 44, 1, 254, 209, 219, 36, 219, 44, 1, 245, 207, 219, 36, 219,
- 44, 1, 236, 34, 219, 36, 219, 44, 1, 214, 208, 219, 36, 219, 44, 1, 226,
- 222, 219, 36, 219, 44, 1, 245, 197, 219, 36, 219, 44, 1, 231, 223, 219,
- 36, 219, 44, 21, 210, 86, 219, 36, 219, 44, 21, 110, 219, 36, 219, 44,
- 21, 105, 219, 36, 219, 44, 21, 158, 219, 36, 219, 44, 21, 161, 219, 36,
- 219, 44, 21, 189, 219, 36, 219, 44, 21, 194, 219, 36, 219, 44, 21, 198,
- 219, 36, 219, 44, 21, 195, 219, 36, 219, 44, 21, 200, 250, 151, 5, 250,
- 255, 250, 151, 5, 254, 75, 250, 151, 5, 213, 147, 250, 151, 1, 255, 73,
- 250, 151, 1, 73, 250, 151, 1, 70, 250, 151, 1, 75, 250, 151, 1, 235, 10,
- 250, 151, 1, 234, 131, 250, 151, 1, 243, 132, 250, 151, 1, 242, 248, 250,
- 151, 1, 229, 76, 250, 151, 1, 251, 32, 250, 151, 1, 250, 156, 250, 151,
- 1, 235, 140, 250, 151, 1, 235, 113, 250, 151, 1, 227, 164, 250, 151, 1,
- 215, 155, 250, 151, 1, 215, 143, 250, 151, 1, 248, 134, 250, 151, 1, 248,
- 118, 250, 151, 1, 228, 109, 250, 151, 1, 217, 101, 250, 151, 1, 216, 207,
- 250, 151, 1, 248, 220, 250, 151, 1, 248, 24, 250, 151, 1, 229, 225, 250,
- 151, 1, 226, 89, 250, 151, 1, 225, 146, 250, 151, 1, 252, 189, 250, 151,
- 1, 252, 17, 250, 151, 1, 231, 237, 250, 151, 1, 210, 167, 250, 151, 1,
- 211, 103, 250, 151, 1, 223, 184, 250, 151, 1, 233, 134, 250, 151, 1, 212,
- 64, 250, 151, 1, 222, 31, 250, 151, 1, 242, 46, 250, 151, 25, 5, 61, 250,
- 151, 25, 5, 73, 250, 151, 25, 5, 236, 33, 250, 151, 25, 5, 70, 250, 151,
- 25, 5, 214, 118, 250, 151, 25, 5, 75, 250, 151, 25, 5, 254, 201, 250,
- 151, 25, 5, 76, 250, 151, 25, 5, 253, 192, 250, 151, 25, 5, 226, 219,
- 250, 151, 144, 78, 250, 151, 253, 193, 78, 250, 151, 213, 152, 250, 151,
- 231, 235, 250, 151, 21, 210, 86, 250, 151, 21, 110, 250, 151, 21, 105,
- 250, 151, 21, 158, 250, 151, 21, 161, 250, 151, 21, 189, 250, 151, 21,
- 194, 250, 151, 21, 198, 250, 151, 21, 195, 250, 151, 21, 200, 250, 151,
- 221, 173, 78, 250, 151, 248, 178, 250, 151, 52, 248, 178, 250, 151, 224,
- 13, 78, 174, 5, 250, 255, 174, 5, 254, 75, 174, 5, 213, 147, 174, 1, 61,
- 174, 1, 255, 73, 174, 1, 73, 174, 1, 236, 33, 174, 1, 70, 174, 1, 214,
- 118, 174, 1, 149, 153, 174, 1, 149, 222, 180, 174, 1, 149, 156, 174, 1,
- 149, 232, 185, 174, 1, 75, 174, 1, 254, 201, 174, 1, 76, 174, 1, 253,
- 192, 174, 1, 176, 174, 1, 234, 132, 174, 1, 243, 135, 174, 1, 242, 249,
- 174, 1, 229, 77, 174, 1, 251, 33, 174, 1, 250, 157, 174, 1, 235, 141,
- 174, 1, 235, 114, 174, 1, 227, 165, 174, 1, 215, 156, 174, 1, 215, 144,
- 174, 1, 248, 135, 174, 1, 248, 119, 174, 1, 228, 110, 174, 1, 217, 105,
- 174, 1, 216, 208, 174, 1, 248, 221, 174, 1, 248, 25, 174, 1, 197, 174, 1,
- 190, 174, 1, 225, 147, 174, 1, 252, 191, 174, 1, 252, 18, 174, 1, 184,
- 174, 1, 191, 174, 1, 205, 174, 1, 233, 135, 174, 1, 232, 184, 174, 1,
- 214, 27, 174, 1, 220, 102, 174, 1, 218, 223, 174, 1, 206, 174, 1, 162,
- 174, 25, 5, 255, 73, 174, 25, 5, 73, 174, 25, 5, 236, 33, 174, 25, 5, 70,
- 174, 25, 5, 214, 118, 174, 25, 5, 149, 153, 174, 25, 5, 149, 222, 180,
- 174, 25, 5, 149, 156, 174, 25, 5, 149, 232, 185, 174, 25, 5, 75, 174, 25,
- 5, 254, 201, 174, 25, 5, 76, 174, 25, 5, 253, 192, 174, 5, 213, 152, 174,
- 5, 253, 175, 174, 5, 235, 102, 174, 5, 214, 161, 174, 226, 204, 174, 248,
- 178, 174, 52, 248, 178, 174, 255, 21, 50, 174, 220, 137, 174, 21, 210,
+ 118, 21, 195, 118, 21, 200, 234, 245, 5, 251, 0, 234, 245, 5, 254, 76,
+ 234, 245, 5, 213, 147, 234, 245, 1, 61, 234, 245, 1, 255, 74, 234, 245,
+ 1, 73, 234, 245, 1, 236, 34, 234, 245, 1, 70, 234, 245, 1, 214, 118, 234,
+ 245, 1, 75, 234, 245, 1, 254, 202, 234, 245, 1, 76, 234, 245, 1, 253,
+ 193, 234, 245, 1, 176, 234, 245, 1, 234, 133, 234, 245, 1, 243, 136, 234,
+ 245, 1, 242, 250, 234, 245, 1, 229, 78, 234, 245, 1, 251, 34, 234, 245,
+ 1, 250, 158, 234, 245, 1, 235, 142, 234, 245, 1, 235, 115, 234, 245, 1,
+ 227, 166, 234, 245, 1, 215, 157, 234, 245, 1, 215, 145, 234, 245, 1, 248,
+ 136, 234, 245, 1, 248, 125, 234, 245, 1, 248, 120, 234, 245, 1, 223, 40,
+ 234, 245, 1, 228, 111, 234, 245, 1, 217, 106, 234, 245, 1, 216, 209, 234,
+ 245, 1, 248, 222, 234, 245, 1, 248, 26, 234, 245, 1, 197, 234, 245, 1,
+ 190, 234, 245, 1, 225, 148, 234, 245, 1, 252, 192, 234, 245, 1, 252, 19,
+ 234, 245, 1, 185, 234, 245, 1, 191, 234, 245, 1, 205, 234, 245, 1, 233,
+ 136, 234, 245, 1, 214, 27, 234, 245, 1, 220, 103, 234, 245, 1, 218, 224,
+ 234, 245, 1, 206, 234, 245, 1, 162, 234, 245, 25, 5, 255, 74, 234, 245,
+ 25, 5, 73, 234, 245, 25, 5, 236, 34, 234, 245, 25, 5, 70, 234, 245, 25,
+ 5, 214, 118, 234, 245, 25, 5, 75, 234, 245, 25, 5, 254, 202, 234, 245,
+ 25, 5, 76, 234, 245, 25, 5, 253, 193, 234, 245, 5, 213, 152, 234, 245, 5,
+ 227, 206, 234, 245, 255, 22, 50, 234, 245, 245, 122, 50, 234, 245, 54,
+ 50, 234, 245, 221, 174, 78, 234, 245, 52, 221, 174, 78, 234, 245, 248,
+ 179, 234, 245, 52, 248, 179, 219, 37, 219, 45, 1, 222, 19, 219, 37, 219,
+ 45, 1, 217, 81, 219, 37, 219, 45, 1, 252, 169, 219, 37, 219, 45, 1, 251,
+ 24, 219, 37, 219, 45, 1, 248, 204, 219, 37, 219, 45, 1, 243, 121, 219,
+ 37, 219, 45, 1, 231, 211, 219, 37, 219, 45, 1, 229, 75, 219, 37, 219, 45,
+ 1, 233, 113, 219, 37, 219, 45, 1, 229, 214, 219, 37, 219, 45, 1, 214, 24,
+ 219, 37, 219, 45, 1, 226, 74, 219, 37, 219, 45, 1, 211, 84, 219, 37, 219,
+ 45, 1, 223, 169, 219, 37, 219, 45, 1, 242, 38, 219, 37, 219, 45, 1, 234,
+ 249, 219, 37, 219, 45, 1, 235, 137, 219, 37, 219, 45, 1, 227, 163, 219,
+ 37, 219, 45, 1, 254, 210, 219, 37, 219, 45, 1, 245, 208, 219, 37, 219,
+ 45, 1, 236, 35, 219, 37, 219, 45, 1, 214, 208, 219, 37, 219, 45, 1, 226,
+ 223, 219, 37, 219, 45, 1, 245, 198, 219, 37, 219, 45, 1, 231, 224, 219,
+ 37, 219, 45, 21, 210, 86, 219, 37, 219, 45, 21, 110, 219, 37, 219, 45,
+ 21, 105, 219, 37, 219, 45, 21, 158, 219, 37, 219, 45, 21, 161, 219, 37,
+ 219, 45, 21, 189, 219, 37, 219, 45, 21, 194, 219, 37, 219, 45, 21, 198,
+ 219, 37, 219, 45, 21, 195, 219, 37, 219, 45, 21, 200, 250, 152, 5, 251,
+ 0, 250, 152, 5, 254, 76, 250, 152, 5, 213, 147, 250, 152, 1, 255, 74,
+ 250, 152, 1, 73, 250, 152, 1, 70, 250, 152, 1, 75, 250, 152, 1, 235, 11,
+ 250, 152, 1, 234, 132, 250, 152, 1, 243, 133, 250, 152, 1, 242, 249, 250,
+ 152, 1, 229, 77, 250, 152, 1, 251, 33, 250, 152, 1, 250, 157, 250, 152,
+ 1, 235, 141, 250, 152, 1, 235, 114, 250, 152, 1, 227, 165, 250, 152, 1,
+ 215, 156, 250, 152, 1, 215, 144, 250, 152, 1, 248, 135, 250, 152, 1, 248,
+ 119, 250, 152, 1, 228, 110, 250, 152, 1, 217, 102, 250, 152, 1, 216, 208,
+ 250, 152, 1, 248, 221, 250, 152, 1, 248, 25, 250, 152, 1, 229, 226, 250,
+ 152, 1, 226, 90, 250, 152, 1, 225, 147, 250, 152, 1, 252, 190, 250, 152,
+ 1, 252, 18, 250, 152, 1, 231, 238, 250, 152, 1, 210, 167, 250, 152, 1,
+ 211, 103, 250, 152, 1, 223, 185, 250, 152, 1, 233, 135, 250, 152, 1, 212,
+ 64, 250, 152, 1, 222, 32, 250, 152, 1, 242, 47, 250, 152, 25, 5, 61, 250,
+ 152, 25, 5, 73, 250, 152, 25, 5, 236, 34, 250, 152, 25, 5, 70, 250, 152,
+ 25, 5, 214, 118, 250, 152, 25, 5, 75, 250, 152, 25, 5, 254, 202, 250,
+ 152, 25, 5, 76, 250, 152, 25, 5, 253, 193, 250, 152, 25, 5, 226, 220,
+ 250, 152, 144, 78, 250, 152, 253, 194, 78, 250, 152, 213, 152, 250, 152,
+ 231, 236, 250, 152, 21, 210, 86, 250, 152, 21, 110, 250, 152, 21, 105,
+ 250, 152, 21, 158, 250, 152, 21, 161, 250, 152, 21, 189, 250, 152, 21,
+ 194, 250, 152, 21, 198, 250, 152, 21, 195, 250, 152, 21, 200, 250, 152,
+ 221, 174, 78, 250, 152, 248, 179, 250, 152, 52, 248, 179, 250, 152, 224,
+ 14, 78, 174, 5, 251, 0, 174, 5, 254, 76, 174, 5, 213, 147, 174, 1, 61,
+ 174, 1, 255, 74, 174, 1, 73, 174, 1, 236, 34, 174, 1, 70, 174, 1, 214,
+ 118, 174, 1, 149, 153, 174, 1, 149, 222, 181, 174, 1, 149, 156, 174, 1,
+ 149, 232, 186, 174, 1, 75, 174, 1, 254, 202, 174, 1, 76, 174, 1, 253,
+ 193, 174, 1, 176, 174, 1, 234, 133, 174, 1, 243, 136, 174, 1, 242, 250,
+ 174, 1, 229, 78, 174, 1, 251, 34, 174, 1, 250, 158, 174, 1, 235, 142,
+ 174, 1, 235, 115, 174, 1, 227, 166, 174, 1, 215, 157, 174, 1, 215, 145,
+ 174, 1, 248, 136, 174, 1, 248, 120, 174, 1, 228, 111, 174, 1, 217, 106,
+ 174, 1, 216, 209, 174, 1, 248, 222, 174, 1, 248, 26, 174, 1, 197, 174, 1,
+ 190, 174, 1, 225, 148, 174, 1, 252, 192, 174, 1, 252, 19, 174, 1, 185,
+ 174, 1, 191, 174, 1, 205, 174, 1, 233, 136, 174, 1, 232, 185, 174, 1,
+ 214, 27, 174, 1, 220, 103, 174, 1, 218, 224, 174, 1, 206, 174, 1, 162,
+ 174, 25, 5, 255, 74, 174, 25, 5, 73, 174, 25, 5, 236, 34, 174, 25, 5, 70,
+ 174, 25, 5, 214, 118, 174, 25, 5, 149, 153, 174, 25, 5, 149, 222, 181,
+ 174, 25, 5, 149, 156, 174, 25, 5, 149, 232, 186, 174, 25, 5, 75, 174, 25,
+ 5, 254, 202, 174, 25, 5, 76, 174, 25, 5, 253, 193, 174, 5, 213, 152, 174,
+ 5, 253, 176, 174, 5, 235, 103, 174, 5, 214, 161, 174, 226, 205, 174, 248,
+ 179, 174, 52, 248, 179, 174, 255, 22, 50, 174, 220, 138, 174, 21, 210,
86, 174, 21, 110, 174, 21, 105, 174, 21, 158, 174, 21, 161, 174, 21, 189,
- 174, 21, 194, 174, 21, 198, 174, 21, 195, 174, 21, 200, 217, 69, 1, 61,
- 217, 69, 1, 255, 73, 217, 69, 1, 73, 217, 69, 1, 236, 33, 217, 69, 1, 70,
- 217, 69, 1, 214, 118, 217, 69, 1, 75, 217, 69, 1, 254, 201, 217, 69, 1,
- 76, 217, 69, 1, 253, 192, 217, 69, 1, 176, 217, 69, 1, 234, 132, 217, 69,
- 1, 243, 135, 217, 69, 1, 242, 249, 217, 69, 1, 229, 77, 217, 69, 1, 251,
- 33, 217, 69, 1, 250, 157, 217, 69, 1, 235, 141, 217, 69, 1, 235, 114,
- 217, 69, 1, 227, 165, 217, 69, 1, 215, 156, 217, 69, 1, 215, 144, 217,
- 69, 1, 248, 135, 217, 69, 1, 248, 119, 217, 69, 1, 228, 110, 217, 69, 1,
- 217, 105, 217, 69, 1, 216, 208, 217, 69, 1, 248, 221, 217, 69, 1, 248,
- 25, 217, 69, 1, 197, 217, 69, 1, 190, 217, 69, 1, 225, 147, 217, 69, 1,
- 252, 191, 217, 69, 1, 252, 18, 217, 69, 1, 184, 217, 69, 1, 191, 217, 69,
- 1, 205, 217, 69, 1, 233, 135, 217, 69, 1, 214, 27, 217, 69, 1, 220, 102,
- 217, 69, 1, 206, 217, 69, 1, 162, 217, 69, 1, 222, 179, 217, 69, 5, 254,
- 75, 217, 69, 5, 213, 147, 217, 69, 25, 5, 255, 73, 217, 69, 25, 5, 73,
- 217, 69, 25, 5, 236, 33, 217, 69, 25, 5, 70, 217, 69, 25, 5, 214, 118,
- 217, 69, 25, 5, 75, 217, 69, 25, 5, 254, 201, 217, 69, 25, 5, 76, 217,
- 69, 25, 5, 253, 192, 217, 69, 5, 213, 152, 217, 69, 5, 227, 205, 217, 69,
- 21, 210, 86, 217, 69, 21, 110, 217, 69, 21, 105, 217, 69, 21, 158, 217,
- 69, 21, 161, 217, 69, 21, 189, 217, 69, 21, 194, 217, 69, 21, 198, 217,
- 69, 21, 195, 217, 69, 21, 200, 15, 5, 61, 15, 5, 115, 30, 61, 15, 5, 115,
- 30, 252, 176, 15, 5, 115, 30, 243, 105, 216, 239, 15, 5, 115, 30, 162,
- 15, 5, 115, 30, 236, 35, 15, 5, 115, 30, 233, 116, 242, 94, 15, 5, 115,
- 30, 230, 61, 15, 5, 115, 30, 222, 21, 15, 5, 255, 75, 15, 5, 255, 25, 15,
- 5, 255, 26, 30, 253, 229, 15, 5, 255, 26, 30, 246, 67, 242, 94, 15, 5,
- 255, 26, 30, 243, 118, 15, 5, 255, 26, 30, 243, 105, 216, 239, 15, 5,
- 255, 26, 30, 162, 15, 5, 255, 26, 30, 236, 36, 242, 94, 15, 5, 255, 26,
- 30, 236, 9, 15, 5, 255, 26, 30, 233, 117, 15, 5, 255, 26, 30, 220, 48,
- 15, 5, 255, 26, 30, 104, 96, 104, 96, 70, 15, 5, 255, 26, 242, 94, 15, 5,
- 255, 23, 15, 5, 255, 24, 30, 252, 160, 15, 5, 255, 24, 30, 243, 105, 216,
- 239, 15, 5, 255, 24, 30, 231, 92, 96, 245, 150, 15, 5, 255, 24, 30, 220,
- 100, 15, 5, 255, 24, 30, 217, 72, 15, 5, 254, 255, 15, 5, 254, 186, 15,
- 5, 254, 187, 30, 245, 87, 15, 5, 254, 187, 30, 220, 10, 96, 242, 190, 15,
- 5, 254, 178, 15, 5, 254, 179, 30, 254, 178, 15, 5, 254, 179, 30, 247,
- 216, 15, 5, 254, 179, 30, 242, 190, 15, 5, 254, 179, 30, 162, 15, 5, 254,
- 179, 30, 234, 255, 15, 5, 254, 179, 30, 234, 92, 15, 5, 254, 179, 30,
- 220, 63, 15, 5, 254, 179, 30, 214, 126, 15, 5, 254, 175, 15, 5, 254, 168,
- 15, 5, 254, 132, 15, 5, 254, 133, 30, 220, 63, 15, 5, 254, 123, 15, 5,
- 254, 124, 117, 254, 123, 15, 5, 254, 124, 134, 216, 85, 15, 5, 254, 124,
- 96, 229, 217, 226, 164, 254, 124, 96, 229, 216, 15, 5, 254, 124, 96, 229,
- 217, 218, 233, 15, 5, 254, 94, 15, 5, 254, 67, 15, 5, 254, 35, 15, 5,
- 254, 36, 30, 233, 196, 15, 5, 254, 8, 15, 5, 253, 236, 15, 5, 253, 231,
- 15, 5, 253, 232, 210, 40, 216, 239, 15, 5, 253, 232, 235, 3, 216, 239,
- 15, 5, 253, 232, 117, 253, 232, 215, 114, 117, 215, 114, 215, 114, 117,
- 215, 114, 226, 21, 15, 5, 253, 232, 117, 253, 232, 117, 253, 231, 15, 5,
- 253, 232, 117, 253, 232, 117, 253, 232, 249, 125, 253, 232, 117, 253,
- 232, 117, 253, 231, 15, 5, 253, 229, 15, 5, 253, 226, 15, 5, 252, 191,
- 15, 5, 252, 176, 15, 5, 252, 171, 15, 5, 252, 167, 15, 5, 252, 161, 15,
- 5, 252, 162, 117, 252, 161, 15, 5, 252, 160, 15, 5, 130, 15, 5, 252, 140,
- 15, 5, 252, 6, 15, 5, 252, 7, 30, 61, 15, 5, 252, 7, 30, 243, 96, 15, 5,
- 252, 7, 30, 236, 36, 242, 94, 15, 5, 251, 125, 15, 5, 251, 126, 117, 251,
- 126, 255, 25, 15, 5, 251, 126, 117, 251, 126, 214, 190, 15, 5, 251, 126,
- 249, 125, 251, 125, 15, 5, 251, 109, 15, 5, 251, 110, 117, 251, 109, 15,
- 5, 251, 98, 15, 5, 251, 97, 15, 5, 248, 221, 15, 5, 248, 212, 15, 5, 248,
- 213, 234, 66, 30, 115, 96, 231, 147, 15, 5, 248, 213, 234, 66, 30, 254,
- 132, 15, 5, 248, 213, 234, 66, 30, 252, 160, 15, 5, 248, 213, 234, 66,
- 30, 252, 6, 15, 5, 248, 213, 234, 66, 30, 243, 135, 15, 5, 248, 213, 234,
- 66, 30, 243, 136, 96, 231, 147, 15, 5, 248, 213, 234, 66, 30, 242, 214,
- 15, 5, 248, 213, 234, 66, 30, 242, 197, 15, 5, 248, 213, 234, 66, 30,
- 242, 103, 15, 5, 248, 213, 234, 66, 30, 162, 15, 5, 248, 213, 234, 66,
- 30, 235, 179, 15, 5, 248, 213, 234, 66, 30, 235, 180, 96, 232, 98, 15, 5,
- 248, 213, 234, 66, 30, 234, 242, 15, 5, 248, 213, 234, 66, 30, 233, 135,
- 15, 5, 248, 213, 234, 66, 30, 232, 98, 15, 5, 248, 213, 234, 66, 30, 232,
- 99, 96, 231, 146, 15, 5, 248, 213, 234, 66, 30, 232, 84, 15, 5, 248, 213,
- 234, 66, 30, 229, 107, 15, 5, 248, 213, 234, 66, 30, 226, 22, 96, 226,
- 21, 15, 5, 248, 213, 234, 66, 30, 219, 191, 15, 5, 248, 213, 234, 66, 30,
- 217, 72, 15, 5, 248, 213, 234, 66, 30, 214, 231, 96, 242, 197, 15, 5,
- 248, 213, 234, 66, 30, 214, 126, 15, 5, 248, 187, 15, 5, 248, 166, 15, 5,
- 248, 165, 15, 5, 248, 164, 15, 5, 248, 3, 15, 5, 247, 242, 15, 5, 247,
- 217, 15, 5, 247, 218, 30, 220, 63, 15, 5, 247, 216, 15, 5, 247, 206, 15,
- 5, 247, 207, 234, 208, 104, 242, 95, 247, 187, 15, 5, 247, 187, 15, 5,
- 246, 78, 15, 5, 246, 79, 117, 246, 78, 15, 5, 246, 79, 242, 94, 15, 5,
- 246, 79, 220, 45, 15, 5, 246, 76, 15, 5, 246, 77, 30, 245, 72, 15, 5,
- 246, 75, 15, 5, 246, 74, 15, 5, 246, 73, 15, 5, 246, 72, 15, 5, 246, 68,
- 15, 5, 246, 66, 15, 5, 246, 67, 242, 94, 15, 5, 246, 67, 242, 95, 242,
- 94, 15, 5, 246, 65, 15, 5, 246, 58, 15, 5, 75, 15, 5, 160, 30, 226, 21,
- 15, 5, 160, 117, 160, 227, 195, 117, 227, 194, 15, 5, 245, 234, 15, 5,
- 245, 235, 30, 115, 96, 242, 49, 96, 248, 221, 15, 5, 245, 235, 30, 243,
- 96, 15, 5, 245, 235, 30, 230, 230, 15, 5, 245, 235, 30, 222, 8, 15, 5,
- 245, 235, 30, 220, 63, 15, 5, 245, 235, 30, 70, 15, 5, 245, 211, 15, 5,
- 245, 200, 15, 5, 245, 174, 15, 5, 245, 150, 15, 5, 245, 151, 30, 243,
- 104, 15, 5, 245, 151, 30, 243, 105, 216, 239, 15, 5, 245, 151, 30, 231,
- 91, 15, 5, 245, 151, 249, 125, 245, 150, 15, 5, 245, 151, 226, 164, 245,
- 150, 15, 5, 245, 151, 218, 233, 15, 5, 245, 89, 15, 5, 245, 87, 15, 5,
- 245, 72, 15, 5, 245, 10, 15, 5, 245, 11, 30, 61, 15, 5, 245, 11, 30, 115,
- 96, 233, 104, 15, 5, 245, 11, 30, 115, 96, 233, 105, 30, 233, 104, 15, 5,
- 245, 11, 30, 254, 123, 15, 5, 245, 11, 30, 252, 176, 15, 5, 245, 11, 30,
- 246, 67, 242, 94, 15, 5, 245, 11, 30, 246, 67, 242, 95, 242, 94, 15, 5,
- 245, 11, 30, 162, 15, 5, 245, 11, 30, 242, 49, 242, 94, 15, 5, 245, 11,
- 30, 236, 36, 242, 94, 15, 5, 245, 11, 30, 234, 207, 15, 5, 245, 11, 30,
- 234, 208, 218, 233, 15, 5, 245, 11, 30, 233, 215, 15, 5, 245, 11, 30,
- 233, 135, 15, 5, 245, 11, 30, 233, 105, 30, 233, 104, 15, 5, 245, 11, 30,
- 232, 241, 15, 5, 245, 11, 30, 232, 98, 15, 5, 245, 11, 30, 214, 230, 15,
- 5, 245, 11, 30, 214, 219, 15, 5, 243, 135, 15, 5, 243, 136, 242, 94, 15,
- 5, 243, 133, 15, 5, 243, 134, 30, 115, 96, 248, 222, 96, 162, 15, 5, 243,
- 134, 30, 115, 96, 162, 15, 5, 243, 134, 30, 115, 96, 236, 35, 15, 5, 243,
- 134, 30, 255, 24, 216, 240, 96, 217, 93, 15, 5, 243, 134, 30, 254, 123,
- 15, 5, 243, 134, 30, 253, 231, 15, 5, 243, 134, 30, 253, 230, 96, 243,
- 118, 15, 5, 243, 134, 30, 252, 176, 15, 5, 243, 134, 30, 252, 141, 96,
- 205, 15, 5, 243, 134, 30, 251, 98, 15, 5, 243, 134, 30, 251, 99, 96, 205,
- 15, 5, 243, 134, 30, 248, 221, 15, 5, 243, 134, 30, 248, 3, 15, 5, 243,
- 134, 30, 247, 218, 30, 220, 63, 15, 5, 243, 134, 30, 246, 76, 15, 5, 243,
- 134, 30, 245, 174, 15, 5, 243, 134, 30, 245, 175, 96, 233, 135, 15, 5,
- 243, 134, 30, 245, 150, 15, 5, 243, 134, 30, 245, 151, 30, 243, 105, 216,
- 239, 15, 5, 243, 134, 30, 243, 105, 216, 239, 15, 5, 243, 134, 30, 243,
- 96, 15, 5, 243, 134, 30, 242, 214, 15, 5, 243, 134, 30, 242, 212, 15, 5,
- 243, 134, 30, 242, 213, 96, 61, 15, 5, 243, 134, 30, 242, 198, 96, 218,
- 83, 15, 5, 243, 134, 30, 242, 49, 96, 232, 99, 96, 245, 72, 15, 5, 243,
- 134, 30, 242, 30, 15, 5, 243, 134, 30, 242, 31, 96, 233, 135, 15, 5, 243,
- 134, 30, 241, 181, 96, 232, 241, 15, 5, 243, 134, 30, 240, 218, 15, 5,
- 243, 134, 30, 236, 36, 242, 94, 15, 5, 243, 134, 30, 235, 166, 96, 240,
- 223, 96, 253, 231, 15, 5, 243, 134, 30, 234, 242, 15, 5, 243, 134, 30,
- 234, 207, 15, 5, 243, 134, 30, 234, 89, 15, 5, 243, 134, 30, 234, 90, 96,
- 233, 104, 15, 5, 243, 134, 30, 233, 216, 96, 254, 123, 15, 5, 243, 134,
- 30, 233, 135, 15, 5, 243, 134, 30, 231, 92, 96, 245, 150, 15, 5, 243,
- 134, 30, 230, 230, 15, 5, 243, 134, 30, 227, 194, 15, 5, 243, 134, 30,
- 227, 195, 117, 227, 194, 15, 5, 243, 134, 30, 190, 15, 5, 243, 134, 30,
- 222, 8, 15, 5, 243, 134, 30, 221, 231, 15, 5, 243, 134, 30, 220, 63, 15,
- 5, 243, 134, 30, 220, 64, 96, 215, 98, 15, 5, 243, 134, 30, 220, 30, 15,
- 5, 243, 134, 30, 218, 43, 15, 5, 243, 134, 30, 217, 72, 15, 5, 243, 134,
- 30, 70, 15, 5, 243, 134, 30, 214, 219, 15, 5, 243, 134, 30, 214, 220, 96,
- 246, 78, 15, 5, 243, 134, 117, 243, 133, 15, 5, 243, 128, 15, 5, 243,
- 129, 249, 125, 243, 128, 15, 5, 243, 126, 15, 5, 243, 127, 117, 243, 127,
- 243, 97, 117, 243, 96, 15, 5, 243, 118, 15, 5, 243, 119, 243, 127, 117,
- 243, 127, 243, 97, 117, 243, 96, 15, 5, 243, 117, 15, 5, 243, 115, 15, 5,
- 243, 106, 15, 5, 243, 104, 15, 5, 243, 105, 216, 239, 15, 5, 243, 105,
- 117, 243, 104, 15, 5, 243, 105, 249, 125, 243, 104, 15, 5, 243, 96, 15,
- 5, 243, 95, 15, 5, 243, 90, 15, 5, 243, 36, 15, 5, 243, 37, 30, 233, 196,
- 15, 5, 242, 214, 15, 5, 242, 215, 30, 75, 15, 5, 242, 215, 30, 70, 15, 5,
- 242, 215, 249, 125, 242, 214, 15, 5, 242, 212, 15, 5, 242, 213, 117, 242,
- 212, 15, 5, 242, 213, 249, 125, 242, 212, 15, 5, 242, 209, 15, 5, 242,
- 197, 15, 5, 242, 198, 242, 94, 15, 5, 242, 195, 15, 5, 242, 196, 30, 115,
- 96, 236, 35, 15, 5, 242, 196, 30, 243, 105, 216, 239, 15, 5, 242, 196,
- 30, 236, 35, 15, 5, 242, 196, 30, 232, 99, 96, 236, 35, 15, 5, 242, 196,
- 30, 190, 15, 5, 242, 192, 15, 5, 242, 190, 15, 5, 242, 191, 249, 125,
- 242, 190, 15, 5, 242, 191, 30, 252, 176, 15, 5, 242, 191, 30, 217, 72,
- 15, 5, 242, 191, 216, 239, 15, 5, 242, 113, 15, 5, 242, 114, 249, 125,
- 242, 113, 15, 5, 242, 111, 15, 5, 242, 112, 30, 234, 242, 15, 5, 242,
- 112, 30, 234, 243, 30, 236, 36, 242, 94, 15, 5, 242, 112, 30, 227, 194,
- 15, 5, 242, 112, 30, 222, 9, 96, 215, 113, 15, 5, 242, 112, 242, 94, 15,
- 5, 242, 103, 15, 5, 242, 104, 30, 115, 96, 233, 196, 15, 5, 242, 104, 30,
- 233, 196, 15, 5, 242, 104, 117, 242, 104, 232, 91, 15, 5, 242, 98, 15, 5,
- 242, 96, 15, 5, 242, 97, 30, 220, 63, 15, 5, 242, 88, 15, 5, 242, 87, 15,
- 5, 242, 84, 15, 5, 242, 83, 15, 5, 162, 15, 5, 242, 49, 216, 239, 15, 5,
- 242, 49, 242, 94, 15, 5, 242, 30, 15, 5, 241, 180, 15, 5, 241, 181, 30,
- 253, 231, 15, 5, 241, 181, 30, 253, 229, 15, 5, 241, 181, 30, 252, 176,
- 15, 5, 241, 181, 30, 247, 187, 15, 5, 241, 181, 30, 243, 126, 15, 5, 241,
- 181, 30, 234, 81, 15, 5, 241, 181, 30, 227, 194, 15, 5, 241, 181, 30,
- 220, 63, 15, 5, 241, 181, 30, 70, 15, 5, 240, 222, 15, 5, 240, 218, 15,
- 5, 240, 219, 30, 254, 123, 15, 5, 240, 219, 30, 242, 30, 15, 5, 240, 219,
- 30, 234, 207, 15, 5, 240, 219, 30, 232, 197, 15, 5, 240, 219, 30, 214,
- 219, 15, 5, 240, 215, 15, 5, 73, 15, 5, 240, 154, 61, 15, 5, 240, 115,
- 15, 5, 236, 63, 15, 5, 236, 64, 117, 236, 64, 251, 98, 15, 5, 236, 64,
- 117, 236, 64, 218, 233, 15, 5, 236, 38, 15, 5, 236, 35, 15, 5, 236, 36,
- 247, 242, 15, 5, 236, 36, 223, 35, 15, 5, 236, 36, 117, 236, 36, 220, 14,
- 117, 220, 14, 214, 220, 117, 214, 219, 15, 5, 236, 36, 242, 94, 15, 5,
- 236, 27, 15, 5, 236, 28, 30, 243, 105, 216, 239, 15, 5, 236, 26, 15, 5,
- 236, 16, 15, 5, 236, 17, 30, 217, 72, 15, 5, 236, 17, 249, 125, 236, 16,
- 15, 5, 236, 17, 226, 164, 236, 16, 15, 5, 236, 17, 218, 233, 15, 5, 236,
- 9, 15, 5, 235, 255, 15, 5, 235, 179, 15, 5, 235, 165, 15, 5, 176, 15, 5,
- 235, 13, 30, 61, 15, 5, 235, 13, 30, 254, 255, 15, 5, 235, 13, 30, 255,
- 0, 96, 233, 215, 15, 5, 235, 13, 30, 253, 229, 15, 5, 235, 13, 30, 252,
- 176, 15, 5, 235, 13, 30, 252, 160, 15, 5, 235, 13, 30, 130, 15, 5, 235,
- 13, 30, 252, 6, 15, 5, 235, 13, 30, 245, 87, 15, 5, 235, 13, 30, 245, 72,
- 15, 5, 235, 13, 30, 243, 135, 15, 5, 235, 13, 30, 243, 118, 15, 5, 235,
- 13, 30, 243, 105, 216, 239, 15, 5, 235, 13, 30, 243, 96, 15, 5, 235, 13,
- 30, 243, 97, 96, 220, 101, 96, 61, 15, 5, 235, 13, 30, 242, 214, 15, 5,
- 235, 13, 30, 242, 197, 15, 5, 235, 13, 30, 242, 191, 96, 221, 231, 15, 5,
- 235, 13, 30, 242, 191, 249, 125, 242, 190, 15, 5, 235, 13, 30, 242, 113,
- 15, 5, 235, 13, 30, 242, 87, 15, 5, 235, 13, 30, 236, 35, 15, 5, 235, 13,
- 30, 236, 16, 15, 5, 235, 13, 30, 234, 242, 15, 5, 235, 13, 30, 234, 92,
- 15, 5, 235, 13, 30, 234, 89, 15, 5, 235, 13, 30, 232, 241, 15, 5, 235,
- 13, 30, 232, 98, 15, 5, 235, 13, 30, 231, 91, 15, 5, 235, 13, 30, 231,
- 92, 96, 246, 78, 15, 5, 235, 13, 30, 231, 92, 96, 242, 214, 15, 5, 235,
- 13, 30, 231, 92, 96, 217, 22, 15, 5, 235, 13, 30, 230, 230, 15, 5, 235,
- 13, 30, 230, 231, 96, 227, 189, 15, 5, 235, 13, 30, 229, 107, 15, 5, 235,
- 13, 30, 227, 194, 15, 5, 235, 13, 30, 225, 108, 15, 5, 235, 13, 30, 222,
- 140, 15, 5, 235, 13, 30, 206, 15, 5, 235, 13, 30, 221, 231, 15, 5, 235,
- 13, 30, 220, 102, 15, 5, 235, 13, 30, 220, 63, 15, 5, 235, 13, 30, 220,
- 30, 15, 5, 235, 13, 30, 219, 225, 15, 5, 235, 13, 30, 219, 182, 15, 5,
- 235, 13, 30, 218, 51, 15, 5, 235, 13, 30, 217, 50, 15, 5, 235, 13, 30,
- 70, 15, 5, 235, 13, 30, 214, 230, 15, 5, 235, 13, 30, 214, 219, 15, 5,
- 235, 13, 30, 214, 193, 30, 190, 15, 5, 235, 13, 30, 214, 126, 15, 5, 235,
- 13, 30, 210, 44, 15, 5, 235, 11, 15, 5, 235, 12, 249, 125, 235, 11, 15,
- 5, 235, 4, 15, 5, 235, 1, 15, 5, 234, 255, 15, 5, 234, 254, 15, 5, 234,
- 252, 15, 5, 234, 253, 117, 234, 252, 15, 5, 234, 242, 15, 5, 234, 243,
- 30, 236, 36, 242, 94, 15, 5, 234, 238, 15, 5, 234, 239, 30, 252, 176, 15,
- 5, 234, 239, 249, 125, 234, 238, 15, 5, 234, 236, 15, 5, 234, 235, 15, 5,
- 234, 207, 15, 5, 234, 208, 233, 118, 30, 104, 117, 233, 118, 30, 70, 15,
- 5, 234, 208, 117, 234, 208, 233, 118, 30, 104, 117, 233, 118, 30, 70, 15,
- 5, 234, 157, 15, 5, 234, 92, 15, 5, 234, 93, 30, 252, 176, 15, 5, 234,
- 93, 30, 70, 15, 5, 234, 93, 30, 214, 219, 15, 5, 234, 89, 15, 5, 234, 81,
- 15, 5, 234, 68, 15, 5, 234, 67, 15, 5, 234, 65, 15, 5, 234, 66, 117, 234,
- 65, 15, 5, 233, 217, 15, 5, 233, 218, 117, 241, 181, 30, 253, 230, 233,
- 218, 117, 241, 181, 30, 253, 229, 15, 5, 233, 215, 15, 5, 233, 213, 15,
- 5, 233, 214, 214, 12, 17, 15, 5, 233, 212, 15, 5, 233, 209, 15, 5, 233,
- 210, 242, 94, 15, 5, 233, 208, 15, 5, 233, 196, 15, 5, 233, 197, 226,
- 164, 233, 196, 15, 5, 233, 191, 15, 5, 233, 172, 15, 5, 233, 135, 15, 5,
- 233, 117, 15, 5, 233, 118, 30, 61, 15, 5, 233, 118, 30, 115, 96, 248,
- 222, 96, 162, 15, 5, 233, 118, 30, 115, 96, 243, 96, 15, 5, 233, 118, 30,
- 115, 96, 233, 104, 15, 5, 233, 118, 30, 254, 178, 15, 5, 233, 118, 30,
- 254, 123, 15, 5, 233, 118, 30, 253, 232, 210, 40, 216, 239, 15, 5, 233,
- 118, 30, 252, 176, 15, 5, 233, 118, 30, 252, 6, 15, 5, 233, 118, 30, 248,
- 166, 15, 5, 233, 118, 30, 245, 150, 15, 5, 233, 118, 30, 243, 135, 15, 5,
- 233, 118, 30, 243, 96, 15, 5, 233, 118, 30, 242, 103, 15, 5, 233, 118,
- 30, 242, 104, 96, 242, 103, 15, 5, 233, 118, 30, 162, 15, 5, 233, 118,
- 30, 242, 30, 15, 5, 233, 118, 30, 241, 181, 30, 227, 194, 15, 5, 233,
- 118, 30, 236, 36, 242, 94, 15, 5, 233, 118, 30, 236, 16, 15, 5, 233, 118,
- 30, 236, 17, 96, 162, 15, 5, 233, 118, 30, 236, 17, 96, 232, 98, 15, 5,
- 233, 118, 30, 234, 92, 15, 5, 233, 118, 30, 234, 81, 15, 5, 233, 118, 30,
- 233, 215, 15, 5, 233, 118, 30, 233, 209, 15, 5, 233, 118, 30, 233, 210,
- 96, 241, 181, 96, 61, 15, 5, 233, 118, 30, 233, 117, 15, 5, 233, 118, 30,
- 232, 197, 15, 5, 233, 118, 30, 232, 98, 15, 5, 233, 118, 30, 232, 86, 15,
- 5, 233, 118, 30, 231, 91, 15, 5, 233, 118, 30, 231, 92, 96, 245, 150, 15,
- 5, 233, 118, 30, 230, 61, 15, 5, 233, 118, 30, 229, 107, 15, 5, 233, 118,
- 30, 220, 64, 96, 218, 43, 15, 5, 233, 118, 30, 220, 10, 96, 242, 191, 96,
- 245, 87, 15, 5, 233, 118, 30, 220, 10, 96, 242, 191, 216, 239, 15, 5,
- 233, 118, 30, 219, 223, 15, 5, 233, 118, 30, 219, 224, 96, 219, 223, 15,
- 5, 233, 118, 30, 218, 43, 15, 5, 233, 118, 30, 217, 84, 15, 5, 233, 118,
- 30, 217, 72, 15, 5, 233, 118, 30, 217, 23, 96, 115, 96, 218, 84, 96, 197,
- 15, 5, 233, 118, 30, 70, 15, 5, 233, 118, 30, 104, 96, 61, 15, 5, 233,
- 118, 30, 104, 96, 104, 96, 70, 15, 5, 233, 118, 30, 214, 231, 96, 253,
- 231, 15, 5, 233, 118, 30, 214, 219, 15, 5, 233, 118, 30, 214, 126, 15, 5,
- 233, 118, 218, 233, 15, 5, 233, 115, 15, 5, 233, 116, 30, 220, 63, 15, 5,
- 233, 116, 30, 220, 64, 96, 218, 43, 15, 5, 233, 116, 242, 94, 15, 5, 233,
- 116, 242, 95, 117, 233, 116, 242, 95, 220, 63, 15, 5, 233, 111, 15, 5,
- 233, 104, 15, 5, 233, 105, 30, 233, 104, 15, 5, 233, 102, 15, 5, 233,
- 103, 30, 233, 196, 15, 5, 233, 103, 30, 233, 197, 96, 222, 140, 15, 5,
- 232, 241, 15, 5, 232, 226, 15, 5, 232, 216, 15, 5, 232, 197, 15, 5, 232,
- 98, 15, 5, 232, 99, 30, 252, 176, 15, 5, 232, 96, 15, 5, 232, 97, 30,
- 254, 178, 15, 5, 232, 97, 30, 252, 176, 15, 5, 232, 97, 30, 245, 72, 15,
- 5, 232, 97, 30, 245, 73, 216, 239, 15, 5, 232, 97, 30, 243, 105, 216,
- 239, 15, 5, 232, 97, 30, 241, 181, 30, 252, 176, 15, 5, 232, 97, 30, 236,
- 16, 15, 5, 232, 97, 30, 235, 1, 15, 5, 232, 97, 30, 234, 255, 15, 5, 232,
- 97, 30, 235, 0, 96, 253, 231, 15, 5, 232, 97, 30, 234, 92, 15, 5, 232,
- 97, 30, 233, 136, 96, 253, 231, 15, 5, 232, 97, 30, 233, 117, 15, 5, 232,
- 97, 30, 231, 92, 96, 245, 150, 15, 5, 232, 97, 30, 229, 107, 15, 5, 232,
- 97, 30, 227, 237, 15, 5, 232, 97, 30, 219, 192, 96, 253, 231, 15, 5, 232,
- 97, 30, 219, 174, 96, 251, 125, 15, 5, 232, 97, 30, 215, 113, 15, 5, 232,
- 97, 216, 239, 15, 5, 232, 97, 249, 125, 232, 96, 15, 5, 232, 97, 226,
- 164, 232, 96, 15, 5, 232, 97, 218, 233, 15, 5, 232, 97, 220, 45, 15, 5,
- 232, 95, 15, 5, 232, 91, 15, 5, 232, 92, 117, 232, 91, 15, 5, 232, 92,
- 226, 164, 232, 91, 15, 5, 232, 92, 220, 45, 15, 5, 232, 89, 15, 5, 232,
- 86, 15, 5, 232, 84, 15, 5, 232, 85, 117, 232, 84, 15, 5, 232, 85, 117,
- 232, 85, 243, 97, 117, 243, 96, 15, 5, 184, 15, 5, 231, 239, 30, 217, 72,
- 15, 5, 231, 239, 242, 94, 15, 5, 231, 238, 15, 5, 231, 210, 15, 5, 231,
- 166, 15, 5, 231, 147, 15, 5, 231, 146, 15, 5, 231, 91, 15, 5, 231, 47,
- 15, 5, 230, 230, 15, 5, 230, 188, 15, 5, 230, 102, 15, 5, 230, 103, 117,
- 230, 102, 15, 5, 230, 93, 15, 5, 230, 94, 242, 94, 15, 5, 230, 78, 15, 5,
- 230, 64, 15, 5, 230, 61, 15, 5, 230, 62, 30, 61, 15, 5, 230, 62, 30, 233,
- 196, 15, 5, 230, 62, 30, 210, 116, 15, 5, 230, 62, 117, 230, 61, 15, 5,
- 230, 62, 117, 230, 62, 30, 115, 96, 197, 15, 5, 230, 62, 249, 125, 230,
- 61, 15, 5, 230, 59, 15, 5, 230, 60, 30, 61, 15, 5, 230, 60, 30, 115, 96,
- 248, 3, 15, 5, 230, 60, 30, 248, 3, 15, 5, 230, 60, 242, 94, 15, 5, 197,
- 15, 5, 229, 227, 15, 5, 229, 216, 15, 5, 229, 217, 235, 192, 15, 5, 229,
- 217, 30, 219, 226, 216, 239, 15, 5, 229, 217, 226, 164, 229, 216, 15, 5,
- 229, 215, 15, 5, 229, 208, 227, 180, 15, 5, 229, 207, 15, 5, 229, 206,
- 15, 5, 229, 107, 15, 5, 229, 108, 30, 61, 15, 5, 229, 108, 30, 214, 219,
- 15, 5, 229, 108, 220, 45, 15, 5, 228, 233, 15, 5, 228, 234, 30, 75, 15,
- 5, 228, 232, 15, 5, 228, 203, 15, 5, 228, 204, 30, 243, 105, 216, 239,
- 15, 5, 228, 204, 30, 243, 97, 96, 243, 105, 216, 239, 15, 5, 228, 201,
- 15, 5, 228, 202, 30, 254, 123, 15, 5, 228, 202, 30, 253, 231, 15, 5, 228,
- 202, 30, 253, 232, 96, 253, 231, 15, 5, 228, 202, 30, 242, 103, 15, 5,
- 228, 202, 30, 231, 92, 96, 243, 105, 216, 239, 15, 5, 228, 202, 30, 229,
- 107, 15, 5, 228, 202, 30, 227, 194, 15, 5, 228, 202, 30, 220, 63, 15, 5,
- 228, 202, 30, 220, 64, 96, 115, 254, 123, 15, 5, 228, 202, 30, 220, 64,
- 96, 253, 231, 15, 5, 228, 202, 30, 220, 64, 96, 253, 232, 96, 253, 231,
- 15, 5, 228, 202, 30, 214, 231, 96, 253, 231, 15, 5, 228, 202, 30, 214,
- 126, 15, 5, 228, 190, 15, 5, 227, 237, 15, 5, 227, 210, 15, 5, 227, 194,
- 15, 5, 227, 195, 233, 116, 30, 243, 96, 15, 5, 227, 195, 233, 116, 30,
- 231, 147, 15, 5, 227, 195, 233, 116, 30, 222, 8, 15, 5, 227, 195, 233,
- 116, 30, 222, 9, 117, 227, 195, 233, 116, 30, 222, 8, 15, 5, 227, 195,
- 233, 116, 30, 214, 126, 15, 5, 227, 195, 216, 239, 15, 5, 227, 195, 117,
- 227, 194, 15, 5, 227, 195, 249, 125, 227, 194, 15, 5, 227, 195, 249, 125,
- 227, 195, 233, 116, 117, 233, 115, 15, 5, 227, 189, 15, 5, 227, 190, 255,
- 24, 30, 253, 226, 15, 5, 227, 190, 255, 24, 30, 252, 6, 15, 5, 227, 190,
- 255, 24, 30, 246, 74, 15, 5, 227, 190, 255, 24, 30, 242, 103, 15, 5, 227,
- 190, 255, 24, 30, 236, 36, 242, 94, 15, 5, 227, 190, 255, 24, 30, 234,
- 255, 15, 5, 227, 190, 255, 24, 30, 233, 135, 15, 5, 227, 190, 255, 24,
- 30, 229, 107, 15, 5, 227, 190, 255, 24, 30, 219, 171, 15, 5, 227, 190,
- 255, 24, 30, 214, 230, 15, 5, 227, 190, 234, 66, 30, 252, 6, 15, 5, 227,
- 190, 234, 66, 30, 252, 7, 70, 15, 5, 190, 15, 5, 226, 80, 15, 5, 226, 47,
- 15, 5, 226, 21, 15, 5, 225, 161, 15, 5, 225, 108, 15, 5, 225, 109, 30,
- 61, 15, 5, 225, 109, 30, 255, 25, 15, 5, 225, 109, 30, 252, 6, 15, 5,
- 225, 109, 30, 251, 125, 15, 5, 225, 109, 30, 75, 15, 5, 225, 109, 30, 73,
- 15, 5, 225, 109, 30, 240, 115, 15, 5, 225, 109, 30, 70, 15, 5, 225, 109,
- 30, 214, 230, 15, 5, 225, 109, 249, 125, 225, 108, 15, 5, 225, 53, 15, 5,
- 225, 54, 30, 234, 238, 15, 5, 225, 54, 30, 214, 219, 15, 5, 225, 54, 30,
- 210, 116, 15, 5, 225, 54, 226, 164, 225, 53, 15, 5, 205, 15, 5, 223, 182,
- 15, 5, 223, 35, 15, 5, 222, 140, 15, 5, 206, 15, 5, 222, 22, 227, 180,
- 15, 5, 222, 21, 15, 5, 222, 22, 30, 61, 15, 5, 222, 22, 30, 246, 78, 15,
- 5, 222, 22, 30, 246, 76, 15, 5, 222, 22, 30, 162, 15, 5, 222, 22, 30,
- 234, 242, 15, 5, 222, 22, 30, 233, 196, 15, 5, 222, 22, 30, 232, 84, 15,
- 5, 222, 22, 30, 230, 230, 15, 5, 222, 22, 30, 227, 194, 15, 5, 222, 22,
- 30, 222, 8, 15, 5, 222, 22, 30, 220, 30, 15, 5, 222, 22, 30, 217, 93, 15,
- 5, 222, 22, 30, 214, 230, 15, 5, 222, 22, 30, 214, 225, 15, 5, 222, 22,
- 30, 214, 197, 15, 5, 222, 22, 30, 214, 150, 15, 5, 222, 22, 30, 214, 126,
- 15, 5, 222, 22, 117, 222, 21, 15, 5, 222, 22, 242, 94, 15, 5, 222, 8, 15,
- 5, 222, 9, 233, 118, 30, 253, 229, 15, 5, 221, 239, 15, 5, 221, 231, 15,
- 5, 220, 102, 15, 5, 220, 100, 15, 5, 220, 101, 30, 61, 15, 5, 220, 101,
- 30, 252, 176, 15, 5, 220, 101, 30, 242, 190, 15, 5, 220, 101, 30, 229,
- 107, 15, 5, 220, 101, 30, 219, 223, 15, 5, 220, 101, 30, 215, 98, 15, 5,
- 220, 101, 30, 70, 15, 5, 220, 101, 30, 104, 96, 61, 15, 5, 220, 99, 15,
- 5, 220, 97, 15, 5, 220, 78, 15, 5, 220, 63, 15, 5, 220, 64, 240, 222, 15,
- 5, 220, 64, 117, 220, 64, 243, 127, 117, 243, 127, 243, 97, 117, 243, 96,
- 15, 5, 220, 64, 117, 220, 64, 217, 94, 117, 217, 94, 243, 97, 117, 243,
- 96, 15, 5, 220, 56, 15, 5, 220, 51, 15, 5, 220, 48, 15, 5, 220, 47, 15,
- 5, 220, 44, 15, 5, 220, 30, 15, 5, 220, 31, 30, 61, 15, 5, 220, 31, 30,
- 236, 16, 15, 5, 220, 24, 15, 5, 220, 25, 30, 61, 15, 5, 220, 25, 30, 252,
- 161, 15, 5, 220, 25, 30, 251, 109, 15, 5, 220, 25, 30, 247, 206, 15, 5,
- 220, 25, 30, 243, 96, 15, 5, 220, 25, 30, 236, 35, 15, 5, 220, 25, 30,
- 236, 36, 242, 94, 15, 5, 220, 25, 30, 233, 191, 15, 5, 220, 25, 30, 232,
- 86, 15, 5, 220, 25, 30, 230, 93, 15, 5, 220, 25, 30, 222, 8, 15, 5, 220,
- 18, 15, 5, 220, 13, 15, 5, 220, 14, 216, 239, 15, 5, 220, 14, 117, 220,
- 14, 251, 99, 117, 251, 98, 15, 5, 220, 9, 15, 5, 219, 225, 15, 5, 219,
- 226, 117, 235, 193, 219, 225, 15, 5, 219, 223, 15, 5, 219, 222, 15, 5,
- 219, 191, 15, 5, 219, 192, 242, 94, 15, 5, 219, 182, 15, 5, 219, 180, 15,
- 5, 219, 181, 117, 219, 181, 219, 223, 15, 5, 219, 173, 15, 5, 219, 171,
- 15, 5, 218, 83, 15, 5, 218, 84, 117, 218, 83, 15, 5, 218, 54, 15, 5, 218,
- 53, 15, 5, 218, 51, 15, 5, 218, 43, 15, 5, 218, 42, 15, 5, 218, 17, 15,
- 5, 218, 16, 15, 5, 217, 105, 15, 5, 217, 106, 253, 216, 15, 5, 217, 106,
- 30, 241, 180, 15, 5, 217, 106, 30, 230, 230, 15, 5, 217, 106, 242, 94,
- 15, 5, 217, 93, 15, 5, 217, 94, 117, 217, 94, 228, 234, 117, 228, 234,
- 247, 188, 117, 247, 187, 15, 5, 217, 94, 218, 233, 15, 5, 217, 84, 15, 5,
- 129, 30, 252, 6, 15, 5, 129, 30, 242, 103, 15, 5, 129, 30, 220, 63, 15,
- 5, 129, 30, 219, 225, 15, 5, 129, 30, 215, 113, 15, 5, 129, 30, 214, 219,
- 15, 5, 217, 72, 15, 5, 217, 50, 15, 5, 217, 22, 15, 5, 217, 23, 242, 94,
- 15, 5, 216, 117, 15, 5, 216, 118, 216, 239, 15, 5, 216, 90, 15, 5, 216,
- 72, 15, 5, 216, 73, 30, 217, 72, 15, 5, 216, 73, 117, 216, 72, 15, 5,
- 216, 73, 117, 216, 73, 243, 127, 117, 243, 127, 243, 97, 117, 243, 96,
- 15, 5, 215, 118, 15, 5, 215, 113, 15, 5, 215, 111, 15, 5, 215, 108, 15,
- 5, 215, 98, 15, 5, 215, 99, 117, 215, 99, 210, 117, 117, 210, 116, 15, 5,
- 70, 15, 5, 104, 242, 103, 15, 5, 104, 104, 70, 15, 5, 104, 117, 104, 226,
- 90, 117, 226, 90, 243, 97, 117, 243, 96, 15, 5, 104, 117, 104, 218, 18,
- 117, 218, 17, 15, 5, 104, 117, 104, 104, 223, 49, 117, 104, 223, 48, 15,
- 5, 214, 230, 15, 5, 214, 225, 15, 5, 214, 219, 15, 5, 214, 220, 233, 191,
- 15, 5, 214, 220, 30, 252, 176, 15, 5, 214, 220, 30, 230, 230, 15, 5, 214,
- 220, 30, 104, 96, 104, 96, 70, 15, 5, 214, 220, 30, 104, 96, 104, 96,
- 104, 242, 94, 15, 5, 214, 220, 242, 94, 15, 5, 214, 220, 220, 45, 15, 5,
- 214, 220, 220, 46, 30, 252, 176, 15, 5, 214, 215, 15, 5, 214, 197, 15, 5,
- 214, 198, 30, 233, 117, 15, 5, 214, 198, 30, 231, 92, 96, 248, 221, 15,
- 5, 214, 198, 30, 220, 100, 15, 5, 214, 198, 30, 70, 15, 5, 214, 196, 15,
- 5, 214, 192, 15, 5, 214, 193, 30, 234, 207, 15, 5, 214, 193, 30, 190, 15,
- 5, 214, 190, 15, 5, 214, 191, 242, 94, 15, 5, 214, 150, 15, 5, 214, 151,
- 249, 125, 214, 150, 15, 5, 214, 151, 220, 45, 15, 5, 214, 148, 15, 5,
- 214, 149, 30, 115, 96, 162, 15, 5, 214, 149, 30, 115, 96, 197, 15, 5,
- 214, 149, 30, 254, 178, 15, 5, 214, 149, 30, 162, 15, 5, 214, 149, 30,
- 227, 194, 15, 5, 214, 149, 30, 214, 230, 15, 5, 214, 149, 30, 214, 231,
- 96, 253, 231, 15, 5, 214, 149, 30, 214, 231, 96, 252, 6, 15, 5, 214, 147,
- 15, 5, 214, 144, 15, 5, 214, 143, 15, 5, 214, 139, 15, 5, 214, 140, 30,
- 61, 15, 5, 214, 140, 30, 253, 226, 15, 5, 214, 140, 30, 130, 15, 5, 214,
- 140, 30, 246, 68, 15, 5, 214, 140, 30, 243, 135, 15, 5, 214, 140, 30,
- 243, 118, 15, 5, 214, 140, 30, 243, 105, 216, 239, 15, 5, 214, 140, 30,
- 243, 96, 15, 5, 214, 140, 30, 242, 113, 15, 5, 214, 140, 30, 162, 15, 5,
- 214, 140, 30, 236, 35, 15, 5, 214, 140, 30, 236, 16, 15, 5, 214, 140, 30,
- 235, 165, 15, 5, 214, 140, 30, 234, 92, 15, 5, 214, 140, 30, 232, 84, 15,
- 5, 214, 140, 30, 230, 188, 15, 5, 214, 140, 30, 190, 15, 5, 214, 140, 30,
- 220, 63, 15, 5, 214, 140, 30, 219, 180, 15, 5, 214, 140, 30, 215, 118,
- 15, 5, 214, 140, 30, 104, 96, 242, 103, 15, 5, 214, 140, 30, 214, 219,
+ 174, 21, 194, 174, 21, 198, 174, 21, 195, 174, 21, 200, 217, 70, 1, 61,
+ 217, 70, 1, 255, 74, 217, 70, 1, 73, 217, 70, 1, 236, 34, 217, 70, 1, 70,
+ 217, 70, 1, 214, 118, 217, 70, 1, 75, 217, 70, 1, 254, 202, 217, 70, 1,
+ 76, 217, 70, 1, 253, 193, 217, 70, 1, 176, 217, 70, 1, 234, 133, 217, 70,
+ 1, 243, 136, 217, 70, 1, 242, 250, 217, 70, 1, 229, 78, 217, 70, 1, 251,
+ 34, 217, 70, 1, 250, 158, 217, 70, 1, 235, 142, 217, 70, 1, 235, 115,
+ 217, 70, 1, 227, 166, 217, 70, 1, 215, 157, 217, 70, 1, 215, 145, 217,
+ 70, 1, 248, 136, 217, 70, 1, 248, 120, 217, 70, 1, 228, 111, 217, 70, 1,
+ 217, 106, 217, 70, 1, 216, 209, 217, 70, 1, 248, 222, 217, 70, 1, 248,
+ 26, 217, 70, 1, 197, 217, 70, 1, 190, 217, 70, 1, 225, 148, 217, 70, 1,
+ 252, 192, 217, 70, 1, 252, 19, 217, 70, 1, 185, 217, 70, 1, 191, 217, 70,
+ 1, 205, 217, 70, 1, 233, 136, 217, 70, 1, 214, 27, 217, 70, 1, 220, 103,
+ 217, 70, 1, 206, 217, 70, 1, 162, 217, 70, 1, 222, 180, 217, 70, 5, 254,
+ 76, 217, 70, 5, 213, 147, 217, 70, 25, 5, 255, 74, 217, 70, 25, 5, 73,
+ 217, 70, 25, 5, 236, 34, 217, 70, 25, 5, 70, 217, 70, 25, 5, 214, 118,
+ 217, 70, 25, 5, 75, 217, 70, 25, 5, 254, 202, 217, 70, 25, 5, 76, 217,
+ 70, 25, 5, 253, 193, 217, 70, 5, 213, 152, 217, 70, 5, 227, 206, 217, 70,
+ 21, 210, 86, 217, 70, 21, 110, 217, 70, 21, 105, 217, 70, 21, 158, 217,
+ 70, 21, 161, 217, 70, 21, 189, 217, 70, 21, 194, 217, 70, 21, 198, 217,
+ 70, 21, 195, 217, 70, 21, 200, 15, 5, 61, 15, 5, 115, 30, 61, 15, 5, 115,
+ 30, 252, 177, 15, 5, 115, 30, 243, 106, 216, 240, 15, 5, 115, 30, 162,
+ 15, 5, 115, 30, 236, 36, 15, 5, 115, 30, 233, 117, 242, 95, 15, 5, 115,
+ 30, 230, 62, 15, 5, 115, 30, 222, 22, 15, 5, 255, 76, 15, 5, 255, 26, 15,
+ 5, 255, 27, 30, 253, 230, 15, 5, 255, 27, 30, 246, 68, 242, 95, 15, 5,
+ 255, 27, 30, 243, 119, 15, 5, 255, 27, 30, 243, 106, 216, 240, 15, 5,
+ 255, 27, 30, 162, 15, 5, 255, 27, 30, 236, 37, 242, 95, 15, 5, 255, 27,
+ 30, 236, 10, 15, 5, 255, 27, 30, 233, 118, 15, 5, 255, 27, 30, 220, 49,
+ 15, 5, 255, 27, 30, 104, 96, 104, 96, 70, 15, 5, 255, 27, 242, 95, 15, 5,
+ 255, 24, 15, 5, 255, 25, 30, 252, 161, 15, 5, 255, 25, 30, 243, 106, 216,
+ 240, 15, 5, 255, 25, 30, 231, 93, 96, 245, 151, 15, 5, 255, 25, 30, 220,
+ 101, 15, 5, 255, 25, 30, 217, 73, 15, 5, 255, 0, 15, 5, 254, 187, 15, 5,
+ 254, 188, 30, 245, 88, 15, 5, 254, 188, 30, 220, 11, 96, 242, 191, 15, 5,
+ 254, 179, 15, 5, 254, 180, 30, 254, 179, 15, 5, 254, 180, 30, 247, 217,
+ 15, 5, 254, 180, 30, 242, 191, 15, 5, 254, 180, 30, 162, 15, 5, 254, 180,
+ 30, 235, 0, 15, 5, 254, 180, 30, 234, 93, 15, 5, 254, 180, 30, 220, 64,
+ 15, 5, 254, 180, 30, 214, 126, 15, 5, 254, 176, 15, 5, 254, 169, 15, 5,
+ 254, 133, 15, 5, 254, 134, 30, 220, 64, 15, 5, 254, 124, 15, 5, 254, 125,
+ 117, 254, 124, 15, 5, 254, 125, 134, 216, 86, 15, 5, 254, 125, 96, 229,
+ 218, 226, 165, 254, 125, 96, 229, 217, 15, 5, 254, 125, 96, 229, 218,
+ 218, 234, 15, 5, 254, 95, 15, 5, 254, 68, 15, 5, 254, 36, 15, 5, 254, 37,
+ 30, 233, 197, 15, 5, 254, 9, 15, 5, 253, 237, 15, 5, 253, 232, 15, 5,
+ 253, 233, 210, 40, 216, 240, 15, 5, 253, 233, 235, 4, 216, 240, 15, 5,
+ 253, 233, 117, 253, 233, 215, 115, 117, 215, 115, 215, 115, 117, 215,
+ 115, 226, 22, 15, 5, 253, 233, 117, 253, 233, 117, 253, 232, 15, 5, 253,
+ 233, 117, 253, 233, 117, 253, 233, 249, 126, 253, 233, 117, 253, 233,
+ 117, 253, 232, 15, 5, 253, 230, 15, 5, 253, 227, 15, 5, 252, 192, 15, 5,
+ 252, 177, 15, 5, 252, 172, 15, 5, 252, 168, 15, 5, 252, 162, 15, 5, 252,
+ 163, 117, 252, 162, 15, 5, 252, 161, 15, 5, 130, 15, 5, 252, 141, 15, 5,
+ 252, 7, 15, 5, 252, 8, 30, 61, 15, 5, 252, 8, 30, 243, 97, 15, 5, 252, 8,
+ 30, 236, 37, 242, 95, 15, 5, 251, 126, 15, 5, 251, 127, 117, 251, 127,
+ 255, 26, 15, 5, 251, 127, 117, 251, 127, 214, 190, 15, 5, 251, 127, 249,
+ 126, 251, 126, 15, 5, 251, 110, 15, 5, 251, 111, 117, 251, 110, 15, 5,
+ 251, 99, 15, 5, 251, 98, 15, 5, 248, 222, 15, 5, 248, 213, 15, 5, 248,
+ 214, 234, 67, 30, 115, 96, 231, 148, 15, 5, 248, 214, 234, 67, 30, 254,
+ 133, 15, 5, 248, 214, 234, 67, 30, 252, 161, 15, 5, 248, 214, 234, 67,
+ 30, 252, 7, 15, 5, 248, 214, 234, 67, 30, 243, 136, 15, 5, 248, 214, 234,
+ 67, 30, 243, 137, 96, 231, 148, 15, 5, 248, 214, 234, 67, 30, 242, 215,
+ 15, 5, 248, 214, 234, 67, 30, 242, 198, 15, 5, 248, 214, 234, 67, 30,
+ 242, 104, 15, 5, 248, 214, 234, 67, 30, 162, 15, 5, 248, 214, 234, 67,
+ 30, 235, 180, 15, 5, 248, 214, 234, 67, 30, 235, 181, 96, 232, 99, 15, 5,
+ 248, 214, 234, 67, 30, 234, 243, 15, 5, 248, 214, 234, 67, 30, 233, 136,
+ 15, 5, 248, 214, 234, 67, 30, 232, 99, 15, 5, 248, 214, 234, 67, 30, 232,
+ 100, 96, 231, 147, 15, 5, 248, 214, 234, 67, 30, 232, 85, 15, 5, 248,
+ 214, 234, 67, 30, 229, 108, 15, 5, 248, 214, 234, 67, 30, 226, 23, 96,
+ 226, 22, 15, 5, 248, 214, 234, 67, 30, 219, 192, 15, 5, 248, 214, 234,
+ 67, 30, 217, 73, 15, 5, 248, 214, 234, 67, 30, 214, 231, 96, 242, 198,
+ 15, 5, 248, 214, 234, 67, 30, 214, 126, 15, 5, 248, 188, 15, 5, 248, 167,
+ 15, 5, 248, 166, 15, 5, 248, 165, 15, 5, 248, 4, 15, 5, 247, 243, 15, 5,
+ 247, 218, 15, 5, 247, 219, 30, 220, 64, 15, 5, 247, 217, 15, 5, 247, 207,
+ 15, 5, 247, 208, 234, 209, 104, 242, 96, 247, 188, 15, 5, 247, 188, 15,
+ 5, 246, 79, 15, 5, 246, 80, 117, 246, 79, 15, 5, 246, 80, 242, 95, 15, 5,
+ 246, 80, 220, 46, 15, 5, 246, 77, 15, 5, 246, 78, 30, 245, 73, 15, 5,
+ 246, 76, 15, 5, 246, 75, 15, 5, 246, 74, 15, 5, 246, 73, 15, 5, 246, 69,
+ 15, 5, 246, 67, 15, 5, 246, 68, 242, 95, 15, 5, 246, 68, 242, 96, 242,
+ 95, 15, 5, 246, 66, 15, 5, 246, 59, 15, 5, 75, 15, 5, 160, 30, 226, 22,
+ 15, 5, 160, 117, 160, 227, 196, 117, 227, 195, 15, 5, 245, 235, 15, 5,
+ 245, 236, 30, 115, 96, 242, 50, 96, 248, 222, 15, 5, 245, 236, 30, 243,
+ 97, 15, 5, 245, 236, 30, 230, 231, 15, 5, 245, 236, 30, 222, 9, 15, 5,
+ 245, 236, 30, 220, 64, 15, 5, 245, 236, 30, 70, 15, 5, 245, 212, 15, 5,
+ 245, 201, 15, 5, 245, 175, 15, 5, 245, 151, 15, 5, 245, 152, 30, 243,
+ 105, 15, 5, 245, 152, 30, 243, 106, 216, 240, 15, 5, 245, 152, 30, 231,
+ 92, 15, 5, 245, 152, 249, 126, 245, 151, 15, 5, 245, 152, 226, 165, 245,
+ 151, 15, 5, 245, 152, 218, 234, 15, 5, 245, 90, 15, 5, 245, 88, 15, 5,
+ 245, 73, 15, 5, 245, 11, 15, 5, 245, 12, 30, 61, 15, 5, 245, 12, 30, 115,
+ 96, 233, 105, 15, 5, 245, 12, 30, 115, 96, 233, 106, 30, 233, 105, 15, 5,
+ 245, 12, 30, 254, 124, 15, 5, 245, 12, 30, 252, 177, 15, 5, 245, 12, 30,
+ 246, 68, 242, 95, 15, 5, 245, 12, 30, 246, 68, 242, 96, 242, 95, 15, 5,
+ 245, 12, 30, 162, 15, 5, 245, 12, 30, 242, 50, 242, 95, 15, 5, 245, 12,
+ 30, 236, 37, 242, 95, 15, 5, 245, 12, 30, 234, 208, 15, 5, 245, 12, 30,
+ 234, 209, 218, 234, 15, 5, 245, 12, 30, 233, 216, 15, 5, 245, 12, 30,
+ 233, 136, 15, 5, 245, 12, 30, 233, 106, 30, 233, 105, 15, 5, 245, 12, 30,
+ 232, 242, 15, 5, 245, 12, 30, 232, 99, 15, 5, 245, 12, 30, 214, 230, 15,
+ 5, 245, 12, 30, 214, 219, 15, 5, 243, 136, 15, 5, 243, 137, 242, 95, 15,
+ 5, 243, 134, 15, 5, 243, 135, 30, 115, 96, 248, 223, 96, 162, 15, 5, 243,
+ 135, 30, 115, 96, 162, 15, 5, 243, 135, 30, 115, 96, 236, 36, 15, 5, 243,
+ 135, 30, 255, 25, 216, 241, 96, 217, 94, 15, 5, 243, 135, 30, 254, 124,
+ 15, 5, 243, 135, 30, 253, 232, 15, 5, 243, 135, 30, 253, 231, 96, 243,
+ 119, 15, 5, 243, 135, 30, 252, 177, 15, 5, 243, 135, 30, 252, 142, 96,
+ 205, 15, 5, 243, 135, 30, 251, 99, 15, 5, 243, 135, 30, 251, 100, 96,
+ 205, 15, 5, 243, 135, 30, 248, 222, 15, 5, 243, 135, 30, 248, 4, 15, 5,
+ 243, 135, 30, 247, 219, 30, 220, 64, 15, 5, 243, 135, 30, 246, 77, 15, 5,
+ 243, 135, 30, 245, 175, 15, 5, 243, 135, 30, 245, 176, 96, 233, 136, 15,
+ 5, 243, 135, 30, 245, 151, 15, 5, 243, 135, 30, 245, 152, 30, 243, 106,
+ 216, 240, 15, 5, 243, 135, 30, 243, 106, 216, 240, 15, 5, 243, 135, 30,
+ 243, 97, 15, 5, 243, 135, 30, 242, 215, 15, 5, 243, 135, 30, 242, 213,
+ 15, 5, 243, 135, 30, 242, 214, 96, 61, 15, 5, 243, 135, 30, 242, 199, 96,
+ 218, 84, 15, 5, 243, 135, 30, 242, 50, 96, 232, 100, 96, 245, 73, 15, 5,
+ 243, 135, 30, 242, 31, 15, 5, 243, 135, 30, 242, 32, 96, 233, 136, 15, 5,
+ 243, 135, 30, 241, 182, 96, 232, 242, 15, 5, 243, 135, 30, 240, 219, 15,
+ 5, 243, 135, 30, 236, 37, 242, 95, 15, 5, 243, 135, 30, 235, 167, 96,
+ 240, 224, 96, 253, 232, 15, 5, 243, 135, 30, 234, 243, 15, 5, 243, 135,
+ 30, 234, 208, 15, 5, 243, 135, 30, 234, 90, 15, 5, 243, 135, 30, 234, 91,
+ 96, 233, 105, 15, 5, 243, 135, 30, 233, 217, 96, 254, 124, 15, 5, 243,
+ 135, 30, 233, 136, 15, 5, 243, 135, 30, 231, 93, 96, 245, 151, 15, 5,
+ 243, 135, 30, 230, 231, 15, 5, 243, 135, 30, 227, 195, 15, 5, 243, 135,
+ 30, 227, 196, 117, 227, 195, 15, 5, 243, 135, 30, 190, 15, 5, 243, 135,
+ 30, 222, 9, 15, 5, 243, 135, 30, 221, 232, 15, 5, 243, 135, 30, 220, 64,
+ 15, 5, 243, 135, 30, 220, 65, 96, 215, 99, 15, 5, 243, 135, 30, 220, 31,
+ 15, 5, 243, 135, 30, 218, 44, 15, 5, 243, 135, 30, 217, 73, 15, 5, 243,
+ 135, 30, 70, 15, 5, 243, 135, 30, 214, 219, 15, 5, 243, 135, 30, 214,
+ 220, 96, 246, 79, 15, 5, 243, 135, 117, 243, 134, 15, 5, 243, 129, 15, 5,
+ 243, 130, 249, 126, 243, 129, 15, 5, 243, 127, 15, 5, 243, 128, 117, 243,
+ 128, 243, 98, 117, 243, 97, 15, 5, 243, 119, 15, 5, 243, 120, 243, 128,
+ 117, 243, 128, 243, 98, 117, 243, 97, 15, 5, 243, 118, 15, 5, 243, 116,
+ 15, 5, 243, 107, 15, 5, 243, 105, 15, 5, 243, 106, 216, 240, 15, 5, 243,
+ 106, 117, 243, 105, 15, 5, 243, 106, 249, 126, 243, 105, 15, 5, 243, 97,
+ 15, 5, 243, 96, 15, 5, 243, 91, 15, 5, 243, 37, 15, 5, 243, 38, 30, 233,
+ 197, 15, 5, 242, 215, 15, 5, 242, 216, 30, 75, 15, 5, 242, 216, 30, 70,
+ 15, 5, 242, 216, 249, 126, 242, 215, 15, 5, 242, 213, 15, 5, 242, 214,
+ 117, 242, 213, 15, 5, 242, 214, 249, 126, 242, 213, 15, 5, 242, 210, 15,
+ 5, 242, 198, 15, 5, 242, 199, 242, 95, 15, 5, 242, 196, 15, 5, 242, 197,
+ 30, 115, 96, 236, 36, 15, 5, 242, 197, 30, 243, 106, 216, 240, 15, 5,
+ 242, 197, 30, 236, 36, 15, 5, 242, 197, 30, 232, 100, 96, 236, 36, 15, 5,
+ 242, 197, 30, 190, 15, 5, 242, 193, 15, 5, 242, 191, 15, 5, 242, 192,
+ 249, 126, 242, 191, 15, 5, 242, 192, 30, 252, 177, 15, 5, 242, 192, 30,
+ 217, 73, 15, 5, 242, 192, 216, 240, 15, 5, 242, 114, 15, 5, 242, 115,
+ 249, 126, 242, 114, 15, 5, 242, 112, 15, 5, 242, 113, 30, 234, 243, 15,
+ 5, 242, 113, 30, 234, 244, 30, 236, 37, 242, 95, 15, 5, 242, 113, 30,
+ 227, 195, 15, 5, 242, 113, 30, 222, 10, 96, 215, 114, 15, 5, 242, 113,
+ 242, 95, 15, 5, 242, 104, 15, 5, 242, 105, 30, 115, 96, 233, 197, 15, 5,
+ 242, 105, 30, 233, 197, 15, 5, 242, 105, 117, 242, 105, 232, 92, 15, 5,
+ 242, 99, 15, 5, 242, 97, 15, 5, 242, 98, 30, 220, 64, 15, 5, 242, 89, 15,
+ 5, 242, 88, 15, 5, 242, 85, 15, 5, 242, 84, 15, 5, 162, 15, 5, 242, 50,
+ 216, 240, 15, 5, 242, 50, 242, 95, 15, 5, 242, 31, 15, 5, 241, 181, 15,
+ 5, 241, 182, 30, 253, 232, 15, 5, 241, 182, 30, 253, 230, 15, 5, 241,
+ 182, 30, 252, 177, 15, 5, 241, 182, 30, 247, 188, 15, 5, 241, 182, 30,
+ 243, 127, 15, 5, 241, 182, 30, 234, 82, 15, 5, 241, 182, 30, 227, 195,
+ 15, 5, 241, 182, 30, 220, 64, 15, 5, 241, 182, 30, 70, 15, 5, 240, 223,
+ 15, 5, 240, 219, 15, 5, 240, 220, 30, 254, 124, 15, 5, 240, 220, 30, 242,
+ 31, 15, 5, 240, 220, 30, 234, 208, 15, 5, 240, 220, 30, 232, 198, 15, 5,
+ 240, 220, 30, 214, 219, 15, 5, 240, 216, 15, 5, 73, 15, 5, 240, 155, 61,
+ 15, 5, 240, 116, 15, 5, 236, 64, 15, 5, 236, 65, 117, 236, 65, 251, 99,
+ 15, 5, 236, 65, 117, 236, 65, 218, 234, 15, 5, 236, 39, 15, 5, 236, 36,
+ 15, 5, 236, 37, 247, 243, 15, 5, 236, 37, 223, 36, 15, 5, 236, 37, 117,
+ 236, 37, 220, 15, 117, 220, 15, 214, 220, 117, 214, 219, 15, 5, 236, 37,
+ 242, 95, 15, 5, 236, 28, 15, 5, 236, 29, 30, 243, 106, 216, 240, 15, 5,
+ 236, 27, 15, 5, 236, 17, 15, 5, 236, 18, 30, 217, 73, 15, 5, 236, 18,
+ 249, 126, 236, 17, 15, 5, 236, 18, 226, 165, 236, 17, 15, 5, 236, 18,
+ 218, 234, 15, 5, 236, 10, 15, 5, 236, 0, 15, 5, 235, 180, 15, 5, 235,
+ 166, 15, 5, 176, 15, 5, 235, 14, 30, 61, 15, 5, 235, 14, 30, 255, 0, 15,
+ 5, 235, 14, 30, 255, 1, 96, 233, 216, 15, 5, 235, 14, 30, 253, 230, 15,
+ 5, 235, 14, 30, 252, 177, 15, 5, 235, 14, 30, 252, 161, 15, 5, 235, 14,
+ 30, 130, 15, 5, 235, 14, 30, 252, 7, 15, 5, 235, 14, 30, 245, 88, 15, 5,
+ 235, 14, 30, 245, 73, 15, 5, 235, 14, 30, 243, 136, 15, 5, 235, 14, 30,
+ 243, 119, 15, 5, 235, 14, 30, 243, 106, 216, 240, 15, 5, 235, 14, 30,
+ 243, 97, 15, 5, 235, 14, 30, 243, 98, 96, 220, 102, 96, 61, 15, 5, 235,
+ 14, 30, 242, 215, 15, 5, 235, 14, 30, 242, 198, 15, 5, 235, 14, 30, 242,
+ 192, 96, 221, 232, 15, 5, 235, 14, 30, 242, 192, 249, 126, 242, 191, 15,
+ 5, 235, 14, 30, 242, 114, 15, 5, 235, 14, 30, 242, 88, 15, 5, 235, 14,
+ 30, 236, 36, 15, 5, 235, 14, 30, 236, 17, 15, 5, 235, 14, 30, 234, 243,
+ 15, 5, 235, 14, 30, 234, 93, 15, 5, 235, 14, 30, 234, 90, 15, 5, 235, 14,
+ 30, 232, 242, 15, 5, 235, 14, 30, 232, 99, 15, 5, 235, 14, 30, 231, 92,
+ 15, 5, 235, 14, 30, 231, 93, 96, 246, 79, 15, 5, 235, 14, 30, 231, 93,
+ 96, 242, 215, 15, 5, 235, 14, 30, 231, 93, 96, 217, 23, 15, 5, 235, 14,
+ 30, 230, 231, 15, 5, 235, 14, 30, 230, 232, 96, 227, 190, 15, 5, 235, 14,
+ 30, 229, 108, 15, 5, 235, 14, 30, 227, 195, 15, 5, 235, 14, 30, 225, 109,
+ 15, 5, 235, 14, 30, 222, 141, 15, 5, 235, 14, 30, 206, 15, 5, 235, 14,
+ 30, 221, 232, 15, 5, 235, 14, 30, 220, 103, 15, 5, 235, 14, 30, 220, 64,
+ 15, 5, 235, 14, 30, 220, 31, 15, 5, 235, 14, 30, 219, 226, 15, 5, 235,
+ 14, 30, 219, 183, 15, 5, 235, 14, 30, 218, 52, 15, 5, 235, 14, 30, 217,
+ 51, 15, 5, 235, 14, 30, 70, 15, 5, 235, 14, 30, 214, 230, 15, 5, 235, 14,
+ 30, 214, 219, 15, 5, 235, 14, 30, 214, 193, 30, 190, 15, 5, 235, 14, 30,
+ 214, 126, 15, 5, 235, 14, 30, 210, 44, 15, 5, 235, 12, 15, 5, 235, 13,
+ 249, 126, 235, 12, 15, 5, 235, 5, 15, 5, 235, 2, 15, 5, 235, 0, 15, 5,
+ 234, 255, 15, 5, 234, 253, 15, 5, 234, 254, 117, 234, 253, 15, 5, 234,
+ 243, 15, 5, 234, 244, 30, 236, 37, 242, 95, 15, 5, 234, 239, 15, 5, 234,
+ 240, 30, 252, 177, 15, 5, 234, 240, 249, 126, 234, 239, 15, 5, 234, 237,
+ 15, 5, 234, 236, 15, 5, 234, 208, 15, 5, 234, 209, 233, 119, 30, 104,
+ 117, 233, 119, 30, 70, 15, 5, 234, 209, 117, 234, 209, 233, 119, 30, 104,
+ 117, 233, 119, 30, 70, 15, 5, 234, 158, 15, 5, 234, 93, 15, 5, 234, 94,
+ 30, 252, 177, 15, 5, 234, 94, 30, 70, 15, 5, 234, 94, 30, 214, 219, 15,
+ 5, 234, 90, 15, 5, 234, 82, 15, 5, 234, 69, 15, 5, 234, 68, 15, 5, 234,
+ 66, 15, 5, 234, 67, 117, 234, 66, 15, 5, 233, 218, 15, 5, 233, 219, 117,
+ 241, 182, 30, 253, 231, 233, 219, 117, 241, 182, 30, 253, 230, 15, 5,
+ 233, 216, 15, 5, 233, 214, 15, 5, 233, 215, 214, 12, 17, 15, 5, 233, 213,
+ 15, 5, 233, 210, 15, 5, 233, 211, 242, 95, 15, 5, 233, 209, 15, 5, 233,
+ 197, 15, 5, 233, 198, 226, 165, 233, 197, 15, 5, 233, 192, 15, 5, 233,
+ 173, 15, 5, 233, 136, 15, 5, 233, 118, 15, 5, 233, 119, 30, 61, 15, 5,
+ 233, 119, 30, 115, 96, 248, 223, 96, 162, 15, 5, 233, 119, 30, 115, 96,
+ 243, 97, 15, 5, 233, 119, 30, 115, 96, 233, 105, 15, 5, 233, 119, 30,
+ 254, 179, 15, 5, 233, 119, 30, 254, 124, 15, 5, 233, 119, 30, 253, 233,
+ 210, 40, 216, 240, 15, 5, 233, 119, 30, 252, 177, 15, 5, 233, 119, 30,
+ 252, 7, 15, 5, 233, 119, 30, 248, 167, 15, 5, 233, 119, 30, 245, 151, 15,
+ 5, 233, 119, 30, 243, 136, 15, 5, 233, 119, 30, 243, 97, 15, 5, 233, 119,
+ 30, 242, 104, 15, 5, 233, 119, 30, 242, 105, 96, 242, 104, 15, 5, 233,
+ 119, 30, 162, 15, 5, 233, 119, 30, 242, 31, 15, 5, 233, 119, 30, 241,
+ 182, 30, 227, 195, 15, 5, 233, 119, 30, 236, 37, 242, 95, 15, 5, 233,
+ 119, 30, 236, 17, 15, 5, 233, 119, 30, 236, 18, 96, 162, 15, 5, 233, 119,
+ 30, 236, 18, 96, 232, 99, 15, 5, 233, 119, 30, 234, 93, 15, 5, 233, 119,
+ 30, 234, 82, 15, 5, 233, 119, 30, 233, 216, 15, 5, 233, 119, 30, 233,
+ 210, 15, 5, 233, 119, 30, 233, 211, 96, 241, 182, 96, 61, 15, 5, 233,
+ 119, 30, 233, 118, 15, 5, 233, 119, 30, 232, 198, 15, 5, 233, 119, 30,
+ 232, 99, 15, 5, 233, 119, 30, 232, 87, 15, 5, 233, 119, 30, 231, 92, 15,
+ 5, 233, 119, 30, 231, 93, 96, 245, 151, 15, 5, 233, 119, 30, 230, 62, 15,
+ 5, 233, 119, 30, 229, 108, 15, 5, 233, 119, 30, 220, 65, 96, 218, 44, 15,
+ 5, 233, 119, 30, 220, 11, 96, 242, 192, 96, 245, 88, 15, 5, 233, 119, 30,
+ 220, 11, 96, 242, 192, 216, 240, 15, 5, 233, 119, 30, 219, 224, 15, 5,
+ 233, 119, 30, 219, 225, 96, 219, 224, 15, 5, 233, 119, 30, 218, 44, 15,
+ 5, 233, 119, 30, 217, 85, 15, 5, 233, 119, 30, 217, 73, 15, 5, 233, 119,
+ 30, 217, 24, 96, 115, 96, 218, 85, 96, 197, 15, 5, 233, 119, 30, 70, 15,
+ 5, 233, 119, 30, 104, 96, 61, 15, 5, 233, 119, 30, 104, 96, 104, 96, 70,
+ 15, 5, 233, 119, 30, 214, 231, 96, 253, 232, 15, 5, 233, 119, 30, 214,
+ 219, 15, 5, 233, 119, 30, 214, 126, 15, 5, 233, 119, 218, 234, 15, 5,
+ 233, 116, 15, 5, 233, 117, 30, 220, 64, 15, 5, 233, 117, 30, 220, 65, 96,
+ 218, 44, 15, 5, 233, 117, 242, 95, 15, 5, 233, 117, 242, 96, 117, 233,
+ 117, 242, 96, 220, 64, 15, 5, 233, 112, 15, 5, 233, 105, 15, 5, 233, 106,
+ 30, 233, 105, 15, 5, 233, 103, 15, 5, 233, 104, 30, 233, 197, 15, 5, 233,
+ 104, 30, 233, 198, 96, 222, 141, 15, 5, 232, 242, 15, 5, 232, 227, 15, 5,
+ 232, 217, 15, 5, 232, 198, 15, 5, 232, 99, 15, 5, 232, 100, 30, 252, 177,
+ 15, 5, 232, 97, 15, 5, 232, 98, 30, 254, 179, 15, 5, 232, 98, 30, 252,
+ 177, 15, 5, 232, 98, 30, 245, 73, 15, 5, 232, 98, 30, 245, 74, 216, 240,
+ 15, 5, 232, 98, 30, 243, 106, 216, 240, 15, 5, 232, 98, 30, 241, 182, 30,
+ 252, 177, 15, 5, 232, 98, 30, 236, 17, 15, 5, 232, 98, 30, 235, 2, 15, 5,
+ 232, 98, 30, 235, 0, 15, 5, 232, 98, 30, 235, 1, 96, 253, 232, 15, 5,
+ 232, 98, 30, 234, 93, 15, 5, 232, 98, 30, 233, 137, 96, 253, 232, 15, 5,
+ 232, 98, 30, 233, 118, 15, 5, 232, 98, 30, 231, 93, 96, 245, 151, 15, 5,
+ 232, 98, 30, 229, 108, 15, 5, 232, 98, 30, 227, 238, 15, 5, 232, 98, 30,
+ 219, 193, 96, 253, 232, 15, 5, 232, 98, 30, 219, 175, 96, 251, 126, 15,
+ 5, 232, 98, 30, 215, 114, 15, 5, 232, 98, 216, 240, 15, 5, 232, 98, 249,
+ 126, 232, 97, 15, 5, 232, 98, 226, 165, 232, 97, 15, 5, 232, 98, 218,
+ 234, 15, 5, 232, 98, 220, 46, 15, 5, 232, 96, 15, 5, 232, 92, 15, 5, 232,
+ 93, 117, 232, 92, 15, 5, 232, 93, 226, 165, 232, 92, 15, 5, 232, 93, 220,
+ 46, 15, 5, 232, 90, 15, 5, 232, 87, 15, 5, 232, 85, 15, 5, 232, 86, 117,
+ 232, 85, 15, 5, 232, 86, 117, 232, 86, 243, 98, 117, 243, 97, 15, 5, 185,
+ 15, 5, 231, 240, 30, 217, 73, 15, 5, 231, 240, 242, 95, 15, 5, 231, 239,
+ 15, 5, 231, 211, 15, 5, 231, 167, 15, 5, 231, 148, 15, 5, 231, 147, 15,
+ 5, 231, 92, 15, 5, 231, 48, 15, 5, 230, 231, 15, 5, 230, 189, 15, 5, 230,
+ 103, 15, 5, 230, 104, 117, 230, 103, 15, 5, 230, 94, 15, 5, 230, 95, 242,
+ 95, 15, 5, 230, 79, 15, 5, 230, 65, 15, 5, 230, 62, 15, 5, 230, 63, 30,
+ 61, 15, 5, 230, 63, 30, 233, 197, 15, 5, 230, 63, 30, 210, 116, 15, 5,
+ 230, 63, 117, 230, 62, 15, 5, 230, 63, 117, 230, 63, 30, 115, 96, 197,
+ 15, 5, 230, 63, 249, 126, 230, 62, 15, 5, 230, 60, 15, 5, 230, 61, 30,
+ 61, 15, 5, 230, 61, 30, 115, 96, 248, 4, 15, 5, 230, 61, 30, 248, 4, 15,
+ 5, 230, 61, 242, 95, 15, 5, 197, 15, 5, 229, 228, 15, 5, 229, 217, 15, 5,
+ 229, 218, 235, 193, 15, 5, 229, 218, 30, 219, 227, 216, 240, 15, 5, 229,
+ 218, 226, 165, 229, 217, 15, 5, 229, 216, 15, 5, 229, 209, 227, 181, 15,
+ 5, 229, 208, 15, 5, 229, 207, 15, 5, 229, 108, 15, 5, 229, 109, 30, 61,
+ 15, 5, 229, 109, 30, 214, 219, 15, 5, 229, 109, 220, 46, 15, 5, 228, 234,
+ 15, 5, 228, 235, 30, 75, 15, 5, 228, 233, 15, 5, 228, 204, 15, 5, 228,
+ 205, 30, 243, 106, 216, 240, 15, 5, 228, 205, 30, 243, 98, 96, 243, 106,
+ 216, 240, 15, 5, 228, 202, 15, 5, 228, 203, 30, 254, 124, 15, 5, 228,
+ 203, 30, 253, 232, 15, 5, 228, 203, 30, 253, 233, 96, 253, 232, 15, 5,
+ 228, 203, 30, 242, 104, 15, 5, 228, 203, 30, 231, 93, 96, 243, 106, 216,
+ 240, 15, 5, 228, 203, 30, 229, 108, 15, 5, 228, 203, 30, 227, 195, 15, 5,
+ 228, 203, 30, 220, 64, 15, 5, 228, 203, 30, 220, 65, 96, 115, 254, 124,
+ 15, 5, 228, 203, 30, 220, 65, 96, 253, 232, 15, 5, 228, 203, 30, 220, 65,
+ 96, 253, 233, 96, 253, 232, 15, 5, 228, 203, 30, 214, 231, 96, 253, 232,
+ 15, 5, 228, 203, 30, 214, 126, 15, 5, 228, 191, 15, 5, 227, 238, 15, 5,
+ 227, 211, 15, 5, 227, 195, 15, 5, 227, 196, 233, 117, 30, 243, 97, 15, 5,
+ 227, 196, 233, 117, 30, 231, 148, 15, 5, 227, 196, 233, 117, 30, 222, 9,
+ 15, 5, 227, 196, 233, 117, 30, 222, 10, 117, 227, 196, 233, 117, 30, 222,
+ 9, 15, 5, 227, 196, 233, 117, 30, 214, 126, 15, 5, 227, 196, 216, 240,
+ 15, 5, 227, 196, 117, 227, 195, 15, 5, 227, 196, 249, 126, 227, 195, 15,
+ 5, 227, 196, 249, 126, 227, 196, 233, 117, 117, 233, 116, 15, 5, 227,
+ 190, 15, 5, 227, 191, 255, 25, 30, 253, 227, 15, 5, 227, 191, 255, 25,
+ 30, 252, 7, 15, 5, 227, 191, 255, 25, 30, 246, 75, 15, 5, 227, 191, 255,
+ 25, 30, 242, 104, 15, 5, 227, 191, 255, 25, 30, 236, 37, 242, 95, 15, 5,
+ 227, 191, 255, 25, 30, 235, 0, 15, 5, 227, 191, 255, 25, 30, 233, 136,
+ 15, 5, 227, 191, 255, 25, 30, 229, 108, 15, 5, 227, 191, 255, 25, 30,
+ 219, 172, 15, 5, 227, 191, 255, 25, 30, 214, 230, 15, 5, 227, 191, 234,
+ 67, 30, 252, 7, 15, 5, 227, 191, 234, 67, 30, 252, 8, 70, 15, 5, 190, 15,
+ 5, 226, 81, 15, 5, 226, 48, 15, 5, 226, 22, 15, 5, 225, 162, 15, 5, 225,
+ 109, 15, 5, 225, 110, 30, 61, 15, 5, 225, 110, 30, 255, 26, 15, 5, 225,
+ 110, 30, 252, 7, 15, 5, 225, 110, 30, 251, 126, 15, 5, 225, 110, 30, 75,
+ 15, 5, 225, 110, 30, 73, 15, 5, 225, 110, 30, 240, 116, 15, 5, 225, 110,
+ 30, 70, 15, 5, 225, 110, 30, 214, 230, 15, 5, 225, 110, 249, 126, 225,
+ 109, 15, 5, 225, 54, 15, 5, 225, 55, 30, 234, 239, 15, 5, 225, 55, 30,
+ 214, 219, 15, 5, 225, 55, 30, 210, 116, 15, 5, 225, 55, 226, 165, 225,
+ 54, 15, 5, 205, 15, 5, 223, 183, 15, 5, 223, 36, 15, 5, 222, 141, 15, 5,
+ 206, 15, 5, 222, 23, 227, 181, 15, 5, 222, 22, 15, 5, 222, 23, 30, 61,
+ 15, 5, 222, 23, 30, 246, 79, 15, 5, 222, 23, 30, 246, 77, 15, 5, 222, 23,
+ 30, 162, 15, 5, 222, 23, 30, 234, 243, 15, 5, 222, 23, 30, 233, 197, 15,
+ 5, 222, 23, 30, 232, 85, 15, 5, 222, 23, 30, 230, 231, 15, 5, 222, 23,
+ 30, 227, 195, 15, 5, 222, 23, 30, 222, 9, 15, 5, 222, 23, 30, 220, 31,
+ 15, 5, 222, 23, 30, 217, 94, 15, 5, 222, 23, 30, 214, 230, 15, 5, 222,
+ 23, 30, 214, 225, 15, 5, 222, 23, 30, 214, 197, 15, 5, 222, 23, 30, 214,
+ 150, 15, 5, 222, 23, 30, 214, 126, 15, 5, 222, 23, 117, 222, 22, 15, 5,
+ 222, 23, 242, 95, 15, 5, 222, 9, 15, 5, 222, 10, 233, 119, 30, 253, 230,
+ 15, 5, 221, 240, 15, 5, 221, 232, 15, 5, 220, 103, 15, 5, 220, 101, 15,
+ 5, 220, 102, 30, 61, 15, 5, 220, 102, 30, 252, 177, 15, 5, 220, 102, 30,
+ 242, 191, 15, 5, 220, 102, 30, 229, 108, 15, 5, 220, 102, 30, 219, 224,
+ 15, 5, 220, 102, 30, 215, 99, 15, 5, 220, 102, 30, 70, 15, 5, 220, 102,
+ 30, 104, 96, 61, 15, 5, 220, 100, 15, 5, 220, 98, 15, 5, 220, 79, 15, 5,
+ 220, 64, 15, 5, 220, 65, 240, 223, 15, 5, 220, 65, 117, 220, 65, 243,
+ 128, 117, 243, 128, 243, 98, 117, 243, 97, 15, 5, 220, 65, 117, 220, 65,
+ 217, 95, 117, 217, 95, 243, 98, 117, 243, 97, 15, 5, 220, 57, 15, 5, 220,
+ 52, 15, 5, 220, 49, 15, 5, 220, 48, 15, 5, 220, 45, 15, 5, 220, 31, 15,
+ 5, 220, 32, 30, 61, 15, 5, 220, 32, 30, 236, 17, 15, 5, 220, 25, 15, 5,
+ 220, 26, 30, 61, 15, 5, 220, 26, 30, 252, 162, 15, 5, 220, 26, 30, 251,
+ 110, 15, 5, 220, 26, 30, 247, 207, 15, 5, 220, 26, 30, 243, 97, 15, 5,
+ 220, 26, 30, 236, 36, 15, 5, 220, 26, 30, 236, 37, 242, 95, 15, 5, 220,
+ 26, 30, 233, 192, 15, 5, 220, 26, 30, 232, 87, 15, 5, 220, 26, 30, 230,
+ 94, 15, 5, 220, 26, 30, 222, 9, 15, 5, 220, 19, 15, 5, 220, 14, 15, 5,
+ 220, 15, 216, 240, 15, 5, 220, 15, 117, 220, 15, 251, 100, 117, 251, 99,
+ 15, 5, 220, 10, 15, 5, 219, 226, 15, 5, 219, 227, 117, 235, 194, 219,
+ 226, 15, 5, 219, 224, 15, 5, 219, 223, 15, 5, 219, 192, 15, 5, 219, 193,
+ 242, 95, 15, 5, 219, 183, 15, 5, 219, 181, 15, 5, 219, 182, 117, 219,
+ 182, 219, 224, 15, 5, 219, 174, 15, 5, 219, 172, 15, 5, 218, 84, 15, 5,
+ 218, 85, 117, 218, 84, 15, 5, 218, 55, 15, 5, 218, 54, 15, 5, 218, 52,
+ 15, 5, 218, 44, 15, 5, 218, 43, 15, 5, 218, 18, 15, 5, 218, 17, 15, 5,
+ 217, 106, 15, 5, 217, 107, 253, 217, 15, 5, 217, 107, 30, 241, 181, 15,
+ 5, 217, 107, 30, 230, 231, 15, 5, 217, 107, 242, 95, 15, 5, 217, 94, 15,
+ 5, 217, 95, 117, 217, 95, 228, 235, 117, 228, 235, 247, 189, 117, 247,
+ 188, 15, 5, 217, 95, 218, 234, 15, 5, 217, 85, 15, 5, 129, 30, 252, 7,
+ 15, 5, 129, 30, 242, 104, 15, 5, 129, 30, 220, 64, 15, 5, 129, 30, 219,
+ 226, 15, 5, 129, 30, 215, 114, 15, 5, 129, 30, 214, 219, 15, 5, 217, 73,
+ 15, 5, 217, 51, 15, 5, 217, 23, 15, 5, 217, 24, 242, 95, 15, 5, 216, 118,
+ 15, 5, 216, 119, 216, 240, 15, 5, 216, 91, 15, 5, 216, 73, 15, 5, 216,
+ 74, 30, 217, 73, 15, 5, 216, 74, 117, 216, 73, 15, 5, 216, 74, 117, 216,
+ 74, 243, 128, 117, 243, 128, 243, 98, 117, 243, 97, 15, 5, 215, 119, 15,
+ 5, 215, 114, 15, 5, 215, 112, 15, 5, 215, 109, 15, 5, 215, 99, 15, 5,
+ 215, 100, 117, 215, 100, 210, 117, 117, 210, 116, 15, 5, 70, 15, 5, 104,
+ 242, 104, 15, 5, 104, 104, 70, 15, 5, 104, 117, 104, 226, 91, 117, 226,
+ 91, 243, 98, 117, 243, 97, 15, 5, 104, 117, 104, 218, 19, 117, 218, 18,
+ 15, 5, 104, 117, 104, 104, 223, 50, 117, 104, 223, 49, 15, 5, 214, 230,
+ 15, 5, 214, 225, 15, 5, 214, 219, 15, 5, 214, 220, 233, 192, 15, 5, 214,
+ 220, 30, 252, 177, 15, 5, 214, 220, 30, 230, 231, 15, 5, 214, 220, 30,
+ 104, 96, 104, 96, 70, 15, 5, 214, 220, 30, 104, 96, 104, 96, 104, 242,
+ 95, 15, 5, 214, 220, 242, 95, 15, 5, 214, 220, 220, 46, 15, 5, 214, 220,
+ 220, 47, 30, 252, 177, 15, 5, 214, 215, 15, 5, 214, 197, 15, 5, 214, 198,
+ 30, 233, 118, 15, 5, 214, 198, 30, 231, 93, 96, 248, 222, 15, 5, 214,
+ 198, 30, 220, 101, 15, 5, 214, 198, 30, 70, 15, 5, 214, 196, 15, 5, 214,
+ 192, 15, 5, 214, 193, 30, 234, 208, 15, 5, 214, 193, 30, 190, 15, 5, 214,
+ 190, 15, 5, 214, 191, 242, 95, 15, 5, 214, 150, 15, 5, 214, 151, 249,
+ 126, 214, 150, 15, 5, 214, 151, 220, 46, 15, 5, 214, 148, 15, 5, 214,
+ 149, 30, 115, 96, 162, 15, 5, 214, 149, 30, 115, 96, 197, 15, 5, 214,
+ 149, 30, 254, 179, 15, 5, 214, 149, 30, 162, 15, 5, 214, 149, 30, 227,
+ 195, 15, 5, 214, 149, 30, 214, 230, 15, 5, 214, 149, 30, 214, 231, 96,
+ 253, 232, 15, 5, 214, 149, 30, 214, 231, 96, 252, 7, 15, 5, 214, 147, 15,
+ 5, 214, 144, 15, 5, 214, 143, 15, 5, 214, 139, 15, 5, 214, 140, 30, 61,
+ 15, 5, 214, 140, 30, 253, 227, 15, 5, 214, 140, 30, 130, 15, 5, 214, 140,
+ 30, 246, 69, 15, 5, 214, 140, 30, 243, 136, 15, 5, 214, 140, 30, 243,
+ 119, 15, 5, 214, 140, 30, 243, 106, 216, 240, 15, 5, 214, 140, 30, 243,
+ 97, 15, 5, 214, 140, 30, 242, 114, 15, 5, 214, 140, 30, 162, 15, 5, 214,
+ 140, 30, 236, 36, 15, 5, 214, 140, 30, 236, 17, 15, 5, 214, 140, 30, 235,
+ 166, 15, 5, 214, 140, 30, 234, 93, 15, 5, 214, 140, 30, 232, 85, 15, 5,
+ 214, 140, 30, 230, 189, 15, 5, 214, 140, 30, 190, 15, 5, 214, 140, 30,
+ 220, 64, 15, 5, 214, 140, 30, 219, 181, 15, 5, 214, 140, 30, 215, 119,
+ 15, 5, 214, 140, 30, 104, 96, 242, 104, 15, 5, 214, 140, 30, 214, 219,
15, 5, 214, 140, 30, 214, 137, 15, 5, 214, 137, 15, 5, 214, 138, 30, 70,
- 15, 5, 214, 126, 15, 5, 214, 127, 30, 61, 15, 5, 214, 127, 30, 233, 217,
- 15, 5, 214, 127, 30, 233, 196, 15, 5, 214, 127, 30, 217, 72, 15, 5, 214,
+ 15, 5, 214, 126, 15, 5, 214, 127, 30, 61, 15, 5, 214, 127, 30, 233, 218,
+ 15, 5, 214, 127, 30, 233, 197, 15, 5, 214, 127, 30, 217, 73, 15, 5, 214,
122, 15, 5, 214, 125, 15, 5, 214, 123, 15, 5, 214, 119, 15, 5, 214, 108,
- 15, 5, 214, 109, 30, 234, 207, 15, 5, 214, 107, 15, 5, 210, 116, 15, 5,
- 210, 117, 216, 239, 15, 5, 210, 117, 92, 30, 233, 196, 15, 5, 210, 113,
+ 15, 5, 214, 109, 30, 234, 208, 15, 5, 214, 107, 15, 5, 210, 116, 15, 5,
+ 210, 117, 216, 240, 15, 5, 210, 117, 92, 30, 233, 197, 15, 5, 210, 113,
15, 5, 210, 106, 15, 5, 210, 93, 15, 5, 210, 44, 15, 5, 210, 45, 117,
- 210, 44, 15, 5, 210, 43, 15, 5, 210, 41, 15, 5, 210, 42, 235, 3, 216,
- 239, 15, 5, 210, 36, 15, 5, 210, 28, 15, 5, 210, 13, 15, 5, 210, 11, 15,
+ 210, 44, 15, 5, 210, 43, 15, 5, 210, 41, 15, 5, 210, 42, 235, 4, 216,
+ 240, 15, 5, 210, 36, 15, 5, 210, 28, 15, 5, 210, 13, 15, 5, 210, 11, 15,
5, 210, 12, 30, 61, 15, 5, 210, 10, 15, 5, 210, 9, 15, 132, 5, 113, 253,
- 231, 15, 132, 5, 134, 253, 231, 15, 132, 5, 244, 11, 253, 231, 15, 132,
- 5, 244, 81, 253, 231, 15, 132, 5, 219, 125, 253, 231, 15, 132, 5, 220,
- 122, 253, 231, 15, 132, 5, 245, 193, 253, 231, 15, 132, 5, 228, 200, 253,
- 231, 15, 132, 5, 134, 247, 187, 15, 132, 5, 244, 11, 247, 187, 15, 132,
- 5, 244, 81, 247, 187, 15, 132, 5, 219, 125, 247, 187, 15, 132, 5, 220,
- 122, 247, 187, 15, 132, 5, 245, 193, 247, 187, 15, 132, 5, 228, 200, 247,
- 187, 15, 132, 5, 244, 11, 70, 15, 132, 5, 244, 81, 70, 15, 132, 5, 219,
- 125, 70, 15, 132, 5, 220, 122, 70, 15, 132, 5, 245, 193, 70, 15, 132, 5,
- 228, 200, 70, 15, 132, 5, 123, 243, 38, 15, 132, 5, 113, 243, 38, 15,
- 132, 5, 134, 243, 38, 15, 132, 5, 244, 11, 243, 38, 15, 132, 5, 244, 81,
- 243, 38, 15, 132, 5, 219, 125, 243, 38, 15, 132, 5, 220, 122, 243, 38,
- 15, 132, 5, 245, 193, 243, 38, 15, 132, 5, 228, 200, 243, 38, 15, 132, 5,
- 123, 243, 35, 15, 132, 5, 113, 243, 35, 15, 132, 5, 134, 243, 35, 15,
- 132, 5, 244, 11, 243, 35, 15, 132, 5, 244, 81, 243, 35, 15, 132, 5, 113,
- 220, 78, 15, 132, 5, 134, 220, 78, 15, 132, 5, 134, 220, 79, 214, 12, 17,
- 15, 132, 5, 244, 11, 220, 78, 15, 132, 5, 244, 81, 220, 78, 15, 132, 5,
- 219, 125, 220, 78, 15, 132, 5, 220, 122, 220, 78, 15, 132, 5, 245, 193,
- 220, 78, 15, 132, 5, 228, 200, 220, 78, 15, 132, 5, 123, 220, 73, 15,
- 132, 5, 113, 220, 73, 15, 132, 5, 134, 220, 73, 15, 132, 5, 134, 220, 74,
- 214, 12, 17, 15, 132, 5, 244, 11, 220, 73, 15, 132, 5, 244, 81, 220, 73,
- 15, 132, 5, 220, 79, 30, 243, 119, 96, 247, 187, 15, 132, 5, 220, 79, 30,
- 243, 119, 96, 230, 188, 15, 132, 5, 123, 251, 95, 15, 132, 5, 113, 251,
- 95, 15, 132, 5, 134, 251, 95, 15, 132, 5, 134, 251, 96, 214, 12, 17, 15,
- 132, 5, 244, 11, 251, 95, 15, 132, 5, 244, 81, 251, 95, 15, 132, 5, 134,
- 214, 12, 244, 20, 245, 74, 15, 132, 5, 134, 214, 12, 244, 20, 245, 71,
- 15, 132, 5, 244, 11, 214, 12, 244, 20, 232, 217, 15, 132, 5, 244, 11,
- 214, 12, 244, 20, 232, 215, 15, 132, 5, 244, 11, 214, 12, 244, 20, 232,
- 218, 61, 15, 132, 5, 244, 11, 214, 12, 244, 20, 232, 218, 253, 158, 15,
- 132, 5, 219, 125, 214, 12, 244, 20, 253, 228, 15, 132, 5, 220, 122, 214,
- 12, 244, 20, 236, 8, 15, 132, 5, 220, 122, 214, 12, 244, 20, 236, 10, 61,
- 15, 132, 5, 220, 122, 214, 12, 244, 20, 236, 10, 253, 158, 15, 132, 5,
- 245, 193, 214, 12, 244, 20, 214, 121, 15, 132, 5, 245, 193, 214, 12, 244,
- 20, 214, 120, 15, 132, 5, 228, 200, 214, 12, 244, 20, 236, 24, 15, 132,
- 5, 228, 200, 214, 12, 244, 20, 236, 23, 15, 132, 5, 228, 200, 214, 12,
- 244, 20, 236, 22, 15, 132, 5, 228, 200, 214, 12, 244, 20, 236, 25, 61,
- 15, 132, 5, 113, 253, 232, 216, 239, 15, 132, 5, 134, 253, 232, 216, 239,
- 15, 132, 5, 244, 11, 253, 232, 216, 239, 15, 132, 5, 244, 81, 253, 232,
- 216, 239, 15, 132, 5, 219, 125, 253, 232, 216, 239, 15, 132, 5, 123, 252,
- 150, 15, 132, 5, 113, 252, 150, 15, 132, 5, 134, 252, 150, 15, 132, 5,
- 244, 11, 252, 150, 15, 132, 5, 244, 11, 252, 151, 214, 12, 17, 15, 132,
- 5, 244, 81, 252, 150, 15, 132, 5, 244, 81, 252, 151, 214, 12, 17, 15,
- 132, 5, 228, 210, 15, 132, 5, 228, 211, 15, 132, 5, 123, 245, 70, 15,
- 132, 5, 113, 245, 70, 15, 132, 5, 123, 216, 169, 247, 187, 15, 132, 5,
- 113, 216, 167, 247, 187, 15, 132, 5, 244, 81, 219, 114, 247, 187, 15,
- 132, 5, 123, 216, 169, 214, 12, 244, 20, 61, 15, 132, 5, 113, 216, 167,
- 214, 12, 244, 20, 61, 15, 132, 5, 123, 245, 189, 253, 231, 15, 132, 5,
- 123, 224, 22, 253, 231, 15, 132, 5, 55, 253, 219, 123, 219, 115, 15, 132,
- 5, 55, 253, 219, 123, 224, 21, 15, 224, 141, 5, 55, 253, 219, 211, 209,
- 247, 172, 15, 224, 141, 5, 67, 249, 226, 15, 224, 141, 5, 247, 255, 249,
- 226, 15, 224, 141, 5, 247, 255, 215, 221, 12, 13, 255, 155, 12, 13, 255,
- 154, 12, 13, 255, 153, 12, 13, 255, 152, 12, 13, 255, 151, 12, 13, 255,
- 150, 12, 13, 255, 149, 12, 13, 255, 148, 12, 13, 255, 147, 12, 13, 255,
- 146, 12, 13, 255, 145, 12, 13, 255, 144, 12, 13, 255, 143, 12, 13, 255,
- 142, 12, 13, 255, 141, 12, 13, 255, 140, 12, 13, 255, 139, 12, 13, 255,
- 138, 12, 13, 255, 137, 12, 13, 255, 136, 12, 13, 255, 135, 12, 13, 255,
- 134, 12, 13, 255, 133, 12, 13, 255, 132, 12, 13, 255, 131, 12, 13, 255,
- 130, 12, 13, 255, 129, 12, 13, 255, 128, 12, 13, 255, 127, 12, 13, 255,
- 126, 12, 13, 255, 125, 12, 13, 255, 124, 12, 13, 255, 123, 12, 13, 255,
- 122, 12, 13, 255, 121, 12, 13, 255, 120, 12, 13, 255, 119, 12, 13, 255,
- 118, 12, 13, 255, 117, 12, 13, 255, 116, 12, 13, 255, 115, 12, 13, 255,
- 114, 12, 13, 255, 113, 12, 13, 255, 112, 12, 13, 255, 111, 12, 13, 255,
- 110, 12, 13, 255, 109, 12, 13, 255, 108, 12, 13, 255, 107, 12, 13, 255,
- 106, 12, 13, 255, 105, 12, 13, 255, 104, 12, 13, 255, 103, 12, 13, 255,
- 102, 12, 13, 255, 101, 12, 13, 255, 100, 12, 13, 255, 99, 12, 13, 255,
- 98, 12, 13, 255, 97, 12, 13, 255, 96, 12, 13, 255, 95, 12, 13, 255, 94,
- 12, 13, 255, 93, 12, 13, 255, 92, 12, 13, 255, 91, 12, 13, 255, 90, 12,
- 13, 255, 89, 12, 13, 255, 88, 12, 13, 255, 87, 12, 13, 255, 86, 12, 13,
- 255, 85, 12, 13, 255, 84, 12, 13, 255, 83, 12, 13, 255, 82, 12, 13, 255,
- 81, 12, 13, 255, 80, 12, 13, 255, 79, 12, 13, 255, 78, 12, 13, 255, 77,
- 12, 13, 255, 76, 12, 13, 253, 156, 12, 13, 253, 154, 12, 13, 253, 152,
- 12, 13, 253, 150, 12, 13, 253, 148, 12, 13, 253, 147, 12, 13, 253, 145,
- 12, 13, 253, 143, 12, 13, 253, 141, 12, 13, 253, 139, 12, 13, 251, 62,
- 12, 13, 251, 61, 12, 13, 251, 60, 12, 13, 251, 59, 12, 13, 251, 58, 12,
- 13, 251, 57, 12, 13, 251, 56, 12, 13, 251, 55, 12, 13, 251, 54, 12, 13,
- 251, 53, 12, 13, 251, 52, 12, 13, 251, 51, 12, 13, 251, 50, 12, 13, 251,
- 49, 12, 13, 251, 48, 12, 13, 251, 47, 12, 13, 251, 46, 12, 13, 251, 45,
- 12, 13, 251, 44, 12, 13, 251, 43, 12, 13, 251, 42, 12, 13, 251, 41, 12,
- 13, 251, 40, 12, 13, 251, 39, 12, 13, 251, 38, 12, 13, 251, 37, 12, 13,
- 251, 36, 12, 13, 251, 35, 12, 13, 249, 59, 12, 13, 249, 58, 12, 13, 249,
- 57, 12, 13, 249, 56, 12, 13, 249, 55, 12, 13, 249, 54, 12, 13, 249, 53,
- 12, 13, 249, 52, 12, 13, 249, 51, 12, 13, 249, 50, 12, 13, 249, 49, 12,
- 13, 249, 48, 12, 13, 249, 47, 12, 13, 249, 46, 12, 13, 249, 45, 12, 13,
- 249, 44, 12, 13, 249, 43, 12, 13, 249, 42, 12, 13, 249, 41, 12, 13, 249,
- 40, 12, 13, 249, 39, 12, 13, 249, 38, 12, 13, 249, 37, 12, 13, 249, 36,
- 12, 13, 249, 35, 12, 13, 249, 34, 12, 13, 249, 33, 12, 13, 249, 32, 12,
- 13, 249, 31, 12, 13, 249, 30, 12, 13, 249, 29, 12, 13, 249, 28, 12, 13,
- 249, 27, 12, 13, 249, 26, 12, 13, 249, 25, 12, 13, 249, 24, 12, 13, 249,
- 23, 12, 13, 249, 22, 12, 13, 249, 21, 12, 13, 249, 20, 12, 13, 249, 19,
- 12, 13, 249, 18, 12, 13, 249, 17, 12, 13, 249, 16, 12, 13, 249, 15, 12,
- 13, 249, 14, 12, 13, 249, 13, 12, 13, 249, 12, 12, 13, 249, 11, 12, 13,
- 249, 10, 12, 13, 249, 9, 12, 13, 249, 8, 12, 13, 249, 7, 12, 13, 249, 6,
- 12, 13, 249, 5, 12, 13, 249, 4, 12, 13, 249, 3, 12, 13, 249, 2, 12, 13,
- 249, 1, 12, 13, 249, 0, 12, 13, 248, 255, 12, 13, 248, 254, 12, 13, 248,
- 253, 12, 13, 248, 252, 12, 13, 248, 251, 12, 13, 248, 250, 12, 13, 248,
- 249, 12, 13, 248, 248, 12, 13, 248, 247, 12, 13, 248, 246, 12, 13, 248,
- 245, 12, 13, 248, 244, 12, 13, 248, 243, 12, 13, 248, 242, 12, 13, 248,
- 241, 12, 13, 248, 240, 12, 13, 248, 239, 12, 13, 248, 238, 12, 13, 248,
- 237, 12, 13, 248, 236, 12, 13, 248, 235, 12, 13, 248, 234, 12, 13, 248,
- 233, 12, 13, 248, 232, 12, 13, 248, 231, 12, 13, 248, 230, 12, 13, 248,
- 229, 12, 13, 248, 228, 12, 13, 248, 227, 12, 13, 248, 226, 12, 13, 248,
- 225, 12, 13, 248, 224, 12, 13, 246, 23, 12, 13, 246, 22, 12, 13, 246, 21,
- 12, 13, 246, 20, 12, 13, 246, 19, 12, 13, 246, 18, 12, 13, 246, 17, 12,
- 13, 246, 16, 12, 13, 246, 15, 12, 13, 246, 14, 12, 13, 246, 13, 12, 13,
- 246, 12, 12, 13, 246, 11, 12, 13, 246, 10, 12, 13, 246, 9, 12, 13, 246,
- 8, 12, 13, 246, 7, 12, 13, 246, 6, 12, 13, 246, 5, 12, 13, 246, 4, 12,
- 13, 246, 3, 12, 13, 246, 2, 12, 13, 246, 1, 12, 13, 246, 0, 12, 13, 245,
- 255, 12, 13, 245, 254, 12, 13, 245, 253, 12, 13, 245, 252, 12, 13, 245,
- 251, 12, 13, 245, 250, 12, 13, 245, 249, 12, 13, 245, 248, 12, 13, 245,
- 247, 12, 13, 245, 246, 12, 13, 245, 245, 12, 13, 245, 244, 12, 13, 245,
- 243, 12, 13, 245, 242, 12, 13, 245, 241, 12, 13, 245, 240, 12, 13, 245,
- 239, 12, 13, 245, 238, 12, 13, 245, 237, 12, 13, 245, 236, 12, 13, 245,
- 5, 12, 13, 245, 4, 12, 13, 245, 3, 12, 13, 245, 2, 12, 13, 245, 1, 12,
- 13, 245, 0, 12, 13, 244, 255, 12, 13, 244, 254, 12, 13, 244, 253, 12, 13,
- 244, 252, 12, 13, 244, 251, 12, 13, 244, 250, 12, 13, 244, 249, 12, 13,
- 244, 248, 12, 13, 244, 247, 12, 13, 244, 246, 12, 13, 244, 245, 12, 13,
- 244, 244, 12, 13, 244, 243, 12, 13, 244, 242, 12, 13, 244, 241, 12, 13,
- 244, 240, 12, 13, 244, 239, 12, 13, 244, 238, 12, 13, 244, 237, 12, 13,
- 244, 236, 12, 13, 244, 235, 12, 13, 244, 234, 12, 13, 244, 233, 12, 13,
- 244, 232, 12, 13, 244, 231, 12, 13, 244, 230, 12, 13, 244, 229, 12, 13,
- 244, 228, 12, 13, 244, 227, 12, 13, 244, 226, 12, 13, 244, 225, 12, 13,
- 244, 224, 12, 13, 244, 223, 12, 13, 244, 222, 12, 13, 244, 221, 12, 13,
- 244, 220, 12, 13, 244, 219, 12, 13, 244, 218, 12, 13, 244, 217, 12, 13,
- 244, 216, 12, 13, 244, 215, 12, 13, 244, 214, 12, 13, 244, 213, 12, 13,
- 244, 212, 12, 13, 244, 211, 12, 13, 244, 210, 12, 13, 244, 209, 12, 13,
- 244, 208, 12, 13, 244, 207, 12, 13, 244, 206, 12, 13, 244, 205, 12, 13,
- 244, 204, 12, 13, 244, 203, 12, 13, 244, 202, 12, 13, 244, 201, 12, 13,
- 244, 200, 12, 13, 244, 199, 12, 13, 244, 198, 12, 13, 244, 197, 12, 13,
- 243, 201, 12, 13, 243, 200, 12, 13, 243, 199, 12, 13, 243, 198, 12, 13,
- 243, 197, 12, 13, 243, 196, 12, 13, 243, 195, 12, 13, 243, 194, 12, 13,
- 243, 193, 12, 13, 243, 192, 12, 13, 243, 191, 12, 13, 243, 190, 12, 13,
- 243, 189, 12, 13, 243, 188, 12, 13, 243, 187, 12, 13, 243, 186, 12, 13,
- 243, 185, 12, 13, 243, 184, 12, 13, 243, 183, 12, 13, 243, 182, 12, 13,
- 243, 181, 12, 13, 243, 180, 12, 13, 243, 179, 12, 13, 243, 178, 12, 13,
- 243, 177, 12, 13, 243, 176, 12, 13, 243, 175, 12, 13, 243, 174, 12, 13,
- 243, 173, 12, 13, 243, 172, 12, 13, 243, 171, 12, 13, 243, 170, 12, 13,
- 243, 169, 12, 13, 243, 168, 12, 13, 243, 167, 12, 13, 243, 166, 12, 13,
- 243, 165, 12, 13, 243, 164, 12, 13, 243, 163, 12, 13, 243, 162, 12, 13,
- 243, 161, 12, 13, 243, 160, 12, 13, 243, 159, 12, 13, 243, 158, 12, 13,
- 243, 157, 12, 13, 243, 156, 12, 13, 243, 155, 12, 13, 243, 154, 12, 13,
- 243, 153, 12, 13, 243, 152, 12, 13, 243, 151, 12, 13, 243, 150, 12, 13,
- 243, 149, 12, 13, 243, 148, 12, 13, 243, 147, 12, 13, 243, 146, 12, 13,
- 243, 145, 12, 13, 243, 144, 12, 13, 243, 143, 12, 13, 243, 142, 12, 13,
- 243, 141, 12, 13, 243, 140, 12, 13, 243, 139, 12, 13, 243, 138, 12, 13,
- 242, 58, 12, 13, 242, 57, 12, 13, 242, 56, 12, 13, 242, 55, 12, 13, 242,
- 54, 12, 13, 242, 53, 12, 13, 242, 52, 12, 13, 242, 51, 12, 13, 242, 50,
- 12, 13, 240, 138, 12, 13, 240, 137, 12, 13, 240, 136, 12, 13, 240, 135,
- 12, 13, 240, 134, 12, 13, 240, 133, 12, 13, 240, 132, 12, 13, 240, 131,
- 12, 13, 240, 130, 12, 13, 240, 129, 12, 13, 240, 128, 12, 13, 240, 127,
- 12, 13, 240, 126, 12, 13, 240, 125, 12, 13, 240, 124, 12, 13, 240, 123,
- 12, 13, 240, 122, 12, 13, 240, 121, 12, 13, 240, 120, 12, 13, 235, 22,
- 12, 13, 235, 21, 12, 13, 235, 20, 12, 13, 235, 19, 12, 13, 235, 18, 12,
- 13, 235, 17, 12, 13, 235, 16, 12, 13, 235, 15, 12, 13, 233, 146, 12, 13,
- 233, 145, 12, 13, 233, 144, 12, 13, 233, 143, 12, 13, 233, 142, 12, 13,
- 233, 141, 12, 13, 233, 140, 12, 13, 233, 139, 12, 13, 233, 138, 12, 13,
- 233, 137, 12, 13, 232, 49, 12, 13, 232, 48, 12, 13, 232, 47, 12, 13, 232,
- 46, 12, 13, 232, 45, 12, 13, 232, 44, 12, 13, 232, 43, 12, 13, 232, 42,
- 12, 13, 232, 41, 12, 13, 232, 40, 12, 13, 232, 39, 12, 13, 232, 38, 12,
- 13, 232, 37, 12, 13, 232, 36, 12, 13, 232, 35, 12, 13, 232, 34, 12, 13,
- 232, 33, 12, 13, 232, 32, 12, 13, 232, 31, 12, 13, 232, 30, 12, 13, 232,
- 29, 12, 13, 232, 28, 12, 13, 232, 27, 12, 13, 232, 26, 12, 13, 232, 25,
- 12, 13, 232, 24, 12, 13, 232, 23, 12, 13, 232, 22, 12, 13, 232, 21, 12,
- 13, 232, 20, 12, 13, 232, 19, 12, 13, 232, 18, 12, 13, 232, 17, 12, 13,
- 232, 16, 12, 13, 232, 15, 12, 13, 232, 14, 12, 13, 232, 13, 12, 13, 232,
- 12, 12, 13, 232, 11, 12, 13, 232, 10, 12, 13, 232, 9, 12, 13, 232, 8, 12,
- 13, 232, 7, 12, 13, 232, 6, 12, 13, 232, 5, 12, 13, 232, 4, 12, 13, 232,
- 3, 12, 13, 232, 2, 12, 13, 232, 1, 12, 13, 232, 0, 12, 13, 231, 255, 12,
- 13, 231, 254, 12, 13, 231, 253, 12, 13, 231, 252, 12, 13, 231, 251, 12,
- 13, 231, 250, 12, 13, 231, 249, 12, 13, 231, 248, 12, 13, 231, 247, 12,
- 13, 231, 246, 12, 13, 231, 245, 12, 13, 231, 244, 12, 13, 231, 243, 12,
- 13, 231, 242, 12, 13, 231, 241, 12, 13, 231, 240, 12, 13, 230, 22, 12,
- 13, 230, 21, 12, 13, 230, 20, 12, 13, 230, 19, 12, 13, 230, 18, 12, 13,
- 230, 17, 12, 13, 230, 16, 12, 13, 230, 15, 12, 13, 230, 14, 12, 13, 230,
- 13, 12, 13, 230, 12, 12, 13, 230, 11, 12, 13, 230, 10, 12, 13, 230, 9,
- 12, 13, 230, 8, 12, 13, 230, 7, 12, 13, 230, 6, 12, 13, 230, 5, 12, 13,
- 230, 4, 12, 13, 230, 3, 12, 13, 230, 2, 12, 13, 230, 1, 12, 13, 230, 0,
- 12, 13, 229, 255, 12, 13, 229, 254, 12, 13, 229, 253, 12, 13, 229, 252,
- 12, 13, 229, 251, 12, 13, 229, 250, 12, 13, 229, 249, 12, 13, 229, 248,
- 12, 13, 229, 247, 12, 13, 229, 246, 12, 13, 229, 245, 12, 13, 229, 244,
- 12, 13, 229, 243, 12, 13, 229, 242, 12, 13, 229, 241, 12, 13, 229, 240,
- 12, 13, 229, 239, 12, 13, 229, 238, 12, 13, 229, 237, 12, 13, 229, 236,
- 12, 13, 229, 235, 12, 13, 229, 234, 12, 13, 229, 233, 12, 13, 229, 232,
- 12, 13, 229, 231, 12, 13, 229, 230, 12, 13, 228, 134, 12, 13, 228, 133,
- 12, 13, 228, 132, 12, 13, 228, 131, 12, 13, 228, 130, 12, 13, 228, 129,
- 12, 13, 228, 128, 12, 13, 228, 127, 12, 13, 228, 126, 12, 13, 228, 125,
- 12, 13, 228, 124, 12, 13, 228, 123, 12, 13, 228, 122, 12, 13, 228, 121,
- 12, 13, 228, 120, 12, 13, 228, 119, 12, 13, 228, 118, 12, 13, 228, 117,
- 12, 13, 228, 116, 12, 13, 228, 115, 12, 13, 228, 114, 12, 13, 228, 113,
- 12, 13, 227, 236, 12, 13, 227, 235, 12, 13, 227, 234, 12, 13, 227, 233,
- 12, 13, 227, 232, 12, 13, 227, 231, 12, 13, 227, 230, 12, 13, 227, 229,
- 12, 13, 227, 228, 12, 13, 227, 227, 12, 13, 227, 226, 12, 13, 227, 225,
- 12, 13, 227, 224, 12, 13, 227, 223, 12, 13, 227, 222, 12, 13, 227, 221,
- 12, 13, 227, 220, 12, 13, 227, 219, 12, 13, 227, 218, 12, 13, 227, 217,
- 12, 13, 227, 216, 12, 13, 227, 215, 12, 13, 227, 214, 12, 13, 227, 213,
- 12, 13, 227, 212, 12, 13, 227, 211, 12, 13, 227, 76, 12, 13, 227, 75, 12,
- 13, 227, 74, 12, 13, 227, 73, 12, 13, 227, 72, 12, 13, 227, 71, 12, 13,
- 227, 70, 12, 13, 227, 69, 12, 13, 227, 68, 12, 13, 227, 67, 12, 13, 227,
- 66, 12, 13, 227, 65, 12, 13, 227, 64, 12, 13, 227, 63, 12, 13, 227, 62,
- 12, 13, 227, 61, 12, 13, 227, 60, 12, 13, 227, 59, 12, 13, 227, 58, 12,
- 13, 227, 57, 12, 13, 227, 56, 12, 13, 227, 55, 12, 13, 227, 54, 12, 13,
- 227, 53, 12, 13, 227, 52, 12, 13, 227, 51, 12, 13, 227, 50, 12, 13, 227,
- 49, 12, 13, 227, 48, 12, 13, 227, 47, 12, 13, 227, 46, 12, 13, 227, 45,
- 12, 13, 227, 44, 12, 13, 227, 43, 12, 13, 227, 42, 12, 13, 227, 41, 12,
- 13, 227, 40, 12, 13, 227, 39, 12, 13, 227, 38, 12, 13, 227, 37, 12, 13,
- 227, 36, 12, 13, 227, 35, 12, 13, 227, 34, 12, 13, 227, 33, 12, 13, 227,
- 32, 12, 13, 227, 31, 12, 13, 227, 30, 12, 13, 227, 29, 12, 13, 227, 28,
- 12, 13, 227, 27, 12, 13, 227, 26, 12, 13, 227, 25, 12, 13, 227, 24, 12,
- 13, 227, 23, 12, 13, 227, 22, 12, 13, 227, 21, 12, 13, 227, 20, 12, 13,
- 227, 19, 12, 13, 227, 18, 12, 13, 227, 17, 12, 13, 227, 16, 12, 13, 227,
- 15, 12, 13, 227, 14, 12, 13, 227, 13, 12, 13, 227, 12, 12, 13, 227, 11,
- 12, 13, 227, 10, 12, 13, 227, 9, 12, 13, 227, 8, 12, 13, 227, 7, 12, 13,
- 227, 6, 12, 13, 227, 5, 12, 13, 227, 4, 12, 13, 227, 3, 12, 13, 227, 2,
- 12, 13, 226, 104, 12, 13, 226, 103, 12, 13, 226, 102, 12, 13, 226, 101,
- 12, 13, 226, 100, 12, 13, 226, 99, 12, 13, 226, 98, 12, 13, 226, 97, 12,
- 13, 226, 96, 12, 13, 226, 95, 12, 13, 226, 94, 12, 13, 226, 93, 12, 13,
- 226, 92, 12, 13, 224, 95, 12, 13, 224, 94, 12, 13, 224, 93, 12, 13, 224,
- 92, 12, 13, 224, 91, 12, 13, 224, 90, 12, 13, 224, 89, 12, 13, 223, 222,
- 12, 13, 223, 221, 12, 13, 223, 220, 12, 13, 223, 219, 12, 13, 223, 218,
- 12, 13, 223, 217, 12, 13, 223, 216, 12, 13, 223, 215, 12, 13, 223, 214,
- 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211, 12, 13, 223, 210,
- 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207, 12, 13, 223, 206,
- 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203, 12, 13, 223, 202,
- 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199, 12, 13, 223, 198,
- 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195, 12, 13, 223, 194,
- 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 223, 191, 12, 13, 223, 190,
- 12, 13, 223, 189, 12, 13, 222, 88, 12, 13, 222, 87, 12, 13, 222, 86, 12,
- 13, 222, 85, 12, 13, 222, 84, 12, 13, 222, 83, 12, 13, 222, 82, 12, 13,
- 222, 81, 12, 13, 222, 80, 12, 13, 222, 79, 12, 13, 222, 78, 12, 13, 222,
- 77, 12, 13, 222, 76, 12, 13, 222, 75, 12, 13, 222, 74, 12, 13, 222, 73,
- 12, 13, 222, 72, 12, 13, 222, 71, 12, 13, 222, 70, 12, 13, 222, 69, 12,
- 13, 222, 68, 12, 13, 222, 67, 12, 13, 222, 66, 12, 13, 222, 65, 12, 13,
- 222, 64, 12, 13, 222, 63, 12, 13, 222, 62, 12, 13, 222, 61, 12, 13, 222,
- 60, 12, 13, 222, 59, 12, 13, 222, 58, 12, 13, 222, 57, 12, 13, 222, 56,
- 12, 13, 222, 55, 12, 13, 222, 54, 12, 13, 222, 53, 12, 13, 222, 52, 12,
- 13, 222, 51, 12, 13, 222, 50, 12, 13, 222, 49, 12, 13, 222, 48, 12, 13,
- 222, 47, 12, 13, 222, 46, 12, 13, 222, 45, 12, 13, 222, 44, 12, 13, 222,
- 43, 12, 13, 222, 42, 12, 13, 222, 41, 12, 13, 222, 40, 12, 13, 222, 39,
- 12, 13, 222, 38, 12, 13, 222, 37, 12, 13, 222, 36, 12, 13, 222, 35, 12,
- 13, 217, 150, 12, 13, 217, 149, 12, 13, 217, 148, 12, 13, 217, 147, 12,
- 13, 217, 146, 12, 13, 217, 145, 12, 13, 217, 144, 12, 13, 217, 143, 12,
- 13, 217, 142, 12, 13, 217, 141, 12, 13, 217, 140, 12, 13, 217, 139, 12,
- 13, 217, 138, 12, 13, 217, 137, 12, 13, 217, 136, 12, 13, 217, 135, 12,
- 13, 217, 134, 12, 13, 217, 133, 12, 13, 217, 132, 12, 13, 217, 131, 12,
- 13, 217, 130, 12, 13, 217, 129, 12, 13, 217, 128, 12, 13, 217, 127, 12,
- 13, 217, 126, 12, 13, 217, 125, 12, 13, 217, 124, 12, 13, 217, 123, 12,
- 13, 217, 122, 12, 13, 217, 121, 12, 13, 217, 120, 12, 13, 217, 119, 12,
- 13, 217, 118, 12, 13, 217, 117, 12, 13, 217, 116, 12, 13, 217, 115, 12,
- 13, 217, 114, 12, 13, 217, 113, 12, 13, 217, 112, 12, 13, 217, 111, 12,
- 13, 217, 110, 12, 13, 217, 109, 12, 13, 217, 108, 12, 13, 217, 107, 12,
+ 232, 15, 132, 5, 134, 253, 232, 15, 132, 5, 244, 12, 253, 232, 15, 132,
+ 5, 244, 82, 253, 232, 15, 132, 5, 219, 126, 253, 232, 15, 132, 5, 220,
+ 123, 253, 232, 15, 132, 5, 245, 194, 253, 232, 15, 132, 5, 228, 201, 253,
+ 232, 15, 132, 5, 134, 247, 188, 15, 132, 5, 244, 12, 247, 188, 15, 132,
+ 5, 244, 82, 247, 188, 15, 132, 5, 219, 126, 247, 188, 15, 132, 5, 220,
+ 123, 247, 188, 15, 132, 5, 245, 194, 247, 188, 15, 132, 5, 228, 201, 247,
+ 188, 15, 132, 5, 244, 12, 70, 15, 132, 5, 244, 82, 70, 15, 132, 5, 219,
+ 126, 70, 15, 132, 5, 220, 123, 70, 15, 132, 5, 245, 194, 70, 15, 132, 5,
+ 228, 201, 70, 15, 132, 5, 123, 243, 39, 15, 132, 5, 113, 243, 39, 15,
+ 132, 5, 134, 243, 39, 15, 132, 5, 244, 12, 243, 39, 15, 132, 5, 244, 82,
+ 243, 39, 15, 132, 5, 219, 126, 243, 39, 15, 132, 5, 220, 123, 243, 39,
+ 15, 132, 5, 245, 194, 243, 39, 15, 132, 5, 228, 201, 243, 39, 15, 132, 5,
+ 123, 243, 36, 15, 132, 5, 113, 243, 36, 15, 132, 5, 134, 243, 36, 15,
+ 132, 5, 244, 12, 243, 36, 15, 132, 5, 244, 82, 243, 36, 15, 132, 5, 113,
+ 220, 79, 15, 132, 5, 134, 220, 79, 15, 132, 5, 134, 220, 80, 214, 12, 17,
+ 15, 132, 5, 244, 12, 220, 79, 15, 132, 5, 244, 82, 220, 79, 15, 132, 5,
+ 219, 126, 220, 79, 15, 132, 5, 220, 123, 220, 79, 15, 132, 5, 245, 194,
+ 220, 79, 15, 132, 5, 228, 201, 220, 79, 15, 132, 5, 123, 220, 74, 15,
+ 132, 5, 113, 220, 74, 15, 132, 5, 134, 220, 74, 15, 132, 5, 134, 220, 75,
+ 214, 12, 17, 15, 132, 5, 244, 12, 220, 74, 15, 132, 5, 244, 82, 220, 74,
+ 15, 132, 5, 220, 80, 30, 243, 120, 96, 247, 188, 15, 132, 5, 220, 80, 30,
+ 243, 120, 96, 230, 189, 15, 132, 5, 123, 251, 96, 15, 132, 5, 113, 251,
+ 96, 15, 132, 5, 134, 251, 96, 15, 132, 5, 134, 251, 97, 214, 12, 17, 15,
+ 132, 5, 244, 12, 251, 96, 15, 132, 5, 244, 82, 251, 96, 15, 132, 5, 134,
+ 214, 12, 244, 21, 245, 75, 15, 132, 5, 134, 214, 12, 244, 21, 245, 72,
+ 15, 132, 5, 244, 12, 214, 12, 244, 21, 232, 218, 15, 132, 5, 244, 12,
+ 214, 12, 244, 21, 232, 216, 15, 132, 5, 244, 12, 214, 12, 244, 21, 232,
+ 219, 61, 15, 132, 5, 244, 12, 214, 12, 244, 21, 232, 219, 253, 159, 15,
+ 132, 5, 219, 126, 214, 12, 244, 21, 253, 229, 15, 132, 5, 220, 123, 214,
+ 12, 244, 21, 236, 9, 15, 132, 5, 220, 123, 214, 12, 244, 21, 236, 11, 61,
+ 15, 132, 5, 220, 123, 214, 12, 244, 21, 236, 11, 253, 159, 15, 132, 5,
+ 245, 194, 214, 12, 244, 21, 214, 121, 15, 132, 5, 245, 194, 214, 12, 244,
+ 21, 214, 120, 15, 132, 5, 228, 201, 214, 12, 244, 21, 236, 25, 15, 132,
+ 5, 228, 201, 214, 12, 244, 21, 236, 24, 15, 132, 5, 228, 201, 214, 12,
+ 244, 21, 236, 23, 15, 132, 5, 228, 201, 214, 12, 244, 21, 236, 26, 61,
+ 15, 132, 5, 113, 253, 233, 216, 240, 15, 132, 5, 134, 253, 233, 216, 240,
+ 15, 132, 5, 244, 12, 253, 233, 216, 240, 15, 132, 5, 244, 82, 253, 233,
+ 216, 240, 15, 132, 5, 219, 126, 253, 233, 216, 240, 15, 132, 5, 123, 252,
+ 151, 15, 132, 5, 113, 252, 151, 15, 132, 5, 134, 252, 151, 15, 132, 5,
+ 244, 12, 252, 151, 15, 132, 5, 244, 12, 252, 152, 214, 12, 17, 15, 132,
+ 5, 244, 82, 252, 151, 15, 132, 5, 244, 82, 252, 152, 214, 12, 17, 15,
+ 132, 5, 228, 211, 15, 132, 5, 228, 212, 15, 132, 5, 123, 245, 71, 15,
+ 132, 5, 113, 245, 71, 15, 132, 5, 123, 216, 170, 247, 188, 15, 132, 5,
+ 113, 216, 168, 247, 188, 15, 132, 5, 244, 82, 219, 115, 247, 188, 15,
+ 132, 5, 123, 216, 170, 214, 12, 244, 21, 61, 15, 132, 5, 113, 216, 168,
+ 214, 12, 244, 21, 61, 15, 132, 5, 123, 245, 190, 253, 232, 15, 132, 5,
+ 123, 224, 23, 253, 232, 15, 132, 5, 55, 253, 220, 123, 219, 116, 15, 132,
+ 5, 55, 253, 220, 123, 224, 22, 15, 224, 142, 5, 55, 253, 220, 211, 209,
+ 247, 173, 15, 224, 142, 5, 67, 249, 227, 15, 224, 142, 5, 248, 0, 249,
+ 227, 15, 224, 142, 5, 248, 0, 215, 222, 12, 13, 255, 156, 12, 13, 255,
+ 155, 12, 13, 255, 154, 12, 13, 255, 153, 12, 13, 255, 152, 12, 13, 255,
+ 151, 12, 13, 255, 150, 12, 13, 255, 149, 12, 13, 255, 148, 12, 13, 255,
+ 147, 12, 13, 255, 146, 12, 13, 255, 145, 12, 13, 255, 144, 12, 13, 255,
+ 143, 12, 13, 255, 142, 12, 13, 255, 141, 12, 13, 255, 140, 12, 13, 255,
+ 139, 12, 13, 255, 138, 12, 13, 255, 137, 12, 13, 255, 136, 12, 13, 255,
+ 135, 12, 13, 255, 134, 12, 13, 255, 133, 12, 13, 255, 132, 12, 13, 255,
+ 131, 12, 13, 255, 130, 12, 13, 255, 129, 12, 13, 255, 128, 12, 13, 255,
+ 127, 12, 13, 255, 126, 12, 13, 255, 125, 12, 13, 255, 124, 12, 13, 255,
+ 123, 12, 13, 255, 122, 12, 13, 255, 121, 12, 13, 255, 120, 12, 13, 255,
+ 119, 12, 13, 255, 118, 12, 13, 255, 117, 12, 13, 255, 116, 12, 13, 255,
+ 115, 12, 13, 255, 114, 12, 13, 255, 113, 12, 13, 255, 112, 12, 13, 255,
+ 111, 12, 13, 255, 110, 12, 13, 255, 109, 12, 13, 255, 108, 12, 13, 255,
+ 107, 12, 13, 255, 106, 12, 13, 255, 105, 12, 13, 255, 104, 12, 13, 255,
+ 103, 12, 13, 255, 102, 12, 13, 255, 101, 12, 13, 255, 100, 12, 13, 255,
+ 99, 12, 13, 255, 98, 12, 13, 255, 97, 12, 13, 255, 96, 12, 13, 255, 95,
+ 12, 13, 255, 94, 12, 13, 255, 93, 12, 13, 255, 92, 12, 13, 255, 91, 12,
+ 13, 255, 90, 12, 13, 255, 89, 12, 13, 255, 88, 12, 13, 255, 87, 12, 13,
+ 255, 86, 12, 13, 255, 85, 12, 13, 255, 84, 12, 13, 255, 83, 12, 13, 255,
+ 82, 12, 13, 255, 81, 12, 13, 255, 80, 12, 13, 255, 79, 12, 13, 255, 78,
+ 12, 13, 255, 77, 12, 13, 253, 157, 12, 13, 253, 155, 12, 13, 253, 153,
+ 12, 13, 253, 151, 12, 13, 253, 149, 12, 13, 253, 148, 12, 13, 253, 146,
+ 12, 13, 253, 144, 12, 13, 253, 142, 12, 13, 253, 140, 12, 13, 251, 63,
+ 12, 13, 251, 62, 12, 13, 251, 61, 12, 13, 251, 60, 12, 13, 251, 59, 12,
+ 13, 251, 58, 12, 13, 251, 57, 12, 13, 251, 56, 12, 13, 251, 55, 12, 13,
+ 251, 54, 12, 13, 251, 53, 12, 13, 251, 52, 12, 13, 251, 51, 12, 13, 251,
+ 50, 12, 13, 251, 49, 12, 13, 251, 48, 12, 13, 251, 47, 12, 13, 251, 46,
+ 12, 13, 251, 45, 12, 13, 251, 44, 12, 13, 251, 43, 12, 13, 251, 42, 12,
+ 13, 251, 41, 12, 13, 251, 40, 12, 13, 251, 39, 12, 13, 251, 38, 12, 13,
+ 251, 37, 12, 13, 251, 36, 12, 13, 249, 60, 12, 13, 249, 59, 12, 13, 249,
+ 58, 12, 13, 249, 57, 12, 13, 249, 56, 12, 13, 249, 55, 12, 13, 249, 54,
+ 12, 13, 249, 53, 12, 13, 249, 52, 12, 13, 249, 51, 12, 13, 249, 50, 12,
+ 13, 249, 49, 12, 13, 249, 48, 12, 13, 249, 47, 12, 13, 249, 46, 12, 13,
+ 249, 45, 12, 13, 249, 44, 12, 13, 249, 43, 12, 13, 249, 42, 12, 13, 249,
+ 41, 12, 13, 249, 40, 12, 13, 249, 39, 12, 13, 249, 38, 12, 13, 249, 37,
+ 12, 13, 249, 36, 12, 13, 249, 35, 12, 13, 249, 34, 12, 13, 249, 33, 12,
+ 13, 249, 32, 12, 13, 249, 31, 12, 13, 249, 30, 12, 13, 249, 29, 12, 13,
+ 249, 28, 12, 13, 249, 27, 12, 13, 249, 26, 12, 13, 249, 25, 12, 13, 249,
+ 24, 12, 13, 249, 23, 12, 13, 249, 22, 12, 13, 249, 21, 12, 13, 249, 20,
+ 12, 13, 249, 19, 12, 13, 249, 18, 12, 13, 249, 17, 12, 13, 249, 16, 12,
+ 13, 249, 15, 12, 13, 249, 14, 12, 13, 249, 13, 12, 13, 249, 12, 12, 13,
+ 249, 11, 12, 13, 249, 10, 12, 13, 249, 9, 12, 13, 249, 8, 12, 13, 249, 7,
+ 12, 13, 249, 6, 12, 13, 249, 5, 12, 13, 249, 4, 12, 13, 249, 3, 12, 13,
+ 249, 2, 12, 13, 249, 1, 12, 13, 249, 0, 12, 13, 248, 255, 12, 13, 248,
+ 254, 12, 13, 248, 253, 12, 13, 248, 252, 12, 13, 248, 251, 12, 13, 248,
+ 250, 12, 13, 248, 249, 12, 13, 248, 248, 12, 13, 248, 247, 12, 13, 248,
+ 246, 12, 13, 248, 245, 12, 13, 248, 244, 12, 13, 248, 243, 12, 13, 248,
+ 242, 12, 13, 248, 241, 12, 13, 248, 240, 12, 13, 248, 239, 12, 13, 248,
+ 238, 12, 13, 248, 237, 12, 13, 248, 236, 12, 13, 248, 235, 12, 13, 248,
+ 234, 12, 13, 248, 233, 12, 13, 248, 232, 12, 13, 248, 231, 12, 13, 248,
+ 230, 12, 13, 248, 229, 12, 13, 248, 228, 12, 13, 248, 227, 12, 13, 248,
+ 226, 12, 13, 248, 225, 12, 13, 246, 24, 12, 13, 246, 23, 12, 13, 246, 22,
+ 12, 13, 246, 21, 12, 13, 246, 20, 12, 13, 246, 19, 12, 13, 246, 18, 12,
+ 13, 246, 17, 12, 13, 246, 16, 12, 13, 246, 15, 12, 13, 246, 14, 12, 13,
+ 246, 13, 12, 13, 246, 12, 12, 13, 246, 11, 12, 13, 246, 10, 12, 13, 246,
+ 9, 12, 13, 246, 8, 12, 13, 246, 7, 12, 13, 246, 6, 12, 13, 246, 5, 12,
+ 13, 246, 4, 12, 13, 246, 3, 12, 13, 246, 2, 12, 13, 246, 1, 12, 13, 246,
+ 0, 12, 13, 245, 255, 12, 13, 245, 254, 12, 13, 245, 253, 12, 13, 245,
+ 252, 12, 13, 245, 251, 12, 13, 245, 250, 12, 13, 245, 249, 12, 13, 245,
+ 248, 12, 13, 245, 247, 12, 13, 245, 246, 12, 13, 245, 245, 12, 13, 245,
+ 244, 12, 13, 245, 243, 12, 13, 245, 242, 12, 13, 245, 241, 12, 13, 245,
+ 240, 12, 13, 245, 239, 12, 13, 245, 238, 12, 13, 245, 237, 12, 13, 245,
+ 6, 12, 13, 245, 5, 12, 13, 245, 4, 12, 13, 245, 3, 12, 13, 245, 2, 12,
+ 13, 245, 1, 12, 13, 245, 0, 12, 13, 244, 255, 12, 13, 244, 254, 12, 13,
+ 244, 253, 12, 13, 244, 252, 12, 13, 244, 251, 12, 13, 244, 250, 12, 13,
+ 244, 249, 12, 13, 244, 248, 12, 13, 244, 247, 12, 13, 244, 246, 12, 13,
+ 244, 245, 12, 13, 244, 244, 12, 13, 244, 243, 12, 13, 244, 242, 12, 13,
+ 244, 241, 12, 13, 244, 240, 12, 13, 244, 239, 12, 13, 244, 238, 12, 13,
+ 244, 237, 12, 13, 244, 236, 12, 13, 244, 235, 12, 13, 244, 234, 12, 13,
+ 244, 233, 12, 13, 244, 232, 12, 13, 244, 231, 12, 13, 244, 230, 12, 13,
+ 244, 229, 12, 13, 244, 228, 12, 13, 244, 227, 12, 13, 244, 226, 12, 13,
+ 244, 225, 12, 13, 244, 224, 12, 13, 244, 223, 12, 13, 244, 222, 12, 13,
+ 244, 221, 12, 13, 244, 220, 12, 13, 244, 219, 12, 13, 244, 218, 12, 13,
+ 244, 217, 12, 13, 244, 216, 12, 13, 244, 215, 12, 13, 244, 214, 12, 13,
+ 244, 213, 12, 13, 244, 212, 12, 13, 244, 211, 12, 13, 244, 210, 12, 13,
+ 244, 209, 12, 13, 244, 208, 12, 13, 244, 207, 12, 13, 244, 206, 12, 13,
+ 244, 205, 12, 13, 244, 204, 12, 13, 244, 203, 12, 13, 244, 202, 12, 13,
+ 244, 201, 12, 13, 244, 200, 12, 13, 244, 199, 12, 13, 244, 198, 12, 13,
+ 243, 202, 12, 13, 243, 201, 12, 13, 243, 200, 12, 13, 243, 199, 12, 13,
+ 243, 198, 12, 13, 243, 197, 12, 13, 243, 196, 12, 13, 243, 195, 12, 13,
+ 243, 194, 12, 13, 243, 193, 12, 13, 243, 192, 12, 13, 243, 191, 12, 13,
+ 243, 190, 12, 13, 243, 189, 12, 13, 243, 188, 12, 13, 243, 187, 12, 13,
+ 243, 186, 12, 13, 243, 185, 12, 13, 243, 184, 12, 13, 243, 183, 12, 13,
+ 243, 182, 12, 13, 243, 181, 12, 13, 243, 180, 12, 13, 243, 179, 12, 13,
+ 243, 178, 12, 13, 243, 177, 12, 13, 243, 176, 12, 13, 243, 175, 12, 13,
+ 243, 174, 12, 13, 243, 173, 12, 13, 243, 172, 12, 13, 243, 171, 12, 13,
+ 243, 170, 12, 13, 243, 169, 12, 13, 243, 168, 12, 13, 243, 167, 12, 13,
+ 243, 166, 12, 13, 243, 165, 12, 13, 243, 164, 12, 13, 243, 163, 12, 13,
+ 243, 162, 12, 13, 243, 161, 12, 13, 243, 160, 12, 13, 243, 159, 12, 13,
+ 243, 158, 12, 13, 243, 157, 12, 13, 243, 156, 12, 13, 243, 155, 12, 13,
+ 243, 154, 12, 13, 243, 153, 12, 13, 243, 152, 12, 13, 243, 151, 12, 13,
+ 243, 150, 12, 13, 243, 149, 12, 13, 243, 148, 12, 13, 243, 147, 12, 13,
+ 243, 146, 12, 13, 243, 145, 12, 13, 243, 144, 12, 13, 243, 143, 12, 13,
+ 243, 142, 12, 13, 243, 141, 12, 13, 243, 140, 12, 13, 243, 139, 12, 13,
+ 242, 59, 12, 13, 242, 58, 12, 13, 242, 57, 12, 13, 242, 56, 12, 13, 242,
+ 55, 12, 13, 242, 54, 12, 13, 242, 53, 12, 13, 242, 52, 12, 13, 242, 51,
+ 12, 13, 240, 139, 12, 13, 240, 138, 12, 13, 240, 137, 12, 13, 240, 136,
+ 12, 13, 240, 135, 12, 13, 240, 134, 12, 13, 240, 133, 12, 13, 240, 132,
+ 12, 13, 240, 131, 12, 13, 240, 130, 12, 13, 240, 129, 12, 13, 240, 128,
+ 12, 13, 240, 127, 12, 13, 240, 126, 12, 13, 240, 125, 12, 13, 240, 124,
+ 12, 13, 240, 123, 12, 13, 240, 122, 12, 13, 240, 121, 12, 13, 235, 23,
+ 12, 13, 235, 22, 12, 13, 235, 21, 12, 13, 235, 20, 12, 13, 235, 19, 12,
+ 13, 235, 18, 12, 13, 235, 17, 12, 13, 235, 16, 12, 13, 233, 147, 12, 13,
+ 233, 146, 12, 13, 233, 145, 12, 13, 233, 144, 12, 13, 233, 143, 12, 13,
+ 233, 142, 12, 13, 233, 141, 12, 13, 233, 140, 12, 13, 233, 139, 12, 13,
+ 233, 138, 12, 13, 232, 50, 12, 13, 232, 49, 12, 13, 232, 48, 12, 13, 232,
+ 47, 12, 13, 232, 46, 12, 13, 232, 45, 12, 13, 232, 44, 12, 13, 232, 43,
+ 12, 13, 232, 42, 12, 13, 232, 41, 12, 13, 232, 40, 12, 13, 232, 39, 12,
+ 13, 232, 38, 12, 13, 232, 37, 12, 13, 232, 36, 12, 13, 232, 35, 12, 13,
+ 232, 34, 12, 13, 232, 33, 12, 13, 232, 32, 12, 13, 232, 31, 12, 13, 232,
+ 30, 12, 13, 232, 29, 12, 13, 232, 28, 12, 13, 232, 27, 12, 13, 232, 26,
+ 12, 13, 232, 25, 12, 13, 232, 24, 12, 13, 232, 23, 12, 13, 232, 22, 12,
+ 13, 232, 21, 12, 13, 232, 20, 12, 13, 232, 19, 12, 13, 232, 18, 12, 13,
+ 232, 17, 12, 13, 232, 16, 12, 13, 232, 15, 12, 13, 232, 14, 12, 13, 232,
+ 13, 12, 13, 232, 12, 12, 13, 232, 11, 12, 13, 232, 10, 12, 13, 232, 9,
+ 12, 13, 232, 8, 12, 13, 232, 7, 12, 13, 232, 6, 12, 13, 232, 5, 12, 13,
+ 232, 4, 12, 13, 232, 3, 12, 13, 232, 2, 12, 13, 232, 1, 12, 13, 232, 0,
+ 12, 13, 231, 255, 12, 13, 231, 254, 12, 13, 231, 253, 12, 13, 231, 252,
+ 12, 13, 231, 251, 12, 13, 231, 250, 12, 13, 231, 249, 12, 13, 231, 248,
+ 12, 13, 231, 247, 12, 13, 231, 246, 12, 13, 231, 245, 12, 13, 231, 244,
+ 12, 13, 231, 243, 12, 13, 231, 242, 12, 13, 231, 241, 12, 13, 230, 23,
+ 12, 13, 230, 22, 12, 13, 230, 21, 12, 13, 230, 20, 12, 13, 230, 19, 12,
+ 13, 230, 18, 12, 13, 230, 17, 12, 13, 230, 16, 12, 13, 230, 15, 12, 13,
+ 230, 14, 12, 13, 230, 13, 12, 13, 230, 12, 12, 13, 230, 11, 12, 13, 230,
+ 10, 12, 13, 230, 9, 12, 13, 230, 8, 12, 13, 230, 7, 12, 13, 230, 6, 12,
+ 13, 230, 5, 12, 13, 230, 4, 12, 13, 230, 3, 12, 13, 230, 2, 12, 13, 230,
+ 1, 12, 13, 230, 0, 12, 13, 229, 255, 12, 13, 229, 254, 12, 13, 229, 253,
+ 12, 13, 229, 252, 12, 13, 229, 251, 12, 13, 229, 250, 12, 13, 229, 249,
+ 12, 13, 229, 248, 12, 13, 229, 247, 12, 13, 229, 246, 12, 13, 229, 245,
+ 12, 13, 229, 244, 12, 13, 229, 243, 12, 13, 229, 242, 12, 13, 229, 241,
+ 12, 13, 229, 240, 12, 13, 229, 239, 12, 13, 229, 238, 12, 13, 229, 237,
+ 12, 13, 229, 236, 12, 13, 229, 235, 12, 13, 229, 234, 12, 13, 229, 233,
+ 12, 13, 229, 232, 12, 13, 229, 231, 12, 13, 228, 135, 12, 13, 228, 134,
+ 12, 13, 228, 133, 12, 13, 228, 132, 12, 13, 228, 131, 12, 13, 228, 130,
+ 12, 13, 228, 129, 12, 13, 228, 128, 12, 13, 228, 127, 12, 13, 228, 126,
+ 12, 13, 228, 125, 12, 13, 228, 124, 12, 13, 228, 123, 12, 13, 228, 122,
+ 12, 13, 228, 121, 12, 13, 228, 120, 12, 13, 228, 119, 12, 13, 228, 118,
+ 12, 13, 228, 117, 12, 13, 228, 116, 12, 13, 228, 115, 12, 13, 228, 114,
+ 12, 13, 227, 237, 12, 13, 227, 236, 12, 13, 227, 235, 12, 13, 227, 234,
+ 12, 13, 227, 233, 12, 13, 227, 232, 12, 13, 227, 231, 12, 13, 227, 230,
+ 12, 13, 227, 229, 12, 13, 227, 228, 12, 13, 227, 227, 12, 13, 227, 226,
+ 12, 13, 227, 225, 12, 13, 227, 224, 12, 13, 227, 223, 12, 13, 227, 222,
+ 12, 13, 227, 221, 12, 13, 227, 220, 12, 13, 227, 219, 12, 13, 227, 218,
+ 12, 13, 227, 217, 12, 13, 227, 216, 12, 13, 227, 215, 12, 13, 227, 214,
+ 12, 13, 227, 213, 12, 13, 227, 212, 12, 13, 227, 77, 12, 13, 227, 76, 12,
+ 13, 227, 75, 12, 13, 227, 74, 12, 13, 227, 73, 12, 13, 227, 72, 12, 13,
+ 227, 71, 12, 13, 227, 70, 12, 13, 227, 69, 12, 13, 227, 68, 12, 13, 227,
+ 67, 12, 13, 227, 66, 12, 13, 227, 65, 12, 13, 227, 64, 12, 13, 227, 63,
+ 12, 13, 227, 62, 12, 13, 227, 61, 12, 13, 227, 60, 12, 13, 227, 59, 12,
+ 13, 227, 58, 12, 13, 227, 57, 12, 13, 227, 56, 12, 13, 227, 55, 12, 13,
+ 227, 54, 12, 13, 227, 53, 12, 13, 227, 52, 12, 13, 227, 51, 12, 13, 227,
+ 50, 12, 13, 227, 49, 12, 13, 227, 48, 12, 13, 227, 47, 12, 13, 227, 46,
+ 12, 13, 227, 45, 12, 13, 227, 44, 12, 13, 227, 43, 12, 13, 227, 42, 12,
+ 13, 227, 41, 12, 13, 227, 40, 12, 13, 227, 39, 12, 13, 227, 38, 12, 13,
+ 227, 37, 12, 13, 227, 36, 12, 13, 227, 35, 12, 13, 227, 34, 12, 13, 227,
+ 33, 12, 13, 227, 32, 12, 13, 227, 31, 12, 13, 227, 30, 12, 13, 227, 29,
+ 12, 13, 227, 28, 12, 13, 227, 27, 12, 13, 227, 26, 12, 13, 227, 25, 12,
+ 13, 227, 24, 12, 13, 227, 23, 12, 13, 227, 22, 12, 13, 227, 21, 12, 13,
+ 227, 20, 12, 13, 227, 19, 12, 13, 227, 18, 12, 13, 227, 17, 12, 13, 227,
+ 16, 12, 13, 227, 15, 12, 13, 227, 14, 12, 13, 227, 13, 12, 13, 227, 12,
+ 12, 13, 227, 11, 12, 13, 227, 10, 12, 13, 227, 9, 12, 13, 227, 8, 12, 13,
+ 227, 7, 12, 13, 227, 6, 12, 13, 227, 5, 12, 13, 227, 4, 12, 13, 227, 3,
+ 12, 13, 226, 105, 12, 13, 226, 104, 12, 13, 226, 103, 12, 13, 226, 102,
+ 12, 13, 226, 101, 12, 13, 226, 100, 12, 13, 226, 99, 12, 13, 226, 98, 12,
+ 13, 226, 97, 12, 13, 226, 96, 12, 13, 226, 95, 12, 13, 226, 94, 12, 13,
+ 226, 93, 12, 13, 224, 96, 12, 13, 224, 95, 12, 13, 224, 94, 12, 13, 224,
+ 93, 12, 13, 224, 92, 12, 13, 224, 91, 12, 13, 224, 90, 12, 13, 223, 223,
+ 12, 13, 223, 222, 12, 13, 223, 221, 12, 13, 223, 220, 12, 13, 223, 219,
+ 12, 13, 223, 218, 12, 13, 223, 217, 12, 13, 223, 216, 12, 13, 223, 215,
+ 12, 13, 223, 214, 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211,
+ 12, 13, 223, 210, 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207,
+ 12, 13, 223, 206, 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203,
+ 12, 13, 223, 202, 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199,
+ 12, 13, 223, 198, 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195,
+ 12, 13, 223, 194, 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 223, 191,
+ 12, 13, 223, 190, 12, 13, 222, 89, 12, 13, 222, 88, 12, 13, 222, 87, 12,
+ 13, 222, 86, 12, 13, 222, 85, 12, 13, 222, 84, 12, 13, 222, 83, 12, 13,
+ 222, 82, 12, 13, 222, 81, 12, 13, 222, 80, 12, 13, 222, 79, 12, 13, 222,
+ 78, 12, 13, 222, 77, 12, 13, 222, 76, 12, 13, 222, 75, 12, 13, 222, 74,
+ 12, 13, 222, 73, 12, 13, 222, 72, 12, 13, 222, 71, 12, 13, 222, 70, 12,
+ 13, 222, 69, 12, 13, 222, 68, 12, 13, 222, 67, 12, 13, 222, 66, 12, 13,
+ 222, 65, 12, 13, 222, 64, 12, 13, 222, 63, 12, 13, 222, 62, 12, 13, 222,
+ 61, 12, 13, 222, 60, 12, 13, 222, 59, 12, 13, 222, 58, 12, 13, 222, 57,
+ 12, 13, 222, 56, 12, 13, 222, 55, 12, 13, 222, 54, 12, 13, 222, 53, 12,
+ 13, 222, 52, 12, 13, 222, 51, 12, 13, 222, 50, 12, 13, 222, 49, 12, 13,
+ 222, 48, 12, 13, 222, 47, 12, 13, 222, 46, 12, 13, 222, 45, 12, 13, 222,
+ 44, 12, 13, 222, 43, 12, 13, 222, 42, 12, 13, 222, 41, 12, 13, 222, 40,
+ 12, 13, 222, 39, 12, 13, 222, 38, 12, 13, 222, 37, 12, 13, 222, 36, 12,
+ 13, 217, 151, 12, 13, 217, 150, 12, 13, 217, 149, 12, 13, 217, 148, 12,
+ 13, 217, 147, 12, 13, 217, 146, 12, 13, 217, 145, 12, 13, 217, 144, 12,
+ 13, 217, 143, 12, 13, 217, 142, 12, 13, 217, 141, 12, 13, 217, 140, 12,
+ 13, 217, 139, 12, 13, 217, 138, 12, 13, 217, 137, 12, 13, 217, 136, 12,
+ 13, 217, 135, 12, 13, 217, 134, 12, 13, 217, 133, 12, 13, 217, 132, 12,
+ 13, 217, 131, 12, 13, 217, 130, 12, 13, 217, 129, 12, 13, 217, 128, 12,
+ 13, 217, 127, 12, 13, 217, 126, 12, 13, 217, 125, 12, 13, 217, 124, 12,
+ 13, 217, 123, 12, 13, 217, 122, 12, 13, 217, 121, 12, 13, 217, 120, 12,
+ 13, 217, 119, 12, 13, 217, 118, 12, 13, 217, 117, 12, 13, 217, 116, 12,
+ 13, 217, 115, 12, 13, 217, 114, 12, 13, 217, 113, 12, 13, 217, 112, 12,
+ 13, 217, 111, 12, 13, 217, 110, 12, 13, 217, 109, 12, 13, 217, 108, 12,
13, 215, 22, 12, 13, 215, 21, 12, 13, 215, 20, 12, 13, 215, 19, 12, 13,
215, 18, 12, 13, 215, 17, 12, 13, 215, 16, 12, 13, 215, 15, 12, 13, 215,
14, 12, 13, 215, 13, 12, 13, 215, 12, 12, 13, 215, 11, 12, 13, 215, 10,
@@ -12174,1649 +12175,1650 @@ static unsigned char phrasebook[] = {
210, 131, 12, 13, 210, 130, 12, 13, 210, 129, 12, 13, 210, 128, 12, 13,
210, 127, 12, 13, 210, 126, 12, 13, 210, 125, 12, 13, 210, 124, 12, 13,
210, 123, 12, 13, 210, 122, 12, 13, 210, 121, 12, 13, 210, 120, 12, 13,
- 210, 119, 12, 13, 210, 118, 12, 13, 255, 72, 12, 13, 255, 71, 12, 13,
- 255, 70, 12, 13, 255, 69, 12, 13, 255, 68, 12, 13, 255, 67, 12, 13, 255,
- 66, 12, 13, 255, 65, 12, 13, 255, 64, 12, 13, 255, 63, 12, 13, 255, 62,
- 12, 13, 255, 61, 12, 13, 255, 60, 12, 13, 255, 59, 12, 13, 255, 58, 12,
- 13, 255, 57, 12, 13, 255, 56, 12, 13, 255, 55, 12, 13, 255, 54, 12, 13,
- 255, 53, 12, 13, 255, 52, 12, 13, 255, 51, 12, 13, 255, 50, 12, 13, 255,
- 49, 12, 13, 255, 48, 12, 13, 255, 47, 12, 13, 255, 46, 12, 13, 255, 45,
- 12, 13, 255, 44, 12, 13, 255, 43, 12, 13, 255, 42, 12, 13, 255, 41, 12,
- 13, 255, 40, 12, 13, 255, 39, 20, 1, 167, 229, 12, 231, 16, 20, 1, 167,
- 243, 70, 244, 36, 20, 1, 167, 224, 251, 231, 17, 225, 57, 20, 1, 167,
- 224, 251, 231, 17, 225, 58, 20, 1, 167, 229, 226, 231, 16, 20, 1, 167,
- 219, 221, 20, 1, 167, 216, 66, 231, 16, 20, 1, 167, 227, 118, 231, 16,
- 20, 1, 167, 220, 19, 226, 90, 228, 169, 20, 1, 167, 224, 251, 226, 90,
- 228, 170, 225, 57, 20, 1, 167, 224, 251, 226, 90, 228, 170, 225, 58, 20,
- 1, 167, 231, 218, 20, 1, 167, 215, 119, 231, 219, 20, 1, 167, 229, 71,
- 20, 1, 167, 231, 215, 20, 1, 167, 231, 176, 20, 1, 167, 230, 48, 20, 1,
- 167, 220, 124, 20, 1, 167, 227, 241, 20, 1, 167, 234, 149, 20, 1, 167,
- 228, 138, 20, 1, 167, 218, 4, 20, 1, 167, 229, 11, 20, 1, 167, 233, 87,
- 20, 1, 167, 233, 12, 233, 189, 20, 1, 167, 227, 248, 231, 24, 20, 1, 167,
- 231, 222, 20, 1, 167, 225, 246, 20, 1, 167, 242, 231, 20, 1, 167, 226,
- 50, 20, 1, 167, 230, 151, 229, 45, 20, 1, 167, 227, 99, 231, 27, 20, 1,
- 167, 104, 210, 188, 229, 220, 20, 1, 167, 242, 232, 20, 1, 167, 227, 248,
- 227, 249, 20, 1, 167, 219, 128, 20, 1, 167, 231, 9, 20, 1, 167, 231, 30,
- 20, 1, 167, 230, 130, 20, 1, 167, 234, 249, 20, 1, 167, 226, 90, 233, 47,
- 20, 1, 167, 229, 149, 233, 47, 20, 1, 167, 225, 158, 20, 1, 167, 231,
- 216, 20, 1, 167, 228, 207, 20, 1, 167, 224, 134, 20, 1, 167, 215, 116,
- 20, 1, 167, 232, 94, 20, 1, 167, 219, 41, 20, 1, 167, 216, 216, 20, 1,
- 167, 231, 213, 20, 1, 167, 234, 156, 20, 1, 167, 229, 145, 20, 1, 167,
- 233, 201, 20, 1, 167, 230, 131, 20, 1, 167, 219, 218, 20, 1, 167, 232,
- 138, 20, 1, 167, 244, 93, 20, 1, 167, 222, 199, 20, 1, 167, 233, 241, 20,
- 1, 167, 219, 37, 20, 1, 167, 231, 173, 225, 99, 20, 1, 167, 220, 12, 20,
- 1, 167, 227, 247, 20, 1, 167, 219, 253, 228, 2, 210, 196, 20, 1, 167,
- 227, 138, 230, 148, 20, 1, 167, 226, 85, 20, 1, 167, 228, 139, 20, 1,
- 167, 214, 170, 20, 1, 167, 229, 48, 20, 1, 167, 231, 212, 20, 1, 167,
- 228, 181, 20, 1, 167, 231, 119, 20, 1, 167, 227, 151, 20, 1, 167, 216,
- 220, 20, 1, 167, 219, 34, 20, 1, 167, 226, 86, 20, 1, 167, 228, 6, 20, 1,
- 167, 231, 220, 20, 1, 167, 227, 148, 20, 1, 167, 234, 216, 20, 1, 167,
- 228, 9, 20, 1, 167, 213, 250, 20, 1, 167, 232, 98, 20, 1, 167, 229, 98,
- 20, 1, 167, 229, 196, 20, 1, 167, 231, 118, 20, 1, 225, 138, 228, 4, 20,
- 1, 225, 138, 215, 119, 231, 217, 20, 1, 225, 138, 219, 185, 20, 1, 225,
- 138, 220, 128, 215, 118, 20, 1, 225, 138, 232, 140, 227, 244, 20, 1, 225,
- 138, 231, 125, 231, 221, 20, 1, 225, 138, 234, 87, 20, 1, 225, 138, 211,
- 15, 20, 1, 225, 138, 231, 120, 20, 1, 225, 138, 234, 237, 20, 1, 225,
- 138, 225, 208, 20, 1, 225, 138, 211, 89, 233, 47, 20, 1, 225, 138, 233,
- 103, 228, 2, 227, 160, 20, 1, 225, 138, 227, 242, 220, 38, 20, 1, 225,
- 138, 229, 116, 228, 184, 20, 1, 225, 138, 242, 229, 20, 1, 225, 138, 225,
- 49, 20, 1, 225, 138, 215, 119, 228, 0, 20, 1, 225, 138, 220, 43, 228,
- 179, 20, 1, 225, 138, 220, 39, 20, 1, 225, 138, 231, 17, 216, 219, 20, 1,
- 225, 138, 231, 107, 231, 121, 20, 1, 225, 138, 227, 149, 227, 244, 20, 1,
- 225, 138, 234, 145, 20, 1, 225, 138, 242, 230, 20, 1, 225, 138, 234, 141,
- 20, 1, 225, 138, 233, 129, 20, 1, 225, 138, 225, 249, 20, 1, 225, 138,
- 213, 182, 20, 1, 225, 138, 229, 13, 230, 46, 20, 1, 225, 138, 229, 47,
- 231, 103, 20, 1, 225, 138, 211, 193, 20, 1, 225, 138, 222, 11, 20, 1,
- 225, 138, 217, 97, 20, 1, 225, 138, 231, 29, 20, 1, 225, 138, 229, 32,
- 20, 1, 225, 138, 229, 33, 233, 84, 20, 1, 225, 138, 231, 19, 20, 1, 225,
- 138, 218, 52, 20, 1, 225, 138, 231, 111, 20, 1, 225, 138, 230, 133, 20,
- 1, 225, 138, 227, 163, 20, 1, 225, 138, 224, 138, 20, 1, 225, 138, 231,
- 28, 229, 49, 20, 1, 225, 138, 244, 126, 20, 1, 225, 138, 231, 98, 20, 1,
- 225, 138, 244, 147, 20, 1, 225, 138, 234, 153, 20, 1, 225, 138, 231, 239,
- 228, 173, 20, 1, 225, 138, 231, 239, 228, 149, 20, 1, 225, 138, 233, 11,
- 20, 1, 225, 138, 229, 55, 20, 1, 225, 138, 228, 11, 20, 1, 225, 138, 184,
- 20, 1, 225, 138, 234, 74, 20, 1, 225, 138, 229, 1, 20, 1, 137, 229, 12,
- 231, 219, 20, 1, 137, 227, 117, 20, 1, 137, 210, 196, 20, 1, 137, 212,
- 53, 20, 1, 137, 229, 48, 20, 1, 137, 229, 137, 20, 1, 137, 229, 19, 20,
- 1, 137, 242, 239, 20, 1, 137, 231, 115, 20, 1, 137, 243, 77, 20, 1, 137,
- 227, 140, 230, 170, 231, 31, 20, 1, 137, 227, 240, 231, 106, 20, 1, 137,
- 231, 112, 20, 1, 137, 225, 55, 20, 1, 137, 229, 122, 20, 1, 137, 231,
- 123, 251, 29, 20, 1, 137, 234, 143, 20, 1, 137, 242, 240, 20, 1, 137,
- 234, 150, 20, 1, 137, 210, 213, 230, 76, 20, 1, 137, 227, 111, 20, 1,
- 137, 231, 100, 20, 1, 137, 228, 10, 20, 1, 137, 231, 106, 20, 1, 137,
- 211, 16, 20, 1, 137, 233, 249, 20, 1, 137, 235, 10, 20, 1, 137, 220, 123,
- 20, 1, 137, 229, 131, 20, 1, 137, 217, 95, 20, 1, 137, 228, 153, 20, 1,
- 137, 216, 66, 210, 198, 20, 1, 137, 218, 79, 20, 1, 137, 229, 39, 227,
- 160, 20, 1, 137, 213, 181, 20, 1, 137, 229, 199, 20, 1, 137, 231, 239,
- 234, 152, 20, 1, 137, 227, 249, 20, 1, 137, 229, 34, 20, 1, 137, 233, 88,
- 20, 1, 137, 231, 108, 20, 1, 137, 231, 8, 20, 1, 137, 227, 243, 20, 1,
- 137, 216, 215, 20, 1, 137, 229, 36, 20, 1, 137, 243, 233, 20, 1, 137,
- 229, 136, 20, 1, 137, 228, 12, 20, 1, 137, 228, 8, 20, 1, 137, 251, 107,
- 20, 1, 137, 213, 183, 20, 1, 137, 231, 113, 20, 1, 137, 222, 140, 20, 1,
- 137, 228, 183, 20, 1, 137, 233, 102, 20, 1, 137, 216, 64, 20, 1, 137,
- 227, 250, 229, 1, 20, 1, 137, 228, 175, 20, 1, 137, 234, 156, 20, 1, 137,
- 229, 40, 20, 1, 137, 231, 212, 20, 1, 137, 231, 101, 20, 1, 137, 232, 98,
- 20, 1, 137, 233, 189, 20, 1, 137, 228, 181, 20, 1, 137, 229, 1, 20, 1,
- 137, 211, 184, 20, 1, 137, 229, 37, 20, 1, 137, 227, 253, 20, 1, 137,
- 227, 245, 20, 1, 137, 233, 203, 228, 139, 20, 1, 137, 227, 251, 20, 1,
- 137, 229, 144, 20, 1, 137, 231, 239, 228, 0, 20, 1, 137, 211, 103, 20, 1,
- 137, 229, 143, 20, 1, 137, 219, 220, 20, 1, 137, 220, 126, 20, 1, 137,
- 231, 109, 20, 1, 137, 231, 219, 20, 1, 137, 231, 119, 20, 1, 137, 234,
- 144, 20, 1, 137, 231, 110, 20, 1, 137, 234, 148, 20, 1, 137, 231, 123,
- 225, 103, 20, 1, 137, 210, 179, 20, 1, 137, 228, 171, 20, 1, 137, 230,
- 220, 20, 1, 137, 230, 100, 20, 1, 137, 220, 15, 20, 1, 137, 234, 166,
- 233, 70, 20, 1, 137, 234, 166, 244, 160, 20, 1, 137, 229, 69, 20, 1, 137,
- 229, 196, 20, 1, 137, 232, 200, 20, 1, 137, 225, 65, 20, 1, 137, 225,
- 199, 20, 1, 137, 216, 230, 20, 1, 107, 231, 99, 20, 1, 107, 212, 51, 20,
- 1, 107, 228, 169, 20, 1, 107, 231, 16, 20, 1, 107, 228, 167, 20, 1, 107,
- 232, 235, 20, 1, 107, 228, 172, 20, 1, 107, 228, 7, 20, 1, 107, 229, 54,
- 20, 1, 107, 227, 160, 20, 1, 107, 211, 194, 20, 1, 107, 229, 9, 20, 1,
- 107, 220, 61, 20, 1, 107, 229, 20, 20, 1, 107, 234, 151, 20, 1, 107, 216,
- 217, 20, 1, 107, 220, 41, 20, 1, 107, 228, 180, 20, 1, 107, 218, 52, 20,
- 1, 107, 234, 156, 20, 1, 107, 211, 91, 20, 1, 107, 233, 204, 20, 1, 107,
- 221, 234, 20, 1, 107, 231, 21, 20, 1, 107, 229, 135, 20, 1, 107, 231,
- 188, 20, 1, 107, 231, 27, 20, 1, 107, 220, 125, 20, 1, 107, 211, 39, 20,
- 1, 107, 228, 174, 20, 1, 107, 234, 147, 231, 102, 20, 1, 107, 229, 16,
- 20, 1, 107, 215, 118, 20, 1, 107, 242, 248, 20, 1, 107, 229, 6, 20, 1,
- 107, 244, 127, 20, 1, 107, 229, 139, 20, 1, 107, 231, 0, 20, 1, 107, 233,
- 5, 20, 1, 107, 229, 121, 20, 1, 107, 230, 147, 20, 1, 107, 231, 4, 20, 1,
- 107, 224, 118, 20, 1, 107, 231, 2, 20, 1, 107, 231, 18, 20, 1, 107, 232,
- 84, 20, 1, 107, 227, 255, 20, 1, 107, 231, 122, 20, 1, 107, 233, 180, 20,
- 1, 107, 227, 151, 20, 1, 107, 216, 220, 20, 1, 107, 219, 34, 20, 1, 107,
- 210, 179, 20, 1, 107, 234, 148, 20, 1, 107, 223, 170, 20, 1, 107, 217,
- 10, 20, 1, 107, 229, 17, 20, 1, 107, 231, 23, 20, 1, 107, 227, 254, 20,
- 1, 107, 234, 146, 20, 1, 107, 225, 59, 20, 1, 107, 225, 152, 20, 1, 107,
- 227, 127, 20, 1, 107, 233, 11, 20, 1, 107, 229, 55, 20, 1, 107, 231, 20,
- 20, 1, 107, 229, 29, 20, 1, 107, 210, 193, 20, 1, 107, 226, 21, 20, 1,
- 107, 210, 192, 20, 1, 107, 229, 144, 20, 1, 107, 227, 244, 20, 1, 107,
- 218, 81, 20, 1, 107, 233, 208, 20, 1, 107, 229, 44, 20, 1, 107, 229, 14,
- 20, 1, 107, 215, 102, 20, 1, 107, 231, 31, 20, 1, 107, 233, 198, 20, 1,
- 107, 227, 252, 20, 1, 107, 216, 218, 20, 1, 107, 231, 214, 20, 1, 107,
- 229, 53, 20, 1, 107, 233, 4, 20, 1, 107, 229, 35, 20, 1, 107, 228, 1, 20,
- 1, 107, 228, 153, 20, 1, 107, 242, 233, 20, 1, 107, 233, 217, 20, 1, 107,
- 223, 84, 226, 209, 20, 1, 107, 217, 86, 20, 1, 107, 216, 10, 20, 1, 107,
- 227, 148, 20, 1, 107, 222, 239, 20, 1, 107, 233, 49, 20, 1, 107, 231, 79,
- 20, 1, 107, 193, 20, 1, 107, 218, 4, 20, 1, 107, 230, 102, 20, 1, 107,
- 220, 27, 20, 1, 107, 220, 37, 20, 1, 107, 233, 155, 20, 1, 107, 227, 237,
- 20, 1, 107, 219, 225, 20, 1, 107, 227, 246, 20, 1, 107, 225, 211, 20, 1,
- 107, 228, 233, 20, 1, 107, 219, 252, 20, 1, 107, 224, 133, 20, 1, 107,
- 230, 46, 20, 1, 107, 232, 119, 20, 1, 107, 223, 84, 230, 96, 20, 1, 107,
- 216, 117, 20, 1, 107, 227, 238, 20, 1, 107, 231, 123, 198, 20, 1, 107,
- 221, 232, 20, 1, 107, 244, 195, 20, 1, 82, 229, 143, 20, 1, 82, 216, 16,
- 20, 1, 82, 231, 112, 20, 1, 82, 233, 88, 20, 1, 82, 213, 128, 20, 1, 82,
- 232, 125, 20, 1, 82, 226, 89, 20, 1, 82, 219, 45, 20, 1, 82, 223, 145,
- 20, 1, 82, 228, 3, 20, 1, 82, 229, 114, 20, 1, 82, 224, 147, 20, 1, 82,
- 217, 62, 20, 1, 82, 229, 22, 20, 1, 82, 233, 245, 20, 1, 82, 211, 187,
- 20, 1, 82, 221, 170, 20, 1, 82, 229, 45, 20, 1, 82, 226, 86, 20, 1, 82,
- 216, 17, 20, 1, 82, 233, 202, 20, 1, 82, 232, 139, 20, 1, 82, 228, 6, 20,
- 1, 82, 228, 254, 20, 1, 82, 231, 220, 20, 1, 82, 229, 15, 20, 1, 82, 228,
- 253, 20, 1, 82, 228, 5, 20, 1, 82, 222, 237, 20, 1, 82, 228, 171, 20, 1,
- 82, 225, 210, 20, 1, 82, 222, 31, 20, 1, 82, 229, 30, 20, 1, 82, 231, 10,
- 20, 1, 82, 242, 227, 20, 1, 82, 229, 18, 20, 1, 82, 228, 182, 20, 1, 82,
- 231, 172, 20, 1, 82, 232, 121, 20, 1, 82, 229, 50, 20, 1, 82, 229, 127,
- 20, 1, 82, 217, 85, 227, 244, 20, 1, 82, 220, 127, 20, 1, 82, 224, 143,
- 20, 1, 82, 229, 147, 219, 51, 20, 1, 82, 229, 38, 227, 160, 20, 1, 82,
- 211, 4, 20, 1, 82, 242, 228, 20, 1, 82, 215, 117, 20, 1, 82, 211, 19, 20,
- 1, 82, 225, 16, 20, 1, 82, 215, 107, 20, 1, 82, 234, 154, 20, 1, 82, 218,
- 80, 20, 1, 82, 216, 219, 20, 1, 82, 213, 184, 20, 1, 82, 212, 6, 20, 1,
- 82, 233, 132, 20, 1, 82, 224, 150, 20, 1, 82, 217, 96, 20, 1, 82, 242,
- 247, 20, 1, 82, 229, 59, 20, 1, 82, 220, 40, 20, 1, 82, 231, 5, 20, 1,
- 82, 231, 116, 20, 1, 82, 227, 115, 20, 1, 82, 228, 136, 20, 1, 82, 243,
- 73, 20, 1, 82, 215, 108, 20, 1, 82, 233, 211, 20, 1, 82, 211, 67, 20, 1,
- 82, 227, 149, 250, 16, 20, 1, 82, 210, 250, 20, 1, 82, 231, 22, 20, 1,
- 82, 229, 132, 20, 1, 82, 225, 100, 20, 1, 82, 210, 197, 20, 1, 82, 233,
- 6, 20, 1, 82, 243, 233, 20, 1, 82, 243, 72, 20, 1, 82, 229, 8, 20, 1, 82,
- 234, 156, 20, 1, 82, 231, 223, 20, 1, 82, 229, 21, 20, 1, 82, 242, 234,
- 20, 1, 82, 244, 196, 20, 1, 82, 227, 239, 20, 1, 82, 225, 153, 20, 1, 82,
- 211, 17, 20, 1, 82, 229, 46, 20, 1, 82, 227, 149, 252, 23, 20, 1, 82,
- 227, 95, 20, 1, 82, 224, 247, 20, 1, 82, 230, 220, 20, 1, 82, 243, 231,
- 20, 1, 82, 229, 220, 20, 1, 82, 230, 100, 20, 1, 82, 242, 233, 20, 1, 82,
- 243, 235, 73, 20, 1, 82, 230, 47, 20, 1, 82, 224, 146, 20, 1, 82, 229,
- 10, 20, 1, 82, 233, 189, 20, 1, 82, 225, 97, 20, 1, 82, 227, 247, 20, 1,
- 82, 211, 18, 20, 1, 82, 229, 31, 20, 1, 82, 226, 90, 225, 187, 20, 1, 82,
- 243, 235, 251, 15, 20, 1, 82, 244, 37, 20, 1, 82, 228, 176, 20, 1, 82,
- 61, 20, 1, 82, 216, 10, 20, 1, 82, 76, 20, 1, 82, 73, 20, 1, 82, 233, 86,
- 20, 1, 82, 226, 90, 225, 23, 20, 1, 82, 217, 101, 20, 1, 82, 217, 51, 20,
- 1, 82, 229, 147, 230, 34, 240, 234, 20, 1, 82, 220, 15, 20, 1, 82, 211,
- 14, 20, 1, 82, 228, 247, 20, 1, 82, 210, 202, 20, 1, 82, 210, 227, 217,
- 240, 20, 1, 82, 210, 227, 249, 147, 20, 1, 82, 210, 187, 20, 1, 82, 210,
- 195, 20, 1, 82, 234, 142, 20, 1, 82, 225, 151, 20, 1, 82, 228, 177, 245,
- 102, 20, 1, 82, 224, 144, 20, 1, 82, 211, 192, 20, 1, 82, 244, 147, 20,
- 1, 82, 213, 250, 20, 1, 82, 232, 98, 20, 1, 82, 230, 230, 20, 1, 82, 223,
- 51, 20, 1, 82, 223, 171, 20, 1, 82, 228, 246, 20, 1, 82, 229, 77, 20, 1,
- 82, 220, 7, 20, 1, 82, 219, 252, 20, 1, 82, 243, 235, 223, 86, 20, 1, 82,
- 197, 20, 1, 82, 225, 108, 20, 1, 82, 232, 119, 20, 1, 82, 234, 28, 20, 1,
- 82, 231, 58, 20, 1, 82, 184, 20, 1, 82, 231, 169, 20, 1, 82, 216, 221,
- 20, 1, 82, 234, 92, 20, 1, 82, 230, 150, 20, 1, 82, 216, 247, 20, 1, 82,
- 244, 169, 20, 1, 82, 242, 223, 20, 1, 225, 137, 176, 20, 1, 225, 137, 70,
- 20, 1, 225, 137, 233, 217, 20, 1, 225, 137, 245, 209, 20, 1, 225, 137,
- 223, 108, 20, 1, 225, 137, 217, 86, 20, 1, 225, 137, 227, 148, 20, 1,
- 225, 137, 233, 135, 20, 1, 225, 137, 222, 239, 20, 1, 225, 137, 223, 29,
- 20, 1, 225, 137, 231, 79, 20, 1, 225, 137, 217, 101, 20, 1, 225, 137,
- 229, 146, 20, 1, 225, 137, 228, 183, 20, 1, 225, 137, 193, 20, 1, 225,
- 137, 218, 4, 20, 1, 225, 137, 220, 27, 20, 1, 225, 137, 219, 191, 20, 1,
- 225, 137, 220, 123, 20, 1, 225, 137, 233, 155, 20, 1, 225, 137, 234, 156,
- 20, 1, 225, 137, 227, 209, 20, 1, 225, 137, 227, 237, 20, 1, 225, 137,
- 228, 154, 20, 1, 225, 137, 210, 226, 20, 1, 225, 137, 219, 225, 20, 1,
- 225, 137, 191, 20, 1, 225, 137, 228, 9, 20, 1, 225, 137, 225, 151, 20, 1,
- 225, 137, 227, 246, 20, 1, 225, 137, 211, 192, 20, 1, 225, 137, 225, 211,
- 20, 1, 225, 137, 222, 140, 20, 1, 225, 137, 228, 233, 20, 1, 225, 137,
- 223, 51, 20, 1, 225, 137, 234, 165, 20, 1, 225, 137, 229, 7, 20, 1, 225,
- 137, 229, 56, 20, 1, 225, 137, 220, 7, 20, 1, 225, 137, 224, 147, 20, 1,
- 225, 137, 244, 37, 20, 1, 225, 137, 212, 65, 20, 1, 225, 137, 232, 241,
- 20, 1, 225, 137, 232, 119, 20, 1, 225, 137, 234, 28, 20, 1, 225, 137,
- 231, 114, 20, 1, 225, 137, 223, 83, 20, 1, 225, 137, 184, 20, 1, 225,
- 137, 230, 161, 20, 1, 225, 137, 231, 122, 20, 1, 225, 137, 216, 230, 20,
- 1, 225, 137, 233, 251, 20, 1, 225, 137, 221, 251, 20, 1, 225, 137, 212,
- 115, 95, 1, 190, 95, 1, 252, 191, 95, 1, 8, 190, 95, 1, 225, 42, 95, 1,
- 184, 95, 1, 230, 233, 95, 1, 254, 23, 184, 95, 1, 244, 196, 95, 1, 214,
- 27, 95, 1, 213, 177, 95, 1, 217, 105, 95, 1, 248, 221, 95, 1, 8, 215,
- 156, 95, 1, 8, 217, 105, 95, 1, 215, 156, 95, 1, 248, 135, 95, 1, 197,
- 95, 1, 228, 237, 95, 1, 8, 228, 110, 95, 1, 254, 23, 197, 95, 1, 228,
- 110, 95, 1, 228, 96, 95, 1, 233, 135, 95, 1, 232, 61, 95, 1, 232, 254,
- 95, 1, 232, 243, 95, 1, 216, 56, 95, 1, 247, 153, 95, 1, 216, 48, 95, 1,
- 247, 152, 95, 1, 176, 95, 1, 243, 135, 95, 1, 8, 176, 95, 1, 224, 88, 95,
- 1, 224, 66, 95, 1, 229, 77, 95, 1, 229, 28, 95, 1, 254, 23, 229, 77, 95,
- 1, 162, 95, 1, 211, 165, 95, 1, 242, 249, 95, 1, 242, 226, 95, 1, 215,
- 165, 95, 1, 246, 26, 95, 1, 227, 165, 95, 1, 227, 150, 95, 1, 215, 175,
- 95, 1, 246, 33, 95, 1, 8, 215, 175, 95, 1, 8, 246, 33, 95, 1, 223, 106,
- 215, 175, 95, 1, 220, 102, 95, 1, 218, 223, 95, 1, 210, 82, 95, 1, 210,
- 14, 95, 1, 215, 183, 95, 1, 246, 38, 95, 1, 8, 215, 183, 95, 1, 206, 95,
- 1, 210, 116, 95, 1, 210, 15, 95, 1, 209, 243, 95, 1, 209, 223, 95, 1,
- 254, 23, 209, 243, 95, 1, 209, 215, 95, 1, 209, 222, 95, 1, 212, 65, 95,
- 1, 254, 209, 95, 1, 241, 189, 95, 1, 229, 192, 95, 5, 253, 222, 95, 5,
- 223, 106, 213, 133, 95, 5, 223, 106, 253, 222, 95, 25, 5, 61, 95, 25, 5,
- 255, 73, 95, 25, 5, 254, 205, 95, 25, 5, 254, 123, 95, 25, 5, 254, 115,
- 95, 25, 5, 76, 95, 25, 5, 226, 183, 95, 25, 5, 211, 227, 95, 25, 5, 212,
- 98, 95, 25, 5, 75, 95, 25, 5, 245, 150, 95, 25, 5, 245, 138, 95, 25, 5,
- 226, 232, 95, 25, 5, 73, 95, 25, 5, 240, 119, 95, 25, 5, 240, 118, 95,
- 25, 5, 240, 117, 95, 25, 5, 235, 189, 95, 25, 5, 236, 60, 95, 25, 5, 236,
- 33, 95, 25, 5, 235, 156, 95, 25, 5, 235, 231, 95, 25, 5, 70, 95, 25, 5,
+ 210, 119, 12, 13, 210, 118, 12, 13, 255, 73, 12, 13, 255, 72, 12, 13,
+ 255, 71, 12, 13, 255, 70, 12, 13, 255, 69, 12, 13, 255, 68, 12, 13, 255,
+ 67, 12, 13, 255, 66, 12, 13, 255, 65, 12, 13, 255, 64, 12, 13, 255, 63,
+ 12, 13, 255, 62, 12, 13, 255, 61, 12, 13, 255, 60, 12, 13, 255, 59, 12,
+ 13, 255, 58, 12, 13, 255, 57, 12, 13, 255, 56, 12, 13, 255, 55, 12, 13,
+ 255, 54, 12, 13, 255, 53, 12, 13, 255, 52, 12, 13, 255, 51, 12, 13, 255,
+ 50, 12, 13, 255, 49, 12, 13, 255, 48, 12, 13, 255, 47, 12, 13, 255, 46,
+ 12, 13, 255, 45, 12, 13, 255, 44, 12, 13, 255, 43, 12, 13, 255, 42, 12,
+ 13, 255, 41, 12, 13, 255, 40, 20, 1, 167, 229, 13, 231, 17, 20, 1, 167,
+ 243, 71, 244, 37, 20, 1, 167, 224, 252, 231, 18, 225, 58, 20, 1, 167,
+ 224, 252, 231, 18, 225, 59, 20, 1, 167, 229, 227, 231, 17, 20, 1, 167,
+ 219, 222, 20, 1, 167, 216, 67, 231, 17, 20, 1, 167, 227, 119, 231, 17,
+ 20, 1, 167, 220, 20, 226, 91, 228, 170, 20, 1, 167, 224, 252, 226, 91,
+ 228, 171, 225, 58, 20, 1, 167, 224, 252, 226, 91, 228, 171, 225, 59, 20,
+ 1, 167, 231, 219, 20, 1, 167, 215, 120, 231, 220, 20, 1, 167, 229, 72,
+ 20, 1, 167, 231, 216, 20, 1, 167, 231, 177, 20, 1, 167, 230, 49, 20, 1,
+ 167, 220, 125, 20, 1, 167, 227, 242, 20, 1, 167, 234, 150, 20, 1, 167,
+ 228, 139, 20, 1, 167, 218, 5, 20, 1, 167, 229, 12, 20, 1, 167, 233, 88,
+ 20, 1, 167, 233, 13, 233, 190, 20, 1, 167, 227, 249, 231, 25, 20, 1, 167,
+ 231, 223, 20, 1, 167, 225, 247, 20, 1, 167, 242, 232, 20, 1, 167, 226,
+ 51, 20, 1, 167, 230, 152, 229, 46, 20, 1, 167, 227, 100, 231, 28, 20, 1,
+ 167, 104, 210, 188, 229, 221, 20, 1, 167, 242, 233, 20, 1, 167, 227, 249,
+ 227, 250, 20, 1, 167, 219, 129, 20, 1, 167, 231, 10, 20, 1, 167, 231, 31,
+ 20, 1, 167, 230, 131, 20, 1, 167, 234, 250, 20, 1, 167, 226, 91, 233, 48,
+ 20, 1, 167, 229, 150, 233, 48, 20, 1, 167, 225, 159, 20, 1, 167, 231,
+ 217, 20, 1, 167, 228, 208, 20, 1, 167, 224, 135, 20, 1, 167, 215, 117,
+ 20, 1, 167, 232, 95, 20, 1, 167, 219, 42, 20, 1, 167, 216, 217, 20, 1,
+ 167, 231, 214, 20, 1, 167, 234, 157, 20, 1, 167, 229, 146, 20, 1, 167,
+ 233, 202, 20, 1, 167, 230, 132, 20, 1, 167, 219, 219, 20, 1, 167, 232,
+ 139, 20, 1, 167, 244, 94, 20, 1, 167, 222, 200, 20, 1, 167, 233, 242, 20,
+ 1, 167, 219, 38, 20, 1, 167, 231, 174, 225, 100, 20, 1, 167, 220, 13, 20,
+ 1, 167, 227, 248, 20, 1, 167, 219, 254, 228, 3, 210, 196, 20, 1, 167,
+ 227, 139, 230, 149, 20, 1, 167, 226, 86, 20, 1, 167, 228, 140, 20, 1,
+ 167, 214, 170, 20, 1, 167, 229, 49, 20, 1, 167, 231, 213, 20, 1, 167,
+ 228, 182, 20, 1, 167, 231, 120, 20, 1, 167, 227, 152, 20, 1, 167, 216,
+ 221, 20, 1, 167, 219, 35, 20, 1, 167, 226, 87, 20, 1, 167, 228, 7, 20, 1,
+ 167, 231, 221, 20, 1, 167, 227, 149, 20, 1, 167, 234, 217, 20, 1, 167,
+ 228, 10, 20, 1, 167, 213, 250, 20, 1, 167, 232, 99, 20, 1, 167, 229, 99,
+ 20, 1, 167, 229, 197, 20, 1, 167, 231, 119, 20, 1, 225, 139, 228, 5, 20,
+ 1, 225, 139, 215, 120, 231, 218, 20, 1, 225, 139, 219, 186, 20, 1, 225,
+ 139, 220, 129, 215, 119, 20, 1, 225, 139, 232, 141, 227, 245, 20, 1, 225,
+ 139, 231, 126, 231, 222, 20, 1, 225, 139, 234, 88, 20, 1, 225, 139, 211,
+ 15, 20, 1, 225, 139, 231, 121, 20, 1, 225, 139, 234, 238, 20, 1, 225,
+ 139, 225, 209, 20, 1, 225, 139, 211, 89, 233, 48, 20, 1, 225, 139, 233,
+ 104, 228, 3, 227, 161, 20, 1, 225, 139, 227, 243, 220, 39, 20, 1, 225,
+ 139, 229, 117, 228, 185, 20, 1, 225, 139, 242, 230, 20, 1, 225, 139, 225,
+ 50, 20, 1, 225, 139, 215, 120, 228, 1, 20, 1, 225, 139, 220, 44, 228,
+ 180, 20, 1, 225, 139, 220, 40, 20, 1, 225, 139, 231, 18, 216, 220, 20, 1,
+ 225, 139, 231, 108, 231, 122, 20, 1, 225, 139, 227, 150, 227, 245, 20, 1,
+ 225, 139, 234, 146, 20, 1, 225, 139, 242, 231, 20, 1, 225, 139, 234, 142,
+ 20, 1, 225, 139, 233, 130, 20, 1, 225, 139, 225, 250, 20, 1, 225, 139,
+ 213, 182, 20, 1, 225, 139, 229, 14, 230, 47, 20, 1, 225, 139, 229, 48,
+ 231, 104, 20, 1, 225, 139, 211, 193, 20, 1, 225, 139, 222, 12, 20, 1,
+ 225, 139, 217, 98, 20, 1, 225, 139, 231, 30, 20, 1, 225, 139, 229, 33,
+ 20, 1, 225, 139, 229, 34, 233, 85, 20, 1, 225, 139, 231, 20, 20, 1, 225,
+ 139, 218, 53, 20, 1, 225, 139, 231, 112, 20, 1, 225, 139, 230, 134, 20,
+ 1, 225, 139, 227, 164, 20, 1, 225, 139, 224, 139, 20, 1, 225, 139, 231,
+ 29, 229, 50, 20, 1, 225, 139, 244, 127, 20, 1, 225, 139, 231, 99, 20, 1,
+ 225, 139, 244, 148, 20, 1, 225, 139, 234, 154, 20, 1, 225, 139, 231, 240,
+ 228, 174, 20, 1, 225, 139, 231, 240, 228, 150, 20, 1, 225, 139, 233, 12,
+ 20, 1, 225, 139, 229, 56, 20, 1, 225, 139, 228, 12, 20, 1, 225, 139, 185,
+ 20, 1, 225, 139, 234, 75, 20, 1, 225, 139, 229, 2, 20, 1, 137, 229, 13,
+ 231, 220, 20, 1, 137, 227, 118, 20, 1, 137, 210, 196, 20, 1, 137, 212,
+ 53, 20, 1, 137, 229, 49, 20, 1, 137, 229, 138, 20, 1, 137, 229, 20, 20,
+ 1, 137, 242, 240, 20, 1, 137, 231, 116, 20, 1, 137, 243, 78, 20, 1, 137,
+ 227, 141, 230, 171, 231, 32, 20, 1, 137, 227, 241, 231, 107, 20, 1, 137,
+ 231, 113, 20, 1, 137, 225, 56, 20, 1, 137, 229, 123, 20, 1, 137, 231,
+ 124, 251, 30, 20, 1, 137, 234, 144, 20, 1, 137, 242, 241, 20, 1, 137,
+ 234, 151, 20, 1, 137, 210, 213, 230, 77, 20, 1, 137, 227, 112, 20, 1,
+ 137, 231, 101, 20, 1, 137, 228, 11, 20, 1, 137, 231, 107, 20, 1, 137,
+ 211, 16, 20, 1, 137, 233, 250, 20, 1, 137, 235, 11, 20, 1, 137, 220, 124,
+ 20, 1, 137, 229, 132, 20, 1, 137, 217, 96, 20, 1, 137, 228, 154, 20, 1,
+ 137, 216, 67, 210, 198, 20, 1, 137, 218, 80, 20, 1, 137, 229, 40, 227,
+ 161, 20, 1, 137, 213, 181, 20, 1, 137, 229, 200, 20, 1, 137, 231, 240,
+ 234, 153, 20, 1, 137, 227, 250, 20, 1, 137, 229, 35, 20, 1, 137, 233, 89,
+ 20, 1, 137, 231, 109, 20, 1, 137, 231, 9, 20, 1, 137, 227, 244, 20, 1,
+ 137, 216, 216, 20, 1, 137, 229, 37, 20, 1, 137, 243, 234, 20, 1, 137,
+ 229, 137, 20, 1, 137, 228, 13, 20, 1, 137, 228, 9, 20, 1, 137, 251, 108,
+ 20, 1, 137, 213, 183, 20, 1, 137, 231, 114, 20, 1, 137, 222, 141, 20, 1,
+ 137, 228, 184, 20, 1, 137, 233, 103, 20, 1, 137, 216, 65, 20, 1, 137,
+ 227, 251, 229, 2, 20, 1, 137, 228, 176, 20, 1, 137, 234, 157, 20, 1, 137,
+ 229, 41, 20, 1, 137, 231, 213, 20, 1, 137, 231, 102, 20, 1, 137, 232, 99,
+ 20, 1, 137, 233, 190, 20, 1, 137, 228, 182, 20, 1, 137, 229, 2, 20, 1,
+ 137, 211, 184, 20, 1, 137, 229, 38, 20, 1, 137, 227, 254, 20, 1, 137,
+ 227, 246, 20, 1, 137, 233, 204, 228, 140, 20, 1, 137, 227, 252, 20, 1,
+ 137, 229, 145, 20, 1, 137, 231, 240, 228, 1, 20, 1, 137, 211, 103, 20, 1,
+ 137, 229, 144, 20, 1, 137, 219, 221, 20, 1, 137, 220, 127, 20, 1, 137,
+ 231, 110, 20, 1, 137, 231, 220, 20, 1, 137, 231, 120, 20, 1, 137, 234,
+ 145, 20, 1, 137, 231, 111, 20, 1, 137, 234, 149, 20, 1, 137, 231, 124,
+ 225, 104, 20, 1, 137, 210, 179, 20, 1, 137, 228, 172, 20, 1, 137, 230,
+ 221, 20, 1, 137, 230, 101, 20, 1, 137, 220, 16, 20, 1, 137, 234, 167,
+ 233, 71, 20, 1, 137, 234, 167, 244, 161, 20, 1, 137, 229, 70, 20, 1, 137,
+ 229, 197, 20, 1, 137, 232, 201, 20, 1, 137, 225, 66, 20, 1, 137, 225,
+ 200, 20, 1, 137, 216, 231, 20, 1, 107, 231, 100, 20, 1, 107, 212, 51, 20,
+ 1, 107, 228, 170, 20, 1, 107, 231, 17, 20, 1, 107, 228, 168, 20, 1, 107,
+ 232, 236, 20, 1, 107, 228, 173, 20, 1, 107, 228, 8, 20, 1, 107, 229, 55,
+ 20, 1, 107, 227, 161, 20, 1, 107, 211, 194, 20, 1, 107, 229, 10, 20, 1,
+ 107, 220, 62, 20, 1, 107, 229, 21, 20, 1, 107, 234, 152, 20, 1, 107, 216,
+ 218, 20, 1, 107, 220, 42, 20, 1, 107, 228, 181, 20, 1, 107, 218, 53, 20,
+ 1, 107, 234, 157, 20, 1, 107, 211, 91, 20, 1, 107, 233, 205, 20, 1, 107,
+ 221, 235, 20, 1, 107, 231, 22, 20, 1, 107, 229, 136, 20, 1, 107, 231,
+ 189, 20, 1, 107, 231, 28, 20, 1, 107, 220, 126, 20, 1, 107, 211, 39, 20,
+ 1, 107, 228, 175, 20, 1, 107, 234, 148, 231, 103, 20, 1, 107, 229, 17,
+ 20, 1, 107, 215, 119, 20, 1, 107, 242, 249, 20, 1, 107, 229, 7, 20, 1,
+ 107, 244, 128, 20, 1, 107, 229, 140, 20, 1, 107, 231, 1, 20, 1, 107, 233,
+ 6, 20, 1, 107, 229, 122, 20, 1, 107, 230, 148, 20, 1, 107, 231, 5, 20, 1,
+ 107, 224, 119, 20, 1, 107, 231, 3, 20, 1, 107, 231, 19, 20, 1, 107, 232,
+ 85, 20, 1, 107, 228, 0, 20, 1, 107, 231, 123, 20, 1, 107, 233, 181, 20,
+ 1, 107, 227, 152, 20, 1, 107, 216, 221, 20, 1, 107, 219, 35, 20, 1, 107,
+ 210, 179, 20, 1, 107, 234, 149, 20, 1, 107, 223, 171, 20, 1, 107, 217,
+ 11, 20, 1, 107, 229, 18, 20, 1, 107, 231, 24, 20, 1, 107, 227, 255, 20,
+ 1, 107, 234, 147, 20, 1, 107, 225, 60, 20, 1, 107, 225, 153, 20, 1, 107,
+ 227, 128, 20, 1, 107, 233, 12, 20, 1, 107, 229, 56, 20, 1, 107, 231, 21,
+ 20, 1, 107, 229, 30, 20, 1, 107, 210, 193, 20, 1, 107, 226, 22, 20, 1,
+ 107, 210, 192, 20, 1, 107, 229, 145, 20, 1, 107, 227, 245, 20, 1, 107,
+ 218, 82, 20, 1, 107, 233, 209, 20, 1, 107, 229, 45, 20, 1, 107, 229, 15,
+ 20, 1, 107, 215, 103, 20, 1, 107, 231, 32, 20, 1, 107, 233, 199, 20, 1,
+ 107, 227, 253, 20, 1, 107, 216, 219, 20, 1, 107, 231, 215, 20, 1, 107,
+ 229, 54, 20, 1, 107, 233, 5, 20, 1, 107, 229, 36, 20, 1, 107, 228, 2, 20,
+ 1, 107, 228, 154, 20, 1, 107, 242, 234, 20, 1, 107, 233, 218, 20, 1, 107,
+ 223, 85, 226, 210, 20, 1, 107, 217, 87, 20, 1, 107, 216, 11, 20, 1, 107,
+ 227, 149, 20, 1, 107, 222, 240, 20, 1, 107, 233, 50, 20, 1, 107, 231, 80,
+ 20, 1, 107, 193, 20, 1, 107, 218, 5, 20, 1, 107, 230, 103, 20, 1, 107,
+ 220, 28, 20, 1, 107, 220, 38, 20, 1, 107, 233, 156, 20, 1, 107, 227, 238,
+ 20, 1, 107, 219, 226, 20, 1, 107, 227, 247, 20, 1, 107, 225, 212, 20, 1,
+ 107, 228, 234, 20, 1, 107, 219, 253, 20, 1, 107, 224, 134, 20, 1, 107,
+ 230, 47, 20, 1, 107, 232, 120, 20, 1, 107, 223, 85, 230, 97, 20, 1, 107,
+ 216, 118, 20, 1, 107, 227, 239, 20, 1, 107, 231, 124, 198, 20, 1, 107,
+ 221, 233, 20, 1, 107, 244, 196, 20, 1, 82, 229, 144, 20, 1, 82, 216, 17,
+ 20, 1, 82, 231, 113, 20, 1, 82, 233, 89, 20, 1, 82, 213, 128, 20, 1, 82,
+ 232, 126, 20, 1, 82, 226, 90, 20, 1, 82, 219, 46, 20, 1, 82, 223, 146,
+ 20, 1, 82, 228, 4, 20, 1, 82, 229, 115, 20, 1, 82, 224, 148, 20, 1, 82,
+ 217, 63, 20, 1, 82, 229, 23, 20, 1, 82, 233, 246, 20, 1, 82, 211, 187,
+ 20, 1, 82, 221, 171, 20, 1, 82, 229, 46, 20, 1, 82, 226, 87, 20, 1, 82,
+ 216, 18, 20, 1, 82, 233, 203, 20, 1, 82, 232, 140, 20, 1, 82, 228, 7, 20,
+ 1, 82, 228, 255, 20, 1, 82, 231, 221, 20, 1, 82, 229, 16, 20, 1, 82, 228,
+ 254, 20, 1, 82, 228, 6, 20, 1, 82, 222, 238, 20, 1, 82, 228, 172, 20, 1,
+ 82, 225, 211, 20, 1, 82, 222, 32, 20, 1, 82, 229, 31, 20, 1, 82, 231, 11,
+ 20, 1, 82, 242, 228, 20, 1, 82, 229, 19, 20, 1, 82, 228, 183, 20, 1, 82,
+ 231, 173, 20, 1, 82, 232, 122, 20, 1, 82, 229, 51, 20, 1, 82, 229, 128,
+ 20, 1, 82, 217, 86, 227, 245, 20, 1, 82, 220, 128, 20, 1, 82, 224, 144,
+ 20, 1, 82, 229, 148, 219, 52, 20, 1, 82, 229, 39, 227, 161, 20, 1, 82,
+ 211, 4, 20, 1, 82, 242, 229, 20, 1, 82, 215, 118, 20, 1, 82, 211, 19, 20,
+ 1, 82, 225, 17, 20, 1, 82, 215, 108, 20, 1, 82, 234, 155, 20, 1, 82, 218,
+ 81, 20, 1, 82, 216, 220, 20, 1, 82, 213, 184, 20, 1, 82, 212, 6, 20, 1,
+ 82, 233, 133, 20, 1, 82, 224, 151, 20, 1, 82, 217, 97, 20, 1, 82, 242,
+ 248, 20, 1, 82, 229, 60, 20, 1, 82, 220, 41, 20, 1, 82, 231, 6, 20, 1,
+ 82, 231, 117, 20, 1, 82, 227, 116, 20, 1, 82, 228, 137, 20, 1, 82, 243,
+ 74, 20, 1, 82, 215, 109, 20, 1, 82, 233, 212, 20, 1, 82, 211, 67, 20, 1,
+ 82, 227, 150, 250, 17, 20, 1, 82, 210, 250, 20, 1, 82, 231, 23, 20, 1,
+ 82, 229, 133, 20, 1, 82, 225, 101, 20, 1, 82, 210, 197, 20, 1, 82, 233,
+ 7, 20, 1, 82, 243, 234, 20, 1, 82, 243, 73, 20, 1, 82, 229, 9, 20, 1, 82,
+ 234, 157, 20, 1, 82, 231, 224, 20, 1, 82, 229, 22, 20, 1, 82, 242, 235,
+ 20, 1, 82, 244, 197, 20, 1, 82, 227, 240, 20, 1, 82, 225, 154, 20, 1, 82,
+ 211, 17, 20, 1, 82, 229, 47, 20, 1, 82, 227, 150, 252, 24, 20, 1, 82,
+ 227, 96, 20, 1, 82, 224, 248, 20, 1, 82, 230, 221, 20, 1, 82, 243, 232,
+ 20, 1, 82, 229, 221, 20, 1, 82, 230, 101, 20, 1, 82, 242, 234, 20, 1, 82,
+ 243, 236, 73, 20, 1, 82, 230, 48, 20, 1, 82, 224, 147, 20, 1, 82, 229,
+ 11, 20, 1, 82, 233, 190, 20, 1, 82, 225, 98, 20, 1, 82, 227, 248, 20, 1,
+ 82, 211, 18, 20, 1, 82, 229, 32, 20, 1, 82, 226, 91, 225, 188, 20, 1, 82,
+ 243, 236, 251, 16, 20, 1, 82, 244, 38, 20, 1, 82, 228, 177, 20, 1, 82,
+ 61, 20, 1, 82, 216, 11, 20, 1, 82, 76, 20, 1, 82, 73, 20, 1, 82, 233, 87,
+ 20, 1, 82, 226, 91, 225, 24, 20, 1, 82, 217, 102, 20, 1, 82, 217, 52, 20,
+ 1, 82, 229, 148, 230, 35, 240, 235, 20, 1, 82, 220, 16, 20, 1, 82, 211,
+ 14, 20, 1, 82, 228, 248, 20, 1, 82, 210, 202, 20, 1, 82, 210, 227, 217,
+ 241, 20, 1, 82, 210, 227, 249, 148, 20, 1, 82, 210, 187, 20, 1, 82, 210,
+ 195, 20, 1, 82, 234, 143, 20, 1, 82, 225, 152, 20, 1, 82, 228, 178, 245,
+ 103, 20, 1, 82, 224, 145, 20, 1, 82, 211, 192, 20, 1, 82, 244, 148, 20,
+ 1, 82, 213, 250, 20, 1, 82, 232, 99, 20, 1, 82, 230, 231, 20, 1, 82, 223,
+ 52, 20, 1, 82, 223, 172, 20, 1, 82, 228, 247, 20, 1, 82, 229, 78, 20, 1,
+ 82, 220, 8, 20, 1, 82, 219, 253, 20, 1, 82, 243, 236, 223, 87, 20, 1, 82,
+ 197, 20, 1, 82, 225, 109, 20, 1, 82, 232, 120, 20, 1, 82, 234, 29, 20, 1,
+ 82, 231, 59, 20, 1, 82, 185, 20, 1, 82, 231, 170, 20, 1, 82, 216, 222,
+ 20, 1, 82, 234, 93, 20, 1, 82, 230, 151, 20, 1, 82, 216, 248, 20, 1, 82,
+ 244, 170, 20, 1, 82, 242, 224, 20, 1, 225, 138, 176, 20, 1, 225, 138, 70,
+ 20, 1, 225, 138, 233, 218, 20, 1, 225, 138, 245, 210, 20, 1, 225, 138,
+ 223, 109, 20, 1, 225, 138, 217, 87, 20, 1, 225, 138, 227, 149, 20, 1,
+ 225, 138, 233, 136, 20, 1, 225, 138, 222, 240, 20, 1, 225, 138, 223, 30,
+ 20, 1, 225, 138, 231, 80, 20, 1, 225, 138, 217, 102, 20, 1, 225, 138,
+ 229, 147, 20, 1, 225, 138, 228, 184, 20, 1, 225, 138, 193, 20, 1, 225,
+ 138, 218, 5, 20, 1, 225, 138, 220, 28, 20, 1, 225, 138, 219, 192, 20, 1,
+ 225, 138, 220, 124, 20, 1, 225, 138, 233, 156, 20, 1, 225, 138, 234, 157,
+ 20, 1, 225, 138, 227, 210, 20, 1, 225, 138, 227, 238, 20, 1, 225, 138,
+ 228, 155, 20, 1, 225, 138, 210, 226, 20, 1, 225, 138, 219, 226, 20, 1,
+ 225, 138, 191, 20, 1, 225, 138, 228, 10, 20, 1, 225, 138, 225, 152, 20,
+ 1, 225, 138, 227, 247, 20, 1, 225, 138, 211, 192, 20, 1, 225, 138, 225,
+ 212, 20, 1, 225, 138, 222, 141, 20, 1, 225, 138, 228, 234, 20, 1, 225,
+ 138, 223, 52, 20, 1, 225, 138, 234, 166, 20, 1, 225, 138, 229, 8, 20, 1,
+ 225, 138, 229, 57, 20, 1, 225, 138, 220, 8, 20, 1, 225, 138, 224, 148,
+ 20, 1, 225, 138, 244, 38, 20, 1, 225, 138, 212, 65, 20, 1, 225, 138, 232,
+ 242, 20, 1, 225, 138, 232, 120, 20, 1, 225, 138, 234, 29, 20, 1, 225,
+ 138, 231, 115, 20, 1, 225, 138, 223, 84, 20, 1, 225, 138, 185, 20, 1,
+ 225, 138, 230, 162, 20, 1, 225, 138, 231, 123, 20, 1, 225, 138, 216, 231,
+ 20, 1, 225, 138, 233, 252, 20, 1, 225, 138, 221, 252, 20, 1, 225, 138,
+ 212, 115, 95, 1, 190, 95, 1, 252, 192, 95, 1, 8, 190, 95, 1, 225, 43, 95,
+ 1, 185, 95, 1, 230, 234, 95, 1, 254, 24, 185, 95, 1, 244, 197, 95, 1,
+ 214, 27, 95, 1, 213, 177, 95, 1, 217, 106, 95, 1, 248, 222, 95, 1, 8,
+ 215, 157, 95, 1, 8, 217, 106, 95, 1, 215, 157, 95, 1, 248, 136, 95, 1,
+ 197, 95, 1, 228, 238, 95, 1, 8, 228, 111, 95, 1, 254, 24, 197, 95, 1,
+ 228, 111, 95, 1, 228, 97, 95, 1, 233, 136, 95, 1, 232, 62, 95, 1, 232,
+ 255, 95, 1, 232, 244, 95, 1, 216, 57, 95, 1, 247, 154, 95, 1, 216, 49,
+ 95, 1, 247, 153, 95, 1, 176, 95, 1, 243, 136, 95, 1, 8, 176, 95, 1, 224,
+ 89, 95, 1, 224, 67, 95, 1, 229, 78, 95, 1, 229, 29, 95, 1, 254, 24, 229,
+ 78, 95, 1, 162, 95, 1, 211, 165, 95, 1, 242, 250, 95, 1, 242, 227, 95, 1,
+ 215, 166, 95, 1, 246, 27, 95, 1, 227, 166, 95, 1, 227, 151, 95, 1, 215,
+ 176, 95, 1, 246, 34, 95, 1, 8, 215, 176, 95, 1, 8, 246, 34, 95, 1, 223,
+ 107, 215, 176, 95, 1, 220, 103, 95, 1, 218, 224, 95, 1, 210, 82, 95, 1,
+ 210, 14, 95, 1, 215, 184, 95, 1, 246, 39, 95, 1, 8, 215, 184, 95, 1, 206,
+ 95, 1, 210, 116, 95, 1, 210, 15, 95, 1, 209, 243, 95, 1, 209, 223, 95, 1,
+ 254, 24, 209, 243, 95, 1, 209, 215, 95, 1, 209, 222, 95, 1, 212, 65, 95,
+ 1, 254, 210, 95, 1, 241, 190, 95, 1, 229, 193, 95, 5, 253, 223, 95, 5,
+ 223, 107, 213, 133, 95, 5, 223, 107, 253, 223, 95, 25, 5, 61, 95, 25, 5,
+ 255, 74, 95, 25, 5, 254, 206, 95, 25, 5, 254, 124, 95, 25, 5, 254, 116,
+ 95, 25, 5, 76, 95, 25, 5, 226, 184, 95, 25, 5, 211, 227, 95, 25, 5, 212,
+ 98, 95, 25, 5, 75, 95, 25, 5, 245, 151, 95, 25, 5, 245, 139, 95, 25, 5,
+ 226, 233, 95, 25, 5, 73, 95, 25, 5, 240, 120, 95, 25, 5, 240, 119, 95,
+ 25, 5, 240, 118, 95, 25, 5, 235, 190, 95, 25, 5, 236, 61, 95, 25, 5, 236,
+ 34, 95, 25, 5, 235, 157, 95, 25, 5, 235, 232, 95, 25, 5, 70, 95, 25, 5,
214, 229, 95, 25, 5, 214, 228, 95, 25, 5, 214, 227, 95, 25, 5, 214, 118,
95, 25, 5, 214, 211, 95, 25, 5, 214, 178, 95, 25, 5, 211, 117, 95, 25, 5,
- 211, 8, 95, 25, 5, 254, 243, 95, 25, 5, 254, 239, 95, 25, 5, 245, 86, 95,
- 25, 5, 222, 183, 245, 86, 95, 25, 5, 245, 92, 95, 25, 5, 222, 183, 245,
- 92, 95, 25, 5, 254, 201, 95, 25, 5, 245, 195, 95, 25, 5, 253, 192, 95,
- 25, 5, 226, 134, 95, 25, 5, 230, 25, 95, 25, 5, 229, 79, 95, 138, 222,
- 251, 95, 138, 216, 14, 222, 251, 95, 138, 48, 95, 138, 51, 95, 1, 216,
- 28, 95, 1, 216, 27, 95, 1, 216, 26, 95, 1, 216, 25, 95, 1, 216, 24, 95,
- 1, 216, 23, 95, 1, 216, 22, 95, 1, 223, 106, 216, 29, 95, 1, 223, 106,
- 216, 28, 95, 1, 223, 106, 216, 26, 95, 1, 223, 106, 216, 25, 95, 1, 223,
- 106, 216, 24, 95, 1, 223, 106, 216, 22, 56, 1, 254, 23, 75, 141, 1, 254,
- 23, 211, 47, 49, 28, 16, 224, 154, 49, 28, 16, 248, 158, 49, 28, 16, 225,
- 175, 49, 28, 16, 226, 113, 245, 178, 49, 28, 16, 226, 113, 247, 201, 49,
- 28, 16, 214, 16, 245, 178, 49, 28, 16, 214, 16, 247, 201, 49, 28, 16,
- 234, 197, 49, 28, 16, 217, 169, 49, 28, 16, 226, 9, 49, 28, 16, 210, 217,
- 49, 28, 16, 210, 218, 247, 201, 49, 28, 16, 233, 234, 49, 28, 16, 254,
- 68, 245, 178, 49, 28, 16, 245, 26, 245, 178, 49, 28, 16, 217, 2, 49, 28,
- 16, 234, 161, 49, 28, 16, 254, 58, 49, 28, 16, 254, 59, 247, 201, 49, 28,
- 16, 217, 175, 49, 28, 16, 216, 159, 49, 28, 16, 226, 206, 254, 21, 49,
- 28, 16, 242, 159, 254, 21, 49, 28, 16, 224, 153, 49, 28, 16, 250, 149,
- 49, 28, 16, 214, 6, 49, 28, 16, 235, 164, 254, 21, 49, 28, 16, 234, 163,
- 254, 21, 49, 28, 16, 234, 162, 254, 21, 49, 28, 16, 221, 213, 49, 28, 16,
- 226, 0, 49, 28, 16, 218, 146, 254, 61, 49, 28, 16, 226, 112, 254, 21, 49,
- 28, 16, 214, 15, 254, 21, 49, 28, 16, 254, 62, 254, 21, 49, 28, 16, 254,
- 56, 49, 28, 16, 234, 37, 49, 28, 16, 223, 46, 49, 28, 16, 225, 106, 254,
- 21, 49, 28, 16, 216, 83, 49, 28, 16, 254, 121, 49, 28, 16, 221, 159, 49,
- 28, 16, 217, 178, 254, 21, 49, 28, 16, 217, 178, 231, 40, 218, 144, 49,
- 28, 16, 226, 107, 254, 21, 49, 28, 16, 216, 190, 49, 28, 16, 233, 27, 49,
- 28, 16, 246, 41, 49, 28, 16, 215, 227, 49, 28, 16, 216, 232, 49, 28, 16,
- 233, 237, 49, 28, 16, 254, 68, 245, 26, 229, 95, 49, 28, 16, 243, 236,
- 254, 21, 49, 28, 16, 236, 12, 49, 28, 16, 215, 199, 254, 21, 49, 28, 16,
- 234, 200, 215, 198, 49, 28, 16, 225, 200, 49, 28, 16, 224, 158, 49, 28,
- 16, 234, 11, 49, 28, 16, 250, 80, 254, 21, 49, 28, 16, 223, 146, 49, 28,
- 16, 226, 12, 254, 21, 49, 28, 16, 226, 10, 254, 21, 49, 28, 16, 240, 109,
- 49, 28, 16, 229, 203, 49, 28, 16, 225, 156, 49, 28, 16, 234, 12, 254,
- 149, 49, 28, 16, 215, 199, 254, 149, 49, 28, 16, 218, 123, 49, 28, 16,
- 242, 123, 49, 28, 16, 235, 164, 229, 95, 49, 28, 16, 226, 206, 229, 95,
- 49, 28, 16, 226, 113, 229, 95, 49, 28, 16, 225, 155, 49, 28, 16, 233,
- 254, 49, 28, 16, 225, 154, 49, 28, 16, 233, 236, 49, 28, 16, 225, 201,
- 229, 95, 49, 28, 16, 234, 162, 229, 96, 254, 96, 49, 28, 16, 234, 163,
- 229, 96, 254, 96, 49, 28, 16, 210, 215, 49, 28, 16, 254, 59, 229, 95, 49,
- 28, 16, 254, 60, 217, 176, 229, 95, 49, 28, 16, 210, 216, 49, 28, 16,
- 233, 235, 49, 28, 16, 245, 173, 49, 28, 16, 250, 150, 49, 28, 16, 230,
- 198, 235, 163, 49, 28, 16, 214, 16, 229, 95, 49, 28, 16, 225, 106, 229,
- 95, 49, 28, 16, 224, 159, 229, 95, 49, 28, 16, 226, 203, 49, 28, 16, 254,
- 84, 49, 28, 16, 232, 58, 49, 28, 16, 226, 10, 229, 95, 49, 28, 16, 226,
- 12, 229, 95, 49, 28, 16, 245, 60, 226, 11, 49, 28, 16, 233, 153, 49, 28,
- 16, 254, 85, 49, 28, 16, 215, 199, 229, 95, 49, 28, 16, 245, 176, 49, 28,
- 16, 217, 178, 229, 95, 49, 28, 16, 217, 170, 49, 28, 16, 250, 80, 229,
- 95, 49, 28, 16, 245, 106, 49, 28, 16, 221, 160, 229, 95, 49, 28, 16, 211,
- 151, 234, 37, 49, 28, 16, 215, 196, 49, 28, 16, 224, 160, 49, 28, 16,
- 215, 200, 49, 28, 16, 215, 197, 49, 28, 16, 224, 157, 49, 28, 16, 215,
- 195, 49, 28, 16, 224, 156, 49, 28, 16, 242, 158, 49, 28, 16, 254, 14, 49,
- 28, 16, 245, 60, 254, 14, 49, 28, 16, 226, 107, 229, 95, 49, 28, 16, 216,
- 189, 245, 69, 49, 28, 16, 216, 189, 245, 25, 49, 28, 16, 216, 191, 254,
- 63, 49, 28, 16, 216, 184, 234, 247, 254, 55, 49, 28, 16, 234, 199, 49,
- 28, 16, 245, 139, 49, 28, 16, 211, 11, 234, 196, 49, 28, 16, 211, 11,
- 254, 96, 49, 28, 16, 218, 145, 49, 28, 16, 234, 38, 254, 96, 49, 28, 16,
- 247, 202, 254, 21, 49, 28, 16, 233, 238, 254, 21, 49, 28, 16, 233, 238,
- 254, 149, 49, 28, 16, 233, 238, 229, 95, 49, 28, 16, 254, 62, 229, 95,
- 49, 28, 16, 254, 64, 49, 28, 16, 247, 201, 49, 28, 16, 215, 210, 49, 28,
- 16, 216, 224, 49, 28, 16, 234, 2, 49, 28, 16, 233, 32, 245, 134, 250, 71,
- 49, 28, 16, 233, 32, 246, 42, 250, 72, 49, 28, 16, 233, 32, 215, 212,
- 250, 72, 49, 28, 16, 233, 32, 216, 234, 250, 72, 49, 28, 16, 233, 32,
- 236, 7, 250, 71, 49, 28, 16, 242, 159, 229, 96, 254, 96, 49, 28, 16, 242,
- 159, 226, 1, 254, 10, 49, 28, 16, 242, 159, 226, 1, 248, 29, 49, 28, 16,
- 247, 225, 49, 28, 16, 247, 226, 226, 1, 254, 11, 234, 196, 49, 28, 16,
- 247, 226, 226, 1, 254, 11, 254, 96, 49, 28, 16, 247, 226, 226, 1, 248,
- 29, 49, 28, 16, 215, 216, 49, 28, 16, 254, 15, 49, 28, 16, 236, 14, 49,
- 28, 16, 247, 246, 49, 28, 16, 254, 211, 225, 0, 254, 16, 49, 28, 16, 254,
- 211, 254, 13, 49, 28, 16, 254, 211, 254, 16, 49, 28, 16, 254, 211, 231,
- 34, 49, 28, 16, 254, 211, 231, 45, 49, 28, 16, 254, 211, 242, 160, 49,
- 28, 16, 254, 211, 242, 157, 49, 28, 16, 254, 211, 225, 0, 242, 160, 49,
- 28, 16, 231, 151, 224, 165, 240, 107, 49, 28, 16, 231, 151, 254, 151,
- 224, 165, 240, 107, 49, 28, 16, 231, 151, 248, 28, 240, 107, 49, 28, 16,
- 231, 151, 254, 151, 248, 28, 240, 107, 49, 28, 16, 231, 151, 215, 205,
- 240, 107, 49, 28, 16, 231, 151, 215, 217, 49, 28, 16, 231, 151, 216, 228,
- 240, 107, 49, 28, 16, 231, 151, 216, 228, 233, 35, 240, 107, 49, 28, 16,
- 231, 151, 233, 35, 240, 107, 49, 28, 16, 231, 151, 225, 39, 240, 107, 49,
- 28, 16, 235, 169, 216, 251, 240, 108, 49, 28, 16, 254, 60, 216, 251, 240,
- 108, 49, 28, 16, 244, 172, 216, 225, 49, 28, 16, 244, 172, 230, 143, 49,
- 28, 16, 244, 172, 247, 230, 49, 28, 16, 231, 151, 214, 10, 240, 107, 49,
- 28, 16, 231, 151, 224, 164, 240, 107, 49, 28, 16, 231, 151, 225, 39, 216,
- 228, 240, 107, 49, 28, 16, 242, 155, 230, 26, 254, 63, 49, 28, 16, 242,
- 155, 230, 26, 247, 200, 49, 28, 16, 245, 148, 234, 247, 243, 236, 213,
- 124, 49, 28, 16, 236, 13, 49, 28, 16, 236, 11, 49, 28, 16, 243, 236, 254,
- 22, 248, 27, 240, 106, 49, 28, 16, 243, 236, 247, 244, 190, 49, 28, 16,
- 243, 236, 247, 244, 229, 203, 49, 28, 16, 243, 236, 229, 198, 240, 107,
- 49, 28, 16, 243, 236, 247, 244, 248, 3, 49, 28, 16, 243, 236, 219, 102,
- 247, 243, 248, 3, 49, 28, 16, 243, 236, 247, 244, 234, 182, 49, 28, 16,
- 243, 236, 247, 244, 210, 23, 49, 28, 16, 243, 236, 247, 244, 228, 234,
- 234, 196, 49, 28, 16, 243, 236, 247, 244, 228, 234, 254, 96, 49, 28, 16,
- 243, 236, 231, 191, 250, 73, 247, 230, 49, 28, 16, 243, 236, 231, 191,
- 250, 73, 230, 143, 49, 28, 16, 244, 122, 219, 102, 250, 73, 214, 9, 49,
- 28, 16, 243, 236, 219, 102, 250, 73, 217, 179, 49, 28, 16, 243, 236, 229,
- 97, 49, 28, 16, 250, 74, 209, 249, 49, 28, 16, 250, 74, 234, 36, 49, 28,
- 16, 250, 74, 219, 9, 49, 28, 16, 243, 236, 240, 154, 211, 10, 216, 229,
- 49, 28, 16, 243, 236, 245, 149, 254, 86, 49, 28, 16, 211, 10, 215, 206,
- 49, 28, 16, 247, 238, 215, 206, 49, 28, 16, 247, 238, 216, 229, 49, 28,
- 16, 247, 238, 254, 65, 246, 42, 247, 139, 49, 28, 16, 247, 238, 230, 141,
- 216, 233, 247, 139, 49, 28, 16, 247, 238, 247, 222, 245, 36, 247, 139,
- 49, 28, 16, 247, 238, 215, 214, 226, 211, 247, 139, 49, 28, 16, 211, 10,
- 254, 65, 246, 42, 247, 139, 49, 28, 16, 211, 10, 230, 141, 216, 233, 247,
- 139, 49, 28, 16, 211, 10, 247, 222, 245, 36, 247, 139, 49, 28, 16, 211,
- 10, 215, 214, 226, 211, 247, 139, 49, 28, 16, 243, 49, 247, 237, 49, 28,
- 16, 243, 49, 211, 9, 49, 28, 16, 247, 245, 254, 65, 230, 199, 49, 28, 16,
- 247, 245, 254, 65, 231, 73, 49, 28, 16, 247, 245, 247, 201, 49, 28, 16,
- 247, 245, 216, 182, 49, 28, 16, 219, 163, 216, 182, 49, 28, 16, 219, 163,
- 216, 183, 247, 186, 49, 28, 16, 219, 163, 216, 183, 215, 207, 49, 28, 16,
- 219, 163, 216, 183, 216, 222, 49, 28, 16, 219, 163, 253, 244, 49, 28, 16,
- 219, 163, 253, 245, 247, 186, 49, 28, 16, 219, 163, 253, 245, 215, 207,
- 49, 28, 16, 219, 163, 253, 245, 216, 222, 49, 28, 16, 247, 223, 243, 30,
- 49, 28, 16, 247, 229, 226, 134, 49, 28, 16, 218, 137, 49, 28, 16, 254, 7,
- 190, 49, 28, 16, 254, 7, 213, 124, 49, 28, 16, 254, 7, 243, 135, 49, 28,
- 16, 254, 7, 248, 3, 49, 28, 16, 254, 7, 234, 182, 49, 28, 16, 254, 7,
- 210, 23, 49, 28, 16, 254, 7, 228, 233, 49, 28, 16, 234, 162, 229, 96,
- 231, 44, 49, 28, 16, 234, 163, 229, 96, 231, 44, 49, 28, 16, 234, 162,
- 229, 96, 234, 196, 49, 28, 16, 234, 163, 229, 96, 234, 196, 49, 28, 16,
- 234, 38, 234, 196, 49, 28, 16, 242, 159, 229, 96, 234, 196, 28, 16, 219,
- 155, 252, 135, 28, 16, 52, 252, 135, 28, 16, 40, 252, 135, 28, 16, 223,
- 50, 40, 252, 135, 28, 16, 248, 155, 252, 135, 28, 16, 219, 251, 252, 135,
- 28, 16, 43, 223, 77, 50, 28, 16, 44, 223, 77, 50, 28, 16, 223, 77, 247,
- 118, 28, 16, 248, 196, 221, 163, 28, 16, 248, 222, 250, 249, 28, 16, 221,
- 163, 28, 16, 249, 234, 28, 16, 223, 75, 244, 111, 28, 16, 223, 75, 244,
- 110, 28, 16, 223, 75, 244, 109, 28, 16, 244, 131, 28, 16, 244, 132, 51,
- 28, 16, 251, 148, 78, 28, 16, 251, 24, 28, 16, 251, 159, 28, 16, 127, 28,
- 16, 226, 193, 218, 163, 28, 16, 215, 57, 218, 163, 28, 16, 216, 142, 218,
- 163, 28, 16, 244, 10, 218, 163, 28, 16, 244, 80, 218, 163, 28, 16, 219,
- 124, 218, 163, 28, 16, 219, 122, 243, 250, 28, 16, 244, 8, 243, 250, 28,
- 16, 243, 203, 250, 14, 28, 16, 243, 203, 250, 15, 226, 136, 254, 142, 28,
- 16, 243, 203, 250, 15, 226, 136, 252, 122, 28, 16, 251, 67, 250, 14, 28,
- 16, 245, 7, 250, 14, 28, 16, 245, 7, 250, 15, 226, 136, 254, 142, 28, 16,
- 245, 7, 250, 15, 226, 136, 252, 122, 28, 16, 246, 83, 250, 13, 28, 16,
- 246, 83, 250, 12, 28, 16, 230, 85, 231, 90, 223, 61, 28, 16, 52, 220, 75,
- 28, 16, 52, 244, 65, 28, 16, 244, 66, 214, 163, 28, 16, 244, 66, 246,
- 106, 28, 16, 229, 188, 214, 163, 28, 16, 229, 188, 246, 106, 28, 16, 220,
- 76, 214, 163, 28, 16, 220, 76, 246, 106, 28, 16, 224, 22, 138, 220, 75,
- 28, 16, 224, 22, 138, 244, 65, 28, 16, 249, 216, 216, 87, 28, 16, 249,
- 85, 216, 87, 28, 16, 226, 136, 254, 142, 28, 16, 226, 136, 252, 122, 28,
- 16, 224, 4, 254, 142, 28, 16, 224, 4, 252, 122, 28, 16, 230, 88, 223, 61,
- 28, 16, 211, 251, 223, 61, 28, 16, 163, 223, 61, 28, 16, 224, 22, 223,
- 61, 28, 16, 245, 189, 223, 61, 28, 16, 219, 118, 223, 61, 28, 16, 216,
- 160, 223, 61, 28, 16, 219, 110, 223, 61, 28, 16, 123, 240, 211, 215, 71,
- 223, 61, 28, 16, 211, 179, 228, 43, 28, 16, 96, 228, 43, 28, 16, 250, 36,
- 211, 179, 228, 43, 28, 16, 42, 228, 44, 211, 253, 28, 16, 42, 228, 44,
- 251, 221, 28, 16, 215, 226, 228, 44, 120, 211, 253, 28, 16, 215, 226,
- 228, 44, 120, 251, 221, 28, 16, 215, 226, 228, 44, 43, 211, 253, 28, 16,
- 215, 226, 228, 44, 43, 251, 221, 28, 16, 215, 226, 228, 44, 44, 211, 253,
- 28, 16, 215, 226, 228, 44, 44, 251, 221, 28, 16, 215, 226, 228, 44, 124,
- 211, 253, 28, 16, 215, 226, 228, 44, 124, 251, 221, 28, 16, 215, 226,
- 228, 44, 120, 44, 211, 253, 28, 16, 215, 226, 228, 44, 120, 44, 251, 221,
- 28, 16, 230, 129, 228, 44, 211, 253, 28, 16, 230, 129, 228, 44, 251, 221,
- 28, 16, 215, 223, 228, 44, 124, 211, 253, 28, 16, 215, 223, 228, 44, 124,
- 251, 221, 28, 16, 226, 4, 228, 43, 28, 16, 213, 132, 228, 43, 28, 16,
- 228, 44, 251, 221, 28, 16, 227, 203, 228, 43, 28, 16, 249, 241, 228, 44,
- 211, 253, 28, 16, 249, 241, 228, 44, 251, 221, 28, 16, 251, 146, 28, 16,
- 211, 251, 228, 47, 28, 16, 163, 228, 47, 28, 16, 224, 22, 228, 47, 28,
- 16, 245, 189, 228, 47, 28, 16, 219, 118, 228, 47, 28, 16, 216, 160, 228,
- 47, 28, 16, 219, 110, 228, 47, 28, 16, 123, 240, 211, 215, 71, 228, 47,
- 28, 16, 38, 218, 139, 28, 16, 38, 218, 240, 218, 139, 28, 16, 38, 215,
- 234, 28, 16, 38, 215, 233, 28, 16, 38, 215, 232, 28, 16, 244, 101, 215,
- 234, 28, 16, 244, 101, 215, 233, 28, 16, 244, 101, 215, 232, 28, 16, 38,
- 253, 189, 247, 120, 28, 16, 38, 244, 72, 28, 16, 38, 244, 71, 28, 16, 38,
- 244, 70, 28, 16, 38, 244, 69, 28, 16, 38, 244, 68, 28, 16, 252, 58, 252,
- 74, 28, 16, 245, 143, 252, 74, 28, 16, 252, 58, 216, 111, 28, 16, 245,
- 143, 216, 111, 28, 16, 252, 58, 219, 80, 28, 16, 245, 143, 219, 80, 28,
- 16, 252, 58, 225, 115, 28, 16, 245, 143, 225, 115, 28, 16, 38, 255, 14,
- 28, 16, 38, 218, 165, 28, 16, 38, 216, 238, 28, 16, 38, 218, 166, 28, 16,
- 38, 231, 162, 28, 16, 38, 231, 161, 28, 16, 38, 255, 13, 28, 16, 38, 232,
- 112, 28, 16, 253, 254, 214, 163, 28, 16, 253, 254, 246, 106, 28, 16, 38,
- 247, 135, 28, 16, 38, 222, 231, 28, 16, 38, 244, 58, 28, 16, 38, 219, 76,
- 28, 16, 38, 252, 38, 28, 16, 38, 52, 216, 19, 28, 16, 38, 215, 211, 216,
- 19, 28, 16, 222, 235, 28, 16, 218, 75, 28, 16, 210, 159, 28, 16, 225,
- 107, 28, 16, 231, 25, 28, 16, 244, 17, 28, 16, 249, 138, 28, 16, 248, 78,
- 28, 16, 242, 150, 228, 48, 219, 95, 28, 16, 242, 150, 228, 48, 228, 75,
- 219, 95, 28, 16, 216, 0, 28, 16, 215, 95, 28, 16, 235, 193, 215, 95, 28,
- 16, 215, 96, 219, 95, 28, 16, 215, 96, 214, 163, 28, 16, 226, 148, 218,
- 102, 28, 16, 226, 148, 218, 99, 28, 16, 226, 148, 218, 98, 28, 16, 226,
- 148, 218, 97, 28, 16, 226, 148, 218, 96, 28, 16, 226, 148, 218, 95, 28,
- 16, 226, 148, 218, 94, 28, 16, 226, 148, 218, 93, 28, 16, 226, 148, 218,
- 92, 28, 16, 226, 148, 218, 101, 28, 16, 226, 148, 218, 100, 28, 16, 241,
- 245, 28, 16, 229, 105, 28, 16, 245, 143, 64, 218, 133, 28, 16, 248, 71,
- 219, 95, 28, 16, 38, 124, 251, 169, 28, 16, 38, 120, 251, 169, 28, 16,
- 38, 242, 0, 28, 16, 38, 219, 67, 225, 43, 28, 16, 225, 216, 78, 28, 16,
- 225, 216, 120, 78, 28, 16, 163, 225, 216, 78, 28, 16, 242, 182, 214, 163,
- 28, 16, 242, 182, 246, 106, 28, 16, 2, 244, 100, 28, 16, 248, 180, 28,
- 16, 248, 181, 254, 154, 28, 16, 231, 133, 28, 16, 232, 129, 28, 16, 251,
- 143, 28, 16, 220, 154, 211, 253, 28, 16, 220, 154, 251, 221, 28, 16, 230,
- 184, 28, 16, 230, 185, 251, 221, 28, 16, 220, 148, 211, 253, 28, 16, 220,
- 148, 251, 221, 28, 16, 243, 220, 211, 253, 28, 16, 243, 220, 251, 221,
- 28, 16, 232, 130, 225, 180, 223, 61, 28, 16, 232, 130, 236, 4, 223, 61,
- 28, 16, 251, 144, 223, 61, 28, 16, 220, 154, 223, 61, 28, 16, 230, 185,
- 223, 61, 28, 16, 220, 148, 223, 61, 28, 16, 216, 249, 225, 178, 249, 107,
- 224, 174, 225, 179, 28, 16, 216, 249, 225, 178, 249, 107, 224, 174, 236,
- 3, 28, 16, 216, 249, 225, 178, 249, 107, 224, 174, 225, 180, 247, 211,
- 28, 16, 216, 249, 236, 2, 249, 107, 224, 174, 225, 179, 28, 16, 216, 249,
- 236, 2, 249, 107, 224, 174, 236, 3, 28, 16, 216, 249, 236, 2, 249, 107,
- 224, 174, 236, 4, 247, 211, 28, 16, 216, 249, 236, 2, 249, 107, 224, 174,
- 236, 4, 247, 210, 28, 16, 216, 249, 236, 2, 249, 107, 224, 174, 236, 4,
- 247, 209, 28, 16, 249, 133, 28, 16, 242, 126, 251, 67, 250, 14, 28, 16,
- 242, 126, 245, 7, 250, 14, 28, 16, 42, 253, 158, 28, 16, 213, 151, 28,
- 16, 225, 14, 28, 16, 250, 5, 28, 16, 221, 203, 28, 16, 250, 9, 28, 16,
- 216, 7, 28, 16, 224, 242, 28, 16, 224, 243, 244, 60, 28, 16, 221, 204,
- 244, 60, 28, 16, 216, 8, 223, 58, 28, 16, 225, 163, 218, 66, 26, 213,
- 137, 187, 217, 229, 26, 213, 137, 187, 217, 218, 26, 213, 137, 187, 217,
- 208, 26, 213, 137, 187, 217, 201, 26, 213, 137, 187, 217, 193, 26, 213,
- 137, 187, 217, 187, 26, 213, 137, 187, 217, 186, 26, 213, 137, 187, 217,
- 185, 26, 213, 137, 187, 217, 184, 26, 213, 137, 187, 217, 228, 26, 213,
- 137, 187, 217, 227, 26, 213, 137, 187, 217, 226, 26, 213, 137, 187, 217,
- 225, 26, 213, 137, 187, 217, 224, 26, 213, 137, 187, 217, 223, 26, 213,
- 137, 187, 217, 222, 26, 213, 137, 187, 217, 221, 26, 213, 137, 187, 217,
- 220, 26, 213, 137, 187, 217, 219, 26, 213, 137, 187, 217, 217, 26, 213,
- 137, 187, 217, 216, 26, 213, 137, 187, 217, 215, 26, 213, 137, 187, 217,
- 214, 26, 213, 137, 187, 217, 213, 26, 213, 137, 187, 217, 192, 26, 213,
- 137, 187, 217, 191, 26, 213, 137, 187, 217, 190, 26, 213, 137, 187, 217,
- 189, 26, 213, 137, 187, 217, 188, 26, 235, 214, 187, 217, 229, 26, 235,
- 214, 187, 217, 218, 26, 235, 214, 187, 217, 201, 26, 235, 214, 187, 217,
- 193, 26, 235, 214, 187, 217, 186, 26, 235, 214, 187, 217, 185, 26, 235,
- 214, 187, 217, 227, 26, 235, 214, 187, 217, 226, 26, 235, 214, 187, 217,
- 225, 26, 235, 214, 187, 217, 224, 26, 235, 214, 187, 217, 221, 26, 235,
- 214, 187, 217, 220, 26, 235, 214, 187, 217, 219, 26, 235, 214, 187, 217,
- 214, 26, 235, 214, 187, 217, 213, 26, 235, 214, 187, 217, 212, 26, 235,
- 214, 187, 217, 211, 26, 235, 214, 187, 217, 210, 26, 235, 214, 187, 217,
- 209, 26, 235, 214, 187, 217, 207, 26, 235, 214, 187, 217, 206, 26, 235,
- 214, 187, 217, 205, 26, 235, 214, 187, 217, 204, 26, 235, 214, 187, 217,
- 203, 26, 235, 214, 187, 217, 202, 26, 235, 214, 187, 217, 200, 26, 235,
- 214, 187, 217, 199, 26, 235, 214, 187, 217, 198, 26, 235, 214, 187, 217,
- 197, 26, 235, 214, 187, 217, 196, 26, 235, 214, 187, 217, 195, 26, 235,
- 214, 187, 217, 194, 26, 235, 214, 187, 217, 192, 26, 235, 214, 187, 217,
- 191, 26, 235, 214, 187, 217, 190, 26, 235, 214, 187, 217, 189, 26, 235,
- 214, 187, 217, 188, 38, 26, 28, 215, 208, 38, 26, 28, 216, 223, 38, 26,
- 28, 225, 188, 26, 28, 233, 31, 230, 142, 31, 245, 223, 247, 224, 31, 241,
- 222, 245, 223, 247, 224, 31, 240, 214, 245, 223, 247, 224, 31, 245, 222,
- 241, 223, 247, 224, 31, 245, 222, 240, 213, 247, 224, 31, 245, 223, 180,
- 31, 250, 174, 180, 31, 243, 229, 250, 35, 180, 31, 230, 177, 180, 31,
- 252, 130, 180, 31, 234, 179, 219, 79, 180, 31, 249, 179, 180, 31, 253,
- 233, 180, 31, 226, 163, 180, 31, 251, 153, 226, 130, 180, 31, 248, 73,
- 177, 247, 179, 180, 31, 247, 176, 180, 31, 210, 222, 180, 31, 235, 247,
- 180, 31, 225, 197, 180, 31, 223, 127, 180, 31, 249, 189, 180, 31, 241,
- 60, 252, 184, 180, 31, 212, 59, 180, 31, 244, 39, 180, 31, 254, 246, 180,
- 31, 223, 89, 180, 31, 223, 65, 180, 31, 245, 221, 180, 31, 235, 53, 180,
- 31, 249, 184, 180, 31, 245, 142, 180, 31, 246, 52, 180, 31, 250, 145,
- 180, 31, 248, 82, 180, 31, 23, 223, 64, 180, 31, 226, 81, 180, 31, 233,
- 34, 180, 31, 249, 254, 180, 31, 234, 77, 180, 31, 243, 86, 180, 31, 218,
- 112, 180, 31, 224, 130, 180, 31, 243, 228, 180, 31, 223, 66, 180, 31,
- 233, 71, 177, 230, 157, 180, 31, 223, 62, 180, 31, 242, 168, 216, 42,
- 231, 76, 180, 31, 245, 144, 180, 31, 218, 124, 180, 31, 242, 128, 180,
- 31, 245, 136, 180, 31, 225, 235, 180, 31, 222, 225, 180, 31, 244, 59,
- 180, 31, 214, 8, 177, 212, 44, 180, 31, 249, 193, 180, 31, 231, 89, 180,
- 31, 245, 61, 180, 31, 214, 172, 180, 31, 247, 212, 180, 31, 250, 0, 230,
- 110, 180, 31, 242, 106, 180, 31, 243, 87, 235, 255, 180, 31, 231, 141,
- 180, 31, 255, 10, 180, 31, 245, 157, 180, 31, 246, 109, 180, 31, 212, 42,
- 180, 31, 219, 150, 180, 31, 235, 222, 180, 31, 248, 42, 180, 31, 248,
- 160, 180, 31, 247, 208, 180, 31, 245, 29, 180, 31, 220, 115, 180, 31,
- 218, 128, 180, 31, 242, 2, 180, 31, 249, 212, 180, 31, 249, 251, 180, 31,
- 244, 177, 180, 31, 254, 212, 180, 31, 249, 211, 180, 31, 226, 197, 216,
- 196, 213, 242, 180, 31, 247, 232, 180, 31, 233, 124, 180, 31, 244, 13,
- 249, 149, 222, 202, 214, 174, 21, 110, 249, 149, 222, 202, 214, 174, 21,
- 105, 249, 149, 222, 202, 214, 174, 21, 158, 249, 149, 222, 202, 214, 174,
- 21, 161, 249, 149, 222, 202, 214, 174, 21, 189, 249, 149, 222, 202, 214,
- 174, 21, 194, 249, 149, 222, 202, 214, 174, 21, 198, 249, 149, 222, 202,
- 214, 174, 21, 195, 249, 149, 222, 202, 214, 174, 21, 200, 249, 149, 222,
- 202, 216, 243, 21, 110, 249, 149, 222, 202, 216, 243, 21, 105, 249, 149,
- 222, 202, 216, 243, 21, 158, 249, 149, 222, 202, 216, 243, 21, 161, 249,
- 149, 222, 202, 216, 243, 21, 189, 249, 149, 222, 202, 216, 243, 21, 194,
- 249, 149, 222, 202, 216, 243, 21, 198, 249, 149, 222, 202, 216, 243, 21,
- 195, 249, 149, 222, 202, 216, 243, 21, 200, 11, 23, 6, 61, 11, 23, 6,
- 253, 158, 11, 23, 6, 251, 66, 11, 23, 6, 249, 60, 11, 23, 6, 75, 11, 23,
- 6, 245, 6, 11, 23, 6, 243, 202, 11, 23, 6, 242, 60, 11, 23, 6, 73, 11,
- 23, 6, 235, 144, 11, 23, 6, 235, 23, 11, 23, 6, 156, 11, 23, 6, 193, 11,
- 23, 6, 230, 25, 11, 23, 6, 76, 11, 23, 6, 226, 105, 11, 23, 6, 224, 96,
- 11, 23, 6, 153, 11, 23, 6, 222, 91, 11, 23, 6, 217, 152, 11, 23, 6, 70,
- 11, 23, 6, 214, 105, 11, 23, 6, 212, 98, 11, 23, 6, 211, 178, 11, 23, 6,
- 211, 117, 11, 23, 6, 210, 159, 11, 23, 4, 61, 11, 23, 4, 253, 158, 11,
- 23, 4, 251, 66, 11, 23, 4, 249, 60, 11, 23, 4, 75, 11, 23, 4, 245, 6, 11,
- 23, 4, 243, 202, 11, 23, 4, 242, 60, 11, 23, 4, 73, 11, 23, 4, 235, 144,
- 11, 23, 4, 235, 23, 11, 23, 4, 156, 11, 23, 4, 193, 11, 23, 4, 230, 25,
- 11, 23, 4, 76, 11, 23, 4, 226, 105, 11, 23, 4, 224, 96, 11, 23, 4, 153,
- 11, 23, 4, 222, 91, 11, 23, 4, 217, 152, 11, 23, 4, 70, 11, 23, 4, 214,
- 105, 11, 23, 4, 212, 98, 11, 23, 4, 211, 178, 11, 23, 4, 211, 117, 11,
- 23, 4, 210, 159, 11, 32, 6, 61, 11, 32, 6, 253, 158, 11, 32, 6, 251, 66,
- 11, 32, 6, 249, 60, 11, 32, 6, 75, 11, 32, 6, 245, 6, 11, 32, 6, 243,
- 202, 11, 32, 6, 242, 60, 11, 32, 6, 73, 11, 32, 6, 235, 144, 11, 32, 6,
- 235, 23, 11, 32, 6, 156, 11, 32, 6, 193, 11, 32, 6, 230, 25, 11, 32, 6,
- 76, 11, 32, 6, 226, 105, 11, 32, 6, 224, 96, 11, 32, 6, 153, 11, 32, 6,
- 222, 91, 11, 32, 6, 217, 152, 11, 32, 6, 70, 11, 32, 6, 214, 105, 11, 32,
- 6, 212, 98, 11, 32, 6, 211, 178, 11, 32, 6, 211, 117, 11, 32, 6, 210,
- 159, 11, 32, 4, 61, 11, 32, 4, 253, 158, 11, 32, 4, 251, 66, 11, 32, 4,
- 249, 60, 11, 32, 4, 75, 11, 32, 4, 245, 6, 11, 32, 4, 243, 202, 11, 32,
- 4, 73, 11, 32, 4, 235, 144, 11, 32, 4, 235, 23, 11, 32, 4, 156, 11, 32,
- 4, 193, 11, 32, 4, 230, 25, 11, 32, 4, 76, 11, 32, 4, 226, 105, 11, 32,
- 4, 224, 96, 11, 32, 4, 153, 11, 32, 4, 222, 91, 11, 32, 4, 217, 152, 11,
- 32, 4, 70, 11, 32, 4, 214, 105, 11, 32, 4, 212, 98, 11, 32, 4, 211, 178,
- 11, 32, 4, 211, 117, 11, 32, 4, 210, 159, 11, 23, 32, 6, 61, 11, 23, 32,
- 6, 253, 158, 11, 23, 32, 6, 251, 66, 11, 23, 32, 6, 249, 60, 11, 23, 32,
- 6, 75, 11, 23, 32, 6, 245, 6, 11, 23, 32, 6, 243, 202, 11, 23, 32, 6,
- 242, 60, 11, 23, 32, 6, 73, 11, 23, 32, 6, 235, 144, 11, 23, 32, 6, 235,
- 23, 11, 23, 32, 6, 156, 11, 23, 32, 6, 193, 11, 23, 32, 6, 230, 25, 11,
- 23, 32, 6, 76, 11, 23, 32, 6, 226, 105, 11, 23, 32, 6, 224, 96, 11, 23,
- 32, 6, 153, 11, 23, 32, 6, 222, 91, 11, 23, 32, 6, 217, 152, 11, 23, 32,
- 6, 70, 11, 23, 32, 6, 214, 105, 11, 23, 32, 6, 212, 98, 11, 23, 32, 6,
- 211, 178, 11, 23, 32, 6, 211, 117, 11, 23, 32, 6, 210, 159, 11, 23, 32,
- 4, 61, 11, 23, 32, 4, 253, 158, 11, 23, 32, 4, 251, 66, 11, 23, 32, 4,
- 249, 60, 11, 23, 32, 4, 75, 11, 23, 32, 4, 245, 6, 11, 23, 32, 4, 243,
- 202, 11, 23, 32, 4, 242, 60, 11, 23, 32, 4, 73, 11, 23, 32, 4, 235, 144,
- 11, 23, 32, 4, 235, 23, 11, 23, 32, 4, 156, 11, 23, 32, 4, 193, 11, 23,
- 32, 4, 230, 25, 11, 23, 32, 4, 76, 11, 23, 32, 4, 226, 105, 11, 23, 32,
- 4, 224, 96, 11, 23, 32, 4, 153, 11, 23, 32, 4, 222, 91, 11, 23, 32, 4,
- 217, 152, 11, 23, 32, 4, 70, 11, 23, 32, 4, 214, 105, 11, 23, 32, 4, 212,
- 98, 11, 23, 32, 4, 211, 178, 11, 23, 32, 4, 211, 117, 11, 23, 32, 4, 210,
- 159, 11, 119, 6, 61, 11, 119, 6, 251, 66, 11, 119, 6, 249, 60, 11, 119,
- 6, 243, 202, 11, 119, 6, 235, 144, 11, 119, 6, 235, 23, 11, 119, 6, 230,
- 25, 11, 119, 6, 76, 11, 119, 6, 226, 105, 11, 119, 6, 224, 96, 11, 119,
- 6, 222, 91, 11, 119, 6, 217, 152, 11, 119, 6, 70, 11, 119, 6, 214, 105,
- 11, 119, 6, 212, 98, 11, 119, 6, 211, 178, 11, 119, 6, 211, 117, 11, 119,
- 6, 210, 159, 11, 119, 4, 61, 11, 119, 4, 253, 158, 11, 119, 4, 251, 66,
- 11, 119, 4, 249, 60, 11, 119, 4, 245, 6, 11, 119, 4, 242, 60, 11, 119, 4,
- 73, 11, 119, 4, 235, 144, 11, 119, 4, 235, 23, 11, 119, 4, 156, 11, 119,
- 4, 193, 11, 119, 4, 230, 25, 11, 119, 4, 226, 105, 11, 119, 4, 224, 96,
- 11, 119, 4, 153, 11, 119, 4, 222, 91, 11, 119, 4, 217, 152, 11, 119, 4,
- 70, 11, 119, 4, 214, 105, 11, 119, 4, 212, 98, 11, 119, 4, 211, 178, 11,
- 119, 4, 211, 117, 11, 119, 4, 210, 159, 11, 23, 119, 6, 61, 11, 23, 119,
- 6, 253, 158, 11, 23, 119, 6, 251, 66, 11, 23, 119, 6, 249, 60, 11, 23,
- 119, 6, 75, 11, 23, 119, 6, 245, 6, 11, 23, 119, 6, 243, 202, 11, 23,
- 119, 6, 242, 60, 11, 23, 119, 6, 73, 11, 23, 119, 6, 235, 144, 11, 23,
- 119, 6, 235, 23, 11, 23, 119, 6, 156, 11, 23, 119, 6, 193, 11, 23, 119,
- 6, 230, 25, 11, 23, 119, 6, 76, 11, 23, 119, 6, 226, 105, 11, 23, 119, 6,
- 224, 96, 11, 23, 119, 6, 153, 11, 23, 119, 6, 222, 91, 11, 23, 119, 6,
- 217, 152, 11, 23, 119, 6, 70, 11, 23, 119, 6, 214, 105, 11, 23, 119, 6,
- 212, 98, 11, 23, 119, 6, 211, 178, 11, 23, 119, 6, 211, 117, 11, 23, 119,
- 6, 210, 159, 11, 23, 119, 4, 61, 11, 23, 119, 4, 253, 158, 11, 23, 119,
- 4, 251, 66, 11, 23, 119, 4, 249, 60, 11, 23, 119, 4, 75, 11, 23, 119, 4,
- 245, 6, 11, 23, 119, 4, 243, 202, 11, 23, 119, 4, 242, 60, 11, 23, 119,
- 4, 73, 11, 23, 119, 4, 235, 144, 11, 23, 119, 4, 235, 23, 11, 23, 119, 4,
- 156, 11, 23, 119, 4, 193, 11, 23, 119, 4, 230, 25, 11, 23, 119, 4, 76,
- 11, 23, 119, 4, 226, 105, 11, 23, 119, 4, 224, 96, 11, 23, 119, 4, 153,
- 11, 23, 119, 4, 222, 91, 11, 23, 119, 4, 217, 152, 11, 23, 119, 4, 70,
- 11, 23, 119, 4, 214, 105, 11, 23, 119, 4, 212, 98, 11, 23, 119, 4, 211,
- 178, 11, 23, 119, 4, 211, 117, 11, 23, 119, 4, 210, 159, 11, 133, 6, 61,
- 11, 133, 6, 253, 158, 11, 133, 6, 249, 60, 11, 133, 6, 75, 11, 133, 6,
- 245, 6, 11, 133, 6, 243, 202, 11, 133, 6, 235, 144, 11, 133, 6, 235, 23,
- 11, 133, 6, 156, 11, 133, 6, 193, 11, 133, 6, 230, 25, 11, 133, 6, 76,
- 11, 133, 6, 226, 105, 11, 133, 6, 224, 96, 11, 133, 6, 222, 91, 11, 133,
- 6, 217, 152, 11, 133, 6, 70, 11, 133, 6, 214, 105, 11, 133, 6, 212, 98,
- 11, 133, 6, 211, 178, 11, 133, 6, 211, 117, 11, 133, 4, 61, 11, 133, 4,
- 253, 158, 11, 133, 4, 251, 66, 11, 133, 4, 249, 60, 11, 133, 4, 75, 11,
- 133, 4, 245, 6, 11, 133, 4, 243, 202, 11, 133, 4, 242, 60, 11, 133, 4,
- 73, 11, 133, 4, 235, 144, 11, 133, 4, 235, 23, 11, 133, 4, 156, 11, 133,
- 4, 193, 11, 133, 4, 230, 25, 11, 133, 4, 76, 11, 133, 4, 226, 105, 11,
- 133, 4, 224, 96, 11, 133, 4, 153, 11, 133, 4, 222, 91, 11, 133, 4, 217,
- 152, 11, 133, 4, 70, 11, 133, 4, 214, 105, 11, 133, 4, 212, 98, 11, 133,
- 4, 211, 178, 11, 133, 4, 211, 117, 11, 133, 4, 210, 159, 11, 139, 6, 61,
- 11, 139, 6, 253, 158, 11, 139, 6, 249, 60, 11, 139, 6, 75, 11, 139, 6,
- 245, 6, 11, 139, 6, 243, 202, 11, 139, 6, 73, 11, 139, 6, 235, 144, 11,
- 139, 6, 235, 23, 11, 139, 6, 156, 11, 139, 6, 193, 11, 139, 6, 76, 11,
- 139, 6, 222, 91, 11, 139, 6, 217, 152, 11, 139, 6, 70, 11, 139, 6, 214,
- 105, 11, 139, 6, 212, 98, 11, 139, 6, 211, 178, 11, 139, 6, 211, 117, 11,
- 139, 4, 61, 11, 139, 4, 253, 158, 11, 139, 4, 251, 66, 11, 139, 4, 249,
- 60, 11, 139, 4, 75, 11, 139, 4, 245, 6, 11, 139, 4, 243, 202, 11, 139, 4,
- 242, 60, 11, 139, 4, 73, 11, 139, 4, 235, 144, 11, 139, 4, 235, 23, 11,
- 139, 4, 156, 11, 139, 4, 193, 11, 139, 4, 230, 25, 11, 139, 4, 76, 11,
- 139, 4, 226, 105, 11, 139, 4, 224, 96, 11, 139, 4, 153, 11, 139, 4, 222,
- 91, 11, 139, 4, 217, 152, 11, 139, 4, 70, 11, 139, 4, 214, 105, 11, 139,
- 4, 212, 98, 11, 139, 4, 211, 178, 11, 139, 4, 211, 117, 11, 139, 4, 210,
- 159, 11, 23, 133, 6, 61, 11, 23, 133, 6, 253, 158, 11, 23, 133, 6, 251,
- 66, 11, 23, 133, 6, 249, 60, 11, 23, 133, 6, 75, 11, 23, 133, 6, 245, 6,
- 11, 23, 133, 6, 243, 202, 11, 23, 133, 6, 242, 60, 11, 23, 133, 6, 73,
- 11, 23, 133, 6, 235, 144, 11, 23, 133, 6, 235, 23, 11, 23, 133, 6, 156,
- 11, 23, 133, 6, 193, 11, 23, 133, 6, 230, 25, 11, 23, 133, 6, 76, 11, 23,
- 133, 6, 226, 105, 11, 23, 133, 6, 224, 96, 11, 23, 133, 6, 153, 11, 23,
- 133, 6, 222, 91, 11, 23, 133, 6, 217, 152, 11, 23, 133, 6, 70, 11, 23,
- 133, 6, 214, 105, 11, 23, 133, 6, 212, 98, 11, 23, 133, 6, 211, 178, 11,
- 23, 133, 6, 211, 117, 11, 23, 133, 6, 210, 159, 11, 23, 133, 4, 61, 11,
- 23, 133, 4, 253, 158, 11, 23, 133, 4, 251, 66, 11, 23, 133, 4, 249, 60,
- 11, 23, 133, 4, 75, 11, 23, 133, 4, 245, 6, 11, 23, 133, 4, 243, 202, 11,
- 23, 133, 4, 242, 60, 11, 23, 133, 4, 73, 11, 23, 133, 4, 235, 144, 11,
- 23, 133, 4, 235, 23, 11, 23, 133, 4, 156, 11, 23, 133, 4, 193, 11, 23,
- 133, 4, 230, 25, 11, 23, 133, 4, 76, 11, 23, 133, 4, 226, 105, 11, 23,
- 133, 4, 224, 96, 11, 23, 133, 4, 153, 11, 23, 133, 4, 222, 91, 11, 23,
- 133, 4, 217, 152, 11, 23, 133, 4, 70, 11, 23, 133, 4, 214, 105, 11, 23,
- 133, 4, 212, 98, 11, 23, 133, 4, 211, 178, 11, 23, 133, 4, 211, 117, 11,
- 23, 133, 4, 210, 159, 11, 35, 6, 61, 11, 35, 6, 253, 158, 11, 35, 6, 251,
- 66, 11, 35, 6, 249, 60, 11, 35, 6, 75, 11, 35, 6, 245, 6, 11, 35, 6, 243,
- 202, 11, 35, 6, 242, 60, 11, 35, 6, 73, 11, 35, 6, 235, 144, 11, 35, 6,
- 235, 23, 11, 35, 6, 156, 11, 35, 6, 193, 11, 35, 6, 230, 25, 11, 35, 6,
- 76, 11, 35, 6, 226, 105, 11, 35, 6, 224, 96, 11, 35, 6, 153, 11, 35, 6,
- 222, 91, 11, 35, 6, 217, 152, 11, 35, 6, 70, 11, 35, 6, 214, 105, 11, 35,
- 6, 212, 98, 11, 35, 6, 211, 178, 11, 35, 6, 211, 117, 11, 35, 6, 210,
- 159, 11, 35, 4, 61, 11, 35, 4, 253, 158, 11, 35, 4, 251, 66, 11, 35, 4,
- 249, 60, 11, 35, 4, 75, 11, 35, 4, 245, 6, 11, 35, 4, 243, 202, 11, 35,
- 4, 242, 60, 11, 35, 4, 73, 11, 35, 4, 235, 144, 11, 35, 4, 235, 23, 11,
- 35, 4, 156, 11, 35, 4, 193, 11, 35, 4, 230, 25, 11, 35, 4, 76, 11, 35, 4,
- 226, 105, 11, 35, 4, 224, 96, 11, 35, 4, 153, 11, 35, 4, 222, 91, 11, 35,
- 4, 217, 152, 11, 35, 4, 70, 11, 35, 4, 214, 105, 11, 35, 4, 212, 98, 11,
- 35, 4, 211, 178, 11, 35, 4, 211, 117, 11, 35, 4, 210, 159, 11, 35, 23, 6,
- 61, 11, 35, 23, 6, 253, 158, 11, 35, 23, 6, 251, 66, 11, 35, 23, 6, 249,
- 60, 11, 35, 23, 6, 75, 11, 35, 23, 6, 245, 6, 11, 35, 23, 6, 243, 202,
- 11, 35, 23, 6, 242, 60, 11, 35, 23, 6, 73, 11, 35, 23, 6, 235, 144, 11,
- 35, 23, 6, 235, 23, 11, 35, 23, 6, 156, 11, 35, 23, 6, 193, 11, 35, 23,
- 6, 230, 25, 11, 35, 23, 6, 76, 11, 35, 23, 6, 226, 105, 11, 35, 23, 6,
- 224, 96, 11, 35, 23, 6, 153, 11, 35, 23, 6, 222, 91, 11, 35, 23, 6, 217,
- 152, 11, 35, 23, 6, 70, 11, 35, 23, 6, 214, 105, 11, 35, 23, 6, 212, 98,
- 11, 35, 23, 6, 211, 178, 11, 35, 23, 6, 211, 117, 11, 35, 23, 6, 210,
- 159, 11, 35, 23, 4, 61, 11, 35, 23, 4, 253, 158, 11, 35, 23, 4, 251, 66,
- 11, 35, 23, 4, 249, 60, 11, 35, 23, 4, 75, 11, 35, 23, 4, 245, 6, 11, 35,
- 23, 4, 243, 202, 11, 35, 23, 4, 242, 60, 11, 35, 23, 4, 73, 11, 35, 23,
- 4, 235, 144, 11, 35, 23, 4, 235, 23, 11, 35, 23, 4, 156, 11, 35, 23, 4,
- 193, 11, 35, 23, 4, 230, 25, 11, 35, 23, 4, 76, 11, 35, 23, 4, 226, 105,
- 11, 35, 23, 4, 224, 96, 11, 35, 23, 4, 153, 11, 35, 23, 4, 222, 91, 11,
- 35, 23, 4, 217, 152, 11, 35, 23, 4, 70, 11, 35, 23, 4, 214, 105, 11, 35,
- 23, 4, 212, 98, 11, 35, 23, 4, 211, 178, 11, 35, 23, 4, 211, 117, 11, 35,
- 23, 4, 210, 159, 11, 35, 32, 6, 61, 11, 35, 32, 6, 253, 158, 11, 35, 32,
- 6, 251, 66, 11, 35, 32, 6, 249, 60, 11, 35, 32, 6, 75, 11, 35, 32, 6,
- 245, 6, 11, 35, 32, 6, 243, 202, 11, 35, 32, 6, 242, 60, 11, 35, 32, 6,
- 73, 11, 35, 32, 6, 235, 144, 11, 35, 32, 6, 235, 23, 11, 35, 32, 6, 156,
- 11, 35, 32, 6, 193, 11, 35, 32, 6, 230, 25, 11, 35, 32, 6, 76, 11, 35,
- 32, 6, 226, 105, 11, 35, 32, 6, 224, 96, 11, 35, 32, 6, 153, 11, 35, 32,
- 6, 222, 91, 11, 35, 32, 6, 217, 152, 11, 35, 32, 6, 70, 11, 35, 32, 6,
- 214, 105, 11, 35, 32, 6, 212, 98, 11, 35, 32, 6, 211, 178, 11, 35, 32, 6,
- 211, 117, 11, 35, 32, 6, 210, 159, 11, 35, 32, 4, 61, 11, 35, 32, 4, 253,
- 158, 11, 35, 32, 4, 251, 66, 11, 35, 32, 4, 249, 60, 11, 35, 32, 4, 75,
- 11, 35, 32, 4, 245, 6, 11, 35, 32, 4, 243, 202, 11, 35, 32, 4, 242, 60,
- 11, 35, 32, 4, 73, 11, 35, 32, 4, 235, 144, 11, 35, 32, 4, 235, 23, 11,
- 35, 32, 4, 156, 11, 35, 32, 4, 193, 11, 35, 32, 4, 230, 25, 11, 35, 32,
- 4, 76, 11, 35, 32, 4, 226, 105, 11, 35, 32, 4, 224, 96, 11, 35, 32, 4,
- 153, 11, 35, 32, 4, 222, 91, 11, 35, 32, 4, 217, 152, 11, 35, 32, 4, 70,
- 11, 35, 32, 4, 214, 105, 11, 35, 32, 4, 212, 98, 11, 35, 32, 4, 211, 178,
- 11, 35, 32, 4, 211, 117, 11, 35, 32, 4, 210, 159, 11, 35, 23, 32, 6, 61,
- 11, 35, 23, 32, 6, 253, 158, 11, 35, 23, 32, 6, 251, 66, 11, 35, 23, 32,
- 6, 249, 60, 11, 35, 23, 32, 6, 75, 11, 35, 23, 32, 6, 245, 6, 11, 35, 23,
- 32, 6, 243, 202, 11, 35, 23, 32, 6, 242, 60, 11, 35, 23, 32, 6, 73, 11,
- 35, 23, 32, 6, 235, 144, 11, 35, 23, 32, 6, 235, 23, 11, 35, 23, 32, 6,
- 156, 11, 35, 23, 32, 6, 193, 11, 35, 23, 32, 6, 230, 25, 11, 35, 23, 32,
- 6, 76, 11, 35, 23, 32, 6, 226, 105, 11, 35, 23, 32, 6, 224, 96, 11, 35,
- 23, 32, 6, 153, 11, 35, 23, 32, 6, 222, 91, 11, 35, 23, 32, 6, 217, 152,
- 11, 35, 23, 32, 6, 70, 11, 35, 23, 32, 6, 214, 105, 11, 35, 23, 32, 6,
- 212, 98, 11, 35, 23, 32, 6, 211, 178, 11, 35, 23, 32, 6, 211, 117, 11,
- 35, 23, 32, 6, 210, 159, 11, 35, 23, 32, 4, 61, 11, 35, 23, 32, 4, 253,
- 158, 11, 35, 23, 32, 4, 251, 66, 11, 35, 23, 32, 4, 249, 60, 11, 35, 23,
- 32, 4, 75, 11, 35, 23, 32, 4, 245, 6, 11, 35, 23, 32, 4, 243, 202, 11,
- 35, 23, 32, 4, 242, 60, 11, 35, 23, 32, 4, 73, 11, 35, 23, 32, 4, 235,
- 144, 11, 35, 23, 32, 4, 235, 23, 11, 35, 23, 32, 4, 156, 11, 35, 23, 32,
- 4, 193, 11, 35, 23, 32, 4, 230, 25, 11, 35, 23, 32, 4, 76, 11, 35, 23,
- 32, 4, 226, 105, 11, 35, 23, 32, 4, 224, 96, 11, 35, 23, 32, 4, 153, 11,
- 35, 23, 32, 4, 222, 91, 11, 35, 23, 32, 4, 217, 152, 11, 35, 23, 32, 4,
- 70, 11, 35, 23, 32, 4, 214, 105, 11, 35, 23, 32, 4, 212, 98, 11, 35, 23,
- 32, 4, 211, 178, 11, 35, 23, 32, 4, 211, 117, 11, 35, 23, 32, 4, 210,
- 159, 11, 230, 138, 6, 61, 11, 230, 138, 6, 253, 158, 11, 230, 138, 6,
- 251, 66, 11, 230, 138, 6, 249, 60, 11, 230, 138, 6, 75, 11, 230, 138, 6,
- 245, 6, 11, 230, 138, 6, 243, 202, 11, 230, 138, 6, 242, 60, 11, 230,
- 138, 6, 73, 11, 230, 138, 6, 235, 144, 11, 230, 138, 6, 235, 23, 11, 230,
- 138, 6, 156, 11, 230, 138, 6, 193, 11, 230, 138, 6, 230, 25, 11, 230,
- 138, 6, 76, 11, 230, 138, 6, 226, 105, 11, 230, 138, 6, 224, 96, 11, 230,
- 138, 6, 153, 11, 230, 138, 6, 222, 91, 11, 230, 138, 6, 217, 152, 11,
- 230, 138, 6, 70, 11, 230, 138, 6, 214, 105, 11, 230, 138, 6, 212, 98, 11,
- 230, 138, 6, 211, 178, 11, 230, 138, 6, 211, 117, 11, 230, 138, 6, 210,
- 159, 11, 230, 138, 4, 61, 11, 230, 138, 4, 253, 158, 11, 230, 138, 4,
- 251, 66, 11, 230, 138, 4, 249, 60, 11, 230, 138, 4, 75, 11, 230, 138, 4,
- 245, 6, 11, 230, 138, 4, 243, 202, 11, 230, 138, 4, 242, 60, 11, 230,
- 138, 4, 73, 11, 230, 138, 4, 235, 144, 11, 230, 138, 4, 235, 23, 11, 230,
- 138, 4, 156, 11, 230, 138, 4, 193, 11, 230, 138, 4, 230, 25, 11, 230,
- 138, 4, 76, 11, 230, 138, 4, 226, 105, 11, 230, 138, 4, 224, 96, 11, 230,
- 138, 4, 153, 11, 230, 138, 4, 222, 91, 11, 230, 138, 4, 217, 152, 11,
- 230, 138, 4, 70, 11, 230, 138, 4, 214, 105, 11, 230, 138, 4, 212, 98, 11,
- 230, 138, 4, 211, 178, 11, 230, 138, 4, 211, 117, 11, 230, 138, 4, 210,
- 159, 11, 32, 4, 247, 119, 73, 11, 32, 4, 247, 119, 235, 144, 11, 23, 6,
- 254, 143, 11, 23, 6, 252, 26, 11, 23, 6, 243, 107, 11, 23, 6, 248, 54,
- 11, 23, 6, 245, 100, 11, 23, 6, 210, 85, 11, 23, 6, 245, 63, 11, 23, 6,
- 216, 179, 11, 23, 6, 235, 185, 11, 23, 6, 234, 222, 11, 23, 6, 233, 98,
- 11, 23, 6, 230, 102, 11, 23, 6, 227, 237, 11, 23, 6, 211, 157, 11, 23, 6,
- 226, 199, 11, 23, 6, 225, 108, 11, 23, 6, 223, 37, 11, 23, 6, 216, 180,
- 87, 11, 23, 6, 219, 177, 11, 23, 6, 217, 41, 11, 23, 6, 214, 157, 11, 23,
- 6, 225, 133, 11, 23, 6, 250, 110, 11, 23, 6, 224, 161, 11, 23, 6, 226,
- 201, 11, 23, 229, 221, 11, 23, 4, 254, 143, 11, 23, 4, 252, 26, 11, 23,
- 4, 243, 107, 11, 23, 4, 248, 54, 11, 23, 4, 245, 100, 11, 23, 4, 210, 85,
- 11, 23, 4, 245, 63, 11, 23, 4, 216, 179, 11, 23, 4, 235, 185, 11, 23, 4,
- 234, 222, 11, 23, 4, 233, 98, 11, 23, 4, 230, 102, 11, 23, 4, 227, 237,
- 11, 23, 4, 211, 157, 11, 23, 4, 226, 199, 11, 23, 4, 225, 108, 11, 23, 4,
- 223, 37, 11, 23, 4, 40, 219, 177, 11, 23, 4, 219, 177, 11, 23, 4, 217,
- 41, 11, 23, 4, 214, 157, 11, 23, 4, 225, 133, 11, 23, 4, 250, 110, 11,
- 23, 4, 224, 161, 11, 23, 4, 226, 201, 11, 23, 225, 253, 247, 233, 11, 23,
- 245, 101, 87, 11, 23, 216, 180, 87, 11, 23, 234, 223, 87, 11, 23, 225,
- 134, 87, 11, 23, 223, 38, 87, 11, 23, 225, 109, 87, 11, 32, 6, 254, 143,
- 11, 32, 6, 252, 26, 11, 32, 6, 243, 107, 11, 32, 6, 248, 54, 11, 32, 6,
- 245, 100, 11, 32, 6, 210, 85, 11, 32, 6, 245, 63, 11, 32, 6, 216, 179,
- 11, 32, 6, 235, 185, 11, 32, 6, 234, 222, 11, 32, 6, 233, 98, 11, 32, 6,
- 230, 102, 11, 32, 6, 227, 237, 11, 32, 6, 211, 157, 11, 32, 6, 226, 199,
- 11, 32, 6, 225, 108, 11, 32, 6, 223, 37, 11, 32, 6, 216, 180, 87, 11, 32,
- 6, 219, 177, 11, 32, 6, 217, 41, 11, 32, 6, 214, 157, 11, 32, 6, 225,
- 133, 11, 32, 6, 250, 110, 11, 32, 6, 224, 161, 11, 32, 6, 226, 201, 11,
- 32, 229, 221, 11, 32, 4, 254, 143, 11, 32, 4, 252, 26, 11, 32, 4, 243,
- 107, 11, 32, 4, 248, 54, 11, 32, 4, 245, 100, 11, 32, 4, 210, 85, 11, 32,
- 4, 245, 63, 11, 32, 4, 216, 179, 11, 32, 4, 235, 185, 11, 32, 4, 234,
- 222, 11, 32, 4, 233, 98, 11, 32, 4, 230, 102, 11, 32, 4, 227, 237, 11,
- 32, 4, 211, 157, 11, 32, 4, 226, 199, 11, 32, 4, 225, 108, 11, 32, 4,
- 223, 37, 11, 32, 4, 40, 219, 177, 11, 32, 4, 219, 177, 11, 32, 4, 217,
- 41, 11, 32, 4, 214, 157, 11, 32, 4, 225, 133, 11, 32, 4, 250, 110, 11,
- 32, 4, 224, 161, 11, 32, 4, 226, 201, 11, 32, 225, 253, 247, 233, 11, 32,
- 245, 101, 87, 11, 32, 216, 180, 87, 11, 32, 234, 223, 87, 11, 32, 225,
- 134, 87, 11, 32, 223, 38, 87, 11, 32, 225, 109, 87, 11, 23, 32, 6, 254,
- 143, 11, 23, 32, 6, 252, 26, 11, 23, 32, 6, 243, 107, 11, 23, 32, 6, 248,
- 54, 11, 23, 32, 6, 245, 100, 11, 23, 32, 6, 210, 85, 11, 23, 32, 6, 245,
- 63, 11, 23, 32, 6, 216, 179, 11, 23, 32, 6, 235, 185, 11, 23, 32, 6, 234,
- 222, 11, 23, 32, 6, 233, 98, 11, 23, 32, 6, 230, 102, 11, 23, 32, 6, 227,
- 237, 11, 23, 32, 6, 211, 157, 11, 23, 32, 6, 226, 199, 11, 23, 32, 6,
- 225, 108, 11, 23, 32, 6, 223, 37, 11, 23, 32, 6, 216, 180, 87, 11, 23,
- 32, 6, 219, 177, 11, 23, 32, 6, 217, 41, 11, 23, 32, 6, 214, 157, 11, 23,
- 32, 6, 225, 133, 11, 23, 32, 6, 250, 110, 11, 23, 32, 6, 224, 161, 11,
- 23, 32, 6, 226, 201, 11, 23, 32, 229, 221, 11, 23, 32, 4, 254, 143, 11,
- 23, 32, 4, 252, 26, 11, 23, 32, 4, 243, 107, 11, 23, 32, 4, 248, 54, 11,
- 23, 32, 4, 245, 100, 11, 23, 32, 4, 210, 85, 11, 23, 32, 4, 245, 63, 11,
- 23, 32, 4, 216, 179, 11, 23, 32, 4, 235, 185, 11, 23, 32, 4, 234, 222,
- 11, 23, 32, 4, 233, 98, 11, 23, 32, 4, 230, 102, 11, 23, 32, 4, 227, 237,
- 11, 23, 32, 4, 211, 157, 11, 23, 32, 4, 226, 199, 11, 23, 32, 4, 225,
- 108, 11, 23, 32, 4, 223, 37, 11, 23, 32, 4, 40, 219, 177, 11, 23, 32, 4,
- 219, 177, 11, 23, 32, 4, 217, 41, 11, 23, 32, 4, 214, 157, 11, 23, 32, 4,
- 225, 133, 11, 23, 32, 4, 250, 110, 11, 23, 32, 4, 224, 161, 11, 23, 32,
- 4, 226, 201, 11, 23, 32, 225, 253, 247, 233, 11, 23, 32, 245, 101, 87,
- 11, 23, 32, 216, 180, 87, 11, 23, 32, 234, 223, 87, 11, 23, 32, 225, 134,
- 87, 11, 23, 32, 223, 38, 87, 11, 23, 32, 225, 109, 87, 11, 35, 23, 6,
- 254, 143, 11, 35, 23, 6, 252, 26, 11, 35, 23, 6, 243, 107, 11, 35, 23, 6,
- 248, 54, 11, 35, 23, 6, 245, 100, 11, 35, 23, 6, 210, 85, 11, 35, 23, 6,
- 245, 63, 11, 35, 23, 6, 216, 179, 11, 35, 23, 6, 235, 185, 11, 35, 23, 6,
- 234, 222, 11, 35, 23, 6, 233, 98, 11, 35, 23, 6, 230, 102, 11, 35, 23, 6,
- 227, 237, 11, 35, 23, 6, 211, 157, 11, 35, 23, 6, 226, 199, 11, 35, 23,
- 6, 225, 108, 11, 35, 23, 6, 223, 37, 11, 35, 23, 6, 216, 180, 87, 11, 35,
- 23, 6, 219, 177, 11, 35, 23, 6, 217, 41, 11, 35, 23, 6, 214, 157, 11, 35,
- 23, 6, 225, 133, 11, 35, 23, 6, 250, 110, 11, 35, 23, 6, 224, 161, 11,
- 35, 23, 6, 226, 201, 11, 35, 23, 229, 221, 11, 35, 23, 4, 254, 143, 11,
- 35, 23, 4, 252, 26, 11, 35, 23, 4, 243, 107, 11, 35, 23, 4, 248, 54, 11,
- 35, 23, 4, 245, 100, 11, 35, 23, 4, 210, 85, 11, 35, 23, 4, 245, 63, 11,
- 35, 23, 4, 216, 179, 11, 35, 23, 4, 235, 185, 11, 35, 23, 4, 234, 222,
- 11, 35, 23, 4, 233, 98, 11, 35, 23, 4, 230, 102, 11, 35, 23, 4, 227, 237,
- 11, 35, 23, 4, 211, 157, 11, 35, 23, 4, 226, 199, 11, 35, 23, 4, 225,
- 108, 11, 35, 23, 4, 223, 37, 11, 35, 23, 4, 40, 219, 177, 11, 35, 23, 4,
- 219, 177, 11, 35, 23, 4, 217, 41, 11, 35, 23, 4, 214, 157, 11, 35, 23, 4,
- 225, 133, 11, 35, 23, 4, 250, 110, 11, 35, 23, 4, 224, 161, 11, 35, 23,
- 4, 226, 201, 11, 35, 23, 225, 253, 247, 233, 11, 35, 23, 245, 101, 87,
- 11, 35, 23, 216, 180, 87, 11, 35, 23, 234, 223, 87, 11, 35, 23, 225, 134,
- 87, 11, 35, 23, 223, 38, 87, 11, 35, 23, 225, 109, 87, 11, 35, 23, 32, 6,
- 254, 143, 11, 35, 23, 32, 6, 252, 26, 11, 35, 23, 32, 6, 243, 107, 11,
- 35, 23, 32, 6, 248, 54, 11, 35, 23, 32, 6, 245, 100, 11, 35, 23, 32, 6,
- 210, 85, 11, 35, 23, 32, 6, 245, 63, 11, 35, 23, 32, 6, 216, 179, 11, 35,
- 23, 32, 6, 235, 185, 11, 35, 23, 32, 6, 234, 222, 11, 35, 23, 32, 6, 233,
- 98, 11, 35, 23, 32, 6, 230, 102, 11, 35, 23, 32, 6, 227, 237, 11, 35, 23,
- 32, 6, 211, 157, 11, 35, 23, 32, 6, 226, 199, 11, 35, 23, 32, 6, 225,
- 108, 11, 35, 23, 32, 6, 223, 37, 11, 35, 23, 32, 6, 216, 180, 87, 11, 35,
- 23, 32, 6, 219, 177, 11, 35, 23, 32, 6, 217, 41, 11, 35, 23, 32, 6, 214,
- 157, 11, 35, 23, 32, 6, 225, 133, 11, 35, 23, 32, 6, 250, 110, 11, 35,
- 23, 32, 6, 224, 161, 11, 35, 23, 32, 6, 226, 201, 11, 35, 23, 32, 229,
- 221, 11, 35, 23, 32, 4, 254, 143, 11, 35, 23, 32, 4, 252, 26, 11, 35, 23,
- 32, 4, 243, 107, 11, 35, 23, 32, 4, 248, 54, 11, 35, 23, 32, 4, 245, 100,
- 11, 35, 23, 32, 4, 210, 85, 11, 35, 23, 32, 4, 245, 63, 11, 35, 23, 32,
- 4, 216, 179, 11, 35, 23, 32, 4, 235, 185, 11, 35, 23, 32, 4, 234, 222,
- 11, 35, 23, 32, 4, 233, 98, 11, 35, 23, 32, 4, 230, 102, 11, 35, 23, 32,
- 4, 227, 237, 11, 35, 23, 32, 4, 211, 157, 11, 35, 23, 32, 4, 226, 199,
- 11, 35, 23, 32, 4, 225, 108, 11, 35, 23, 32, 4, 223, 37, 11, 35, 23, 32,
- 4, 40, 219, 177, 11, 35, 23, 32, 4, 219, 177, 11, 35, 23, 32, 4, 217, 41,
- 11, 35, 23, 32, 4, 214, 157, 11, 35, 23, 32, 4, 225, 133, 11, 35, 23, 32,
- 4, 250, 110, 11, 35, 23, 32, 4, 224, 161, 11, 35, 23, 32, 4, 226, 201,
- 11, 35, 23, 32, 225, 253, 247, 233, 11, 35, 23, 32, 245, 101, 87, 11, 35,
- 23, 32, 216, 180, 87, 11, 35, 23, 32, 234, 223, 87, 11, 35, 23, 32, 225,
- 134, 87, 11, 35, 23, 32, 223, 38, 87, 11, 35, 23, 32, 225, 109, 87, 11,
- 23, 6, 247, 227, 11, 23, 4, 247, 227, 11, 23, 21, 210, 86, 11, 23, 21,
- 110, 11, 23, 21, 105, 11, 23, 21, 158, 11, 23, 21, 161, 11, 23, 21, 189,
- 11, 23, 21, 194, 11, 23, 21, 198, 11, 23, 21, 195, 11, 23, 21, 200, 11,
- 139, 21, 210, 86, 11, 139, 21, 110, 11, 139, 21, 105, 11, 139, 21, 158,
- 11, 139, 21, 161, 11, 139, 21, 189, 11, 139, 21, 194, 11, 139, 21, 198,
- 11, 139, 21, 195, 11, 139, 21, 200, 11, 35, 21, 210, 86, 11, 35, 21, 110,
- 11, 35, 21, 105, 11, 35, 21, 158, 11, 35, 21, 161, 11, 35, 21, 189, 11,
- 35, 21, 194, 11, 35, 21, 198, 11, 35, 21, 195, 11, 35, 21, 200, 11, 35,
- 23, 21, 210, 86, 11, 35, 23, 21, 110, 11, 35, 23, 21, 105, 11, 35, 23,
- 21, 158, 11, 35, 23, 21, 161, 11, 35, 23, 21, 189, 11, 35, 23, 21, 194,
- 11, 35, 23, 21, 198, 11, 35, 23, 21, 195, 11, 35, 23, 21, 200, 11, 230,
- 138, 21, 210, 86, 11, 230, 138, 21, 110, 11, 230, 138, 21, 105, 11, 230,
- 138, 21, 158, 11, 230, 138, 21, 161, 11, 230, 138, 21, 189, 11, 230, 138,
- 21, 194, 11, 230, 138, 21, 198, 11, 230, 138, 21, 195, 11, 230, 138, 21,
- 200, 10, 11, 254, 170, 10, 11, 252, 54, 10, 11, 235, 123, 10, 11, 248,
- 195, 10, 11, 212, 30, 10, 11, 210, 108, 10, 11, 242, 37, 10, 11, 217, 80,
- 10, 11, 211, 43, 10, 11, 234, 250, 10, 11, 233, 102, 10, 11, 231, 78, 10,
- 11, 228, 62, 10, 11, 221, 166, 10, 11, 254, 196, 10, 11, 244, 142, 10,
- 11, 222, 26, 10, 11, 224, 81, 10, 11, 223, 95, 10, 11, 220, 59, 10, 11,
- 217, 7, 10, 11, 216, 192, 10, 11, 234, 129, 10, 11, 216, 202, 10, 11,
- 248, 216, 10, 11, 210, 111, 10, 11, 242, 244, 10, 11, 247, 119, 252, 54,
- 10, 11, 247, 119, 228, 62, 10, 11, 247, 119, 244, 142, 10, 11, 247, 119,
- 224, 81, 10, 11, 65, 252, 54, 10, 11, 65, 235, 123, 10, 11, 65, 241, 218,
- 10, 11, 65, 242, 37, 10, 11, 65, 211, 43, 10, 11, 65, 234, 250, 10, 11,
- 65, 233, 102, 10, 11, 65, 231, 78, 10, 11, 65, 228, 62, 10, 11, 65, 221,
- 166, 10, 11, 65, 254, 196, 10, 11, 65, 244, 142, 10, 11, 65, 222, 26, 10,
- 11, 65, 224, 81, 10, 11, 65, 220, 59, 10, 11, 65, 217, 7, 10, 11, 65,
- 216, 192, 10, 11, 65, 234, 129, 10, 11, 65, 248, 216, 10, 11, 65, 242,
- 244, 10, 11, 217, 76, 235, 123, 10, 11, 217, 76, 242, 37, 10, 11, 217,
- 76, 211, 43, 10, 11, 217, 76, 233, 102, 10, 11, 217, 76, 228, 62, 10, 11,
- 217, 76, 221, 166, 10, 11, 217, 76, 254, 196, 10, 11, 217, 76, 222, 26,
- 10, 11, 217, 76, 224, 81, 10, 11, 217, 76, 220, 59, 10, 11, 217, 76, 234,
- 129, 10, 11, 217, 76, 248, 216, 10, 11, 217, 76, 242, 244, 10, 11, 217,
- 76, 247, 119, 228, 62, 10, 11, 217, 76, 247, 119, 224, 81, 10, 11, 218,
- 110, 252, 54, 10, 11, 218, 110, 235, 123, 10, 11, 218, 110, 241, 218, 10,
- 11, 218, 110, 242, 37, 10, 11, 218, 110, 217, 80, 10, 11, 218, 110, 211,
- 43, 10, 11, 218, 110, 234, 250, 10, 11, 218, 110, 231, 78, 10, 11, 218,
- 110, 228, 62, 10, 11, 218, 110, 221, 166, 10, 11, 218, 110, 254, 196, 10,
- 11, 218, 110, 244, 142, 10, 11, 218, 110, 222, 26, 10, 11, 218, 110, 224,
- 81, 10, 11, 218, 110, 220, 59, 10, 11, 218, 110, 217, 7, 10, 11, 218,
- 110, 216, 192, 10, 11, 218, 110, 234, 129, 10, 11, 218, 110, 248, 216,
- 10, 11, 218, 110, 210, 111, 10, 11, 218, 110, 242, 244, 10, 11, 218, 110,
- 247, 119, 252, 54, 10, 11, 218, 110, 247, 119, 244, 142, 10, 11, 232,
- 122, 254, 170, 10, 11, 232, 122, 252, 54, 10, 11, 232, 122, 235, 123, 10,
- 11, 232, 122, 248, 195, 10, 11, 232, 122, 241, 218, 10, 11, 232, 122,
- 212, 30, 10, 11, 232, 122, 210, 108, 10, 11, 232, 122, 242, 37, 10, 11,
- 232, 122, 217, 80, 10, 11, 232, 122, 211, 43, 10, 11, 232, 122, 233, 102,
- 10, 11, 232, 122, 231, 78, 10, 11, 232, 122, 228, 62, 10, 11, 232, 122,
- 221, 166, 10, 11, 232, 122, 254, 196, 10, 11, 232, 122, 244, 142, 10, 11,
- 232, 122, 222, 26, 10, 11, 232, 122, 224, 81, 10, 11, 232, 122, 223, 95,
- 10, 11, 232, 122, 220, 59, 10, 11, 232, 122, 217, 7, 10, 11, 232, 122,
- 216, 192, 10, 11, 232, 122, 234, 129, 10, 11, 232, 122, 216, 202, 10, 11,
- 232, 122, 248, 216, 10, 11, 232, 122, 210, 111, 10, 11, 232, 122, 242,
- 244, 10, 11, 139, 252, 54, 10, 11, 139, 235, 123, 10, 11, 139, 248, 195,
- 10, 11, 139, 212, 30, 10, 11, 139, 210, 108, 10, 11, 139, 242, 37, 10,
- 11, 139, 217, 80, 10, 11, 139, 211, 43, 10, 11, 139, 233, 102, 10, 11,
- 139, 231, 78, 10, 11, 139, 228, 62, 10, 11, 139, 221, 166, 10, 11, 139,
- 254, 196, 10, 11, 139, 244, 142, 10, 11, 139, 222, 26, 10, 11, 139, 224,
- 81, 10, 11, 139, 223, 95, 10, 11, 139, 220, 59, 10, 11, 139, 217, 7, 10,
- 11, 139, 216, 192, 10, 11, 139, 234, 129, 10, 11, 139, 216, 202, 10, 11,
- 139, 248, 216, 10, 11, 139, 210, 111, 10, 11, 139, 242, 244, 10, 11, 226,
- 168, 66, 2, 122, 2, 217, 43, 10, 11, 226, 168, 122, 2, 248, 195, 231,
- 205, 86, 245, 220, 211, 239, 231, 205, 86, 219, 28, 211, 239, 231, 205,
- 86, 212, 9, 211, 239, 231, 205, 86, 228, 56, 211, 239, 231, 205, 86, 223,
- 111, 246, 96, 231, 205, 86, 242, 127, 246, 96, 231, 205, 86, 71, 246, 96,
- 231, 205, 86, 123, 64, 250, 141, 231, 205, 86, 113, 64, 250, 141, 231,
- 205, 86, 134, 64, 250, 141, 231, 205, 86, 244, 11, 64, 250, 141, 231,
- 205, 86, 244, 81, 64, 250, 141, 231, 205, 86, 219, 125, 64, 250, 141,
- 231, 205, 86, 220, 122, 64, 250, 141, 231, 205, 86, 245, 193, 64, 250,
- 141, 231, 205, 86, 228, 200, 64, 250, 141, 231, 205, 86, 123, 64, 252,
- 153, 231, 205, 86, 113, 64, 252, 153, 231, 205, 86, 134, 64, 252, 153,
- 231, 205, 86, 244, 11, 64, 252, 153, 231, 205, 86, 244, 81, 64, 252, 153,
- 231, 205, 86, 219, 125, 64, 252, 153, 231, 205, 86, 220, 122, 64, 252,
- 153, 231, 205, 86, 245, 193, 64, 252, 153, 231, 205, 86, 228, 200, 64,
- 252, 153, 231, 205, 86, 123, 64, 250, 34, 231, 205, 86, 113, 64, 250, 34,
- 231, 205, 86, 134, 64, 250, 34, 231, 205, 86, 244, 11, 64, 250, 34, 231,
- 205, 86, 244, 81, 64, 250, 34, 231, 205, 86, 219, 125, 64, 250, 34, 231,
- 205, 86, 220, 122, 64, 250, 34, 231, 205, 86, 245, 193, 64, 250, 34, 231,
- 205, 86, 228, 200, 64, 250, 34, 231, 205, 86, 225, 25, 231, 205, 86, 226,
- 156, 231, 205, 86, 252, 154, 231, 205, 86, 250, 70, 231, 205, 86, 218,
- 239, 231, 205, 86, 218, 39, 231, 205, 86, 253, 179, 231, 205, 86, 211,
- 232, 231, 205, 86, 235, 62, 231, 205, 86, 252, 184, 131, 86, 203, 252,
- 184, 131, 86, 241, 43, 131, 86, 241, 42, 131, 86, 241, 41, 131, 86, 241,
- 40, 131, 86, 241, 39, 131, 86, 241, 38, 131, 86, 241, 37, 131, 86, 241,
- 36, 131, 86, 241, 35, 131, 86, 241, 34, 131, 86, 241, 33, 131, 86, 241,
- 32, 131, 86, 241, 31, 131, 86, 241, 30, 131, 86, 241, 29, 131, 86, 241,
- 28, 131, 86, 241, 27, 131, 86, 241, 26, 131, 86, 241, 25, 131, 86, 241,
- 24, 131, 86, 241, 23, 131, 86, 241, 22, 131, 86, 241, 21, 131, 86, 241,
- 20, 131, 86, 241, 19, 131, 86, 241, 18, 131, 86, 241, 17, 131, 86, 241,
- 16, 131, 86, 241, 15, 131, 86, 241, 14, 131, 86, 241, 13, 131, 86, 241,
- 12, 131, 86, 241, 11, 131, 86, 241, 10, 131, 86, 241, 9, 131, 86, 241, 8,
- 131, 86, 241, 7, 131, 86, 241, 6, 131, 86, 241, 5, 131, 86, 241, 4, 131,
- 86, 241, 3, 131, 86, 241, 2, 131, 86, 241, 1, 131, 86, 241, 0, 131, 86,
- 240, 255, 131, 86, 240, 254, 131, 86, 240, 253, 131, 86, 240, 252, 131,
- 86, 240, 251, 131, 86, 67, 252, 184, 131, 86, 213, 238, 131, 86, 213,
- 237, 131, 86, 213, 236, 131, 86, 213, 235, 131, 86, 213, 234, 131, 86,
- 213, 233, 131, 86, 213, 232, 131, 86, 213, 231, 131, 86, 213, 230, 131,
- 86, 213, 229, 131, 86, 213, 228, 131, 86, 213, 227, 131, 86, 213, 226,
- 131, 86, 213, 225, 131, 86, 213, 224, 131, 86, 213, 223, 131, 86, 213,
- 222, 131, 86, 213, 221, 131, 86, 213, 220, 131, 86, 213, 219, 131, 86,
- 213, 218, 131, 86, 213, 217, 131, 86, 213, 216, 131, 86, 213, 215, 131,
- 86, 213, 214, 131, 86, 213, 213, 131, 86, 213, 212, 131, 86, 213, 211,
- 131, 86, 213, 210, 131, 86, 213, 209, 131, 86, 213, 208, 131, 86, 213,
- 207, 131, 86, 213, 206, 131, 86, 213, 205, 131, 86, 213, 204, 131, 86,
- 213, 203, 131, 86, 213, 202, 131, 86, 213, 201, 131, 86, 213, 200, 131,
- 86, 213, 199, 131, 86, 213, 198, 131, 86, 213, 197, 131, 86, 213, 196,
- 131, 86, 213, 195, 131, 86, 213, 194, 131, 86, 213, 193, 131, 86, 213,
- 192, 131, 86, 213, 191, 131, 86, 213, 190, 225, 33, 250, 243, 252, 184,
- 225, 33, 250, 243, 255, 9, 64, 219, 15, 225, 33, 250, 243, 113, 64, 219,
- 15, 225, 33, 250, 243, 134, 64, 219, 15, 225, 33, 250, 243, 244, 11, 64,
- 219, 15, 225, 33, 250, 243, 244, 81, 64, 219, 15, 225, 33, 250, 243, 219,
- 125, 64, 219, 15, 225, 33, 250, 243, 220, 122, 64, 219, 15, 225, 33, 250,
- 243, 245, 193, 64, 219, 15, 225, 33, 250, 243, 228, 200, 64, 219, 15,
- 225, 33, 250, 243, 216, 248, 64, 219, 15, 225, 33, 250, 243, 235, 139,
- 64, 219, 15, 225, 33, 250, 243, 234, 31, 64, 219, 15, 225, 33, 250, 243,
- 224, 15, 64, 219, 15, 225, 33, 250, 243, 234, 79, 64, 219, 15, 225, 33,
- 250, 243, 255, 9, 64, 241, 225, 225, 33, 250, 243, 113, 64, 241, 225,
- 225, 33, 250, 243, 134, 64, 241, 225, 225, 33, 250, 243, 244, 11, 64,
- 241, 225, 225, 33, 250, 243, 244, 81, 64, 241, 225, 225, 33, 250, 243,
- 219, 125, 64, 241, 225, 225, 33, 250, 243, 220, 122, 64, 241, 225, 225,
- 33, 250, 243, 245, 193, 64, 241, 225, 225, 33, 250, 243, 228, 200, 64,
- 241, 225, 225, 33, 250, 243, 216, 248, 64, 241, 225, 225, 33, 250, 243,
- 235, 139, 64, 241, 225, 225, 33, 250, 243, 234, 31, 64, 241, 225, 225,
- 33, 250, 243, 224, 15, 64, 241, 225, 225, 33, 250, 243, 234, 79, 64, 241,
- 225, 225, 33, 250, 243, 255, 9, 64, 247, 247, 225, 33, 250, 243, 113, 64,
- 247, 247, 225, 33, 250, 243, 134, 64, 247, 247, 225, 33, 250, 243, 244,
- 11, 64, 247, 247, 225, 33, 250, 243, 244, 81, 64, 247, 247, 225, 33, 250,
- 243, 219, 125, 64, 247, 247, 225, 33, 250, 243, 220, 122, 64, 247, 247,
- 225, 33, 250, 243, 245, 193, 64, 247, 247, 225, 33, 250, 243, 228, 200,
- 64, 247, 247, 225, 33, 250, 243, 216, 248, 64, 247, 247, 225, 33, 250,
- 243, 235, 139, 64, 247, 247, 225, 33, 250, 243, 234, 31, 64, 247, 247,
- 225, 33, 250, 243, 224, 15, 64, 247, 247, 225, 33, 250, 243, 234, 79, 64,
- 247, 247, 225, 33, 250, 243, 85, 235, 62, 225, 33, 250, 243, 255, 9, 64,
- 249, 242, 225, 33, 250, 243, 113, 64, 249, 242, 225, 33, 250, 243, 134,
- 64, 249, 242, 225, 33, 250, 243, 244, 11, 64, 249, 242, 225, 33, 250,
- 243, 244, 81, 64, 249, 242, 225, 33, 250, 243, 219, 125, 64, 249, 242,
- 225, 33, 250, 243, 220, 122, 64, 249, 242, 225, 33, 250, 243, 245, 193,
- 64, 249, 242, 225, 33, 250, 243, 228, 200, 64, 249, 242, 225, 33, 250,
- 243, 216, 248, 64, 249, 242, 225, 33, 250, 243, 235, 139, 64, 249, 242,
- 225, 33, 250, 243, 234, 31, 64, 249, 242, 225, 33, 250, 243, 224, 15, 64,
- 249, 242, 225, 33, 250, 243, 234, 79, 64, 249, 242, 225, 33, 250, 243,
- 71, 235, 62, 21, 210, 87, 243, 229, 218, 129, 21, 210, 87, 249, 219, 21,
- 123, 249, 219, 21, 113, 249, 219, 21, 134, 249, 219, 21, 244, 11, 249,
- 219, 21, 244, 81, 249, 219, 21, 219, 125, 249, 219, 21, 220, 122, 249,
- 219, 21, 245, 193, 249, 219, 21, 228, 200, 249, 219, 88, 7, 6, 1, 61, 88,
- 7, 6, 1, 253, 158, 88, 7, 6, 1, 251, 66, 88, 7, 6, 1, 249, 60, 88, 7, 6,
- 1, 75, 88, 7, 6, 1, 245, 6, 88, 7, 6, 1, 243, 202, 88, 7, 6, 1, 242, 60,
- 88, 7, 6, 1, 73, 88, 7, 6, 1, 235, 144, 88, 7, 6, 1, 235, 23, 88, 7, 6,
- 1, 156, 88, 7, 6, 1, 193, 88, 7, 6, 1, 230, 25, 88, 7, 6, 1, 76, 88, 7,
- 6, 1, 226, 105, 88, 7, 6, 1, 224, 96, 88, 7, 6, 1, 153, 88, 7, 6, 1, 222,
- 91, 88, 7, 6, 1, 217, 152, 88, 7, 6, 1, 70, 88, 7, 6, 1, 214, 105, 88, 7,
- 6, 1, 212, 98, 88, 7, 6, 1, 211, 178, 88, 7, 6, 1, 211, 117, 88, 7, 6, 1,
- 210, 159, 216, 6, 220, 53, 251, 157, 7, 6, 1, 222, 91, 37, 32, 7, 6, 1,
- 251, 66, 37, 32, 7, 6, 1, 153, 37, 250, 191, 37, 211, 180, 92, 7, 6, 1,
- 61, 92, 7, 6, 1, 253, 158, 92, 7, 6, 1, 251, 66, 92, 7, 6, 1, 249, 60,
- 92, 7, 6, 1, 75, 92, 7, 6, 1, 245, 6, 92, 7, 6, 1, 243, 202, 92, 7, 6, 1,
- 242, 60, 92, 7, 6, 1, 73, 92, 7, 6, 1, 235, 144, 92, 7, 6, 1, 235, 23,
- 92, 7, 6, 1, 156, 92, 7, 6, 1, 193, 92, 7, 6, 1, 230, 25, 92, 7, 6, 1,
- 76, 92, 7, 6, 1, 226, 105, 92, 7, 6, 1, 224, 96, 92, 7, 6, 1, 153, 92, 7,
- 6, 1, 222, 91, 92, 7, 6, 1, 217, 152, 92, 7, 6, 1, 70, 92, 7, 6, 1, 214,
- 105, 92, 7, 6, 1, 212, 98, 92, 7, 6, 1, 211, 178, 92, 7, 6, 1, 211, 117,
- 92, 7, 6, 1, 210, 159, 92, 240, 201, 92, 230, 49, 92, 221, 183, 92, 218,
- 226, 92, 224, 218, 92, 212, 23, 152, 37, 7, 6, 1, 61, 152, 37, 7, 6, 1,
- 253, 158, 152, 37, 7, 6, 1, 251, 66, 152, 37, 7, 6, 1, 249, 60, 152, 37,
- 7, 6, 1, 75, 152, 37, 7, 6, 1, 245, 6, 152, 37, 7, 6, 1, 243, 202, 152,
- 37, 7, 6, 1, 242, 60, 152, 37, 7, 6, 1, 73, 152, 37, 7, 6, 1, 235, 144,
- 152, 37, 7, 6, 1, 235, 23, 152, 37, 7, 6, 1, 156, 152, 37, 7, 6, 1, 193,
- 152, 37, 7, 6, 1, 230, 25, 152, 37, 7, 6, 1, 76, 152, 37, 7, 6, 1, 226,
- 105, 152, 37, 7, 6, 1, 224, 96, 152, 37, 7, 6, 1, 153, 152, 37, 7, 6, 1,
- 222, 91, 152, 37, 7, 6, 1, 217, 152, 152, 37, 7, 6, 1, 70, 152, 37, 7, 6,
- 1, 214, 105, 152, 37, 7, 6, 1, 212, 98, 152, 37, 7, 6, 1, 211, 178, 152,
- 37, 7, 6, 1, 211, 117, 152, 37, 7, 6, 1, 210, 159, 223, 157, 231, 97, 50,
- 223, 157, 231, 94, 50, 152, 92, 7, 6, 1, 61, 152, 92, 7, 6, 1, 253, 158,
- 152, 92, 7, 6, 1, 251, 66, 152, 92, 7, 6, 1, 249, 60, 152, 92, 7, 6, 1,
- 75, 152, 92, 7, 6, 1, 245, 6, 152, 92, 7, 6, 1, 243, 202, 152, 92, 7, 6,
- 1, 242, 60, 152, 92, 7, 6, 1, 73, 152, 92, 7, 6, 1, 235, 144, 152, 92, 7,
- 6, 1, 235, 23, 152, 92, 7, 6, 1, 156, 152, 92, 7, 6, 1, 193, 152, 92, 7,
- 6, 1, 230, 25, 152, 92, 7, 6, 1, 76, 152, 92, 7, 6, 1, 226, 105, 152, 92,
- 7, 6, 1, 224, 96, 152, 92, 7, 6, 1, 153, 152, 92, 7, 6, 1, 222, 91, 152,
- 92, 7, 6, 1, 217, 152, 152, 92, 7, 6, 1, 70, 152, 92, 7, 6, 1, 214, 105,
- 152, 92, 7, 6, 1, 212, 98, 152, 92, 7, 6, 1, 211, 178, 152, 92, 7, 6, 1,
- 211, 117, 152, 92, 7, 6, 1, 210, 159, 249, 128, 152, 92, 7, 6, 1, 226,
- 105, 152, 92, 240, 113, 152, 92, 190, 152, 92, 206, 152, 92, 255, 25,
- 152, 92, 212, 23, 42, 247, 164, 92, 250, 23, 92, 249, 170, 92, 243, 252,
- 92, 240, 105, 92, 229, 86, 92, 229, 79, 92, 226, 214, 92, 219, 35, 92,
- 120, 2, 245, 31, 78, 92, 213, 119, 223, 103, 235, 239, 16, 1, 61, 223,
- 103, 235, 239, 16, 1, 253, 158, 223, 103, 235, 239, 16, 1, 251, 66, 223,
- 103, 235, 239, 16, 1, 249, 60, 223, 103, 235, 239, 16, 1, 75, 223, 103,
- 235, 239, 16, 1, 245, 6, 223, 103, 235, 239, 16, 1, 243, 202, 223, 103,
- 235, 239, 16, 1, 242, 60, 223, 103, 235, 239, 16, 1, 73, 223, 103, 235,
- 239, 16, 1, 235, 144, 223, 103, 235, 239, 16, 1, 235, 23, 223, 103, 235,
- 239, 16, 1, 156, 223, 103, 235, 239, 16, 1, 193, 223, 103, 235, 239, 16,
- 1, 230, 25, 223, 103, 235, 239, 16, 1, 76, 223, 103, 235, 239, 16, 1,
- 226, 105, 223, 103, 235, 239, 16, 1, 224, 96, 223, 103, 235, 239, 16, 1,
- 153, 223, 103, 235, 239, 16, 1, 222, 91, 223, 103, 235, 239, 16, 1, 217,
- 152, 223, 103, 235, 239, 16, 1, 70, 223, 103, 235, 239, 16, 1, 214, 105,
- 223, 103, 235, 239, 16, 1, 212, 98, 223, 103, 235, 239, 16, 1, 211, 178,
- 223, 103, 235, 239, 16, 1, 211, 117, 223, 103, 235, 239, 16, 1, 210, 159,
- 42, 141, 241, 63, 92, 56, 234, 18, 92, 56, 206, 92, 9, 214, 177, 238, 50,
- 92, 9, 214, 177, 238, 54, 92, 9, 214, 177, 238, 62, 92, 56, 248, 90, 92,
- 9, 214, 177, 238, 69, 92, 9, 214, 177, 238, 56, 92, 9, 214, 177, 238, 28,
- 92, 9, 214, 177, 238, 55, 92, 9, 214, 177, 238, 68, 92, 9, 214, 177, 238,
- 42, 92, 9, 214, 177, 238, 35, 92, 9, 214, 177, 238, 44, 92, 9, 214, 177,
- 238, 65, 92, 9, 214, 177, 238, 51, 92, 9, 214, 177, 238, 67, 92, 9, 214,
- 177, 238, 43, 92, 9, 214, 177, 238, 66, 92, 9, 214, 177, 238, 29, 92, 9,
- 214, 177, 238, 34, 92, 9, 214, 177, 238, 27, 92, 9, 214, 177, 238, 57,
- 92, 9, 214, 177, 238, 59, 92, 9, 214, 177, 238, 37, 92, 9, 214, 177, 238,
- 48, 92, 9, 214, 177, 238, 46, 92, 9, 214, 177, 238, 72, 92, 9, 214, 177,
- 238, 71, 92, 9, 214, 177, 238, 25, 92, 9, 214, 177, 238, 52, 92, 9, 214,
- 177, 238, 70, 92, 9, 214, 177, 238, 61, 92, 9, 214, 177, 238, 47, 92, 9,
- 214, 177, 238, 26, 92, 9, 214, 177, 238, 49, 92, 9, 214, 177, 238, 31,
- 92, 9, 214, 177, 238, 30, 92, 9, 214, 177, 238, 60, 92, 9, 214, 177, 238,
- 38, 92, 9, 214, 177, 238, 40, 92, 9, 214, 177, 238, 41, 92, 9, 214, 177,
- 238, 33, 92, 9, 214, 177, 238, 64, 92, 9, 214, 177, 238, 58, 216, 6, 220,
- 53, 251, 157, 9, 214, 177, 238, 39, 216, 6, 220, 53, 251, 157, 9, 214,
- 177, 238, 71, 216, 6, 220, 53, 251, 157, 9, 214, 177, 238, 69, 216, 6,
- 220, 53, 251, 157, 9, 214, 177, 238, 53, 216, 6, 220, 53, 251, 157, 9,
- 214, 177, 238, 36, 216, 6, 220, 53, 251, 157, 9, 214, 177, 238, 49, 216,
- 6, 220, 53, 251, 157, 9, 214, 177, 238, 32, 216, 6, 220, 53, 251, 157, 9,
- 214, 177, 238, 63, 216, 6, 220, 53, 251, 157, 9, 214, 177, 238, 45, 37,
- 154, 254, 245, 37, 154, 255, 12, 249, 71, 244, 42, 250, 0, 214, 194, 228,
- 213, 2, 218, 153, 218, 33, 117, 230, 114, 218, 32, 250, 26, 253, 207,
- 246, 54, 218, 31, 117, 251, 118, 223, 158, 251, 140, 253, 207, 228, 212,
- 212, 41, 212, 35, 213, 131, 230, 195, 212, 25, 245, 224, 242, 181, 245,
- 45, 245, 224, 242, 181, 254, 128, 245, 224, 242, 181, 253, 225, 242, 181,
- 2, 231, 51, 166, 230, 129, 87, 212, 27, 249, 137, 230, 129, 87, 244, 92,
- 224, 22, 230, 129, 87, 212, 27, 242, 210, 230, 129, 87, 243, 229, 230,
- 129, 87, 212, 52, 242, 210, 230, 129, 87, 233, 80, 224, 22, 230, 129, 87,
- 212, 52, 249, 137, 230, 129, 87, 249, 137, 230, 128, 166, 230, 129, 2,
- 244, 190, 244, 92, 224, 22, 230, 129, 2, 244, 190, 233, 80, 224, 22, 230,
- 129, 2, 244, 190, 243, 229, 230, 129, 2, 244, 190, 218, 38, 2, 244, 190,
- 242, 179, 218, 156, 219, 255, 218, 156, 250, 116, 221, 168, 245, 39, 215,
- 235, 248, 84, 215, 235, 226, 59, 215, 235, 251, 27, 215, 109, 250, 118,
- 251, 210, 222, 191, 241, 179, 218, 36, 251, 210, 245, 228, 64, 231, 194,
- 245, 228, 64, 223, 31, 241, 204, 244, 11, 233, 54, 249, 246, 231, 170,
- 233, 53, 244, 176, 233, 53, 233, 54, 244, 47, 236, 0, 211, 239, 230, 58,
- 216, 34, 253, 191, 242, 143, 231, 67, 212, 39, 217, 57, 233, 26, 252,
- 149, 225, 62, 223, 111, 254, 54, 242, 127, 254, 54, 225, 217, 225, 218,
- 250, 119, 218, 114, 242, 23, 219, 90, 64, 225, 44, 231, 87, 226, 197,
- 251, 194, 224, 229, 233, 36, 223, 32, 249, 142, 223, 32, 252, 159, 249,
- 173, 223, 31, 249, 95, 22, 223, 31, 218, 141, 251, 167, 219, 14, 251,
- 151, 243, 251, 243, 247, 222, 207, 217, 246, 224, 231, 248, 175, 226,
- 236, 218, 7, 243, 248, 219, 230, 244, 91, 251, 21, 2, 217, 239, 248, 35,
- 219, 52, 240, 112, 249, 141, 220, 70, 240, 111, 240, 112, 249, 141, 246,
- 108, 249, 172, 250, 84, 130, 250, 254, 232, 141, 249, 88, 241, 55, 224,
- 233, 219, 240, 252, 36, 251, 163, 224, 234, 64, 244, 33, 249, 171, 244,
- 24, 22, 234, 32, 217, 19, 211, 230, 242, 13, 222, 12, 251, 177, 22, 249,
- 102, 211, 237, 242, 184, 249, 235, 242, 184, 215, 193, 246, 90, 252, 62,
- 230, 93, 250, 7, 252, 62, 230, 92, 252, 187, 251, 176, 223, 33, 211, 201,
- 224, 195, 251, 235, 251, 20, 235, 138, 250, 77, 215, 235, 244, 162, 250,
- 76, 244, 94, 244, 95, 219, 12, 252, 158, 225, 250, 224, 244, 249, 204,
- 252, 159, 217, 59, 215, 235, 249, 128, 244, 67, 225, 63, 248, 81, 235,
- 131, 247, 131, 250, 232, 218, 113, 211, 240, 250, 98, 230, 129, 213, 164,
- 250, 162, 221, 199, 221, 224, 242, 148, 250, 251, 250, 233, 240, 245,
- 244, 130, 212, 0, 222, 200, 249, 236, 244, 86, 225, 2, 22, 244, 90, 230,
- 227, 230, 108, 251, 10, 250, 39, 241, 232, 253, 241, 226, 62, 216, 14,
- 241, 251, 250, 29, 216, 242, 216, 113, 250, 20, 251, 202, 225, 177, 253,
- 240, 213, 172, 243, 110, 247, 197, 241, 156, 219, 84, 231, 234, 251, 245,
- 243, 111, 247, 240, 251, 166, 244, 52, 225, 33, 250, 241, 28, 228, 47,
- 230, 85, 28, 228, 42, 221, 212, 242, 99, 28, 234, 137, 215, 190, 213,
- 154, 28, 221, 192, 222, 124, 220, 11, 2, 221, 227, 216, 244, 223, 178,
- 22, 252, 159, 219, 105, 22, 219, 105, 251, 187, 252, 123, 22, 241, 49,
- 250, 120, 244, 73, 219, 63, 222, 125, 218, 12, 215, 194, 240, 246, 223,
- 179, 254, 129, 244, 31, 222, 136, 244, 31, 217, 241, 240, 235, 251, 119,
- 240, 235, 2, 243, 94, 226, 229, 251, 119, 235, 131, 224, 239, 226, 228,
- 245, 44, 224, 239, 226, 228, 240, 244, 252, 145, 253, 181, 216, 252, 231,
- 234, 240, 240, 232, 111, 240, 240, 249, 176, 218, 125, 221, 198, 248, 43,
- 218, 125, 244, 180, 235, 149, 233, 89, 235, 131, 250, 226, 245, 44, 250,
- 226, 223, 141, 230, 112, 226, 114, 212, 41, 251, 123, 249, 145, 216, 106,
- 233, 18, 223, 180, 250, 224, 246, 96, 249, 135, 212, 3, 219, 70, 219, 68,
- 240, 245, 223, 153, 242, 170, 220, 57, 230, 145, 222, 194, 250, 108, 247,
- 136, 225, 73, 251, 203, 245, 169, 226, 238, 218, 252, 220, 52, 251, 122,
- 254, 92, 241, 54, 233, 121, 252, 60, 244, 90, 215, 193, 244, 90, 251,
- 209, 215, 91, 241, 249, 250, 109, 252, 187, 250, 109, 243, 242, 252, 187,
- 250, 109, 251, 237, 225, 195, 234, 26, 224, 248, 246, 87, 251, 11, 252,
- 177, 251, 11, 247, 130, 230, 113, 244, 190, 249, 146, 244, 190, 216, 107,
- 244, 190, 223, 181, 244, 190, 250, 225, 244, 190, 246, 97, 244, 190, 218,
- 241, 212, 3, 240, 246, 244, 190, 230, 146, 244, 190, 247, 137, 244, 190,
- 225, 74, 244, 190, 243, 245, 244, 190, 242, 20, 244, 190, 211, 224, 244,
- 190, 252, 71, 244, 190, 226, 45, 244, 190, 225, 74, 228, 53, 225, 232,
- 224, 186, 245, 13, 245, 227, 228, 53, 230, 110, 216, 19, 71, 120, 225, 7,
- 252, 182, 235, 242, 71, 124, 225, 7, 252, 182, 235, 242, 71, 43, 225, 7,
- 252, 182, 235, 242, 71, 44, 225, 7, 252, 182, 235, 242, 244, 84, 242, 16,
- 50, 212, 33, 242, 16, 50, 226, 215, 242, 16, 50, 216, 135, 120, 50, 216,
- 135, 124, 50, 250, 19, 242, 11, 50, 204, 242, 11, 50, 249, 123, 211, 220,
- 241, 251, 245, 14, 229, 104, 217, 151, 235, 125, 246, 92, 234, 82, 251,
- 247, 211, 220, 249, 249, 224, 127, 242, 14, 224, 230, 231, 177, 220, 4,
- 253, 203, 220, 4, 241, 164, 220, 4, 211, 220, 221, 240, 211, 220, 251,
- 186, 244, 29, 251, 90, 236, 0, 219, 169, 251, 89, 236, 0, 219, 169, 251,
- 162, 242, 194, 231, 185, 211, 221, 244, 174, 231, 186, 22, 211, 222, 241,
- 60, 242, 10, 113, 231, 59, 241, 60, 242, 10, 113, 211, 219, 241, 60, 242,
- 10, 224, 255, 226, 227, 211, 222, 2, 251, 106, 245, 225, 251, 141, 2,
- 213, 246, 225, 168, 2, 251, 212, 242, 34, 231, 186, 2, 242, 110, 225,
- 109, 231, 174, 231, 186, 2, 215, 97, 226, 208, 231, 185, 226, 208, 211,
- 221, 252, 186, 249, 190, 211, 205, 224, 189, 235, 131, 226, 223, 235,
- 131, 242, 169, 242, 222, 252, 187, 254, 113, 245, 18, 254, 160, 254, 161,
- 230, 136, 236, 5, 219, 100, 235, 232, 248, 34, 225, 167, 242, 105, 248,
- 179, 232, 201, 229, 211, 224, 254, 244, 191, 231, 142, 242, 33, 252, 138,
- 225, 1, 217, 171, 225, 66, 234, 64, 78, 232, 111, 233, 10, 222, 233, 243,
- 54, 218, 131, 234, 63, 251, 171, 249, 148, 2, 241, 227, 212, 19, 252, 69,
- 241, 227, 251, 135, 241, 227, 113, 241, 225, 219, 10, 241, 227, 242, 120,
- 241, 227, 241, 228, 2, 74, 251, 208, 241, 227, 242, 127, 241, 227, 211,
- 42, 241, 227, 224, 128, 241, 227, 241, 228, 2, 223, 33, 223, 44, 241,
- 225, 241, 228, 248, 81, 247, 249, 220, 82, 2, 115, 59, 235, 215, 245,
- 172, 192, 251, 116, 254, 112, 87, 251, 195, 219, 92, 87, 249, 228, 87,
- 218, 246, 217, 248, 87, 246, 85, 248, 157, 87, 225, 67, 64, 224, 249,
- 244, 61, 252, 3, 247, 165, 87, 219, 3, 252, 158, 216, 149, 252, 158, 71,
- 244, 51, 240, 211, 225, 5, 87, 230, 149, 252, 172, 249, 98, 245, 32, 114,
- 247, 132, 50, 249, 139, 250, 242, 252, 144, 2, 211, 40, 50, 252, 144, 2,
- 247, 132, 50, 252, 144, 2, 245, 47, 50, 252, 144, 2, 224, 228, 50, 230,
- 149, 2, 211, 235, 250, 138, 2, 214, 153, 215, 231, 22, 211, 40, 50, 221,
- 178, 225, 166, 249, 208, 251, 139, 230, 186, 244, 56, 247, 185, 226, 161,
- 247, 190, 246, 49, 244, 107, 244, 40, 204, 244, 107, 244, 40, 226, 76, 2,
- 249, 100, 226, 76, 244, 183, 214, 163, 251, 16, 217, 18, 251, 16, 250,
- 243, 235, 242, 250, 138, 2, 214, 153, 215, 230, 250, 138, 2, 246, 104,
- 215, 230, 252, 141, 250, 137, 250, 6, 224, 123, 222, 185, 224, 123, 226,
- 19, 218, 121, 222, 131, 215, 222, 222, 131, 251, 191, 217, 91, 233, 51,
- 228, 45, 228, 46, 2, 248, 80, 249, 147, 250, 0, 251, 192, 204, 251, 192,
- 242, 127, 251, 192, 251, 208, 251, 192, 226, 157, 251, 192, 251, 189,
- 229, 205, 252, 175, 221, 186, 231, 60, 217, 1, 223, 123, 226, 74, 244,
- 159, 231, 234, 221, 223, 254, 89, 224, 145, 254, 252, 232, 113, 250, 127,
- 231, 72, 226, 129, 215, 238, 235, 252, 215, 238, 226, 82, 246, 24, 87,
- 235, 249, 245, 119, 245, 120, 2, 246, 104, 80, 48, 250, 0, 231, 200, 2,
- 232, 107, 244, 73, 250, 0, 231, 200, 2, 223, 157, 244, 73, 204, 231, 200,
- 2, 223, 157, 244, 73, 204, 231, 200, 2, 232, 107, 244, 73, 224, 236, 224,
- 237, 240, 248, 229, 84, 230, 159, 225, 117, 230, 159, 225, 118, 2, 97,
- 80, 253, 207, 233, 46, 213, 175, 230, 158, 230, 159, 225, 118, 226, 230,
- 228, 75, 230, 159, 225, 116, 254, 90, 2, 252, 129, 251, 10, 213, 172,
- 251, 10, 216, 254, 223, 173, 213, 171, 215, 60, 97, 253, 247, 250, 2, 97,
- 22, 140, 204, 250, 36, 253, 247, 250, 2, 97, 22, 140, 204, 250, 36, 253,
- 248, 2, 37, 123, 226, 120, 250, 2, 246, 104, 22, 214, 153, 204, 250, 36,
- 253, 247, 254, 88, 246, 104, 22, 214, 153, 204, 250, 36, 253, 247, 121,
- 251, 138, 87, 125, 251, 138, 87, 219, 7, 2, 251, 4, 91, 219, 6, 219, 7,
- 2, 123, 219, 31, 212, 35, 219, 7, 2, 134, 219, 31, 212, 34, 252, 115,
- 245, 172, 225, 27, 233, 42, 231, 211, 242, 184, 222, 247, 231, 211, 242,
- 184, 232, 152, 2, 235, 225, 225, 199, 250, 0, 232, 152, 2, 234, 138, 234,
- 138, 232, 151, 204, 232, 151, 252, 44, 252, 45, 2, 251, 4, 91, 251, 190,
- 232, 204, 87, 223, 174, 251, 86, 252, 185, 2, 140, 80, 48, 245, 143, 2,
- 140, 80, 48, 226, 197, 2, 245, 31, 164, 2, 43, 44, 80, 48, 219, 39, 2,
- 97, 80, 48, 216, 14, 2, 214, 153, 80, 48, 228, 75, 123, 214, 184, 245,
- 191, 87, 234, 136, 216, 247, 235, 219, 16, 31, 7, 6, 233, 9, 235, 219,
- 16, 31, 7, 4, 233, 9, 235, 219, 16, 31, 227, 199, 235, 219, 16, 31, 217,
- 183, 235, 219, 16, 31, 7, 233, 9, 244, 96, 245, 172, 216, 9, 211, 199,
- 242, 21, 227, 182, 22, 251, 197, 241, 66, 225, 50, 230, 226, 216, 255,
- 249, 114, 252, 159, 219, 125, 225, 9, 218, 157, 2, 230, 224, 247, 120,
- 235, 131, 16, 31, 252, 57, 215, 220, 245, 156, 85, 42, 251, 86, 71, 42,
- 251, 86, 233, 85, 223, 111, 250, 35, 233, 85, 251, 208, 250, 35, 233, 85,
- 226, 157, 247, 248, 233, 85, 251, 208, 247, 248, 4, 226, 157, 247, 248,
- 4, 251, 208, 247, 248, 214, 162, 223, 111, 215, 225, 246, 105, 223, 111,
- 215, 225, 214, 162, 4, 223, 111, 215, 225, 246, 105, 4, 223, 111, 215,
- 225, 37, 249, 131, 224, 252, 249, 131, 224, 253, 2, 242, 26, 51, 249,
- 131, 224, 252, 228, 49, 43, 220, 153, 2, 134, 247, 118, 250, 4, 244, 191,
- 123, 226, 242, 250, 4, 244, 191, 113, 226, 242, 250, 4, 244, 191, 134,
- 226, 242, 250, 4, 244, 191, 244, 11, 226, 242, 250, 4, 244, 191, 244, 81,
- 226, 242, 250, 4, 244, 191, 219, 125, 226, 242, 250, 4, 244, 191, 220,
- 122, 226, 242, 250, 4, 244, 191, 245, 193, 226, 242, 250, 4, 244, 191,
- 228, 200, 226, 242, 250, 4, 244, 191, 216, 248, 226, 242, 250, 4, 244,
- 191, 245, 168, 226, 242, 250, 4, 244, 191, 215, 77, 226, 242, 250, 4,
- 244, 191, 226, 192, 250, 4, 244, 191, 215, 56, 250, 4, 244, 191, 216,
- 140, 250, 4, 244, 191, 244, 7, 250, 4, 244, 191, 244, 79, 250, 4, 244,
- 191, 219, 121, 250, 4, 244, 191, 220, 121, 250, 4, 244, 191, 245, 192,
- 250, 4, 244, 191, 228, 199, 250, 4, 244, 191, 216, 246, 250, 4, 244, 191,
- 245, 166, 250, 4, 244, 191, 215, 75, 230, 117, 243, 230, 216, 36, 216, 2,
- 218, 148, 64, 232, 239, 219, 170, 64, 235, 132, 230, 106, 242, 124, 244,
- 190, 242, 124, 244, 191, 2, 219, 74, 245, 13, 244, 191, 2, 217, 14, 64,
- 235, 53, 219, 74, 244, 191, 2, 204, 230, 110, 219, 74, 244, 191, 2, 204,
- 230, 111, 22, 219, 74, 245, 13, 219, 74, 244, 191, 2, 204, 230, 111, 22,
- 249, 230, 217, 247, 219, 74, 244, 191, 2, 204, 230, 111, 22, 216, 104,
- 245, 13, 219, 74, 244, 191, 2, 242, 25, 219, 74, 244, 191, 2, 240, 247,
- 211, 233, 244, 190, 219, 74, 244, 191, 2, 219, 74, 245, 13, 244, 191,
- 221, 217, 248, 62, 244, 33, 223, 88, 244, 190, 219, 74, 244, 191, 2, 241,
- 226, 245, 13, 219, 74, 244, 191, 2, 218, 34, 219, 73, 244, 190, 229, 87,
- 244, 190, 245, 23, 244, 190, 214, 188, 244, 190, 244, 191, 2, 249, 230,
- 217, 247, 225, 192, 244, 190, 249, 201, 244, 190, 249, 202, 244, 190,
- 234, 62, 244, 190, 244, 191, 216, 137, 115, 234, 63, 234, 62, 244, 191,
- 2, 219, 74, 245, 13, 234, 62, 244, 191, 2, 250, 0, 245, 13, 244, 191, 2,
- 218, 88, 216, 19, 244, 191, 2, 218, 88, 216, 20, 22, 211, 233, 245, 15,
- 244, 191, 2, 218, 88, 216, 20, 22, 216, 104, 245, 13, 247, 192, 244, 190,
- 211, 204, 244, 190, 254, 108, 244, 190, 224, 227, 244, 190, 249, 116,
- 244, 190, 225, 170, 244, 190, 244, 191, 2, 232, 126, 64, 215, 204, 247,
- 192, 251, 88, 223, 88, 244, 190, 243, 239, 244, 191, 2, 204, 230, 110,
- 254, 106, 244, 190, 244, 152, 244, 190, 212, 20, 244, 190, 219, 91, 244,
- 190, 216, 71, 244, 190, 242, 125, 244, 190, 232, 114, 249, 116, 244, 190,
- 244, 191, 2, 204, 230, 110, 240, 203, 244, 190, 244, 191, 2, 204, 230,
- 111, 22, 249, 230, 217, 247, 244, 191, 221, 190, 236, 0, 244, 153, 253,
- 213, 244, 190, 244, 49, 244, 190, 219, 92, 244, 190, 247, 165, 244, 190,
- 244, 191, 211, 230, 230, 110, 244, 191, 2, 231, 84, 231, 144, 242, 124,
- 250, 225, 244, 191, 2, 219, 74, 245, 13, 250, 225, 244, 191, 2, 217, 14,
- 64, 235, 53, 219, 74, 250, 225, 244, 191, 2, 204, 230, 110, 219, 74, 250,
- 225, 244, 191, 2, 241, 226, 245, 13, 250, 225, 244, 191, 2, 211, 196,
- 219, 75, 234, 62, 250, 225, 244, 191, 2, 250, 0, 245, 13, 224, 227, 250,
- 225, 244, 190, 249, 116, 250, 225, 244, 190, 212, 20, 250, 225, 244, 190,
- 244, 191, 2, 228, 75, 242, 163, 243, 34, 244, 191, 2, 226, 215, 243, 34,
- 225, 168, 251, 168, 248, 75, 221, 169, 230, 145, 241, 229, 230, 145, 219,
- 8, 230, 145, 242, 5, 225, 168, 223, 156, 123, 242, 15, 225, 168, 223,
- 156, 251, 178, 242, 11, 236, 0, 250, 179, 225, 168, 243, 238, 225, 168,
- 2, 224, 227, 244, 190, 225, 168, 2, 244, 41, 242, 10, 222, 203, 241, 214,
- 218, 143, 232, 149, 223, 162, 250, 244, 241, 162, 215, 248, 241, 162,
- 215, 249, 2, 251, 114, 228, 53, 215, 248, 231, 32, 192, 223, 163, 218,
- 149, 215, 246, 215, 247, 250, 244, 251, 92, 226, 194, 251, 92, 215, 201,
- 251, 93, 218, 129, 230, 187, 254, 130, 244, 97, 245, 137, 224, 255, 250,
- 244, 226, 194, 224, 255, 250, 244, 217, 32, 226, 194, 217, 32, 253, 180,
- 226, 194, 253, 180, 223, 118, 213, 247, 248, 58, 215, 192, 253, 242, 232,
- 117, 215, 254, 230, 139, 230, 116, 223, 161, 218, 6, 223, 161, 230, 116,
- 251, 28, 254, 229, 215, 245, 220, 16, 222, 182, 219, 1, 203, 215, 252,
- 232, 230, 67, 215, 252, 232, 230, 249, 190, 50, 224, 255, 250, 229, 223,
- 44, 232, 230, 215, 222, 244, 74, 226, 197, 224, 238, 247, 123, 228, 75,
- 245, 125, 50, 219, 72, 87, 228, 75, 219, 72, 87, 224, 122, 232, 193, 236,
- 0, 235, 157, 225, 41, 87, 247, 146, 228, 52, 232, 193, 87, 224, 232, 212,
- 41, 87, 228, 66, 212, 41, 87, 252, 2, 228, 75, 252, 1, 252, 0, 230, 116,
- 252, 0, 225, 213, 228, 75, 225, 212, 250, 100, 249, 124, 231, 56, 87,
- 211, 218, 87, 223, 59, 252, 187, 87, 216, 37, 212, 41, 249, 253, 219,
- 234, 252, 118, 252, 116, 225, 242, 249, 177, 249, 86, 252, 169, 250, 22,
- 43, 232, 90, 108, 16, 31, 224, 3, 108, 16, 31, 254, 192, 108, 16, 31,
- 244, 96, 108, 16, 31, 245, 223, 108, 16, 31, 212, 40, 108, 16, 31, 254,
- 43, 108, 16, 31, 254, 44, 223, 105, 108, 16, 31, 254, 44, 223, 104, 108,
- 16, 31, 254, 44, 213, 143, 108, 16, 31, 254, 44, 213, 142, 108, 16, 31,
+ 211, 8, 95, 25, 5, 254, 244, 95, 25, 5, 254, 240, 95, 25, 5, 245, 87, 95,
+ 25, 5, 222, 184, 245, 87, 95, 25, 5, 245, 93, 95, 25, 5, 222, 184, 245,
+ 93, 95, 25, 5, 254, 202, 95, 25, 5, 245, 196, 95, 25, 5, 253, 193, 95,
+ 25, 5, 226, 135, 95, 25, 5, 230, 26, 95, 25, 5, 229, 80, 95, 138, 222,
+ 252, 95, 138, 216, 15, 222, 252, 95, 138, 48, 95, 138, 51, 95, 1, 216,
+ 29, 95, 1, 216, 28, 95, 1, 216, 27, 95, 1, 216, 26, 95, 1, 216, 25, 95,
+ 1, 216, 24, 95, 1, 216, 23, 95, 1, 223, 107, 216, 30, 95, 1, 223, 107,
+ 216, 29, 95, 1, 223, 107, 216, 27, 95, 1, 223, 107, 216, 26, 95, 1, 223,
+ 107, 216, 25, 95, 1, 223, 107, 216, 23, 56, 1, 254, 24, 75, 141, 1, 254,
+ 24, 211, 47, 49, 28, 16, 224, 155, 49, 28, 16, 248, 159, 49, 28, 16, 225,
+ 176, 49, 28, 16, 226, 114, 245, 179, 49, 28, 16, 226, 114, 247, 202, 49,
+ 28, 16, 214, 16, 245, 179, 49, 28, 16, 214, 16, 247, 202, 49, 28, 16,
+ 234, 198, 49, 28, 16, 217, 170, 49, 28, 16, 226, 10, 49, 28, 16, 210,
+ 217, 49, 28, 16, 210, 218, 247, 202, 49, 28, 16, 233, 235, 49, 28, 16,
+ 254, 69, 245, 179, 49, 28, 16, 245, 27, 245, 179, 49, 28, 16, 217, 3, 49,
+ 28, 16, 234, 162, 49, 28, 16, 254, 59, 49, 28, 16, 254, 60, 247, 202, 49,
+ 28, 16, 217, 176, 49, 28, 16, 216, 160, 49, 28, 16, 226, 207, 254, 22,
+ 49, 28, 16, 242, 160, 254, 22, 49, 28, 16, 224, 154, 49, 28, 16, 250,
+ 150, 49, 28, 16, 214, 6, 49, 28, 16, 235, 165, 254, 22, 49, 28, 16, 234,
+ 164, 254, 22, 49, 28, 16, 234, 163, 254, 22, 49, 28, 16, 221, 214, 49,
+ 28, 16, 226, 1, 49, 28, 16, 218, 147, 254, 62, 49, 28, 16, 226, 113, 254,
+ 22, 49, 28, 16, 214, 15, 254, 22, 49, 28, 16, 254, 63, 254, 22, 49, 28,
+ 16, 254, 57, 49, 28, 16, 234, 38, 49, 28, 16, 223, 47, 49, 28, 16, 225,
+ 107, 254, 22, 49, 28, 16, 216, 84, 49, 28, 16, 254, 122, 49, 28, 16, 221,
+ 160, 49, 28, 16, 217, 179, 254, 22, 49, 28, 16, 217, 179, 231, 41, 218,
+ 145, 49, 28, 16, 226, 108, 254, 22, 49, 28, 16, 216, 191, 49, 28, 16,
+ 233, 28, 49, 28, 16, 246, 42, 49, 28, 16, 215, 228, 49, 28, 16, 216, 233,
+ 49, 28, 16, 233, 238, 49, 28, 16, 254, 69, 245, 27, 229, 96, 49, 28, 16,
+ 243, 237, 254, 22, 49, 28, 16, 236, 13, 49, 28, 16, 215, 200, 254, 22,
+ 49, 28, 16, 234, 201, 215, 199, 49, 28, 16, 225, 201, 49, 28, 16, 224,
+ 159, 49, 28, 16, 234, 12, 49, 28, 16, 250, 81, 254, 22, 49, 28, 16, 223,
+ 147, 49, 28, 16, 226, 13, 254, 22, 49, 28, 16, 226, 11, 254, 22, 49, 28,
+ 16, 240, 110, 49, 28, 16, 229, 204, 49, 28, 16, 225, 157, 49, 28, 16,
+ 234, 13, 254, 150, 49, 28, 16, 215, 200, 254, 150, 49, 28, 16, 218, 124,
+ 49, 28, 16, 242, 124, 49, 28, 16, 235, 165, 229, 96, 49, 28, 16, 226,
+ 207, 229, 96, 49, 28, 16, 226, 114, 229, 96, 49, 28, 16, 225, 156, 49,
+ 28, 16, 233, 255, 49, 28, 16, 225, 155, 49, 28, 16, 233, 237, 49, 28, 16,
+ 225, 202, 229, 96, 49, 28, 16, 234, 163, 229, 97, 254, 97, 49, 28, 16,
+ 234, 164, 229, 97, 254, 97, 49, 28, 16, 210, 215, 49, 28, 16, 254, 60,
+ 229, 96, 49, 28, 16, 254, 61, 217, 177, 229, 96, 49, 28, 16, 210, 216,
+ 49, 28, 16, 233, 236, 49, 28, 16, 245, 174, 49, 28, 16, 250, 151, 49, 28,
+ 16, 230, 199, 235, 164, 49, 28, 16, 214, 16, 229, 96, 49, 28, 16, 225,
+ 107, 229, 96, 49, 28, 16, 224, 160, 229, 96, 49, 28, 16, 226, 204, 49,
+ 28, 16, 254, 85, 49, 28, 16, 232, 59, 49, 28, 16, 226, 11, 229, 96, 49,
+ 28, 16, 226, 13, 229, 96, 49, 28, 16, 245, 61, 226, 12, 49, 28, 16, 233,
+ 154, 49, 28, 16, 254, 86, 49, 28, 16, 215, 200, 229, 96, 49, 28, 16, 245,
+ 177, 49, 28, 16, 217, 179, 229, 96, 49, 28, 16, 217, 171, 49, 28, 16,
+ 250, 81, 229, 96, 49, 28, 16, 245, 107, 49, 28, 16, 221, 161, 229, 96,
+ 49, 28, 16, 211, 151, 234, 38, 49, 28, 16, 215, 197, 49, 28, 16, 224,
+ 161, 49, 28, 16, 215, 201, 49, 28, 16, 215, 198, 49, 28, 16, 224, 158,
+ 49, 28, 16, 215, 196, 49, 28, 16, 224, 157, 49, 28, 16, 242, 159, 49, 28,
+ 16, 254, 15, 49, 28, 16, 245, 61, 254, 15, 49, 28, 16, 226, 108, 229, 96,
+ 49, 28, 16, 216, 190, 245, 70, 49, 28, 16, 216, 190, 245, 26, 49, 28, 16,
+ 216, 192, 254, 64, 49, 28, 16, 216, 185, 234, 248, 254, 56, 49, 28, 16,
+ 234, 200, 49, 28, 16, 245, 140, 49, 28, 16, 211, 11, 234, 197, 49, 28,
+ 16, 211, 11, 254, 97, 49, 28, 16, 218, 146, 49, 28, 16, 234, 39, 254, 97,
+ 49, 28, 16, 247, 203, 254, 22, 49, 28, 16, 233, 239, 254, 22, 49, 28, 16,
+ 233, 239, 254, 150, 49, 28, 16, 233, 239, 229, 96, 49, 28, 16, 254, 63,
+ 229, 96, 49, 28, 16, 254, 65, 49, 28, 16, 247, 202, 49, 28, 16, 215, 211,
+ 49, 28, 16, 216, 225, 49, 28, 16, 234, 3, 49, 28, 16, 233, 33, 245, 135,
+ 250, 72, 49, 28, 16, 233, 33, 246, 43, 250, 73, 49, 28, 16, 233, 33, 215,
+ 213, 250, 73, 49, 28, 16, 233, 33, 216, 235, 250, 73, 49, 28, 16, 233,
+ 33, 236, 8, 250, 72, 49, 28, 16, 242, 160, 229, 97, 254, 97, 49, 28, 16,
+ 242, 160, 226, 2, 254, 11, 49, 28, 16, 242, 160, 226, 2, 248, 30, 49, 28,
+ 16, 247, 226, 49, 28, 16, 247, 227, 226, 2, 254, 12, 234, 197, 49, 28,
+ 16, 247, 227, 226, 2, 254, 12, 254, 97, 49, 28, 16, 247, 227, 226, 2,
+ 248, 30, 49, 28, 16, 215, 217, 49, 28, 16, 254, 16, 49, 28, 16, 236, 15,
+ 49, 28, 16, 247, 247, 49, 28, 16, 254, 212, 225, 1, 254, 17, 49, 28, 16,
+ 254, 212, 254, 14, 49, 28, 16, 254, 212, 254, 17, 49, 28, 16, 254, 212,
+ 231, 35, 49, 28, 16, 254, 212, 231, 46, 49, 28, 16, 254, 212, 242, 161,
+ 49, 28, 16, 254, 212, 242, 158, 49, 28, 16, 254, 212, 225, 1, 242, 161,
+ 49, 28, 16, 231, 152, 224, 166, 240, 108, 49, 28, 16, 231, 152, 254, 152,
+ 224, 166, 240, 108, 49, 28, 16, 231, 152, 248, 29, 240, 108, 49, 28, 16,
+ 231, 152, 254, 152, 248, 29, 240, 108, 49, 28, 16, 231, 152, 215, 206,
+ 240, 108, 49, 28, 16, 231, 152, 215, 218, 49, 28, 16, 231, 152, 216, 229,
+ 240, 108, 49, 28, 16, 231, 152, 216, 229, 233, 36, 240, 108, 49, 28, 16,
+ 231, 152, 233, 36, 240, 108, 49, 28, 16, 231, 152, 225, 40, 240, 108, 49,
+ 28, 16, 235, 170, 216, 252, 240, 109, 49, 28, 16, 254, 61, 216, 252, 240,
+ 109, 49, 28, 16, 244, 173, 216, 226, 49, 28, 16, 244, 173, 230, 144, 49,
+ 28, 16, 244, 173, 247, 231, 49, 28, 16, 231, 152, 214, 10, 240, 108, 49,
+ 28, 16, 231, 152, 224, 165, 240, 108, 49, 28, 16, 231, 152, 225, 40, 216,
+ 229, 240, 108, 49, 28, 16, 242, 156, 230, 27, 254, 64, 49, 28, 16, 242,
+ 156, 230, 27, 247, 201, 49, 28, 16, 245, 149, 234, 248, 243, 237, 213,
+ 124, 49, 28, 16, 236, 14, 49, 28, 16, 236, 12, 49, 28, 16, 243, 237, 254,
+ 23, 248, 28, 240, 107, 49, 28, 16, 243, 237, 247, 245, 190, 49, 28, 16,
+ 243, 237, 247, 245, 229, 204, 49, 28, 16, 243, 237, 229, 199, 240, 108,
+ 49, 28, 16, 243, 237, 247, 245, 248, 4, 49, 28, 16, 243, 237, 219, 103,
+ 247, 244, 248, 4, 49, 28, 16, 243, 237, 247, 245, 234, 183, 49, 28, 16,
+ 243, 237, 247, 245, 210, 23, 49, 28, 16, 243, 237, 247, 245, 228, 235,
+ 234, 197, 49, 28, 16, 243, 237, 247, 245, 228, 235, 254, 97, 49, 28, 16,
+ 243, 237, 231, 192, 250, 74, 247, 231, 49, 28, 16, 243, 237, 231, 192,
+ 250, 74, 230, 144, 49, 28, 16, 244, 123, 219, 103, 250, 74, 214, 9, 49,
+ 28, 16, 243, 237, 219, 103, 250, 74, 217, 180, 49, 28, 16, 243, 237, 229,
+ 98, 49, 28, 16, 250, 75, 209, 249, 49, 28, 16, 250, 75, 234, 37, 49, 28,
+ 16, 250, 75, 219, 10, 49, 28, 16, 243, 237, 240, 155, 211, 10, 216, 230,
+ 49, 28, 16, 243, 237, 245, 150, 254, 87, 49, 28, 16, 211, 10, 215, 207,
+ 49, 28, 16, 247, 239, 215, 207, 49, 28, 16, 247, 239, 216, 230, 49, 28,
+ 16, 247, 239, 254, 66, 246, 43, 247, 140, 49, 28, 16, 247, 239, 230, 142,
+ 216, 234, 247, 140, 49, 28, 16, 247, 239, 247, 223, 245, 37, 247, 140,
+ 49, 28, 16, 247, 239, 215, 215, 226, 212, 247, 140, 49, 28, 16, 211, 10,
+ 254, 66, 246, 43, 247, 140, 49, 28, 16, 211, 10, 230, 142, 216, 234, 247,
+ 140, 49, 28, 16, 211, 10, 247, 223, 245, 37, 247, 140, 49, 28, 16, 211,
+ 10, 215, 215, 226, 212, 247, 140, 49, 28, 16, 243, 50, 247, 238, 49, 28,
+ 16, 243, 50, 211, 9, 49, 28, 16, 247, 246, 254, 66, 230, 200, 49, 28, 16,
+ 247, 246, 254, 66, 231, 74, 49, 28, 16, 247, 246, 247, 202, 49, 28, 16,
+ 247, 246, 216, 183, 49, 28, 16, 219, 164, 216, 183, 49, 28, 16, 219, 164,
+ 216, 184, 247, 187, 49, 28, 16, 219, 164, 216, 184, 215, 208, 49, 28, 16,
+ 219, 164, 216, 184, 216, 223, 49, 28, 16, 219, 164, 253, 245, 49, 28, 16,
+ 219, 164, 253, 246, 247, 187, 49, 28, 16, 219, 164, 253, 246, 215, 208,
+ 49, 28, 16, 219, 164, 253, 246, 216, 223, 49, 28, 16, 247, 224, 243, 31,
+ 49, 28, 16, 247, 230, 226, 135, 49, 28, 16, 218, 138, 49, 28, 16, 254, 8,
+ 190, 49, 28, 16, 254, 8, 213, 124, 49, 28, 16, 254, 8, 243, 136, 49, 28,
+ 16, 254, 8, 248, 4, 49, 28, 16, 254, 8, 234, 183, 49, 28, 16, 254, 8,
+ 210, 23, 49, 28, 16, 254, 8, 228, 234, 49, 28, 16, 234, 163, 229, 97,
+ 231, 45, 49, 28, 16, 234, 164, 229, 97, 231, 45, 49, 28, 16, 234, 163,
+ 229, 97, 234, 197, 49, 28, 16, 234, 164, 229, 97, 234, 197, 49, 28, 16,
+ 234, 39, 234, 197, 49, 28, 16, 242, 160, 229, 97, 234, 197, 28, 16, 219,
+ 156, 252, 136, 28, 16, 52, 252, 136, 28, 16, 40, 252, 136, 28, 16, 223,
+ 51, 40, 252, 136, 28, 16, 248, 156, 252, 136, 28, 16, 219, 252, 252, 136,
+ 28, 16, 43, 223, 78, 50, 28, 16, 44, 223, 78, 50, 28, 16, 223, 78, 247,
+ 119, 28, 16, 248, 197, 221, 164, 28, 16, 248, 223, 250, 250, 28, 16, 221,
+ 164, 28, 16, 249, 235, 28, 16, 223, 76, 244, 112, 28, 16, 223, 76, 244,
+ 111, 28, 16, 223, 76, 244, 110, 28, 16, 244, 132, 28, 16, 244, 133, 51,
+ 28, 16, 251, 149, 78, 28, 16, 251, 25, 28, 16, 251, 160, 28, 16, 127, 28,
+ 16, 226, 194, 218, 164, 28, 16, 215, 57, 218, 164, 28, 16, 216, 143, 218,
+ 164, 28, 16, 244, 11, 218, 164, 28, 16, 244, 81, 218, 164, 28, 16, 219,
+ 125, 218, 164, 28, 16, 219, 123, 243, 251, 28, 16, 244, 9, 243, 251, 28,
+ 16, 243, 204, 250, 15, 28, 16, 243, 204, 250, 16, 226, 137, 254, 143, 28,
+ 16, 243, 204, 250, 16, 226, 137, 252, 123, 28, 16, 251, 68, 250, 15, 28,
+ 16, 245, 8, 250, 15, 28, 16, 245, 8, 250, 16, 226, 137, 254, 143, 28, 16,
+ 245, 8, 250, 16, 226, 137, 252, 123, 28, 16, 246, 84, 250, 14, 28, 16,
+ 246, 84, 250, 13, 28, 16, 230, 86, 231, 91, 223, 62, 28, 16, 52, 220, 76,
+ 28, 16, 52, 244, 66, 28, 16, 244, 67, 214, 163, 28, 16, 244, 67, 246,
+ 107, 28, 16, 229, 189, 214, 163, 28, 16, 229, 189, 246, 107, 28, 16, 220,
+ 77, 214, 163, 28, 16, 220, 77, 246, 107, 28, 16, 224, 23, 138, 220, 76,
+ 28, 16, 224, 23, 138, 244, 66, 28, 16, 249, 217, 216, 88, 28, 16, 249,
+ 86, 216, 88, 28, 16, 226, 137, 254, 143, 28, 16, 226, 137, 252, 123, 28,
+ 16, 224, 5, 254, 143, 28, 16, 224, 5, 252, 123, 28, 16, 230, 89, 223, 62,
+ 28, 16, 211, 251, 223, 62, 28, 16, 163, 223, 62, 28, 16, 224, 23, 223,
+ 62, 28, 16, 245, 190, 223, 62, 28, 16, 219, 119, 223, 62, 28, 16, 216,
+ 161, 223, 62, 28, 16, 219, 111, 223, 62, 28, 16, 123, 240, 212, 215, 71,
+ 223, 62, 28, 16, 211, 179, 228, 44, 28, 16, 96, 228, 44, 28, 16, 250, 37,
+ 211, 179, 228, 44, 28, 16, 42, 228, 45, 211, 253, 28, 16, 42, 228, 45,
+ 251, 222, 28, 16, 215, 227, 228, 45, 120, 211, 253, 28, 16, 215, 227,
+ 228, 45, 120, 251, 222, 28, 16, 215, 227, 228, 45, 43, 211, 253, 28, 16,
+ 215, 227, 228, 45, 43, 251, 222, 28, 16, 215, 227, 228, 45, 44, 211, 253,
+ 28, 16, 215, 227, 228, 45, 44, 251, 222, 28, 16, 215, 227, 228, 45, 124,
+ 211, 253, 28, 16, 215, 227, 228, 45, 124, 251, 222, 28, 16, 215, 227,
+ 228, 45, 120, 44, 211, 253, 28, 16, 215, 227, 228, 45, 120, 44, 251, 222,
+ 28, 16, 230, 130, 228, 45, 211, 253, 28, 16, 230, 130, 228, 45, 251, 222,
+ 28, 16, 215, 224, 228, 45, 124, 211, 253, 28, 16, 215, 224, 228, 45, 124,
+ 251, 222, 28, 16, 226, 5, 228, 44, 28, 16, 213, 132, 228, 44, 28, 16,
+ 228, 45, 251, 222, 28, 16, 227, 204, 228, 44, 28, 16, 249, 242, 228, 45,
+ 211, 253, 28, 16, 249, 242, 228, 45, 251, 222, 28, 16, 251, 147, 28, 16,
+ 211, 251, 228, 48, 28, 16, 163, 228, 48, 28, 16, 224, 23, 228, 48, 28,
+ 16, 245, 190, 228, 48, 28, 16, 219, 119, 228, 48, 28, 16, 216, 161, 228,
+ 48, 28, 16, 219, 111, 228, 48, 28, 16, 123, 240, 212, 215, 71, 228, 48,
+ 28, 16, 38, 218, 140, 28, 16, 38, 218, 241, 218, 140, 28, 16, 38, 215,
+ 235, 28, 16, 38, 215, 234, 28, 16, 38, 215, 233, 28, 16, 244, 102, 215,
+ 235, 28, 16, 244, 102, 215, 234, 28, 16, 244, 102, 215, 233, 28, 16, 38,
+ 253, 190, 247, 121, 28, 16, 38, 244, 73, 28, 16, 38, 244, 72, 28, 16, 38,
+ 244, 71, 28, 16, 38, 244, 70, 28, 16, 38, 244, 69, 28, 16, 252, 59, 252,
+ 75, 28, 16, 245, 144, 252, 75, 28, 16, 252, 59, 216, 112, 28, 16, 245,
+ 144, 216, 112, 28, 16, 252, 59, 219, 81, 28, 16, 245, 144, 219, 81, 28,
+ 16, 252, 59, 225, 116, 28, 16, 245, 144, 225, 116, 28, 16, 38, 255, 15,
+ 28, 16, 38, 218, 166, 28, 16, 38, 216, 239, 28, 16, 38, 218, 167, 28, 16,
+ 38, 231, 163, 28, 16, 38, 231, 162, 28, 16, 38, 255, 14, 28, 16, 38, 232,
+ 113, 28, 16, 253, 255, 214, 163, 28, 16, 253, 255, 246, 107, 28, 16, 38,
+ 247, 136, 28, 16, 38, 222, 232, 28, 16, 38, 244, 59, 28, 16, 38, 219, 77,
+ 28, 16, 38, 252, 39, 28, 16, 38, 52, 216, 20, 28, 16, 38, 215, 212, 216,
+ 20, 28, 16, 222, 236, 28, 16, 218, 76, 28, 16, 210, 159, 28, 16, 225,
+ 108, 28, 16, 231, 26, 28, 16, 244, 18, 28, 16, 249, 139, 28, 16, 248, 79,
+ 28, 16, 242, 151, 228, 49, 219, 96, 28, 16, 242, 151, 228, 49, 228, 76,
+ 219, 96, 28, 16, 216, 1, 28, 16, 215, 95, 28, 16, 235, 194, 215, 95, 28,
+ 16, 215, 96, 219, 96, 28, 16, 215, 96, 214, 163, 28, 16, 226, 149, 218,
+ 103, 28, 16, 226, 149, 218, 100, 28, 16, 226, 149, 218, 99, 28, 16, 226,
+ 149, 218, 98, 28, 16, 226, 149, 218, 97, 28, 16, 226, 149, 218, 96, 28,
+ 16, 226, 149, 218, 95, 28, 16, 226, 149, 218, 94, 28, 16, 226, 149, 218,
+ 93, 28, 16, 226, 149, 218, 102, 28, 16, 226, 149, 218, 101, 28, 16, 241,
+ 246, 28, 16, 229, 106, 28, 16, 245, 144, 64, 218, 134, 28, 16, 248, 72,
+ 219, 96, 28, 16, 38, 124, 251, 170, 28, 16, 38, 120, 251, 170, 28, 16,
+ 38, 242, 1, 28, 16, 38, 219, 68, 225, 44, 28, 16, 225, 217, 78, 28, 16,
+ 225, 217, 120, 78, 28, 16, 163, 225, 217, 78, 28, 16, 242, 183, 214, 163,
+ 28, 16, 242, 183, 246, 107, 28, 16, 2, 244, 101, 28, 16, 248, 181, 28,
+ 16, 248, 182, 254, 155, 28, 16, 231, 134, 28, 16, 232, 130, 28, 16, 251,
+ 144, 28, 16, 220, 155, 211, 253, 28, 16, 220, 155, 251, 222, 28, 16, 230,
+ 185, 28, 16, 230, 186, 251, 222, 28, 16, 220, 149, 211, 253, 28, 16, 220,
+ 149, 251, 222, 28, 16, 243, 221, 211, 253, 28, 16, 243, 221, 251, 222,
+ 28, 16, 232, 131, 225, 181, 223, 62, 28, 16, 232, 131, 236, 5, 223, 62,
+ 28, 16, 251, 145, 223, 62, 28, 16, 220, 155, 223, 62, 28, 16, 230, 186,
+ 223, 62, 28, 16, 220, 149, 223, 62, 28, 16, 216, 250, 225, 179, 249, 108,
+ 224, 175, 225, 180, 28, 16, 216, 250, 225, 179, 249, 108, 224, 175, 236,
+ 4, 28, 16, 216, 250, 225, 179, 249, 108, 224, 175, 225, 181, 247, 212,
+ 28, 16, 216, 250, 236, 3, 249, 108, 224, 175, 225, 180, 28, 16, 216, 250,
+ 236, 3, 249, 108, 224, 175, 236, 4, 28, 16, 216, 250, 236, 3, 249, 108,
+ 224, 175, 236, 5, 247, 212, 28, 16, 216, 250, 236, 3, 249, 108, 224, 175,
+ 236, 5, 247, 211, 28, 16, 216, 250, 236, 3, 249, 108, 224, 175, 236, 5,
+ 247, 210, 28, 16, 249, 134, 28, 16, 242, 127, 251, 68, 250, 15, 28, 16,
+ 242, 127, 245, 8, 250, 15, 28, 16, 42, 253, 159, 28, 16, 213, 151, 28,
+ 16, 225, 15, 28, 16, 250, 6, 28, 16, 221, 204, 28, 16, 250, 10, 28, 16,
+ 216, 8, 28, 16, 224, 243, 28, 16, 224, 244, 244, 61, 28, 16, 221, 205,
+ 244, 61, 28, 16, 216, 9, 223, 59, 28, 16, 225, 164, 218, 67, 26, 213,
+ 137, 188, 217, 230, 26, 213, 137, 188, 217, 219, 26, 213, 137, 188, 217,
+ 209, 26, 213, 137, 188, 217, 202, 26, 213, 137, 188, 217, 194, 26, 213,
+ 137, 188, 217, 188, 26, 213, 137, 188, 217, 187, 26, 213, 137, 188, 217,
+ 186, 26, 213, 137, 188, 217, 185, 26, 213, 137, 188, 217, 229, 26, 213,
+ 137, 188, 217, 228, 26, 213, 137, 188, 217, 227, 26, 213, 137, 188, 217,
+ 226, 26, 213, 137, 188, 217, 225, 26, 213, 137, 188, 217, 224, 26, 213,
+ 137, 188, 217, 223, 26, 213, 137, 188, 217, 222, 26, 213, 137, 188, 217,
+ 221, 26, 213, 137, 188, 217, 220, 26, 213, 137, 188, 217, 218, 26, 213,
+ 137, 188, 217, 217, 26, 213, 137, 188, 217, 216, 26, 213, 137, 188, 217,
+ 215, 26, 213, 137, 188, 217, 214, 26, 213, 137, 188, 217, 193, 26, 213,
+ 137, 188, 217, 192, 26, 213, 137, 188, 217, 191, 26, 213, 137, 188, 217,
+ 190, 26, 213, 137, 188, 217, 189, 26, 235, 215, 188, 217, 230, 26, 235,
+ 215, 188, 217, 219, 26, 235, 215, 188, 217, 202, 26, 235, 215, 188, 217,
+ 194, 26, 235, 215, 188, 217, 187, 26, 235, 215, 188, 217, 186, 26, 235,
+ 215, 188, 217, 228, 26, 235, 215, 188, 217, 227, 26, 235, 215, 188, 217,
+ 226, 26, 235, 215, 188, 217, 225, 26, 235, 215, 188, 217, 222, 26, 235,
+ 215, 188, 217, 221, 26, 235, 215, 188, 217, 220, 26, 235, 215, 188, 217,
+ 215, 26, 235, 215, 188, 217, 214, 26, 235, 215, 188, 217, 213, 26, 235,
+ 215, 188, 217, 212, 26, 235, 215, 188, 217, 211, 26, 235, 215, 188, 217,
+ 210, 26, 235, 215, 188, 217, 208, 26, 235, 215, 188, 217, 207, 26, 235,
+ 215, 188, 217, 206, 26, 235, 215, 188, 217, 205, 26, 235, 215, 188, 217,
+ 204, 26, 235, 215, 188, 217, 203, 26, 235, 215, 188, 217, 201, 26, 235,
+ 215, 188, 217, 200, 26, 235, 215, 188, 217, 199, 26, 235, 215, 188, 217,
+ 198, 26, 235, 215, 188, 217, 197, 26, 235, 215, 188, 217, 196, 26, 235,
+ 215, 188, 217, 195, 26, 235, 215, 188, 217, 193, 26, 235, 215, 188, 217,
+ 192, 26, 235, 215, 188, 217, 191, 26, 235, 215, 188, 217, 190, 26, 235,
+ 215, 188, 217, 189, 38, 26, 28, 215, 209, 38, 26, 28, 216, 224, 38, 26,
+ 28, 225, 189, 26, 28, 233, 32, 230, 143, 31, 245, 224, 247, 225, 31, 241,
+ 223, 245, 224, 247, 225, 31, 240, 215, 245, 224, 247, 225, 31, 245, 223,
+ 241, 224, 247, 225, 31, 245, 223, 240, 214, 247, 225, 31, 245, 224, 180,
+ 31, 250, 175, 180, 31, 243, 230, 250, 36, 180, 31, 230, 178, 180, 31,
+ 252, 131, 180, 31, 234, 180, 219, 80, 180, 31, 249, 180, 180, 31, 253,
+ 234, 180, 31, 226, 164, 180, 31, 251, 154, 226, 131, 180, 31, 248, 74,
+ 177, 247, 180, 180, 31, 247, 177, 180, 31, 210, 222, 180, 31, 235, 248,
+ 180, 31, 225, 198, 180, 31, 223, 128, 180, 31, 249, 190, 180, 31, 241,
+ 61, 252, 185, 180, 31, 212, 59, 180, 31, 244, 40, 180, 31, 254, 247, 180,
+ 31, 223, 90, 180, 31, 223, 66, 180, 31, 245, 222, 180, 31, 235, 54, 180,
+ 31, 249, 185, 180, 31, 245, 143, 180, 31, 246, 53, 180, 31, 250, 146,
+ 180, 31, 248, 83, 180, 31, 23, 223, 65, 180, 31, 226, 82, 180, 31, 233,
+ 35, 180, 31, 249, 255, 180, 31, 234, 78, 180, 31, 243, 87, 180, 31, 218,
+ 113, 180, 31, 224, 131, 180, 31, 243, 229, 180, 31, 223, 67, 180, 31,
+ 233, 72, 177, 230, 158, 180, 31, 223, 63, 180, 31, 242, 169, 216, 43,
+ 231, 77, 180, 31, 245, 145, 180, 31, 218, 125, 180, 31, 242, 129, 180,
+ 31, 245, 137, 180, 31, 225, 236, 180, 31, 222, 226, 180, 31, 244, 60,
+ 180, 31, 214, 8, 177, 212, 44, 180, 31, 249, 194, 180, 31, 231, 90, 180,
+ 31, 245, 62, 180, 31, 214, 172, 180, 31, 247, 213, 180, 31, 250, 1, 230,
+ 111, 180, 31, 242, 107, 180, 31, 243, 88, 236, 0, 180, 31, 231, 142, 180,
+ 31, 255, 11, 180, 31, 245, 158, 180, 31, 246, 110, 180, 31, 212, 42, 180,
+ 31, 219, 151, 180, 31, 235, 223, 180, 31, 248, 43, 180, 31, 248, 161,
+ 180, 31, 247, 209, 180, 31, 245, 30, 180, 31, 220, 116, 180, 31, 218,
+ 129, 180, 31, 242, 3, 180, 31, 249, 213, 180, 31, 249, 252, 180, 31, 244,
+ 178, 180, 31, 254, 213, 180, 31, 249, 212, 180, 31, 226, 198, 216, 197,
+ 213, 242, 180, 31, 247, 233, 180, 31, 233, 125, 180, 31, 244, 14, 249,
+ 150, 222, 203, 214, 174, 21, 110, 249, 150, 222, 203, 214, 174, 21, 105,
+ 249, 150, 222, 203, 214, 174, 21, 158, 249, 150, 222, 203, 214, 174, 21,
+ 161, 249, 150, 222, 203, 214, 174, 21, 189, 249, 150, 222, 203, 214, 174,
+ 21, 194, 249, 150, 222, 203, 214, 174, 21, 198, 249, 150, 222, 203, 214,
+ 174, 21, 195, 249, 150, 222, 203, 214, 174, 21, 200, 249, 150, 222, 203,
+ 216, 244, 21, 110, 249, 150, 222, 203, 216, 244, 21, 105, 249, 150, 222,
+ 203, 216, 244, 21, 158, 249, 150, 222, 203, 216, 244, 21, 161, 249, 150,
+ 222, 203, 216, 244, 21, 189, 249, 150, 222, 203, 216, 244, 21, 194, 249,
+ 150, 222, 203, 216, 244, 21, 198, 249, 150, 222, 203, 216, 244, 21, 195,
+ 249, 150, 222, 203, 216, 244, 21, 200, 11, 23, 6, 61, 11, 23, 6, 253,
+ 159, 11, 23, 6, 251, 67, 11, 23, 6, 249, 61, 11, 23, 6, 75, 11, 23, 6,
+ 245, 7, 11, 23, 6, 243, 203, 11, 23, 6, 242, 61, 11, 23, 6, 73, 11, 23,
+ 6, 235, 145, 11, 23, 6, 235, 24, 11, 23, 6, 156, 11, 23, 6, 193, 11, 23,
+ 6, 230, 26, 11, 23, 6, 76, 11, 23, 6, 226, 106, 11, 23, 6, 224, 97, 11,
+ 23, 6, 153, 11, 23, 6, 222, 92, 11, 23, 6, 217, 153, 11, 23, 6, 70, 11,
+ 23, 6, 214, 105, 11, 23, 6, 212, 98, 11, 23, 6, 211, 178, 11, 23, 6, 211,
+ 117, 11, 23, 6, 210, 159, 11, 23, 4, 61, 11, 23, 4, 253, 159, 11, 23, 4,
+ 251, 67, 11, 23, 4, 249, 61, 11, 23, 4, 75, 11, 23, 4, 245, 7, 11, 23, 4,
+ 243, 203, 11, 23, 4, 242, 61, 11, 23, 4, 73, 11, 23, 4, 235, 145, 11, 23,
+ 4, 235, 24, 11, 23, 4, 156, 11, 23, 4, 193, 11, 23, 4, 230, 26, 11, 23,
+ 4, 76, 11, 23, 4, 226, 106, 11, 23, 4, 224, 97, 11, 23, 4, 153, 11, 23,
+ 4, 222, 92, 11, 23, 4, 217, 153, 11, 23, 4, 70, 11, 23, 4, 214, 105, 11,
+ 23, 4, 212, 98, 11, 23, 4, 211, 178, 11, 23, 4, 211, 117, 11, 23, 4, 210,
+ 159, 11, 32, 6, 61, 11, 32, 6, 253, 159, 11, 32, 6, 251, 67, 11, 32, 6,
+ 249, 61, 11, 32, 6, 75, 11, 32, 6, 245, 7, 11, 32, 6, 243, 203, 11, 32,
+ 6, 242, 61, 11, 32, 6, 73, 11, 32, 6, 235, 145, 11, 32, 6, 235, 24, 11,
+ 32, 6, 156, 11, 32, 6, 193, 11, 32, 6, 230, 26, 11, 32, 6, 76, 11, 32, 6,
+ 226, 106, 11, 32, 6, 224, 97, 11, 32, 6, 153, 11, 32, 6, 222, 92, 11, 32,
+ 6, 217, 153, 11, 32, 6, 70, 11, 32, 6, 214, 105, 11, 32, 6, 212, 98, 11,
+ 32, 6, 211, 178, 11, 32, 6, 211, 117, 11, 32, 6, 210, 159, 11, 32, 4, 61,
+ 11, 32, 4, 253, 159, 11, 32, 4, 251, 67, 11, 32, 4, 249, 61, 11, 32, 4,
+ 75, 11, 32, 4, 245, 7, 11, 32, 4, 243, 203, 11, 32, 4, 73, 11, 32, 4,
+ 235, 145, 11, 32, 4, 235, 24, 11, 32, 4, 156, 11, 32, 4, 193, 11, 32, 4,
+ 230, 26, 11, 32, 4, 76, 11, 32, 4, 226, 106, 11, 32, 4, 224, 97, 11, 32,
+ 4, 153, 11, 32, 4, 222, 92, 11, 32, 4, 217, 153, 11, 32, 4, 70, 11, 32,
+ 4, 214, 105, 11, 32, 4, 212, 98, 11, 32, 4, 211, 178, 11, 32, 4, 211,
+ 117, 11, 32, 4, 210, 159, 11, 23, 32, 6, 61, 11, 23, 32, 6, 253, 159, 11,
+ 23, 32, 6, 251, 67, 11, 23, 32, 6, 249, 61, 11, 23, 32, 6, 75, 11, 23,
+ 32, 6, 245, 7, 11, 23, 32, 6, 243, 203, 11, 23, 32, 6, 242, 61, 11, 23,
+ 32, 6, 73, 11, 23, 32, 6, 235, 145, 11, 23, 32, 6, 235, 24, 11, 23, 32,
+ 6, 156, 11, 23, 32, 6, 193, 11, 23, 32, 6, 230, 26, 11, 23, 32, 6, 76,
+ 11, 23, 32, 6, 226, 106, 11, 23, 32, 6, 224, 97, 11, 23, 32, 6, 153, 11,
+ 23, 32, 6, 222, 92, 11, 23, 32, 6, 217, 153, 11, 23, 32, 6, 70, 11, 23,
+ 32, 6, 214, 105, 11, 23, 32, 6, 212, 98, 11, 23, 32, 6, 211, 178, 11, 23,
+ 32, 6, 211, 117, 11, 23, 32, 6, 210, 159, 11, 23, 32, 4, 61, 11, 23, 32,
+ 4, 253, 159, 11, 23, 32, 4, 251, 67, 11, 23, 32, 4, 249, 61, 11, 23, 32,
+ 4, 75, 11, 23, 32, 4, 245, 7, 11, 23, 32, 4, 243, 203, 11, 23, 32, 4,
+ 242, 61, 11, 23, 32, 4, 73, 11, 23, 32, 4, 235, 145, 11, 23, 32, 4, 235,
+ 24, 11, 23, 32, 4, 156, 11, 23, 32, 4, 193, 11, 23, 32, 4, 230, 26, 11,
+ 23, 32, 4, 76, 11, 23, 32, 4, 226, 106, 11, 23, 32, 4, 224, 97, 11, 23,
+ 32, 4, 153, 11, 23, 32, 4, 222, 92, 11, 23, 32, 4, 217, 153, 11, 23, 32,
+ 4, 70, 11, 23, 32, 4, 214, 105, 11, 23, 32, 4, 212, 98, 11, 23, 32, 4,
+ 211, 178, 11, 23, 32, 4, 211, 117, 11, 23, 32, 4, 210, 159, 11, 119, 6,
+ 61, 11, 119, 6, 251, 67, 11, 119, 6, 249, 61, 11, 119, 6, 243, 203, 11,
+ 119, 6, 235, 145, 11, 119, 6, 235, 24, 11, 119, 6, 230, 26, 11, 119, 6,
+ 76, 11, 119, 6, 226, 106, 11, 119, 6, 224, 97, 11, 119, 6, 222, 92, 11,
+ 119, 6, 217, 153, 11, 119, 6, 70, 11, 119, 6, 214, 105, 11, 119, 6, 212,
+ 98, 11, 119, 6, 211, 178, 11, 119, 6, 211, 117, 11, 119, 6, 210, 159, 11,
+ 119, 4, 61, 11, 119, 4, 253, 159, 11, 119, 4, 251, 67, 11, 119, 4, 249,
+ 61, 11, 119, 4, 245, 7, 11, 119, 4, 242, 61, 11, 119, 4, 73, 11, 119, 4,
+ 235, 145, 11, 119, 4, 235, 24, 11, 119, 4, 156, 11, 119, 4, 193, 11, 119,
+ 4, 230, 26, 11, 119, 4, 226, 106, 11, 119, 4, 224, 97, 11, 119, 4, 153,
+ 11, 119, 4, 222, 92, 11, 119, 4, 217, 153, 11, 119, 4, 70, 11, 119, 4,
+ 214, 105, 11, 119, 4, 212, 98, 11, 119, 4, 211, 178, 11, 119, 4, 211,
+ 117, 11, 119, 4, 210, 159, 11, 23, 119, 6, 61, 11, 23, 119, 6, 253, 159,
+ 11, 23, 119, 6, 251, 67, 11, 23, 119, 6, 249, 61, 11, 23, 119, 6, 75, 11,
+ 23, 119, 6, 245, 7, 11, 23, 119, 6, 243, 203, 11, 23, 119, 6, 242, 61,
+ 11, 23, 119, 6, 73, 11, 23, 119, 6, 235, 145, 11, 23, 119, 6, 235, 24,
+ 11, 23, 119, 6, 156, 11, 23, 119, 6, 193, 11, 23, 119, 6, 230, 26, 11,
+ 23, 119, 6, 76, 11, 23, 119, 6, 226, 106, 11, 23, 119, 6, 224, 97, 11,
+ 23, 119, 6, 153, 11, 23, 119, 6, 222, 92, 11, 23, 119, 6, 217, 153, 11,
+ 23, 119, 6, 70, 11, 23, 119, 6, 214, 105, 11, 23, 119, 6, 212, 98, 11,
+ 23, 119, 6, 211, 178, 11, 23, 119, 6, 211, 117, 11, 23, 119, 6, 210, 159,
+ 11, 23, 119, 4, 61, 11, 23, 119, 4, 253, 159, 11, 23, 119, 4, 251, 67,
+ 11, 23, 119, 4, 249, 61, 11, 23, 119, 4, 75, 11, 23, 119, 4, 245, 7, 11,
+ 23, 119, 4, 243, 203, 11, 23, 119, 4, 242, 61, 11, 23, 119, 4, 73, 11,
+ 23, 119, 4, 235, 145, 11, 23, 119, 4, 235, 24, 11, 23, 119, 4, 156, 11,
+ 23, 119, 4, 193, 11, 23, 119, 4, 230, 26, 11, 23, 119, 4, 76, 11, 23,
+ 119, 4, 226, 106, 11, 23, 119, 4, 224, 97, 11, 23, 119, 4, 153, 11, 23,
+ 119, 4, 222, 92, 11, 23, 119, 4, 217, 153, 11, 23, 119, 4, 70, 11, 23,
+ 119, 4, 214, 105, 11, 23, 119, 4, 212, 98, 11, 23, 119, 4, 211, 178, 11,
+ 23, 119, 4, 211, 117, 11, 23, 119, 4, 210, 159, 11, 133, 6, 61, 11, 133,
+ 6, 253, 159, 11, 133, 6, 249, 61, 11, 133, 6, 75, 11, 133, 6, 245, 7, 11,
+ 133, 6, 243, 203, 11, 133, 6, 235, 145, 11, 133, 6, 235, 24, 11, 133, 6,
+ 156, 11, 133, 6, 193, 11, 133, 6, 230, 26, 11, 133, 6, 76, 11, 133, 6,
+ 226, 106, 11, 133, 6, 224, 97, 11, 133, 6, 222, 92, 11, 133, 6, 217, 153,
+ 11, 133, 6, 70, 11, 133, 6, 214, 105, 11, 133, 6, 212, 98, 11, 133, 6,
+ 211, 178, 11, 133, 6, 211, 117, 11, 133, 4, 61, 11, 133, 4, 253, 159, 11,
+ 133, 4, 251, 67, 11, 133, 4, 249, 61, 11, 133, 4, 75, 11, 133, 4, 245, 7,
+ 11, 133, 4, 243, 203, 11, 133, 4, 242, 61, 11, 133, 4, 73, 11, 133, 4,
+ 235, 145, 11, 133, 4, 235, 24, 11, 133, 4, 156, 11, 133, 4, 193, 11, 133,
+ 4, 230, 26, 11, 133, 4, 76, 11, 133, 4, 226, 106, 11, 133, 4, 224, 97,
+ 11, 133, 4, 153, 11, 133, 4, 222, 92, 11, 133, 4, 217, 153, 11, 133, 4,
+ 70, 11, 133, 4, 214, 105, 11, 133, 4, 212, 98, 11, 133, 4, 211, 178, 11,
+ 133, 4, 211, 117, 11, 133, 4, 210, 159, 11, 139, 6, 61, 11, 139, 6, 253,
+ 159, 11, 139, 6, 249, 61, 11, 139, 6, 75, 11, 139, 6, 245, 7, 11, 139, 6,
+ 243, 203, 11, 139, 6, 73, 11, 139, 6, 235, 145, 11, 139, 6, 235, 24, 11,
+ 139, 6, 156, 11, 139, 6, 193, 11, 139, 6, 76, 11, 139, 6, 222, 92, 11,
+ 139, 6, 217, 153, 11, 139, 6, 70, 11, 139, 6, 214, 105, 11, 139, 6, 212,
+ 98, 11, 139, 6, 211, 178, 11, 139, 6, 211, 117, 11, 139, 4, 61, 11, 139,
+ 4, 253, 159, 11, 139, 4, 251, 67, 11, 139, 4, 249, 61, 11, 139, 4, 75,
+ 11, 139, 4, 245, 7, 11, 139, 4, 243, 203, 11, 139, 4, 242, 61, 11, 139,
+ 4, 73, 11, 139, 4, 235, 145, 11, 139, 4, 235, 24, 11, 139, 4, 156, 11,
+ 139, 4, 193, 11, 139, 4, 230, 26, 11, 139, 4, 76, 11, 139, 4, 226, 106,
+ 11, 139, 4, 224, 97, 11, 139, 4, 153, 11, 139, 4, 222, 92, 11, 139, 4,
+ 217, 153, 11, 139, 4, 70, 11, 139, 4, 214, 105, 11, 139, 4, 212, 98, 11,
+ 139, 4, 211, 178, 11, 139, 4, 211, 117, 11, 139, 4, 210, 159, 11, 23,
+ 133, 6, 61, 11, 23, 133, 6, 253, 159, 11, 23, 133, 6, 251, 67, 11, 23,
+ 133, 6, 249, 61, 11, 23, 133, 6, 75, 11, 23, 133, 6, 245, 7, 11, 23, 133,
+ 6, 243, 203, 11, 23, 133, 6, 242, 61, 11, 23, 133, 6, 73, 11, 23, 133, 6,
+ 235, 145, 11, 23, 133, 6, 235, 24, 11, 23, 133, 6, 156, 11, 23, 133, 6,
+ 193, 11, 23, 133, 6, 230, 26, 11, 23, 133, 6, 76, 11, 23, 133, 6, 226,
+ 106, 11, 23, 133, 6, 224, 97, 11, 23, 133, 6, 153, 11, 23, 133, 6, 222,
+ 92, 11, 23, 133, 6, 217, 153, 11, 23, 133, 6, 70, 11, 23, 133, 6, 214,
+ 105, 11, 23, 133, 6, 212, 98, 11, 23, 133, 6, 211, 178, 11, 23, 133, 6,
+ 211, 117, 11, 23, 133, 6, 210, 159, 11, 23, 133, 4, 61, 11, 23, 133, 4,
+ 253, 159, 11, 23, 133, 4, 251, 67, 11, 23, 133, 4, 249, 61, 11, 23, 133,
+ 4, 75, 11, 23, 133, 4, 245, 7, 11, 23, 133, 4, 243, 203, 11, 23, 133, 4,
+ 242, 61, 11, 23, 133, 4, 73, 11, 23, 133, 4, 235, 145, 11, 23, 133, 4,
+ 235, 24, 11, 23, 133, 4, 156, 11, 23, 133, 4, 193, 11, 23, 133, 4, 230,
+ 26, 11, 23, 133, 4, 76, 11, 23, 133, 4, 226, 106, 11, 23, 133, 4, 224,
+ 97, 11, 23, 133, 4, 153, 11, 23, 133, 4, 222, 92, 11, 23, 133, 4, 217,
+ 153, 11, 23, 133, 4, 70, 11, 23, 133, 4, 214, 105, 11, 23, 133, 4, 212,
+ 98, 11, 23, 133, 4, 211, 178, 11, 23, 133, 4, 211, 117, 11, 23, 133, 4,
+ 210, 159, 11, 35, 6, 61, 11, 35, 6, 253, 159, 11, 35, 6, 251, 67, 11, 35,
+ 6, 249, 61, 11, 35, 6, 75, 11, 35, 6, 245, 7, 11, 35, 6, 243, 203, 11,
+ 35, 6, 242, 61, 11, 35, 6, 73, 11, 35, 6, 235, 145, 11, 35, 6, 235, 24,
+ 11, 35, 6, 156, 11, 35, 6, 193, 11, 35, 6, 230, 26, 11, 35, 6, 76, 11,
+ 35, 6, 226, 106, 11, 35, 6, 224, 97, 11, 35, 6, 153, 11, 35, 6, 222, 92,
+ 11, 35, 6, 217, 153, 11, 35, 6, 70, 11, 35, 6, 214, 105, 11, 35, 6, 212,
+ 98, 11, 35, 6, 211, 178, 11, 35, 6, 211, 117, 11, 35, 6, 210, 159, 11,
+ 35, 4, 61, 11, 35, 4, 253, 159, 11, 35, 4, 251, 67, 11, 35, 4, 249, 61,
+ 11, 35, 4, 75, 11, 35, 4, 245, 7, 11, 35, 4, 243, 203, 11, 35, 4, 242,
+ 61, 11, 35, 4, 73, 11, 35, 4, 235, 145, 11, 35, 4, 235, 24, 11, 35, 4,
+ 156, 11, 35, 4, 193, 11, 35, 4, 230, 26, 11, 35, 4, 76, 11, 35, 4, 226,
+ 106, 11, 35, 4, 224, 97, 11, 35, 4, 153, 11, 35, 4, 222, 92, 11, 35, 4,
+ 217, 153, 11, 35, 4, 70, 11, 35, 4, 214, 105, 11, 35, 4, 212, 98, 11, 35,
+ 4, 211, 178, 11, 35, 4, 211, 117, 11, 35, 4, 210, 159, 11, 35, 23, 6, 61,
+ 11, 35, 23, 6, 253, 159, 11, 35, 23, 6, 251, 67, 11, 35, 23, 6, 249, 61,
+ 11, 35, 23, 6, 75, 11, 35, 23, 6, 245, 7, 11, 35, 23, 6, 243, 203, 11,
+ 35, 23, 6, 242, 61, 11, 35, 23, 6, 73, 11, 35, 23, 6, 235, 145, 11, 35,
+ 23, 6, 235, 24, 11, 35, 23, 6, 156, 11, 35, 23, 6, 193, 11, 35, 23, 6,
+ 230, 26, 11, 35, 23, 6, 76, 11, 35, 23, 6, 226, 106, 11, 35, 23, 6, 224,
+ 97, 11, 35, 23, 6, 153, 11, 35, 23, 6, 222, 92, 11, 35, 23, 6, 217, 153,
+ 11, 35, 23, 6, 70, 11, 35, 23, 6, 214, 105, 11, 35, 23, 6, 212, 98, 11,
+ 35, 23, 6, 211, 178, 11, 35, 23, 6, 211, 117, 11, 35, 23, 6, 210, 159,
+ 11, 35, 23, 4, 61, 11, 35, 23, 4, 253, 159, 11, 35, 23, 4, 251, 67, 11,
+ 35, 23, 4, 249, 61, 11, 35, 23, 4, 75, 11, 35, 23, 4, 245, 7, 11, 35, 23,
+ 4, 243, 203, 11, 35, 23, 4, 242, 61, 11, 35, 23, 4, 73, 11, 35, 23, 4,
+ 235, 145, 11, 35, 23, 4, 235, 24, 11, 35, 23, 4, 156, 11, 35, 23, 4, 193,
+ 11, 35, 23, 4, 230, 26, 11, 35, 23, 4, 76, 11, 35, 23, 4, 226, 106, 11,
+ 35, 23, 4, 224, 97, 11, 35, 23, 4, 153, 11, 35, 23, 4, 222, 92, 11, 35,
+ 23, 4, 217, 153, 11, 35, 23, 4, 70, 11, 35, 23, 4, 214, 105, 11, 35, 23,
+ 4, 212, 98, 11, 35, 23, 4, 211, 178, 11, 35, 23, 4, 211, 117, 11, 35, 23,
+ 4, 210, 159, 11, 35, 32, 6, 61, 11, 35, 32, 6, 253, 159, 11, 35, 32, 6,
+ 251, 67, 11, 35, 32, 6, 249, 61, 11, 35, 32, 6, 75, 11, 35, 32, 6, 245,
+ 7, 11, 35, 32, 6, 243, 203, 11, 35, 32, 6, 242, 61, 11, 35, 32, 6, 73,
+ 11, 35, 32, 6, 235, 145, 11, 35, 32, 6, 235, 24, 11, 35, 32, 6, 156, 11,
+ 35, 32, 6, 193, 11, 35, 32, 6, 230, 26, 11, 35, 32, 6, 76, 11, 35, 32, 6,
+ 226, 106, 11, 35, 32, 6, 224, 97, 11, 35, 32, 6, 153, 11, 35, 32, 6, 222,
+ 92, 11, 35, 32, 6, 217, 153, 11, 35, 32, 6, 70, 11, 35, 32, 6, 214, 105,
+ 11, 35, 32, 6, 212, 98, 11, 35, 32, 6, 211, 178, 11, 35, 32, 6, 211, 117,
+ 11, 35, 32, 6, 210, 159, 11, 35, 32, 4, 61, 11, 35, 32, 4, 253, 159, 11,
+ 35, 32, 4, 251, 67, 11, 35, 32, 4, 249, 61, 11, 35, 32, 4, 75, 11, 35,
+ 32, 4, 245, 7, 11, 35, 32, 4, 243, 203, 11, 35, 32, 4, 242, 61, 11, 35,
+ 32, 4, 73, 11, 35, 32, 4, 235, 145, 11, 35, 32, 4, 235, 24, 11, 35, 32,
+ 4, 156, 11, 35, 32, 4, 193, 11, 35, 32, 4, 230, 26, 11, 35, 32, 4, 76,
+ 11, 35, 32, 4, 226, 106, 11, 35, 32, 4, 224, 97, 11, 35, 32, 4, 153, 11,
+ 35, 32, 4, 222, 92, 11, 35, 32, 4, 217, 153, 11, 35, 32, 4, 70, 11, 35,
+ 32, 4, 214, 105, 11, 35, 32, 4, 212, 98, 11, 35, 32, 4, 211, 178, 11, 35,
+ 32, 4, 211, 117, 11, 35, 32, 4, 210, 159, 11, 35, 23, 32, 6, 61, 11, 35,
+ 23, 32, 6, 253, 159, 11, 35, 23, 32, 6, 251, 67, 11, 35, 23, 32, 6, 249,
+ 61, 11, 35, 23, 32, 6, 75, 11, 35, 23, 32, 6, 245, 7, 11, 35, 23, 32, 6,
+ 243, 203, 11, 35, 23, 32, 6, 242, 61, 11, 35, 23, 32, 6, 73, 11, 35, 23,
+ 32, 6, 235, 145, 11, 35, 23, 32, 6, 235, 24, 11, 35, 23, 32, 6, 156, 11,
+ 35, 23, 32, 6, 193, 11, 35, 23, 32, 6, 230, 26, 11, 35, 23, 32, 6, 76,
+ 11, 35, 23, 32, 6, 226, 106, 11, 35, 23, 32, 6, 224, 97, 11, 35, 23, 32,
+ 6, 153, 11, 35, 23, 32, 6, 222, 92, 11, 35, 23, 32, 6, 217, 153, 11, 35,
+ 23, 32, 6, 70, 11, 35, 23, 32, 6, 214, 105, 11, 35, 23, 32, 6, 212, 98,
+ 11, 35, 23, 32, 6, 211, 178, 11, 35, 23, 32, 6, 211, 117, 11, 35, 23, 32,
+ 6, 210, 159, 11, 35, 23, 32, 4, 61, 11, 35, 23, 32, 4, 253, 159, 11, 35,
+ 23, 32, 4, 251, 67, 11, 35, 23, 32, 4, 249, 61, 11, 35, 23, 32, 4, 75,
+ 11, 35, 23, 32, 4, 245, 7, 11, 35, 23, 32, 4, 243, 203, 11, 35, 23, 32,
+ 4, 242, 61, 11, 35, 23, 32, 4, 73, 11, 35, 23, 32, 4, 235, 145, 11, 35,
+ 23, 32, 4, 235, 24, 11, 35, 23, 32, 4, 156, 11, 35, 23, 32, 4, 193, 11,
+ 35, 23, 32, 4, 230, 26, 11, 35, 23, 32, 4, 76, 11, 35, 23, 32, 4, 226,
+ 106, 11, 35, 23, 32, 4, 224, 97, 11, 35, 23, 32, 4, 153, 11, 35, 23, 32,
+ 4, 222, 92, 11, 35, 23, 32, 4, 217, 153, 11, 35, 23, 32, 4, 70, 11, 35,
+ 23, 32, 4, 214, 105, 11, 35, 23, 32, 4, 212, 98, 11, 35, 23, 32, 4, 211,
+ 178, 11, 35, 23, 32, 4, 211, 117, 11, 35, 23, 32, 4, 210, 159, 11, 230,
+ 139, 6, 61, 11, 230, 139, 6, 253, 159, 11, 230, 139, 6, 251, 67, 11, 230,
+ 139, 6, 249, 61, 11, 230, 139, 6, 75, 11, 230, 139, 6, 245, 7, 11, 230,
+ 139, 6, 243, 203, 11, 230, 139, 6, 242, 61, 11, 230, 139, 6, 73, 11, 230,
+ 139, 6, 235, 145, 11, 230, 139, 6, 235, 24, 11, 230, 139, 6, 156, 11,
+ 230, 139, 6, 193, 11, 230, 139, 6, 230, 26, 11, 230, 139, 6, 76, 11, 230,
+ 139, 6, 226, 106, 11, 230, 139, 6, 224, 97, 11, 230, 139, 6, 153, 11,
+ 230, 139, 6, 222, 92, 11, 230, 139, 6, 217, 153, 11, 230, 139, 6, 70, 11,
+ 230, 139, 6, 214, 105, 11, 230, 139, 6, 212, 98, 11, 230, 139, 6, 211,
+ 178, 11, 230, 139, 6, 211, 117, 11, 230, 139, 6, 210, 159, 11, 230, 139,
+ 4, 61, 11, 230, 139, 4, 253, 159, 11, 230, 139, 4, 251, 67, 11, 230, 139,
+ 4, 249, 61, 11, 230, 139, 4, 75, 11, 230, 139, 4, 245, 7, 11, 230, 139,
+ 4, 243, 203, 11, 230, 139, 4, 242, 61, 11, 230, 139, 4, 73, 11, 230, 139,
+ 4, 235, 145, 11, 230, 139, 4, 235, 24, 11, 230, 139, 4, 156, 11, 230,
+ 139, 4, 193, 11, 230, 139, 4, 230, 26, 11, 230, 139, 4, 76, 11, 230, 139,
+ 4, 226, 106, 11, 230, 139, 4, 224, 97, 11, 230, 139, 4, 153, 11, 230,
+ 139, 4, 222, 92, 11, 230, 139, 4, 217, 153, 11, 230, 139, 4, 70, 11, 230,
+ 139, 4, 214, 105, 11, 230, 139, 4, 212, 98, 11, 230, 139, 4, 211, 178,
+ 11, 230, 139, 4, 211, 117, 11, 230, 139, 4, 210, 159, 11, 32, 4, 247,
+ 120, 73, 11, 32, 4, 247, 120, 235, 145, 11, 23, 6, 254, 144, 11, 23, 6,
+ 252, 27, 11, 23, 6, 243, 108, 11, 23, 6, 248, 55, 11, 23, 6, 245, 101,
+ 11, 23, 6, 210, 85, 11, 23, 6, 245, 64, 11, 23, 6, 216, 180, 11, 23, 6,
+ 235, 186, 11, 23, 6, 234, 223, 11, 23, 6, 233, 99, 11, 23, 6, 230, 103,
+ 11, 23, 6, 227, 238, 11, 23, 6, 211, 157, 11, 23, 6, 226, 200, 11, 23, 6,
+ 225, 109, 11, 23, 6, 223, 38, 11, 23, 6, 216, 181, 87, 11, 23, 6, 219,
+ 178, 11, 23, 6, 217, 42, 11, 23, 6, 214, 157, 11, 23, 6, 225, 134, 11,
+ 23, 6, 250, 111, 11, 23, 6, 224, 162, 11, 23, 6, 226, 202, 11, 23, 229,
+ 222, 11, 23, 4, 254, 144, 11, 23, 4, 252, 27, 11, 23, 4, 243, 108, 11,
+ 23, 4, 248, 55, 11, 23, 4, 245, 101, 11, 23, 4, 210, 85, 11, 23, 4, 245,
+ 64, 11, 23, 4, 216, 180, 11, 23, 4, 235, 186, 11, 23, 4, 234, 223, 11,
+ 23, 4, 233, 99, 11, 23, 4, 230, 103, 11, 23, 4, 227, 238, 11, 23, 4, 211,
+ 157, 11, 23, 4, 226, 200, 11, 23, 4, 225, 109, 11, 23, 4, 223, 38, 11,
+ 23, 4, 40, 219, 178, 11, 23, 4, 219, 178, 11, 23, 4, 217, 42, 11, 23, 4,
+ 214, 157, 11, 23, 4, 225, 134, 11, 23, 4, 250, 111, 11, 23, 4, 224, 162,
+ 11, 23, 4, 226, 202, 11, 23, 225, 254, 247, 234, 11, 23, 245, 102, 87,
+ 11, 23, 216, 181, 87, 11, 23, 234, 224, 87, 11, 23, 225, 135, 87, 11, 23,
+ 223, 39, 87, 11, 23, 225, 110, 87, 11, 32, 6, 254, 144, 11, 32, 6, 252,
+ 27, 11, 32, 6, 243, 108, 11, 32, 6, 248, 55, 11, 32, 6, 245, 101, 11, 32,
+ 6, 210, 85, 11, 32, 6, 245, 64, 11, 32, 6, 216, 180, 11, 32, 6, 235, 186,
+ 11, 32, 6, 234, 223, 11, 32, 6, 233, 99, 11, 32, 6, 230, 103, 11, 32, 6,
+ 227, 238, 11, 32, 6, 211, 157, 11, 32, 6, 226, 200, 11, 32, 6, 225, 109,
+ 11, 32, 6, 223, 38, 11, 32, 6, 216, 181, 87, 11, 32, 6, 219, 178, 11, 32,
+ 6, 217, 42, 11, 32, 6, 214, 157, 11, 32, 6, 225, 134, 11, 32, 6, 250,
+ 111, 11, 32, 6, 224, 162, 11, 32, 6, 226, 202, 11, 32, 229, 222, 11, 32,
+ 4, 254, 144, 11, 32, 4, 252, 27, 11, 32, 4, 243, 108, 11, 32, 4, 248, 55,
+ 11, 32, 4, 245, 101, 11, 32, 4, 210, 85, 11, 32, 4, 245, 64, 11, 32, 4,
+ 216, 180, 11, 32, 4, 235, 186, 11, 32, 4, 234, 223, 11, 32, 4, 233, 99,
+ 11, 32, 4, 230, 103, 11, 32, 4, 227, 238, 11, 32, 4, 211, 157, 11, 32, 4,
+ 226, 200, 11, 32, 4, 225, 109, 11, 32, 4, 223, 38, 11, 32, 4, 40, 219,
+ 178, 11, 32, 4, 219, 178, 11, 32, 4, 217, 42, 11, 32, 4, 214, 157, 11,
+ 32, 4, 225, 134, 11, 32, 4, 250, 111, 11, 32, 4, 224, 162, 11, 32, 4,
+ 226, 202, 11, 32, 225, 254, 247, 234, 11, 32, 245, 102, 87, 11, 32, 216,
+ 181, 87, 11, 32, 234, 224, 87, 11, 32, 225, 135, 87, 11, 32, 223, 39, 87,
+ 11, 32, 225, 110, 87, 11, 23, 32, 6, 254, 144, 11, 23, 32, 6, 252, 27,
+ 11, 23, 32, 6, 243, 108, 11, 23, 32, 6, 248, 55, 11, 23, 32, 6, 245, 101,
+ 11, 23, 32, 6, 210, 85, 11, 23, 32, 6, 245, 64, 11, 23, 32, 6, 216, 180,
+ 11, 23, 32, 6, 235, 186, 11, 23, 32, 6, 234, 223, 11, 23, 32, 6, 233, 99,
+ 11, 23, 32, 6, 230, 103, 11, 23, 32, 6, 227, 238, 11, 23, 32, 6, 211,
+ 157, 11, 23, 32, 6, 226, 200, 11, 23, 32, 6, 225, 109, 11, 23, 32, 6,
+ 223, 38, 11, 23, 32, 6, 216, 181, 87, 11, 23, 32, 6, 219, 178, 11, 23,
+ 32, 6, 217, 42, 11, 23, 32, 6, 214, 157, 11, 23, 32, 6, 225, 134, 11, 23,
+ 32, 6, 250, 111, 11, 23, 32, 6, 224, 162, 11, 23, 32, 6, 226, 202, 11,
+ 23, 32, 229, 222, 11, 23, 32, 4, 254, 144, 11, 23, 32, 4, 252, 27, 11,
+ 23, 32, 4, 243, 108, 11, 23, 32, 4, 248, 55, 11, 23, 32, 4, 245, 101, 11,
+ 23, 32, 4, 210, 85, 11, 23, 32, 4, 245, 64, 11, 23, 32, 4, 216, 180, 11,
+ 23, 32, 4, 235, 186, 11, 23, 32, 4, 234, 223, 11, 23, 32, 4, 233, 99, 11,
+ 23, 32, 4, 230, 103, 11, 23, 32, 4, 227, 238, 11, 23, 32, 4, 211, 157,
+ 11, 23, 32, 4, 226, 200, 11, 23, 32, 4, 225, 109, 11, 23, 32, 4, 223, 38,
+ 11, 23, 32, 4, 40, 219, 178, 11, 23, 32, 4, 219, 178, 11, 23, 32, 4, 217,
+ 42, 11, 23, 32, 4, 214, 157, 11, 23, 32, 4, 225, 134, 11, 23, 32, 4, 250,
+ 111, 11, 23, 32, 4, 224, 162, 11, 23, 32, 4, 226, 202, 11, 23, 32, 225,
+ 254, 247, 234, 11, 23, 32, 245, 102, 87, 11, 23, 32, 216, 181, 87, 11,
+ 23, 32, 234, 224, 87, 11, 23, 32, 225, 135, 87, 11, 23, 32, 223, 39, 87,
+ 11, 23, 32, 225, 110, 87, 11, 35, 23, 6, 254, 144, 11, 35, 23, 6, 252,
+ 27, 11, 35, 23, 6, 243, 108, 11, 35, 23, 6, 248, 55, 11, 35, 23, 6, 245,
+ 101, 11, 35, 23, 6, 210, 85, 11, 35, 23, 6, 245, 64, 11, 35, 23, 6, 216,
+ 180, 11, 35, 23, 6, 235, 186, 11, 35, 23, 6, 234, 223, 11, 35, 23, 6,
+ 233, 99, 11, 35, 23, 6, 230, 103, 11, 35, 23, 6, 227, 238, 11, 35, 23, 6,
+ 211, 157, 11, 35, 23, 6, 226, 200, 11, 35, 23, 6, 225, 109, 11, 35, 23,
+ 6, 223, 38, 11, 35, 23, 6, 216, 181, 87, 11, 35, 23, 6, 219, 178, 11, 35,
+ 23, 6, 217, 42, 11, 35, 23, 6, 214, 157, 11, 35, 23, 6, 225, 134, 11, 35,
+ 23, 6, 250, 111, 11, 35, 23, 6, 224, 162, 11, 35, 23, 6, 226, 202, 11,
+ 35, 23, 229, 222, 11, 35, 23, 4, 254, 144, 11, 35, 23, 4, 252, 27, 11,
+ 35, 23, 4, 243, 108, 11, 35, 23, 4, 248, 55, 11, 35, 23, 4, 245, 101, 11,
+ 35, 23, 4, 210, 85, 11, 35, 23, 4, 245, 64, 11, 35, 23, 4, 216, 180, 11,
+ 35, 23, 4, 235, 186, 11, 35, 23, 4, 234, 223, 11, 35, 23, 4, 233, 99, 11,
+ 35, 23, 4, 230, 103, 11, 35, 23, 4, 227, 238, 11, 35, 23, 4, 211, 157,
+ 11, 35, 23, 4, 226, 200, 11, 35, 23, 4, 225, 109, 11, 35, 23, 4, 223, 38,
+ 11, 35, 23, 4, 40, 219, 178, 11, 35, 23, 4, 219, 178, 11, 35, 23, 4, 217,
+ 42, 11, 35, 23, 4, 214, 157, 11, 35, 23, 4, 225, 134, 11, 35, 23, 4, 250,
+ 111, 11, 35, 23, 4, 224, 162, 11, 35, 23, 4, 226, 202, 11, 35, 23, 225,
+ 254, 247, 234, 11, 35, 23, 245, 102, 87, 11, 35, 23, 216, 181, 87, 11,
+ 35, 23, 234, 224, 87, 11, 35, 23, 225, 135, 87, 11, 35, 23, 223, 39, 87,
+ 11, 35, 23, 225, 110, 87, 11, 35, 23, 32, 6, 254, 144, 11, 35, 23, 32, 6,
+ 252, 27, 11, 35, 23, 32, 6, 243, 108, 11, 35, 23, 32, 6, 248, 55, 11, 35,
+ 23, 32, 6, 245, 101, 11, 35, 23, 32, 6, 210, 85, 11, 35, 23, 32, 6, 245,
+ 64, 11, 35, 23, 32, 6, 216, 180, 11, 35, 23, 32, 6, 235, 186, 11, 35, 23,
+ 32, 6, 234, 223, 11, 35, 23, 32, 6, 233, 99, 11, 35, 23, 32, 6, 230, 103,
+ 11, 35, 23, 32, 6, 227, 238, 11, 35, 23, 32, 6, 211, 157, 11, 35, 23, 32,
+ 6, 226, 200, 11, 35, 23, 32, 6, 225, 109, 11, 35, 23, 32, 6, 223, 38, 11,
+ 35, 23, 32, 6, 216, 181, 87, 11, 35, 23, 32, 6, 219, 178, 11, 35, 23, 32,
+ 6, 217, 42, 11, 35, 23, 32, 6, 214, 157, 11, 35, 23, 32, 6, 225, 134, 11,
+ 35, 23, 32, 6, 250, 111, 11, 35, 23, 32, 6, 224, 162, 11, 35, 23, 32, 6,
+ 226, 202, 11, 35, 23, 32, 229, 222, 11, 35, 23, 32, 4, 254, 144, 11, 35,
+ 23, 32, 4, 252, 27, 11, 35, 23, 32, 4, 243, 108, 11, 35, 23, 32, 4, 248,
+ 55, 11, 35, 23, 32, 4, 245, 101, 11, 35, 23, 32, 4, 210, 85, 11, 35, 23,
+ 32, 4, 245, 64, 11, 35, 23, 32, 4, 216, 180, 11, 35, 23, 32, 4, 235, 186,
+ 11, 35, 23, 32, 4, 234, 223, 11, 35, 23, 32, 4, 233, 99, 11, 35, 23, 32,
+ 4, 230, 103, 11, 35, 23, 32, 4, 227, 238, 11, 35, 23, 32, 4, 211, 157,
+ 11, 35, 23, 32, 4, 226, 200, 11, 35, 23, 32, 4, 225, 109, 11, 35, 23, 32,
+ 4, 223, 38, 11, 35, 23, 32, 4, 40, 219, 178, 11, 35, 23, 32, 4, 219, 178,
+ 11, 35, 23, 32, 4, 217, 42, 11, 35, 23, 32, 4, 214, 157, 11, 35, 23, 32,
+ 4, 225, 134, 11, 35, 23, 32, 4, 250, 111, 11, 35, 23, 32, 4, 224, 162,
+ 11, 35, 23, 32, 4, 226, 202, 11, 35, 23, 32, 225, 254, 247, 234, 11, 35,
+ 23, 32, 245, 102, 87, 11, 35, 23, 32, 216, 181, 87, 11, 35, 23, 32, 234,
+ 224, 87, 11, 35, 23, 32, 225, 135, 87, 11, 35, 23, 32, 223, 39, 87, 11,
+ 35, 23, 32, 225, 110, 87, 11, 23, 6, 247, 228, 11, 23, 4, 247, 228, 11,
+ 23, 21, 210, 86, 11, 23, 21, 110, 11, 23, 21, 105, 11, 23, 21, 158, 11,
+ 23, 21, 161, 11, 23, 21, 189, 11, 23, 21, 194, 11, 23, 21, 198, 11, 23,
+ 21, 195, 11, 23, 21, 200, 11, 139, 21, 210, 86, 11, 139, 21, 110, 11,
+ 139, 21, 105, 11, 139, 21, 158, 11, 139, 21, 161, 11, 139, 21, 189, 11,
+ 139, 21, 194, 11, 139, 21, 198, 11, 139, 21, 195, 11, 139, 21, 200, 11,
+ 35, 21, 210, 86, 11, 35, 21, 110, 11, 35, 21, 105, 11, 35, 21, 158, 11,
+ 35, 21, 161, 11, 35, 21, 189, 11, 35, 21, 194, 11, 35, 21, 198, 11, 35,
+ 21, 195, 11, 35, 21, 200, 11, 35, 23, 21, 210, 86, 11, 35, 23, 21, 110,
+ 11, 35, 23, 21, 105, 11, 35, 23, 21, 158, 11, 35, 23, 21, 161, 11, 35,
+ 23, 21, 189, 11, 35, 23, 21, 194, 11, 35, 23, 21, 198, 11, 35, 23, 21,
+ 195, 11, 35, 23, 21, 200, 11, 230, 139, 21, 210, 86, 11, 230, 139, 21,
+ 110, 11, 230, 139, 21, 105, 11, 230, 139, 21, 158, 11, 230, 139, 21, 161,
+ 11, 230, 139, 21, 189, 11, 230, 139, 21, 194, 11, 230, 139, 21, 198, 11,
+ 230, 139, 21, 195, 11, 230, 139, 21, 200, 10, 11, 254, 171, 10, 11, 252,
+ 55, 10, 11, 235, 124, 10, 11, 248, 196, 10, 11, 212, 30, 10, 11, 210,
+ 108, 10, 11, 242, 38, 10, 11, 217, 81, 10, 11, 211, 43, 10, 11, 234, 251,
+ 10, 11, 233, 103, 10, 11, 231, 79, 10, 11, 228, 63, 10, 11, 221, 167, 10,
+ 11, 254, 197, 10, 11, 244, 143, 10, 11, 222, 27, 10, 11, 224, 82, 10, 11,
+ 223, 96, 10, 11, 220, 60, 10, 11, 217, 8, 10, 11, 216, 193, 10, 11, 234,
+ 130, 10, 11, 216, 203, 10, 11, 248, 217, 10, 11, 210, 111, 10, 11, 242,
+ 245, 10, 11, 247, 120, 252, 55, 10, 11, 247, 120, 228, 63, 10, 11, 247,
+ 120, 244, 143, 10, 11, 247, 120, 224, 82, 10, 11, 65, 252, 55, 10, 11,
+ 65, 235, 124, 10, 11, 65, 241, 219, 10, 11, 65, 242, 38, 10, 11, 65, 211,
+ 43, 10, 11, 65, 234, 251, 10, 11, 65, 233, 103, 10, 11, 65, 231, 79, 10,
+ 11, 65, 228, 63, 10, 11, 65, 221, 167, 10, 11, 65, 254, 197, 10, 11, 65,
+ 244, 143, 10, 11, 65, 222, 27, 10, 11, 65, 224, 82, 10, 11, 65, 220, 60,
+ 10, 11, 65, 217, 8, 10, 11, 65, 216, 193, 10, 11, 65, 234, 130, 10, 11,
+ 65, 248, 217, 10, 11, 65, 242, 245, 10, 11, 217, 77, 235, 124, 10, 11,
+ 217, 77, 242, 38, 10, 11, 217, 77, 211, 43, 10, 11, 217, 77, 233, 103,
+ 10, 11, 217, 77, 228, 63, 10, 11, 217, 77, 221, 167, 10, 11, 217, 77,
+ 254, 197, 10, 11, 217, 77, 222, 27, 10, 11, 217, 77, 224, 82, 10, 11,
+ 217, 77, 220, 60, 10, 11, 217, 77, 234, 130, 10, 11, 217, 77, 248, 217,
+ 10, 11, 217, 77, 242, 245, 10, 11, 217, 77, 247, 120, 228, 63, 10, 11,
+ 217, 77, 247, 120, 224, 82, 10, 11, 218, 111, 252, 55, 10, 11, 218, 111,
+ 235, 124, 10, 11, 218, 111, 241, 219, 10, 11, 218, 111, 242, 38, 10, 11,
+ 218, 111, 217, 81, 10, 11, 218, 111, 211, 43, 10, 11, 218, 111, 234, 251,
+ 10, 11, 218, 111, 231, 79, 10, 11, 218, 111, 228, 63, 10, 11, 218, 111,
+ 221, 167, 10, 11, 218, 111, 254, 197, 10, 11, 218, 111, 244, 143, 10, 11,
+ 218, 111, 222, 27, 10, 11, 218, 111, 224, 82, 10, 11, 218, 111, 220, 60,
+ 10, 11, 218, 111, 217, 8, 10, 11, 218, 111, 216, 193, 10, 11, 218, 111,
+ 234, 130, 10, 11, 218, 111, 248, 217, 10, 11, 218, 111, 210, 111, 10, 11,
+ 218, 111, 242, 245, 10, 11, 218, 111, 247, 120, 252, 55, 10, 11, 218,
+ 111, 247, 120, 244, 143, 10, 11, 232, 123, 254, 171, 10, 11, 232, 123,
+ 252, 55, 10, 11, 232, 123, 235, 124, 10, 11, 232, 123, 248, 196, 10, 11,
+ 232, 123, 241, 219, 10, 11, 232, 123, 212, 30, 10, 11, 232, 123, 210,
+ 108, 10, 11, 232, 123, 242, 38, 10, 11, 232, 123, 217, 81, 10, 11, 232,
+ 123, 211, 43, 10, 11, 232, 123, 233, 103, 10, 11, 232, 123, 231, 79, 10,
+ 11, 232, 123, 228, 63, 10, 11, 232, 123, 221, 167, 10, 11, 232, 123, 254,
+ 197, 10, 11, 232, 123, 244, 143, 10, 11, 232, 123, 222, 27, 10, 11, 232,
+ 123, 224, 82, 10, 11, 232, 123, 223, 96, 10, 11, 232, 123, 220, 60, 10,
+ 11, 232, 123, 217, 8, 10, 11, 232, 123, 216, 193, 10, 11, 232, 123, 234,
+ 130, 10, 11, 232, 123, 216, 203, 10, 11, 232, 123, 248, 217, 10, 11, 232,
+ 123, 210, 111, 10, 11, 232, 123, 242, 245, 10, 11, 139, 252, 55, 10, 11,
+ 139, 235, 124, 10, 11, 139, 248, 196, 10, 11, 139, 212, 30, 10, 11, 139,
+ 210, 108, 10, 11, 139, 242, 38, 10, 11, 139, 217, 81, 10, 11, 139, 211,
+ 43, 10, 11, 139, 233, 103, 10, 11, 139, 231, 79, 10, 11, 139, 228, 63,
+ 10, 11, 139, 221, 167, 10, 11, 139, 254, 197, 10, 11, 139, 244, 143, 10,
+ 11, 139, 222, 27, 10, 11, 139, 224, 82, 10, 11, 139, 223, 96, 10, 11,
+ 139, 220, 60, 10, 11, 139, 217, 8, 10, 11, 139, 216, 193, 10, 11, 139,
+ 234, 130, 10, 11, 139, 216, 203, 10, 11, 139, 248, 217, 10, 11, 139, 210,
+ 111, 10, 11, 139, 242, 245, 10, 11, 226, 169, 66, 2, 122, 2, 217, 44, 10,
+ 11, 226, 169, 122, 2, 248, 196, 231, 206, 86, 245, 221, 211, 239, 231,
+ 206, 86, 219, 29, 211, 239, 231, 206, 86, 212, 9, 211, 239, 231, 206, 86,
+ 228, 57, 211, 239, 231, 206, 86, 223, 112, 246, 97, 231, 206, 86, 242,
+ 128, 246, 97, 231, 206, 86, 71, 246, 97, 231, 206, 86, 123, 64, 250, 142,
+ 231, 206, 86, 113, 64, 250, 142, 231, 206, 86, 134, 64, 250, 142, 231,
+ 206, 86, 244, 12, 64, 250, 142, 231, 206, 86, 244, 82, 64, 250, 142, 231,
+ 206, 86, 219, 126, 64, 250, 142, 231, 206, 86, 220, 123, 64, 250, 142,
+ 231, 206, 86, 245, 194, 64, 250, 142, 231, 206, 86, 228, 201, 64, 250,
+ 142, 231, 206, 86, 123, 64, 252, 154, 231, 206, 86, 113, 64, 252, 154,
+ 231, 206, 86, 134, 64, 252, 154, 231, 206, 86, 244, 12, 64, 252, 154,
+ 231, 206, 86, 244, 82, 64, 252, 154, 231, 206, 86, 219, 126, 64, 252,
+ 154, 231, 206, 86, 220, 123, 64, 252, 154, 231, 206, 86, 245, 194, 64,
+ 252, 154, 231, 206, 86, 228, 201, 64, 252, 154, 231, 206, 86, 123, 64,
+ 250, 35, 231, 206, 86, 113, 64, 250, 35, 231, 206, 86, 134, 64, 250, 35,
+ 231, 206, 86, 244, 12, 64, 250, 35, 231, 206, 86, 244, 82, 64, 250, 35,
+ 231, 206, 86, 219, 126, 64, 250, 35, 231, 206, 86, 220, 123, 64, 250, 35,
+ 231, 206, 86, 245, 194, 64, 250, 35, 231, 206, 86, 228, 201, 64, 250, 35,
+ 231, 206, 86, 225, 26, 231, 206, 86, 226, 157, 231, 206, 86, 252, 155,
+ 231, 206, 86, 250, 71, 231, 206, 86, 218, 240, 231, 206, 86, 218, 40,
+ 231, 206, 86, 253, 180, 231, 206, 86, 211, 232, 231, 206, 86, 235, 63,
+ 231, 206, 86, 252, 185, 131, 86, 203, 252, 185, 131, 86, 241, 44, 131,
+ 86, 241, 43, 131, 86, 241, 42, 131, 86, 241, 41, 131, 86, 241, 40, 131,
+ 86, 241, 39, 131, 86, 241, 38, 131, 86, 241, 37, 131, 86, 241, 36, 131,
+ 86, 241, 35, 131, 86, 241, 34, 131, 86, 241, 33, 131, 86, 241, 32, 131,
+ 86, 241, 31, 131, 86, 241, 30, 131, 86, 241, 29, 131, 86, 241, 28, 131,
+ 86, 241, 27, 131, 86, 241, 26, 131, 86, 241, 25, 131, 86, 241, 24, 131,
+ 86, 241, 23, 131, 86, 241, 22, 131, 86, 241, 21, 131, 86, 241, 20, 131,
+ 86, 241, 19, 131, 86, 241, 18, 131, 86, 241, 17, 131, 86, 241, 16, 131,
+ 86, 241, 15, 131, 86, 241, 14, 131, 86, 241, 13, 131, 86, 241, 12, 131,
+ 86, 241, 11, 131, 86, 241, 10, 131, 86, 241, 9, 131, 86, 241, 8, 131, 86,
+ 241, 7, 131, 86, 241, 6, 131, 86, 241, 5, 131, 86, 241, 4, 131, 86, 241,
+ 3, 131, 86, 241, 2, 131, 86, 241, 1, 131, 86, 241, 0, 131, 86, 240, 255,
+ 131, 86, 240, 254, 131, 86, 240, 253, 131, 86, 240, 252, 131, 86, 67,
+ 252, 185, 131, 86, 213, 238, 131, 86, 213, 237, 131, 86, 213, 236, 131,
+ 86, 213, 235, 131, 86, 213, 234, 131, 86, 213, 233, 131, 86, 213, 232,
+ 131, 86, 213, 231, 131, 86, 213, 230, 131, 86, 213, 229, 131, 86, 213,
+ 228, 131, 86, 213, 227, 131, 86, 213, 226, 131, 86, 213, 225, 131, 86,
+ 213, 224, 131, 86, 213, 223, 131, 86, 213, 222, 131, 86, 213, 221, 131,
+ 86, 213, 220, 131, 86, 213, 219, 131, 86, 213, 218, 131, 86, 213, 217,
+ 131, 86, 213, 216, 131, 86, 213, 215, 131, 86, 213, 214, 131, 86, 213,
+ 213, 131, 86, 213, 212, 131, 86, 213, 211, 131, 86, 213, 210, 131, 86,
+ 213, 209, 131, 86, 213, 208, 131, 86, 213, 207, 131, 86, 213, 206, 131,
+ 86, 213, 205, 131, 86, 213, 204, 131, 86, 213, 203, 131, 86, 213, 202,
+ 131, 86, 213, 201, 131, 86, 213, 200, 131, 86, 213, 199, 131, 86, 213,
+ 198, 131, 86, 213, 197, 131, 86, 213, 196, 131, 86, 213, 195, 131, 86,
+ 213, 194, 131, 86, 213, 193, 131, 86, 213, 192, 131, 86, 213, 191, 131,
+ 86, 213, 190, 225, 34, 250, 244, 252, 185, 225, 34, 250, 244, 255, 10,
+ 64, 219, 16, 225, 34, 250, 244, 113, 64, 219, 16, 225, 34, 250, 244, 134,
+ 64, 219, 16, 225, 34, 250, 244, 244, 12, 64, 219, 16, 225, 34, 250, 244,
+ 244, 82, 64, 219, 16, 225, 34, 250, 244, 219, 126, 64, 219, 16, 225, 34,
+ 250, 244, 220, 123, 64, 219, 16, 225, 34, 250, 244, 245, 194, 64, 219,
+ 16, 225, 34, 250, 244, 228, 201, 64, 219, 16, 225, 34, 250, 244, 216,
+ 249, 64, 219, 16, 225, 34, 250, 244, 235, 140, 64, 219, 16, 225, 34, 250,
+ 244, 234, 32, 64, 219, 16, 225, 34, 250, 244, 224, 16, 64, 219, 16, 225,
+ 34, 250, 244, 234, 80, 64, 219, 16, 225, 34, 250, 244, 255, 10, 64, 241,
+ 226, 225, 34, 250, 244, 113, 64, 241, 226, 225, 34, 250, 244, 134, 64,
+ 241, 226, 225, 34, 250, 244, 244, 12, 64, 241, 226, 225, 34, 250, 244,
+ 244, 82, 64, 241, 226, 225, 34, 250, 244, 219, 126, 64, 241, 226, 225,
+ 34, 250, 244, 220, 123, 64, 241, 226, 225, 34, 250, 244, 245, 194, 64,
+ 241, 226, 225, 34, 250, 244, 228, 201, 64, 241, 226, 225, 34, 250, 244,
+ 216, 249, 64, 241, 226, 225, 34, 250, 244, 235, 140, 64, 241, 226, 225,
+ 34, 250, 244, 234, 32, 64, 241, 226, 225, 34, 250, 244, 224, 16, 64, 241,
+ 226, 225, 34, 250, 244, 234, 80, 64, 241, 226, 225, 34, 250, 244, 255,
+ 10, 64, 247, 248, 225, 34, 250, 244, 113, 64, 247, 248, 225, 34, 250,
+ 244, 134, 64, 247, 248, 225, 34, 250, 244, 244, 12, 64, 247, 248, 225,
+ 34, 250, 244, 244, 82, 64, 247, 248, 225, 34, 250, 244, 219, 126, 64,
+ 247, 248, 225, 34, 250, 244, 220, 123, 64, 247, 248, 225, 34, 250, 244,
+ 245, 194, 64, 247, 248, 225, 34, 250, 244, 228, 201, 64, 247, 248, 225,
+ 34, 250, 244, 216, 249, 64, 247, 248, 225, 34, 250, 244, 235, 140, 64,
+ 247, 248, 225, 34, 250, 244, 234, 32, 64, 247, 248, 225, 34, 250, 244,
+ 224, 16, 64, 247, 248, 225, 34, 250, 244, 234, 80, 64, 247, 248, 225, 34,
+ 250, 244, 85, 235, 63, 225, 34, 250, 244, 255, 10, 64, 249, 243, 225, 34,
+ 250, 244, 113, 64, 249, 243, 225, 34, 250, 244, 134, 64, 249, 243, 225,
+ 34, 250, 244, 244, 12, 64, 249, 243, 225, 34, 250, 244, 244, 82, 64, 249,
+ 243, 225, 34, 250, 244, 219, 126, 64, 249, 243, 225, 34, 250, 244, 220,
+ 123, 64, 249, 243, 225, 34, 250, 244, 245, 194, 64, 249, 243, 225, 34,
+ 250, 244, 228, 201, 64, 249, 243, 225, 34, 250, 244, 216, 249, 64, 249,
+ 243, 225, 34, 250, 244, 235, 140, 64, 249, 243, 225, 34, 250, 244, 234,
+ 32, 64, 249, 243, 225, 34, 250, 244, 224, 16, 64, 249, 243, 225, 34, 250,
+ 244, 234, 80, 64, 249, 243, 225, 34, 250, 244, 71, 235, 63, 21, 210, 87,
+ 243, 230, 218, 130, 21, 210, 87, 249, 220, 21, 123, 249, 220, 21, 113,
+ 249, 220, 21, 134, 249, 220, 21, 244, 12, 249, 220, 21, 244, 82, 249,
+ 220, 21, 219, 126, 249, 220, 21, 220, 123, 249, 220, 21, 245, 194, 249,
+ 220, 21, 228, 201, 249, 220, 88, 7, 6, 1, 61, 88, 7, 6, 1, 253, 159, 88,
+ 7, 6, 1, 251, 67, 88, 7, 6, 1, 249, 61, 88, 7, 6, 1, 75, 88, 7, 6, 1,
+ 245, 7, 88, 7, 6, 1, 243, 203, 88, 7, 6, 1, 242, 61, 88, 7, 6, 1, 73, 88,
+ 7, 6, 1, 235, 145, 88, 7, 6, 1, 235, 24, 88, 7, 6, 1, 156, 88, 7, 6, 1,
+ 193, 88, 7, 6, 1, 230, 26, 88, 7, 6, 1, 76, 88, 7, 6, 1, 226, 106, 88, 7,
+ 6, 1, 224, 97, 88, 7, 6, 1, 153, 88, 7, 6, 1, 222, 92, 88, 7, 6, 1, 217,
+ 153, 88, 7, 6, 1, 70, 88, 7, 6, 1, 214, 105, 88, 7, 6, 1, 212, 98, 88, 7,
+ 6, 1, 211, 178, 88, 7, 6, 1, 211, 117, 88, 7, 6, 1, 210, 159, 216, 7,
+ 220, 54, 251, 158, 7, 6, 1, 222, 92, 37, 32, 7, 6, 1, 251, 67, 37, 32, 7,
+ 6, 1, 153, 37, 250, 192, 37, 211, 180, 92, 7, 6, 1, 61, 92, 7, 6, 1, 253,
+ 159, 92, 7, 6, 1, 251, 67, 92, 7, 6, 1, 249, 61, 92, 7, 6, 1, 75, 92, 7,
+ 6, 1, 245, 7, 92, 7, 6, 1, 243, 203, 92, 7, 6, 1, 242, 61, 92, 7, 6, 1,
+ 73, 92, 7, 6, 1, 235, 145, 92, 7, 6, 1, 235, 24, 92, 7, 6, 1, 156, 92, 7,
+ 6, 1, 193, 92, 7, 6, 1, 230, 26, 92, 7, 6, 1, 76, 92, 7, 6, 1, 226, 106,
+ 92, 7, 6, 1, 224, 97, 92, 7, 6, 1, 153, 92, 7, 6, 1, 222, 92, 92, 7, 6,
+ 1, 217, 153, 92, 7, 6, 1, 70, 92, 7, 6, 1, 214, 105, 92, 7, 6, 1, 212,
+ 98, 92, 7, 6, 1, 211, 178, 92, 7, 6, 1, 211, 117, 92, 7, 6, 1, 210, 159,
+ 92, 240, 202, 92, 230, 50, 92, 221, 184, 92, 218, 227, 92, 224, 219, 92,
+ 212, 23, 152, 37, 7, 6, 1, 61, 152, 37, 7, 6, 1, 253, 159, 152, 37, 7, 6,
+ 1, 251, 67, 152, 37, 7, 6, 1, 249, 61, 152, 37, 7, 6, 1, 75, 152, 37, 7,
+ 6, 1, 245, 7, 152, 37, 7, 6, 1, 243, 203, 152, 37, 7, 6, 1, 242, 61, 152,
+ 37, 7, 6, 1, 73, 152, 37, 7, 6, 1, 235, 145, 152, 37, 7, 6, 1, 235, 24,
+ 152, 37, 7, 6, 1, 156, 152, 37, 7, 6, 1, 193, 152, 37, 7, 6, 1, 230, 26,
+ 152, 37, 7, 6, 1, 76, 152, 37, 7, 6, 1, 226, 106, 152, 37, 7, 6, 1, 224,
+ 97, 152, 37, 7, 6, 1, 153, 152, 37, 7, 6, 1, 222, 92, 152, 37, 7, 6, 1,
+ 217, 153, 152, 37, 7, 6, 1, 70, 152, 37, 7, 6, 1, 214, 105, 152, 37, 7,
+ 6, 1, 212, 98, 152, 37, 7, 6, 1, 211, 178, 152, 37, 7, 6, 1, 211, 117,
+ 152, 37, 7, 6, 1, 210, 159, 223, 158, 231, 98, 50, 223, 158, 231, 95, 50,
+ 152, 92, 7, 6, 1, 61, 152, 92, 7, 6, 1, 253, 159, 152, 92, 7, 6, 1, 251,
+ 67, 152, 92, 7, 6, 1, 249, 61, 152, 92, 7, 6, 1, 75, 152, 92, 7, 6, 1,
+ 245, 7, 152, 92, 7, 6, 1, 243, 203, 152, 92, 7, 6, 1, 242, 61, 152, 92,
+ 7, 6, 1, 73, 152, 92, 7, 6, 1, 235, 145, 152, 92, 7, 6, 1, 235, 24, 152,
+ 92, 7, 6, 1, 156, 152, 92, 7, 6, 1, 193, 152, 92, 7, 6, 1, 230, 26, 152,
+ 92, 7, 6, 1, 76, 152, 92, 7, 6, 1, 226, 106, 152, 92, 7, 6, 1, 224, 97,
+ 152, 92, 7, 6, 1, 153, 152, 92, 7, 6, 1, 222, 92, 152, 92, 7, 6, 1, 217,
+ 153, 152, 92, 7, 6, 1, 70, 152, 92, 7, 6, 1, 214, 105, 152, 92, 7, 6, 1,
+ 212, 98, 152, 92, 7, 6, 1, 211, 178, 152, 92, 7, 6, 1, 211, 117, 152, 92,
+ 7, 6, 1, 210, 159, 249, 129, 152, 92, 7, 6, 1, 226, 106, 152, 92, 240,
+ 114, 152, 92, 190, 152, 92, 206, 152, 92, 255, 26, 152, 92, 212, 23, 42,
+ 247, 165, 92, 250, 24, 92, 249, 171, 92, 243, 253, 92, 240, 106, 92, 229,
+ 87, 92, 229, 80, 92, 226, 215, 92, 219, 36, 92, 120, 2, 245, 32, 78, 92,
+ 213, 119, 223, 104, 235, 240, 16, 1, 61, 223, 104, 235, 240, 16, 1, 253,
+ 159, 223, 104, 235, 240, 16, 1, 251, 67, 223, 104, 235, 240, 16, 1, 249,
+ 61, 223, 104, 235, 240, 16, 1, 75, 223, 104, 235, 240, 16, 1, 245, 7,
+ 223, 104, 235, 240, 16, 1, 243, 203, 223, 104, 235, 240, 16, 1, 242, 61,
+ 223, 104, 235, 240, 16, 1, 73, 223, 104, 235, 240, 16, 1, 235, 145, 223,
+ 104, 235, 240, 16, 1, 235, 24, 223, 104, 235, 240, 16, 1, 156, 223, 104,
+ 235, 240, 16, 1, 193, 223, 104, 235, 240, 16, 1, 230, 26, 223, 104, 235,
+ 240, 16, 1, 76, 223, 104, 235, 240, 16, 1, 226, 106, 223, 104, 235, 240,
+ 16, 1, 224, 97, 223, 104, 235, 240, 16, 1, 153, 223, 104, 235, 240, 16,
+ 1, 222, 92, 223, 104, 235, 240, 16, 1, 217, 153, 223, 104, 235, 240, 16,
+ 1, 70, 223, 104, 235, 240, 16, 1, 214, 105, 223, 104, 235, 240, 16, 1,
+ 212, 98, 223, 104, 235, 240, 16, 1, 211, 178, 223, 104, 235, 240, 16, 1,
+ 211, 117, 223, 104, 235, 240, 16, 1, 210, 159, 42, 141, 241, 64, 92, 56,
+ 234, 19, 92, 56, 206, 92, 9, 214, 177, 238, 51, 92, 9, 214, 177, 238, 55,
+ 92, 9, 214, 177, 238, 63, 92, 56, 248, 91, 92, 9, 214, 177, 238, 70, 92,
+ 9, 214, 177, 238, 57, 92, 9, 214, 177, 238, 29, 92, 9, 214, 177, 238, 56,
+ 92, 9, 214, 177, 238, 69, 92, 9, 214, 177, 238, 43, 92, 9, 214, 177, 238,
+ 36, 92, 9, 214, 177, 238, 45, 92, 9, 214, 177, 238, 66, 92, 9, 214, 177,
+ 238, 52, 92, 9, 214, 177, 238, 68, 92, 9, 214, 177, 238, 44, 92, 9, 214,
+ 177, 238, 67, 92, 9, 214, 177, 238, 30, 92, 9, 214, 177, 238, 35, 92, 9,
+ 214, 177, 238, 28, 92, 9, 214, 177, 238, 58, 92, 9, 214, 177, 238, 60,
+ 92, 9, 214, 177, 238, 38, 92, 9, 214, 177, 238, 49, 92, 9, 214, 177, 238,
+ 47, 92, 9, 214, 177, 238, 73, 92, 9, 214, 177, 238, 72, 92, 9, 214, 177,
+ 238, 26, 92, 9, 214, 177, 238, 53, 92, 9, 214, 177, 238, 71, 92, 9, 214,
+ 177, 238, 62, 92, 9, 214, 177, 238, 48, 92, 9, 214, 177, 238, 27, 92, 9,
+ 214, 177, 238, 50, 92, 9, 214, 177, 238, 32, 92, 9, 214, 177, 238, 31,
+ 92, 9, 214, 177, 238, 61, 92, 9, 214, 177, 238, 39, 92, 9, 214, 177, 238,
+ 41, 92, 9, 214, 177, 238, 42, 92, 9, 214, 177, 238, 34, 92, 9, 214, 177,
+ 238, 65, 92, 9, 214, 177, 238, 59, 216, 7, 220, 54, 251, 158, 9, 214,
+ 177, 238, 40, 216, 7, 220, 54, 251, 158, 9, 214, 177, 238, 72, 216, 7,
+ 220, 54, 251, 158, 9, 214, 177, 238, 70, 216, 7, 220, 54, 251, 158, 9,
+ 214, 177, 238, 54, 216, 7, 220, 54, 251, 158, 9, 214, 177, 238, 37, 216,
+ 7, 220, 54, 251, 158, 9, 214, 177, 238, 50, 216, 7, 220, 54, 251, 158, 9,
+ 214, 177, 238, 33, 216, 7, 220, 54, 251, 158, 9, 214, 177, 238, 64, 216,
+ 7, 220, 54, 251, 158, 9, 214, 177, 238, 46, 37, 154, 254, 246, 37, 154,
+ 255, 13, 249, 72, 244, 43, 250, 1, 214, 194, 228, 214, 2, 218, 154, 218,
+ 34, 117, 230, 115, 218, 33, 250, 27, 253, 208, 246, 55, 218, 32, 117,
+ 251, 119, 223, 159, 251, 141, 253, 208, 228, 213, 212, 41, 212, 35, 213,
+ 131, 230, 196, 212, 25, 245, 225, 242, 182, 245, 46, 245, 225, 242, 182,
+ 254, 129, 245, 225, 242, 182, 253, 226, 242, 182, 2, 231, 52, 166, 230,
+ 130, 87, 212, 27, 249, 138, 230, 130, 87, 244, 93, 224, 23, 230, 130, 87,
+ 212, 27, 242, 211, 230, 130, 87, 243, 230, 230, 130, 87, 212, 52, 242,
+ 211, 230, 130, 87, 233, 81, 224, 23, 230, 130, 87, 212, 52, 249, 138,
+ 230, 130, 87, 249, 138, 230, 129, 166, 230, 130, 2, 244, 191, 244, 93,
+ 224, 23, 230, 130, 2, 244, 191, 233, 81, 224, 23, 230, 130, 2, 244, 191,
+ 243, 230, 230, 130, 2, 244, 191, 218, 39, 2, 244, 191, 242, 180, 218,
+ 157, 220, 0, 218, 157, 250, 117, 221, 169, 245, 40, 215, 236, 248, 85,
+ 215, 236, 226, 60, 215, 236, 251, 28, 215, 110, 250, 119, 251, 211, 222,
+ 192, 241, 180, 218, 37, 251, 211, 245, 229, 64, 231, 195, 245, 229, 64,
+ 223, 32, 241, 205, 244, 12, 233, 55, 249, 247, 231, 171, 233, 54, 244,
+ 177, 233, 54, 233, 55, 244, 48, 236, 1, 211, 239, 230, 59, 216, 35, 253,
+ 192, 242, 144, 231, 68, 212, 39, 217, 58, 233, 27, 252, 150, 225, 63,
+ 223, 112, 254, 55, 242, 128, 254, 55, 225, 218, 225, 219, 250, 120, 218,
+ 115, 242, 24, 219, 91, 64, 225, 45, 231, 88, 226, 198, 251, 195, 224,
+ 230, 233, 37, 223, 33, 249, 143, 223, 33, 252, 160, 249, 174, 223, 32,
+ 249, 96, 22, 223, 32, 218, 142, 251, 168, 219, 15, 251, 152, 243, 252,
+ 243, 248, 222, 208, 217, 247, 224, 232, 248, 176, 226, 237, 218, 8, 243,
+ 249, 219, 231, 244, 92, 251, 22, 2, 217, 240, 248, 36, 219, 53, 240, 113,
+ 249, 142, 220, 71, 240, 112, 240, 113, 249, 142, 246, 109, 249, 173, 250,
+ 85, 130, 250, 255, 232, 142, 249, 89, 241, 56, 224, 234, 219, 241, 252,
+ 37, 251, 164, 224, 235, 64, 244, 34, 249, 172, 244, 25, 22, 234, 33, 217,
+ 20, 211, 230, 242, 14, 222, 13, 251, 178, 22, 249, 103, 211, 237, 242,
+ 185, 249, 236, 242, 185, 215, 194, 246, 91, 252, 63, 230, 94, 250, 8,
+ 252, 63, 230, 93, 252, 188, 251, 177, 223, 34, 211, 201, 224, 196, 251,
+ 236, 251, 21, 235, 139, 250, 78, 215, 236, 244, 163, 250, 77, 244, 95,
+ 244, 96, 219, 13, 252, 159, 225, 251, 224, 245, 249, 205, 252, 160, 217,
+ 60, 215, 236, 249, 129, 244, 68, 225, 64, 248, 82, 235, 132, 247, 132,
+ 250, 233, 218, 114, 211, 240, 250, 99, 230, 130, 213, 164, 250, 163, 221,
+ 200, 221, 225, 242, 149, 250, 252, 250, 234, 240, 246, 244, 131, 212, 0,
+ 222, 201, 249, 237, 244, 87, 225, 3, 22, 244, 91, 230, 228, 230, 109,
+ 251, 11, 250, 40, 241, 233, 253, 242, 226, 63, 216, 15, 241, 252, 250,
+ 30, 216, 243, 216, 114, 250, 21, 251, 203, 225, 178, 253, 241, 213, 172,
+ 243, 111, 247, 198, 241, 157, 219, 85, 231, 235, 251, 246, 243, 112, 247,
+ 241, 251, 167, 244, 53, 225, 34, 250, 242, 28, 228, 48, 230, 86, 28, 228,
+ 43, 221, 213, 242, 100, 28, 234, 138, 215, 191, 213, 154, 28, 221, 193,
+ 222, 125, 220, 12, 2, 221, 228, 216, 245, 223, 179, 22, 252, 160, 219,
+ 106, 22, 219, 106, 251, 188, 252, 124, 22, 241, 50, 250, 121, 244, 74,
+ 219, 64, 222, 126, 218, 13, 215, 195, 240, 247, 223, 180, 254, 130, 244,
+ 32, 222, 137, 244, 32, 217, 242, 240, 236, 251, 120, 240, 236, 2, 243,
+ 95, 226, 230, 251, 120, 235, 132, 224, 240, 226, 229, 245, 45, 224, 240,
+ 226, 229, 240, 245, 252, 146, 253, 182, 216, 253, 231, 235, 240, 241,
+ 232, 112, 240, 241, 249, 177, 218, 126, 221, 199, 248, 44, 218, 126, 244,
+ 181, 235, 150, 233, 90, 235, 132, 250, 227, 245, 45, 250, 227, 223, 142,
+ 230, 113, 226, 115, 212, 41, 251, 124, 249, 146, 216, 107, 233, 19, 223,
+ 181, 250, 225, 246, 97, 249, 136, 212, 3, 219, 71, 219, 69, 240, 246,
+ 223, 154, 242, 171, 220, 58, 230, 146, 222, 195, 250, 109, 247, 137, 225,
+ 74, 251, 204, 245, 170, 226, 239, 218, 253, 220, 53, 251, 123, 254, 93,
+ 241, 55, 233, 122, 252, 61, 244, 91, 215, 194, 244, 91, 251, 210, 215,
+ 91, 241, 250, 250, 110, 252, 188, 250, 110, 243, 243, 252, 188, 250, 110,
+ 251, 238, 225, 196, 234, 27, 224, 249, 246, 88, 251, 12, 252, 178, 251,
+ 12, 247, 131, 230, 114, 244, 191, 249, 147, 244, 191, 216, 108, 244, 191,
+ 223, 182, 244, 191, 250, 226, 244, 191, 246, 98, 244, 191, 218, 242, 212,
+ 3, 240, 247, 244, 191, 230, 147, 244, 191, 247, 138, 244, 191, 225, 75,
+ 244, 191, 243, 246, 244, 191, 242, 21, 244, 191, 211, 224, 244, 191, 252,
+ 72, 244, 191, 226, 46, 244, 191, 225, 75, 228, 54, 225, 233, 224, 187,
+ 245, 14, 245, 228, 228, 54, 230, 111, 216, 20, 71, 120, 225, 8, 252, 183,
+ 235, 243, 71, 124, 225, 8, 252, 183, 235, 243, 71, 43, 225, 8, 252, 183,
+ 235, 243, 71, 44, 225, 8, 252, 183, 235, 243, 244, 85, 242, 17, 50, 212,
+ 33, 242, 17, 50, 226, 216, 242, 17, 50, 216, 136, 120, 50, 216, 136, 124,
+ 50, 250, 20, 242, 12, 50, 204, 242, 12, 50, 249, 124, 211, 220, 241, 252,
+ 245, 15, 229, 105, 217, 152, 235, 126, 246, 93, 234, 83, 251, 248, 211,
+ 220, 249, 250, 224, 128, 242, 15, 224, 231, 231, 178, 220, 5, 253, 204,
+ 220, 5, 241, 165, 220, 5, 211, 220, 221, 241, 211, 220, 251, 187, 244,
+ 30, 251, 91, 236, 1, 219, 170, 251, 90, 236, 1, 219, 170, 251, 163, 242,
+ 195, 231, 186, 211, 221, 244, 175, 231, 187, 22, 211, 222, 241, 61, 242,
+ 11, 113, 231, 60, 241, 61, 242, 11, 113, 211, 219, 241, 61, 242, 11, 225,
+ 0, 226, 228, 211, 222, 2, 251, 107, 245, 226, 251, 142, 2, 213, 246, 225,
+ 169, 2, 251, 213, 242, 35, 231, 187, 2, 242, 111, 225, 110, 231, 175,
+ 231, 187, 2, 215, 98, 226, 209, 231, 186, 226, 209, 211, 221, 252, 187,
+ 249, 191, 211, 205, 224, 190, 235, 132, 226, 224, 235, 132, 242, 170,
+ 242, 223, 252, 188, 254, 114, 245, 19, 254, 161, 254, 162, 230, 137, 236,
+ 6, 219, 101, 235, 233, 248, 35, 225, 168, 242, 106, 248, 180, 232, 202,
+ 229, 212, 224, 255, 244, 192, 231, 143, 242, 34, 252, 139, 225, 2, 217,
+ 172, 225, 67, 234, 65, 78, 232, 112, 233, 11, 222, 234, 243, 55, 218,
+ 132, 234, 64, 251, 172, 249, 149, 2, 241, 228, 212, 19, 252, 70, 241,
+ 228, 251, 136, 241, 228, 113, 241, 226, 219, 11, 241, 228, 242, 121, 241,
+ 228, 241, 229, 2, 74, 251, 209, 241, 228, 242, 128, 241, 228, 211, 42,
+ 241, 228, 224, 129, 241, 228, 241, 229, 2, 223, 34, 223, 45, 241, 226,
+ 241, 229, 248, 82, 247, 250, 220, 83, 2, 115, 59, 235, 216, 245, 173,
+ 192, 251, 117, 254, 113, 87, 251, 196, 219, 93, 87, 249, 229, 87, 218,
+ 247, 217, 249, 87, 246, 86, 248, 158, 87, 225, 68, 64, 224, 250, 244, 62,
+ 252, 4, 247, 166, 87, 219, 4, 252, 159, 216, 150, 252, 159, 71, 244, 52,
+ 240, 212, 225, 6, 87, 230, 150, 252, 173, 249, 99, 245, 33, 114, 247,
+ 133, 50, 249, 140, 250, 243, 252, 145, 2, 211, 40, 50, 252, 145, 2, 247,
+ 133, 50, 252, 145, 2, 245, 48, 50, 252, 145, 2, 224, 229, 50, 230, 150,
+ 2, 211, 235, 250, 139, 2, 214, 153, 215, 232, 22, 211, 40, 50, 221, 179,
+ 225, 167, 249, 209, 251, 140, 230, 187, 244, 57, 247, 186, 226, 162, 247,
+ 191, 246, 50, 244, 108, 244, 41, 204, 244, 108, 244, 41, 226, 77, 2, 249,
+ 101, 226, 77, 244, 184, 214, 163, 251, 17, 217, 19, 251, 17, 250, 244,
+ 235, 243, 250, 139, 2, 214, 153, 215, 231, 250, 139, 2, 246, 105, 215,
+ 231, 252, 142, 250, 138, 250, 7, 224, 124, 222, 186, 224, 124, 226, 20,
+ 218, 122, 222, 132, 215, 223, 222, 132, 251, 192, 217, 92, 233, 52, 228,
+ 46, 228, 47, 2, 248, 81, 249, 148, 250, 1, 251, 193, 204, 251, 193, 242,
+ 128, 251, 193, 251, 209, 251, 193, 226, 158, 251, 193, 251, 190, 229,
+ 206, 252, 176, 221, 187, 231, 61, 217, 2, 223, 124, 226, 75, 244, 160,
+ 231, 235, 221, 224, 254, 90, 224, 146, 254, 253, 232, 114, 250, 128, 231,
+ 73, 226, 130, 215, 239, 235, 253, 215, 239, 226, 83, 246, 25, 87, 235,
+ 250, 245, 120, 245, 121, 2, 246, 105, 80, 48, 250, 1, 231, 201, 2, 232,
+ 108, 244, 74, 250, 1, 231, 201, 2, 223, 158, 244, 74, 204, 231, 201, 2,
+ 223, 158, 244, 74, 204, 231, 201, 2, 232, 108, 244, 74, 224, 237, 224,
+ 238, 240, 249, 229, 85, 230, 160, 225, 118, 230, 160, 225, 119, 2, 97,
+ 80, 253, 208, 233, 47, 213, 175, 230, 159, 230, 160, 225, 119, 226, 231,
+ 228, 76, 230, 160, 225, 117, 254, 91, 2, 252, 130, 251, 11, 213, 172,
+ 251, 11, 216, 255, 223, 174, 213, 171, 215, 60, 97, 253, 248, 250, 3, 97,
+ 22, 140, 204, 250, 37, 253, 248, 250, 3, 97, 22, 140, 204, 250, 37, 253,
+ 249, 2, 37, 123, 226, 121, 250, 3, 246, 105, 22, 214, 153, 204, 250, 37,
+ 253, 248, 254, 89, 246, 105, 22, 214, 153, 204, 250, 37, 253, 248, 121,
+ 251, 139, 87, 125, 251, 139, 87, 219, 8, 2, 251, 5, 91, 219, 7, 219, 8,
+ 2, 123, 219, 32, 212, 35, 219, 8, 2, 134, 219, 32, 212, 34, 252, 116,
+ 245, 173, 225, 28, 233, 43, 231, 212, 242, 185, 222, 248, 231, 212, 242,
+ 185, 232, 153, 2, 235, 226, 225, 200, 250, 1, 232, 153, 2, 234, 139, 234,
+ 139, 232, 152, 204, 232, 152, 252, 45, 252, 46, 2, 251, 5, 91, 251, 191,
+ 232, 205, 87, 223, 175, 251, 87, 252, 186, 2, 140, 80, 48, 245, 144, 2,
+ 140, 80, 48, 226, 198, 2, 245, 32, 164, 2, 43, 44, 80, 48, 219, 40, 2,
+ 97, 80, 48, 216, 15, 2, 214, 153, 80, 48, 228, 76, 123, 214, 184, 245,
+ 192, 87, 234, 137, 216, 248, 235, 220, 16, 31, 7, 6, 233, 10, 235, 220,
+ 16, 31, 7, 4, 233, 10, 235, 220, 16, 31, 227, 200, 235, 220, 16, 31, 217,
+ 184, 235, 220, 16, 31, 7, 233, 10, 244, 97, 245, 173, 216, 10, 211, 199,
+ 242, 22, 227, 183, 22, 251, 198, 241, 67, 225, 51, 230, 227, 217, 0, 249,
+ 115, 252, 160, 219, 126, 225, 10, 218, 158, 2, 230, 225, 247, 121, 235,
+ 132, 16, 31, 252, 58, 215, 221, 245, 157, 85, 42, 251, 87, 71, 42, 251,
+ 87, 233, 86, 223, 112, 250, 36, 233, 86, 251, 209, 250, 36, 233, 86, 226,
+ 158, 247, 249, 233, 86, 251, 209, 247, 249, 4, 226, 158, 247, 249, 4,
+ 251, 209, 247, 249, 214, 162, 223, 112, 215, 226, 246, 106, 223, 112,
+ 215, 226, 214, 162, 4, 223, 112, 215, 226, 246, 106, 4, 223, 112, 215,
+ 226, 37, 249, 132, 224, 253, 249, 132, 224, 254, 2, 242, 27, 51, 249,
+ 132, 224, 253, 228, 50, 43, 220, 154, 2, 134, 247, 119, 250, 5, 244, 192,
+ 123, 226, 243, 250, 5, 244, 192, 113, 226, 243, 250, 5, 244, 192, 134,
+ 226, 243, 250, 5, 244, 192, 244, 12, 226, 243, 250, 5, 244, 192, 244, 82,
+ 226, 243, 250, 5, 244, 192, 219, 126, 226, 243, 250, 5, 244, 192, 220,
+ 123, 226, 243, 250, 5, 244, 192, 245, 194, 226, 243, 250, 5, 244, 192,
+ 228, 201, 226, 243, 250, 5, 244, 192, 216, 249, 226, 243, 250, 5, 244,
+ 192, 245, 169, 226, 243, 250, 5, 244, 192, 215, 77, 226, 243, 250, 5,
+ 244, 192, 226, 193, 250, 5, 244, 192, 215, 56, 250, 5, 244, 192, 216,
+ 141, 250, 5, 244, 192, 244, 8, 250, 5, 244, 192, 244, 80, 250, 5, 244,
+ 192, 219, 122, 250, 5, 244, 192, 220, 122, 250, 5, 244, 192, 245, 193,
+ 250, 5, 244, 192, 228, 200, 250, 5, 244, 192, 216, 247, 250, 5, 244, 192,
+ 245, 167, 250, 5, 244, 192, 215, 75, 230, 118, 243, 231, 216, 37, 216, 3,
+ 218, 149, 64, 232, 240, 219, 171, 64, 235, 133, 230, 107, 242, 125, 244,
+ 191, 242, 125, 244, 192, 2, 219, 75, 245, 14, 244, 192, 2, 217, 15, 64,
+ 235, 54, 219, 75, 244, 192, 2, 204, 230, 111, 219, 75, 244, 192, 2, 204,
+ 230, 112, 22, 219, 75, 245, 14, 219, 75, 244, 192, 2, 204, 230, 112, 22,
+ 249, 231, 217, 248, 219, 75, 244, 192, 2, 204, 230, 112, 22, 216, 105,
+ 245, 14, 219, 75, 244, 192, 2, 242, 26, 219, 75, 244, 192, 2, 240, 248,
+ 211, 233, 244, 191, 219, 75, 244, 192, 2, 219, 75, 245, 14, 244, 192,
+ 221, 218, 248, 63, 244, 34, 223, 89, 244, 191, 219, 75, 244, 192, 2, 241,
+ 227, 245, 14, 219, 75, 244, 192, 2, 218, 35, 219, 74, 244, 191, 229, 88,
+ 244, 191, 245, 24, 244, 191, 214, 188, 244, 191, 244, 192, 2, 249, 231,
+ 217, 248, 225, 193, 244, 191, 249, 202, 244, 191, 249, 203, 244, 191,
+ 234, 63, 244, 191, 244, 192, 216, 138, 115, 234, 64, 234, 63, 244, 192,
+ 2, 219, 75, 245, 14, 234, 63, 244, 192, 2, 250, 1, 245, 14, 244, 192, 2,
+ 218, 89, 216, 20, 244, 192, 2, 218, 89, 216, 21, 22, 211, 233, 245, 16,
+ 244, 192, 2, 218, 89, 216, 21, 22, 216, 105, 245, 14, 247, 193, 244, 191,
+ 211, 204, 244, 191, 254, 109, 244, 191, 224, 228, 244, 191, 249, 117,
+ 244, 191, 225, 171, 244, 191, 244, 192, 2, 232, 127, 64, 215, 205, 247,
+ 193, 251, 89, 223, 89, 244, 191, 243, 240, 244, 192, 2, 204, 230, 111,
+ 254, 107, 244, 191, 244, 153, 244, 191, 212, 20, 244, 191, 219, 92, 244,
+ 191, 216, 72, 244, 191, 242, 126, 244, 191, 232, 115, 249, 117, 244, 191,
+ 244, 192, 2, 204, 230, 111, 240, 204, 244, 191, 244, 192, 2, 204, 230,
+ 112, 22, 249, 231, 217, 248, 244, 192, 221, 191, 236, 1, 244, 154, 253,
+ 214, 244, 191, 244, 50, 244, 191, 219, 93, 244, 191, 247, 166, 244, 191,
+ 244, 192, 211, 230, 230, 111, 244, 192, 2, 231, 85, 231, 145, 242, 125,
+ 250, 226, 244, 192, 2, 219, 75, 245, 14, 250, 226, 244, 192, 2, 217, 15,
+ 64, 235, 54, 219, 75, 250, 226, 244, 192, 2, 204, 230, 111, 219, 75, 250,
+ 226, 244, 192, 2, 241, 227, 245, 14, 250, 226, 244, 192, 2, 211, 196,
+ 219, 76, 234, 63, 250, 226, 244, 192, 2, 250, 1, 245, 14, 224, 228, 250,
+ 226, 244, 191, 249, 117, 250, 226, 244, 191, 212, 20, 250, 226, 244, 191,
+ 244, 192, 2, 228, 76, 242, 164, 243, 35, 244, 192, 2, 226, 216, 243, 35,
+ 225, 169, 251, 169, 248, 76, 221, 170, 230, 146, 241, 230, 230, 146, 219,
+ 9, 230, 146, 242, 6, 225, 169, 223, 157, 123, 242, 16, 225, 169, 223,
+ 157, 251, 179, 242, 12, 236, 1, 250, 180, 225, 169, 243, 239, 225, 169,
+ 2, 224, 228, 244, 191, 225, 169, 2, 244, 42, 242, 11, 222, 204, 241, 215,
+ 218, 144, 232, 150, 223, 163, 250, 245, 241, 163, 215, 249, 241, 163,
+ 215, 250, 2, 251, 115, 228, 54, 215, 249, 231, 33, 192, 223, 164, 218,
+ 150, 215, 247, 215, 248, 250, 245, 251, 93, 226, 195, 251, 93, 215, 202,
+ 251, 94, 218, 130, 230, 188, 254, 131, 244, 98, 245, 138, 225, 0, 250,
+ 245, 226, 195, 225, 0, 250, 245, 217, 33, 226, 195, 217, 33, 253, 181,
+ 226, 195, 253, 181, 223, 119, 213, 247, 248, 59, 215, 193, 253, 243, 232,
+ 118, 215, 255, 230, 140, 230, 117, 223, 162, 218, 7, 223, 162, 230, 117,
+ 251, 29, 254, 230, 215, 246, 220, 17, 222, 183, 219, 2, 203, 215, 253,
+ 232, 231, 67, 215, 253, 232, 231, 249, 191, 50, 225, 0, 250, 230, 223,
+ 45, 232, 231, 215, 223, 244, 75, 226, 198, 224, 239, 247, 124, 228, 76,
+ 245, 126, 50, 219, 73, 87, 228, 76, 219, 73, 87, 224, 123, 232, 194, 236,
+ 1, 235, 158, 225, 42, 87, 247, 147, 228, 53, 232, 194, 87, 224, 233, 212,
+ 41, 87, 228, 67, 212, 41, 87, 252, 3, 228, 76, 252, 2, 252, 1, 230, 117,
+ 252, 1, 225, 214, 228, 76, 225, 213, 250, 101, 249, 125, 231, 57, 87,
+ 211, 218, 87, 223, 60, 252, 188, 87, 216, 38, 212, 41, 249, 254, 219,
+ 235, 252, 119, 252, 117, 225, 243, 249, 178, 249, 87, 252, 170, 250, 23,
+ 43, 232, 91, 108, 16, 31, 224, 4, 108, 16, 31, 254, 193, 108, 16, 31,
+ 244, 97, 108, 16, 31, 245, 224, 108, 16, 31, 212, 40, 108, 16, 31, 254,
+ 44, 108, 16, 31, 254, 45, 223, 106, 108, 16, 31, 254, 45, 223, 105, 108,
+ 16, 31, 254, 45, 213, 143, 108, 16, 31, 254, 45, 213, 142, 108, 16, 31,
213, 157, 108, 16, 31, 213, 156, 108, 16, 31, 213, 155, 108, 16, 31, 218,
- 44, 108, 16, 31, 225, 125, 218, 44, 108, 16, 31, 85, 218, 44, 108, 16,
- 31, 231, 55, 218, 71, 108, 16, 31, 231, 55, 218, 70, 108, 16, 31, 231,
- 55, 218, 69, 108, 16, 31, 250, 38, 108, 16, 31, 222, 1, 108, 16, 31, 228,
- 188, 108, 16, 31, 213, 141, 108, 16, 31, 213, 140, 108, 16, 31, 222, 204,
- 222, 1, 108, 16, 31, 222, 204, 222, 0, 108, 16, 31, 242, 166, 108, 16,
- 31, 219, 166, 108, 16, 31, 235, 177, 226, 153, 108, 16, 31, 235, 177,
- 226, 152, 108, 16, 31, 249, 134, 64, 235, 176, 108, 16, 31, 223, 101, 64,
- 235, 176, 108, 16, 31, 249, 168, 226, 153, 108, 16, 31, 235, 175, 226,
- 153, 108, 16, 31, 218, 72, 64, 249, 167, 108, 16, 31, 249, 134, 64, 249,
- 167, 108, 16, 31, 249, 134, 64, 249, 166, 108, 16, 31, 249, 168, 254, 83,
- 108, 16, 31, 222, 2, 64, 249, 168, 254, 83, 108, 16, 31, 218, 72, 64,
- 222, 2, 64, 249, 167, 108, 16, 31, 213, 243, 108, 16, 31, 216, 84, 226,
- 153, 108, 16, 31, 233, 57, 226, 153, 108, 16, 31, 254, 82, 226, 153, 108,
- 16, 31, 218, 72, 64, 254, 81, 108, 16, 31, 222, 2, 64, 254, 81, 108, 16,
- 31, 218, 72, 64, 222, 2, 64, 254, 81, 108, 16, 31, 213, 158, 64, 254, 81,
- 108, 16, 31, 223, 101, 64, 254, 81, 108, 16, 31, 223, 101, 64, 254, 80,
- 108, 16, 31, 223, 100, 108, 16, 31, 223, 99, 108, 16, 31, 223, 98, 108,
- 16, 31, 223, 97, 108, 16, 31, 254, 157, 108, 16, 31, 254, 156, 108, 16,
- 31, 231, 163, 108, 16, 31, 222, 7, 108, 16, 31, 253, 246, 108, 16, 31,
- 223, 125, 108, 16, 31, 223, 124, 108, 16, 31, 253, 183, 108, 16, 31, 251,
- 229, 226, 153, 108, 16, 31, 217, 49, 108, 16, 31, 217, 48, 108, 16, 31,
- 224, 8, 232, 222, 108, 16, 31, 251, 183, 108, 16, 31, 251, 182, 108, 16,
- 31, 251, 181, 108, 16, 31, 254, 138, 108, 16, 31, 226, 218, 108, 16, 31,
- 218, 248, 108, 16, 31, 216, 82, 108, 16, 31, 242, 96, 108, 16, 31, 212,
- 28, 108, 16, 31, 224, 226, 108, 16, 31, 251, 14, 108, 16, 31, 215, 86,
- 108, 16, 31, 250, 246, 230, 122, 108, 16, 31, 221, 202, 64, 235, 55, 108,
- 16, 31, 251, 25, 108, 16, 31, 215, 219, 108, 16, 31, 218, 154, 215, 219,
- 108, 16, 31, 232, 148, 108, 16, 31, 219, 56, 108, 16, 31, 214, 142, 108,
- 16, 31, 240, 246, 246, 64, 108, 16, 31, 253, 227, 108, 16, 31, 224, 234,
- 253, 227, 108, 16, 31, 251, 142, 108, 16, 31, 224, 225, 251, 142, 108,
- 16, 31, 254, 135, 108, 16, 31, 218, 117, 218, 26, 218, 116, 108, 16, 31,
- 218, 117, 218, 26, 218, 115, 108, 16, 31, 218, 68, 108, 16, 31, 224, 200,
- 108, 16, 31, 247, 181, 108, 16, 31, 247, 183, 108, 16, 31, 247, 182, 108,
- 16, 31, 224, 131, 108, 16, 31, 224, 120, 108, 16, 31, 249, 122, 108, 16,
- 31, 249, 121, 108, 16, 31, 249, 120, 108, 16, 31, 249, 119, 108, 16, 31,
- 249, 118, 108, 16, 31, 254, 169, 108, 16, 31, 252, 119, 64, 231, 149,
- 108, 16, 31, 252, 119, 64, 214, 17, 108, 16, 31, 223, 57, 108, 16, 31,
- 240, 238, 108, 16, 31, 228, 212, 108, 16, 31, 248, 145, 108, 16, 31, 230,
- 134, 108, 16, 31, 163, 246, 94, 108, 16, 31, 163, 226, 132, 9, 14, 240,
- 102, 9, 14, 240, 101, 9, 14, 240, 100, 9, 14, 240, 99, 9, 14, 240, 98, 9,
- 14, 240, 97, 9, 14, 240, 96, 9, 14, 240, 95, 9, 14, 240, 94, 9, 14, 240,
- 93, 9, 14, 240, 92, 9, 14, 240, 91, 9, 14, 240, 90, 9, 14, 240, 89, 9,
- 14, 240, 88, 9, 14, 240, 87, 9, 14, 240, 86, 9, 14, 240, 85, 9, 14, 240,
- 84, 9, 14, 240, 83, 9, 14, 240, 82, 9, 14, 240, 81, 9, 14, 240, 80, 9,
- 14, 240, 79, 9, 14, 240, 78, 9, 14, 240, 77, 9, 14, 240, 76, 9, 14, 240,
- 75, 9, 14, 240, 74, 9, 14, 240, 73, 9, 14, 240, 72, 9, 14, 240, 71, 9,
- 14, 240, 70, 9, 14, 240, 69, 9, 14, 240, 68, 9, 14, 240, 67, 9, 14, 240,
- 66, 9, 14, 240, 65, 9, 14, 240, 64, 9, 14, 240, 63, 9, 14, 240, 62, 9,
- 14, 240, 61, 9, 14, 240, 60, 9, 14, 240, 59, 9, 14, 240, 58, 9, 14, 240,
- 57, 9, 14, 240, 56, 9, 14, 240, 55, 9, 14, 240, 54, 9, 14, 240, 53, 9,
- 14, 240, 52, 9, 14, 240, 51, 9, 14, 240, 50, 9, 14, 240, 49, 9, 14, 240,
- 48, 9, 14, 240, 47, 9, 14, 240, 46, 9, 14, 240, 45, 9, 14, 240, 44, 9,
- 14, 240, 43, 9, 14, 240, 42, 9, 14, 240, 41, 9, 14, 240, 40, 9, 14, 240,
- 39, 9, 14, 240, 38, 9, 14, 240, 37, 9, 14, 240, 36, 9, 14, 240, 35, 9,
- 14, 240, 34, 9, 14, 240, 33, 9, 14, 240, 32, 9, 14, 240, 31, 9, 14, 240,
- 30, 9, 14, 240, 29, 9, 14, 240, 28, 9, 14, 240, 27, 9, 14, 240, 26, 9,
- 14, 240, 25, 9, 14, 240, 24, 9, 14, 240, 23, 9, 14, 240, 22, 9, 14, 240,
- 21, 9, 14, 240, 20, 9, 14, 240, 19, 9, 14, 240, 18, 9, 14, 240, 17, 9,
- 14, 240, 16, 9, 14, 240, 15, 9, 14, 240, 14, 9, 14, 240, 13, 9, 14, 240,
- 12, 9, 14, 240, 11, 9, 14, 240, 10, 9, 14, 240, 9, 9, 14, 240, 8, 9, 14,
- 240, 7, 9, 14, 240, 6, 9, 14, 240, 5, 9, 14, 240, 4, 9, 14, 240, 3, 9,
- 14, 240, 2, 9, 14, 240, 1, 9, 14, 240, 0, 9, 14, 239, 255, 9, 14, 239,
- 254, 9, 14, 239, 253, 9, 14, 239, 252, 9, 14, 239, 251, 9, 14, 239, 250,
- 9, 14, 239, 249, 9, 14, 239, 248, 9, 14, 239, 247, 9, 14, 239, 246, 9,
- 14, 239, 245, 9, 14, 239, 244, 9, 14, 239, 243, 9, 14, 239, 242, 9, 14,
- 239, 241, 9, 14, 239, 240, 9, 14, 239, 239, 9, 14, 239, 238, 9, 14, 239,
- 237, 9, 14, 239, 236, 9, 14, 239, 235, 9, 14, 239, 234, 9, 14, 239, 233,
- 9, 14, 239, 232, 9, 14, 239, 231, 9, 14, 239, 230, 9, 14, 239, 229, 9,
- 14, 239, 228, 9, 14, 239, 227, 9, 14, 239, 226, 9, 14, 239, 225, 9, 14,
- 239, 224, 9, 14, 239, 223, 9, 14, 239, 222, 9, 14, 239, 221, 9, 14, 239,
- 220, 9, 14, 239, 219, 9, 14, 239, 218, 9, 14, 239, 217, 9, 14, 239, 216,
- 9, 14, 239, 215, 9, 14, 239, 214, 9, 14, 239, 213, 9, 14, 239, 212, 9,
- 14, 239, 211, 9, 14, 239, 210, 9, 14, 239, 209, 9, 14, 239, 208, 9, 14,
- 239, 207, 9, 14, 239, 206, 9, 14, 239, 205, 9, 14, 239, 204, 9, 14, 239,
- 203, 9, 14, 239, 202, 9, 14, 239, 201, 9, 14, 239, 200, 9, 14, 239, 199,
- 9, 14, 239, 198, 9, 14, 239, 197, 9, 14, 239, 196, 9, 14, 239, 195, 9,
- 14, 239, 194, 9, 14, 239, 193, 9, 14, 239, 192, 9, 14, 239, 191, 9, 14,
- 239, 190, 9, 14, 239, 189, 9, 14, 239, 188, 9, 14, 239, 187, 9, 14, 239,
- 186, 9, 14, 239, 185, 9, 14, 239, 184, 9, 14, 239, 183, 9, 14, 239, 182,
- 9, 14, 239, 181, 9, 14, 239, 180, 9, 14, 239, 179, 9, 14, 239, 178, 9,
- 14, 239, 177, 9, 14, 239, 176, 9, 14, 239, 175, 9, 14, 239, 174, 9, 14,
- 239, 173, 9, 14, 239, 172, 9, 14, 239, 171, 9, 14, 239, 170, 9, 14, 239,
- 169, 9, 14, 239, 168, 9, 14, 239, 167, 9, 14, 239, 166, 9, 14, 239, 165,
- 9, 14, 239, 164, 9, 14, 239, 163, 9, 14, 239, 162, 9, 14, 239, 161, 9,
- 14, 239, 160, 9, 14, 239, 159, 9, 14, 239, 158, 9, 14, 239, 157, 9, 14,
- 239, 156, 9, 14, 239, 155, 9, 14, 239, 154, 9, 14, 239, 153, 9, 14, 239,
- 152, 9, 14, 239, 151, 9, 14, 239, 150, 9, 14, 239, 149, 9, 14, 239, 148,
- 9, 14, 239, 147, 9, 14, 239, 146, 9, 14, 239, 145, 9, 14, 239, 144, 9,
- 14, 239, 143, 9, 14, 239, 142, 9, 14, 239, 141, 9, 14, 239, 140, 9, 14,
- 239, 139, 9, 14, 239, 138, 9, 14, 239, 137, 9, 14, 239, 136, 9, 14, 239,
- 135, 9, 14, 239, 134, 9, 14, 239, 133, 9, 14, 239, 132, 9, 14, 239, 131,
- 9, 14, 239, 130, 9, 14, 239, 129, 9, 14, 239, 128, 9, 14, 239, 127, 9,
- 14, 239, 126, 9, 14, 239, 125, 9, 14, 239, 124, 9, 14, 239, 123, 9, 14,
- 239, 122, 9, 14, 239, 121, 9, 14, 239, 120, 9, 14, 239, 119, 9, 14, 239,
- 118, 9, 14, 239, 117, 9, 14, 239, 116, 9, 14, 239, 115, 9, 14, 239, 114,
- 9, 14, 239, 113, 9, 14, 239, 112, 9, 14, 239, 111, 9, 14, 239, 110, 9,
- 14, 239, 109, 9, 14, 239, 108, 9, 14, 239, 107, 9, 14, 239, 106, 9, 14,
- 239, 105, 9, 14, 239, 104, 9, 14, 239, 103, 9, 14, 239, 102, 9, 14, 239,
- 101, 9, 14, 239, 100, 9, 14, 239, 99, 9, 14, 239, 98, 9, 14, 239, 97, 9,
- 14, 239, 96, 9, 14, 239, 95, 9, 14, 239, 94, 9, 14, 239, 93, 9, 14, 239,
- 92, 9, 14, 239, 91, 9, 14, 239, 90, 9, 14, 239, 89, 9, 14, 239, 88, 9,
- 14, 239, 87, 9, 14, 239, 86, 9, 14, 239, 85, 9, 14, 239, 84, 9, 14, 239,
- 83, 9, 14, 239, 82, 9, 14, 239, 81, 9, 14, 239, 80, 9, 14, 239, 79, 9,
- 14, 239, 78, 9, 14, 239, 77, 9, 14, 239, 76, 9, 14, 239, 75, 9, 14, 239,
- 74, 9, 14, 239, 73, 9, 14, 239, 72, 9, 14, 239, 71, 9, 14, 239, 70, 9,
- 14, 239, 69, 9, 14, 239, 68, 9, 14, 239, 67, 9, 14, 239, 66, 9, 14, 239,
- 65, 9, 14, 239, 64, 9, 14, 239, 63, 9, 14, 239, 62, 9, 14, 239, 61, 9,
- 14, 239, 60, 9, 14, 239, 59, 9, 14, 239, 58, 9, 14, 239, 57, 9, 14, 239,
- 56, 9, 14, 239, 55, 9, 14, 239, 54, 9, 14, 239, 53, 9, 14, 239, 52, 9,
- 14, 239, 51, 9, 14, 239, 50, 9, 14, 239, 49, 9, 14, 239, 48, 9, 14, 239,
- 47, 9, 14, 239, 46, 9, 14, 239, 45, 9, 14, 239, 44, 9, 14, 239, 43, 9,
- 14, 239, 42, 9, 14, 239, 41, 9, 14, 239, 40, 9, 14, 239, 39, 9, 14, 239,
- 38, 9, 14, 239, 37, 9, 14, 239, 36, 9, 14, 239, 35, 9, 14, 239, 34, 9,
- 14, 239, 33, 9, 14, 239, 32, 9, 14, 239, 31, 9, 14, 239, 30, 9, 14, 239,
- 29, 9, 14, 239, 28, 9, 14, 239, 27, 9, 14, 239, 26, 9, 14, 239, 25, 9,
- 14, 239, 24, 9, 14, 239, 23, 9, 14, 239, 22, 9, 14, 239, 21, 9, 14, 239,
- 20, 9, 14, 239, 19, 9, 14, 239, 18, 9, 14, 239, 17, 9, 14, 239, 16, 9,
- 14, 239, 15, 9, 14, 239, 14, 9, 14, 239, 13, 9, 14, 239, 12, 9, 14, 239,
- 11, 9, 14, 239, 10, 9, 14, 239, 9, 9, 14, 239, 8, 9, 14, 239, 7, 9, 14,
- 239, 6, 9, 14, 239, 5, 9, 14, 239, 4, 9, 14, 239, 3, 9, 14, 239, 2, 9,
- 14, 239, 1, 9, 14, 239, 0, 9, 14, 238, 255, 9, 14, 238, 254, 9, 14, 238,
- 253, 9, 14, 238, 252, 9, 14, 238, 251, 9, 14, 238, 250, 9, 14, 238, 249,
- 9, 14, 238, 248, 9, 14, 238, 247, 9, 14, 238, 246, 9, 14, 238, 245, 9,
- 14, 238, 244, 9, 14, 238, 243, 9, 14, 238, 242, 9, 14, 238, 241, 9, 14,
- 238, 240, 9, 14, 238, 239, 9, 14, 238, 238, 9, 14, 238, 237, 9, 14, 238,
- 236, 9, 14, 238, 235, 9, 14, 238, 234, 9, 14, 238, 233, 9, 14, 238, 232,
- 9, 14, 238, 231, 9, 14, 238, 230, 9, 14, 238, 229, 9, 14, 238, 228, 9,
- 14, 238, 227, 9, 14, 238, 226, 9, 14, 238, 225, 9, 14, 238, 224, 9, 14,
- 238, 223, 9, 14, 238, 222, 9, 14, 238, 221, 9, 14, 238, 220, 9, 14, 238,
- 219, 9, 14, 238, 218, 9, 14, 238, 217, 9, 14, 238, 216, 9, 14, 238, 215,
- 9, 14, 238, 214, 9, 14, 238, 213, 9, 14, 238, 212, 9, 14, 238, 211, 9,
- 14, 238, 210, 9, 14, 238, 209, 9, 14, 238, 208, 9, 14, 238, 207, 9, 14,
- 238, 206, 9, 14, 238, 205, 9, 14, 238, 204, 9, 14, 238, 203, 9, 14, 238,
- 202, 9, 14, 238, 201, 9, 14, 238, 200, 9, 14, 238, 199, 9, 14, 238, 198,
- 9, 14, 238, 197, 9, 14, 238, 196, 9, 14, 238, 195, 9, 14, 238, 194, 9,
- 14, 238, 193, 9, 14, 238, 192, 9, 14, 238, 191, 9, 14, 238, 190, 9, 14,
- 238, 189, 9, 14, 238, 188, 9, 14, 238, 187, 9, 14, 238, 186, 9, 14, 238,
- 185, 9, 14, 238, 184, 9, 14, 238, 183, 9, 14, 238, 182, 9, 14, 238, 181,
- 9, 14, 238, 180, 9, 14, 238, 179, 9, 14, 238, 178, 9, 14, 238, 177, 9,
- 14, 238, 176, 9, 14, 238, 175, 9, 14, 238, 174, 9, 14, 238, 173, 9, 14,
- 238, 172, 9, 14, 238, 171, 9, 14, 238, 170, 9, 14, 238, 169, 9, 14, 238,
- 168, 9, 14, 238, 167, 9, 14, 238, 166, 9, 14, 238, 165, 9, 14, 238, 164,
- 9, 14, 238, 163, 9, 14, 238, 162, 9, 14, 238, 161, 9, 14, 238, 160, 9,
- 14, 238, 159, 9, 14, 238, 158, 9, 14, 238, 157, 9, 14, 238, 156, 9, 14,
- 238, 155, 9, 14, 238, 154, 9, 14, 238, 153, 9, 14, 238, 152, 9, 14, 238,
- 151, 9, 14, 238, 150, 9, 14, 238, 149, 9, 14, 238, 148, 9, 14, 238, 147,
- 9, 14, 238, 146, 9, 14, 238, 145, 9, 14, 238, 144, 9, 14, 238, 143, 9,
- 14, 238, 142, 9, 14, 238, 141, 9, 14, 238, 140, 9, 14, 238, 139, 9, 14,
- 238, 138, 9, 14, 238, 137, 9, 14, 238, 136, 9, 14, 238, 135, 9, 14, 238,
- 134, 9, 14, 238, 133, 9, 14, 238, 132, 9, 14, 238, 131, 9, 14, 238, 130,
- 9, 14, 238, 129, 9, 14, 238, 128, 9, 14, 238, 127, 9, 14, 238, 126, 9,
- 14, 238, 125, 9, 14, 238, 124, 9, 14, 238, 123, 9, 14, 238, 122, 9, 14,
- 238, 121, 9, 14, 238, 120, 9, 14, 238, 119, 9, 14, 238, 118, 9, 14, 238,
- 117, 9, 14, 238, 116, 9, 14, 238, 115, 9, 14, 238, 114, 9, 14, 238, 113,
- 9, 14, 238, 112, 9, 14, 238, 111, 9, 14, 238, 110, 9, 14, 238, 109, 9,
- 14, 238, 108, 9, 14, 238, 107, 9, 14, 238, 106, 9, 14, 238, 105, 9, 14,
- 238, 104, 9, 14, 238, 103, 9, 14, 238, 102, 9, 14, 238, 101, 9, 14, 238,
- 100, 9, 14, 238, 99, 9, 14, 238, 98, 9, 14, 238, 97, 9, 14, 238, 96, 9,
- 14, 238, 95, 9, 14, 238, 94, 9, 14, 238, 93, 9, 14, 238, 92, 9, 14, 238,
- 91, 9, 14, 238, 90, 9, 14, 238, 89, 9, 14, 238, 88, 9, 14, 238, 87, 9,
- 14, 238, 86, 9, 14, 238, 85, 9, 14, 238, 84, 9, 14, 238, 83, 9, 14, 238,
- 82, 9, 14, 238, 81, 9, 14, 238, 80, 9, 14, 238, 79, 9, 14, 238, 78, 9,
- 14, 238, 77, 9, 14, 238, 76, 9, 14, 238, 75, 9, 14, 238, 74, 9, 14, 238,
- 73, 233, 90, 217, 84, 129, 219, 18, 129, 245, 31, 78, 129, 223, 254, 78,
- 129, 54, 50, 129, 247, 132, 50, 129, 225, 182, 50, 129, 254, 126, 129,
- 254, 57, 129, 43, 226, 3, 129, 44, 226, 3, 129, 253, 216, 129, 96, 50,
- 129, 249, 219, 129, 240, 167, 129, 243, 229, 218, 129, 129, 219, 46, 129,
- 21, 210, 86, 129, 21, 110, 129, 21, 105, 129, 21, 158, 129, 21, 161, 129,
- 21, 189, 129, 21, 194, 129, 21, 198, 129, 21, 195, 129, 21, 200, 129,
- 249, 226, 129, 220, 150, 129, 233, 15, 50, 129, 245, 98, 50, 129, 242,
- 130, 50, 129, 224, 13, 78, 129, 249, 217, 253, 206, 129, 7, 6, 1, 61,
- 129, 7, 6, 1, 253, 158, 129, 7, 6, 1, 251, 66, 129, 7, 6, 1, 249, 60,
- 129, 7, 6, 1, 75, 129, 7, 6, 1, 245, 6, 129, 7, 6, 1, 243, 202, 129, 7,
- 6, 1, 242, 60, 129, 7, 6, 1, 73, 129, 7, 6, 1, 235, 144, 129, 7, 6, 1,
- 235, 23, 129, 7, 6, 1, 156, 129, 7, 6, 1, 193, 129, 7, 6, 1, 230, 25,
- 129, 7, 6, 1, 76, 129, 7, 6, 1, 226, 105, 129, 7, 6, 1, 224, 96, 129, 7,
- 6, 1, 153, 129, 7, 6, 1, 222, 91, 129, 7, 6, 1, 217, 152, 129, 7, 6, 1,
+ 45, 108, 16, 31, 225, 126, 218, 45, 108, 16, 31, 85, 218, 45, 108, 16,
+ 31, 231, 56, 218, 72, 108, 16, 31, 231, 56, 218, 71, 108, 16, 31, 231,
+ 56, 218, 70, 108, 16, 31, 250, 39, 108, 16, 31, 222, 2, 108, 16, 31, 228,
+ 189, 108, 16, 31, 213, 141, 108, 16, 31, 213, 140, 108, 16, 31, 222, 205,
+ 222, 2, 108, 16, 31, 222, 205, 222, 1, 108, 16, 31, 242, 167, 108, 16,
+ 31, 219, 167, 108, 16, 31, 235, 178, 226, 154, 108, 16, 31, 235, 178,
+ 226, 153, 108, 16, 31, 249, 135, 64, 235, 177, 108, 16, 31, 223, 102, 64,
+ 235, 177, 108, 16, 31, 249, 169, 226, 154, 108, 16, 31, 235, 176, 226,
+ 154, 108, 16, 31, 218, 73, 64, 249, 168, 108, 16, 31, 249, 135, 64, 249,
+ 168, 108, 16, 31, 249, 135, 64, 249, 167, 108, 16, 31, 249, 169, 254, 84,
+ 108, 16, 31, 222, 3, 64, 249, 169, 254, 84, 108, 16, 31, 218, 73, 64,
+ 222, 3, 64, 249, 168, 108, 16, 31, 213, 243, 108, 16, 31, 216, 85, 226,
+ 154, 108, 16, 31, 233, 58, 226, 154, 108, 16, 31, 254, 83, 226, 154, 108,
+ 16, 31, 218, 73, 64, 254, 82, 108, 16, 31, 222, 3, 64, 254, 82, 108, 16,
+ 31, 218, 73, 64, 222, 3, 64, 254, 82, 108, 16, 31, 213, 158, 64, 254, 82,
+ 108, 16, 31, 223, 102, 64, 254, 82, 108, 16, 31, 223, 102, 64, 254, 81,
+ 108, 16, 31, 223, 101, 108, 16, 31, 223, 100, 108, 16, 31, 223, 99, 108,
+ 16, 31, 223, 98, 108, 16, 31, 254, 158, 108, 16, 31, 254, 157, 108, 16,
+ 31, 231, 164, 108, 16, 31, 222, 8, 108, 16, 31, 253, 247, 108, 16, 31,
+ 223, 126, 108, 16, 31, 223, 125, 108, 16, 31, 253, 184, 108, 16, 31, 251,
+ 230, 226, 154, 108, 16, 31, 217, 50, 108, 16, 31, 217, 49, 108, 16, 31,
+ 224, 9, 232, 223, 108, 16, 31, 251, 184, 108, 16, 31, 251, 183, 108, 16,
+ 31, 251, 182, 108, 16, 31, 254, 139, 108, 16, 31, 226, 219, 108, 16, 31,
+ 218, 249, 108, 16, 31, 216, 83, 108, 16, 31, 242, 97, 108, 16, 31, 212,
+ 28, 108, 16, 31, 224, 227, 108, 16, 31, 251, 15, 108, 16, 31, 215, 86,
+ 108, 16, 31, 250, 247, 230, 123, 108, 16, 31, 221, 203, 64, 235, 56, 108,
+ 16, 31, 251, 26, 108, 16, 31, 215, 220, 108, 16, 31, 218, 155, 215, 220,
+ 108, 16, 31, 232, 149, 108, 16, 31, 219, 57, 108, 16, 31, 214, 142, 108,
+ 16, 31, 240, 247, 246, 65, 108, 16, 31, 253, 228, 108, 16, 31, 224, 235,
+ 253, 228, 108, 16, 31, 251, 143, 108, 16, 31, 224, 226, 251, 143, 108,
+ 16, 31, 254, 136, 108, 16, 31, 218, 118, 218, 27, 218, 117, 108, 16, 31,
+ 218, 118, 218, 27, 218, 116, 108, 16, 31, 218, 69, 108, 16, 31, 224, 201,
+ 108, 16, 31, 247, 182, 108, 16, 31, 247, 184, 108, 16, 31, 247, 183, 108,
+ 16, 31, 224, 132, 108, 16, 31, 224, 121, 108, 16, 31, 249, 123, 108, 16,
+ 31, 249, 122, 108, 16, 31, 249, 121, 108, 16, 31, 249, 120, 108, 16, 31,
+ 249, 119, 108, 16, 31, 254, 170, 108, 16, 31, 252, 120, 64, 231, 150,
+ 108, 16, 31, 252, 120, 64, 214, 17, 108, 16, 31, 223, 58, 108, 16, 31,
+ 240, 239, 108, 16, 31, 228, 213, 108, 16, 31, 248, 146, 108, 16, 31, 230,
+ 135, 108, 16, 31, 163, 246, 95, 108, 16, 31, 163, 226, 133, 9, 14, 240,
+ 103, 9, 14, 240, 102, 9, 14, 240, 101, 9, 14, 240, 100, 9, 14, 240, 99,
+ 9, 14, 240, 98, 9, 14, 240, 97, 9, 14, 240, 96, 9, 14, 240, 95, 9, 14,
+ 240, 94, 9, 14, 240, 93, 9, 14, 240, 92, 9, 14, 240, 91, 9, 14, 240, 90,
+ 9, 14, 240, 89, 9, 14, 240, 88, 9, 14, 240, 87, 9, 14, 240, 86, 9, 14,
+ 240, 85, 9, 14, 240, 84, 9, 14, 240, 83, 9, 14, 240, 82, 9, 14, 240, 81,
+ 9, 14, 240, 80, 9, 14, 240, 79, 9, 14, 240, 78, 9, 14, 240, 77, 9, 14,
+ 240, 76, 9, 14, 240, 75, 9, 14, 240, 74, 9, 14, 240, 73, 9, 14, 240, 72,
+ 9, 14, 240, 71, 9, 14, 240, 70, 9, 14, 240, 69, 9, 14, 240, 68, 9, 14,
+ 240, 67, 9, 14, 240, 66, 9, 14, 240, 65, 9, 14, 240, 64, 9, 14, 240, 63,
+ 9, 14, 240, 62, 9, 14, 240, 61, 9, 14, 240, 60, 9, 14, 240, 59, 9, 14,
+ 240, 58, 9, 14, 240, 57, 9, 14, 240, 56, 9, 14, 240, 55, 9, 14, 240, 54,
+ 9, 14, 240, 53, 9, 14, 240, 52, 9, 14, 240, 51, 9, 14, 240, 50, 9, 14,
+ 240, 49, 9, 14, 240, 48, 9, 14, 240, 47, 9, 14, 240, 46, 9, 14, 240, 45,
+ 9, 14, 240, 44, 9, 14, 240, 43, 9, 14, 240, 42, 9, 14, 240, 41, 9, 14,
+ 240, 40, 9, 14, 240, 39, 9, 14, 240, 38, 9, 14, 240, 37, 9, 14, 240, 36,
+ 9, 14, 240, 35, 9, 14, 240, 34, 9, 14, 240, 33, 9, 14, 240, 32, 9, 14,
+ 240, 31, 9, 14, 240, 30, 9, 14, 240, 29, 9, 14, 240, 28, 9, 14, 240, 27,
+ 9, 14, 240, 26, 9, 14, 240, 25, 9, 14, 240, 24, 9, 14, 240, 23, 9, 14,
+ 240, 22, 9, 14, 240, 21, 9, 14, 240, 20, 9, 14, 240, 19, 9, 14, 240, 18,
+ 9, 14, 240, 17, 9, 14, 240, 16, 9, 14, 240, 15, 9, 14, 240, 14, 9, 14,
+ 240, 13, 9, 14, 240, 12, 9, 14, 240, 11, 9, 14, 240, 10, 9, 14, 240, 9,
+ 9, 14, 240, 8, 9, 14, 240, 7, 9, 14, 240, 6, 9, 14, 240, 5, 9, 14, 240,
+ 4, 9, 14, 240, 3, 9, 14, 240, 2, 9, 14, 240, 1, 9, 14, 240, 0, 9, 14,
+ 239, 255, 9, 14, 239, 254, 9, 14, 239, 253, 9, 14, 239, 252, 9, 14, 239,
+ 251, 9, 14, 239, 250, 9, 14, 239, 249, 9, 14, 239, 248, 9, 14, 239, 247,
+ 9, 14, 239, 246, 9, 14, 239, 245, 9, 14, 239, 244, 9, 14, 239, 243, 9,
+ 14, 239, 242, 9, 14, 239, 241, 9, 14, 239, 240, 9, 14, 239, 239, 9, 14,
+ 239, 238, 9, 14, 239, 237, 9, 14, 239, 236, 9, 14, 239, 235, 9, 14, 239,
+ 234, 9, 14, 239, 233, 9, 14, 239, 232, 9, 14, 239, 231, 9, 14, 239, 230,
+ 9, 14, 239, 229, 9, 14, 239, 228, 9, 14, 239, 227, 9, 14, 239, 226, 9,
+ 14, 239, 225, 9, 14, 239, 224, 9, 14, 239, 223, 9, 14, 239, 222, 9, 14,
+ 239, 221, 9, 14, 239, 220, 9, 14, 239, 219, 9, 14, 239, 218, 9, 14, 239,
+ 217, 9, 14, 239, 216, 9, 14, 239, 215, 9, 14, 239, 214, 9, 14, 239, 213,
+ 9, 14, 239, 212, 9, 14, 239, 211, 9, 14, 239, 210, 9, 14, 239, 209, 9,
+ 14, 239, 208, 9, 14, 239, 207, 9, 14, 239, 206, 9, 14, 239, 205, 9, 14,
+ 239, 204, 9, 14, 239, 203, 9, 14, 239, 202, 9, 14, 239, 201, 9, 14, 239,
+ 200, 9, 14, 239, 199, 9, 14, 239, 198, 9, 14, 239, 197, 9, 14, 239, 196,
+ 9, 14, 239, 195, 9, 14, 239, 194, 9, 14, 239, 193, 9, 14, 239, 192, 9,
+ 14, 239, 191, 9, 14, 239, 190, 9, 14, 239, 189, 9, 14, 239, 188, 9, 14,
+ 239, 187, 9, 14, 239, 186, 9, 14, 239, 185, 9, 14, 239, 184, 9, 14, 239,
+ 183, 9, 14, 239, 182, 9, 14, 239, 181, 9, 14, 239, 180, 9, 14, 239, 179,
+ 9, 14, 239, 178, 9, 14, 239, 177, 9, 14, 239, 176, 9, 14, 239, 175, 9,
+ 14, 239, 174, 9, 14, 239, 173, 9, 14, 239, 172, 9, 14, 239, 171, 9, 14,
+ 239, 170, 9, 14, 239, 169, 9, 14, 239, 168, 9, 14, 239, 167, 9, 14, 239,
+ 166, 9, 14, 239, 165, 9, 14, 239, 164, 9, 14, 239, 163, 9, 14, 239, 162,
+ 9, 14, 239, 161, 9, 14, 239, 160, 9, 14, 239, 159, 9, 14, 239, 158, 9,
+ 14, 239, 157, 9, 14, 239, 156, 9, 14, 239, 155, 9, 14, 239, 154, 9, 14,
+ 239, 153, 9, 14, 239, 152, 9, 14, 239, 151, 9, 14, 239, 150, 9, 14, 239,
+ 149, 9, 14, 239, 148, 9, 14, 239, 147, 9, 14, 239, 146, 9, 14, 239, 145,
+ 9, 14, 239, 144, 9, 14, 239, 143, 9, 14, 239, 142, 9, 14, 239, 141, 9,
+ 14, 239, 140, 9, 14, 239, 139, 9, 14, 239, 138, 9, 14, 239, 137, 9, 14,
+ 239, 136, 9, 14, 239, 135, 9, 14, 239, 134, 9, 14, 239, 133, 9, 14, 239,
+ 132, 9, 14, 239, 131, 9, 14, 239, 130, 9, 14, 239, 129, 9, 14, 239, 128,
+ 9, 14, 239, 127, 9, 14, 239, 126, 9, 14, 239, 125, 9, 14, 239, 124, 9,
+ 14, 239, 123, 9, 14, 239, 122, 9, 14, 239, 121, 9, 14, 239, 120, 9, 14,
+ 239, 119, 9, 14, 239, 118, 9, 14, 239, 117, 9, 14, 239, 116, 9, 14, 239,
+ 115, 9, 14, 239, 114, 9, 14, 239, 113, 9, 14, 239, 112, 9, 14, 239, 111,
+ 9, 14, 239, 110, 9, 14, 239, 109, 9, 14, 239, 108, 9, 14, 239, 107, 9,
+ 14, 239, 106, 9, 14, 239, 105, 9, 14, 239, 104, 9, 14, 239, 103, 9, 14,
+ 239, 102, 9, 14, 239, 101, 9, 14, 239, 100, 9, 14, 239, 99, 9, 14, 239,
+ 98, 9, 14, 239, 97, 9, 14, 239, 96, 9, 14, 239, 95, 9, 14, 239, 94, 9,
+ 14, 239, 93, 9, 14, 239, 92, 9, 14, 239, 91, 9, 14, 239, 90, 9, 14, 239,
+ 89, 9, 14, 239, 88, 9, 14, 239, 87, 9, 14, 239, 86, 9, 14, 239, 85, 9,
+ 14, 239, 84, 9, 14, 239, 83, 9, 14, 239, 82, 9, 14, 239, 81, 9, 14, 239,
+ 80, 9, 14, 239, 79, 9, 14, 239, 78, 9, 14, 239, 77, 9, 14, 239, 76, 9,
+ 14, 239, 75, 9, 14, 239, 74, 9, 14, 239, 73, 9, 14, 239, 72, 9, 14, 239,
+ 71, 9, 14, 239, 70, 9, 14, 239, 69, 9, 14, 239, 68, 9, 14, 239, 67, 9,
+ 14, 239, 66, 9, 14, 239, 65, 9, 14, 239, 64, 9, 14, 239, 63, 9, 14, 239,
+ 62, 9, 14, 239, 61, 9, 14, 239, 60, 9, 14, 239, 59, 9, 14, 239, 58, 9,
+ 14, 239, 57, 9, 14, 239, 56, 9, 14, 239, 55, 9, 14, 239, 54, 9, 14, 239,
+ 53, 9, 14, 239, 52, 9, 14, 239, 51, 9, 14, 239, 50, 9, 14, 239, 49, 9,
+ 14, 239, 48, 9, 14, 239, 47, 9, 14, 239, 46, 9, 14, 239, 45, 9, 14, 239,
+ 44, 9, 14, 239, 43, 9, 14, 239, 42, 9, 14, 239, 41, 9, 14, 239, 40, 9,
+ 14, 239, 39, 9, 14, 239, 38, 9, 14, 239, 37, 9, 14, 239, 36, 9, 14, 239,
+ 35, 9, 14, 239, 34, 9, 14, 239, 33, 9, 14, 239, 32, 9, 14, 239, 31, 9,
+ 14, 239, 30, 9, 14, 239, 29, 9, 14, 239, 28, 9, 14, 239, 27, 9, 14, 239,
+ 26, 9, 14, 239, 25, 9, 14, 239, 24, 9, 14, 239, 23, 9, 14, 239, 22, 9,
+ 14, 239, 21, 9, 14, 239, 20, 9, 14, 239, 19, 9, 14, 239, 18, 9, 14, 239,
+ 17, 9, 14, 239, 16, 9, 14, 239, 15, 9, 14, 239, 14, 9, 14, 239, 13, 9,
+ 14, 239, 12, 9, 14, 239, 11, 9, 14, 239, 10, 9, 14, 239, 9, 9, 14, 239,
+ 8, 9, 14, 239, 7, 9, 14, 239, 6, 9, 14, 239, 5, 9, 14, 239, 4, 9, 14,
+ 239, 3, 9, 14, 239, 2, 9, 14, 239, 1, 9, 14, 239, 0, 9, 14, 238, 255, 9,
+ 14, 238, 254, 9, 14, 238, 253, 9, 14, 238, 252, 9, 14, 238, 251, 9, 14,
+ 238, 250, 9, 14, 238, 249, 9, 14, 238, 248, 9, 14, 238, 247, 9, 14, 238,
+ 246, 9, 14, 238, 245, 9, 14, 238, 244, 9, 14, 238, 243, 9, 14, 238, 242,
+ 9, 14, 238, 241, 9, 14, 238, 240, 9, 14, 238, 239, 9, 14, 238, 238, 9,
+ 14, 238, 237, 9, 14, 238, 236, 9, 14, 238, 235, 9, 14, 238, 234, 9, 14,
+ 238, 233, 9, 14, 238, 232, 9, 14, 238, 231, 9, 14, 238, 230, 9, 14, 238,
+ 229, 9, 14, 238, 228, 9, 14, 238, 227, 9, 14, 238, 226, 9, 14, 238, 225,
+ 9, 14, 238, 224, 9, 14, 238, 223, 9, 14, 238, 222, 9, 14, 238, 221, 9,
+ 14, 238, 220, 9, 14, 238, 219, 9, 14, 238, 218, 9, 14, 238, 217, 9, 14,
+ 238, 216, 9, 14, 238, 215, 9, 14, 238, 214, 9, 14, 238, 213, 9, 14, 238,
+ 212, 9, 14, 238, 211, 9, 14, 238, 210, 9, 14, 238, 209, 9, 14, 238, 208,
+ 9, 14, 238, 207, 9, 14, 238, 206, 9, 14, 238, 205, 9, 14, 238, 204, 9,
+ 14, 238, 203, 9, 14, 238, 202, 9, 14, 238, 201, 9, 14, 238, 200, 9, 14,
+ 238, 199, 9, 14, 238, 198, 9, 14, 238, 197, 9, 14, 238, 196, 9, 14, 238,
+ 195, 9, 14, 238, 194, 9, 14, 238, 193, 9, 14, 238, 192, 9, 14, 238, 191,
+ 9, 14, 238, 190, 9, 14, 238, 189, 9, 14, 238, 188, 9, 14, 238, 187, 9,
+ 14, 238, 186, 9, 14, 238, 185, 9, 14, 238, 184, 9, 14, 238, 183, 9, 14,
+ 238, 182, 9, 14, 238, 181, 9, 14, 238, 180, 9, 14, 238, 179, 9, 14, 238,
+ 178, 9, 14, 238, 177, 9, 14, 238, 176, 9, 14, 238, 175, 9, 14, 238, 174,
+ 9, 14, 238, 173, 9, 14, 238, 172, 9, 14, 238, 171, 9, 14, 238, 170, 9,
+ 14, 238, 169, 9, 14, 238, 168, 9, 14, 238, 167, 9, 14, 238, 166, 9, 14,
+ 238, 165, 9, 14, 238, 164, 9, 14, 238, 163, 9, 14, 238, 162, 9, 14, 238,
+ 161, 9, 14, 238, 160, 9, 14, 238, 159, 9, 14, 238, 158, 9, 14, 238, 157,
+ 9, 14, 238, 156, 9, 14, 238, 155, 9, 14, 238, 154, 9, 14, 238, 153, 9,
+ 14, 238, 152, 9, 14, 238, 151, 9, 14, 238, 150, 9, 14, 238, 149, 9, 14,
+ 238, 148, 9, 14, 238, 147, 9, 14, 238, 146, 9, 14, 238, 145, 9, 14, 238,
+ 144, 9, 14, 238, 143, 9, 14, 238, 142, 9, 14, 238, 141, 9, 14, 238, 140,
+ 9, 14, 238, 139, 9, 14, 238, 138, 9, 14, 238, 137, 9, 14, 238, 136, 9,
+ 14, 238, 135, 9, 14, 238, 134, 9, 14, 238, 133, 9, 14, 238, 132, 9, 14,
+ 238, 131, 9, 14, 238, 130, 9, 14, 238, 129, 9, 14, 238, 128, 9, 14, 238,
+ 127, 9, 14, 238, 126, 9, 14, 238, 125, 9, 14, 238, 124, 9, 14, 238, 123,
+ 9, 14, 238, 122, 9, 14, 238, 121, 9, 14, 238, 120, 9, 14, 238, 119, 9,
+ 14, 238, 118, 9, 14, 238, 117, 9, 14, 238, 116, 9, 14, 238, 115, 9, 14,
+ 238, 114, 9, 14, 238, 113, 9, 14, 238, 112, 9, 14, 238, 111, 9, 14, 238,
+ 110, 9, 14, 238, 109, 9, 14, 238, 108, 9, 14, 238, 107, 9, 14, 238, 106,
+ 9, 14, 238, 105, 9, 14, 238, 104, 9, 14, 238, 103, 9, 14, 238, 102, 9,
+ 14, 238, 101, 9, 14, 238, 100, 9, 14, 238, 99, 9, 14, 238, 98, 9, 14,
+ 238, 97, 9, 14, 238, 96, 9, 14, 238, 95, 9, 14, 238, 94, 9, 14, 238, 93,
+ 9, 14, 238, 92, 9, 14, 238, 91, 9, 14, 238, 90, 9, 14, 238, 89, 9, 14,
+ 238, 88, 9, 14, 238, 87, 9, 14, 238, 86, 9, 14, 238, 85, 9, 14, 238, 84,
+ 9, 14, 238, 83, 9, 14, 238, 82, 9, 14, 238, 81, 9, 14, 238, 80, 9, 14,
+ 238, 79, 9, 14, 238, 78, 9, 14, 238, 77, 9, 14, 238, 76, 9, 14, 238, 75,
+ 9, 14, 238, 74, 233, 91, 217, 85, 129, 219, 19, 129, 245, 32, 78, 129,
+ 223, 255, 78, 129, 54, 50, 129, 247, 133, 50, 129, 225, 183, 50, 129,
+ 254, 127, 129, 254, 58, 129, 43, 226, 4, 129, 44, 226, 4, 129, 253, 217,
+ 129, 96, 50, 129, 249, 220, 129, 240, 168, 129, 243, 230, 218, 130, 129,
+ 219, 47, 129, 21, 210, 86, 129, 21, 110, 129, 21, 105, 129, 21, 158, 129,
+ 21, 161, 129, 21, 189, 129, 21, 194, 129, 21, 198, 129, 21, 195, 129, 21,
+ 200, 129, 249, 227, 129, 220, 151, 129, 233, 16, 50, 129, 245, 99, 50,
+ 129, 242, 131, 50, 129, 224, 14, 78, 129, 249, 218, 253, 207, 129, 7, 6,
+ 1, 61, 129, 7, 6, 1, 253, 159, 129, 7, 6, 1, 251, 67, 129, 7, 6, 1, 249,
+ 61, 129, 7, 6, 1, 75, 129, 7, 6, 1, 245, 7, 129, 7, 6, 1, 243, 203, 129,
+ 7, 6, 1, 242, 61, 129, 7, 6, 1, 73, 129, 7, 6, 1, 235, 145, 129, 7, 6, 1,
+ 235, 24, 129, 7, 6, 1, 156, 129, 7, 6, 1, 193, 129, 7, 6, 1, 230, 26,
+ 129, 7, 6, 1, 76, 129, 7, 6, 1, 226, 106, 129, 7, 6, 1, 224, 97, 129, 7,
+ 6, 1, 153, 129, 7, 6, 1, 222, 92, 129, 7, 6, 1, 217, 153, 129, 7, 6, 1,
70, 129, 7, 6, 1, 214, 105, 129, 7, 6, 1, 212, 98, 129, 7, 6, 1, 211,
178, 129, 7, 6, 1, 211, 117, 129, 7, 6, 1, 210, 159, 129, 43, 42, 127,
- 129, 223, 50, 219, 46, 129, 44, 42, 127, 129, 250, 31, 255, 14, 129, 121,
- 232, 213, 129, 242, 137, 255, 14, 129, 7, 4, 1, 61, 129, 7, 4, 1, 253,
- 158, 129, 7, 4, 1, 251, 66, 129, 7, 4, 1, 249, 60, 129, 7, 4, 1, 75, 129,
- 7, 4, 1, 245, 6, 129, 7, 4, 1, 243, 202, 129, 7, 4, 1, 242, 60, 129, 7,
- 4, 1, 73, 129, 7, 4, 1, 235, 144, 129, 7, 4, 1, 235, 23, 129, 7, 4, 1,
- 156, 129, 7, 4, 1, 193, 129, 7, 4, 1, 230, 25, 129, 7, 4, 1, 76, 129, 7,
- 4, 1, 226, 105, 129, 7, 4, 1, 224, 96, 129, 7, 4, 1, 153, 129, 7, 4, 1,
- 222, 91, 129, 7, 4, 1, 217, 152, 129, 7, 4, 1, 70, 129, 7, 4, 1, 214,
+ 129, 223, 51, 219, 47, 129, 44, 42, 127, 129, 250, 32, 255, 15, 129, 121,
+ 232, 214, 129, 242, 138, 255, 15, 129, 7, 4, 1, 61, 129, 7, 4, 1, 253,
+ 159, 129, 7, 4, 1, 251, 67, 129, 7, 4, 1, 249, 61, 129, 7, 4, 1, 75, 129,
+ 7, 4, 1, 245, 7, 129, 7, 4, 1, 243, 203, 129, 7, 4, 1, 242, 61, 129, 7,
+ 4, 1, 73, 129, 7, 4, 1, 235, 145, 129, 7, 4, 1, 235, 24, 129, 7, 4, 1,
+ 156, 129, 7, 4, 1, 193, 129, 7, 4, 1, 230, 26, 129, 7, 4, 1, 76, 129, 7,
+ 4, 1, 226, 106, 129, 7, 4, 1, 224, 97, 129, 7, 4, 1, 153, 129, 7, 4, 1,
+ 222, 92, 129, 7, 4, 1, 217, 153, 129, 7, 4, 1, 70, 129, 7, 4, 1, 214,
105, 129, 7, 4, 1, 212, 98, 129, 7, 4, 1, 211, 178, 129, 7, 4, 1, 211,
- 117, 129, 7, 4, 1, 210, 159, 129, 43, 249, 99, 127, 129, 67, 232, 213,
- 129, 44, 249, 99, 127, 129, 182, 251, 6, 217, 84, 45, 221, 78, 45, 221,
- 67, 45, 221, 56, 45, 221, 44, 45, 221, 33, 45, 221, 22, 45, 221, 11, 45,
- 221, 0, 45, 220, 245, 45, 220, 237, 45, 220, 236, 45, 220, 235, 45, 220,
- 234, 45, 220, 232, 45, 220, 231, 45, 220, 230, 45, 220, 229, 45, 220,
- 228, 45, 220, 227, 45, 220, 226, 45, 220, 225, 45, 220, 224, 45, 220,
- 223, 45, 220, 221, 45, 220, 220, 45, 220, 219, 45, 220, 218, 45, 220,
- 217, 45, 220, 216, 45, 220, 215, 45, 220, 214, 45, 220, 213, 45, 220,
- 212, 45, 220, 210, 45, 220, 209, 45, 220, 208, 45, 220, 207, 45, 220,
- 206, 45, 220, 205, 45, 220, 204, 45, 220, 203, 45, 220, 202, 45, 220,
- 201, 45, 220, 199, 45, 220, 198, 45, 220, 197, 45, 220, 196, 45, 220,
- 195, 45, 220, 194, 45, 220, 193, 45, 220, 192, 45, 220, 191, 45, 220,
- 190, 45, 220, 188, 45, 220, 187, 45, 220, 186, 45, 220, 185, 45, 220,
- 184, 45, 220, 183, 45, 220, 182, 45, 220, 181, 45, 220, 180, 45, 220,
- 179, 45, 220, 177, 45, 220, 176, 45, 220, 175, 45, 220, 174, 45, 220,
- 173, 45, 220, 172, 45, 220, 171, 45, 220, 170, 45, 220, 169, 45, 220,
- 168, 45, 220, 166, 45, 220, 165, 45, 220, 164, 45, 220, 163, 45, 220,
- 162, 45, 220, 161, 45, 220, 160, 45, 220, 159, 45, 220, 158, 45, 220,
- 157, 45, 221, 154, 45, 221, 153, 45, 221, 152, 45, 221, 151, 45, 221,
- 150, 45, 221, 149, 45, 221, 148, 45, 221, 147, 45, 221, 146, 45, 221,
- 145, 45, 221, 143, 45, 221, 142, 45, 221, 141, 45, 221, 140, 45, 221,
- 139, 45, 221, 138, 45, 221, 137, 45, 221, 136, 45, 221, 135, 45, 221,
- 134, 45, 221, 132, 45, 221, 131, 45, 221, 130, 45, 221, 129, 45, 221,
- 128, 45, 221, 127, 45, 221, 126, 45, 221, 125, 45, 221, 124, 45, 221,
- 123, 45, 221, 121, 45, 221, 120, 45, 221, 119, 45, 221, 118, 45, 221,
- 117, 45, 221, 116, 45, 221, 115, 45, 221, 114, 45, 221, 113, 45, 221,
- 112, 45, 221, 110, 45, 221, 109, 45, 221, 108, 45, 221, 107, 45, 221,
- 106, 45, 221, 105, 45, 221, 104, 45, 221, 103, 45, 221, 102, 45, 221,
- 101, 45, 221, 99, 45, 221, 98, 45, 221, 97, 45, 221, 96, 45, 221, 95, 45,
- 221, 94, 45, 221, 93, 45, 221, 92, 45, 221, 91, 45, 221, 90, 45, 221, 88,
- 45, 221, 87, 45, 221, 86, 45, 221, 85, 45, 221, 84, 45, 221, 83, 45, 221,
- 82, 45, 221, 81, 45, 221, 80, 45, 221, 79, 45, 221, 77, 45, 221, 76, 45,
- 221, 75, 45, 221, 74, 45, 221, 73, 45, 221, 72, 45, 221, 71, 45, 221, 70,
- 45, 221, 69, 45, 221, 68, 45, 221, 66, 45, 221, 65, 45, 221, 64, 45, 221,
- 63, 45, 221, 62, 45, 221, 61, 45, 221, 60, 45, 221, 59, 45, 221, 58, 45,
- 221, 57, 45, 221, 55, 45, 221, 54, 45, 221, 53, 45, 221, 52, 45, 221, 51,
- 45, 221, 50, 45, 221, 49, 45, 221, 48, 45, 221, 47, 45, 221, 46, 45, 221,
- 43, 45, 221, 42, 45, 221, 41, 45, 221, 40, 45, 221, 39, 45, 221, 38, 45,
- 221, 37, 45, 221, 36, 45, 221, 35, 45, 221, 34, 45, 221, 32, 45, 221, 31,
- 45, 221, 30, 45, 221, 29, 45, 221, 28, 45, 221, 27, 45, 221, 26, 45, 221,
- 25, 45, 221, 24, 45, 221, 23, 45, 221, 21, 45, 221, 20, 45, 221, 19, 45,
- 221, 18, 45, 221, 17, 45, 221, 16, 45, 221, 15, 45, 221, 14, 45, 221, 13,
- 45, 221, 12, 45, 221, 10, 45, 221, 9, 45, 221, 8, 45, 221, 7, 45, 221, 6,
- 45, 221, 5, 45, 221, 4, 45, 221, 3, 45, 221, 2, 45, 221, 1, 45, 220, 255,
- 45, 220, 254, 45, 220, 253, 45, 220, 252, 45, 220, 251, 45, 220, 250, 45,
- 220, 249, 45, 220, 248, 45, 220, 247, 45, 220, 246, 45, 220, 244, 45,
- 220, 243, 45, 220, 242, 45, 220, 241, 45, 220, 240, 45, 220, 239, 45,
- 220, 238, 227, 202, 227, 204, 218, 152, 64, 241, 233, 219, 48, 218, 152,
- 64, 216, 212, 218, 85, 245, 143, 64, 216, 212, 245, 56, 245, 143, 64,
- 215, 243, 245, 109, 245, 132, 245, 133, 255, 7, 255, 8, 254, 167, 252,
- 47, 252, 179, 251, 131, 135, 217, 89, 203, 217, 89, 240, 227, 217, 93,
- 232, 214, 244, 145, 166, 232, 213, 245, 143, 64, 232, 213, 233, 0, 228,
- 135, 245, 112, 232, 214, 217, 89, 67, 217, 89, 212, 118, 244, 20, 244,
- 145, 244, 125, 250, 230, 223, 53, 249, 143, 220, 28, 226, 130, 232, 150,
- 110, 219, 58, 220, 28, 235, 255, 232, 150, 210, 86, 219, 191, 248, 151,
- 232, 204, 245, 77, 247, 155, 248, 31, 249, 178, 110, 248, 141, 248, 31,
- 249, 178, 105, 248, 140, 248, 31, 249, 178, 158, 248, 139, 248, 31, 249,
- 178, 161, 248, 138, 152, 255, 7, 229, 209, 217, 177, 236, 62, 217, 180,
- 245, 143, 64, 215, 244, 251, 213, 245, 62, 251, 5, 251, 7, 245, 143, 64,
- 231, 81, 245, 110, 218, 61, 218, 78, 245, 77, 245, 78, 235, 232, 220,
- 138, 161, 244, 107, 220, 137, 243, 237, 235, 232, 220, 138, 158, 242,
- 121, 220, 137, 242, 118, 235, 232, 220, 138, 105, 223, 121, 220, 137,
- 222, 145, 235, 232, 220, 138, 110, 214, 174, 220, 137, 214, 133, 219, 21,
- 248, 63, 248, 65, 226, 78, 250, 142, 226, 80, 125, 226, 240, 224, 193,
- 241, 47, 251, 150, 225, 173, 241, 203, 251, 161, 228, 75, 251, 150, 241,
- 203, 229, 175, 235, 242, 235, 244, 229, 82, 232, 213, 229, 99, 218, 152,
- 64, 221, 158, 254, 18, 218, 223, 245, 143, 64, 221, 158, 254, 18, 245,
- 80, 135, 217, 90, 220, 127, 203, 217, 90, 220, 127, 240, 224, 135, 217,
- 90, 2, 235, 35, 203, 217, 90, 2, 235, 35, 240, 225, 232, 214, 217, 90,
- 220, 127, 67, 217, 90, 220, 127, 212, 117, 225, 253, 232, 214, 244, 14,
- 225, 253, 232, 214, 246, 106, 225, 32, 225, 253, 232, 214, 252, 178, 225,
- 253, 232, 214, 214, 163, 225, 28, 223, 50, 232, 214, 244, 145, 223, 50,
- 235, 242, 223, 35, 219, 155, 220, 28, 105, 219, 152, 218, 225, 219, 155,
- 220, 28, 158, 219, 151, 218, 224, 248, 31, 249, 178, 218, 105, 248, 137,
- 224, 183, 214, 132, 110, 224, 183, 214, 130, 224, 149, 224, 183, 214,
- 132, 105, 224, 183, 214, 129, 224, 148, 220, 128, 215, 242, 218, 151,
- 218, 89, 251, 6, 250, 142, 250, 209, 231, 43, 212, 59, 230, 43, 218, 152,
- 64, 242, 107, 254, 18, 218, 152, 64, 224, 166, 254, 18, 219, 20, 245,
- 143, 64, 242, 107, 254, 18, 245, 143, 64, 224, 166, 254, 18, 245, 107,
- 218, 152, 64, 218, 105, 219, 35, 219, 155, 242, 141, 135, 235, 195, 220,
- 107, 219, 155, 135, 235, 195, 221, 194, 249, 178, 220, 135, 235, 195,
- 249, 113, 218, 106, 216, 236, 218, 168, 226, 169, 217, 167, 249, 218,
- 226, 142, 224, 184, 231, 42, 225, 19, 254, 53, 224, 178, 249, 218, 254,
- 69, 229, 163, 219, 200, 7, 6, 1, 242, 249, 7, 4, 1, 242, 249, 250, 159,
- 165, 1, 232, 175, 209, 209, 1, 244, 44, 244, 36, 209, 209, 1, 244, 44,
- 244, 157, 209, 209, 1, 222, 211, 209, 209, 1, 232, 156, 63, 164, 251,
- 223, 220, 3, 242, 215, 230, 248, 223, 41, 243, 216, 243, 215, 243, 214,
- 230, 45, 209, 251, 209, 252, 209, 254, 232, 102, 222, 219, 232, 103, 222,
- 220, 225, 223, 232, 101, 222, 218, 228, 106, 230, 165, 211, 229, 212, 15,
- 245, 162, 243, 226, 230, 229, 226, 197, 214, 134, 87, 230, 229, 248, 157,
- 87, 8, 3, 235, 158, 78, 224, 194, 244, 20, 31, 67, 44, 71, 233, 20, 127,
- 213, 118, 213, 7, 212, 195, 212, 184, 212, 173, 212, 162, 212, 151, 212,
- 140, 212, 129, 213, 117, 213, 106, 213, 95, 213, 84, 213, 73, 213, 62,
- 213, 51, 251, 71, 226, 155, 78, 251, 196, 209, 253, 49, 28, 16, 243, 236,
- 219, 102, 250, 73, 214, 9, 213, 40, 213, 29, 213, 18, 213, 6, 212, 251,
- 212, 240, 212, 229, 212, 218, 212, 207, 212, 199, 212, 198, 212, 197,
- 212, 196, 212, 194, 212, 193, 212, 192, 212, 191, 212, 190, 212, 189,
- 212, 188, 212, 187, 212, 186, 212, 185, 212, 183, 212, 182, 212, 181,
- 212, 180, 212, 179, 212, 178, 212, 177, 212, 176, 212, 175, 212, 174,
- 212, 172, 212, 171, 212, 170, 212, 169, 212, 168, 212, 167, 212, 166,
- 212, 165, 212, 164, 212, 163, 212, 161, 212, 160, 212, 159, 212, 158,
- 212, 157, 212, 156, 212, 155, 212, 154, 212, 153, 212, 152, 212, 150,
- 212, 149, 212, 148, 212, 147, 212, 146, 212, 145, 212, 144, 212, 143,
- 212, 142, 212, 141, 212, 139, 212, 138, 212, 137, 212, 136, 212, 135,
- 212, 134, 212, 133, 212, 132, 212, 131, 212, 130, 212, 128, 212, 127,
- 212, 126, 212, 125, 212, 124, 212, 123, 212, 122, 212, 121, 212, 120,
- 212, 119, 213, 116, 213, 115, 213, 114, 213, 113, 213, 112, 213, 111,
- 213, 110, 213, 109, 213, 108, 213, 107, 213, 105, 213, 104, 213, 103,
- 213, 102, 213, 101, 213, 100, 213, 99, 213, 98, 213, 97, 213, 96, 213,
- 94, 213, 93, 213, 92, 213, 91, 213, 90, 213, 89, 213, 88, 213, 87, 213,
- 86, 213, 85, 213, 83, 213, 82, 213, 81, 213, 80, 213, 79, 213, 78, 213,
- 77, 213, 76, 213, 75, 213, 74, 213, 72, 213, 71, 213, 70, 213, 69, 213,
- 68, 213, 67, 213, 66, 213, 65, 213, 64, 213, 63, 213, 61, 213, 60, 213,
- 59, 213, 58, 213, 57, 213, 56, 213, 55, 213, 54, 213, 53, 213, 52, 213,
- 50, 213, 49, 213, 48, 213, 47, 213, 46, 213, 45, 213, 44, 213, 43, 213,
- 42, 213, 41, 213, 39, 213, 38, 213, 37, 213, 36, 213, 35, 213, 34, 213,
- 33, 213, 32, 213, 31, 213, 30, 213, 28, 213, 27, 213, 26, 213, 25, 213,
- 24, 213, 23, 213, 22, 213, 21, 213, 20, 213, 19, 213, 17, 213, 16, 213,
- 15, 213, 14, 213, 13, 213, 12, 213, 11, 213, 10, 213, 9, 213, 8, 213, 5,
- 213, 4, 213, 3, 213, 2, 213, 1, 213, 0, 212, 255, 212, 254, 212, 253,
- 212, 252, 212, 250, 212, 249, 212, 248, 212, 247, 212, 246, 212, 245,
- 212, 244, 212, 243, 212, 242, 212, 241, 212, 239, 212, 238, 212, 237,
- 212, 236, 212, 235, 212, 234, 212, 233, 212, 232, 212, 231, 212, 230,
- 212, 228, 212, 227, 212, 226, 212, 225, 212, 224, 212, 223, 212, 222,
- 212, 221, 212, 220, 212, 219, 212, 217, 212, 216, 212, 215, 212, 214,
- 212, 213, 212, 212, 212, 211, 212, 210, 212, 209, 212, 208, 212, 206,
- 212, 205, 212, 204, 212, 203, 212, 202, 212, 201, 212, 200, 7, 6, 1, 115,
- 2, 231, 233, 22, 242, 136, 7, 4, 1, 115, 2, 231, 233, 22, 242, 136, 7, 6,
- 1, 160, 2, 67, 232, 214, 51, 7, 4, 1, 160, 2, 67, 232, 214, 51, 7, 6, 1,
- 160, 2, 67, 232, 214, 252, 43, 22, 242, 136, 7, 4, 1, 160, 2, 67, 232,
- 214, 252, 43, 22, 242, 136, 7, 6, 1, 160, 2, 67, 232, 214, 252, 43, 22,
- 142, 7, 4, 1, 160, 2, 67, 232, 214, 252, 43, 22, 142, 7, 6, 1, 160, 2,
- 250, 31, 22, 231, 232, 7, 4, 1, 160, 2, 250, 31, 22, 231, 232, 7, 6, 1,
- 160, 2, 250, 31, 22, 250, 234, 7, 4, 1, 160, 2, 250, 31, 22, 250, 234, 7,
- 6, 1, 240, 154, 2, 231, 233, 22, 242, 136, 7, 4, 1, 240, 154, 2, 231,
- 233, 22, 242, 136, 7, 4, 1, 240, 154, 2, 59, 77, 22, 142, 7, 4, 1, 229,
- 80, 2, 216, 89, 48, 7, 6, 1, 144, 2, 67, 232, 214, 51, 7, 4, 1, 144, 2,
- 67, 232, 214, 51, 7, 6, 1, 144, 2, 67, 232, 214, 252, 43, 22, 242, 136,
- 7, 4, 1, 144, 2, 67, 232, 214, 252, 43, 22, 242, 136, 7, 6, 1, 144, 2,
- 67, 232, 214, 252, 43, 22, 142, 7, 4, 1, 144, 2, 67, 232, 214, 252, 43,
- 22, 142, 7, 6, 1, 222, 92, 2, 67, 232, 214, 51, 7, 4, 1, 222, 92, 2, 67,
- 232, 214, 51, 7, 6, 1, 104, 2, 231, 233, 22, 242, 136, 7, 4, 1, 104, 2,
- 231, 233, 22, 242, 136, 7, 6, 1, 115, 2, 226, 225, 22, 142, 7, 4, 1, 115,
- 2, 226, 225, 22, 142, 7, 6, 1, 115, 2, 226, 225, 22, 182, 7, 4, 1, 115,
- 2, 226, 225, 22, 182, 7, 6, 1, 160, 2, 226, 225, 22, 142, 7, 4, 1, 160,
- 2, 226, 225, 22, 142, 7, 6, 1, 160, 2, 226, 225, 22, 182, 7, 4, 1, 160,
- 2, 226, 225, 22, 182, 7, 6, 1, 160, 2, 59, 77, 22, 142, 7, 4, 1, 160, 2,
- 59, 77, 22, 142, 7, 6, 1, 160, 2, 59, 77, 22, 182, 7, 4, 1, 160, 2, 59,
- 77, 22, 182, 7, 4, 1, 240, 154, 2, 59, 77, 22, 242, 136, 7, 4, 1, 240,
- 154, 2, 59, 77, 22, 182, 7, 6, 1, 240, 154, 2, 226, 225, 22, 142, 7, 4,
- 1, 240, 154, 2, 226, 225, 22, 59, 77, 22, 142, 7, 6, 1, 240, 154, 2, 226,
- 225, 22, 182, 7, 4, 1, 240, 154, 2, 226, 225, 22, 59, 77, 22, 182, 7, 6,
- 1, 235, 145, 2, 182, 7, 4, 1, 235, 145, 2, 59, 77, 22, 182, 7, 6, 1, 233,
- 149, 2, 182, 7, 4, 1, 233, 149, 2, 182, 7, 6, 1, 232, 50, 2, 182, 7, 4,
- 1, 232, 50, 2, 182, 7, 6, 1, 223, 224, 2, 182, 7, 4, 1, 223, 224, 2, 182,
- 7, 6, 1, 104, 2, 226, 225, 22, 142, 7, 4, 1, 104, 2, 226, 225, 22, 142,
- 7, 6, 1, 104, 2, 226, 225, 22, 182, 7, 4, 1, 104, 2, 226, 225, 22, 182,
- 7, 6, 1, 104, 2, 231, 233, 22, 142, 7, 4, 1, 104, 2, 231, 233, 22, 142,
- 7, 6, 1, 104, 2, 231, 233, 22, 182, 7, 4, 1, 104, 2, 231, 233, 22, 182,
- 7, 4, 1, 254, 244, 2, 242, 136, 7, 4, 1, 204, 144, 2, 242, 136, 7, 4, 1,
- 204, 144, 2, 142, 7, 4, 1, 215, 94, 214, 106, 2, 242, 136, 7, 4, 1, 215,
- 94, 214, 106, 2, 142, 7, 4, 1, 221, 196, 2, 242, 136, 7, 4, 1, 221, 196,
- 2, 142, 7, 4, 1, 241, 51, 221, 196, 2, 242, 136, 7, 4, 1, 241, 51, 221,
- 196, 2, 142, 146, 1, 234, 109, 36, 116, 235, 23, 36, 116, 229, 79, 36,
- 116, 251, 66, 36, 116, 227, 167, 36, 116, 215, 159, 36, 116, 228, 111,
- 36, 116, 217, 152, 36, 116, 230, 25, 36, 116, 226, 105, 36, 116, 193, 36,
- 116, 211, 117, 36, 116, 153, 36, 116, 156, 36, 116, 214, 105, 36, 116,
- 232, 176, 36, 116, 232, 185, 36, 116, 222, 180, 36, 116, 228, 93, 36,
- 116, 235, 144, 36, 116, 220, 104, 36, 116, 218, 226, 36, 116, 222, 91,
- 36, 116, 242, 60, 36, 116, 233, 232, 36, 3, 235, 10, 36, 3, 234, 92, 36,
- 3, 234, 83, 36, 3, 233, 217, 36, 3, 233, 188, 36, 3, 234, 182, 36, 3,
- 234, 181, 36, 3, 234, 246, 36, 3, 234, 28, 36, 3, 234, 10, 36, 3, 234,
- 195, 36, 3, 229, 76, 36, 3, 229, 27, 36, 3, 229, 23, 36, 3, 228, 248, 36,
- 3, 228, 241, 36, 3, 229, 64, 36, 3, 229, 62, 36, 3, 229, 73, 36, 3, 229,
- 4, 36, 3, 228, 255, 36, 3, 229, 66, 36, 3, 251, 32, 36, 3, 250, 51, 36,
- 3, 250, 41, 36, 3, 249, 112, 36, 3, 249, 83, 36, 3, 250, 190, 36, 3, 250,
- 182, 36, 3, 251, 22, 36, 3, 249, 238, 36, 3, 249, 174, 36, 3, 250, 222,
- 36, 3, 227, 164, 36, 3, 227, 148, 36, 3, 227, 143, 36, 3, 227, 128, 36,
- 3, 227, 121, 36, 3, 227, 156, 36, 3, 227, 155, 36, 3, 227, 161, 36, 3,
- 227, 134, 36, 3, 227, 132, 36, 3, 227, 159, 36, 3, 215, 155, 36, 3, 215,
- 135, 36, 3, 215, 134, 36, 3, 215, 123, 36, 3, 215, 120, 36, 3, 215, 151,
- 36, 3, 215, 150, 36, 3, 215, 154, 36, 3, 215, 133, 36, 3, 215, 132, 36,
- 3, 215, 153, 36, 3, 228, 109, 36, 3, 228, 95, 36, 3, 228, 94, 36, 3, 228,
- 78, 36, 3, 228, 77, 36, 3, 228, 105, 36, 3, 228, 104, 36, 3, 228, 108,
- 36, 3, 228, 80, 36, 3, 228, 79, 36, 3, 228, 107, 36, 3, 217, 101, 36, 3,
- 216, 117, 36, 3, 216, 103, 36, 3, 215, 118, 36, 3, 215, 85, 36, 3, 217,
- 22, 36, 3, 217, 11, 36, 3, 217, 79, 36, 3, 111, 36, 3, 216, 17, 36, 3,
- 217, 41, 36, 3, 229, 225, 36, 3, 228, 233, 36, 3, 228, 208, 36, 3, 227,
- 237, 36, 3, 227, 179, 36, 3, 229, 107, 36, 3, 229, 103, 36, 3, 229, 212,
- 36, 3, 228, 74, 36, 3, 228, 64, 36, 3, 229, 187, 36, 3, 226, 89, 36, 3,
- 225, 108, 36, 3, 225, 71, 36, 3, 224, 150, 36, 3, 224, 119, 36, 3, 225,
- 221, 36, 3, 225, 211, 36, 3, 226, 71, 36, 3, 225, 16, 36, 3, 224, 249,
- 36, 3, 225, 234, 36, 3, 231, 237, 36, 3, 230, 230, 36, 3, 230, 201, 36,
- 3, 230, 102, 36, 3, 230, 54, 36, 3, 231, 91, 36, 3, 231, 80, 36, 3, 231,
- 203, 36, 3, 230, 161, 36, 3, 230, 132, 36, 3, 231, 135, 36, 3, 211, 103,
- 36, 3, 211, 8, 36, 3, 210, 255, 36, 3, 210, 212, 36, 3, 210, 181, 36, 3,
- 211, 47, 36, 3, 211, 44, 36, 3, 211, 82, 36, 3, 210, 244, 36, 3, 210,
- 229, 36, 3, 211, 55, 36, 3, 223, 184, 36, 3, 223, 35, 36, 3, 222, 239,
- 36, 3, 222, 140, 36, 3, 222, 112, 36, 3, 223, 128, 36, 3, 223, 108, 36,
- 3, 223, 166, 36, 3, 222, 211, 36, 3, 222, 197, 36, 3, 223, 136, 36, 3,
- 233, 134, 36, 3, 232, 241, 36, 3, 232, 227, 36, 3, 232, 98, 36, 3, 232,
- 73, 36, 3, 233, 58, 36, 3, 233, 50, 36, 3, 233, 109, 36, 3, 232, 156, 36,
- 3, 232, 127, 36, 3, 233, 74, 36, 3, 214, 26, 36, 3, 213, 176, 36, 3, 213,
- 162, 36, 3, 212, 116, 36, 3, 212, 109, 36, 3, 213, 255, 36, 3, 213, 250,
- 36, 3, 214, 23, 36, 3, 213, 138, 36, 3, 213, 127, 36, 3, 214, 5, 36, 3,
- 232, 174, 36, 3, 232, 169, 36, 3, 232, 168, 36, 3, 232, 165, 36, 3, 232,
- 164, 36, 3, 232, 171, 36, 3, 232, 170, 36, 3, 232, 173, 36, 3, 232, 167,
- 36, 3, 232, 166, 36, 3, 232, 172, 36, 3, 232, 183, 36, 3, 232, 178, 36,
- 3, 232, 177, 36, 3, 232, 161, 36, 3, 232, 160, 36, 3, 232, 180, 36, 3,
- 232, 179, 36, 3, 232, 182, 36, 3, 232, 163, 36, 3, 232, 162, 36, 3, 232,
- 181, 36, 3, 222, 178, 36, 3, 222, 167, 36, 3, 222, 166, 36, 3, 222, 160,
- 36, 3, 222, 153, 36, 3, 222, 174, 36, 3, 222, 173, 36, 3, 222, 177, 36,
- 3, 222, 165, 36, 3, 222, 164, 36, 3, 222, 176, 36, 3, 228, 91, 36, 3,
- 228, 86, 36, 3, 228, 85, 36, 3, 228, 82, 36, 3, 228, 81, 36, 3, 228, 88,
- 36, 3, 228, 87, 36, 3, 228, 90, 36, 3, 228, 84, 36, 3, 228, 83, 36, 3,
- 228, 89, 36, 3, 235, 140, 36, 3, 235, 108, 36, 3, 235, 101, 36, 3, 235,
- 51, 36, 3, 235, 33, 36, 3, 235, 126, 36, 3, 235, 124, 36, 3, 235, 135,
- 36, 3, 235, 68, 36, 3, 235, 59, 36, 3, 235, 129, 36, 3, 220, 98, 36, 3,
- 220, 32, 36, 3, 220, 27, 36, 3, 219, 225, 36, 3, 219, 210, 36, 3, 220,
- 63, 36, 3, 220, 61, 36, 3, 220, 90, 36, 3, 220, 7, 36, 3, 220, 1, 36, 3,
- 220, 71, 36, 3, 218, 222, 36, 3, 218, 192, 36, 3, 218, 188, 36, 3, 218,
- 179, 36, 3, 218, 176, 36, 3, 218, 197, 36, 3, 218, 196, 36, 3, 218, 221,
- 36, 3, 218, 184, 36, 3, 218, 183, 36, 3, 218, 199, 36, 3, 222, 31, 36, 3,
- 219, 191, 36, 3, 219, 175, 36, 3, 218, 83, 36, 3, 218, 4, 36, 3, 221,
- 181, 36, 3, 221, 170, 36, 3, 222, 17, 36, 3, 219, 58, 36, 3, 219, 40, 36,
- 3, 221, 219, 36, 3, 242, 46, 36, 3, 241, 180, 36, 3, 241, 161, 36, 3,
- 240, 222, 36, 3, 240, 202, 36, 3, 241, 238, 36, 3, 241, 220, 36, 3, 242,
- 36, 36, 3, 241, 68, 36, 3, 241, 53, 36, 3, 241, 246, 36, 3, 233, 231, 36,
- 3, 233, 230, 36, 3, 233, 225, 36, 3, 233, 224, 36, 3, 233, 221, 36, 3,
- 233, 220, 36, 3, 233, 227, 36, 3, 233, 226, 36, 3, 233, 229, 36, 3, 233,
- 223, 36, 3, 233, 222, 36, 3, 233, 228, 36, 3, 219, 231, 175, 116, 5, 211,
- 68, 175, 116, 5, 223, 155, 175, 116, 5, 223, 78, 98, 1, 215, 28, 69, 116,
- 5, 249, 233, 176, 69, 116, 5, 249, 233, 234, 132, 69, 116, 5, 249, 233,
- 234, 28, 69, 116, 5, 249, 233, 234, 105, 69, 116, 5, 249, 233, 229, 4,
- 69, 116, 5, 249, 233, 251, 33, 69, 116, 5, 249, 233, 250, 157, 69, 116,
- 5, 249, 233, 249, 238, 69, 116, 5, 249, 233, 250, 86, 69, 116, 5, 249,
- 233, 227, 134, 69, 116, 5, 249, 233, 248, 221, 69, 116, 5, 249, 233, 215,
- 144, 69, 116, 5, 249, 233, 247, 145, 69, 116, 5, 249, 233, 215, 139, 69,
- 116, 5, 249, 233, 197, 69, 116, 5, 249, 233, 217, 105, 69, 116, 5, 249,
- 233, 216, 208, 69, 116, 5, 249, 233, 111, 69, 116, 5, 249, 233, 216, 156,
- 69, 116, 5, 249, 233, 228, 74, 69, 116, 5, 249, 233, 252, 191, 69, 116,
- 5, 249, 233, 225, 147, 69, 116, 5, 249, 233, 225, 16, 69, 116, 5, 249,
- 233, 225, 121, 69, 116, 5, 249, 233, 230, 161, 69, 116, 5, 249, 233, 210,
- 244, 69, 116, 5, 249, 233, 222, 211, 69, 116, 5, 249, 233, 232, 156, 69,
- 116, 5, 249, 233, 213, 138, 69, 116, 5, 249, 233, 220, 102, 69, 116, 5,
- 249, 233, 218, 223, 69, 116, 5, 249, 233, 206, 69, 116, 5, 249, 233, 162,
- 69, 116, 5, 249, 233, 233, 135, 69, 25, 5, 249, 233, 224, 88, 69, 235,
- 243, 25, 5, 249, 233, 224, 30, 69, 235, 243, 25, 5, 249, 233, 222, 100,
- 69, 235, 243, 25, 5, 249, 233, 222, 93, 69, 235, 243, 25, 5, 249, 233,
- 224, 69, 69, 25, 5, 226, 204, 69, 25, 5, 255, 34, 141, 1, 251, 255, 229,
- 77, 141, 1, 251, 255, 229, 27, 141, 1, 251, 255, 228, 248, 141, 1, 251,
- 255, 229, 64, 141, 1, 251, 255, 229, 4, 56, 1, 251, 255, 229, 77, 56, 1,
- 251, 255, 229, 27, 56, 1, 251, 255, 228, 248, 56, 1, 251, 255, 229, 64,
- 56, 1, 251, 255, 229, 4, 56, 1, 254, 194, 250, 190, 56, 1, 254, 194, 215,
- 118, 56, 1, 254, 194, 111, 56, 1, 254, 194, 226, 105, 58, 1, 245, 20,
- 245, 19, 249, 182, 138, 130, 58, 1, 245, 19, 245, 20, 249, 182, 138, 130,
+ 117, 129, 7, 4, 1, 210, 159, 129, 43, 249, 100, 127, 129, 67, 232, 214,
+ 129, 44, 249, 100, 127, 129, 183, 251, 7, 217, 85, 45, 221, 79, 45, 221,
+ 68, 45, 221, 57, 45, 221, 45, 45, 221, 34, 45, 221, 23, 45, 221, 12, 45,
+ 221, 1, 45, 220, 246, 45, 220, 238, 45, 220, 237, 45, 220, 236, 45, 220,
+ 235, 45, 220, 233, 45, 220, 232, 45, 220, 231, 45, 220, 230, 45, 220,
+ 229, 45, 220, 228, 45, 220, 227, 45, 220, 226, 45, 220, 225, 45, 220,
+ 224, 45, 220, 222, 45, 220, 221, 45, 220, 220, 45, 220, 219, 45, 220,
+ 218, 45, 220, 217, 45, 220, 216, 45, 220, 215, 45, 220, 214, 45, 220,
+ 213, 45, 220, 211, 45, 220, 210, 45, 220, 209, 45, 220, 208, 45, 220,
+ 207, 45, 220, 206, 45, 220, 205, 45, 220, 204, 45, 220, 203, 45, 220,
+ 202, 45, 220, 200, 45, 220, 199, 45, 220, 198, 45, 220, 197, 45, 220,
+ 196, 45, 220, 195, 45, 220, 194, 45, 220, 193, 45, 220, 192, 45, 220,
+ 191, 45, 220, 189, 45, 220, 188, 45, 220, 187, 45, 220, 186, 45, 220,
+ 185, 45, 220, 184, 45, 220, 183, 45, 220, 182, 45, 220, 181, 45, 220,
+ 180, 45, 220, 178, 45, 220, 177, 45, 220, 176, 45, 220, 175, 45, 220,
+ 174, 45, 220, 173, 45, 220, 172, 45, 220, 171, 45, 220, 170, 45, 220,
+ 169, 45, 220, 167, 45, 220, 166, 45, 220, 165, 45, 220, 164, 45, 220,
+ 163, 45, 220, 162, 45, 220, 161, 45, 220, 160, 45, 220, 159, 45, 220,
+ 158, 45, 221, 155, 45, 221, 154, 45, 221, 153, 45, 221, 152, 45, 221,
+ 151, 45, 221, 150, 45, 221, 149, 45, 221, 148, 45, 221, 147, 45, 221,
+ 146, 45, 221, 144, 45, 221, 143, 45, 221, 142, 45, 221, 141, 45, 221,
+ 140, 45, 221, 139, 45, 221, 138, 45, 221, 137, 45, 221, 136, 45, 221,
+ 135, 45, 221, 133, 45, 221, 132, 45, 221, 131, 45, 221, 130, 45, 221,
+ 129, 45, 221, 128, 45, 221, 127, 45, 221, 126, 45, 221, 125, 45, 221,
+ 124, 45, 221, 122, 45, 221, 121, 45, 221, 120, 45, 221, 119, 45, 221,
+ 118, 45, 221, 117, 45, 221, 116, 45, 221, 115, 45, 221, 114, 45, 221,
+ 113, 45, 221, 111, 45, 221, 110, 45, 221, 109, 45, 221, 108, 45, 221,
+ 107, 45, 221, 106, 45, 221, 105, 45, 221, 104, 45, 221, 103, 45, 221,
+ 102, 45, 221, 100, 45, 221, 99, 45, 221, 98, 45, 221, 97, 45, 221, 96,
+ 45, 221, 95, 45, 221, 94, 45, 221, 93, 45, 221, 92, 45, 221, 91, 45, 221,
+ 89, 45, 221, 88, 45, 221, 87, 45, 221, 86, 45, 221, 85, 45, 221, 84, 45,
+ 221, 83, 45, 221, 82, 45, 221, 81, 45, 221, 80, 45, 221, 78, 45, 221, 77,
+ 45, 221, 76, 45, 221, 75, 45, 221, 74, 45, 221, 73, 45, 221, 72, 45, 221,
+ 71, 45, 221, 70, 45, 221, 69, 45, 221, 67, 45, 221, 66, 45, 221, 65, 45,
+ 221, 64, 45, 221, 63, 45, 221, 62, 45, 221, 61, 45, 221, 60, 45, 221, 59,
+ 45, 221, 58, 45, 221, 56, 45, 221, 55, 45, 221, 54, 45, 221, 53, 45, 221,
+ 52, 45, 221, 51, 45, 221, 50, 45, 221, 49, 45, 221, 48, 45, 221, 47, 45,
+ 221, 44, 45, 221, 43, 45, 221, 42, 45, 221, 41, 45, 221, 40, 45, 221, 39,
+ 45, 221, 38, 45, 221, 37, 45, 221, 36, 45, 221, 35, 45, 221, 33, 45, 221,
+ 32, 45, 221, 31, 45, 221, 30, 45, 221, 29, 45, 221, 28, 45, 221, 27, 45,
+ 221, 26, 45, 221, 25, 45, 221, 24, 45, 221, 22, 45, 221, 21, 45, 221, 20,
+ 45, 221, 19, 45, 221, 18, 45, 221, 17, 45, 221, 16, 45, 221, 15, 45, 221,
+ 14, 45, 221, 13, 45, 221, 11, 45, 221, 10, 45, 221, 9, 45, 221, 8, 45,
+ 221, 7, 45, 221, 6, 45, 221, 5, 45, 221, 4, 45, 221, 3, 45, 221, 2, 45,
+ 221, 0, 45, 220, 255, 45, 220, 254, 45, 220, 253, 45, 220, 252, 45, 220,
+ 251, 45, 220, 250, 45, 220, 249, 45, 220, 248, 45, 220, 247, 45, 220,
+ 245, 45, 220, 244, 45, 220, 243, 45, 220, 242, 45, 220, 241, 45, 220,
+ 240, 45, 220, 239, 227, 203, 227, 205, 218, 153, 64, 241, 234, 219, 49,
+ 218, 153, 64, 216, 213, 218, 86, 245, 144, 64, 216, 213, 245, 57, 245,
+ 144, 64, 215, 244, 245, 110, 245, 133, 245, 134, 255, 8, 255, 9, 254,
+ 168, 252, 48, 252, 180, 251, 132, 135, 217, 90, 203, 217, 90, 240, 228,
+ 217, 94, 232, 215, 244, 146, 166, 232, 214, 245, 144, 64, 232, 214, 233,
+ 1, 228, 136, 245, 113, 232, 215, 217, 90, 67, 217, 90, 212, 118, 244, 21,
+ 244, 146, 244, 126, 250, 231, 223, 54, 249, 144, 220, 29, 226, 131, 232,
+ 151, 110, 219, 59, 220, 29, 236, 0, 232, 151, 210, 86, 219, 192, 248,
+ 152, 232, 205, 245, 78, 247, 156, 248, 32, 249, 179, 110, 248, 142, 248,
+ 32, 249, 179, 105, 248, 141, 248, 32, 249, 179, 158, 248, 140, 248, 32,
+ 249, 179, 161, 248, 139, 152, 255, 8, 229, 210, 217, 178, 236, 63, 217,
+ 181, 245, 144, 64, 215, 245, 251, 214, 245, 63, 251, 6, 251, 8, 245, 144,
+ 64, 231, 82, 245, 111, 218, 62, 218, 79, 245, 78, 245, 79, 235, 233, 220,
+ 139, 161, 244, 108, 220, 138, 243, 238, 235, 233, 220, 139, 158, 242,
+ 122, 220, 138, 242, 119, 235, 233, 220, 139, 105, 223, 122, 220, 138,
+ 222, 146, 235, 233, 220, 139, 110, 214, 174, 220, 138, 214, 133, 219, 22,
+ 248, 64, 248, 66, 226, 79, 250, 143, 226, 81, 125, 226, 241, 224, 194,
+ 241, 48, 251, 151, 225, 174, 241, 204, 251, 162, 228, 76, 251, 151, 241,
+ 204, 229, 176, 235, 243, 235, 245, 229, 83, 232, 214, 229, 100, 218, 153,
+ 64, 221, 159, 254, 19, 218, 224, 245, 144, 64, 221, 159, 254, 19, 245,
+ 81, 135, 217, 91, 220, 128, 203, 217, 91, 220, 128, 240, 225, 135, 217,
+ 91, 2, 235, 36, 203, 217, 91, 2, 235, 36, 240, 226, 232, 215, 217, 91,
+ 220, 128, 67, 217, 91, 220, 128, 212, 117, 225, 254, 232, 215, 244, 15,
+ 225, 254, 232, 215, 246, 107, 225, 33, 225, 254, 232, 215, 252, 179, 225,
+ 254, 232, 215, 214, 163, 225, 29, 223, 51, 232, 215, 244, 146, 223, 51,
+ 235, 243, 223, 36, 219, 156, 220, 29, 105, 219, 153, 218, 226, 219, 156,
+ 220, 29, 158, 219, 152, 218, 225, 248, 32, 249, 179, 218, 106, 248, 138,
+ 224, 184, 214, 132, 110, 224, 184, 214, 130, 224, 150, 224, 184, 214,
+ 132, 105, 224, 184, 214, 129, 224, 149, 220, 129, 215, 243, 218, 152,
+ 218, 90, 251, 7, 250, 143, 250, 210, 231, 44, 212, 59, 230, 44, 218, 153,
+ 64, 242, 108, 254, 19, 218, 153, 64, 224, 167, 254, 19, 219, 21, 245,
+ 144, 64, 242, 108, 254, 19, 245, 144, 64, 224, 167, 254, 19, 245, 108,
+ 218, 153, 64, 218, 106, 219, 36, 219, 156, 242, 142, 135, 235, 196, 220,
+ 108, 219, 156, 135, 235, 196, 221, 195, 249, 179, 220, 136, 235, 196,
+ 249, 114, 218, 107, 216, 237, 218, 169, 226, 170, 217, 168, 249, 219,
+ 226, 143, 224, 185, 231, 43, 225, 20, 254, 54, 224, 179, 249, 219, 254,
+ 70, 229, 164, 219, 201, 7, 6, 1, 242, 250, 7, 4, 1, 242, 250, 250, 160,
+ 182, 218, 68, 249, 228, 219, 107, 233, 47, 165, 1, 232, 176, 209, 209, 1,
+ 244, 45, 244, 37, 209, 209, 1, 244, 45, 244, 158, 209, 209, 1, 222, 212,
+ 209, 209, 1, 232, 157, 63, 164, 251, 224, 220, 4, 242, 216, 230, 249,
+ 223, 42, 243, 217, 243, 216, 243, 215, 230, 46, 209, 251, 209, 252, 209,
+ 254, 232, 103, 222, 220, 232, 104, 222, 221, 225, 224, 232, 102, 222,
+ 219, 228, 107, 230, 166, 211, 229, 212, 15, 245, 163, 243, 227, 230, 230,
+ 226, 198, 214, 134, 87, 230, 230, 248, 158, 87, 8, 3, 235, 159, 78, 224,
+ 195, 244, 21, 31, 67, 44, 71, 233, 21, 127, 213, 118, 213, 7, 212, 195,
+ 212, 184, 212, 173, 212, 162, 212, 151, 212, 140, 212, 129, 213, 117,
+ 213, 106, 213, 95, 213, 84, 213, 73, 213, 62, 213, 51, 251, 72, 226, 156,
+ 78, 251, 197, 209, 253, 49, 28, 16, 243, 237, 219, 103, 250, 74, 214, 9,
+ 213, 40, 213, 29, 213, 18, 213, 6, 212, 251, 212, 240, 212, 229, 212,
+ 218, 212, 207, 212, 199, 212, 198, 212, 197, 212, 196, 212, 194, 212,
+ 193, 212, 192, 212, 191, 212, 190, 212, 189, 212, 188, 212, 187, 212,
+ 186, 212, 185, 212, 183, 212, 182, 212, 181, 212, 180, 212, 179, 212,
+ 178, 212, 177, 212, 176, 212, 175, 212, 174, 212, 172, 212, 171, 212,
+ 170, 212, 169, 212, 168, 212, 167, 212, 166, 212, 165, 212, 164, 212,
+ 163, 212, 161, 212, 160, 212, 159, 212, 158, 212, 157, 212, 156, 212,
+ 155, 212, 154, 212, 153, 212, 152, 212, 150, 212, 149, 212, 148, 212,
+ 147, 212, 146, 212, 145, 212, 144, 212, 143, 212, 142, 212, 141, 212,
+ 139, 212, 138, 212, 137, 212, 136, 212, 135, 212, 134, 212, 133, 212,
+ 132, 212, 131, 212, 130, 212, 128, 212, 127, 212, 126, 212, 125, 212,
+ 124, 212, 123, 212, 122, 212, 121, 212, 120, 212, 119, 213, 116, 213,
+ 115, 213, 114, 213, 113, 213, 112, 213, 111, 213, 110, 213, 109, 213,
+ 108, 213, 107, 213, 105, 213, 104, 213, 103, 213, 102, 213, 101, 213,
+ 100, 213, 99, 213, 98, 213, 97, 213, 96, 213, 94, 213, 93, 213, 92, 213,
+ 91, 213, 90, 213, 89, 213, 88, 213, 87, 213, 86, 213, 85, 213, 83, 213,
+ 82, 213, 81, 213, 80, 213, 79, 213, 78, 213, 77, 213, 76, 213, 75, 213,
+ 74, 213, 72, 213, 71, 213, 70, 213, 69, 213, 68, 213, 67, 213, 66, 213,
+ 65, 213, 64, 213, 63, 213, 61, 213, 60, 213, 59, 213, 58, 213, 57, 213,
+ 56, 213, 55, 213, 54, 213, 53, 213, 52, 213, 50, 213, 49, 213, 48, 213,
+ 47, 213, 46, 213, 45, 213, 44, 213, 43, 213, 42, 213, 41, 213, 39, 213,
+ 38, 213, 37, 213, 36, 213, 35, 213, 34, 213, 33, 213, 32, 213, 31, 213,
+ 30, 213, 28, 213, 27, 213, 26, 213, 25, 213, 24, 213, 23, 213, 22, 213,
+ 21, 213, 20, 213, 19, 213, 17, 213, 16, 213, 15, 213, 14, 213, 13, 213,
+ 12, 213, 11, 213, 10, 213, 9, 213, 8, 213, 5, 213, 4, 213, 3, 213, 2,
+ 213, 1, 213, 0, 212, 255, 212, 254, 212, 253, 212, 252, 212, 250, 212,
+ 249, 212, 248, 212, 247, 212, 246, 212, 245, 212, 244, 212, 243, 212,
+ 242, 212, 241, 212, 239, 212, 238, 212, 237, 212, 236, 212, 235, 212,
+ 234, 212, 233, 212, 232, 212, 231, 212, 230, 212, 228, 212, 227, 212,
+ 226, 212, 225, 212, 224, 212, 223, 212, 222, 212, 221, 212, 220, 212,
+ 219, 212, 217, 212, 216, 212, 215, 212, 214, 212, 213, 212, 212, 212,
+ 211, 212, 210, 212, 209, 212, 208, 212, 206, 212, 205, 212, 204, 212,
+ 203, 212, 202, 212, 201, 212, 200, 7, 6, 1, 115, 2, 231, 234, 22, 242,
+ 137, 7, 4, 1, 115, 2, 231, 234, 22, 242, 137, 7, 6, 1, 160, 2, 67, 232,
+ 215, 51, 7, 4, 1, 160, 2, 67, 232, 215, 51, 7, 6, 1, 160, 2, 67, 232,
+ 215, 252, 44, 22, 242, 137, 7, 4, 1, 160, 2, 67, 232, 215, 252, 44, 22,
+ 242, 137, 7, 6, 1, 160, 2, 67, 232, 215, 252, 44, 22, 142, 7, 4, 1, 160,
+ 2, 67, 232, 215, 252, 44, 22, 142, 7, 6, 1, 160, 2, 250, 32, 22, 231,
+ 233, 7, 4, 1, 160, 2, 250, 32, 22, 231, 233, 7, 6, 1, 160, 2, 250, 32,
+ 22, 250, 235, 7, 4, 1, 160, 2, 250, 32, 22, 250, 235, 7, 6, 1, 240, 155,
+ 2, 231, 234, 22, 242, 137, 7, 4, 1, 240, 155, 2, 231, 234, 22, 242, 137,
+ 7, 4, 1, 240, 155, 2, 59, 77, 22, 142, 7, 4, 1, 229, 81, 2, 216, 90, 48,
+ 7, 6, 1, 144, 2, 67, 232, 215, 51, 7, 4, 1, 144, 2, 67, 232, 215, 51, 7,
+ 6, 1, 144, 2, 67, 232, 215, 252, 44, 22, 242, 137, 7, 4, 1, 144, 2, 67,
+ 232, 215, 252, 44, 22, 242, 137, 7, 6, 1, 144, 2, 67, 232, 215, 252, 44,
+ 22, 142, 7, 4, 1, 144, 2, 67, 232, 215, 252, 44, 22, 142, 7, 6, 1, 222,
+ 93, 2, 67, 232, 215, 51, 7, 4, 1, 222, 93, 2, 67, 232, 215, 51, 7, 6, 1,
+ 104, 2, 231, 234, 22, 242, 137, 7, 4, 1, 104, 2, 231, 234, 22, 242, 137,
+ 7, 6, 1, 115, 2, 226, 226, 22, 142, 7, 4, 1, 115, 2, 226, 226, 22, 142,
+ 7, 6, 1, 115, 2, 226, 226, 22, 183, 7, 4, 1, 115, 2, 226, 226, 22, 183,
+ 7, 6, 1, 160, 2, 226, 226, 22, 142, 7, 4, 1, 160, 2, 226, 226, 22, 142,
+ 7, 6, 1, 160, 2, 226, 226, 22, 183, 7, 4, 1, 160, 2, 226, 226, 22, 183,
+ 7, 6, 1, 160, 2, 59, 77, 22, 142, 7, 4, 1, 160, 2, 59, 77, 22, 142, 7, 6,
+ 1, 160, 2, 59, 77, 22, 183, 7, 4, 1, 160, 2, 59, 77, 22, 183, 7, 4, 1,
+ 240, 155, 2, 59, 77, 22, 242, 137, 7, 4, 1, 240, 155, 2, 59, 77, 22, 183,
+ 7, 6, 1, 240, 155, 2, 226, 226, 22, 142, 7, 4, 1, 240, 155, 2, 226, 226,
+ 22, 59, 77, 22, 142, 7, 6, 1, 240, 155, 2, 226, 226, 22, 183, 7, 4, 1,
+ 240, 155, 2, 226, 226, 22, 59, 77, 22, 183, 7, 6, 1, 235, 146, 2, 183, 7,
+ 4, 1, 235, 146, 2, 59, 77, 22, 183, 7, 6, 1, 233, 150, 2, 183, 7, 4, 1,
+ 233, 150, 2, 183, 7, 6, 1, 232, 51, 2, 183, 7, 4, 1, 232, 51, 2, 183, 7,
+ 6, 1, 223, 225, 2, 183, 7, 4, 1, 223, 225, 2, 183, 7, 6, 1, 104, 2, 226,
+ 226, 22, 142, 7, 4, 1, 104, 2, 226, 226, 22, 142, 7, 6, 1, 104, 2, 226,
+ 226, 22, 183, 7, 4, 1, 104, 2, 226, 226, 22, 183, 7, 6, 1, 104, 2, 231,
+ 234, 22, 142, 7, 4, 1, 104, 2, 231, 234, 22, 142, 7, 6, 1, 104, 2, 231,
+ 234, 22, 183, 7, 4, 1, 104, 2, 231, 234, 22, 183, 7, 4, 1, 254, 245, 2,
+ 242, 137, 7, 4, 1, 204, 144, 2, 242, 137, 7, 4, 1, 204, 144, 2, 142, 7,
+ 4, 1, 215, 94, 214, 106, 2, 242, 137, 7, 4, 1, 215, 94, 214, 106, 2, 142,
+ 7, 4, 1, 221, 197, 2, 242, 137, 7, 4, 1, 221, 197, 2, 142, 7, 4, 1, 241,
+ 52, 221, 197, 2, 242, 137, 7, 4, 1, 241, 52, 221, 197, 2, 142, 146, 1,
+ 234, 110, 36, 116, 235, 24, 36, 116, 229, 80, 36, 116, 251, 67, 36, 116,
+ 227, 168, 36, 116, 215, 160, 36, 116, 228, 112, 36, 116, 217, 153, 36,
+ 116, 230, 26, 36, 116, 226, 106, 36, 116, 193, 36, 116, 211, 117, 36,
+ 116, 153, 36, 116, 156, 36, 116, 214, 105, 36, 116, 232, 177, 36, 116,
+ 232, 186, 36, 116, 222, 181, 36, 116, 228, 94, 36, 116, 235, 145, 36,
+ 116, 220, 105, 36, 116, 218, 227, 36, 116, 222, 92, 36, 116, 242, 61, 36,
+ 116, 233, 233, 36, 3, 235, 11, 36, 3, 234, 93, 36, 3, 234, 84, 36, 3,
+ 233, 218, 36, 3, 233, 189, 36, 3, 234, 183, 36, 3, 234, 182, 36, 3, 234,
+ 247, 36, 3, 234, 29, 36, 3, 234, 11, 36, 3, 234, 196, 36, 3, 229, 77, 36,
+ 3, 229, 28, 36, 3, 229, 24, 36, 3, 228, 249, 36, 3, 228, 242, 36, 3, 229,
+ 65, 36, 3, 229, 63, 36, 3, 229, 74, 36, 3, 229, 5, 36, 3, 229, 0, 36, 3,
+ 229, 67, 36, 3, 251, 33, 36, 3, 250, 52, 36, 3, 250, 42, 36, 3, 249, 113,
+ 36, 3, 249, 84, 36, 3, 250, 191, 36, 3, 250, 183, 36, 3, 251, 23, 36, 3,
+ 249, 239, 36, 3, 249, 175, 36, 3, 250, 223, 36, 3, 227, 165, 36, 3, 227,
+ 149, 36, 3, 227, 144, 36, 3, 227, 129, 36, 3, 227, 122, 36, 3, 227, 157,
+ 36, 3, 227, 156, 36, 3, 227, 162, 36, 3, 227, 135, 36, 3, 227, 133, 36,
+ 3, 227, 160, 36, 3, 215, 156, 36, 3, 215, 136, 36, 3, 215, 135, 36, 3,
+ 215, 124, 36, 3, 215, 121, 36, 3, 215, 152, 36, 3, 215, 151, 36, 3, 215,
+ 155, 36, 3, 215, 134, 36, 3, 215, 133, 36, 3, 215, 154, 36, 3, 228, 110,
+ 36, 3, 228, 96, 36, 3, 228, 95, 36, 3, 228, 79, 36, 3, 228, 78, 36, 3,
+ 228, 106, 36, 3, 228, 105, 36, 3, 228, 109, 36, 3, 228, 81, 36, 3, 228,
+ 80, 36, 3, 228, 108, 36, 3, 217, 102, 36, 3, 216, 118, 36, 3, 216, 104,
+ 36, 3, 215, 119, 36, 3, 215, 85, 36, 3, 217, 23, 36, 3, 217, 12, 36, 3,
+ 217, 80, 36, 3, 111, 36, 3, 216, 18, 36, 3, 217, 42, 36, 3, 229, 226, 36,
+ 3, 228, 234, 36, 3, 228, 209, 36, 3, 227, 238, 36, 3, 227, 180, 36, 3,
+ 229, 108, 36, 3, 229, 104, 36, 3, 229, 213, 36, 3, 228, 75, 36, 3, 228,
+ 65, 36, 3, 229, 188, 36, 3, 226, 90, 36, 3, 225, 109, 36, 3, 225, 72, 36,
+ 3, 224, 151, 36, 3, 224, 120, 36, 3, 225, 222, 36, 3, 225, 212, 36, 3,
+ 226, 72, 36, 3, 225, 17, 36, 3, 224, 250, 36, 3, 225, 235, 36, 3, 231,
+ 238, 36, 3, 230, 231, 36, 3, 230, 202, 36, 3, 230, 103, 36, 3, 230, 55,
+ 36, 3, 231, 92, 36, 3, 231, 81, 36, 3, 231, 204, 36, 3, 230, 162, 36, 3,
+ 230, 133, 36, 3, 231, 136, 36, 3, 211, 103, 36, 3, 211, 8, 36, 3, 210,
+ 255, 36, 3, 210, 212, 36, 3, 210, 181, 36, 3, 211, 47, 36, 3, 211, 44,
+ 36, 3, 211, 82, 36, 3, 210, 244, 36, 3, 210, 229, 36, 3, 211, 55, 36, 3,
+ 223, 185, 36, 3, 223, 36, 36, 3, 222, 240, 36, 3, 222, 141, 36, 3, 222,
+ 113, 36, 3, 223, 129, 36, 3, 223, 109, 36, 3, 223, 167, 36, 3, 222, 212,
+ 36, 3, 222, 198, 36, 3, 223, 137, 36, 3, 233, 135, 36, 3, 232, 242, 36,
+ 3, 232, 228, 36, 3, 232, 99, 36, 3, 232, 74, 36, 3, 233, 59, 36, 3, 233,
+ 51, 36, 3, 233, 110, 36, 3, 232, 157, 36, 3, 232, 128, 36, 3, 233, 75,
+ 36, 3, 214, 26, 36, 3, 213, 176, 36, 3, 213, 162, 36, 3, 212, 116, 36, 3,
+ 212, 109, 36, 3, 213, 255, 36, 3, 213, 250, 36, 3, 214, 23, 36, 3, 213,
+ 138, 36, 3, 213, 127, 36, 3, 214, 5, 36, 3, 232, 175, 36, 3, 232, 170,
+ 36, 3, 232, 169, 36, 3, 232, 166, 36, 3, 232, 165, 36, 3, 232, 172, 36,
+ 3, 232, 171, 36, 3, 232, 174, 36, 3, 232, 168, 36, 3, 232, 167, 36, 3,
+ 232, 173, 36, 3, 232, 184, 36, 3, 232, 179, 36, 3, 232, 178, 36, 3, 232,
+ 162, 36, 3, 232, 161, 36, 3, 232, 181, 36, 3, 232, 180, 36, 3, 232, 183,
+ 36, 3, 232, 164, 36, 3, 232, 163, 36, 3, 232, 182, 36, 3, 222, 179, 36,
+ 3, 222, 168, 36, 3, 222, 167, 36, 3, 222, 161, 36, 3, 222, 154, 36, 3,
+ 222, 175, 36, 3, 222, 174, 36, 3, 222, 178, 36, 3, 222, 166, 36, 3, 222,
+ 165, 36, 3, 222, 177, 36, 3, 228, 92, 36, 3, 228, 87, 36, 3, 228, 86, 36,
+ 3, 228, 83, 36, 3, 228, 82, 36, 3, 228, 89, 36, 3, 228, 88, 36, 3, 228,
+ 91, 36, 3, 228, 85, 36, 3, 228, 84, 36, 3, 228, 90, 36, 3, 235, 141, 36,
+ 3, 235, 109, 36, 3, 235, 102, 36, 3, 235, 52, 36, 3, 235, 34, 36, 3, 235,
+ 127, 36, 3, 235, 125, 36, 3, 235, 136, 36, 3, 235, 69, 36, 3, 235, 60,
+ 36, 3, 235, 130, 36, 3, 220, 99, 36, 3, 220, 33, 36, 3, 220, 28, 36, 3,
+ 219, 226, 36, 3, 219, 211, 36, 3, 220, 64, 36, 3, 220, 62, 36, 3, 220,
+ 91, 36, 3, 220, 8, 36, 3, 220, 2, 36, 3, 220, 72, 36, 3, 218, 223, 36, 3,
+ 218, 193, 36, 3, 218, 189, 36, 3, 218, 180, 36, 3, 218, 177, 36, 3, 218,
+ 198, 36, 3, 218, 197, 36, 3, 218, 222, 36, 3, 218, 185, 36, 3, 218, 184,
+ 36, 3, 218, 200, 36, 3, 222, 32, 36, 3, 219, 192, 36, 3, 219, 176, 36, 3,
+ 218, 84, 36, 3, 218, 5, 36, 3, 221, 182, 36, 3, 221, 171, 36, 3, 222, 18,
+ 36, 3, 219, 59, 36, 3, 219, 41, 36, 3, 221, 220, 36, 3, 242, 47, 36, 3,
+ 241, 181, 36, 3, 241, 162, 36, 3, 240, 223, 36, 3, 240, 203, 36, 3, 241,
+ 239, 36, 3, 241, 221, 36, 3, 242, 37, 36, 3, 241, 69, 36, 3, 241, 54, 36,
+ 3, 241, 247, 36, 3, 233, 232, 36, 3, 233, 231, 36, 3, 233, 226, 36, 3,
+ 233, 225, 36, 3, 233, 222, 36, 3, 233, 221, 36, 3, 233, 228, 36, 3, 233,
+ 227, 36, 3, 233, 230, 36, 3, 233, 224, 36, 3, 233, 223, 36, 3, 233, 229,
+ 36, 3, 219, 232, 175, 116, 5, 211, 68, 175, 116, 5, 223, 156, 175, 116,
+ 5, 223, 79, 98, 1, 215, 28, 69, 116, 5, 249, 234, 176, 69, 116, 5, 249,
+ 234, 234, 133, 69, 116, 5, 249, 234, 234, 29, 69, 116, 5, 249, 234, 234,
+ 106, 69, 116, 5, 249, 234, 229, 5, 69, 116, 5, 249, 234, 251, 34, 69,
+ 116, 5, 249, 234, 250, 158, 69, 116, 5, 249, 234, 249, 239, 69, 116, 5,
+ 249, 234, 250, 87, 69, 116, 5, 249, 234, 227, 135, 69, 116, 5, 249, 234,
+ 248, 222, 69, 116, 5, 249, 234, 215, 145, 69, 116, 5, 249, 234, 247, 146,
+ 69, 116, 5, 249, 234, 215, 140, 69, 116, 5, 249, 234, 197, 69, 116, 5,
+ 249, 234, 217, 106, 69, 116, 5, 249, 234, 216, 209, 69, 116, 5, 249, 234,
+ 111, 69, 116, 5, 249, 234, 216, 157, 69, 116, 5, 249, 234, 228, 75, 69,
+ 116, 5, 249, 234, 252, 192, 69, 116, 5, 249, 234, 225, 148, 69, 116, 5,
+ 249, 234, 225, 17, 69, 116, 5, 249, 234, 225, 122, 69, 116, 5, 249, 234,
+ 230, 162, 69, 116, 5, 249, 234, 210, 244, 69, 116, 5, 249, 234, 222, 212,
+ 69, 116, 5, 249, 234, 232, 157, 69, 116, 5, 249, 234, 213, 138, 69, 116,
+ 5, 249, 234, 220, 103, 69, 116, 5, 249, 234, 218, 224, 69, 116, 5, 249,
+ 234, 206, 69, 116, 5, 249, 234, 162, 69, 116, 5, 249, 234, 233, 136, 69,
+ 25, 5, 249, 234, 224, 89, 69, 235, 244, 25, 5, 249, 234, 224, 31, 69,
+ 235, 244, 25, 5, 249, 234, 222, 101, 69, 235, 244, 25, 5, 249, 234, 222,
+ 94, 69, 235, 244, 25, 5, 249, 234, 224, 70, 69, 25, 5, 226, 205, 69, 25,
+ 5, 255, 35, 141, 1, 252, 0, 229, 78, 141, 1, 252, 0, 229, 28, 141, 1,
+ 252, 0, 228, 249, 141, 1, 252, 0, 229, 65, 141, 1, 252, 0, 229, 5, 56, 1,
+ 252, 0, 229, 78, 56, 1, 252, 0, 229, 28, 56, 1, 252, 0, 228, 249, 56, 1,
+ 252, 0, 229, 65, 56, 1, 252, 0, 229, 5, 56, 1, 254, 195, 250, 191, 56, 1,
+ 254, 195, 215, 119, 56, 1, 254, 195, 111, 56, 1, 254, 195, 226, 106, 58,
+ 1, 245, 21, 245, 20, 249, 183, 138, 130, 58, 1, 245, 20, 245, 21, 249,
+ 183, 138, 130,
};
static unsigned char phrasebook_offset1[] = {
@@ -15040,2044 +15042,2044 @@ static unsigned int phrasebook_offset2[] = {
39251, 39258, 39265, 39272, 39279, 39285, 39291, 39298, 39305, 39312, 0,
0, 0, 39319, 39322, 39325, 39328, 39333, 39336, 39339, 39342, 39345,
39348, 39351, 39355, 39358, 39361, 39364, 39367, 39370, 39375, 39378,
- 39381, 39384, 39387, 39390, 39395, 39398, 39401, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39406, 39411, 39416, 39423,
- 39431, 39436, 39441, 39445, 39449, 39454, 39461, 39468, 39472, 39477,
- 39482, 39487, 39492, 39499, 39504, 39509, 39514, 39523, 39530, 39537,
- 39541, 39546, 39552, 39557, 39564, 39573, 39582, 39586, 39590, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39594, 39598, 39606, 39610, 39614,
- 39619, 39623, 39627, 39631, 39633, 39637, 39641, 39645, 39650, 39654,
- 39658, 39666, 39669, 39673, 39676, 39679, 39685, 39689, 39692, 39698,
- 39702, 39706, 39710, 39713, 39717, 39720, 39724, 39726, 39729, 39732,
- 39736, 39738, 39742, 39745, 39748, 39753, 39758, 39765, 39768, 39771,
- 39775, 39780, 39783, 39786, 39789, 39793, 39798, 39801, 39804, 39806,
- 39809, 39812, 39815, 39819, 39824, 39827, 39831, 39835, 39839, 39843,
- 39848, 39854, 39859, 39864, 39870, 39875, 39880, 39884, 39888, 39893,
- 39897, 39901, 39904, 39906, 39911, 39917, 39924, 39931, 39938, 39945,
- 39952, 39959, 39966, 39973, 39981, 39988, 39996, 40003, 40010, 40018,
- 40026, 40031, 40036, 40041, 40046, 40051, 40056, 40061, 40066, 40071,
- 40076, 40082, 40088, 40094, 40100, 40107, 40115, 40122, 40128, 40134,
- 40140, 40146, 40152, 40158, 40164, 40170, 40176, 40183, 40190, 40197,
- 40204, 40212, 40221, 40229, 40240, 40248, 40256, 40265, 40272, 40281,
- 40290, 40298, 40307, 0, 0, 0, 0, 0, 0, 40315, 40317, 40320, 40322, 40325,
- 40328, 40331, 40336, 40341, 40346, 40351, 40355, 40359, 40363, 40367,
- 40372, 40378, 40383, 40389, 40394, 40399, 40404, 40410, 40415, 40421,
- 40427, 40431, 40435, 40440, 40445, 40450, 40455, 40460, 40468, 40476,
- 40484, 40492, 40499, 40507, 40514, 40521, 40530, 40542, 40548, 40554,
- 40562, 40570, 40579, 40588, 40596, 40604, 40613, 40622, 40627, 40635,
- 40640, 40645, 40651, 40656, 40662, 40669, 40676, 40681, 40687, 40692,
- 40695, 40699, 40702, 40706, 40710, 40714, 40720, 40726, 40732, 40738,
- 40742, 40746, 40750, 40754, 40760, 40766, 40770, 40775, 40779, 40784,
- 40789, 40794, 40797, 40801, 40804, 40808, 40815, 40823, 40834, 40845,
- 40850, 40859, 40866, 40875, 40884, 40888, 40894, 40902, 40906, 40911,
- 40916, 40922, 40928, 40934, 40941, 40945, 40949, 40954, 40957, 40959,
- 40963, 40967, 40975, 40979, 40981, 40983, 40987, 40995, 41000, 41006,
- 41016, 41023, 41028, 41032, 41036, 41040, 41043, 41046, 41049, 41053,
- 41057, 41061, 41065, 41069, 41072, 41076, 41080, 41083, 41085, 41088,
- 41090, 41094, 41098, 41100, 41106, 41109, 41114, 41118, 41122, 41124,
- 41126, 41128, 41131, 41135, 41139, 41143, 41147, 41151, 41157, 41163,
- 41165, 41167, 41169, 41171, 41174, 41176, 41180, 41182, 41186, 41189,
- 41195, 41199, 41203, 41206, 41209, 41213, 41219, 41223, 41233, 41243,
- 41247, 41253, 41259, 41262, 41266, 41269, 41274, 41278, 41284, 41288,
- 41300, 41308, 41312, 41316, 41322, 41326, 41329, 41331, 41334, 41338,
- 41342, 41349, 41353, 41357, 41361, 41364, 41369, 41374, 41379, 41384,
- 41389, 41394, 41402, 41410, 41414, 41418, 41420, 41425, 41429, 41433,
- 41441, 41449, 41455, 41461, 41470, 41479, 41484, 41489, 41497, 41505,
- 41507, 41509, 41514, 41519, 41525, 41531, 41537, 41543, 41547, 41551,
- 41558, 41565, 41571, 41577, 41587, 41597, 41605, 41613, 41615, 41619,
- 41623, 41628, 41633, 41640, 41647, 41650, 41653, 41656, 41659, 41662,
- 41667, 41671, 41676, 41681, 41684, 41687, 41690, 41693, 41696, 41700,
- 41703, 41706, 41709, 41712, 41714, 41716, 41718, 41720, 41728, 41736,
- 41742, 41746, 41752, 41762, 41768, 41774, 41780, 41788, 41796, 41807,
- 41811, 41815, 41817, 41823, 41825, 41827, 41829, 41831, 41837, 41840,
- 41846, 41852, 41856, 41860, 41864, 41867, 41871, 41875, 41877, 41886,
- 41895, 41900, 41905, 41911, 41917, 41923, 41926, 41929, 41932, 41935,
- 41937, 41942, 41947, 41952, 41958, 41964, 41972, 41980, 41986, 41992,
- 41998, 42004, 42013, 42022, 42031, 42040, 42049, 42058, 42067, 42076,
- 42085, 42094, 42102, 42114, 42124, 42139, 42142, 42147, 42153, 42159,
- 42166, 42180, 42195, 42201, 42207, 42214, 42220, 42228, 42234, 42247,
- 42261, 42266, 42272, 42279, 42282, 42285, 42287, 42290, 42293, 42295,
- 42297, 42301, 42304, 42307, 42310, 42313, 42318, 42323, 42328, 42333,
- 42338, 42341, 42343, 42345, 42347, 42351, 42355, 42359, 42365, 42370,
- 42372, 42374, 42379, 42384, 42389, 42394, 42399, 42404, 42406, 42408,
- 42417, 42421, 42429, 42438, 42440, 42445, 42450, 42458, 42462, 42464,
- 42468, 42470, 42474, 42478, 42482, 42484, 42486, 42488, 42495, 42504,
- 42513, 42522, 42531, 42540, 42549, 42558, 42567, 42575, 42583, 42592,
- 42601, 42610, 42619, 42627, 42635, 42644, 42653, 42662, 42672, 42681,
- 42691, 42700, 42710, 42719, 42729, 42739, 42748, 42758, 42767, 42777,
- 42786, 42796, 42805, 42814, 42823, 42832, 42841, 42851, 42860, 42869,
- 42878, 42888, 42897, 42906, 42915, 42924, 42934, 42944, 42953, 42962,
- 42970, 42978, 42985, 42993, 43002, 43013, 43022, 43031, 43040, 43047,
- 43054, 43061, 43070, 43079, 43088, 43097, 43104, 43109, 43118, 43123,
- 43126, 43134, 43137, 43142, 43147, 43150, 43153, 43161, 43164, 43169,
- 43172, 43179, 43184, 43192, 43195, 43198, 43201, 43206, 43211, 43214,
- 43217, 43225, 43228, 43235, 43242, 43246, 43250, 43255, 43260, 43266,
- 43271, 43277, 43283, 43288, 43294, 43302, 43308, 43316, 43324, 43330,
- 43338, 43346, 43355, 43363, 43369, 43377, 43386, 43394, 43398, 43403,
- 43416, 43429, 43433, 43437, 43441, 43445, 43455, 43459, 43464, 43469,
- 43474, 43479, 43484, 43489, 43499, 43509, 43517, 43527, 43537, 43545,
- 43555, 43565, 43573, 43583, 43593, 43601, 43609, 43619, 43629, 43632,
- 43635, 43638, 43643, 43647, 43653, 43660, 43667, 43675, 43682, 43686,
- 43690, 43694, 43698, 43700, 43704, 43708, 43713, 43718, 43725, 43732,
- 43735, 43742, 43744, 43746, 43750, 43754, 43759, 43765, 43771, 43777,
- 43783, 43792, 43801, 43810, 43814, 43816, 43820, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43827, 43831, 43838, 43845, 43852, 43859, 43863, 43867,
- 43871, 43875, 43880, 43886, 43891, 43897, 43903, 43909, 43915, 43923,
- 43930, 43937, 43944, 43951, 43956, 43962, 43971, 43975, 43982, 43986,
- 43990, 43996, 44002, 44008, 44014, 44018, 44022, 44025, 44028, 44032,
- 44039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 44046, 44049, 44053, 44057, 44063, 44069, 44075, 44083, 44090,
- 44094, 44102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 44107, 44110, 44113, 44116, 44119, 44122, 44125, 44128, 44131, 44134,
- 44138, 44142, 44146, 44150, 44154, 44158, 44162, 44166, 44170, 44174,
- 44178, 44181, 44184, 44187, 44190, 44193, 44196, 44199, 44202, 44205,
- 44209, 44213, 44217, 44221, 44225, 44229, 44233, 44237, 44241, 44245,
- 44249, 44255, 44261, 44267, 44274, 44281, 44288, 44295, 44302, 44309,
- 44316, 44323, 44330, 44337, 44344, 44351, 44358, 44365, 44372, 44379,
- 44386, 44391, 44397, 44403, 44409, 44414, 44420, 44426, 44432, 44437,
- 44443, 44449, 44454, 44459, 44465, 44470, 44476, 44482, 44487, 44493,
- 44499, 44504, 44510, 44516, 44522, 44528, 44534, 44539, 44545, 44551,
- 44557, 44562, 44568, 44574, 44580, 44585, 44591, 44597, 44602, 44607,
- 44613, 44618, 44624, 44630, 44635, 44641, 44647, 44652, 44658, 44664,
- 44670, 44676, 44682, 44687, 44693, 44699, 44705, 44710, 44716, 44722,
- 44728, 44733, 44739, 44745, 44750, 44755, 44761, 44766, 44772, 44778,
- 44783, 44789, 44795, 44800, 44806, 44812, 44818, 44824, 44830, 44834,
- 44839, 44844, 44849, 44854, 44859, 44864, 44869, 44874, 44879, 44884,
- 44888, 44892, 44896, 44900, 44904, 44908, 44912, 44916, 44920, 44925,
- 44930, 44935, 44940, 44945, 44950, 44959, 44968, 44977, 44986, 44995,
- 45004, 45013, 45022, 45029, 45037, 45045, 45052, 45059, 45067, 45075,
- 45082, 45089, 45097, 45105, 45112, 45119, 45127, 45135, 45142, 45149,
- 45157, 45166, 45175, 45183, 45192, 45201, 45208, 45215, 45223, 45232,
- 45241, 45249, 45258, 45267, 45274, 45281, 45290, 45299, 45307, 45315,
- 45324, 45333, 45340, 45347, 45356, 45365, 45373, 45381, 45390, 45399,
- 45406, 45413, 45422, 45431, 45439, 45448, 45457, 45465, 45475, 45485,
- 45495, 45505, 45514, 45523, 45532, 45541, 45548, 45556, 45564, 45572,
- 45580, 45585, 45590, 45599, 45607, 45614, 45623, 45631, 45638, 45647,
- 45655, 45662, 45671, 45679, 45686, 45695, 45703, 45710, 45719, 45727,
- 45734, 45743, 45751, 45758, 45767, 45775, 45782, 45791, 45799, 45806,
- 45815, 45824, 45833, 45842, 45856, 45870, 45877, 45882, 45887, 45892,
- 45897, 45902, 45907, 45912, 45917, 45925, 45933, 45941, 45949, 45954,
- 45961, 45968, 45975, 45980, 45988, 45995, 46003, 46007, 46014, 46020,
- 46027, 46031, 46037, 46043, 46049, 46053, 46056, 46060, 46064, 46071,
- 46077, 46083, 46089, 46095, 46109, 46119, 46133, 46147, 46153, 46163,
- 46177, 46180, 46183, 46190, 46198, 46203, 46208, 46216, 46228, 46240,
- 46248, 46252, 46256, 46259, 46262, 46266, 46270, 46273, 46276, 46281,
- 46286, 46292, 46298, 46303, 46308, 46314, 46320, 46325, 46330, 46335,
- 46340, 46346, 46352, 46357, 46362, 46368, 46374, 46379, 46384, 46387,
- 46390, 46399, 46401, 46403, 46406, 46410, 46416, 46418, 46421, 46428,
- 46435, 46443, 46451, 46461, 46475, 46480, 46485, 46489, 46494, 46502,
- 46510, 46519, 46528, 46537, 46546, 46551, 46556, 46562, 46568, 46574,
- 46580, 46583, 46589, 46595, 46605, 46615, 46623, 46631, 46640, 46649,
- 46653, 46661, 46669, 46677, 46685, 46694, 46703, 46712, 46721, 46726,
- 46731, 46736, 46741, 46746, 46752, 46758, 46763, 46769, 46771, 46773,
- 46775, 46777, 46780, 46783, 46785, 46787, 46789, 46793, 46797, 46799,
- 46801, 46804, 46807, 46811, 46817, 46823, 46825, 46832, 46836, 46841,
- 46846, 46848, 46858, 46864, 46870, 46876, 46882, 46888, 46894, 46899,
- 46902, 46905, 46908, 46910, 46912, 46916, 46920, 46925, 46930, 46935,
- 46938, 46942, 46947, 46950, 46954, 46959, 46964, 46969, 46974, 46979,
- 46984, 46989, 46994, 46999, 47004, 47009, 47014, 47020, 47026, 47032,
- 47034, 47037, 47039, 47042, 47044, 47046, 47048, 47050, 47052, 47054,
- 47056, 47058, 47060, 47062, 47064, 47066, 47068, 47070, 47072, 47074,
- 47076, 47081, 47086, 47091, 47096, 47101, 47106, 47111, 47116, 47121,
- 47126, 47131, 47136, 47141, 47146, 47151, 47156, 47161, 47166, 47171,
- 47176, 47180, 47184, 47188, 47194, 47200, 47205, 47210, 47215, 47220,
- 47225, 47230, 47238, 47246, 47254, 47262, 47270, 47278, 47286, 47294,
- 47300, 47305, 47310, 47315, 47318, 47322, 47326, 47330, 47334, 47338,
- 47342, 47349, 47356, 47364, 47372, 47377, 47382, 47389, 47396, 47403,
- 47410, 47413, 47416, 47421, 47423, 47427, 47432, 47434, 47436, 47438,
- 47440, 47445, 47448, 47450, 47455, 47462, 47469, 47472, 47476, 47481,
- 47486, 47494, 47500, 47506, 47518, 47525, 47532, 47537, 47542, 47548,
- 47551, 47554, 47559, 47561, 47565, 47567, 47569, 47571, 47573, 47575,
- 47577, 47582, 47584, 47586, 47588, 47590, 47594, 47596, 47599, 47604,
- 47609, 47614, 47619, 47625, 47631, 47633, 47636, 47643, 47650, 47657,
- 47664, 47668, 47672, 47674, 47676, 47680, 47686, 47691, 47693, 47697,
- 47706, 47714, 47722, 47728, 47734, 47739, 47745, 47750, 47753, 47767,
- 47770, 47775, 47780, 47786, 47796, 47798, 47804, 47810, 47814, 47821,
- 47825, 47827, 47829, 47833, 47839, 47844, 47850, 47852, 47858, 47860,
- 47866, 47868, 47870, 47875, 47877, 47881, 47886, 47888, 47893, 47898,
- 47902, 47909, 0, 47919, 47925, 47928, 47934, 47937, 47942, 47947, 47951,
- 47953, 47955, 47959, 47963, 47967, 47971, 47976, 47978, 47983, 47986,
- 47989, 47992, 47996, 48000, 48005, 48009, 48014, 48019, 48023, 48028,
- 48034, 48037, 48043, 48048, 48052, 48057, 48063, 48069, 48076, 48082,
- 48089, 48096, 48098, 48105, 48109, 48115, 48121, 48126, 48132, 48136,
- 48141, 48144, 48149, 48155, 48162, 48170, 48177, 48186, 48196, 48203,
- 48209, 48213, 48220, 48225, 48234, 48237, 48240, 48249, 48259, 48266,
- 48268, 48274, 48279, 48281, 48284, 48288, 48296, 48305, 48308, 48313,
- 48318, 48326, 48334, 48342, 48350, 48356, 48362, 48368, 48376, 48381,
- 48384, 48388, 48391, 48403, 48413, 48424, 48433, 48444, 48454, 48463,
- 48469, 48477, 48481, 48489, 48493, 48501, 48508, 48515, 48524, 48533,
- 48543, 48553, 48563, 48573, 48582, 48591, 48601, 48611, 48620, 48629,
- 48635, 48641, 48647, 48653, 48659, 48665, 48671, 48677, 48683, 48690,
- 48696, 48702, 48708, 48714, 48720, 48726, 48732, 48738, 48744, 48751,
- 48758, 48765, 48772, 48779, 48786, 48793, 48800, 48807, 48814, 48822,
- 48827, 48830, 48834, 48838, 48844, 48847, 48853, 48859, 48864, 48868,
- 48873, 48879, 48886, 48889, 48896, 48903, 48907, 48916, 48925, 48930,
- 48936, 48941, 48946, 48953, 48960, 48968, 48976, 48985, 48989, 48998,
- 49003, 49007, 49014, 49018, 49025, 49033, 49038, 49046, 49050, 49055,
- 49059, 49064, 49068, 49073, 49078, 49087, 49089, 49092, 49095, 49102,
- 49109, 49114, 49122, 49128, 49134, 49139, 49142, 49147, 49152, 49157,
- 49165, 49169, 49176, 49184, 49192, 49197, 49202, 49208, 49213, 49218,
- 49224, 49229, 49232, 49236, 49240, 49247, 49256, 49261, 49270, 49279,
- 49285, 49291, 49296, 49301, 49306, 49311, 49317, 49323, 49331, 49339,
- 49345, 49351, 49356, 49361, 49368, 49375, 49381, 49384, 49387, 49391,
- 49395, 49399, 49404, 49410, 49416, 49423, 49430, 49435, 49439, 49443,
- 49447, 49451, 49455, 49459, 49463, 49467, 49471, 49475, 49479, 49483,
- 49487, 49491, 49495, 49499, 49503, 49507, 49511, 49515, 49519, 49523,
- 49527, 49531, 49535, 49539, 49543, 49547, 49551, 49555, 49559, 49563,
- 49567, 49571, 49575, 49579, 49583, 49587, 49591, 49595, 49599, 49603,
- 49607, 49611, 49615, 49619, 49623, 49627, 49631, 49635, 49639, 49643,
- 49647, 49651, 49655, 49659, 49663, 49667, 49671, 49675, 49679, 49683,
- 49687, 49691, 49695, 49699, 49703, 49707, 49711, 49715, 49719, 49723,
- 49727, 49731, 49735, 49739, 49743, 49747, 49751, 49755, 49759, 49763,
- 49767, 49771, 49775, 49779, 49783, 49787, 49791, 49795, 49799, 49803,
- 49807, 49811, 49815, 49819, 49823, 49827, 49831, 49835, 49839, 49843,
- 49847, 49851, 49855, 49859, 49863, 49867, 49871, 49875, 49879, 49883,
- 49887, 49891, 49895, 49899, 49903, 49907, 49911, 49915, 49919, 49923,
- 49927, 49931, 49935, 49939, 49943, 49947, 49951, 49955, 49959, 49963,
- 49967, 49971, 49975, 49979, 49983, 49987, 49991, 49995, 49999, 50003,
- 50007, 50011, 50015, 50019, 50023, 50027, 50031, 50035, 50039, 50043,
- 50047, 50051, 50055, 50059, 50063, 50067, 50071, 50075, 50079, 50083,
- 50087, 50091, 50095, 50099, 50103, 50107, 50111, 50115, 50119, 50123,
- 50127, 50131, 50135, 50139, 50143, 50147, 50151, 50155, 50159, 50163,
- 50167, 50171, 50175, 50179, 50183, 50187, 50191, 50195, 50199, 50203,
- 50207, 50211, 50215, 50219, 50223, 50227, 50231, 50235, 50239, 50243,
- 50247, 50251, 50255, 50259, 50263, 50267, 50271, 50275, 50279, 50283,
- 50287, 50291, 50295, 50299, 50303, 50307, 50311, 50315, 50319, 50323,
- 50327, 50331, 50335, 50339, 50343, 50347, 50351, 50355, 50359, 50363,
- 50367, 50371, 50375, 50379, 50383, 50387, 50391, 50395, 50399, 50403,
- 50407, 50411, 50415, 50419, 50423, 50427, 50431, 50435, 50439, 50443,
- 50447, 50451, 50455, 50459, 50466, 50474, 50480, 50486, 50493, 50500,
- 50506, 50512, 50518, 50524, 50529, 50534, 50539, 50544, 50550, 50556,
- 50564, 50571, 50577, 50583, 50591, 50600, 50607, 50617, 50628, 50631,
- 50634, 50638, 50642, 50649, 50656, 50667, 50678, 50688, 50698, 50705,
- 50712, 50719, 50726, 50737, 50748, 50759, 50770, 50780, 50790, 50802,
- 50814, 50825, 50836, 50848, 50860, 50869, 50879, 50889, 50900, 50911,
- 50918, 50925, 50932, 50939, 50949, 50959, 50967, 50975, 50982, 50989,
- 50996, 51003, 51010, 51015, 51020, 51026, 51034, 51044, 51054, 51064,
- 51074, 51084, 51094, 51104, 51114, 51124, 51134, 51144, 51155, 51166,
- 51176, 51186, 51197, 51208, 51218, 51228, 51239, 51250, 51260, 51270,
- 51281, 51292, 51308, 51327, 51343, 51362, 51378, 51394, 51410, 51426,
- 51437, 51449, 51460, 51472, 51491, 51510, 51518, 51524, 51531, 51538,
- 51545, 51552, 51557, 51563, 51568, 51573, 51579, 51584, 51589, 51594,
- 51599, 51604, 51611, 51616, 51623, 51628, 51633, 51637, 51641, 51648,
- 51655, 51662, 51669, 51676, 51683, 51696, 51709, 51722, 51735, 51743,
- 51751, 51757, 51763, 51770, 51777, 51784, 51791, 51795, 51800, 51808,
- 51816, 51824, 51831, 51835, 51843, 51851, 51855, 51859, 51864, 51871,
- 51879, 51887, 51906, 51925, 51944, 51963, 51982, 52001, 52020, 52039,
- 52045, 52052, 52061, 52069, 52077, 52082, 52085, 52088, 52093, 52096,
- 52115, 52122, 52128, 52134, 52138, 52141, 52144, 52147, 52159, 52172,
- 52179, 52186, 52189, 52193, 52196, 52201, 52206, 52211, 52217, 52226,
- 52233, 52240, 52248, 52255, 52262, 52265, 52271, 52277, 52280, 52283,
- 52288, 52293, 52299, 52305, 52309, 52314, 52321, 52325, 52331, 52335,
- 52339, 52347, 52359, 52368, 52372, 52374, 52383, 52392, 52398, 52401,
- 52407, 52413, 52418, 52423, 52428, 52433, 52438, 52443, 52445, 52451,
- 52456, 52463, 52467, 52473, 52476, 52480, 52487, 52494, 52496, 52498,
- 52504, 52510, 52516, 52525, 52534, 52541, 52548, 52554, 52560, 52565,
- 52570, 52575, 52581, 52587, 52592, 52599, 52603, 52607, 52620, 52633,
- 52645, 52654, 52660, 52667, 52672, 52677, 52682, 52687, 52692, 52694,
- 52701, 52708, 52715, 52722, 52729, 52737, 52743, 52748, 52754, 52760,
- 52766, 52773, 52779, 52787, 52795, 52803, 52811, 52818, 52824, 52830,
- 52839, 52843, 52852, 52861, 52870, 52878, 52882, 52888, 52895, 52902,
- 52906, 52912, 52919, 52924, 52929, 52935, 52940, 52945, 52952, 52959,
- 52964, 52969, 52977, 52985, 52995, 53005, 53012, 53019, 53023, 53027,
- 53039, 53045, 53051, 53056, 53061, 53068, 53075, 53081, 53087, 53096,
- 53104, 53112, 53119, 53126, 53133, 53139, 53146, 53152, 53159, 53166,
- 53173, 53180, 53186, 53191, 53200, 53210, 53217, 53226, 53232, 53237,
- 53242, 53252, 53258, 53264, 53270, 53278, 53283, 53290, 53297, 53308,
- 53315, 53322, 53329, 53336, 53343, 53350, 53357, 53369, 53381, 53392,
- 53403, 53416, 53429, 53434, 53439, 53448, 53457, 53464, 53471, 53480,
- 53489, 53497, 53505, 53513, 53521, 53531, 53541, 53555, 53569, 53577,
- 53585, 53597, 53609, 53617, 53625, 53635, 53645, 53650, 53655, 53664,
- 53673, 53678, 53683, 53691, 53697, 53703, 53711, 53719, 53732, 53745,
- 53749, 53753, 53760, 53767, 53774, 53782, 53790, 53799, 53808, 53814,
- 53820, 53827, 53834, 53841, 53848, 53857, 53866, 53869, 53872, 53877,
- 53882, 53888, 53894, 53901, 53908, 53918, 53928, 53935, 53942, 53950,
- 53958, 53966, 53974, 53982, 53990, 53996, 54002, 54006, 54010, 54017,
- 54024, 54029, 54034, 54039, 54044, 54050, 54064, 54071, 54078, 54082,
- 54084, 54086, 54091, 54096, 54101, 54106, 54114, 54121, 54128, 54136,
- 54148, 54156, 54164, 54175, 54179, 54183, 54189, 54197, 54210, 54217,
- 54224, 54231, 54236, 54243, 54252, 54260, 54266, 54272, 54278, 54287,
- 54296, 54304, 54313, 54318, 54321, 54326, 54332, 54338, 54344, 54350,
- 54354, 54357, 54361, 54365, 54371, 54377, 54383, 54389, 54393, 54397,
- 54404, 54411, 54418, 54425, 54432, 54439, 54449, 54459, 54466, 54473,
- 54481, 54489, 54493, 54498, 54503, 54509, 54515, 54518, 54521, 54524,
- 54527, 54531, 54536, 54541, 54546, 54551, 54556, 54560, 54564, 54568,
- 54572, 54576, 54580, 54584, 54590, 54594, 54600, 54605, 54612, 54620,
- 54627, 54635, 54642, 54650, 54659, 54666, 54676, 54687, 54693, 54702,
- 54708, 54717, 54726, 54732, 54738, 54742, 54746, 54755, 54764, 54771,
- 54778, 54787, 0, 0, 0, 54796, 54801, 54805, 54809, 54814, 54819, 54824,
- 54832, 54840, 54843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 39381, 39384, 39387, 39390, 39395, 39398, 39401, 39406, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39411, 39416, 39421, 39428,
+ 39436, 39441, 39446, 39450, 39454, 39459, 39466, 39473, 39477, 39482,
+ 39487, 39492, 39497, 39504, 39509, 39514, 39519, 39528, 39535, 39542,
+ 39546, 39551, 39557, 39562, 39569, 39578, 39587, 39591, 39595, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39599, 39603, 39611, 39615, 39619,
+ 39624, 39628, 39632, 39636, 39638, 39642, 39646, 39650, 39655, 39659,
+ 39663, 39671, 39674, 39678, 39681, 39684, 39690, 39694, 39697, 39703,
+ 39707, 39711, 39715, 39718, 39722, 39725, 39729, 39731, 39734, 39737,
+ 39741, 39743, 39747, 39750, 39753, 39758, 39763, 39770, 39773, 39776,
+ 39780, 39785, 39788, 39791, 39794, 39798, 39803, 39806, 39809, 39811,
+ 39814, 39817, 39820, 39824, 39829, 39832, 39836, 39840, 39844, 39848,
+ 39853, 39859, 39864, 39869, 39875, 39880, 39885, 39889, 39893, 39898,
+ 39902, 39906, 39909, 39911, 39916, 39922, 39929, 39936, 39943, 39950,
+ 39957, 39964, 39971, 39978, 39986, 39993, 40001, 40008, 40015, 40023,
+ 40031, 40036, 40041, 40046, 40051, 40056, 40061, 40066, 40071, 40076,
+ 40081, 40087, 40093, 40099, 40105, 40112, 40120, 40127, 40133, 40139,
+ 40145, 40151, 40157, 40163, 40169, 40175, 40181, 40188, 40195, 40202,
+ 40209, 40217, 40226, 40234, 40245, 40253, 40261, 40270, 40277, 40286,
+ 40295, 40303, 40312, 0, 0, 0, 0, 0, 0, 40320, 40322, 40325, 40327, 40330,
+ 40333, 40336, 40341, 40346, 40351, 40356, 40360, 40364, 40368, 40372,
+ 40377, 40383, 40388, 40394, 40399, 40404, 40409, 40415, 40420, 40426,
+ 40432, 40436, 40440, 40445, 40450, 40455, 40460, 40465, 40473, 40481,
+ 40489, 40497, 40504, 40512, 40519, 40526, 40535, 40547, 40553, 40559,
+ 40567, 40575, 40584, 40593, 40601, 40609, 40618, 40627, 40632, 40640,
+ 40645, 40650, 40656, 40661, 40667, 40674, 40681, 40686, 40692, 40697,
+ 40700, 40704, 40707, 40711, 40715, 40719, 40725, 40731, 40737, 40743,
+ 40747, 40751, 40755, 40759, 40765, 40771, 40775, 40780, 40784, 40789,
+ 40794, 40799, 40802, 40806, 40809, 40813, 40820, 40828, 40839, 40850,
+ 40855, 40864, 40871, 40880, 40889, 40893, 40899, 40907, 40911, 40916,
+ 40921, 40927, 40933, 40939, 40946, 40950, 40954, 40959, 40962, 40964,
+ 40968, 40972, 40980, 40984, 40986, 40988, 40992, 41000, 41005, 41011,
+ 41021, 41028, 41033, 41037, 41041, 41045, 41048, 41051, 41054, 41058,
+ 41062, 41066, 41070, 41074, 41077, 41081, 41085, 41088, 41090, 41093,
+ 41095, 41099, 41103, 41105, 41111, 41114, 41119, 41123, 41127, 41129,
+ 41131, 41133, 41136, 41140, 41144, 41148, 41152, 41156, 41162, 41168,
+ 41170, 41172, 41174, 41176, 41179, 41181, 41185, 41187, 41191, 41194,
+ 41200, 41204, 41208, 41211, 41214, 41218, 41224, 41228, 41238, 41248,
+ 41252, 41258, 41264, 41267, 41271, 41274, 41279, 41283, 41289, 41293,
+ 41305, 41313, 41317, 41321, 41327, 41331, 41334, 41336, 41339, 41343,
+ 41347, 41354, 41358, 41362, 41366, 41369, 41374, 41379, 41384, 41389,
+ 41394, 41399, 41407, 41415, 41419, 41423, 41425, 41430, 41434, 41438,
+ 41446, 41454, 41460, 41466, 41475, 41484, 41489, 41494, 41502, 41510,
+ 41512, 41514, 41519, 41524, 41530, 41536, 41542, 41548, 41552, 41556,
+ 41563, 41570, 41576, 41582, 41592, 41602, 41610, 41618, 41620, 41624,
+ 41628, 41633, 41638, 41645, 41652, 41655, 41658, 41661, 41664, 41667,
+ 41672, 41676, 41681, 41686, 41689, 41692, 41695, 41698, 41701, 41705,
+ 41708, 41711, 41714, 41717, 41719, 41721, 41723, 41725, 41733, 41741,
+ 41747, 41751, 41757, 41767, 41773, 41779, 41785, 41793, 41801, 41812,
+ 41816, 41820, 41822, 41828, 41830, 41832, 41834, 41836, 41842, 41845,
+ 41851, 41857, 41861, 41865, 41869, 41872, 41876, 41880, 41882, 41891,
+ 41900, 41905, 41910, 41916, 41922, 41928, 41931, 41934, 41937, 41940,
+ 41942, 41947, 41952, 41957, 41963, 41969, 41977, 41985, 41991, 41997,
+ 42003, 42009, 42018, 42027, 42036, 42045, 42054, 42063, 42072, 42081,
+ 42090, 42099, 42107, 42119, 42129, 42144, 42147, 42152, 42158, 42164,
+ 42171, 42185, 42200, 42206, 42212, 42219, 42225, 42233, 42239, 42252,
+ 42266, 42271, 42277, 42284, 42287, 42290, 42292, 42295, 42298, 42300,
+ 42302, 42306, 42309, 42312, 42315, 42318, 42323, 42328, 42333, 42338,
+ 42343, 42346, 42348, 42350, 42352, 42356, 42360, 42364, 42370, 42375,
+ 42377, 42379, 42384, 42389, 42394, 42399, 42404, 42409, 42411, 42413,
+ 42422, 42426, 42434, 42443, 42445, 42450, 42455, 42463, 42467, 42469,
+ 42473, 42475, 42479, 42483, 42487, 42489, 42491, 42493, 42500, 42509,
+ 42518, 42527, 42536, 42545, 42554, 42563, 42572, 42580, 42588, 42597,
+ 42606, 42615, 42624, 42632, 42640, 42649, 42658, 42667, 42677, 42686,
+ 42696, 42705, 42715, 42724, 42734, 42744, 42753, 42763, 42772, 42782,
+ 42791, 42801, 42810, 42819, 42828, 42837, 42846, 42856, 42865, 42874,
+ 42883, 42893, 42902, 42911, 42920, 42929, 42939, 42949, 42958, 42967,
+ 42975, 42983, 42990, 42998, 43007, 43018, 43027, 43036, 43045, 43052,
+ 43059, 43066, 43075, 43084, 43093, 43102, 43109, 43114, 43123, 43128,
+ 43131, 43139, 43142, 43147, 43152, 43155, 43158, 43166, 43169, 43174,
+ 43177, 43184, 43189, 43197, 43200, 43203, 43206, 43211, 43216, 43219,
+ 43222, 43230, 43233, 43240, 43247, 43251, 43255, 43260, 43265, 43271,
+ 43276, 43282, 43288, 43293, 43299, 43307, 43313, 43321, 43329, 43335,
+ 43343, 43351, 43360, 43368, 43374, 43382, 43391, 43399, 43403, 43408,
+ 43421, 43434, 43438, 43442, 43446, 43450, 43460, 43464, 43469, 43474,
+ 43479, 43484, 43489, 43494, 43504, 43514, 43522, 43532, 43542, 43550,
+ 43560, 43570, 43578, 43588, 43598, 43606, 43614, 43624, 43634, 43637,
+ 43640, 43643, 43648, 43652, 43658, 43665, 43672, 43680, 43687, 43691,
+ 43695, 43699, 43703, 43705, 43709, 43713, 43718, 43723, 43730, 43737,
+ 43740, 43747, 43749, 43751, 43755, 43759, 43764, 43770, 43776, 43782,
+ 43788, 43797, 43806, 43815, 43819, 43821, 43825, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43832, 43836, 43843, 43850, 43857, 43864, 43868, 43872,
+ 43876, 43880, 43885, 43891, 43896, 43902, 43908, 43914, 43920, 43928,
+ 43935, 43942, 43949, 43956, 43961, 43967, 43976, 43980, 43987, 43991,
+ 43995, 44001, 44007, 44013, 44019, 44023, 44027, 44030, 44033, 44037,
+ 44044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 44051, 44054, 44058, 44062, 44068, 44074, 44080, 44088, 44095,
+ 44099, 44107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 44112, 44115, 44118, 44121, 44124, 44127, 44130, 44133, 44136, 44139,
+ 44143, 44147, 44151, 44155, 44159, 44163, 44167, 44171, 44175, 44179,
+ 44183, 44186, 44189, 44192, 44195, 44198, 44201, 44204, 44207, 44210,
+ 44214, 44218, 44222, 44226, 44230, 44234, 44238, 44242, 44246, 44250,
+ 44254, 44260, 44266, 44272, 44279, 44286, 44293, 44300, 44307, 44314,
+ 44321, 44328, 44335, 44342, 44349, 44356, 44363, 44370, 44377, 44384,
+ 44391, 44396, 44402, 44408, 44414, 44419, 44425, 44431, 44437, 44442,
+ 44448, 44454, 44459, 44464, 44470, 44475, 44481, 44487, 44492, 44498,
+ 44504, 44509, 44515, 44521, 44527, 44533, 44539, 44544, 44550, 44556,
+ 44562, 44567, 44573, 44579, 44585, 44590, 44596, 44602, 44607, 44612,
+ 44618, 44623, 44629, 44635, 44640, 44646, 44652, 44657, 44663, 44669,
+ 44675, 44681, 44687, 44692, 44698, 44704, 44710, 44715, 44721, 44727,
+ 44733, 44738, 44744, 44750, 44755, 44760, 44766, 44771, 44777, 44783,
+ 44788, 44794, 44800, 44805, 44811, 44817, 44823, 44829, 44835, 44839,
+ 44844, 44849, 44854, 44859, 44864, 44869, 44874, 44879, 44884, 44889,
+ 44893, 44897, 44901, 44905, 44909, 44913, 44917, 44921, 44925, 44930,
+ 44935, 44940, 44945, 44950, 44955, 44964, 44973, 44982, 44991, 45000,
+ 45009, 45018, 45027, 45034, 45042, 45050, 45057, 45064, 45072, 45080,
+ 45087, 45094, 45102, 45110, 45117, 45124, 45132, 45140, 45147, 45154,
+ 45162, 45171, 45180, 45188, 45197, 45206, 45213, 45220, 45228, 45237,
+ 45246, 45254, 45263, 45272, 45279, 45286, 45295, 45304, 45312, 45320,
+ 45329, 45338, 45345, 45352, 45361, 45370, 45378, 45386, 45395, 45404,
+ 45411, 45418, 45427, 45436, 45444, 45453, 45462, 45470, 45480, 45490,
+ 45500, 45510, 45519, 45528, 45537, 45546, 45553, 45561, 45569, 45577,
+ 45585, 45590, 45595, 45604, 45612, 45619, 45628, 45636, 45643, 45652,
+ 45660, 45667, 45676, 45684, 45691, 45700, 45708, 45715, 45724, 45732,
+ 45739, 45748, 45756, 45763, 45772, 45780, 45787, 45796, 45804, 45811,
+ 45820, 45829, 45838, 45847, 45861, 45875, 45882, 45887, 45892, 45897,
+ 45902, 45907, 45912, 45917, 45922, 45930, 45938, 45946, 45954, 45959,
+ 45966, 45973, 45980, 45985, 45993, 46000, 46008, 46012, 46019, 46025,
+ 46032, 46036, 46042, 46048, 46054, 46058, 46061, 46065, 46069, 46076,
+ 46082, 46088, 46094, 46100, 46114, 46124, 46138, 46152, 46158, 46168,
+ 46182, 46185, 46188, 46195, 46203, 46208, 46213, 46221, 46233, 46245,
+ 46253, 46257, 46261, 46264, 46267, 46271, 46275, 46278, 46281, 46286,
+ 46291, 46297, 46303, 46308, 46313, 46319, 46325, 46330, 46335, 46340,
+ 46345, 46351, 46357, 46362, 46367, 46373, 46379, 46384, 46389, 46392,
+ 46395, 46404, 46406, 46408, 46411, 46415, 46421, 46423, 46426, 46433,
+ 46440, 46448, 46456, 46466, 46480, 46485, 46490, 46494, 46499, 46507,
+ 46515, 46524, 46533, 46542, 46551, 46556, 46561, 46567, 46573, 46579,
+ 46585, 46588, 46594, 46600, 46610, 46620, 46628, 46636, 46645, 46654,
+ 46658, 46666, 46674, 46682, 46690, 46699, 46708, 46717, 46726, 46731,
+ 46736, 46741, 46746, 46751, 46757, 46763, 46768, 46774, 46776, 46778,
+ 46780, 46782, 46785, 46788, 46790, 46792, 46794, 46798, 46802, 46804,
+ 46806, 46809, 46812, 46816, 46822, 46828, 46830, 46837, 46841, 46846,
+ 46851, 46853, 46863, 46869, 46875, 46881, 46887, 46893, 46899, 46904,
+ 46907, 46910, 46913, 46915, 46917, 46921, 46925, 46930, 46935, 46940,
+ 46943, 46947, 46952, 46955, 46959, 46964, 46969, 46974, 46979, 46984,
+ 46989, 46994, 46999, 47004, 47009, 47014, 47019, 47025, 47031, 47037,
+ 47039, 47042, 47044, 47047, 47049, 47051, 47053, 47055, 47057, 47059,
+ 47061, 47063, 47065, 47067, 47069, 47071, 47073, 47075, 47077, 47079,
+ 47081, 47086, 47091, 47096, 47101, 47106, 47111, 47116, 47121, 47126,
+ 47131, 47136, 47141, 47146, 47151, 47156, 47161, 47166, 47171, 47176,
+ 47181, 47185, 47189, 47193, 47199, 47205, 47210, 47215, 47220, 47225,
+ 47230, 47235, 47243, 47251, 47259, 47267, 47275, 47283, 47291, 47299,
+ 47305, 47310, 47315, 47320, 47323, 47327, 47331, 47335, 47339, 47343,
+ 47347, 47354, 47361, 47369, 47377, 47382, 47387, 47394, 47401, 47408,
+ 47415, 47418, 47421, 47426, 47428, 47432, 47437, 47439, 47441, 47443,
+ 47445, 47450, 47453, 47455, 47460, 47467, 47474, 47477, 47481, 47486,
+ 47491, 47499, 47505, 47511, 47523, 47530, 47537, 47542, 47547, 47553,
+ 47556, 47559, 47564, 47566, 47570, 47572, 47574, 47576, 47578, 47580,
+ 47582, 47587, 47589, 47591, 47593, 47595, 47599, 47601, 47604, 47609,
+ 47614, 47619, 47624, 47630, 47636, 47638, 47641, 47648, 47655, 47662,
+ 47669, 47673, 47677, 47679, 47681, 47685, 47691, 47696, 47698, 47702,
+ 47711, 47719, 47727, 47733, 47739, 47744, 47750, 47755, 47758, 47772,
+ 47775, 47780, 47785, 47791, 47801, 47803, 47809, 47815, 47819, 47826,
+ 47830, 47832, 47834, 47838, 47844, 47849, 47855, 47857, 47863, 47865,
+ 47871, 47873, 47875, 47880, 47882, 47886, 47891, 47893, 47898, 47903,
+ 47907, 47914, 0, 47924, 47930, 47933, 47939, 47942, 47947, 47952, 47956,
+ 47958, 47960, 47964, 47968, 47972, 47976, 47981, 47983, 47988, 47991,
+ 47994, 47997, 48001, 48005, 48010, 48014, 48019, 48024, 48028, 48033,
+ 48039, 48042, 48048, 48053, 48057, 48062, 48068, 48074, 48081, 48087,
+ 48094, 48101, 48103, 48110, 48114, 48120, 48126, 48131, 48137, 48141,
+ 48146, 48149, 48154, 48160, 48167, 48175, 48182, 48191, 48201, 48208,
+ 48214, 48218, 48225, 48230, 48239, 48242, 48245, 48254, 48264, 48271,
+ 48273, 48279, 48284, 48286, 48289, 48293, 48301, 48310, 48313, 48318,
+ 48323, 48331, 48339, 48347, 48355, 48361, 48367, 48373, 48381, 48386,
+ 48389, 48393, 48396, 48408, 48418, 48429, 48438, 48449, 48459, 48468,
+ 48474, 48482, 48486, 48494, 48498, 48506, 48513, 48520, 48529, 48538,
+ 48548, 48558, 48568, 48578, 48587, 48596, 48606, 48616, 48625, 48634,
+ 48640, 48646, 48652, 48658, 48664, 48670, 48676, 48682, 48688, 48695,
+ 48701, 48707, 48713, 48719, 48725, 48731, 48737, 48743, 48749, 48756,
+ 48763, 48770, 48777, 48784, 48791, 48798, 48805, 48812, 48819, 48827,
+ 48832, 48835, 48839, 48843, 48849, 48852, 48858, 48864, 48869, 48873,
+ 48878, 48884, 48891, 48894, 48901, 48908, 48912, 48921, 48930, 48935,
+ 48941, 48946, 48951, 48958, 48965, 48973, 48981, 48990, 48994, 49003,
+ 49008, 49012, 49019, 49023, 49030, 49038, 49043, 49051, 49055, 49060,
+ 49064, 49069, 49073, 49078, 49083, 49092, 49094, 49097, 49100, 49107,
+ 49114, 49119, 49127, 49133, 49139, 49144, 49147, 49152, 49157, 49162,
+ 49170, 49174, 49181, 49189, 49197, 49202, 49207, 49213, 49218, 49223,
+ 49229, 49234, 49237, 49241, 49245, 49252, 49261, 49266, 49275, 49284,
+ 49290, 49296, 49301, 49306, 49311, 49316, 49322, 49328, 49336, 49344,
+ 49350, 49356, 49361, 49366, 49373, 49380, 49386, 49389, 49392, 49396,
+ 49400, 49404, 49409, 49415, 49421, 49428, 49435, 49440, 49444, 49448,
+ 49452, 49456, 49460, 49464, 49468, 49472, 49476, 49480, 49484, 49488,
+ 49492, 49496, 49500, 49504, 49508, 49512, 49516, 49520, 49524, 49528,
+ 49532, 49536, 49540, 49544, 49548, 49552, 49556, 49560, 49564, 49568,
+ 49572, 49576, 49580, 49584, 49588, 49592, 49596, 49600, 49604, 49608,
+ 49612, 49616, 49620, 49624, 49628, 49632, 49636, 49640, 49644, 49648,
+ 49652, 49656, 49660, 49664, 49668, 49672, 49676, 49680, 49684, 49688,
+ 49692, 49696, 49700, 49704, 49708, 49712, 49716, 49720, 49724, 49728,
+ 49732, 49736, 49740, 49744, 49748, 49752, 49756, 49760, 49764, 49768,
+ 49772, 49776, 49780, 49784, 49788, 49792, 49796, 49800, 49804, 49808,
+ 49812, 49816, 49820, 49824, 49828, 49832, 49836, 49840, 49844, 49848,
+ 49852, 49856, 49860, 49864, 49868, 49872, 49876, 49880, 49884, 49888,
+ 49892, 49896, 49900, 49904, 49908, 49912, 49916, 49920, 49924, 49928,
+ 49932, 49936, 49940, 49944, 49948, 49952, 49956, 49960, 49964, 49968,
+ 49972, 49976, 49980, 49984, 49988, 49992, 49996, 50000, 50004, 50008,
+ 50012, 50016, 50020, 50024, 50028, 50032, 50036, 50040, 50044, 50048,
+ 50052, 50056, 50060, 50064, 50068, 50072, 50076, 50080, 50084, 50088,
+ 50092, 50096, 50100, 50104, 50108, 50112, 50116, 50120, 50124, 50128,
+ 50132, 50136, 50140, 50144, 50148, 50152, 50156, 50160, 50164, 50168,
+ 50172, 50176, 50180, 50184, 50188, 50192, 50196, 50200, 50204, 50208,
+ 50212, 50216, 50220, 50224, 50228, 50232, 50236, 50240, 50244, 50248,
+ 50252, 50256, 50260, 50264, 50268, 50272, 50276, 50280, 50284, 50288,
+ 50292, 50296, 50300, 50304, 50308, 50312, 50316, 50320, 50324, 50328,
+ 50332, 50336, 50340, 50344, 50348, 50352, 50356, 50360, 50364, 50368,
+ 50372, 50376, 50380, 50384, 50388, 50392, 50396, 50400, 50404, 50408,
+ 50412, 50416, 50420, 50424, 50428, 50432, 50436, 50440, 50444, 50448,
+ 50452, 50456, 50460, 50464, 50471, 50479, 50485, 50491, 50498, 50505,
+ 50511, 50517, 50523, 50529, 50534, 50539, 50544, 50549, 50555, 50561,
+ 50569, 50576, 50582, 50588, 50596, 50605, 50612, 50622, 50633, 50636,
+ 50639, 50643, 50647, 50654, 50661, 50672, 50683, 50693, 50703, 50710,
+ 50717, 50724, 50731, 50742, 50753, 50764, 50775, 50785, 50795, 50807,
+ 50819, 50830, 50841, 50853, 50865, 50874, 50884, 50894, 50905, 50916,
+ 50923, 50930, 50937, 50944, 50954, 50964, 50972, 50980, 50987, 50994,
+ 51001, 51008, 51015, 51020, 51025, 51031, 51039, 51049, 51059, 51069,
+ 51079, 51089, 51099, 51109, 51119, 51129, 51139, 51149, 51160, 51171,
+ 51181, 51191, 51202, 51213, 51223, 51233, 51244, 51255, 51265, 51275,
+ 51286, 51297, 51313, 51332, 51348, 51367, 51383, 51399, 51415, 51431,
+ 51442, 51454, 51465, 51477, 51496, 51515, 51523, 51529, 51536, 51543,
+ 51550, 51557, 51562, 51568, 51573, 51578, 51584, 51589, 51594, 51599,
+ 51604, 51609, 51616, 51621, 51628, 51633, 51638, 51642, 51646, 51653,
+ 51660, 51667, 51674, 51681, 51688, 51701, 51714, 51727, 51740, 51748,
+ 51756, 51762, 51768, 51775, 51782, 51789, 51796, 51800, 51805, 51813,
+ 51821, 51829, 51836, 51840, 51848, 51856, 51860, 51864, 51869, 51876,
+ 51884, 51892, 51911, 51930, 51949, 51968, 51987, 52006, 52025, 52044,
+ 52050, 52057, 52066, 52074, 52082, 52087, 52090, 52093, 52098, 52101,
+ 52120, 52127, 52133, 52139, 52143, 52146, 52149, 52152, 52164, 52177,
+ 52184, 52191, 52194, 52198, 52201, 52206, 52211, 52216, 52222, 52231,
+ 52238, 52245, 52253, 52260, 52267, 52270, 52276, 52282, 52285, 52288,
+ 52293, 52298, 52304, 52310, 52314, 52319, 52326, 52330, 52336, 52340,
+ 52344, 52352, 52364, 52373, 52377, 52379, 52388, 52397, 52403, 52406,
+ 52412, 52418, 52423, 52428, 52433, 52438, 52443, 52448, 52450, 52456,
+ 52461, 52468, 52472, 52478, 52481, 52485, 52492, 52499, 52501, 52503,
+ 52509, 52515, 52521, 52530, 52539, 52546, 52553, 52559, 52565, 52570,
+ 52575, 52580, 52586, 52592, 52597, 52604, 52608, 52612, 52625, 52638,
+ 52650, 52659, 52665, 52672, 52677, 52682, 52687, 52692, 52697, 52699,
+ 52706, 52713, 52720, 52727, 52734, 52742, 52748, 52753, 52759, 52765,
+ 52771, 52778, 52784, 52792, 52800, 52808, 52816, 52823, 52829, 52835,
+ 52844, 52848, 52857, 52866, 52875, 52883, 52887, 52893, 52900, 52907,
+ 52911, 52917, 52924, 52929, 52934, 52940, 52945, 52950, 52957, 52964,
+ 52969, 52974, 52982, 52990, 53000, 53010, 53017, 53024, 53028, 53032,
+ 53044, 53050, 53056, 53061, 53066, 53073, 53080, 53086, 53092, 53101,
+ 53109, 53117, 53124, 53131, 53138, 53144, 53151, 53157, 53164, 53171,
+ 53178, 53185, 53191, 53196, 53205, 53215, 53222, 53231, 53237, 53242,
+ 53247, 53257, 53263, 53269, 53275, 53283, 53288, 53295, 53302, 53313,
+ 53320, 53327, 53334, 53341, 53348, 53355, 53362, 53374, 53386, 53397,
+ 53408, 53421, 53434, 53439, 53444, 53453, 53462, 53469, 53476, 53485,
+ 53494, 53502, 53510, 53518, 53526, 53536, 53546, 53560, 53574, 53582,
+ 53590, 53602, 53614, 53622, 53630, 53640, 53650, 53655, 53660, 53669,
+ 53678, 53683, 53688, 53696, 53702, 53708, 53716, 53724, 53737, 53750,
+ 53754, 53758, 53765, 53772, 53779, 53787, 53795, 53804, 53813, 53819,
+ 53825, 53832, 53839, 53846, 53853, 53862, 53871, 53874, 53877, 53882,
+ 53887, 53893, 53899, 53906, 53913, 53923, 53933, 53940, 53947, 53955,
+ 53963, 53971, 53979, 53987, 53995, 54001, 54007, 54011, 54015, 54022,
+ 54029, 54034, 54039, 54044, 54049, 54055, 54069, 54076, 54083, 54087,
+ 54089, 54091, 54096, 54101, 54106, 54111, 54119, 54126, 54133, 54141,
+ 54153, 54161, 54169, 54180, 54184, 54188, 54194, 54202, 54215, 54222,
+ 54229, 54236, 54241, 54248, 54257, 54265, 54271, 54277, 54283, 54292,
+ 54301, 54309, 54318, 54323, 54326, 54331, 54337, 54343, 54349, 54355,
+ 54359, 54362, 54366, 54370, 54376, 54382, 54388, 54394, 54398, 54402,
+ 54409, 54416, 54423, 54430, 54437, 54444, 54454, 54464, 54471, 54478,
+ 54486, 54494, 54498, 54503, 54508, 54514, 54520, 54523, 54526, 54529,
+ 54532, 54536, 54541, 54546, 54551, 54556, 54561, 54565, 54569, 54573,
+ 54577, 54581, 54585, 54589, 54595, 54599, 54605, 54610, 54617, 54625,
+ 54632, 54640, 54647, 54655, 54664, 54671, 54681, 54692, 54698, 54707,
+ 54713, 54722, 54731, 54737, 54743, 54747, 54751, 54760, 54769, 54776,
+ 54783, 54792, 0, 0, 0, 54801, 54806, 54810, 54814, 54819, 54824, 54829,
+ 54837, 54845, 54848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 54847, 54852, 54857, 54862, 54867, 54872, 54877, 54882,
- 54887, 54892, 54897, 54903, 54907, 54912, 54917, 54922, 54927, 54932,
- 54937, 54942, 54947, 54952, 54957, 54962, 54967, 54972, 54977, 54982,
- 54987, 54992, 54997, 55002, 55007, 55012, 55017, 55023, 55028, 55034,
- 55043, 55048, 55056, 55063, 55072, 55077, 55082, 55087, 55093, 0, 55100,
- 55105, 55110, 55115, 55120, 55125, 55130, 55135, 55140, 55145, 55150,
- 55156, 55160, 55165, 55170, 55175, 55180, 55185, 55190, 55195, 55200,
- 55205, 55210, 55215, 55220, 55225, 55230, 55235, 55240, 55245, 55250,
- 55255, 55260, 55265, 55270, 55276, 55281, 55287, 55296, 55301, 55309,
- 55316, 55325, 55330, 55335, 55340, 55346, 0, 55353, 55361, 55369, 55378,
- 55385, 55393, 55399, 55408, 55416, 55424, 55432, 55440, 55448, 55456,
- 55461, 55468, 55474, 55481, 55489, 55496, 55503, 55511, 55517, 55523,
- 55530, 55537, 55547, 55557, 55564, 55571, 55576, 55586, 55596, 55601,
- 55606, 55611, 55616, 55621, 55626, 55631, 55636, 55641, 55646, 55651,
- 55656, 55661, 55666, 55671, 55676, 55681, 55686, 55691, 55696, 55701,
- 55706, 55711, 55716, 55721, 55726, 55731, 55736, 55741, 55746, 55750,
- 55754, 55759, 55764, 55769, 55774, 55779, 55784, 55789, 55794, 55799,
- 55804, 55809, 55814, 55819, 55824, 55829, 55834, 55839, 55844, 55851,
- 55858, 55865, 55872, 55879, 55886, 55893, 55900, 55907, 55914, 55921,
- 55928, 55935, 55942, 55947, 55952, 55959, 55966, 55973, 55980, 55987,
- 55994, 56001, 56008, 56015, 56022, 56029, 56036, 56042, 56048, 56054,
- 56060, 56067, 56074, 56081, 56088, 56095, 56102, 56109, 56116, 56123,
- 56130, 56138, 56146, 56154, 56162, 56170, 56178, 56186, 56194, 56198,
- 56204, 56210, 56214, 56220, 56226, 56232, 56239, 56246, 56253, 56260,
- 56265, 56271, 56277, 56284, 0, 0, 0, 0, 0, 56291, 56299, 56308, 56317,
- 56325, 56331, 56336, 56341, 56346, 56351, 56356, 56361, 56366, 56371,
- 56376, 56381, 56386, 56391, 56396, 56401, 56406, 56411, 56416, 56421,
- 56426, 56431, 56436, 56441, 56446, 56451, 56456, 56461, 56466, 56471,
- 56476, 56481, 56486, 56491, 56496, 56501, 56506, 56511, 56516, 56521,
- 56526, 0, 56531, 0, 0, 0, 0, 0, 56536, 0, 0, 56541, 56545, 56550, 56555,
- 56560, 56565, 56574, 56579, 56584, 56589, 56594, 56599, 56604, 56609,
- 56614, 56621, 56626, 56631, 56640, 56647, 56652, 56657, 56662, 56669,
- 56674, 56681, 56686, 56691, 56698, 56705, 56710, 56715, 56720, 56727,
- 56734, 56739, 56744, 56749, 56754, 56759, 56766, 56773, 56778, 56783,
- 56788, 56793, 56798, 56803, 56808, 56813, 56818, 56823, 56828, 56835,
- 56840, 56845, 0, 0, 0, 0, 0, 0, 0, 56850, 56857, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 56862, 56867, 56871, 56875, 56879, 56883, 56887, 56891,
- 56895, 56899, 56903, 56907, 56913, 56917, 56921, 56925, 56929, 56933,
- 56937, 56941, 56945, 56949, 56953, 56957, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56961, 56965, 56969, 56973, 56977, 56981, 56985, 0, 56989, 56993, 56997,
- 57001, 57005, 57009, 57013, 0, 57017, 57021, 57025, 57029, 57033, 57037,
- 57041, 0, 57045, 57049, 57053, 57057, 57061, 57065, 57069, 0, 57073,
- 57077, 57081, 57085, 57089, 57093, 57097, 0, 57101, 57105, 57109, 57113,
- 57117, 57121, 57125, 0, 57129, 57133, 57137, 57141, 57145, 57149, 57153,
- 0, 57157, 57161, 57165, 57169, 57173, 57177, 57181, 0, 57185, 57190,
- 57195, 57200, 57205, 57210, 57215, 57219, 57224, 57229, 57234, 57238,
- 57243, 57248, 57253, 57258, 57262, 57267, 57272, 57277, 57282, 57287,
- 57292, 57296, 57301, 57306, 57313, 57318, 57323, 57329, 57336, 57343,
- 57352, 57359, 57368, 57372, 57376, 57382, 57388, 57394, 57402, 57408,
- 57412, 57416, 57420, 57426, 57432, 57436, 57438, 57442, 57448, 57450,
- 57454, 57458, 57462, 57468, 57473, 57477, 57481, 57486, 57492, 57497,
- 57502, 57507, 57512, 57519, 57526, 57531, 57536, 57541, 57546, 57551,
- 57556, 57560, 57564, 57571, 57578, 57584, 57588, 57593, 57595, 57599,
- 57607, 57611, 57615, 57619, 57623, 57629, 57635, 57639, 57645, 57649, 0,
+ 0, 0, 0, 0, 0, 54852, 54857, 54862, 54867, 54872, 54877, 54882, 54887,
+ 54892, 54897, 54902, 54908, 54912, 54917, 54922, 54927, 54932, 54937,
+ 54942, 54947, 54952, 54957, 54962, 54967, 54972, 54977, 54982, 54987,
+ 54992, 54997, 55002, 55007, 55012, 55017, 55022, 55028, 55033, 55039,
+ 55048, 55053, 55061, 55068, 55077, 55082, 55087, 55092, 55098, 0, 55105,
+ 55110, 55115, 55120, 55125, 55130, 55135, 55140, 55145, 55150, 55155,
+ 55161, 55165, 55170, 55175, 55180, 55185, 55190, 55195, 55200, 55205,
+ 55210, 55215, 55220, 55225, 55230, 55235, 55240, 55245, 55250, 55255,
+ 55260, 55265, 55270, 55275, 55281, 55286, 55292, 55301, 55306, 55314,
+ 55321, 55330, 55335, 55340, 55345, 55351, 0, 55358, 55366, 55374, 55383,
+ 55390, 55398, 55404, 55413, 55421, 55429, 55437, 55445, 55453, 55461,
+ 55466, 55473, 55479, 55486, 55494, 55501, 55508, 55516, 55522, 55528,
+ 55535, 55542, 55552, 55562, 55569, 55576, 55581, 55591, 55601, 55606,
+ 55611, 55616, 55621, 55626, 55631, 55636, 55641, 55646, 55651, 55656,
+ 55661, 55666, 55671, 55676, 55681, 55686, 55691, 55696, 55701, 55706,
+ 55711, 55716, 55721, 55726, 55731, 55736, 55741, 55746, 55751, 55755,
+ 55759, 55764, 55769, 55774, 55779, 55784, 55789, 55794, 55799, 55804,
+ 55809, 55814, 55819, 55824, 55829, 55834, 55839, 55844, 55849, 55856,
+ 55863, 55870, 55877, 55884, 55891, 55898, 55905, 55912, 55919, 55926,
+ 55933, 55940, 55947, 55952, 55957, 55964, 55971, 55978, 55985, 55992,
+ 55999, 56006, 56013, 56020, 56027, 56034, 56041, 56047, 56053, 56059,
+ 56065, 56072, 56079, 56086, 56093, 56100, 56107, 56114, 56121, 56128,
+ 56135, 56143, 56151, 56159, 56167, 56175, 56183, 56191, 56199, 56203,
+ 56209, 56215, 56219, 56225, 56231, 56237, 56244, 56251, 56258, 56265,
+ 56270, 56276, 56282, 56289, 0, 0, 0, 0, 0, 56296, 56304, 56313, 56322,
+ 56330, 56336, 56341, 56346, 56351, 56356, 56361, 56366, 56371, 56376,
+ 56381, 56386, 56391, 56396, 56401, 56406, 56411, 56416, 56421, 56426,
+ 56431, 56436, 56441, 56446, 56451, 56456, 56461, 56466, 56471, 56476,
+ 56481, 56486, 56491, 56496, 56501, 56506, 56511, 56516, 56521, 56526,
+ 56531, 0, 56536, 0, 0, 0, 0, 0, 56541, 0, 0, 56546, 56550, 56555, 56560,
+ 56565, 56570, 56579, 56584, 56589, 56594, 56599, 56604, 56609, 56614,
+ 56619, 56626, 56631, 56636, 56645, 56652, 56657, 56662, 56667, 56674,
+ 56679, 56686, 56691, 56696, 56703, 56710, 56715, 56720, 56725, 56732,
+ 56739, 56744, 56749, 56754, 56759, 56764, 56771, 56778, 56783, 56788,
+ 56793, 56798, 56803, 56808, 56813, 56818, 56823, 56828, 56833, 56840,
+ 56845, 56850, 0, 0, 0, 0, 0, 0, 0, 56855, 56862, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 56867, 56872, 56876, 56880, 56884, 56888, 56892, 56896,
+ 56900, 56904, 56908, 56912, 56918, 56922, 56926, 56930, 56934, 56938,
+ 56942, 56946, 56950, 56954, 56958, 56962, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56966, 56970, 56974, 56978, 56982, 56986, 56990, 0, 56994, 56998, 57002,
+ 57006, 57010, 57014, 57018, 0, 57022, 57026, 57030, 57034, 57038, 57042,
+ 57046, 0, 57050, 57054, 57058, 57062, 57066, 57070, 57074, 0, 57078,
+ 57082, 57086, 57090, 57094, 57098, 57102, 0, 57106, 57110, 57114, 57118,
+ 57122, 57126, 57130, 0, 57134, 57138, 57142, 57146, 57150, 57154, 57158,
+ 0, 57162, 57166, 57170, 57174, 57178, 57182, 57186, 0, 57190, 57195,
+ 57200, 57205, 57210, 57215, 57220, 57224, 57229, 57234, 57239, 57243,
+ 57248, 57253, 57258, 57263, 57267, 57272, 57277, 57282, 57287, 57292,
+ 57297, 57301, 57306, 57311, 57318, 57323, 57328, 57334, 57341, 57348,
+ 57357, 57364, 57373, 57377, 57381, 57387, 57393, 57399, 57407, 57413,
+ 57417, 57421, 57425, 57431, 57437, 57441, 57443, 57447, 57453, 57455,
+ 57459, 57463, 57467, 57473, 57478, 57482, 57486, 57491, 57497, 57502,
+ 57507, 57512, 57517, 57524, 57531, 57536, 57541, 57546, 57551, 57556,
+ 57561, 57565, 57569, 57576, 57583, 57589, 57593, 57598, 57600, 57604,
+ 57612, 57616, 57620, 57624, 57628, 57634, 57640, 57644, 57650, 57654, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57653, 57657,
- 57661, 57666, 57671, 57676, 57680, 57684, 57688, 57693, 57698, 57702,
- 57706, 57710, 57714, 57719, 57724, 57729, 57734, 57738, 57742, 57747,
- 57752, 57757, 57762, 57766, 0, 57770, 57774, 57778, 57782, 57786, 57790,
- 57794, 57799, 57804, 57808, 57813, 57818, 57827, 57831, 57835, 57839,
- 57846, 57850, 57855, 57860, 57864, 57868, 57874, 57879, 57884, 57889,
- 57894, 57898, 57902, 57906, 57910, 57914, 57919, 57924, 57928, 57932,
- 57937, 57942, 57947, 57951, 57955, 57960, 57965, 57971, 57977, 57981,
- 57987, 57993, 57997, 58003, 58009, 58014, 58019, 58023, 58029, 58033,
- 58037, 58043, 58049, 58054, 58059, 58063, 58067, 58075, 58081, 58087,
- 58093, 58098, 58103, 58108, 58114, 58118, 58124, 58128, 58132, 58138,
- 58144, 58150, 58156, 58162, 58168, 58174, 58180, 58186, 58192, 58198,
- 58204, 58208, 58214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58220, 58223,
- 58227, 58231, 58235, 58239, 58242, 58245, 58249, 58253, 58257, 58261,
- 58264, 58269, 58273, 58277, 58281, 58286, 58290, 58294, 58298, 58302,
- 58308, 58314, 58318, 58322, 58326, 58330, 58334, 58338, 58342, 58346,
- 58350, 58354, 58358, 58364, 58368, 58372, 58376, 58380, 58384, 58388,
- 58392, 58396, 58400, 58404, 58408, 58412, 58416, 58420, 58424, 58428,
- 58434, 58440, 58445, 58450, 58454, 58458, 58462, 58466, 58470, 58474,
- 58478, 58482, 58486, 58490, 58494, 58498, 58502, 58506, 58510, 58514,
- 58518, 58522, 58526, 58530, 58534, 58538, 58542, 58546, 58552, 58556,
- 58560, 58564, 58568, 58572, 58576, 58580, 58584, 58589, 58596, 58600,
- 58604, 58608, 58612, 58616, 58620, 58624, 58628, 58632, 58636, 58640,
- 58644, 58651, 58655, 58661, 58665, 58669, 58673, 58677, 58681, 58684,
- 58688, 58692, 58696, 58700, 58704, 58708, 58712, 58716, 58720, 58724,
- 58728, 58732, 58736, 58740, 58744, 58748, 58752, 58756, 58760, 58764,
- 58768, 58772, 58776, 58780, 58784, 58788, 58792, 58796, 58800, 58804,
- 58808, 58812, 58818, 58822, 58826, 58830, 58834, 58838, 58842, 58846,
- 58850, 58854, 58858, 58862, 58866, 58870, 58874, 58878, 58882, 58886,
- 58890, 58894, 58898, 58902, 58906, 58910, 58914, 58918, 58922, 58926,
- 58934, 58938, 58942, 58946, 58950, 58954, 58960, 58964, 58968, 58972,
- 58976, 58980, 58984, 58988, 58992, 58996, 59000, 59004, 59008, 59012,
- 59018, 59022, 59026, 59030, 59034, 59038, 59042, 59046, 59050, 59054,
- 59058, 59062, 59066, 59070, 59074, 59078, 59082, 59086, 59090, 59094,
- 59098, 59102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 59106, 59115, 59123, 59135, 59146, 59154, 59163, 59172,
- 59182, 59194, 59206, 59218, 0, 0, 0, 0, 59224, 59227, 59230, 59235,
- 59238, 59245, 59249, 59253, 59257, 59261, 59265, 59270, 59275, 59279,
- 59283, 59288, 59293, 59298, 59303, 59306, 59309, 59315, 59321, 59326,
- 59331, 59338, 59345, 59349, 59353, 59357, 59365, 59371, 59378, 59383,
- 59388, 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433,
- 59438, 59443, 59448, 59454, 59459, 59463, 59469, 59480, 59490, 59505,
- 59515, 59519, 59529, 59535, 59541, 59547, 59552, 59555, 59560, 59564, 0,
- 59570, 59574, 59577, 59581, 59584, 59588, 59591, 59595, 59598, 59602,
- 59605, 59608, 59612, 59616, 59620, 59624, 59628, 59632, 59636, 59640,
- 59644, 59647, 59651, 59655, 59659, 59663, 59667, 59671, 59675, 59679,
- 59683, 59687, 59691, 59695, 59699, 59704, 59708, 59712, 59716, 59720,
- 59723, 59727, 59730, 59734, 59738, 59742, 59746, 59749, 59753, 59756,
- 59760, 59764, 59768, 59772, 59776, 59780, 59784, 59788, 59792, 59796,
- 59800, 59804, 59807, 59811, 59815, 59819, 59823, 59827, 59830, 59835,
- 59839, 59844, 59848, 59851, 59855, 59859, 59863, 59867, 59872, 59876,
- 59880, 59884, 59888, 59892, 59896, 59900, 0, 0, 59905, 59913, 59921,
- 59928, 59935, 59939, 59945, 59950, 59955, 59959, 59962, 59966, 59969,
- 59973, 59976, 59980, 59983, 59987, 59990, 59993, 59997, 60001, 60005,
- 60009, 60013, 60017, 60021, 60025, 60029, 60032, 60036, 60040, 60044,
- 60048, 60052, 60056, 60060, 60064, 60068, 60072, 60076, 60080, 60084,
- 60089, 60093, 60097, 60101, 60105, 60108, 60112, 60115, 60119, 60123,
- 60127, 60131, 60134, 60138, 60141, 60145, 60149, 60153, 60157, 60161,
- 60165, 60169, 60173, 60177, 60181, 60185, 60189, 60192, 60196, 60200,
- 60204, 60208, 60212, 60215, 60220, 60224, 60229, 60233, 60236, 60240,
- 60244, 60248, 60252, 60257, 60261, 60265, 60269, 60273, 60277, 60281,
- 60285, 60290, 60294, 60298, 60302, 60306, 60311, 60318, 60322, 60328, 0,
- 0, 0, 0, 0, 60333, 60338, 60343, 60347, 60352, 60357, 60362, 60367,
- 60371, 60376, 60381, 60386, 60391, 60396, 60401, 60406, 60411, 60416,
- 60420, 60425, 60430, 60435, 60439, 60443, 60447, 60452, 60457, 60462,
- 60467, 60472, 60477, 60482, 60487, 60492, 60497, 60501, 60505, 60510,
- 60515, 60520, 60525, 0, 0, 0, 60530, 60534, 60538, 60542, 60546, 60550,
- 60554, 60558, 60562, 60566, 60570, 60574, 60578, 60582, 60586, 60590,
- 60594, 60598, 60602, 60606, 60610, 60614, 60618, 60622, 60626, 60630,
- 60634, 60638, 60642, 60646, 60650, 60653, 60657, 60660, 60664, 60668,
- 60671, 60675, 60679, 60682, 60686, 60690, 60694, 60698, 60701, 60705,
- 60709, 60713, 60717, 60721, 60725, 60728, 60731, 60735, 60739, 60743,
- 60747, 60751, 60755, 60759, 60763, 60767, 60771, 60775, 60779, 60783,
- 60787, 60791, 60795, 60799, 60803, 60807, 60811, 60815, 60819, 60823,
- 60827, 60831, 60835, 60839, 60843, 60847, 60851, 60855, 60859, 60863,
- 60867, 60871, 60875, 60879, 60883, 60887, 60891, 60895, 0, 60899, 60905,
- 60911, 60916, 60921, 60926, 60932, 60938, 60944, 60950, 60956, 60962,
- 60968, 60974, 60980, 60986, 60992, 60997, 61002, 61007, 61012, 61017,
- 61022, 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61062, 61067,
- 61072, 61077, 61082, 61087, 61092, 61098, 61104, 61110, 61116, 61121,
- 61126, 0, 0, 0, 0, 0, 61131, 61136, 61141, 61146, 61151, 61156, 61161,
- 61166, 61171, 61176, 61181, 61186, 61191, 61196, 61201, 61206, 61211,
- 61216, 61221, 61226, 61231, 61236, 61241, 61246, 61251, 61256, 61261,
- 61266, 61271, 61276, 61281, 61286, 61291, 61296, 61301, 61306, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 61311, 61316, 61321, 61326, 61330, 61335,
- 61339, 61344, 61349, 61354, 61359, 61364, 61368, 61373, 61378, 61383,
- 61388, 61392, 61396, 61400, 61404, 61408, 61412, 61416, 61420, 61424,
- 61428, 61432, 61436, 61440, 61444, 61449, 61454, 61459, 61464, 61469,
- 61474, 61479, 61484, 61489, 61494, 61499, 61504, 61509, 61514, 61519,
- 61525, 0, 61532, 61535, 61538, 61541, 61544, 61547, 61550, 61553, 61556,
- 61559, 61563, 61567, 61571, 61575, 61579, 61583, 61587, 61591, 61595,
- 61599, 61603, 61607, 61611, 61615, 61619, 61623, 61627, 61631, 61635,
- 61639, 61643, 61647, 61651, 61655, 61659, 61663, 61667, 61671, 61675,
- 61679, 61683, 61692, 61701, 61710, 61719, 61728, 61737, 61746, 61755,
- 61758, 61763, 61768, 61773, 61778, 61783, 61788, 61793, 61798, 61803,
- 61807, 61812, 61817, 61822, 61827, 61832, 61836, 61840, 61844, 61848,
- 61852, 61856, 61860, 61864, 61868, 61872, 61876, 61880, 61884, 61888,
- 61893, 61898, 61903, 61908, 61913, 61918, 61923, 61928, 61933, 61938,
- 61943, 61948, 61953, 61958, 61964, 61970, 61975, 61980, 61983, 61986,
- 61989, 61992, 61995, 61998, 62001, 62004, 62007, 62011, 62015, 62019,
- 62023, 62027, 62031, 62035, 62039, 62043, 62047, 62051, 62055, 62059,
- 62063, 62067, 62071, 62075, 62079, 62083, 62087, 62091, 62095, 62099,
- 62103, 62107, 62111, 62115, 62119, 62123, 62127, 62131, 62135, 62139,
- 62143, 62147, 62151, 62155, 62159, 62163, 62167, 62172, 62177, 62182,
- 62187, 62191, 62196, 62201, 62206, 62211, 62216, 62221, 62226, 62231,
- 62236, 62240, 62247, 62254, 62261, 62268, 62275, 62282, 62289, 62296,
- 62303, 62310, 62317, 62324, 62327, 62330, 62333, 62338, 62341, 62344,
- 62347, 62350, 62353, 62356, 62360, 62364, 62368, 62372, 62375, 62379,
- 62383, 62387, 62391, 62395, 62399, 62403, 62407, 62410, 62413, 62417,
- 62421, 62425, 62429, 62432, 62436, 62440, 62444, 62448, 62451, 62455,
- 62459, 62463, 62467, 62470, 62474, 62478, 62481, 62485, 62489, 62493,
- 62497, 62501, 62505, 62509, 0, 62513, 62516, 62519, 62522, 62525, 62528,
- 62531, 62534, 62537, 62540, 62543, 62546, 62549, 62552, 62555, 62558,
- 62561, 62564, 62567, 62570, 62573, 62576, 62579, 62582, 62585, 62588,
- 62591, 62594, 62597, 62600, 62603, 62606, 62609, 62612, 62615, 62618,
- 62621, 62624, 62627, 62630, 62633, 62636, 62639, 62642, 62645, 62648,
- 62651, 62654, 62657, 62660, 62663, 62666, 62669, 62672, 62675, 62678,
- 62681, 62684, 62687, 62690, 62693, 62696, 62699, 62702, 62705, 62708,
- 62711, 62714, 62717, 62720, 62723, 62726, 62729, 62732, 62735, 62738,
- 62741, 62744, 62747, 62750, 62753, 62756, 62759, 62762, 62765, 62768,
- 62771, 62774, 62777, 62786, 62794, 62802, 62810, 62818, 62826, 62834,
- 62842, 62850, 62858, 62867, 62876, 62885, 62894, 62903, 62912, 62921,
- 62930, 62939, 62948, 62957, 62966, 62975, 62984, 62993, 62996, 62999,
- 63002, 63004, 63007, 63010, 63013, 63018, 63023, 63026, 63033, 63040,
- 63047, 63054, 63057, 63062, 63064, 63068, 63070, 63072, 63075, 63078,
- 63081, 63084, 63087, 63090, 63093, 63098, 63103, 63106, 63109, 63112,
- 63115, 63118, 63121, 63124, 63128, 63131, 63134, 63137, 63140, 63143,
- 63147, 63150, 63153, 63156, 63161, 63166, 63171, 63176, 63181, 63186,
- 63191, 63196, 63202, 63210, 63212, 63215, 63218, 63221, 63224, 63230,
- 63238, 63241, 63244, 63249, 63252, 63255, 63258, 63263, 63266, 63269,
- 63274, 63277, 63280, 63285, 63288, 63291, 63296, 63301, 63306, 63309,
- 63312, 63315, 63318, 63324, 63327, 63330, 63333, 63335, 63338, 63341,
- 63344, 63349, 63352, 63355, 63358, 63361, 63364, 63369, 63372, 63375,
- 63378, 63381, 63384, 63387, 63390, 63393, 63396, 63401, 63405, 63413,
- 63421, 63429, 63437, 63445, 63453, 63461, 63469, 63477, 63486, 63495,
- 63504, 63513, 63522, 63531, 63540, 63549, 63558, 63567, 63576, 63585,
- 63594, 63603, 63612, 63621, 63630, 63639, 63648, 63657, 63666, 63675, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57658, 57662,
+ 57666, 57671, 57676, 57681, 57685, 57689, 57693, 57698, 57703, 57707,
+ 57711, 57715, 57719, 57724, 57729, 57734, 57739, 57743, 57747, 57752,
+ 57757, 57762, 57767, 57771, 0, 57775, 57779, 57783, 57787, 57791, 57795,
+ 57799, 57804, 57809, 57813, 57818, 57823, 57832, 57836, 57840, 57844,
+ 57851, 57855, 57860, 57865, 57869, 57873, 57879, 57884, 57889, 57894,
+ 57899, 57903, 57907, 57911, 57915, 57919, 57924, 57929, 57933, 57937,
+ 57942, 57947, 57952, 57956, 57960, 57965, 57970, 57976, 57982, 57986,
+ 57992, 57998, 58002, 58008, 58014, 58019, 58024, 58028, 58034, 58038,
+ 58042, 58048, 58054, 58059, 58064, 58068, 58072, 58080, 58086, 58092,
+ 58098, 58103, 58108, 58113, 58119, 58123, 58129, 58133, 58137, 58143,
+ 58149, 58155, 58161, 58167, 58173, 58179, 58185, 58191, 58197, 58203,
+ 58209, 58213, 58219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58225, 58228,
+ 58232, 58236, 58240, 58244, 58247, 58250, 58254, 58258, 58262, 58266,
+ 58269, 58274, 58278, 58282, 58286, 58291, 58295, 58299, 58303, 58307,
+ 58313, 58319, 58323, 58327, 58331, 58335, 58339, 58343, 58347, 58351,
+ 58355, 58359, 58363, 58369, 58373, 58377, 58381, 58385, 58389, 58393,
+ 58397, 58401, 58405, 58409, 58413, 58417, 58421, 58425, 58429, 58433,
+ 58439, 58445, 58450, 58455, 58459, 58463, 58467, 58471, 58475, 58479,
+ 58483, 58487, 58491, 58495, 58499, 58503, 58507, 58511, 58515, 58519,
+ 58523, 58527, 58531, 58535, 58539, 58543, 58547, 58551, 58557, 58561,
+ 58565, 58569, 58573, 58577, 58581, 58585, 58589, 58594, 58601, 58605,
+ 58609, 58613, 58617, 58621, 58625, 58629, 58633, 58637, 58641, 58645,
+ 58649, 58656, 58660, 58666, 58670, 58674, 58678, 58682, 58686, 58689,
+ 58693, 58697, 58701, 58705, 58709, 58713, 58717, 58721, 58725, 58729,
+ 58733, 58737, 58741, 58745, 58749, 58753, 58757, 58761, 58765, 58769,
+ 58773, 58777, 58781, 58785, 58789, 58793, 58797, 58801, 58805, 58809,
+ 58813, 58817, 58823, 58827, 58831, 58835, 58839, 58843, 58847, 58851,
+ 58855, 58859, 58863, 58867, 58871, 58875, 58879, 58883, 58887, 58891,
+ 58895, 58899, 58903, 58907, 58911, 58915, 58919, 58923, 58927, 58931,
+ 58939, 58943, 58947, 58951, 58955, 58959, 58965, 58969, 58973, 58977,
+ 58981, 58985, 58989, 58993, 58997, 59001, 59005, 59009, 59013, 59017,
+ 59023, 59027, 59031, 59035, 59039, 59043, 59047, 59051, 59055, 59059,
+ 59063, 59067, 59071, 59075, 59079, 59083, 59087, 59091, 59095, 59099,
+ 59103, 59107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 59111, 59120, 59128, 59140, 59151, 59159, 59168, 59177,
+ 59187, 59199, 59211, 59223, 0, 0, 0, 0, 59229, 59232, 59235, 59240,
+ 59243, 59250, 59254, 59258, 59262, 59266, 59270, 59275, 59280, 59284,
+ 59288, 59293, 59298, 59303, 59308, 59311, 59314, 59320, 59326, 59331,
+ 59336, 59343, 59350, 59354, 59358, 59362, 59370, 59376, 59383, 59388,
+ 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433, 59438,
+ 59443, 59448, 59453, 59459, 59464, 59468, 59474, 59485, 59495, 59510,
+ 59520, 59524, 59534, 59540, 59546, 59552, 59557, 59560, 59565, 59569, 0,
+ 59575, 59579, 59582, 59586, 59589, 59593, 59596, 59600, 59603, 59607,
+ 59610, 59613, 59617, 59621, 59625, 59629, 59633, 59637, 59641, 59645,
+ 59649, 59652, 59656, 59660, 59664, 59668, 59672, 59676, 59680, 59684,
+ 59688, 59692, 59696, 59700, 59704, 59709, 59713, 59717, 59721, 59725,
+ 59728, 59732, 59735, 59739, 59743, 59747, 59751, 59754, 59758, 59761,
+ 59765, 59769, 59773, 59777, 59781, 59785, 59789, 59793, 59797, 59801,
+ 59805, 59809, 59812, 59816, 59820, 59824, 59828, 59832, 59835, 59840,
+ 59844, 59849, 59853, 59856, 59860, 59864, 59868, 59872, 59877, 59881,
+ 59885, 59889, 59893, 59897, 59901, 59905, 0, 0, 59910, 59918, 59926,
+ 59933, 59940, 59944, 59950, 59955, 59960, 59964, 59967, 59971, 59974,
+ 59978, 59981, 59985, 59988, 59992, 59995, 59998, 60002, 60006, 60010,
+ 60014, 60018, 60022, 60026, 60030, 60034, 60037, 60041, 60045, 60049,
+ 60053, 60057, 60061, 60065, 60069, 60073, 60077, 60081, 60085, 60089,
+ 60094, 60098, 60102, 60106, 60110, 60113, 60117, 60120, 60124, 60128,
+ 60132, 60136, 60139, 60143, 60146, 60150, 60154, 60158, 60162, 60166,
+ 60170, 60174, 60178, 60182, 60186, 60190, 60194, 60197, 60201, 60205,
+ 60209, 60213, 60217, 60220, 60225, 60229, 60234, 60238, 60241, 60245,
+ 60249, 60253, 60257, 60262, 60266, 60270, 60274, 60278, 60282, 60286,
+ 60290, 60295, 60299, 60303, 60307, 60311, 60316, 60323, 60327, 60333, 0,
+ 0, 0, 0, 0, 60338, 60343, 60348, 60352, 60357, 60362, 60367, 60372,
+ 60376, 60381, 60386, 60391, 60396, 60401, 60406, 60411, 60416, 60421,
+ 60425, 60430, 60435, 60440, 60444, 60448, 60452, 60457, 60462, 60467,
+ 60472, 60477, 60482, 60487, 60492, 60497, 60502, 60506, 60510, 60515,
+ 60520, 60525, 60530, 0, 0, 0, 60535, 60539, 60543, 60547, 60551, 60555,
+ 60559, 60563, 60567, 60571, 60575, 60579, 60583, 60587, 60591, 60595,
+ 60599, 60603, 60607, 60611, 60615, 60619, 60623, 60627, 60631, 60635,
+ 60639, 60643, 60647, 60651, 60655, 60658, 60662, 60665, 60669, 60673,
+ 60676, 60680, 60684, 60687, 60691, 60695, 60699, 60703, 60706, 60710,
+ 60714, 60718, 60722, 60726, 60730, 60733, 60736, 60740, 60744, 60748,
+ 60752, 60756, 60760, 60764, 60768, 60772, 60776, 60780, 60784, 60788,
+ 60792, 60796, 60800, 60804, 60808, 60812, 60816, 60820, 60824, 60828,
+ 60832, 60836, 60840, 60844, 60848, 60852, 60856, 60860, 60864, 60868,
+ 60872, 60876, 60880, 60884, 60888, 60892, 60896, 60900, 0, 60904, 60910,
+ 60916, 60921, 60926, 60931, 60937, 60943, 60949, 60955, 60961, 60967,
+ 60973, 60979, 60985, 60991, 60997, 61002, 61007, 61012, 61017, 61022,
+ 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61062, 61067, 61072,
+ 61077, 61082, 61087, 61092, 61097, 61103, 61109, 61115, 61121, 61126,
+ 61131, 0, 0, 0, 0, 0, 61136, 61141, 61146, 61151, 61156, 61161, 61166,
+ 61171, 61176, 61181, 61186, 61191, 61196, 61201, 61206, 61211, 61216,
+ 61221, 61226, 61231, 61236, 61241, 61246, 61251, 61256, 61261, 61266,
+ 61271, 61276, 61281, 61286, 61291, 61296, 61301, 61306, 61311, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 61316, 61321, 61326, 61331, 61335, 61340,
+ 61344, 61349, 61354, 61359, 61364, 61369, 61373, 61378, 61383, 61388,
+ 61393, 61397, 61401, 61405, 61409, 61413, 61417, 61421, 61425, 61429,
+ 61433, 61437, 61441, 61445, 61449, 61454, 61459, 61464, 61469, 61474,
+ 61479, 61484, 61489, 61494, 61499, 61504, 61509, 61514, 61519, 61524,
+ 61530, 0, 61537, 61540, 61543, 61546, 61549, 61552, 61555, 61558, 61561,
+ 61564, 61568, 61572, 61576, 61580, 61584, 61588, 61592, 61596, 61600,
+ 61604, 61608, 61612, 61616, 61620, 61624, 61628, 61632, 61636, 61640,
+ 61644, 61648, 61652, 61656, 61660, 61664, 61668, 61672, 61676, 61680,
+ 61684, 61688, 61697, 61706, 61715, 61724, 61733, 61742, 61751, 61760,
+ 61763, 61768, 61773, 61778, 61783, 61788, 61793, 61798, 61803, 61808,
+ 61812, 61817, 61822, 61827, 61832, 61837, 61841, 61845, 61849, 61853,
+ 61857, 61861, 61865, 61869, 61873, 61877, 61881, 61885, 61889, 61893,
+ 61898, 61903, 61908, 61913, 61918, 61923, 61928, 61933, 61938, 61943,
+ 61948, 61953, 61958, 61963, 61969, 61975, 61980, 61985, 61988, 61991,
+ 61994, 61997, 62000, 62003, 62006, 62009, 62012, 62016, 62020, 62024,
+ 62028, 62032, 62036, 62040, 62044, 62048, 62052, 62056, 62060, 62064,
+ 62068, 62072, 62076, 62080, 62084, 62088, 62092, 62096, 62100, 62104,
+ 62108, 62112, 62116, 62120, 62124, 62128, 62132, 62136, 62140, 62144,
+ 62148, 62152, 62156, 62160, 62164, 62168, 62172, 62177, 62182, 62187,
+ 62192, 62196, 62201, 62206, 62211, 62216, 62221, 62226, 62231, 62236,
+ 62241, 62245, 62252, 62259, 62266, 62273, 62280, 62287, 62294, 62301,
+ 62308, 62315, 62322, 62329, 62332, 62335, 62338, 62343, 62346, 62349,
+ 62352, 62355, 62358, 62361, 62365, 62369, 62373, 62377, 62380, 62384,
+ 62388, 62392, 62396, 62400, 62404, 62408, 62412, 62415, 62418, 62422,
+ 62426, 62430, 62434, 62437, 62441, 62445, 62449, 62453, 62456, 62460,
+ 62464, 62468, 62472, 62475, 62479, 62483, 62486, 62490, 62494, 62498,
+ 62502, 62506, 62510, 62514, 0, 62518, 62521, 62524, 62527, 62530, 62533,
+ 62536, 62539, 62542, 62545, 62548, 62551, 62554, 62557, 62560, 62563,
+ 62566, 62569, 62572, 62575, 62578, 62581, 62584, 62587, 62590, 62593,
+ 62596, 62599, 62602, 62605, 62608, 62611, 62614, 62617, 62620, 62623,
+ 62626, 62629, 62632, 62635, 62638, 62641, 62644, 62647, 62650, 62653,
+ 62656, 62659, 62662, 62665, 62668, 62671, 62674, 62677, 62680, 62683,
+ 62686, 62689, 62692, 62695, 62698, 62701, 62704, 62707, 62710, 62713,
+ 62716, 62719, 62722, 62725, 62728, 62731, 62734, 62737, 62740, 62743,
+ 62746, 62749, 62752, 62755, 62758, 62761, 62764, 62767, 62770, 62773,
+ 62776, 62779, 62782, 62791, 62799, 62807, 62815, 62823, 62831, 62839,
+ 62847, 62855, 62863, 62872, 62881, 62890, 62899, 62908, 62917, 62926,
+ 62935, 62944, 62953, 62962, 62971, 62980, 62989, 62998, 63001, 63004,
+ 63007, 63009, 63012, 63015, 63018, 63023, 63028, 63031, 63038, 63045,
+ 63052, 63059, 63062, 63067, 63069, 63073, 63075, 63077, 63080, 63083,
+ 63086, 63089, 63092, 63095, 63098, 63103, 63108, 63111, 63114, 63117,
+ 63120, 63123, 63126, 63129, 63133, 63136, 63139, 63142, 63145, 63148,
+ 63152, 63155, 63158, 63161, 63166, 63171, 63176, 63181, 63186, 63191,
+ 63196, 63201, 63207, 63215, 63217, 63220, 63223, 63226, 63229, 63235,
+ 63243, 63246, 63249, 63254, 63257, 63260, 63263, 63268, 63271, 63274,
+ 63279, 63282, 63285, 63290, 63293, 63296, 63301, 63306, 63311, 63314,
+ 63317, 63320, 63323, 63329, 63332, 63335, 63338, 63340, 63343, 63346,
+ 63349, 63354, 63357, 63360, 63363, 63366, 63369, 63374, 63377, 63380,
+ 63383, 63386, 63389, 63392, 63395, 63398, 63401, 63406, 63410, 63418,
+ 63426, 63434, 63442, 63450, 63458, 63466, 63474, 63482, 63491, 63500,
+ 63509, 63518, 63527, 63536, 63545, 63554, 63563, 63572, 63581, 63590,
+ 63599, 63608, 63617, 63626, 63635, 63644, 63653, 63662, 63671, 63680, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63678, 63687, 63696, 63707,
- 63714, 63719, 63724, 63731, 63738, 63744, 63749, 63754, 63759, 63764,
- 63771, 63776, 63781, 63786, 63797, 63802, 63807, 63814, 63819, 63826,
- 63831, 63836, 63843, 63850, 63857, 63866, 63875, 63880, 63885, 63890,
- 63897, 63902, 63912, 63919, 63924, 63929, 63934, 63939, 63944, 63949,
- 63958, 63965, 63972, 63977, 63984, 63989, 63996, 64005, 64016, 64021,
- 64030, 64035, 64042, 64051, 64060, 64065, 64070, 64077, 64083, 64090,
- 64097, 64101, 64105, 64108, 64112, 64116, 64120, 64124, 64128, 64132,
- 64136, 64139, 64143, 64147, 64151, 64155, 64159, 64163, 64166, 64170,
- 64174, 64177, 64181, 64185, 64189, 64193, 64197, 64201, 64205, 64209,
- 64213, 64217, 64221, 64225, 64229, 64233, 64237, 64241, 64245, 64249,
- 64253, 64257, 64261, 64265, 64269, 64273, 64277, 64281, 64285, 64289,
- 64293, 64297, 64301, 64305, 64309, 64313, 64317, 64321, 64325, 64329,
- 64333, 64337, 64341, 64345, 64349, 64353, 64356, 64360, 64364, 64368,
- 64372, 64376, 64380, 64384, 64388, 64392, 64396, 64400, 64404, 64408,
- 64412, 64416, 64420, 64424, 64428, 64432, 64436, 64440, 64444, 64448,
- 64452, 64456, 64460, 64464, 64468, 64472, 64476, 64480, 64484, 64488,
- 64492, 64496, 64500, 64504, 64508, 64512, 64516, 64520, 64524, 64528,
- 64532, 64536, 64540, 64544, 64548, 64552, 64556, 64560, 64564, 64568,
- 64572, 64576, 64580, 64584, 64588, 64592, 64596, 64600, 64604, 64608,
- 64612, 64616, 64620, 64624, 64628, 64632, 64636, 64640, 64644, 64648,
- 64652, 64656, 64660, 64664, 64668, 64672, 64676, 64680, 64684, 64688,
- 64692, 64696, 64700, 64704, 64708, 64712, 64716, 64720, 64724, 64728,
- 64732, 64736, 64740, 64744, 64748, 64752, 64756, 64760, 64764, 64768,
- 64772, 64776, 64780, 64784, 64788, 64792, 64796, 64800, 64804, 64808,
- 64812, 64816, 64820, 64824, 64827, 64831, 64835, 64839, 64843, 64847,
- 64851, 64855, 64859, 64863, 64867, 64871, 64875, 64879, 64883, 64887,
- 64891, 64895, 64899, 64903, 64907, 64911, 64915, 64919, 64923, 64927,
- 64931, 64935, 64939, 64943, 64947, 64951, 64955, 64959, 64963, 64967,
- 64971, 64975, 64979, 64983, 64987, 64991, 64995, 64999, 65003, 65007,
- 65011, 65015, 65019, 65023, 65027, 65031, 65035, 65039, 65043, 65047,
- 65051, 65055, 65059, 65063, 65067, 65071, 65075, 65079, 65083, 65087,
- 65091, 65095, 65099, 65103, 65107, 65111, 65115, 65119, 65123, 65127,
- 65131, 65135, 65139, 65143, 65147, 65151, 65155, 65159, 65163, 65167,
- 65171, 65175, 65179, 65183, 65187, 65191, 65195, 65199, 65203, 65207,
- 65211, 65215, 65219, 65223, 65227, 65231, 65235, 65239, 65243, 65247,
- 65251, 65255, 65259, 65263, 65267, 65271, 65275, 65279, 65283, 65287,
- 65290, 65294, 65298, 65302, 65306, 65310, 65314, 65318, 65322, 65326,
- 65330, 65334, 65338, 65342, 65346, 65350, 65354, 65358, 65362, 65366,
- 65370, 65374, 65378, 65382, 65386, 65390, 65394, 65398, 65402, 65406,
- 65410, 65414, 65418, 65422, 65426, 65430, 65434, 65438, 65442, 65446,
- 65450, 65454, 65458, 65462, 65466, 65470, 65474, 65478, 65482, 65486,
- 65490, 65494, 65498, 65502, 65506, 65510, 65514, 65518, 65522, 65526,
- 65530, 65534, 65538, 65542, 65546, 65550, 65554, 65558, 65562, 65566,
- 65570, 65574, 65578, 65582, 65586, 65590, 65594, 65598, 65602, 65606,
- 65610, 65614, 65618, 65622, 65626, 65630, 65634, 65638, 65642, 65646,
- 65649, 65653, 65657, 65661, 65665, 65669, 65673, 65677, 65681, 65685,
- 65689, 65693, 65697, 65701, 65705, 65709, 65713, 65717, 65721, 65725,
- 65729, 65733, 65737, 65741, 65745, 65749, 65753, 65757, 65761, 65765,
- 65769, 65773, 65777, 65781, 65785, 65789, 65793, 65797, 65801, 65805,
- 65809, 65813, 65817, 65821, 65825, 65829, 65833, 65837, 65841, 65845,
- 65849, 65853, 65857, 65861, 65865, 65869, 65873, 65877, 65881, 65885,
- 65889, 65893, 65897, 65901, 65905, 65909, 65913, 65917, 65921, 65925,
- 65929, 65933, 65937, 65941, 65945, 65949, 65953, 65957, 65961, 65965,
- 65969, 65973, 65977, 65981, 65985, 65989, 65993, 65997, 66001, 66005,
- 66009, 66013, 66017, 66021, 66025, 66029, 66033, 66037, 66041, 66045,
- 66049, 66053, 66057, 66061, 66065, 66069, 66073, 66077, 66081, 66085,
- 66089, 66093, 66097, 66101, 66105, 66109, 66113, 66117, 66121, 66125,
- 66129, 66133, 66137, 66141, 66144, 66148, 66152, 66156, 66160, 66164,
- 66168, 66172, 66176, 66180, 66184, 66188, 66192, 66196, 66200, 66204,
- 66208, 66212, 66216, 66220, 66224, 66228, 66232, 66236, 66240, 66244,
- 66248, 66252, 66256, 66260, 66264, 66268, 66272, 66276, 66280, 66284,
- 66288, 66292, 66296, 66300, 66304, 66308, 66312, 66316, 66320, 66324,
- 66328, 66332, 66336, 66340, 66344, 66348, 66352, 66356, 66360, 66364,
- 66368, 66372, 66376, 66380, 66384, 66388, 66392, 66396, 66400, 66404,
- 66408, 66412, 66416, 66420, 66424, 66428, 66432, 66436, 66440, 66444,
- 66448, 66452, 66456, 66460, 66464, 66468, 66472, 66476, 66480, 66484,
- 66488, 66492, 66496, 66500, 66504, 66508, 66512, 66516, 66520, 66524,
- 66528, 66532, 66536, 66540, 66544, 66548, 66552, 66556, 66560, 66564,
- 66568, 66572, 66576, 66580, 66584, 66588, 66592, 66596, 66599, 66603,
- 66607, 66611, 66615, 66619, 66623, 66627, 66631, 66635, 66639, 66643,
- 66647, 66651, 66655, 66659, 66663, 66667, 66671, 66675, 66679, 66683,
- 66687, 66691, 66695, 66699, 66703, 66707, 66711, 66715, 66719, 66723,
- 66727, 66731, 66735, 66739, 66743, 66747, 66751, 66755, 66759, 66763,
- 66767, 66771, 66775, 66779, 66783, 66787, 66791, 66795, 66799, 66803,
- 66807, 66811, 66815, 66819, 66823, 66827, 66831, 66835, 66839, 66843,
- 66847, 66851, 66855, 66859, 66863, 66867, 66871, 66875, 66879, 66883,
- 66887, 66891, 66895, 66899, 66903, 66907, 66911, 66915, 66919, 66923,
- 66927, 66931, 66935, 66939, 66943, 66947, 66951, 66955, 66959, 66963,
- 66967, 66971, 66975, 66979, 66983, 66987, 66991, 66995, 66999, 67003,
- 67007, 67011, 67015, 67019, 67023, 67027, 67031, 67035, 67039, 67043,
- 67047, 67051, 67055, 67059, 67063, 67067, 67071, 67075, 67079, 67083,
- 67087, 67091, 67095, 67099, 67103, 67107, 67111, 67115, 67119, 67123,
- 67127, 67131, 67135, 67139, 67143, 67147, 67151, 67155, 67159, 67163,
- 67167, 67171, 67175, 67179, 67183, 67187, 67191, 67195, 67199, 67202,
- 67206, 67210, 67214, 67218, 67222, 67226, 67230, 67233, 67237, 67241,
- 67245, 67249, 67253, 67257, 67261, 67265, 67269, 67273, 67277, 67281,
- 67285, 67289, 67293, 67297, 67301, 67305, 67309, 67313, 67317, 67321,
- 67325, 67329, 67333, 67337, 67341, 67345, 67349, 67353, 67357, 67361,
- 67365, 67369, 67373, 67377, 67381, 67385, 67389, 67393, 67397, 67401,
- 67405, 67409, 67413, 67417, 67421, 67425, 67429, 67433, 67437, 67441,
- 67445, 67449, 67453, 67457, 67461, 67465, 67469, 67473, 67477, 67481,
- 67485, 67489, 67493, 67497, 67501, 67505, 67509, 67513, 67517, 67521,
- 67525, 67529, 67533, 67537, 67541, 67545, 67549, 67553, 67557, 67561,
- 67565, 67569, 67573, 67577, 67581, 67585, 67589, 67593, 67597, 67601,
- 67605, 67609, 67613, 67617, 67621, 67625, 67629, 67633, 67637, 67641,
- 67645, 67649, 67653, 67657, 67661, 67665, 67669, 67673, 67677, 67681,
- 67685, 67689, 67693, 67697, 67701, 67705, 67709, 67713, 67717, 67721,
- 67725, 67729, 67733, 67737, 67741, 67745, 67749, 67753, 67757, 67761,
- 67765, 67769, 67773, 67777, 67781, 67785, 67789, 67793, 67797, 67801,
- 67805, 67809, 67813, 67817, 67821, 67825, 67829, 67833, 67837, 67841,
- 67845, 67849, 67853, 67857, 67861, 67865, 67869, 67873, 67877, 67881,
- 67885, 67889, 67893, 67897, 67901, 67905, 67909, 67913, 67917, 67921,
- 67925, 67929, 67933, 67937, 67941, 67945, 67949, 67953, 67957, 67960,
- 67964, 67968, 67972, 67976, 67980, 67984, 67988, 67992, 67996, 68000,
- 68004, 68008, 68012, 68016, 68020, 68024, 68028, 68032, 68036, 68040,
- 68044, 68048, 68052, 68056, 68060, 68064, 68068, 68072, 68076, 68080,
- 68084, 68088, 68092, 68096, 68100, 68104, 68108, 68112, 68116, 68120,
- 68124, 68128, 68132, 68136, 68140, 68144, 68148, 68152, 68156, 68160,
- 68164, 68168, 68172, 68176, 68180, 68184, 68188, 68192, 68196, 68200,
- 68204, 68208, 68212, 68216, 68220, 68224, 68228, 68232, 68236, 68240,
- 68244, 68248, 68252, 68256, 68260, 68264, 68268, 68272, 68276, 68280,
- 68284, 68288, 68292, 68296, 68300, 68304, 68308, 68312, 68316, 68320,
- 68324, 68328, 68332, 68336, 68340, 68344, 68348, 68352, 68356, 68360,
- 68364, 68368, 68372, 68376, 68380, 68384, 68388, 68392, 68396, 68400,
- 68404, 68408, 68412, 68416, 68420, 68424, 68428, 68432, 68436, 68440,
- 68444, 68448, 68452, 68456, 68460, 68464, 68468, 68472, 68476, 68480,
- 68484, 68488, 68492, 68496, 68500, 68504, 68508, 68512, 68516, 68520,
- 68524, 68528, 68532, 68536, 68540, 68544, 68548, 68552, 68556, 68560,
- 68564, 68568, 68572, 68576, 68580, 68584, 68588, 68592, 68596, 68600,
- 68604, 68608, 68612, 68616, 68620, 68624, 68628, 68632, 68636, 68640,
- 68644, 68648, 68652, 68656, 68660, 68664, 68668, 68672, 68676, 68680,
- 68684, 68688, 68692, 68696, 68700, 68704, 68708, 68712, 68716, 68720,
- 68724, 68728, 68732, 68736, 68740, 0, 0, 0, 68744, 68748, 68752, 68756,
- 68760, 68764, 68768, 68772, 68776, 68780, 68784, 68788, 68792, 68796,
- 68800, 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836,
- 68840, 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876,
- 68880, 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916,
- 68920, 68924, 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956,
- 68960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68964, 68969, 68973, 68978, 68983,
- 68988, 68993, 68998, 69002, 69007, 69012, 69017, 69022, 69027, 69032,
- 69037, 69041, 69045, 69050, 69054, 69059, 69064, 69069, 69073, 69078,
- 69083, 69088, 69093, 69098, 69102, 69107, 69111, 69116, 69120, 69125,
- 69129, 69133, 69137, 69142, 69147, 69152, 69160, 69168, 69176, 69184,
- 69191, 69199, 69205, 69213, 69217, 69221, 69225, 69229, 69233, 69237,
- 69241, 69245, 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277,
- 69281, 69285, 69289, 69293, 69297, 69301, 69305, 69309, 69313, 69317,
- 69321, 69325, 69329, 69333, 69337, 69341, 69345, 69349, 69353, 69357,
- 69360, 69364, 69368, 69372, 69376, 69380, 69384, 69388, 69392, 69396,
- 69400, 69404, 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436,
- 69440, 69444, 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69476,
- 69480, 69484, 69488, 69492, 69496, 69500, 69504, 69507, 69511, 69515,
- 69518, 69522, 69526, 69530, 69533, 69537, 69541, 69545, 69549, 69553,
- 69557, 69561, 69565, 69569, 69573, 69577, 69581, 69585, 69589, 69592,
- 69596, 69600, 69603, 69607, 69611, 69615, 69619, 69623, 69627, 69630,
- 69633, 69637, 69641, 69645, 69648, 69651, 69655, 69659, 69663, 69667,
- 69671, 69675, 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707,
- 69711, 69715, 69719, 69723, 69727, 69731, 69735, 69739, 69743, 69747,
- 69751, 69755, 69759, 69763, 69767, 69771, 69775, 69779, 69783, 69787,
- 69791, 69795, 69799, 69802, 69806, 69810, 69814, 69818, 69822, 69826,
- 69830, 69834, 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866,
- 69870, 69874, 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906,
- 69910, 69914, 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946,
- 69949, 69953, 69957, 69961, 69965, 69969, 69973, 69977, 69981, 69985,
- 69989, 69993, 69997, 70001, 70005, 70009, 70013, 70016, 70020, 70024,
- 70028, 70032, 70036, 70040, 70044, 70048, 70052, 70056, 70060, 70064,
- 70068, 70072, 70076, 70080, 70084, 70088, 70092, 70096, 70100, 70103,
- 70107, 70111, 70115, 70119, 70123, 70127, 70131, 70135, 70139, 70143,
- 70147, 70151, 70155, 70159, 70163, 70167, 70171, 70175, 70179, 70183,
- 70187, 70191, 70195, 70199, 70203, 70207, 70211, 70215, 70219, 70223,
- 70227, 70231, 70235, 70239, 70243, 70247, 70251, 70255, 70259, 70263,
- 70267, 70271, 70275, 70278, 70283, 70287, 70293, 70298, 70304, 70308,
- 70312, 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70348,
- 70352, 70356, 70360, 70363, 70366, 70369, 70372, 70375, 70378, 70381,
- 70384, 70387, 70392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 70398, 70403, 70408, 70413, 70418, 70425, 70432, 70437, 70442,
- 70447, 70452, 70459, 70466, 70473, 70480, 70487, 70494, 70504, 70514,
- 70521, 70528, 70535, 70542, 70548, 70554, 70563, 70572, 70579, 70586,
- 70597, 70608, 70613, 70618, 70625, 70632, 70639, 70646, 70653, 70660,
- 70667, 70674, 70680, 70686, 70692, 70698, 70705, 70712, 70717, 70721,
- 70728, 70735, 70742, 70746, 70753, 70757, 70762, 70766, 70772, 70777,
- 70783, 70788, 70792, 70796, 70799, 70802, 70807, 70812, 70817, 70822,
- 70827, 70832, 70837, 70842, 70847, 70852, 70861, 70870, 70875, 70880,
- 70885, 70890, 70895, 70900, 70905, 70910, 70915, 70920, 70925, 0, 0, 0,
- 0, 0, 0, 0, 70930, 70936, 70939, 70942, 70945, 70949, 70953, 70957,
- 70961, 70964, 70968, 70971, 70975, 70978, 70982, 70986, 70990, 70994,
- 70998, 71002, 71006, 71009, 71013, 71017, 71021, 71025, 71029, 71033,
- 71037, 71041, 71045, 71049, 71053, 71057, 71061, 71065, 71068, 71072,
- 71076, 71080, 71084, 71088, 71092, 71096, 71100, 71104, 71108, 71112,
- 71116, 71120, 71124, 71128, 71132, 71136, 71140, 71144, 71148, 71152,
- 71156, 71160, 71164, 71167, 71171, 71175, 71179, 71183, 71187, 71191,
- 71195, 71198, 71202, 71206, 71210, 71214, 71218, 71222, 71226, 71230,
- 71234, 71238, 71242, 71246, 71251, 71256, 71259, 71264, 71267, 71270,
- 71273, 0, 0, 0, 0, 0, 0, 0, 0, 71277, 71286, 71295, 71304, 71313, 71322,
- 71331, 71340, 71349, 71357, 71364, 71372, 71379, 71387, 71397, 71406,
- 71416, 71425, 71435, 71443, 71450, 71458, 71465, 71473, 71478, 71483,
- 71488, 71497, 71503, 71509, 71516, 71525, 71533, 71541, 71549, 71556,
- 71563, 71570, 71577, 71582, 71587, 71592, 71597, 71602, 71607, 71612,
- 71617, 71625, 71633, 71639, 71645, 71650, 71655, 71660, 71665, 71670,
- 71675, 71680, 71685, 71693, 71701, 71706, 71711, 71721, 71731, 71738,
- 71745, 71754, 71763, 71775, 71787, 71793, 71799, 71807, 71815, 71825,
- 71835, 71842, 71849, 71854, 71859, 71871, 71883, 71891, 71899, 71909,
- 71919, 71931, 71943, 71952, 71961, 71968, 71975, 71982, 71989, 71998,
- 72007, 72012, 72017, 72024, 72031, 72038, 72045, 72057, 72069, 72074,
- 72079, 72084, 72089, 72094, 72099, 72104, 72109, 72113, 72118, 72123,
- 72128, 72133, 72138, 72144, 72149, 72154, 72161, 72168, 72175, 72182,
- 72189, 72198, 72207, 72213, 72219, 72225, 72231, 72238, 72245, 72252,
- 72259, 72266, 72270, 72277, 72282, 72287, 72294, 0, 72307, 72315, 72323,
- 72330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72337, 72346, 72355, 72364,
- 72373, 72382, 72391, 72400, 72409, 72418, 72427, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63683, 63692, 63701, 63712,
+ 63719, 63724, 63729, 63736, 63743, 63749, 63754, 63759, 63764, 63769,
+ 63776, 63781, 63786, 63791, 63802, 63807, 63812, 63819, 63824, 63831,
+ 63836, 63841, 63848, 63855, 63862, 63871, 63880, 63885, 63890, 63895,
+ 63902, 63907, 63917, 63924, 63929, 63934, 63939, 63944, 63949, 63954,
+ 63963, 63970, 63977, 63982, 63989, 63994, 64001, 64010, 64021, 64026,
+ 64035, 64040, 64047, 64056, 64065, 64070, 64075, 64082, 64088, 64095,
+ 64102, 64106, 64110, 64113, 64117, 64121, 64125, 64129, 64133, 64137,
+ 64141, 64144, 64148, 64152, 64156, 64160, 64164, 64168, 64171, 64175,
+ 64179, 64182, 64186, 64190, 64194, 64198, 64202, 64206, 64210, 64214,
+ 64218, 64222, 64226, 64230, 64234, 64238, 64242, 64246, 64250, 64254,
+ 64258, 64262, 64266, 64270, 64274, 64278, 64282, 64286, 64290, 64294,
+ 64298, 64302, 64306, 64310, 64314, 64318, 64322, 64326, 64330, 64334,
+ 64338, 64342, 64346, 64350, 64354, 64358, 64361, 64365, 64369, 64373,
+ 64377, 64381, 64385, 64389, 64393, 64397, 64401, 64405, 64409, 64413,
+ 64417, 64421, 64425, 64429, 64433, 64437, 64441, 64445, 64449, 64453,
+ 64457, 64461, 64465, 64469, 64473, 64477, 64481, 64485, 64489, 64493,
+ 64497, 64501, 64505, 64509, 64513, 64517, 64521, 64525, 64529, 64533,
+ 64537, 64541, 64545, 64549, 64553, 64557, 64561, 64565, 64569, 64573,
+ 64577, 64581, 64585, 64589, 64593, 64597, 64601, 64605, 64609, 64613,
+ 64617, 64621, 64625, 64629, 64633, 64637, 64641, 64645, 64649, 64653,
+ 64657, 64661, 64665, 64669, 64673, 64677, 64681, 64685, 64689, 64693,
+ 64697, 64701, 64705, 64709, 64713, 64717, 64721, 64725, 64729, 64733,
+ 64737, 64741, 64745, 64749, 64753, 64757, 64761, 64765, 64769, 64773,
+ 64777, 64781, 64785, 64789, 64793, 64797, 64801, 64805, 64809, 64813,
+ 64817, 64821, 64825, 64829, 64832, 64836, 64840, 64844, 64848, 64852,
+ 64856, 64860, 64864, 64868, 64872, 64876, 64880, 64884, 64888, 64892,
+ 64896, 64900, 64904, 64908, 64912, 64916, 64920, 64924, 64928, 64932,
+ 64936, 64940, 64944, 64948, 64952, 64956, 64960, 64964, 64968, 64972,
+ 64976, 64980, 64984, 64988, 64992, 64996, 65000, 65004, 65008, 65012,
+ 65016, 65020, 65024, 65028, 65032, 65036, 65040, 65044, 65048, 65052,
+ 65056, 65060, 65064, 65068, 65072, 65076, 65080, 65084, 65088, 65092,
+ 65096, 65100, 65104, 65108, 65112, 65116, 65120, 65124, 65128, 65132,
+ 65136, 65140, 65144, 65148, 65152, 65156, 65160, 65164, 65168, 65172,
+ 65176, 65180, 65184, 65188, 65192, 65196, 65200, 65204, 65208, 65212,
+ 65216, 65220, 65224, 65228, 65232, 65236, 65240, 65244, 65248, 65252,
+ 65256, 65260, 65264, 65268, 65272, 65276, 65280, 65284, 65288, 65292,
+ 65295, 65299, 65303, 65307, 65311, 65315, 65319, 65323, 65327, 65331,
+ 65335, 65339, 65343, 65347, 65351, 65355, 65359, 65363, 65367, 65371,
+ 65375, 65379, 65383, 65387, 65391, 65395, 65399, 65403, 65407, 65411,
+ 65415, 65419, 65423, 65427, 65431, 65435, 65439, 65443, 65447, 65451,
+ 65455, 65459, 65463, 65467, 65471, 65475, 65479, 65483, 65487, 65491,
+ 65495, 65499, 65503, 65507, 65511, 65515, 65519, 65523, 65527, 65531,
+ 65535, 65539, 65543, 65547, 65551, 65555, 65559, 65563, 65567, 65571,
+ 65575, 65579, 65583, 65587, 65591, 65595, 65599, 65603, 65607, 65611,
+ 65615, 65619, 65623, 65627, 65631, 65635, 65639, 65643, 65647, 65651,
+ 65654, 65658, 65662, 65666, 65670, 65674, 65678, 65682, 65686, 65690,
+ 65694, 65698, 65702, 65706, 65710, 65714, 65718, 65722, 65726, 65730,
+ 65734, 65738, 65742, 65746, 65750, 65754, 65758, 65762, 65766, 65770,
+ 65774, 65778, 65782, 65786, 65790, 65794, 65798, 65802, 65806, 65810,
+ 65814, 65818, 65822, 65826, 65830, 65834, 65838, 65842, 65846, 65850,
+ 65854, 65858, 65862, 65866, 65870, 65874, 65878, 65882, 65886, 65890,
+ 65894, 65898, 65902, 65906, 65910, 65914, 65918, 65922, 65926, 65930,
+ 65934, 65938, 65942, 65946, 65950, 65954, 65958, 65962, 65966, 65970,
+ 65974, 65978, 65982, 65986, 65990, 65994, 65998, 66002, 66006, 66010,
+ 66014, 66018, 66022, 66026, 66030, 66034, 66038, 66042, 66046, 66050,
+ 66054, 66058, 66062, 66066, 66070, 66074, 66078, 66082, 66086, 66090,
+ 66094, 66098, 66102, 66106, 66110, 66114, 66118, 66122, 66126, 66130,
+ 66134, 66138, 66142, 66146, 66149, 66153, 66157, 66161, 66165, 66169,
+ 66173, 66177, 66181, 66185, 66189, 66193, 66197, 66201, 66205, 66209,
+ 66213, 66217, 66221, 66225, 66229, 66233, 66237, 66241, 66245, 66249,
+ 66253, 66257, 66261, 66265, 66269, 66273, 66277, 66281, 66285, 66289,
+ 66293, 66297, 66301, 66305, 66309, 66313, 66317, 66321, 66325, 66329,
+ 66333, 66337, 66341, 66345, 66349, 66353, 66357, 66361, 66365, 66369,
+ 66373, 66377, 66381, 66385, 66389, 66393, 66397, 66401, 66405, 66409,
+ 66413, 66417, 66421, 66425, 66429, 66433, 66437, 66441, 66445, 66449,
+ 66453, 66457, 66461, 66465, 66469, 66473, 66477, 66481, 66485, 66489,
+ 66493, 66497, 66501, 66505, 66509, 66513, 66517, 66521, 66525, 66529,
+ 66533, 66537, 66541, 66545, 66549, 66553, 66557, 66561, 66565, 66569,
+ 66573, 66577, 66581, 66585, 66589, 66593, 66597, 66601, 66604, 66608,
+ 66612, 66616, 66620, 66624, 66628, 66632, 66636, 66640, 66644, 66648,
+ 66652, 66656, 66660, 66664, 66668, 66672, 66676, 66680, 66684, 66688,
+ 66692, 66696, 66700, 66704, 66708, 66712, 66716, 66720, 66724, 66728,
+ 66732, 66736, 66740, 66744, 66748, 66752, 66756, 66760, 66764, 66768,
+ 66772, 66776, 66780, 66784, 66788, 66792, 66796, 66800, 66804, 66808,
+ 66812, 66816, 66820, 66824, 66828, 66832, 66836, 66840, 66844, 66848,
+ 66852, 66856, 66860, 66864, 66868, 66872, 66876, 66880, 66884, 66888,
+ 66892, 66896, 66900, 66904, 66908, 66912, 66916, 66920, 66924, 66928,
+ 66932, 66936, 66940, 66944, 66948, 66952, 66956, 66960, 66964, 66968,
+ 66972, 66976, 66980, 66984, 66988, 66992, 66996, 67000, 67004, 67008,
+ 67012, 67016, 67020, 67024, 67028, 67032, 67036, 67040, 67044, 67048,
+ 67052, 67056, 67060, 67064, 67068, 67072, 67076, 67080, 67084, 67088,
+ 67092, 67096, 67100, 67104, 67108, 67112, 67116, 67120, 67124, 67128,
+ 67132, 67136, 67140, 67144, 67148, 67152, 67156, 67160, 67164, 67168,
+ 67172, 67176, 67180, 67184, 67188, 67192, 67196, 67200, 67204, 67207,
+ 67211, 67215, 67219, 67223, 67227, 67231, 67235, 67238, 67242, 67246,
+ 67250, 67254, 67258, 67262, 67266, 67270, 67274, 67278, 67282, 67286,
+ 67290, 67294, 67298, 67302, 67306, 67310, 67314, 67318, 67322, 67326,
+ 67330, 67334, 67338, 67342, 67346, 67350, 67354, 67358, 67362, 67366,
+ 67370, 67374, 67378, 67382, 67386, 67390, 67394, 67398, 67402, 67406,
+ 67410, 67414, 67418, 67422, 67426, 67430, 67434, 67438, 67442, 67446,
+ 67450, 67454, 67458, 67462, 67466, 67470, 67474, 67478, 67482, 67486,
+ 67490, 67494, 67498, 67502, 67506, 67510, 67514, 67518, 67522, 67526,
+ 67530, 67534, 67538, 67542, 67546, 67550, 67554, 67558, 67562, 67566,
+ 67570, 67574, 67578, 67582, 67586, 67590, 67594, 67598, 67602, 67606,
+ 67610, 67614, 67618, 67622, 67626, 67630, 67634, 67638, 67642, 67646,
+ 67650, 67654, 67658, 67662, 67666, 67670, 67674, 67678, 67682, 67686,
+ 67690, 67694, 67698, 67702, 67706, 67710, 67714, 67718, 67722, 67726,
+ 67730, 67734, 67738, 67742, 67746, 67750, 67754, 67758, 67762, 67766,
+ 67770, 67774, 67778, 67782, 67786, 67790, 67794, 67798, 67802, 67806,
+ 67810, 67814, 67818, 67822, 67826, 67830, 67834, 67838, 67842, 67846,
+ 67850, 67854, 67858, 67862, 67866, 67870, 67874, 67878, 67882, 67886,
+ 67890, 67894, 67898, 67902, 67906, 67910, 67914, 67918, 67922, 67926,
+ 67930, 67934, 67938, 67942, 67946, 67950, 67954, 67958, 67962, 67965,
+ 67969, 67973, 67977, 67981, 67985, 67989, 67993, 67997, 68001, 68005,
+ 68009, 68013, 68017, 68021, 68025, 68029, 68033, 68037, 68041, 68045,
+ 68049, 68053, 68057, 68061, 68065, 68069, 68073, 68077, 68081, 68085,
+ 68089, 68093, 68097, 68101, 68105, 68109, 68113, 68117, 68121, 68125,
+ 68129, 68133, 68137, 68141, 68145, 68149, 68153, 68157, 68161, 68165,
+ 68169, 68173, 68177, 68181, 68185, 68189, 68193, 68197, 68201, 68205,
+ 68209, 68213, 68217, 68221, 68225, 68229, 68233, 68237, 68241, 68245,
+ 68249, 68253, 68257, 68261, 68265, 68269, 68273, 68277, 68281, 68285,
+ 68289, 68293, 68297, 68301, 68305, 68309, 68313, 68317, 68321, 68325,
+ 68329, 68333, 68337, 68341, 68345, 68349, 68353, 68357, 68361, 68365,
+ 68369, 68373, 68377, 68381, 68385, 68389, 68393, 68397, 68401, 68405,
+ 68409, 68413, 68417, 68421, 68425, 68429, 68433, 68437, 68441, 68445,
+ 68449, 68453, 68457, 68461, 68465, 68469, 68473, 68477, 68481, 68485,
+ 68489, 68493, 68497, 68501, 68505, 68509, 68513, 68517, 68521, 68525,
+ 68529, 68533, 68537, 68541, 68545, 68549, 68553, 68557, 68561, 68565,
+ 68569, 68573, 68577, 68581, 68585, 68589, 68593, 68597, 68601, 68605,
+ 68609, 68613, 68617, 68621, 68625, 68629, 68633, 68637, 68641, 68645,
+ 68649, 68653, 68657, 68661, 68665, 68669, 68673, 68677, 68681, 68685,
+ 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, 68721, 68725,
+ 68729, 68733, 68737, 68741, 68745, 0, 0, 0, 68749, 68753, 68757, 68761,
+ 68765, 68769, 68773, 68777, 68781, 68785, 68789, 68793, 68797, 68801,
+ 68805, 68809, 68813, 68817, 68821, 68825, 68829, 68833, 68837, 68841,
+ 68845, 68849, 68853, 68857, 68861, 68865, 68869, 68873, 68877, 68881,
+ 68885, 68889, 68893, 68897, 68901, 68905, 68909, 68913, 68917, 68921,
+ 68925, 68929, 68933, 68937, 68941, 68945, 68949, 68953, 68957, 68961,
+ 68965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68969, 68974, 68978, 68983, 68988,
+ 68993, 68998, 69003, 69007, 69012, 69017, 69022, 69027, 69032, 69037,
+ 69042, 69046, 69050, 69055, 69059, 69064, 69069, 69074, 69078, 69083,
+ 69088, 69093, 69098, 69103, 69107, 69112, 69116, 69121, 69125, 69130,
+ 69134, 69138, 69142, 69147, 69152, 69157, 69165, 69173, 69181, 69189,
+ 69196, 69204, 69210, 69218, 69222, 69226, 69230, 69234, 69238, 69242,
+ 69246, 69250, 69254, 69258, 69262, 69266, 69270, 69274, 69278, 69282,
+ 69286, 69290, 69294, 69298, 69302, 69306, 69310, 69314, 69318, 69322,
+ 69326, 69330, 69334, 69338, 69342, 69346, 69350, 69354, 69358, 69362,
+ 69365, 69369, 69373, 69377, 69381, 69385, 69389, 69393, 69397, 69401,
+ 69405, 69409, 69413, 69417, 69421, 69425, 69429, 69433, 69437, 69441,
+ 69445, 69449, 69453, 69457, 69461, 69465, 69469, 69473, 69477, 69481,
+ 69485, 69489, 69493, 69497, 69501, 69505, 69509, 69512, 69516, 69520,
+ 69523, 69527, 69531, 69535, 69538, 69542, 69546, 69550, 69554, 69558,
+ 69562, 69566, 69570, 69574, 69578, 69582, 69586, 69590, 69594, 69597,
+ 69601, 69605, 69608, 69612, 69616, 69620, 69624, 69628, 69632, 69635,
+ 69638, 69642, 69646, 69650, 69653, 69656, 69660, 69664, 69668, 69672,
+ 69676, 69680, 69684, 69688, 69692, 69696, 69700, 69704, 69708, 69712,
+ 69716, 69720, 69724, 69728, 69732, 69736, 69740, 69744, 69748, 69752,
+ 69756, 69760, 69764, 69768, 69772, 69776, 69780, 69784, 69788, 69792,
+ 69796, 69800, 69804, 69807, 69811, 69815, 69819, 69823, 69827, 69831,
+ 69835, 69839, 69843, 69847, 69851, 69855, 69859, 69863, 69867, 69871,
+ 69875, 69879, 69883, 69887, 69891, 69895, 69899, 69903, 69907, 69911,
+ 69915, 69919, 69923, 69927, 69931, 69935, 69939, 69943, 69947, 69951,
+ 69954, 69958, 69962, 69966, 69970, 69974, 69978, 69982, 69986, 69990,
+ 69994, 69998, 70002, 70006, 70010, 70014, 70018, 70021, 70025, 70029,
+ 70033, 70037, 70041, 70045, 70049, 70053, 70057, 70061, 70065, 70069,
+ 70073, 70077, 70081, 70085, 70089, 70093, 70097, 70101, 70105, 70108,
+ 70112, 70116, 70120, 70124, 70128, 70132, 70136, 70140, 70144, 70148,
+ 70152, 70156, 70160, 70164, 70168, 70172, 70176, 70180, 70184, 70188,
+ 70192, 70196, 70200, 70204, 70208, 70212, 70216, 70220, 70224, 70228,
+ 70232, 70236, 70240, 70244, 70248, 70252, 70256, 70260, 70264, 70268,
+ 70272, 70276, 70280, 70283, 70288, 70292, 70298, 70303, 70309, 70313,
+ 70317, 70321, 70325, 70329, 70333, 70337, 70341, 70345, 70349, 70353,
+ 70357, 70361, 70365, 70368, 70371, 70374, 70377, 70380, 70383, 70386,
+ 70389, 70392, 70397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 70403, 70408, 70413, 70418, 70423, 70430, 70437, 70442, 70447,
+ 70452, 70457, 70464, 70471, 70478, 70485, 70492, 70499, 70509, 70519,
+ 70526, 70533, 70540, 70547, 70553, 70559, 70568, 70577, 70584, 70591,
+ 70602, 70613, 70618, 70623, 70630, 70637, 70644, 70651, 70658, 70665,
+ 70672, 70679, 70685, 70691, 70697, 70703, 70710, 70717, 70722, 70726,
+ 70733, 70740, 70747, 70751, 70758, 70762, 70767, 70771, 70777, 70782,
+ 70788, 70793, 70797, 70801, 70804, 70807, 70812, 70817, 70822, 70827,
+ 70832, 70837, 70842, 70847, 70852, 70857, 70866, 70875, 70880, 70885,
+ 70890, 70895, 70900, 70905, 70910, 70915, 70920, 70925, 70930, 0, 0, 0,
+ 0, 0, 0, 0, 70935, 70941, 70944, 70947, 70950, 70954, 70958, 70962,
+ 70966, 70969, 70973, 70976, 70980, 70983, 70987, 70991, 70995, 70999,
+ 71003, 71007, 71011, 71014, 71018, 71022, 71026, 71030, 71034, 71038,
+ 71042, 71046, 71050, 71054, 71058, 71062, 71066, 71070, 71073, 71077,
+ 71081, 71085, 71089, 71093, 71097, 71101, 71105, 71109, 71113, 71117,
+ 71121, 71125, 71129, 71133, 71137, 71141, 71145, 71149, 71153, 71157,
+ 71161, 71165, 71169, 71172, 71176, 71180, 71184, 71188, 71192, 71196,
+ 71200, 71203, 71207, 71211, 71215, 71219, 71223, 71227, 71231, 71235,
+ 71239, 71243, 71247, 71251, 71256, 71261, 71264, 71269, 71272, 71275,
+ 71278, 0, 0, 0, 0, 0, 0, 0, 0, 71282, 71291, 71300, 71309, 71318, 71327,
+ 71336, 71345, 71354, 71362, 71369, 71377, 71384, 71392, 71402, 71411,
+ 71421, 71430, 71440, 71448, 71455, 71463, 71470, 71478, 71483, 71488,
+ 71493, 71502, 71508, 71514, 71521, 71530, 71538, 71546, 71554, 71561,
+ 71568, 71575, 71582, 71587, 71592, 71597, 71602, 71607, 71612, 71617,
+ 71622, 71630, 71638, 71644, 71650, 71655, 71660, 71665, 71670, 71675,
+ 71680, 71685, 71690, 71698, 71706, 71711, 71716, 71726, 71736, 71743,
+ 71750, 71759, 71768, 71780, 71792, 71798, 71804, 71812, 71820, 71830,
+ 71840, 71847, 71854, 71859, 71864, 71876, 71888, 71896, 71904, 71914,
+ 71924, 71936, 71948, 71957, 71966, 71973, 71980, 71987, 71994, 72003,
+ 72012, 72017, 72022, 72029, 72036, 72043, 72050, 72062, 72074, 72079,
+ 72084, 72089, 72094, 72099, 72104, 72109, 72114, 72118, 72123, 72128,
+ 72133, 72138, 72143, 72149, 72154, 72159, 72166, 72173, 72180, 72187,
+ 72194, 72203, 72212, 72218, 72224, 72230, 72236, 72243, 72250, 72257,
+ 72264, 72271, 72275, 72282, 72287, 72292, 72299, 0, 72312, 72320, 72328,
+ 72335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72342, 72351, 72360, 72369,
+ 72378, 72387, 72396, 72405, 72414, 72423, 72432, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72434,
- 72441, 72447, 72454, 72462, 72470, 72477, 72485, 72492, 72498, 72504,
- 72511, 72517, 72523, 72529, 72536, 72543, 72550, 72557, 72564, 72571,
- 72578, 72585, 72592, 72599, 72606, 72613, 72620, 72627, 72633, 72640,
- 72647, 72654, 72661, 72668, 72675, 72682, 72689, 72696, 72703, 72710,
- 72717, 72724, 72731, 72738, 72745, 72752, 72759, 72767, 72775, 72783,
- 72791, 0, 0, 0, 0, 72799, 72808, 72817, 72826, 72835, 72844, 72853,
- 72860, 72867, 72874, 0, 0, 0, 0, 0, 0, 72881, 72885, 72890, 72895, 72900,
- 72905, 72910, 72915, 72920, 72925, 72930, 72935, 72939, 72943, 72948,
- 72953, 72957, 72962, 72967, 72972, 72977, 72982, 72987, 72992, 72996,
- 73000, 73005, 73010, 73014, 73018, 73022, 73026, 73030, 73034, 73038,
- 73043, 73048, 73053, 73058, 73063, 73070, 73076, 73081, 73086, 73091,
- 73096, 73102, 73109, 73115, 73122, 73128, 73134, 73139, 73146, 73152,
- 73157, 0, 0, 0, 0, 0, 0, 0, 0, 73163, 73167, 73171, 73174, 73178, 73181,
- 73185, 73188, 73192, 73196, 73201, 73205, 73210, 73213, 73217, 73221,
- 73224, 73228, 73232, 73235, 73239, 73243, 73247, 73251, 73255, 73259,
- 73263, 73267, 73271, 73275, 73279, 73283, 73287, 73291, 73295, 73299,
- 73303, 73307, 73310, 73313, 73317, 73321, 73325, 73328, 73331, 73334,
- 73338, 73342, 73346, 73350, 73353, 73356, 73360, 73365, 73370, 73374,
- 73379, 73383, 73388, 73393, 73399, 73404, 73410, 73414, 73419, 73424,
- 73428, 73433, 73438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73442, 73445, 73449,
- 73453, 73456, 73459, 73462, 73465, 73468, 73471, 73474, 73477, 0, 0, 0,
- 0, 0, 0, 73480, 73485, 73489, 73493, 73497, 73501, 73505, 73509, 73513,
- 73517, 73521, 73525, 73529, 73533, 73537, 73541, 73545, 73550, 73555,
- 73561, 73567, 73574, 73579, 73584, 73590, 73594, 73599, 73602, 0, 0, 0,
- 0, 73605, 73612, 73618, 73624, 73630, 73636, 73642, 73648, 73654, 73660,
- 73666, 73672, 73679, 73686, 73693, 73699, 73706, 73713, 73720, 73727,
- 73734, 73740, 73746, 73753, 73759, 73766, 73773, 73779, 73785, 73792,
- 73799, 73806, 73812, 73819, 73826, 73832, 73839, 73845, 73852, 73859,
- 73865, 73871, 73878, 73884, 73891, 73898, 73907, 73914, 73921, 73925,
- 73930, 73935, 73940, 73945, 73949, 73953, 73958, 73962, 73967, 73972,
- 73977, 73981, 73985, 73990, 73994, 73999, 74003, 74008, 74013, 74018,
- 74023, 74027, 74032, 74037, 74042, 74048, 74053, 74059, 74065, 74071,
- 74077, 74083, 74088, 74094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74098,
- 74103, 74107, 74111, 74115, 74119, 74123, 74127, 74131, 74135, 74139,
- 74143, 74147, 74151, 74155, 74159, 74163, 74167, 74171, 74175, 74179,
- 74183, 74187, 74191, 74195, 74199, 74203, 74207, 74211, 74215, 0, 0, 0,
- 74219, 74223, 74227, 74231, 74235, 74238, 74244, 74247, 74251, 74254,
- 74260, 74266, 74274, 74277, 74281, 74284, 74287, 74293, 74299, 74303,
- 74309, 74313, 74317, 74323, 74327, 74333, 74339, 74343, 74347, 74353,
- 74357, 74363, 74369, 74373, 74379, 74383, 74389, 74392, 74395, 74401,
- 74405, 74411, 74414, 74417, 74420, 74426, 74430, 74434, 74440, 74446,
- 74449, 74452, 74458, 74463, 74468, 74473, 74480, 74485, 74492, 74497,
- 74504, 74509, 74514, 74519, 74524, 74527, 74531, 74535, 74540, 74545,
- 74550, 74555, 74560, 74565, 74570, 74575, 74582, 74587, 0, 74594, 74597,
- 74601, 74604, 74607, 74610, 74613, 74616, 74619, 74622, 74625, 0, 0, 0,
- 0, 74628, 74635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74640, 74643, 74646, 74649, 74652,
- 74656, 74659, 74662, 74666, 74670, 74674, 74678, 74682, 74686, 74690,
- 74694, 74698, 74702, 74706, 74710, 74714, 74718, 74722, 74726, 74730,
- 74733, 74737, 74740, 74744, 74748, 74752, 74756, 74760, 74763, 74767,
- 74770, 74773, 74777, 74781, 74785, 74788, 74791, 74796, 74800, 74805,
- 74810, 74814, 74819, 74823, 74828, 74833, 74838, 74842, 74846, 74851, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 74856, 74861, 74866, 74871, 74877, 74882, 74887,
- 74892, 74897, 74902, 74906, 74910, 74915, 74920, 0, 0, 74926, 74930,
- 74933, 74936, 74939, 74942, 74945, 74948, 74951, 74954, 0, 0, 74957,
- 74962, 74967, 74973, 74980, 74986, 74992, 74998, 75004, 75010, 75016,
- 75022, 75028, 75034, 75040, 75046, 75051, 75056, 75061, 75067, 75073,
- 75080, 75086, 75092, 75097, 75104, 75111, 75118, 75124, 75129, 75134,
- 75139, 0, 0, 0, 0, 75147, 75153, 75159, 75165, 75171, 75177, 75183,
- 75189, 75195, 75201, 75207, 75213, 75219, 75225, 75231, 75237, 75243,
- 75249, 75255, 75261, 75267, 75272, 75277, 75283, 75289, 75295, 75301,
- 75307, 75313, 75319, 75325, 75331, 75337, 75343, 75349, 75355, 75361,
- 75367, 75373, 75379, 75385, 75391, 75397, 75403, 75409, 75415, 75421,
- 75426, 75431, 75437, 75442, 75446, 75451, 75455, 75459, 75463, 75469,
- 75474, 75479, 75484, 75489, 75494, 75499, 75504, 75511, 75518, 75525, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72439,
+ 72446, 72452, 72459, 72467, 72475, 72482, 72490, 72497, 72503, 72509,
+ 72516, 72522, 72528, 72534, 72541, 72548, 72555, 72562, 72569, 72576,
+ 72583, 72590, 72597, 72604, 72611, 72618, 72625, 72632, 72638, 72645,
+ 72652, 72659, 72666, 72673, 72680, 72687, 72694, 72701, 72708, 72715,
+ 72722, 72729, 72736, 72743, 72750, 72757, 72764, 72772, 72780, 72788,
+ 72796, 0, 0, 0, 0, 72804, 72813, 72822, 72831, 72840, 72849, 72858,
+ 72865, 72872, 72879, 0, 0, 0, 0, 0, 0, 72886, 72890, 72895, 72900, 72905,
+ 72910, 72915, 72920, 72925, 72930, 72935, 72940, 72944, 72948, 72953,
+ 72958, 72962, 72967, 72972, 72977, 72982, 72987, 72992, 72997, 73001,
+ 73005, 73010, 73015, 73019, 73023, 73027, 73031, 73035, 73039, 73043,
+ 73048, 73053, 73058, 73063, 73068, 73075, 73081, 73086, 73091, 73096,
+ 73101, 73107, 73114, 73120, 73127, 73133, 73139, 73144, 73151, 73157,
+ 73162, 0, 0, 0, 0, 0, 0, 0, 0, 73168, 73172, 73176, 73179, 73183, 73186,
+ 73190, 73193, 73197, 73201, 73206, 73210, 73215, 73218, 73222, 73226,
+ 73229, 73233, 73237, 73240, 73244, 73248, 73252, 73256, 73260, 73264,
+ 73268, 73272, 73276, 73280, 73284, 73288, 73292, 73296, 73300, 73304,
+ 73308, 73312, 73315, 73318, 73322, 73326, 73330, 73333, 73336, 73339,
+ 73343, 73347, 73351, 73355, 73358, 73361, 73365, 73370, 73375, 73379,
+ 73384, 73388, 73393, 73398, 73404, 73409, 73415, 73419, 73424, 73429,
+ 73433, 73438, 73443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73447, 73450, 73454,
+ 73458, 73461, 73464, 73467, 73470, 73473, 73476, 73479, 73482, 0, 0, 0,
+ 0, 0, 0, 73485, 73490, 73494, 73498, 73502, 73506, 73510, 73514, 73518,
+ 73522, 73526, 73530, 73534, 73538, 73542, 73546, 73550, 73555, 73560,
+ 73566, 73572, 73579, 73584, 73589, 73595, 73599, 73604, 73607, 0, 0, 0,
+ 0, 73610, 73617, 73623, 73629, 73635, 73641, 73647, 73653, 73659, 73665,
+ 73671, 73677, 73684, 73691, 73698, 73704, 73711, 73718, 73725, 73732,
+ 73739, 73745, 73751, 73758, 73764, 73771, 73778, 73784, 73790, 73797,
+ 73804, 73811, 73817, 73824, 73831, 73837, 73844, 73850, 73857, 73864,
+ 73870, 73876, 73883, 73889, 73896, 73903, 73912, 73919, 73926, 73930,
+ 73935, 73940, 73945, 73950, 73954, 73958, 73963, 73967, 73972, 73977,
+ 73982, 73986, 73990, 73995, 73999, 74004, 74008, 74013, 74018, 74023,
+ 74028, 74032, 74037, 74042, 74047, 74053, 74058, 74064, 74070, 74076,
+ 74082, 74088, 74093, 74099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74103,
+ 74108, 74112, 74116, 74120, 74124, 74128, 74132, 74136, 74140, 74144,
+ 74148, 74152, 74156, 74160, 74164, 74168, 74172, 74176, 74180, 74184,
+ 74188, 74192, 74196, 74200, 74204, 74208, 74212, 74216, 74220, 0, 0, 0,
+ 74224, 74228, 74232, 74236, 74240, 74243, 74249, 74252, 74256, 74259,
+ 74265, 74271, 74279, 74282, 74286, 74289, 74292, 74298, 74304, 74308,
+ 74314, 74318, 74322, 74328, 74332, 74338, 74344, 74348, 74352, 74358,
+ 74362, 74368, 74374, 74378, 74384, 74388, 74394, 74397, 74400, 74406,
+ 74410, 74416, 74419, 74422, 74425, 74431, 74435, 74439, 74445, 74451,
+ 74454, 74457, 74463, 74468, 74473, 74478, 74485, 74490, 74497, 74502,
+ 74509, 74514, 74519, 74524, 74529, 74532, 74536, 74540, 74545, 74550,
+ 74555, 74560, 74565, 74570, 74575, 74580, 74587, 74592, 0, 74599, 74602,
+ 74606, 74609, 74612, 74615, 74618, 74621, 74624, 74627, 74630, 0, 0, 0,
+ 0, 74633, 74640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74645, 74648, 74651, 74654, 74657,
+ 74661, 74664, 74667, 74671, 74675, 74679, 74683, 74687, 74691, 74695,
+ 74699, 74703, 74707, 74711, 74715, 74719, 74723, 74727, 74731, 74735,
+ 74738, 74742, 74745, 74749, 74753, 74757, 74761, 74765, 74768, 74772,
+ 74775, 74778, 74782, 74786, 74790, 74793, 74796, 74801, 74805, 74810,
+ 74815, 74819, 74824, 74828, 74833, 74838, 74843, 74847, 74851, 74856, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 74861, 74866, 74871, 74876, 74882, 74887, 74892,
+ 74897, 74902, 74907, 74911, 74915, 74920, 74925, 0, 0, 74931, 74935,
+ 74938, 74941, 74944, 74947, 74950, 74953, 74956, 74959, 0, 0, 74962,
+ 74967, 74972, 74978, 74985, 74991, 74997, 75003, 75009, 75015, 75021,
+ 75027, 75033, 75039, 75045, 75051, 75056, 75061, 75066, 75072, 75078,
+ 75085, 75091, 75097, 75102, 75109, 75116, 75123, 75129, 75134, 75139,
+ 75144, 0, 0, 0, 0, 75152, 75158, 75164, 75170, 75176, 75182, 75188,
+ 75194, 75200, 75206, 75212, 75218, 75224, 75230, 75236, 75242, 75248,
+ 75254, 75260, 75266, 75272, 75277, 75282, 75288, 75294, 75300, 75306,
+ 75312, 75318, 75324, 75330, 75336, 75342, 75348, 75354, 75360, 75366,
+ 75372, 75378, 75384, 75390, 75396, 75402, 75408, 75414, 75420, 75426,
+ 75431, 75436, 75442, 75447, 75451, 75456, 75460, 75464, 75468, 75474,
+ 75479, 75484, 75489, 75494, 75499, 75504, 75509, 75516, 75523, 75530, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 75532, 75537, 75542, 75547, 75554, 75561, 75565, 75569, 75574, 75579,
- 75584, 75589, 75594, 75599, 75604, 75609, 75614, 75620, 75626, 75632,
- 75638, 75644, 75648, 75654, 75658, 75664, 75671, 75677, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 75681, 75685, 75689, 75693, 75697, 75701, 0, 0, 75705, 75709,
- 75713, 75717, 75721, 75725, 0, 0, 75729, 75733, 75737, 75741, 75745,
- 75749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75753, 75757, 75761, 75765, 75769,
- 75773, 75777, 0, 75781, 75785, 75789, 75793, 75797, 75801, 75805, 0, 0,
+ 75537, 75542, 75547, 75552, 75559, 75566, 75570, 75574, 75579, 75584,
+ 75589, 75594, 75599, 75604, 75609, 75614, 75619, 75625, 75631, 75637,
+ 75643, 75649, 75653, 75659, 75663, 75669, 75676, 75682, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 75686, 75690, 75694, 75698, 75702, 75706, 0, 0, 75710, 75714,
+ 75718, 75722, 75726, 75730, 0, 0, 75734, 75738, 75742, 75746, 75750,
+ 75754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75758, 75762, 75766, 75770, 75774,
+ 75778, 75782, 0, 75786, 75790, 75794, 75798, 75802, 75806, 75810, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 75809, 75814, 75819, 75824, 75829, 75833, 75837, 75842, 75847, 75852,
- 75857, 75862, 75867, 75872, 75877, 75882, 75886, 75891, 75896, 75901,
- 75906, 75911, 75916, 75921, 75926, 75931, 75936, 75941, 75948, 75955,
- 75962, 75969, 75976, 75983, 75990, 75997, 76003, 76009, 76015, 76021,
- 76027, 76033, 76039, 76045, 76049, 76055, 0, 0, 76061, 76066, 76070,
- 76074, 76078, 76082, 76086, 76090, 76094, 76098, 0, 0, 0, 0, 0, 0, 0, 0,
+ 75814, 75819, 75824, 75829, 75834, 75838, 75842, 75847, 75852, 75857,
+ 75862, 75867, 75872, 75877, 75882, 75887, 75891, 75896, 75901, 75906,
+ 75911, 75916, 75921, 75926, 75931, 75936, 75941, 75946, 75953, 75960,
+ 75967, 75974, 75981, 75988, 75995, 76002, 76008, 76014, 76020, 76026,
+ 76032, 76038, 76044, 76050, 76054, 76060, 0, 0, 76066, 76071, 76075,
+ 76079, 76083, 76087, 76091, 76095, 76099, 76103, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76102,
- 76106, 76110, 76114, 76118, 76122, 76126, 76130, 76134, 76138, 76142,
- 76146, 76150, 76154, 76158, 76162, 76166, 76170, 76174, 76178, 76182,
- 76186, 76190, 0, 0, 0, 0, 76194, 76198, 76202, 76206, 76210, 76214,
- 76218, 76222, 76226, 76230, 76234, 76238, 76242, 76246, 76250, 76254,
- 76258, 76262, 76266, 76270, 76274, 76278, 76282, 76286, 76290, 76294,
- 76298, 76302, 76306, 76310, 76314, 76318, 76322, 76326, 76330, 76334,
- 76338, 76342, 76346, 76350, 76354, 76358, 76362, 76366, 76370, 76374,
- 76378, 76382, 76386, 0, 0, 0, 0, 76390, 76394, 76398, 76402, 76406,
- 76410, 76414, 76418, 76422, 76426, 76430, 76434, 76438, 76442, 76446,
- 76450, 76454, 76458, 76462, 76466, 76470, 76474, 76478, 76482, 76486,
- 76490, 76494, 76498, 76502, 76506, 76510, 76514, 76518, 76522, 76526,
- 76530, 76534, 76538, 76542, 76546, 76550, 76554, 76558, 76562, 76566,
- 76570, 76574, 76578, 76582, 76586, 76590, 76594, 76598, 76602, 76606,
- 76610, 76614, 76618, 76622, 76626, 76630, 76634, 76638, 76642, 76646,
- 76650, 76654, 76658, 76662, 76666, 76670, 76674, 76678, 76682, 76686,
- 76690, 76694, 76698, 76702, 76706, 76710, 76714, 76718, 76722, 76726,
- 76730, 76734, 76738, 76742, 76746, 76750, 76754, 76758, 76762, 76766,
- 76770, 76774, 76778, 76782, 76786, 76790, 76794, 76798, 76802, 76806,
- 76810, 76814, 76818, 76822, 76826, 76830, 76834, 76838, 76842, 76846,
- 76850, 76854, 76858, 76862, 76866, 76870, 76874, 76878, 76882, 76886,
- 76890, 76894, 76898, 76902, 76906, 76910, 76914, 76918, 76922, 76926,
- 76930, 76934, 76938, 76942, 76946, 76950, 76954, 76958, 76962, 76966,
- 76970, 76974, 76978, 76982, 76986, 76990, 76994, 76998, 77002, 77006,
- 77010, 77014, 77018, 77022, 77026, 77030, 77034, 77038, 77042, 77046,
- 77050, 77054, 77058, 77062, 77066, 77070, 77074, 77078, 77082, 77086,
- 77090, 77094, 77098, 77102, 77106, 77110, 77114, 77118, 77122, 77126,
- 77130, 77134, 77138, 77142, 77146, 77150, 77154, 77158, 77162, 77166,
- 77170, 77174, 77178, 77182, 77186, 77190, 77194, 77198, 77202, 77206,
- 77210, 77214, 77218, 77222, 77226, 77230, 77234, 77238, 77242, 77246,
- 77250, 77254, 77258, 77262, 77266, 77270, 77274, 77278, 77282, 77286,
- 77290, 77294, 77298, 77302, 77306, 77310, 77314, 77318, 77322, 77326,
- 77330, 77334, 77338, 77342, 77346, 77350, 77354, 77358, 77362, 77366,
- 77370, 77374, 77378, 77382, 77386, 77390, 77394, 77398, 77402, 77406,
- 77410, 77414, 77418, 77422, 77426, 77430, 77434, 77438, 77442, 77446,
- 77450, 77454, 77458, 77462, 77466, 77470, 77474, 77478, 77482, 77486,
- 77490, 77494, 77498, 77502, 77506, 77510, 77514, 77518, 77522, 77526,
- 77530, 77534, 77538, 77542, 77546, 77550, 77554, 77558, 77562, 77566,
- 77570, 77574, 77578, 77582, 77586, 77590, 77594, 77598, 77602, 77606,
- 77610, 77614, 77618, 77622, 77626, 77630, 77634, 77638, 77642, 77646,
- 77650, 77654, 77658, 77662, 77666, 77670, 77674, 77678, 77682, 77686,
- 77690, 77694, 77698, 77702, 77706, 77710, 77714, 77718, 77722, 77726,
- 77730, 77734, 77738, 77742, 77746, 77750, 77754, 77758, 77762, 77766,
- 77770, 77774, 77778, 77782, 77786, 77790, 77794, 77798, 77802, 77806,
- 77810, 77814, 77818, 77822, 77826, 77830, 77834, 77838, 77842, 77846,
- 77850, 0, 0, 77854, 77858, 77862, 77866, 77870, 77874, 77878, 77882,
- 77886, 77890, 77894, 77898, 77902, 77906, 77910, 77914, 77918, 77922,
- 77926, 77930, 77934, 77938, 77942, 77946, 77950, 77954, 77958, 77962,
- 77966, 77970, 77974, 77978, 77982, 77986, 77990, 77994, 77998, 78002,
- 78006, 78010, 78014, 78018, 78022, 78026, 78030, 78034, 78038, 78042,
- 78046, 78050, 78054, 78058, 78062, 78066, 78070, 78074, 78078, 78082,
- 78086, 78090, 78094, 78098, 78102, 78106, 78110, 78114, 78118, 78122,
- 78126, 78130, 78134, 78138, 78142, 78146, 78150, 78154, 78158, 78162,
- 78166, 78170, 78174, 78178, 78182, 78186, 78190, 78194, 78198, 78202,
- 78206, 78210, 78214, 78218, 78222, 78226, 78230, 78234, 78238, 78242,
- 78246, 78250, 78254, 78258, 78262, 78266, 78270, 78274, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76107,
+ 76111, 76115, 76119, 76123, 76127, 76131, 76135, 76139, 76143, 76147,
+ 76151, 76155, 76159, 76163, 76167, 76171, 76175, 76179, 76183, 76187,
+ 76191, 76195, 0, 0, 0, 0, 76199, 76203, 76207, 76211, 76215, 76219,
+ 76223, 76227, 76231, 76235, 76239, 76243, 76247, 76251, 76255, 76259,
+ 76263, 76267, 76271, 76275, 76279, 76283, 76287, 76291, 76295, 76299,
+ 76303, 76307, 76311, 76315, 76319, 76323, 76327, 76331, 76335, 76339,
+ 76343, 76347, 76351, 76355, 76359, 76363, 76367, 76371, 76375, 76379,
+ 76383, 76387, 76391, 0, 0, 0, 0, 76395, 76399, 76403, 76407, 76411,
+ 76415, 76419, 76423, 76427, 76431, 76435, 76439, 76443, 76447, 76451,
+ 76455, 76459, 76463, 76467, 76471, 76475, 76479, 76483, 76487, 76491,
+ 76495, 76499, 76503, 76507, 76511, 76515, 76519, 76523, 76527, 76531,
+ 76535, 76539, 76543, 76547, 76551, 76555, 76559, 76563, 76567, 76571,
+ 76575, 76579, 76583, 76587, 76591, 76595, 76599, 76603, 76607, 76611,
+ 76615, 76619, 76623, 76627, 76631, 76635, 76639, 76643, 76647, 76651,
+ 76655, 76659, 76663, 76667, 76671, 76675, 76679, 76683, 76687, 76691,
+ 76695, 76699, 76703, 76707, 76711, 76715, 76719, 76723, 76727, 76731,
+ 76735, 76739, 76743, 76747, 76751, 76755, 76759, 76763, 76767, 76771,
+ 76775, 76779, 76783, 76787, 76791, 76795, 76799, 76803, 76807, 76811,
+ 76815, 76819, 76823, 76827, 76831, 76835, 76839, 76843, 76847, 76851,
+ 76855, 76859, 76863, 76867, 76871, 76875, 76879, 76883, 76887, 76891,
+ 76895, 76899, 76903, 76907, 76911, 76915, 76919, 76923, 76927, 76931,
+ 76935, 76939, 76943, 76947, 76951, 76955, 76959, 76963, 76967, 76971,
+ 76975, 76979, 76983, 76987, 76991, 76995, 76999, 77003, 77007, 77011,
+ 77015, 77019, 77023, 77027, 77031, 77035, 77039, 77043, 77047, 77051,
+ 77055, 77059, 77063, 77067, 77071, 77075, 77079, 77083, 77087, 77091,
+ 77095, 77099, 77103, 77107, 77111, 77115, 77119, 77123, 77127, 77131,
+ 77135, 77139, 77143, 77147, 77151, 77155, 77159, 77163, 77167, 77171,
+ 77175, 77179, 77183, 77187, 77191, 77195, 77199, 77203, 77207, 77211,
+ 77215, 77219, 77223, 77227, 77231, 77235, 77239, 77243, 77247, 77251,
+ 77255, 77259, 77263, 77267, 77271, 77275, 77279, 77283, 77287, 77291,
+ 77295, 77299, 77303, 77307, 77311, 77315, 77319, 77323, 77327, 77331,
+ 77335, 77339, 77343, 77347, 77351, 77355, 77359, 77363, 77367, 77371,
+ 77375, 77379, 77383, 77387, 77391, 77395, 77399, 77403, 77407, 77411,
+ 77415, 77419, 77423, 77427, 77431, 77435, 77439, 77443, 77447, 77451,
+ 77455, 77459, 77463, 77467, 77471, 77475, 77479, 77483, 77487, 77491,
+ 77495, 77499, 77503, 77507, 77511, 77515, 77519, 77523, 77527, 77531,
+ 77535, 77539, 77543, 77547, 77551, 77555, 77559, 77563, 77567, 77571,
+ 77575, 77579, 77583, 77587, 77591, 77595, 77599, 77603, 77607, 77611,
+ 77615, 77619, 77623, 77627, 77631, 77635, 77639, 77643, 77647, 77651,
+ 77655, 77659, 77663, 77667, 77671, 77675, 77679, 77683, 77687, 77691,
+ 77695, 77699, 77703, 77707, 77711, 77715, 77719, 77723, 77727, 77731,
+ 77735, 77739, 77743, 77747, 77751, 77755, 77759, 77763, 77767, 77771,
+ 77775, 77779, 77783, 77787, 77791, 77795, 77799, 77803, 77807, 77811,
+ 77815, 77819, 77823, 77827, 77831, 77835, 77839, 77843, 77847, 77851,
+ 77855, 0, 0, 77859, 77863, 77867, 77871, 77875, 77879, 77883, 77887,
+ 77891, 77895, 77899, 77903, 77907, 77911, 77915, 77919, 77923, 77927,
+ 77931, 77935, 77939, 77943, 77947, 77951, 77955, 77959, 77963, 77967,
+ 77971, 77975, 77979, 77983, 77987, 77991, 77995, 77999, 78003, 78007,
+ 78011, 78015, 78019, 78023, 78027, 78031, 78035, 78039, 78043, 78047,
+ 78051, 78055, 78059, 78063, 78067, 78071, 78075, 78079, 78083, 78087,
+ 78091, 78095, 78099, 78103, 78107, 78111, 78115, 78119, 78123, 78127,
+ 78131, 78135, 78139, 78143, 78147, 78151, 78155, 78159, 78163, 78167,
+ 78171, 78175, 78179, 78183, 78187, 78191, 78195, 78199, 78203, 78207,
+ 78211, 78215, 78219, 78223, 78227, 78231, 78235, 78239, 78243, 78247,
+ 78251, 78255, 78259, 78263, 78267, 78271, 78275, 78279, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 78278, 78283, 78288, 78293, 78298, 78303, 78311,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78316, 78323, 78330, 78337, 78344, 0,
- 0, 0, 0, 0, 78351, 78358, 78365, 78375, 78381, 78387, 78393, 78399,
- 78405, 78411, 78418, 78424, 78430, 78436, 78445, 78454, 78466, 78478,
- 78484, 78490, 78496, 78503, 78510, 78517, 78524, 78531, 0, 78538, 78545,
- 78552, 78560, 78567, 0, 78574, 0, 78581, 78588, 0, 78595, 78603, 0,
- 78610, 78617, 78624, 78631, 78638, 78645, 78652, 78659, 78666, 78673,
- 78678, 78685, 78692, 78698, 78704, 78710, 78716, 78722, 78728, 78734,
- 78740, 78746, 78752, 78758, 78764, 78770, 78776, 78782, 78788, 78794,
- 78800, 78806, 78812, 78818, 78824, 78830, 78836, 78842, 78848, 78854,
- 78860, 78866, 78872, 78878, 78884, 78890, 78896, 78902, 78908, 78914,
- 78920, 78926, 78932, 78938, 78944, 78950, 78956, 78962, 78968, 78974,
- 78980, 78986, 78992, 78998, 79004, 79010, 79016, 79022, 79028, 79034,
- 79040, 79046, 79052, 79058, 79064, 79070, 79076, 79082, 79088, 79094,
- 79100, 79106, 79112, 79118, 79124, 79130, 79136, 79142, 79148, 79156,
- 79164, 79170, 79176, 79182, 79188, 79197, 79206, 79214, 79222, 79230,
- 79238, 79246, 79254, 79262, 79270, 79277, 79284, 79294, 79304, 79308,
- 79312, 79317, 79322, 79327, 79332, 79341, 79350, 79356, 79362, 79369,
- 79376, 79383, 79387, 79393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 79399, 79405, 79411, 79417, 79423, 79428, 79433, 79439, 79445,
- 79451, 79457, 79465, 79471, 79477, 79485, 79493, 79501, 79509, 79514,
- 79519, 79524, 79529, 79542, 79555, 79565, 79575, 79586, 79597, 79608,
- 79619, 79629, 79639, 79650, 79661, 79672, 79683, 79693, 79703, 79713,
- 79729, 79745, 79761, 79768, 79775, 79782, 79789, 79799, 79809, 79819,
- 79831, 79841, 79849, 79857, 79866, 79874, 79884, 79892, 79900, 79908,
- 79917, 79925, 79935, 79943, 79951, 79959, 79969, 79977, 79984, 79991,
- 79998, 80005, 80013, 80021, 80029, 80037, 80045, 80054, 80062, 80070,
- 80078, 80086, 80094, 80103, 80111, 80119, 80127, 80135, 80143, 80151,
- 80159, 80167, 80175, 80183, 80192, 80200, 80210, 80218, 80226, 80234,
- 80244, 80252, 80260, 80268, 80276, 80285, 80294, 80302, 80312, 80320,
- 80328, 80336, 80345, 80353, 80363, 80371, 80378, 80385, 80393, 80400,
- 80409, 80416, 80424, 80432, 80441, 80449, 80459, 80467, 80475, 80483,
- 80493, 80501, 80508, 80515, 80523, 80530, 80539, 80546, 80556, 80566,
- 80577, 80586, 80595, 80604, 80613, 80622, 80632, 80643, 80654, 80664,
- 80675, 80687, 80697, 80706, 80715, 80723, 80732, 80742, 80750, 80759,
- 80768, 80776, 80785, 80795, 80803, 80812, 80821, 80829, 80838, 80848,
- 80856, 80866, 80874, 80884, 80892, 80900, 80909, 80917, 80927, 80935,
- 80943, 80953, 80961, 80968, 80975, 80984, 80993, 81001, 81010, 81020,
- 81028, 81039, 81047, 81055, 81062, 81070, 81079, 81086, 81096, 81106,
- 81117, 81127, 81138, 81146, 81154, 81163, 81171, 81180, 81188, 81196,
- 81205, 81213, 81222, 81230, 81237, 81244, 81251, 81258, 81266, 81274,
- 81282, 81290, 81299, 81307, 81315, 81324, 81332, 81340, 81348, 81357,
- 81365, 81373, 81381, 81389, 81397, 81405, 81413, 81421, 81429, 81438,
- 81446, 81454, 81462, 81470, 81478, 81487, 81496, 81504, 81512, 81520,
- 81529, 81537, 81546, 81553, 81560, 81568, 81575, 81583, 81591, 81600,
- 81608, 81617, 81625, 81633, 81643, 81650, 81657, 81665, 81672, 81680,
- 81690, 81701, 81709, 81718, 81726, 81735, 81743, 81752, 81760, 81769,
- 81777, 81786, 81795, 81803, 81811, 81819, 81828, 81835, 81843, 81852,
- 81861, 81870, 81880, 81888, 81898, 81906, 81916, 81924, 81934, 81942,
- 81952, 81960, 81969, 81976, 81985, 81992, 82002, 82010, 82020, 82028,
- 82038, 82046, 82054, 82062, 82071, 82079, 82088, 82097, 82106, 82115,
- 82125, 82133, 82143, 82151, 82161, 82169, 82179, 82187, 82197, 82205,
- 82214, 82221, 82230, 82237, 82247, 82255, 82265, 82273, 82283, 82291,
- 82299, 82307, 82316, 82324, 82333, 82342, 82351, 82360, 82368, 82376,
- 82385, 82393, 82402, 82411, 82419, 82427, 82435, 82444, 82452, 82460,
- 82469, 82477, 82485, 82493, 82501, 82506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 82511, 82521, 82531, 82541, 82551, 82562, 82572, 82582,
- 82593, 82602, 82611, 82620, 82631, 82641, 82651, 82663, 82673, 82683,
- 82693, 82703, 82713, 82723, 82733, 82743, 82753, 82763, 82773, 82784,
- 82795, 82805, 82815, 82827, 82838, 82849, 82859, 82869, 82879, 82889,
- 82899, 82909, 82919, 82931, 82941, 82951, 82963, 82974, 82985, 82995,
- 83005, 83015, 83025, 83037, 83047, 83057, 83068, 83079, 83089, 83099,
- 83108, 83117, 83126, 83135, 83144, 83154, 0, 0, 83164, 83174, 83184,
- 83194, 83204, 83216, 83226, 83236, 83248, 83258, 83270, 83279, 83288,
- 83299, 83309, 83321, 83332, 83345, 83355, 83367, 83376, 83387, 83398,
- 83411, 83421, 83431, 83441, 83451, 83461, 83470, 83479, 83488, 83497,
- 83507, 83517, 83527, 83537, 83547, 83557, 83567, 83577, 83587, 83597,
- 83607, 83617, 83626, 83635, 83644, 83654, 83664, 83674, 83684, 83694,
- 83705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83715, 83730,
- 83745, 83751, 83757, 83763, 83769, 83775, 83781, 83787, 83793, 83801,
- 83805, 83808, 0, 0, 83816, 83819, 83822, 83825, 83828, 83831, 83834,
- 83837, 83840, 83843, 83846, 83849, 83852, 83855, 83858, 83861, 83864,
- 83872, 83881, 83892, 83900, 83908, 83917, 83926, 83937, 83949, 0, 0, 0,
- 0, 0, 0, 83958, 83963, 83968, 83975, 83982, 83988, 83994, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 83999, 84009, 84019, 84029, 84038, 84049, 84058, 84067,
- 84077, 84087, 84099, 84111, 84122, 84133, 84144, 84155, 84165, 84175,
- 84185, 84195, 84206, 84217, 84221, 84226, 84235, 84244, 84248, 84252,
- 84256, 84261, 84266, 84271, 84276, 84279, 84283, 0, 84288, 84291, 84294,
- 84298, 84302, 84307, 84311, 84315, 84320, 84325, 84332, 84339, 84342,
- 84345, 84348, 84351, 84354, 84358, 84362, 0, 84366, 84371, 84375, 84379,
- 0, 0, 0, 0, 84384, 84389, 84396, 84401, 84406, 0, 84411, 84416, 84421,
- 84426, 84431, 84436, 84441, 84446, 84451, 84456, 84461, 84466, 84475,
- 84484, 84492, 84500, 84509, 84518, 84527, 84536, 84544, 84552, 84560,
- 84568, 84573, 84578, 84584, 84590, 84596, 84602, 84610, 84618, 84624,
- 84630, 84636, 84642, 84648, 84654, 84660, 84666, 84671, 84676, 84681,
- 84686, 84691, 84696, 84701, 84706, 84712, 84718, 84724, 84730, 84736,
- 84742, 84748, 84754, 84760, 84766, 84772, 84778, 84784, 84790, 84796,
- 84802, 84808, 84814, 84820, 84826, 84832, 84838, 84844, 84850, 84856,
- 84862, 84868, 84874, 84880, 84886, 84892, 84898, 84904, 84910, 84916,
- 84922, 84928, 84934, 84940, 84946, 84952, 84958, 84964, 84970, 84976,
- 84982, 84988, 84994, 85000, 85006, 85012, 85018, 85024, 85030, 85036,
- 85042, 85048, 85054, 85060, 85066, 85071, 85076, 85081, 85086, 85092,
- 85098, 85104, 85110, 85116, 85122, 85128, 85134, 85140, 85146, 85153,
- 85160, 85165, 85170, 85175, 85180, 85192, 85204, 85215, 85226, 85238,
- 85250, 85258, 0, 0, 85266, 0, 85274, 85278, 85282, 85285, 85289, 85293,
- 85296, 85299, 85303, 85307, 85310, 85313, 85316, 85319, 85324, 85327,
- 85331, 85334, 85337, 85340, 85343, 85346, 85349, 85352, 85355, 85358,
- 85361, 85364, 85368, 85372, 85376, 85380, 85385, 85390, 85396, 85402,
- 85408, 85413, 85419, 85425, 85431, 85436, 85442, 85448, 85453, 85458,
- 85464, 85469, 85475, 85481, 85486, 85492, 85498, 85503, 85509, 85515,
- 85521, 85527, 85533, 85537, 85542, 85546, 85551, 85555, 85560, 85565,
- 85571, 85577, 85583, 85588, 85594, 85600, 85606, 85611, 85617, 85623,
- 85628, 85633, 85639, 85644, 85650, 85656, 85661, 85667, 85673, 85678,
- 85684, 85690, 85696, 85702, 85708, 85713, 85717, 85722, 85724, 85729,
- 85734, 85740, 85745, 85750, 85754, 85760, 85765, 85770, 85775, 85780,
- 85785, 85790, 85795, 85801, 85807, 85813, 85821, 85825, 85829, 85833,
- 85837, 85841, 85845, 85850, 85855, 85860, 85865, 85869, 85874, 85879,
- 85884, 85889, 85894, 85899, 85904, 85909, 85913, 85917, 85922, 85927,
- 85932, 85937, 85941, 85946, 85951, 85956, 85961, 85965, 85970, 85975,
- 85980, 85985, 85989, 85994, 85999, 86003, 86008, 86013, 86018, 86023,
- 86028, 86033, 86040, 86047, 86051, 86056, 86061, 86066, 86071, 86076,
- 86081, 86086, 86091, 86096, 86101, 86106, 86111, 86116, 86121, 86126,
- 86131, 86136, 86141, 86146, 86151, 86156, 86161, 86166, 86171, 86176,
- 86181, 86186, 86191, 86196, 0, 0, 0, 86201, 86205, 86210, 86214, 86219,
- 86224, 0, 0, 86228, 86233, 86238, 86242, 86247, 86252, 0, 0, 86257,
- 86262, 86266, 86271, 86276, 86281, 0, 0, 86286, 86291, 86296, 0, 0, 0,
- 86300, 86304, 86308, 86312, 86315, 86319, 86323, 0, 86327, 86333, 86336,
- 86340, 86343, 86347, 86351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86355, 86361,
- 86367, 86373, 86379, 0, 0, 86383, 86389, 86395, 86401, 86407, 86413,
- 86420, 86427, 86434, 86441, 86448, 86455, 0, 86462, 86469, 86476, 86482,
- 86489, 86496, 86503, 86510, 86516, 86523, 86530, 86537, 86544, 86550,
- 86557, 86564, 86571, 86578, 86584, 86591, 86598, 86605, 86612, 86619,
- 86626, 86633, 0, 86640, 86646, 86653, 86660, 86667, 86674, 86680, 86687,
- 86694, 86701, 86708, 86715, 86722, 86729, 86735, 86742, 86749, 86756,
- 86763, 0, 86770, 86777, 0, 86784, 86791, 86798, 86805, 86812, 86819,
- 86826, 86833, 86840, 86847, 86854, 86861, 86868, 86875, 86882, 0, 0,
- 86888, 86893, 86898, 86903, 86908, 86913, 86918, 86923, 86928, 86933,
- 86938, 86943, 86948, 86953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86958, 86965,
- 86972, 86979, 86986, 86993, 87000, 87007, 87014, 87021, 87028, 87035,
- 87042, 87049, 87056, 87063, 87070, 87077, 87084, 87091, 87099, 87107,
- 87114, 87121, 87126, 87134, 87142, 87149, 87156, 87161, 87168, 87173,
- 87178, 87185, 87190, 87195, 87200, 87208, 87213, 87218, 87225, 87230,
- 87235, 87242, 87249, 87254, 87259, 87264, 87269, 87274, 87279, 87284,
- 87289, 87294, 87301, 87306, 87313, 87318, 87323, 87328, 87333, 87338,
- 87343, 87348, 87353, 87358, 87363, 87368, 87375, 87382, 87389, 87396,
- 87402, 87407, 87414, 87419, 87424, 87433, 87440, 87449, 87456, 87461,
- 87466, 87474, 87479, 87484, 87489, 87494, 87499, 87506, 87511, 87516,
- 87521, 87526, 87531, 87538, 87545, 87552, 87559, 87566, 87573, 87580,
- 87587, 87594, 87601, 87608, 87615, 87622, 87629, 87636, 87643, 87650,
- 87657, 87664, 87671, 87678, 87685, 87692, 87699, 87706, 87713, 87720,
- 87727, 0, 0, 0, 0, 0, 87734, 87742, 87750, 0, 0, 0, 0, 87755, 87759,
- 87763, 87767, 87771, 87775, 87779, 87783, 87787, 87791, 87796, 87801,
- 87806, 87811, 87816, 87821, 87826, 87831, 87836, 87842, 87848, 87854,
- 87861, 87868, 87875, 87882, 87889, 87896, 87902, 87908, 87914, 87921,
- 87928, 87935, 87942, 87949, 87956, 87963, 87970, 87977, 87984, 87991,
- 87998, 88005, 88012, 0, 0, 0, 88019, 88027, 88035, 88043, 88051, 88059,
- 88069, 88079, 88087, 88095, 88103, 88111, 88119, 88125, 88132, 88141,
- 88150, 88159, 88168, 88177, 88186, 88196, 88207, 88217, 88228, 88237,
- 88246, 88255, 88265, 88276, 88286, 88297, 88308, 88317, 88325, 88331,
- 88337, 88343, 88349, 88357, 88365, 88371, 88378, 88388, 88395, 88402,
- 88409, 88416, 88423, 88433, 88440, 88447, 88455, 88463, 88472, 88481,
- 88490, 88499, 88508, 88516, 88525, 88534, 88543, 88547, 88554, 88559,
- 88564, 88568, 88572, 88576, 88580, 88585, 88590, 88596, 88602, 88606,
- 88612, 88616, 88620, 88624, 88628, 88632, 88636, 88642, 0, 0, 0, 0, 0,
- 88646, 88651, 88656, 88661, 88666, 88673, 88678, 88683, 88688, 88693,
- 88698, 88703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 78283, 78288, 78293, 78298, 78303, 78308, 78316,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78321, 78328, 78335, 78342, 78349, 0,
+ 0, 0, 0, 0, 78356, 78363, 78370, 78380, 78386, 78392, 78398, 78404,
+ 78410, 78416, 78423, 78429, 78435, 78441, 78450, 78459, 78471, 78483,
+ 78489, 78495, 78501, 78508, 78515, 78522, 78529, 78536, 0, 78543, 78550,
+ 78557, 78565, 78572, 0, 78579, 0, 78586, 78593, 0, 78600, 78608, 0,
+ 78615, 78622, 78629, 78636, 78643, 78650, 78657, 78664, 78671, 78678,
+ 78683, 78690, 78697, 78703, 78709, 78715, 78721, 78727, 78733, 78739,
+ 78745, 78751, 78757, 78763, 78769, 78775, 78781, 78787, 78793, 78799,
+ 78805, 78811, 78817, 78823, 78829, 78835, 78841, 78847, 78853, 78859,
+ 78865, 78871, 78877, 78883, 78889, 78895, 78901, 78907, 78913, 78919,
+ 78925, 78931, 78937, 78943, 78949, 78955, 78961, 78967, 78973, 78979,
+ 78985, 78991, 78997, 79003, 79009, 79015, 79021, 79027, 79033, 79039,
+ 79045, 79051, 79057, 79063, 79069, 79075, 79081, 79087, 79093, 79099,
+ 79105, 79111, 79117, 79123, 79129, 79135, 79141, 79147, 79153, 79161,
+ 79169, 79175, 79181, 79187, 79193, 79202, 79211, 79219, 79227, 79235,
+ 79243, 79251, 79259, 79267, 79275, 79282, 79289, 79299, 79309, 79313,
+ 79317, 79322, 79327, 79332, 79337, 79346, 79355, 79361, 79367, 79374,
+ 79381, 79388, 79392, 79398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 79404, 79410, 79416, 79422, 79428, 79433, 79438, 79444, 79450,
+ 79456, 79462, 79470, 79476, 79482, 79490, 79498, 79506, 79514, 79519,
+ 79524, 79529, 79534, 79547, 79560, 79570, 79580, 79591, 79602, 79613,
+ 79624, 79634, 79644, 79655, 79666, 79677, 79688, 79698, 79708, 79718,
+ 79734, 79750, 79766, 79773, 79780, 79787, 79794, 79804, 79814, 79824,
+ 79836, 79846, 79854, 79862, 79871, 79879, 79889, 79897, 79905, 79913,
+ 79922, 79930, 79940, 79948, 79956, 79964, 79974, 79982, 79989, 79996,
+ 80003, 80010, 80018, 80026, 80034, 80042, 80050, 80059, 80067, 80075,
+ 80083, 80091, 80099, 80108, 80116, 80124, 80132, 80140, 80148, 80156,
+ 80164, 80172, 80180, 80188, 80197, 80205, 80215, 80223, 80231, 80239,
+ 80249, 80257, 80265, 80273, 80281, 80290, 80299, 80307, 80317, 80325,
+ 80333, 80341, 80350, 80358, 80368, 80376, 80383, 80390, 80398, 80405,
+ 80414, 80421, 80429, 80437, 80446, 80454, 80464, 80472, 80480, 80488,
+ 80498, 80506, 80513, 80520, 80528, 80535, 80544, 80551, 80561, 80571,
+ 80582, 80591, 80600, 80609, 80618, 80627, 80637, 80648, 80659, 80669,
+ 80680, 80692, 80702, 80711, 80720, 80728, 80737, 80747, 80755, 80764,
+ 80773, 80781, 80790, 80800, 80808, 80817, 80826, 80834, 80843, 80853,
+ 80861, 80871, 80879, 80889, 80897, 80905, 80914, 80922, 80932, 80940,
+ 80948, 80958, 80966, 80973, 80980, 80989, 80998, 81006, 81015, 81025,
+ 81033, 81044, 81052, 81060, 81067, 81075, 81084, 81091, 81101, 81111,
+ 81122, 81132, 81143, 81151, 81159, 81168, 81176, 81185, 81193, 81201,
+ 81210, 81218, 81227, 81235, 81242, 81249, 81256, 81263, 81271, 81279,
+ 81287, 81295, 81304, 81312, 81320, 81329, 81337, 81345, 81353, 81362,
+ 81370, 81378, 81386, 81394, 81402, 81410, 81418, 81426, 81434, 81443,
+ 81451, 81459, 81467, 81475, 81483, 81492, 81501, 81509, 81517, 81525,
+ 81534, 81542, 81551, 81558, 81565, 81573, 81580, 81588, 81596, 81605,
+ 81613, 81622, 81630, 81638, 81648, 81655, 81662, 81670, 81677, 81685,
+ 81695, 81706, 81714, 81723, 81731, 81740, 81748, 81757, 81765, 81774,
+ 81782, 81791, 81800, 81808, 81816, 81824, 81833, 81840, 81848, 81857,
+ 81866, 81875, 81885, 81893, 81903, 81911, 81921, 81929, 81939, 81947,
+ 81957, 81965, 81974, 81981, 81990, 81997, 82007, 82015, 82025, 82033,
+ 82043, 82051, 82059, 82067, 82076, 82084, 82093, 82102, 82111, 82120,
+ 82130, 82138, 82148, 82156, 82166, 82174, 82184, 82192, 82202, 82210,
+ 82219, 82226, 82235, 82242, 82252, 82260, 82270, 82278, 82288, 82296,
+ 82304, 82312, 82321, 82329, 82338, 82347, 82356, 82365, 82373, 82381,
+ 82390, 82398, 82407, 82416, 82424, 82432, 82440, 82449, 82457, 82465,
+ 82474, 82482, 82490, 82498, 82506, 82511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 82516, 82526, 82536, 82546, 82556, 82567, 82577, 82587,
+ 82598, 82607, 82616, 82625, 82636, 82646, 82656, 82668, 82678, 82688,
+ 82698, 82708, 82718, 82728, 82738, 82748, 82758, 82768, 82778, 82789,
+ 82800, 82810, 82820, 82832, 82843, 82854, 82864, 82874, 82884, 82894,
+ 82904, 82914, 82924, 82936, 82946, 82956, 82968, 82979, 82990, 83000,
+ 83010, 83020, 83030, 83042, 83052, 83062, 83073, 83084, 83094, 83104,
+ 83113, 83122, 83131, 83140, 83149, 83159, 0, 0, 83169, 83179, 83189,
+ 83199, 83209, 83221, 83231, 83241, 83253, 83263, 83275, 83284, 83293,
+ 83304, 83314, 83326, 83337, 83350, 83360, 83372, 83381, 83392, 83403,
+ 83416, 83426, 83436, 83446, 83456, 83466, 83475, 83484, 83493, 83502,
+ 83512, 83522, 83532, 83542, 83552, 83562, 83572, 83582, 83592, 83602,
+ 83612, 83622, 83631, 83640, 83649, 83659, 83669, 83679, 83689, 83699,
+ 83710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83720, 83735,
+ 83750, 83756, 83762, 83768, 83774, 83780, 83786, 83792, 83798, 83806,
+ 83810, 83813, 0, 0, 83821, 83824, 83827, 83830, 83833, 83836, 83839,
+ 83842, 83845, 83848, 83851, 83854, 83857, 83860, 83863, 83866, 83869,
+ 83877, 83886, 83897, 83905, 83913, 83922, 83931, 83942, 83954, 0, 0, 0,
+ 0, 0, 0, 83963, 83968, 83973, 83980, 83987, 83993, 83999, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84004, 84014, 84024, 84034, 84043, 84054, 84063, 84072,
+ 84082, 84092, 84104, 84116, 84127, 84138, 84149, 84160, 84170, 84180,
+ 84190, 84200, 84211, 84222, 84226, 84231, 84240, 84249, 84253, 84257,
+ 84261, 84266, 84271, 84276, 84281, 84284, 84288, 0, 84293, 84296, 84299,
+ 84303, 84307, 84312, 84316, 84320, 84325, 84330, 84337, 84344, 84347,
+ 84350, 84353, 84356, 84359, 84363, 84367, 0, 84371, 84376, 84380, 84384,
+ 0, 0, 0, 0, 84389, 84394, 84401, 84406, 84411, 0, 84416, 84421, 84426,
+ 84431, 84436, 84441, 84446, 84451, 84456, 84461, 84466, 84471, 84480,
+ 84489, 84497, 84505, 84514, 84523, 84532, 84541, 84549, 84557, 84565,
+ 84573, 84578, 84583, 84589, 84595, 84601, 84607, 84615, 84623, 84629,
+ 84635, 84641, 84647, 84653, 84659, 84665, 84671, 84676, 84681, 84686,
+ 84691, 84696, 84701, 84706, 84711, 84717, 84723, 84729, 84735, 84741,
+ 84747, 84753, 84759, 84765, 84771, 84777, 84783, 84789, 84795, 84801,
+ 84807, 84813, 84819, 84825, 84831, 84837, 84843, 84849, 84855, 84861,
+ 84867, 84873, 84879, 84885, 84891, 84897, 84903, 84909, 84915, 84921,
+ 84927, 84933, 84939, 84945, 84951, 84957, 84963, 84969, 84975, 84981,
+ 84987, 84993, 84999, 85005, 85011, 85017, 85023, 85029, 85035, 85041,
+ 85047, 85053, 85059, 85065, 85071, 85076, 85081, 85086, 85091, 85097,
+ 85103, 85109, 85115, 85121, 85127, 85133, 85139, 85145, 85151, 85158,
+ 85165, 85170, 85175, 85180, 85185, 85197, 85209, 85220, 85231, 85243,
+ 85255, 85263, 0, 0, 85271, 0, 85279, 85283, 85287, 85290, 85294, 85298,
+ 85301, 85304, 85308, 85312, 85315, 85318, 85321, 85324, 85329, 85332,
+ 85336, 85339, 85342, 85345, 85348, 85351, 85354, 85357, 85360, 85363,
+ 85366, 85369, 85373, 85377, 85381, 85385, 85390, 85395, 85401, 85407,
+ 85413, 85418, 85424, 85430, 85436, 85441, 85447, 85453, 85458, 85463,
+ 85469, 85474, 85480, 85486, 85491, 85497, 85503, 85508, 85514, 85520,
+ 85526, 85532, 85538, 85542, 85547, 85551, 85556, 85560, 85565, 85570,
+ 85576, 85582, 85588, 85593, 85599, 85605, 85611, 85616, 85622, 85628,
+ 85633, 85638, 85644, 85649, 85655, 85661, 85666, 85672, 85678, 85683,
+ 85689, 85695, 85701, 85707, 85713, 85718, 85722, 85727, 85729, 85734,
+ 85739, 85745, 85750, 85755, 85759, 85765, 85770, 85775, 85780, 85785,
+ 85790, 85795, 85800, 85806, 85812, 85818, 85826, 85830, 85834, 85838,
+ 85842, 85846, 85850, 85855, 85860, 85865, 85870, 85874, 85879, 85884,
+ 85889, 85894, 85899, 85904, 85909, 85914, 85918, 85922, 85927, 85932,
+ 85937, 85942, 85946, 85951, 85956, 85961, 85966, 85970, 85975, 85980,
+ 85985, 85990, 85994, 85999, 86004, 86008, 86013, 86018, 86023, 86028,
+ 86033, 86038, 86045, 86052, 86056, 86061, 86066, 86071, 86076, 86081,
+ 86086, 86091, 86096, 86101, 86106, 86111, 86116, 86121, 86126, 86131,
+ 86136, 86141, 86146, 86151, 86156, 86161, 86166, 86171, 86176, 86181,
+ 86186, 86191, 86196, 86201, 0, 0, 0, 86206, 86210, 86215, 86219, 86224,
+ 86229, 0, 0, 86233, 86238, 86243, 86247, 86252, 86257, 0, 0, 86262,
+ 86267, 86271, 86276, 86281, 86286, 0, 0, 86291, 86296, 86301, 0, 0, 0,
+ 86305, 86309, 86313, 86317, 86320, 86324, 86328, 0, 86332, 86338, 86341,
+ 86345, 86348, 86352, 86356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86360, 86366,
+ 86372, 86378, 86384, 0, 0, 86388, 86394, 86400, 86406, 86412, 86418,
+ 86425, 86432, 86439, 86446, 86453, 86460, 0, 86467, 86474, 86481, 86487,
+ 86494, 86501, 86508, 86515, 86521, 86528, 86535, 86542, 86549, 86555,
+ 86562, 86569, 86576, 86583, 86589, 86596, 86603, 86610, 86617, 86624,
+ 86631, 86638, 0, 86645, 86651, 86658, 86665, 86672, 86679, 86685, 86692,
+ 86699, 86706, 86713, 86720, 86727, 86734, 86740, 86747, 86754, 86761,
+ 86768, 0, 86775, 86782, 0, 86789, 86796, 86803, 86810, 86817, 86824,
+ 86831, 86838, 86845, 86852, 86859, 86866, 86873, 86880, 86887, 0, 0,
+ 86893, 86898, 86903, 86908, 86913, 86918, 86923, 86928, 86933, 86938,
+ 86943, 86948, 86953, 86958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86963, 86970,
+ 86977, 86984, 86991, 86998, 87005, 87012, 87019, 87026, 87033, 87040,
+ 87047, 87054, 87061, 87068, 87075, 87082, 87089, 87096, 87104, 87112,
+ 87119, 87126, 87131, 87139, 87147, 87154, 87161, 87166, 87173, 87178,
+ 87183, 87190, 87195, 87200, 87205, 87213, 87218, 87223, 87230, 87235,
+ 87240, 87247, 87254, 87259, 87264, 87269, 87274, 87279, 87284, 87289,
+ 87294, 87299, 87306, 87311, 87318, 87323, 87328, 87333, 87338, 87343,
+ 87348, 87353, 87358, 87363, 87368, 87373, 87380, 87387, 87394, 87401,
+ 87407, 87412, 87419, 87424, 87429, 87438, 87445, 87454, 87461, 87466,
+ 87471, 87479, 87484, 87489, 87494, 87499, 87504, 87511, 87516, 87521,
+ 87526, 87531, 87536, 87543, 87550, 87557, 87564, 87571, 87578, 87585,
+ 87592, 87599, 87606, 87613, 87620, 87627, 87634, 87641, 87648, 87655,
+ 87662, 87669, 87676, 87683, 87690, 87697, 87704, 87711, 87718, 87725,
+ 87732, 0, 0, 0, 0, 0, 87739, 87747, 87755, 0, 0, 0, 0, 87760, 87764,
+ 87768, 87772, 87776, 87780, 87784, 87788, 87792, 87796, 87801, 87806,
+ 87811, 87816, 87821, 87826, 87831, 87836, 87841, 87847, 87853, 87859,
+ 87866, 87873, 87880, 87887, 87894, 87901, 87907, 87913, 87919, 87926,
+ 87933, 87940, 87947, 87954, 87961, 87968, 87975, 87982, 87989, 87996,
+ 88003, 88010, 88017, 0, 0, 0, 88024, 88032, 88040, 88048, 88056, 88064,
+ 88074, 88084, 88092, 88100, 88108, 88116, 88124, 88130, 88137, 88146,
+ 88155, 88164, 88173, 88182, 88191, 88201, 88212, 88222, 88233, 88242,
+ 88251, 88260, 88270, 88281, 88291, 88302, 88313, 88322, 88330, 88336,
+ 88342, 88348, 88354, 88362, 88370, 88376, 88383, 88393, 88400, 88407,
+ 88414, 88421, 88428, 88438, 88445, 88452, 88460, 88468, 88477, 88486,
+ 88495, 88504, 88513, 88521, 88530, 88539, 88548, 88552, 88559, 88564,
+ 88569, 88573, 88577, 88581, 88585, 88590, 88595, 88601, 88607, 88611,
+ 88617, 88621, 88625, 88629, 88633, 88637, 88641, 88647, 0, 0, 0, 0, 0,
+ 88651, 88656, 88661, 88666, 88671, 88678, 88683, 88688, 88693, 88698,
+ 88703, 88708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88708, 88715, 88724, 88733, 88740, 88747, 88754,
- 88761, 88768, 88775, 88781, 88788, 88795, 88802, 88809, 88816, 88823,
- 88830, 88837, 88846, 88853, 88860, 88867, 88874, 88881, 88888, 88895,
- 88902, 88911, 88918, 88925, 88932, 88939, 88946, 88953, 88962, 88969,
- 88976, 88983, 88990, 88999, 89006, 89013, 89020, 89028, 89037, 0, 0,
- 89046, 89050, 89054, 89059, 89064, 89069, 89074, 89078, 89083, 89088,
- 89093, 89098, 89103, 89108, 89112, 89116, 89121, 89126, 89131, 89135,
- 89140, 89145, 89149, 89154, 89159, 89164, 89169, 89174, 89179, 0, 0, 0,
- 89184, 89188, 89193, 89198, 89202, 89207, 89211, 89216, 89221, 89226,
- 89231, 89235, 89239, 89244, 89249, 89254, 89259, 89264, 89269, 89273,
- 89278, 89283, 89288, 89293, 89298, 89303, 89307, 89311, 89316, 89321,
- 89326, 89331, 89336, 89341, 89346, 89351, 89356, 89361, 89366, 89371,
- 89376, 89381, 89386, 89391, 89396, 89401, 89406, 89411, 89416, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88713, 88720, 88729, 88738, 88745, 88752, 88759,
+ 88766, 88773, 88780, 88786, 88793, 88800, 88807, 88814, 88821, 88828,
+ 88835, 88842, 88851, 88858, 88865, 88872, 88879, 88886, 88893, 88900,
+ 88907, 88916, 88923, 88930, 88937, 88944, 88951, 88958, 88967, 88974,
+ 88981, 88988, 88995, 89004, 89011, 89018, 89025, 89033, 89042, 0, 0,
+ 89051, 89055, 89059, 89064, 89069, 89074, 89079, 89083, 89088, 89093,
+ 89098, 89103, 89108, 89113, 89117, 89121, 89126, 89131, 89136, 89140,
+ 89145, 89150, 89154, 89159, 89164, 89169, 89174, 89179, 89184, 0, 0, 0,
+ 89189, 89193, 89198, 89203, 89207, 89212, 89216, 89221, 89226, 89231,
+ 89236, 89240, 89244, 89249, 89254, 89259, 89264, 89269, 89274, 89278,
+ 89283, 89288, 89293, 89298, 89303, 89308, 89312, 89316, 89321, 89326,
+ 89331, 89336, 89341, 89346, 89351, 89356, 89361, 89366, 89371, 89376,
+ 89381, 89386, 89391, 89396, 89401, 89406, 89411, 89416, 89421, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89421, 89425,
- 89430, 89435, 89440, 89444, 89449, 89454, 89459, 89464, 89468, 89472,
- 89477, 89482, 89487, 89492, 89496, 89501, 89506, 89511, 89516, 89521,
- 89526, 89530, 89535, 89540, 89545, 89550, 89555, 89560, 89565, 0, 89570,
- 89575, 89580, 89586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89592, 89597,
- 89602, 89607, 89612, 89617, 89622, 89627, 89632, 89637, 89642, 89647,
- 89652, 89657, 89662, 89667, 89672, 89677, 89682, 89687, 89692, 89697,
- 89702, 89707, 89712, 89717, 89722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89426, 89430,
+ 89435, 89440, 89445, 89449, 89454, 89459, 89464, 89469, 89473, 89477,
+ 89482, 89487, 89492, 89497, 89501, 89506, 89511, 89516, 89521, 89526,
+ 89531, 89535, 89540, 89545, 89550, 89555, 89560, 89565, 89570, 0, 89575,
+ 89580, 89585, 89591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89597, 89602,
+ 89607, 89612, 89617, 89622, 89627, 89632, 89637, 89642, 89647, 89652,
+ 89657, 89662, 89667, 89672, 89677, 89682, 89687, 89692, 89697, 89702,
+ 89707, 89712, 89717, 89722, 89727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89729, 89734, 89739,
- 89744, 89749, 89754, 89759, 89764, 89769, 89774, 89779, 89784, 89789,
- 89794, 89799, 89804, 89809, 89814, 89819, 89824, 89829, 89834, 89839,
- 89844, 89849, 89854, 89859, 89863, 89867, 89871, 0, 89876, 89882, 89887,
- 89892, 89897, 89902, 89908, 89914, 89920, 89926, 89932, 89938, 89944,
- 89950, 89956, 89962, 89968, 89974, 89980, 89985, 89991, 89997, 90002,
- 90008, 90013, 90019, 90025, 90030, 90036, 90042, 90047, 90053, 90059,
- 90064, 90070, 90076, 90082, 0, 0, 0, 0, 90087, 90093, 90099, 90105,
- 90111, 90117, 90123, 90129, 90135, 90142, 90147, 90152, 90158, 90164, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89734, 89739, 89744,
+ 89749, 89754, 89759, 89764, 89769, 89774, 89779, 89784, 89789, 89794,
+ 89799, 89804, 89809, 89814, 89819, 89824, 89829, 89834, 89839, 89844,
+ 89849, 89854, 89859, 89864, 89868, 89872, 89876, 0, 89881, 89887, 89892,
+ 89897, 89902, 89907, 89913, 89919, 89925, 89931, 89937, 89943, 89949,
+ 89955, 89961, 89967, 89973, 89979, 89985, 89990, 89996, 90002, 90007,
+ 90013, 90018, 90024, 90030, 90035, 90041, 90047, 90052, 90058, 90064,
+ 90069, 90075, 90081, 90087, 0, 0, 0, 0, 90092, 90098, 90104, 90110,
+ 90116, 90122, 90128, 90134, 90140, 90147, 90152, 90157, 90163, 90169, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90170, 90175, 90180,
- 90185, 90191, 90196, 90202, 90208, 90214, 90220, 90227, 90233, 90240,
- 90245, 90250, 90255, 90260, 90265, 90270, 90275, 90280, 90285, 90290,
- 90295, 90300, 90305, 90310, 90315, 90320, 90325, 90330, 90335, 90340,
- 90345, 90350, 90355, 90360, 90365, 90370, 90375, 90380, 90385, 90390,
- 90395, 90401, 90406, 90412, 90418, 90424, 90430, 90437, 90443, 90450,
- 90455, 90460, 90465, 90470, 90475, 90480, 90485, 90490, 90495, 90500,
- 90505, 90510, 90515, 90520, 90525, 90530, 90535, 90540, 90545, 90550,
- 90555, 90560, 90565, 90570, 90575, 90580, 90585, 90590, 90595, 90600,
- 90605, 90610, 90615, 90620, 90625, 90630, 90635, 90640, 90645, 90650,
- 90655, 90660, 90665, 90670, 90675, 90680, 90685, 90690, 90695, 90700,
- 90705, 90710, 90715, 90720, 90725, 90730, 90735, 90740, 90745, 90750,
- 90755, 90760, 90765, 90770, 90775, 90780, 90785, 90790, 90795, 90800,
- 90805, 90810, 90815, 90820, 90825, 90830, 90835, 90840, 90845, 90850,
- 90855, 90860, 90865, 90869, 90873, 90878, 90883, 90888, 90893, 90898,
- 90903, 90908, 90913, 90918, 90923, 90928, 90932, 90936, 90940, 90944,
- 90948, 90952, 90956, 90961, 90966, 0, 0, 90971, 90976, 90980, 90984,
- 90988, 90992, 90996, 91000, 91004, 91008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90175, 90180, 90185,
+ 90190, 90196, 90201, 90207, 90213, 90219, 90225, 90232, 90238, 90245,
+ 90250, 90255, 90260, 90265, 90270, 90275, 90280, 90285, 90290, 90295,
+ 90300, 90305, 90310, 90315, 90320, 90325, 90330, 90335, 90340, 90345,
+ 90350, 90355, 90360, 90365, 90370, 90375, 90380, 90385, 90390, 90395,
+ 90400, 90406, 90411, 90417, 90423, 90429, 90435, 90442, 90448, 90455,
+ 90460, 90465, 90470, 90475, 90480, 90485, 90490, 90495, 90500, 90505,
+ 90510, 90515, 90520, 90525, 90530, 90535, 90540, 90545, 90550, 90555,
+ 90560, 90565, 90570, 90575, 90580, 90585, 90590, 90595, 90600, 90605,
+ 90610, 90615, 90620, 90625, 90630, 90635, 90640, 90645, 90650, 90655,
+ 90660, 90665, 90670, 90675, 90680, 90685, 90690, 90695, 90700, 90705,
+ 90710, 90715, 90720, 90725, 90730, 90735, 90740, 90745, 90750, 90755,
+ 90760, 90765, 90770, 90775, 90780, 90785, 90790, 90795, 90800, 90805,
+ 90810, 90815, 90820, 90825, 90830, 90835, 90840, 90845, 90850, 90855,
+ 90860, 90865, 90870, 90874, 90878, 90883, 90888, 90893, 90898, 90903,
+ 90908, 90913, 90918, 90923, 90928, 90933, 90937, 90941, 90945, 90949,
+ 90953, 90957, 90961, 90966, 90971, 0, 0, 90976, 90981, 90985, 90989,
+ 90993, 90997, 91001, 91005, 91009, 91013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 91012, 91016, 91020, 91024, 91028, 91032, 0, 0, 91037, 0,
- 91042, 91046, 91051, 91056, 91061, 91066, 91071, 91076, 91081, 91086,
- 91091, 91095, 91100, 91105, 91110, 91115, 91119, 91124, 91129, 91134,
- 91139, 91143, 91148, 91153, 91158, 91163, 91167, 91172, 91177, 91182,
- 91187, 91191, 91196, 91201, 91206, 91211, 91216, 91221, 91226, 91230,
- 91235, 91240, 91245, 91250, 0, 91255, 91260, 0, 0, 0, 91265, 0, 0, 91270,
- 91275, 91282, 91289, 91296, 91303, 91310, 91317, 91324, 91331, 91338,
- 91345, 91352, 91359, 91366, 91373, 91380, 91387, 91394, 91401, 91408,
- 91415, 91422, 0, 91429, 91436, 91442, 91448, 91454, 91461, 91468, 91476,
- 91484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91493, 91498, 91503, 91508, 91513, 91518,
- 91523, 91528, 91533, 91538, 91543, 91548, 91553, 91558, 91563, 91568,
- 91573, 91578, 91583, 91588, 91593, 91598, 91603, 91607, 91612, 91617,
- 91623, 91627, 0, 0, 0, 91631, 91637, 91641, 91646, 91651, 91656, 91660,
- 91665, 91669, 91674, 91679, 91683, 91687, 91692, 91696, 91700, 91705,
- 91710, 91714, 91719, 91724, 91729, 91734, 91739, 91744, 91749, 91754, 0,
- 0, 0, 0, 0, 91759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 91017, 91021, 91025, 91029, 91033, 91037, 0, 0, 91042, 0,
+ 91047, 91051, 91056, 91061, 91066, 91071, 91076, 91081, 91086, 91091,
+ 91096, 91100, 91105, 91110, 91115, 91120, 91124, 91129, 91134, 91139,
+ 91144, 91148, 91153, 91158, 91163, 91168, 91172, 91177, 91182, 91187,
+ 91192, 91196, 91201, 91206, 91211, 91216, 91221, 91226, 91231, 91235,
+ 91240, 91245, 91250, 91255, 0, 91260, 91265, 0, 0, 0, 91270, 0, 0, 91275,
+ 91280, 91287, 91294, 91301, 91308, 91315, 91322, 91329, 91336, 91343,
+ 91350, 91357, 91364, 91371, 91378, 91385, 91392, 91399, 91406, 91413,
+ 91420, 91427, 0, 91434, 91441, 91447, 91453, 91459, 91466, 91473, 91481,
+ 91489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91498, 91503, 91508, 91513, 91518, 91523,
+ 91528, 91533, 91538, 91543, 91548, 91553, 91558, 91563, 91568, 91573,
+ 91578, 91583, 91588, 91593, 91598, 91603, 91608, 91612, 91617, 91622,
+ 91628, 91632, 0, 0, 0, 91636, 91642, 91646, 91651, 91656, 91661, 91665,
+ 91670, 91674, 91679, 91684, 91688, 91692, 91697, 91701, 91705, 91710,
+ 91715, 91719, 91724, 91729, 91734, 91739, 91744, 91749, 91754, 91759, 0,
+ 0, 0, 0, 0, 91764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91764,
- 91770, 91776, 91782, 91788, 91794, 91801, 91808, 91815, 91821, 91827,
- 91833, 91840, 91847, 91854, 91860, 91867, 91874, 91881, 91888, 91894,
- 91901, 91908, 91914, 91921, 91928, 91935, 91942, 91949, 91955, 91962,
- 91969, 91976, 91982, 91988, 91994, 92000, 92006, 92013, 92020, 92026,
- 92032, 92038, 92045, 92051, 92058, 92065, 92072, 92078, 92086, 92093,
- 92099, 92106, 92113, 92120, 92126, 0, 0, 0, 0, 0, 0, 92133, 92141, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91769,
+ 91775, 91781, 91787, 91793, 91799, 91806, 91813, 91820, 91826, 91832,
+ 91838, 91845, 91852, 91859, 91865, 91872, 91879, 91886, 91893, 91899,
+ 91906, 91913, 91919, 91926, 91933, 91940, 91947, 91954, 91960, 91967,
+ 91974, 91981, 91987, 91993, 91999, 92005, 92011, 92018, 92025, 92031,
+ 92037, 92043, 92050, 92056, 92063, 92070, 92077, 92083, 92091, 92098,
+ 92104, 92111, 92118, 92125, 92131, 0, 0, 0, 0, 0, 0, 92138, 92146, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92149, 92153, 92158, 92163, 0,
- 92169, 92174, 0, 0, 0, 0, 0, 92179, 92185, 92192, 92197, 92202, 92206,
- 92211, 92216, 0, 92221, 92226, 92231, 0, 92236, 92241, 92246, 92251,
- 92256, 92261, 92266, 92271, 92276, 92281, 92286, 92290, 92294, 92299,
- 92304, 92309, 92313, 92317, 92321, 92326, 92331, 92336, 92341, 92345,
- 92350, 92354, 92359, 0, 0, 0, 0, 92364, 92370, 92375, 0, 0, 0, 0, 92380,
- 92384, 92388, 92392, 92396, 92400, 92405, 92410, 92416, 0, 0, 0, 0, 0, 0,
- 0, 0, 92422, 92428, 92435, 92441, 92448, 92454, 92460, 92466, 92473, 0,
- 0, 0, 0, 0, 0, 0, 92479, 92487, 92495, 92503, 92511, 92519, 92527, 92535,
- 92543, 92551, 92559, 92567, 92575, 92583, 92591, 92599, 92607, 92615,
- 92623, 92631, 92639, 92647, 92655, 92663, 92671, 92679, 92687, 92695,
- 92703, 92711, 92718, 92726, 92734, 92738, 92743, 92748, 92753, 92758,
- 92763, 92768, 92773, 92777, 92782, 92786, 92791, 92795, 92800, 92804,
- 92809, 92814, 92819, 92824, 92829, 92834, 92839, 92844, 92849, 92854,
- 92859, 92864, 92869, 92874, 92879, 92884, 92889, 92894, 92899, 92904,
- 92909, 92914, 92919, 92924, 92929, 92934, 92939, 92944, 92949, 92954,
- 92959, 92964, 92969, 92974, 92979, 92984, 92989, 92994, 0, 0, 0, 92999,
- 93004, 93013, 93021, 93030, 93039, 93050, 93061, 93068, 93075, 93082,
- 93089, 93096, 93103, 93110, 93117, 93124, 93131, 93138, 93145, 93152,
- 93159, 93166, 93173, 93180, 93187, 93194, 93201, 93208, 0, 0, 93215,
- 93221, 93227, 93233, 93239, 93246, 93253, 93261, 93269, 93276, 93283,
- 93290, 93297, 93304, 93311, 93318, 93325, 93332, 93339, 93346, 93353,
- 93360, 93367, 93374, 93381, 93388, 93395, 0, 0, 0, 0, 0, 93402, 93408,
- 93414, 93420, 93426, 93433, 93440, 93448, 93456, 93462, 93468, 93475,
- 93481, 93487, 93493, 93499, 93506, 93513, 93520, 93527, 93534, 93541,
- 93548, 93555, 93562, 93569, 93576, 93583, 93590, 93597, 93604, 93611,
- 93618, 93625, 93632, 93639, 93646, 93653, 93660, 93667, 93674, 93681,
- 93688, 93695, 93702, 93709, 93716, 93723, 93730, 93737, 93744, 93751,
- 93758, 93765, 93772, 93779, 93786, 93793, 93800, 93807, 93814, 93821,
- 93828, 93835, 93842, 93849, 93856, 93863, 93870, 93877, 93884, 93891,
- 93898, 93905, 93912, 93919, 93926, 93933, 93940, 93947, 93954, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92154, 92158, 92163, 92168, 0,
+ 92174, 92179, 0, 0, 0, 0, 0, 92184, 92190, 92197, 92202, 92207, 92211,
+ 92216, 92221, 0, 92226, 92231, 92236, 0, 92241, 92246, 92251, 92256,
+ 92261, 92266, 92271, 92276, 92281, 92286, 92291, 92295, 92299, 92304,
+ 92309, 92314, 92318, 92322, 92326, 92331, 92336, 92341, 92346, 92350,
+ 92355, 92359, 92364, 0, 0, 0, 0, 92369, 92375, 92380, 0, 0, 0, 0, 92385,
+ 92389, 92393, 92397, 92401, 92405, 92410, 92415, 92421, 0, 0, 0, 0, 0, 0,
+ 0, 0, 92427, 92433, 92440, 92446, 92453, 92459, 92465, 92471, 92478, 0,
+ 0, 0, 0, 0, 0, 0, 92484, 92492, 92500, 92508, 92516, 92524, 92532, 92540,
+ 92548, 92556, 92564, 92572, 92580, 92588, 92596, 92604, 92612, 92620,
+ 92628, 92636, 92644, 92652, 92660, 92668, 92676, 92684, 92692, 92700,
+ 92708, 92716, 92723, 92731, 92739, 92743, 92748, 92753, 92758, 92763,
+ 92768, 92773, 92778, 92782, 92787, 92791, 92796, 92800, 92805, 92809,
+ 92814, 92819, 92824, 92829, 92834, 92839, 92844, 92849, 92854, 92859,
+ 92864, 92869, 92874, 92879, 92884, 92889, 92894, 92899, 92904, 92909,
+ 92914, 92919, 92924, 92929, 92934, 92939, 92944, 92949, 92954, 92959,
+ 92964, 92969, 92974, 92979, 92984, 92989, 92994, 92999, 0, 0, 0, 93004,
+ 93009, 93018, 93026, 93035, 93044, 93055, 93066, 93073, 93080, 93087,
+ 93094, 93101, 93108, 93115, 93122, 93129, 93136, 93143, 93150, 93157,
+ 93164, 93171, 93178, 93185, 93192, 93199, 93206, 93213, 0, 0, 93220,
+ 93226, 93232, 93238, 93244, 93251, 93258, 93266, 93274, 93281, 93288,
+ 93295, 93302, 93309, 93316, 93323, 93330, 93337, 93344, 93351, 93358,
+ 93365, 93372, 93379, 93386, 93393, 93400, 0, 0, 0, 0, 0, 93407, 93413,
+ 93419, 93425, 93431, 93438, 93445, 93453, 93461, 93467, 93473, 93480,
+ 93486, 93492, 93498, 93504, 93511, 93518, 93525, 93532, 93539, 93546,
+ 93553, 93560, 93567, 93574, 93581, 93588, 93595, 93602, 93609, 93616,
+ 93623, 93630, 93637, 93644, 93651, 93658, 93665, 93672, 93679, 93686,
+ 93693, 93700, 93707, 93714, 93721, 93728, 93735, 93742, 93749, 93756,
+ 93763, 93770, 93777, 93784, 93791, 93798, 93805, 93812, 93819, 93826,
+ 93833, 93840, 93847, 93854, 93861, 93868, 93875, 93882, 93889, 93896,
+ 93903, 93910, 93917, 93924, 93931, 93938, 93945, 93952, 93959, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 93961, 93965, 93969, 93973, 93977, 93981, 93985, 93989,
- 93993, 93997, 94002, 94007, 94012, 94017, 94022, 94027, 94032, 94037,
- 94042, 94048, 94054, 94060, 94067, 94074, 94081, 94088, 94095, 94102,
- 94109, 94116, 94123, 0, 94130, 94134, 94138, 94142, 94146, 94150, 94153,
- 94157, 94160, 94164, 94167, 94171, 94175, 94180, 94184, 94189, 94192,
- 94196, 94199, 94203, 94206, 94210, 94214, 94218, 94222, 94226, 94230,
- 94234, 94238, 94242, 94246, 94250, 94254, 94258, 94262, 94266, 94270,
- 94274, 94278, 94281, 94284, 94288, 94292, 94296, 94299, 94302, 94305,
- 94309, 94313, 94317, 94321, 94324, 94327, 94331, 94337, 94343, 94349,
- 94354, 94361, 94365, 94370, 94374, 94379, 94384, 94390, 94395, 94401,
- 94405, 94410, 94414, 94419, 94422, 94425, 94429, 94434, 94440, 94445,
- 94451, 0, 0, 0, 0, 94456, 94459, 94462, 94465, 94468, 94471, 94474,
- 94477, 94480, 94483, 94487, 94491, 94495, 94499, 94503, 94507, 94511,
- 94515, 94519, 94524, 94529, 94533, 94536, 94539, 94542, 94545, 94548,
- 94551, 94554, 94557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 94560, 94565, 94570, 94575, 94579, 94584, 94588, 94593, 94597, 94602,
- 94606, 94611, 94615, 94620, 94624, 94629, 94634, 94639, 94644, 94649,
- 94654, 94659, 94664, 94669, 94674, 94679, 94684, 94689, 94694, 94699,
- 94704, 94709, 94714, 94719, 94724, 94728, 94732, 94737, 94742, 94747,
- 94751, 94755, 94759, 94764, 94769, 94774, 94779, 94783, 94787, 94793,
- 94798, 94804, 94809, 94815, 94820, 94826, 94831, 94837, 94842, 94847,
- 94852, 94857, 94861, 94866, 94872, 94876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 94881, 94888, 94895, 94902, 94909, 94916, 94923, 94930,
- 94937, 94944, 94951, 94958, 94965, 94972, 94979, 94986, 94993, 95000,
- 95007, 95014, 95021, 95028, 95035, 95042, 95049, 0, 0, 0, 0, 0, 0, 0,
- 95056, 95063, 95069, 95075, 95081, 95087, 95093, 95099, 95105, 95111, 0,
- 0, 0, 0, 0, 0, 95117, 95122, 95127, 95132, 95137, 95141, 95145, 95149,
- 95154, 95159, 95164, 95169, 95174, 95179, 95184, 95189, 95194, 95199,
- 95204, 95209, 95214, 95219, 95224, 95229, 95234, 95239, 95244, 95249,
- 95254, 95259, 95264, 95269, 95274, 95279, 95284, 95289, 95294, 95299,
- 95304, 95309, 95314, 95319, 95325, 95330, 95336, 95341, 95347, 95352,
- 95358, 95364, 95368, 95373, 95377, 0, 95381, 95386, 95390, 95394, 95398,
- 95402, 95406, 95410, 95414, 95418, 95422, 95427, 95431, 95436, 0, 0, 0,
+ 0, 0, 0, 0, 93966, 93970, 93974, 93978, 93982, 93986, 93990, 93994,
+ 93998, 94002, 94007, 94012, 94017, 94022, 94027, 94032, 94037, 94042,
+ 94047, 94053, 94059, 94065, 94072, 94079, 94086, 94093, 94100, 94107,
+ 94114, 94121, 94128, 0, 94135, 94139, 94143, 94147, 94151, 94155, 94158,
+ 94162, 94165, 94169, 94172, 94176, 94180, 94185, 94189, 94194, 94197,
+ 94201, 94204, 94208, 94211, 94215, 94219, 94223, 94227, 94231, 94235,
+ 94239, 94243, 94247, 94251, 94255, 94259, 94263, 94267, 94271, 94275,
+ 94279, 94283, 94286, 94289, 94293, 94297, 94301, 94304, 94307, 94310,
+ 94314, 94318, 94322, 94326, 94329, 94332, 94336, 94342, 94348, 94354,
+ 94359, 94366, 94370, 94375, 94379, 94384, 94389, 94395, 94400, 94406,
+ 94410, 94415, 94419, 94424, 94427, 94430, 94434, 94439, 94445, 94450,
+ 94456, 0, 0, 0, 0, 94461, 94464, 94467, 94470, 94473, 94476, 94479,
+ 94482, 94485, 94488, 94492, 94496, 94500, 94504, 94508, 94512, 94516,
+ 94520, 94524, 94529, 94534, 94538, 94541, 94544, 94547, 94550, 94553,
+ 94556, 94559, 94562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 94565, 94570, 94575, 94580, 94584, 94589, 94593, 94598, 94602, 94607,
+ 94611, 94616, 94620, 94625, 94629, 94634, 94639, 94644, 94649, 94654,
+ 94659, 94664, 94669, 94674, 94679, 94684, 94689, 94694, 94699, 94704,
+ 94709, 94714, 94719, 94724, 94729, 94733, 94737, 94742, 94747, 94752,
+ 94756, 94760, 94764, 94769, 94774, 94779, 94784, 94788, 94792, 94798,
+ 94803, 94809, 94814, 94820, 94825, 94831, 94836, 94842, 94847, 94852,
+ 94857, 94862, 94866, 94871, 94877, 94881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 94886, 94893, 94900, 94907, 94914, 94921, 94928, 94935,
+ 94942, 94949, 94956, 94963, 94970, 94977, 94984, 94991, 94998, 95005,
+ 95012, 95019, 95026, 95033, 95040, 95047, 95054, 0, 0, 0, 0, 0, 0, 0,
+ 95061, 95068, 95074, 95080, 95086, 95092, 95098, 95104, 95110, 95116, 0,
+ 0, 0, 0, 0, 0, 95122, 95127, 95132, 95137, 95142, 95146, 95150, 95154,
+ 95159, 95164, 95169, 95174, 95179, 95184, 95189, 95194, 95199, 95204,
+ 95209, 95214, 95219, 95224, 95229, 95234, 95239, 95244, 95249, 95254,
+ 95259, 95264, 95269, 95274, 95279, 95284, 95289, 95294, 95299, 95304,
+ 95309, 95314, 95319, 95324, 95330, 95335, 95341, 95346, 95352, 95357,
+ 95363, 95369, 95373, 95378, 95382, 0, 95386, 95391, 95395, 95399, 95403,
+ 95407, 95411, 95415, 95419, 95423, 95427, 95432, 95436, 95441, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 95441, 95445, 95449, 95453, 95456, 95460,
- 95463, 95467, 95470, 95474, 95478, 95483, 95487, 95492, 95495, 95499,
- 95502, 95506, 95509, 95513, 95517, 95521, 95525, 95529, 95533, 95537,
- 95541, 95545, 95549, 95553, 95557, 95561, 95565, 95569, 95573, 95577,
- 95581, 95584, 95587, 95591, 95595, 95599, 95602, 95605, 95608, 95612,
- 95616, 95620, 95624, 95628, 95631, 95634, 95639, 95643, 95648, 95652,
- 95657, 95662, 95668, 95673, 95679, 95683, 95688, 95692, 95697, 95701,
- 95705, 95709, 95713, 95716, 95719, 95723, 95727, 0, 0, 0, 0, 0, 0, 0,
- 95730, 95734, 95737, 95740, 95743, 95746, 95749, 95752, 95755, 95758, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 95446, 95450, 95454, 95458, 95461, 95465,
+ 95468, 95472, 95475, 95479, 95483, 95488, 95492, 95497, 95500, 95504,
+ 95507, 95511, 95514, 95518, 95522, 95526, 95530, 95534, 95538, 95542,
+ 95546, 95550, 95554, 95558, 95562, 95566, 95570, 95574, 95578, 95582,
+ 95586, 95589, 95592, 95596, 95600, 95604, 95607, 95610, 95613, 95617,
+ 95621, 95625, 95629, 95633, 95636, 95639, 95644, 95648, 95653, 95657,
+ 95662, 95667, 95673, 95678, 95684, 95688, 95693, 95697, 95702, 95706,
+ 95710, 95714, 95718, 95721, 95724, 95728, 95732, 0, 0, 0, 0, 0, 0, 0,
+ 95735, 95739, 95742, 95745, 95748, 95751, 95754, 95757, 95760, 95763, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95761, 95765, 95770, 95774, 95779,
- 95783, 95788, 95792, 95797, 95801, 95806, 95810, 95815, 95820, 95825,
- 95830, 95835, 95840, 95845, 95850, 95855, 95860, 95865, 95870, 95875,
- 95880, 95885, 95890, 95895, 95900, 95904, 95908, 95913, 95918, 95923,
- 95927, 95931, 95935, 95940, 95945, 95950, 95954, 95958, 95963, 95968,
- 95973, 95979, 95984, 95990, 95995, 96001, 96006, 96012, 96017, 96023,
- 96028, 0, 0, 0, 0, 0, 0, 0, 0, 96033, 96038, 96042, 96046, 96050, 96054,
- 96058, 96062, 96066, 96070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95766, 95770, 95775, 95779, 95784,
+ 95788, 95793, 95797, 95802, 95806, 95811, 95815, 95820, 95825, 95830,
+ 95835, 95840, 95845, 95850, 95855, 95860, 95865, 95870, 95875, 95880,
+ 95885, 95890, 95895, 95900, 95905, 95909, 95913, 95918, 95923, 95928,
+ 95932, 95936, 95940, 95945, 95950, 95955, 95959, 95963, 95968, 95973,
+ 95978, 95984, 95989, 95995, 96000, 96006, 96011, 96017, 96022, 96028,
+ 96033, 0, 0, 0, 0, 0, 0, 0, 0, 96038, 96043, 96047, 96051, 96055, 96059,
+ 96063, 96067, 96071, 96075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96074, 96077, 96082, 96088,
- 96096, 96101, 96107, 96115, 96121, 96127, 96131, 96135, 96142, 96151,
- 96158, 96167, 96173, 96182, 96189, 96196, 96203, 96213, 96219, 96223,
- 96230, 96239, 96249, 96256, 96263, 96267, 96271, 96278, 96288, 96292,
- 96299, 96306, 96313, 96319, 96326, 96333, 96340, 96347, 96351, 96355,
- 96359, 96366, 96370, 96377, 96384, 96398, 96407, 96411, 96415, 96419,
- 96426, 96430, 96434, 96438, 96446, 96454, 96473, 96483, 96503, 96507,
- 96511, 96515, 96519, 96523, 96527, 96531, 96538, 96542, 96545, 96549,
- 96553, 96559, 96566, 96575, 96579, 96588, 96597, 96605, 96609, 96616,
- 96620, 96624, 96628, 96632, 96643, 96652, 96661, 96670, 96679, 96691,
- 96700, 96709, 96718, 96726, 96735, 96747, 96756, 96765, 96774, 96786,
- 96795, 96804, 96816, 96825, 96834, 96846, 96855, 96859, 96863, 96867,
- 96871, 96875, 96879, 96883, 96890, 96894, 96898, 96909, 96913, 96917,
- 96924, 96930, 96936, 96940, 96947, 96951, 96955, 96959, 96963, 96967,
- 96971, 96977, 96985, 96989, 96993, 96996, 97002, 97012, 97016, 97028,
- 97035, 97042, 97049, 97056, 97062, 97066, 97070, 97074, 97078, 97085,
- 97094, 97101, 97109, 97117, 97123, 97127, 97131, 97135, 97139, 97145,
- 97154, 97166, 97173, 97180, 97189, 97200, 97206, 97215, 97224, 97231,
- 97240, 97247, 97254, 97264, 97271, 97278, 97285, 97292, 97296, 97302,
- 97306, 97317, 97325, 97334, 97346, 97353, 97360, 97370, 97377, 97386,
- 97393, 97402, 97409, 97416, 97426, 97433, 97440, 97450, 97457, 97469,
- 97478, 97485, 97492, 97499, 97508, 97518, 97531, 97538, 97548, 97558,
- 97565, 97574, 97587, 97594, 97601, 97608, 97618, 97628, 97635, 97645,
- 97652, 97659, 97669, 97675, 97682, 97689, 97696, 97706, 97713, 97720,
- 97727, 97733, 97740, 97750, 97757, 97761, 97769, 97773, 97785, 97789,
- 97803, 97807, 97811, 97815, 97819, 97825, 97832, 97840, 97844, 97848,
- 97852, 97856, 97863, 97867, 97873, 97879, 97887, 97891, 97898, 97906,
- 97910, 97914, 97920, 97924, 97933, 97942, 97949, 97959, 97965, 97969,
- 97973, 97981, 97988, 97995, 98001, 98005, 98013, 98017, 98024, 98036,
- 98043, 98053, 98059, 98063, 98072, 98079, 98088, 98092, 98096, 98103,
- 98107, 98111, 98115, 98119, 98122, 98128, 98134, 98138, 98142, 98149,
- 98156, 98163, 98170, 98177, 98184, 98191, 98198, 98204, 98208, 98212,
- 98219, 98226, 98233, 98240, 98247, 98251, 98254, 98259, 98263, 98267,
- 98276, 98285, 98289, 98293, 98299, 98305, 98322, 98328, 98332, 98341,
- 98345, 98349, 98356, 98364, 98372, 98378, 98382, 98386, 98390, 98394,
- 98397, 98403, 98410, 98420, 98427, 98434, 98441, 98447, 98454, 98461,
- 98468, 98475, 98482, 98491, 98498, 98510, 98517, 98524, 98534, 98545,
- 98552, 98559, 98566, 98573, 98580, 98587, 98594, 98601, 98608, 98615,
- 98625, 98635, 98645, 98652, 98662, 98669, 98676, 98683, 98690, 98696,
- 98703, 98710, 98717, 98724, 98731, 98738, 98745, 98752, 98758, 98765,
- 98772, 98781, 98788, 98795, 98799, 98807, 98811, 98815, 98819, 98823,
- 98827, 98834, 98838, 98847, 98851, 98858, 98866, 98870, 98874, 98878,
- 98891, 98907, 98911, 98915, 98922, 98928, 98935, 98939, 98943, 98947,
- 98951, 98955, 98962, 98966, 98984, 98988, 98992, 98999, 99003, 99007,
- 99013, 99017, 99021, 99029, 99033, 99037, 99041, 99045, 99051, 99062,
- 99071, 99080, 99087, 99094, 99105, 99112, 99119, 99126, 99133, 99140,
- 99147, 99154, 99164, 99170, 99177, 99187, 99196, 99203, 99212, 99222,
- 99229, 99236, 99243, 99250, 99262, 99269, 99276, 99283, 99290, 99297,
- 99307, 99314, 99321, 99331, 99344, 99356, 99363, 99373, 99380, 99387,
- 99394, 99408, 99414, 99422, 99432, 99442, 99449, 99456, 99462, 99466,
- 99473, 99483, 99489, 99502, 99506, 99510, 99517, 99521, 99528, 99538,
- 99542, 99546, 99550, 99554, 99558, 99565, 99569, 99576, 99583, 99590,
- 99599, 99608, 99618, 99625, 99632, 99639, 99649, 99656, 99666, 99673,
- 99683, 99690, 99697, 99707, 99717, 99724, 99730, 99738, 99746, 99752,
- 99758, 99762, 99766, 99773, 99781, 99787, 99791, 99795, 99799, 99806,
- 99818, 99821, 99828, 99834, 99838, 99842, 99846, 99850, 99854, 99858,
- 99862, 99866, 99870, 99874, 99881, 99885, 99891, 99895, 99899, 99903,
- 99909, 99916, 99923, 99930, 99941, 99949, 99953, 99959, 99968, 99975,
- 99981, 99984, 99988, 99992, 99998, 100007, 100015, 100019, 100025,
- 100029, 100033, 100037, 100043, 100050, 100056, 100060, 100066, 100070,
- 100074, 100083, 100095, 100099, 100106, 100113, 100123, 100130, 100142,
- 100149, 100156, 100163, 100174, 100184, 100197, 100207, 100214, 100218,
- 100222, 100226, 100230, 100239, 100248, 100257, 100274, 100283, 100289,
- 100296, 100304, 100317, 100321, 100330, 100339, 100348, 100357, 100368,
- 100377, 100386, 100395, 100404, 100413, 100422, 100432, 100435, 100439,
- 100443, 100447, 100451, 100455, 100461, 100468, 100475, 100482, 100488,
- 100494, 100501, 100507, 100514, 100522, 100526, 100533, 100540, 100547,
- 100555, 100558, 100562, 100566, 100570, 100573, 100579, 100583, 100589,
- 100596, 100603, 100609, 100616, 100623, 100630, 100637, 100644, 100651,
- 100658, 100665, 100672, 100679, 100686, 100693, 100700, 100707, 100713,
- 100717, 100726, 100730, 100734, 100738, 100742, 100748, 100755, 100762,
- 100769, 100776, 100783, 100789, 100797, 100801, 100805, 100809, 100813,
- 100819, 100836, 100853, 100857, 100861, 100865, 100869, 100873, 100877,
- 100883, 100890, 100894, 100900, 100907, 100914, 100921, 100928, 100935,
- 100944, 100951, 100958, 100965, 100972, 100976, 100980, 100986, 100998,
- 101002, 101006, 101015, 101019, 101023, 101027, 101033, 101037, 101041,
- 101050, 101054, 101058, 101062, 101069, 101073, 101077, 101081, 101085,
- 101089, 101093, 101097, 101101, 101107, 101114, 101121, 101127, 101131,
- 101148, 101154, 101158, 101164, 101170, 101176, 101182, 101188, 101194,
- 101198, 101202, 101206, 101212, 101216, 101222, 101226, 101230, 101237,
- 101244, 101261, 101265, 101269, 101273, 101277, 101281, 101293, 101296,
- 101301, 101306, 101321, 101331, 101343, 101347, 101351, 101355, 101361,
- 101368, 101375, 101385, 101397, 101403, 101409, 101418, 101422, 101426,
- 101433, 101443, 101450, 101456, 101460, 101464, 101471, 101477, 101481,
- 101487, 101491, 101499, 101505, 101509, 101517, 101525, 101532, 101538,
- 101545, 101552, 101562, 101572, 101576, 101580, 101584, 101588, 101594,
- 101601, 101607, 101614, 101621, 101628, 101637, 101644, 101651, 101657,
- 101664, 101671, 101678, 101685, 101692, 101699, 101705, 101712, 101719,
- 101726, 101735, 101742, 101749, 101753, 101759, 101763, 101769, 101776,
- 101783, 101790, 101794, 101798, 101802, 101806, 101810, 101817, 101821,
- 101825, 101831, 101839, 101843, 101847, 101851, 101855, 101862, 101866,
- 101870, 101878, 101882, 101886, 101890, 101894, 101900, 101904, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101908, 101914, 101920, 101927,
- 101934, 101941, 101948, 101955, 101962, 101968, 101975, 101982, 101989,
- 101996, 102003, 102010, 102016, 102022, 102028, 102034, 102040, 102046,
- 102052, 102058, 102064, 102071, 102078, 102085, 102092, 102099, 102106,
- 102112, 102118, 102124, 102131, 102138, 102144, 102150, 102159, 102166,
- 102173, 102180, 102187, 102194, 102201, 102207, 102213, 102219, 102228,
- 102235, 102242, 102253, 102264, 102270, 102276, 102282, 102291, 102298,
- 102305, 102315, 102325, 102336, 102347, 102359, 102372, 102383, 102394,
- 102406, 102419, 102430, 102441, 102452, 102463, 102474, 102486, 102494,
- 102502, 102511, 102520, 102529, 102535, 102541, 102547, 102554, 102564,
- 102571, 102581, 102586, 102591, 102597, 102603, 102611, 102619, 102628,
- 102639, 102650, 102658, 102666, 102675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 102684, 102695, 102702, 102710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 102718, 102722, 102726, 102730, 102734, 102738, 102742, 102746, 102750,
- 102754, 102758, 102762, 102766, 102770, 102774, 102778, 102782, 102786,
- 102790, 102794, 102798, 102802, 102806, 102810, 102814, 102818, 102822,
- 102826, 102830, 102834, 102838, 102842, 102846, 102850, 102854, 102858,
- 102862, 102866, 102870, 102874, 102878, 102882, 102886, 102890, 102894,
- 102898, 102902, 102906, 102910, 102914, 102918, 102922, 102926, 102930,
- 102934, 102938, 102942, 102946, 102950, 102954, 102958, 102962, 102966,
- 102970, 102974, 102978, 102982, 102986, 102990, 102994, 102998, 103002,
- 103006, 103010, 103014, 103018, 103022, 103026, 103030, 103034, 103038,
- 103042, 103046, 103050, 103054, 103058, 103062, 103066, 103070, 103074,
- 103078, 103082, 103086, 103090, 103094, 103098, 103102, 103106, 103110,
- 103114, 103118, 103122, 103126, 103130, 103134, 103138, 103142, 103146,
- 103150, 103154, 103158, 103162, 103166, 103170, 103174, 103178, 103182,
- 103186, 103190, 103194, 103198, 103202, 103206, 103210, 103214, 103218,
- 103222, 103226, 103230, 103234, 103238, 103242, 103246, 103250, 103254,
- 103258, 103262, 103266, 103270, 103274, 103278, 103282, 103286, 103290,
- 103294, 103298, 103302, 103306, 103310, 103314, 103318, 103322, 103326,
- 103330, 103334, 103338, 103342, 103346, 103350, 103354, 103358, 103362,
- 103366, 103370, 103374, 103378, 103382, 103386, 103390, 103394, 103398,
- 103402, 103406, 103410, 103414, 103418, 103422, 103426, 103430, 103434,
- 103438, 103442, 103446, 103450, 103454, 103458, 103462, 103466, 103470,
- 103474, 103478, 103482, 103486, 103490, 103494, 103498, 103502, 103506,
- 103510, 103514, 103518, 103522, 103526, 103530, 103534, 103538, 103542,
- 103546, 103550, 103554, 103558, 103562, 103566, 103570, 103574, 103578,
- 103582, 103586, 103590, 103594, 103598, 103602, 103606, 103610, 103614,
- 103618, 103622, 103626, 103630, 103634, 103638, 103642, 103646, 103650,
- 103654, 103658, 103662, 103666, 103670, 103674, 103678, 103682, 103686,
- 103690, 103694, 103698, 103702, 103706, 103710, 103714, 103718, 103722,
- 103726, 103730, 103734, 103738, 103742, 103746, 103750, 103754, 103758,
- 103762, 103766, 103770, 103774, 103778, 103782, 103786, 103790, 103794,
- 103798, 103802, 103806, 103810, 103814, 103818, 103822, 103826, 103830,
- 103834, 103838, 103842, 103846, 103850, 103854, 103858, 103862, 103866,
- 103870, 103874, 103878, 103882, 103886, 103890, 103894, 103898, 103902,
- 103906, 103910, 103914, 103918, 103922, 103926, 103930, 103934, 103938,
- 103942, 103946, 103950, 103954, 103958, 103962, 103966, 103970, 103974,
- 103978, 103982, 103986, 103990, 103994, 103998, 104002, 104006, 104010,
- 104014, 104018, 104022, 104026, 104030, 104034, 104038, 104042, 104046,
- 104050, 104054, 104058, 104062, 104066, 104070, 104074, 104078, 104082,
- 104086, 104090, 104094, 104098, 104102, 104106, 104110, 104114, 104118,
- 104122, 104126, 104130, 104134, 104138, 104142, 104146, 104150, 104154,
- 104158, 104162, 104166, 104170, 104174, 104178, 104182, 104186, 104190,
- 104194, 104198, 104202, 104206, 104210, 104214, 104218, 104222, 104226,
- 104230, 104234, 104238, 104242, 104246, 104250, 104254, 104258, 104262,
- 104266, 104270, 104274, 104278, 104282, 104286, 104290, 104294, 104298,
- 104302, 104306, 104310, 104314, 104318, 104322, 104326, 104330, 104334,
- 104338, 104342, 104346, 104350, 104354, 104358, 104362, 104366, 104370,
- 104374, 104378, 104382, 104386, 104390, 104394, 104398, 104402, 104406,
- 104410, 104414, 104418, 104422, 104426, 104430, 104434, 104438, 104442,
- 104446, 104450, 104454, 104458, 104462, 104466, 104470, 104474, 104478,
- 104482, 104486, 104490, 104494, 104498, 104502, 104506, 104510, 104514,
- 104518, 104522, 104526, 104530, 104534, 104538, 104542, 104546, 104550,
- 104554, 104558, 104562, 104566, 104570, 104574, 104578, 104582, 104586,
- 104590, 104594, 104598, 104602, 104606, 104610, 104614, 104618, 104622,
- 104626, 104630, 104634, 104638, 104642, 104646, 104650, 104654, 104658,
- 104662, 104666, 104670, 104674, 104678, 104682, 104686, 104690, 104694,
- 104698, 104702, 104706, 104710, 104714, 104718, 104722, 104726, 104730,
- 104734, 104738, 104742, 104746, 104750, 104754, 104758, 104762, 104766,
- 104770, 104774, 104778, 104782, 104786, 104790, 104794, 104798, 104802,
- 104806, 104810, 104814, 104818, 104822, 104826, 104830, 104834, 104838,
- 104842, 104846, 104850, 104854, 104858, 104862, 104866, 104870, 104874,
- 104878, 104882, 104886, 104890, 104894, 104898, 104902, 104906, 104910,
- 104914, 104918, 104922, 104926, 104930, 104934, 104938, 104942, 104946,
- 104950, 104954, 104958, 104962, 104966, 104970, 104974, 104978, 104982,
- 104986, 104990, 104994, 104998, 105002, 105006, 105010, 105014, 105018,
- 105022, 105026, 105030, 105034, 105038, 105042, 105046, 105050, 105054,
- 105058, 105062, 105066, 105070, 105074, 105078, 105082, 105086, 105090,
- 105094, 105098, 105102, 105106, 105110, 105114, 105118, 105122, 105126,
- 105130, 105134, 105138, 105142, 105146, 105150, 105154, 105158, 105162,
- 105166, 105170, 105174, 105178, 105182, 105186, 105190, 105194, 105198,
- 105202, 105206, 105210, 105214, 105218, 105222, 105226, 105230, 105234,
- 105238, 105242, 105246, 105250, 105254, 105258, 105262, 105266, 105270,
- 105274, 105278, 105282, 105286, 105290, 105294, 105298, 105302, 105306,
- 105310, 105314, 105318, 105322, 105326, 105330, 105334, 105338, 105342,
- 105346, 105350, 105354, 105358, 105362, 105366, 105370, 105374, 105378,
- 105382, 105386, 105390, 105394, 105398, 105402, 105406, 105410, 105414,
- 105418, 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450,
- 105454, 105458, 105462, 105466, 105470, 105474, 105478, 105482, 105486,
- 105490, 105494, 105498, 105502, 105506, 105510, 105514, 105518, 105522,
- 105526, 105530, 105534, 105538, 105542, 105546, 105550, 105554, 105558,
- 105562, 105566, 105570, 105574, 105578, 105582, 105586, 105590, 105594,
- 105598, 105602, 105606, 105610, 105614, 105618, 105622, 105626, 105630,
- 105634, 105638, 105642, 105646, 105650, 105654, 105658, 105662, 105666,
- 105670, 105674, 105678, 105682, 105686, 105690, 105694, 105698, 105702,
- 105706, 105710, 105714, 105718, 105722, 105726, 105730, 105734, 105738,
- 105742, 105746, 105750, 105754, 105758, 105762, 105766, 105770, 105774,
- 105778, 105782, 105786, 105790, 105794, 105798, 105802, 105806, 105810,
- 105814, 105818, 105822, 105826, 105830, 105834, 105838, 105842, 105846,
- 105850, 105854, 105858, 105862, 105866, 105870, 105874, 105878, 105882,
- 105886, 105890, 105894, 105898, 105902, 105906, 105910, 105914, 105918,
- 105922, 105926, 105930, 105934, 105938, 105942, 105946, 105950, 105954,
- 105958, 105962, 105966, 105970, 105974, 105978, 105982, 105986, 105990,
- 105994, 105998, 106002, 106006, 106010, 106014, 106018, 106022, 106026,
- 106030, 106034, 106038, 106042, 106046, 106050, 106054, 106058, 106062,
- 106066, 106070, 106074, 106078, 106082, 106086, 106090, 106094, 106098,
- 106102, 106106, 106110, 106114, 106118, 106122, 106126, 106130, 106134,
- 106138, 106142, 106146, 106150, 106154, 106158, 106162, 106166, 106170,
- 106174, 106178, 106182, 106186, 106190, 106194, 106198, 106202, 106206,
- 106210, 106214, 106218, 106222, 106226, 106230, 106234, 106238, 106242,
- 106246, 106250, 106254, 106258, 106262, 106266, 106270, 106274, 106278,
- 106282, 106286, 106290, 106294, 106298, 106302, 106306, 106310, 106314,
- 106318, 106322, 106326, 106330, 106334, 106338, 106342, 106346, 106350,
- 106354, 106358, 106362, 106366, 106370, 106374, 106378, 106382, 106386,
- 106390, 106394, 106398, 106402, 106406, 106410, 106414, 106418, 106422,
- 106426, 106430, 106434, 106438, 106442, 106446, 106450, 106454, 106458,
- 106462, 106466, 106470, 106474, 106478, 106482, 106486, 106490, 106494,
- 106498, 106502, 106506, 106510, 106514, 106518, 106522, 106526, 106530,
- 106534, 106538, 106542, 106546, 106550, 106554, 106558, 106562, 106566,
- 106570, 106574, 106578, 106582, 106586, 106590, 106594, 106598, 106602,
- 106606, 106610, 106614, 106618, 106622, 106626, 106630, 106634, 106638,
- 106642, 106646, 106650, 106654, 106658, 106662, 106666, 106670, 106674,
- 106678, 106682, 106686, 106690, 106694, 106698, 106702, 106706, 106710,
- 106714, 106718, 106722, 106726, 106730, 106734, 106738, 106742, 106746,
- 106750, 106754, 106758, 106762, 106766, 106770, 106774, 106778, 106782,
- 106786, 106790, 106794, 106798, 106802, 106806, 106810, 106814, 106818,
- 106822, 106826, 106830, 106834, 106838, 106842, 106846, 106850, 106854,
- 106858, 106862, 106866, 106870, 106874, 106878, 106882, 106886, 106890,
- 106894, 106898, 106902, 106906, 106910, 106914, 106918, 106922, 106926,
- 106930, 106934, 106938, 106942, 106946, 106950, 106954, 106958, 106962,
- 106966, 106970, 106974, 106978, 106982, 106986, 106990, 106994, 106998,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96079, 96082, 96087, 96093,
+ 96101, 96106, 96112, 96120, 96126, 96132, 96136, 96140, 96147, 96156,
+ 96163, 96172, 96178, 96187, 96194, 96201, 96208, 96218, 96224, 96228,
+ 96235, 96244, 96254, 96261, 96268, 96272, 96276, 96283, 96293, 96297,
+ 96304, 96311, 96318, 96324, 96331, 96338, 96345, 96352, 96356, 96360,
+ 96364, 96371, 96375, 96382, 96389, 96403, 96412, 96416, 96420, 96424,
+ 96431, 96435, 96439, 96443, 96451, 96459, 96478, 96488, 96508, 96512,
+ 96516, 96520, 96524, 96528, 96532, 96536, 96543, 96547, 96550, 96554,
+ 96558, 96564, 96571, 96580, 96584, 96593, 96602, 96610, 96614, 96621,
+ 96625, 96629, 96633, 96637, 96648, 96657, 96666, 96675, 96684, 96696,
+ 96705, 96714, 96723, 96731, 96740, 96752, 96761, 96770, 96779, 96791,
+ 96800, 96809, 96821, 96830, 96839, 96851, 96860, 96864, 96868, 96872,
+ 96876, 96880, 96884, 96888, 96895, 96899, 96903, 96914, 96918, 96922,
+ 96929, 96935, 96941, 96945, 96952, 96956, 96960, 96964, 96968, 96972,
+ 96976, 96982, 96990, 96994, 96998, 97001, 97007, 97017, 97021, 97033,
+ 97040, 97047, 97054, 97061, 97067, 97071, 97075, 97079, 97083, 97090,
+ 97099, 97106, 97114, 97122, 97128, 97132, 97136, 97140, 97144, 97150,
+ 97159, 97171, 97178, 97185, 97194, 97205, 97211, 97220, 97229, 97236,
+ 97245, 97252, 97259, 97269, 97276, 97283, 97290, 97297, 97301, 97307,
+ 97311, 97322, 97330, 97339, 97351, 97358, 97365, 97375, 97382, 97391,
+ 97398, 97407, 97414, 97421, 97431, 97438, 97445, 97455, 97462, 97474,
+ 97483, 97490, 97497, 97504, 97513, 97523, 97536, 97543, 97553, 97563,
+ 97570, 97579, 97592, 97599, 97606, 97613, 97623, 97633, 97640, 97650,
+ 97657, 97664, 97674, 97680, 97687, 97694, 97701, 97711, 97718, 97725,
+ 97732, 97738, 97745, 97755, 97762, 97766, 97774, 97778, 97790, 97794,
+ 97808, 97812, 97816, 97820, 97824, 97830, 97837, 97845, 97849, 97853,
+ 97857, 97861, 97868, 97872, 97878, 97884, 97892, 97896, 97903, 97911,
+ 97915, 97919, 97925, 97929, 97938, 97947, 97954, 97964, 97970, 97974,
+ 97978, 97986, 97993, 98000, 98006, 98010, 98018, 98022, 98029, 98041,
+ 98048, 98058, 98064, 98068, 98077, 98084, 98093, 98097, 98101, 98108,
+ 98112, 98116, 98120, 98124, 98127, 98133, 98139, 98143, 98147, 98154,
+ 98161, 98168, 98175, 98182, 98189, 98196, 98203, 98209, 98213, 98217,
+ 98224, 98231, 98238, 98245, 98252, 98256, 98259, 98264, 98268, 98272,
+ 98281, 98290, 98294, 98298, 98304, 98310, 98327, 98333, 98337, 98346,
+ 98350, 98354, 98361, 98369, 98377, 98383, 98387, 98391, 98395, 98399,
+ 98402, 98408, 98415, 98425, 98432, 98439, 98446, 98452, 98459, 98466,
+ 98473, 98480, 98487, 98496, 98503, 98515, 98522, 98529, 98539, 98550,
+ 98557, 98564, 98571, 98578, 98585, 98592, 98599, 98606, 98613, 98620,
+ 98630, 98640, 98650, 98657, 98667, 98674, 98681, 98688, 98695, 98701,
+ 98708, 98715, 98722, 98729, 98736, 98743, 98750, 98757, 98763, 98770,
+ 98777, 98786, 98793, 98800, 98804, 98812, 98816, 98820, 98824, 98828,
+ 98832, 98839, 98843, 98852, 98856, 98863, 98871, 98875, 98879, 98883,
+ 98896, 98912, 98916, 98920, 98927, 98933, 98940, 98944, 98948, 98952,
+ 98956, 98960, 98967, 98971, 98989, 98993, 98997, 99004, 99008, 99012,
+ 99018, 99022, 99026, 99034, 99038, 99042, 99046, 99050, 99056, 99067,
+ 99076, 99085, 99092, 99099, 99110, 99117, 99124, 99131, 99138, 99145,
+ 99152, 99159, 99169, 99175, 99182, 99192, 99201, 99208, 99217, 99227,
+ 99234, 99241, 99248, 99255, 99267, 99274, 99281, 99288, 99295, 99302,
+ 99312, 99319, 99326, 99336, 99349, 99361, 99368, 99378, 99385, 99392,
+ 99399, 99413, 99419, 99427, 99437, 99447, 99454, 99461, 99467, 99471,
+ 99478, 99488, 99494, 99507, 99511, 99515, 99522, 99526, 99533, 99543,
+ 99547, 99551, 99555, 99559, 99563, 99570, 99574, 99581, 99588, 99595,
+ 99604, 99613, 99623, 99630, 99637, 99644, 99654, 99661, 99671, 99678,
+ 99688, 99695, 99702, 99712, 99722, 99729, 99735, 99743, 99751, 99757,
+ 99763, 99767, 99771, 99778, 99786, 99792, 99796, 99800, 99804, 99811,
+ 99823, 99826, 99833, 99839, 99843, 99847, 99851, 99855, 99859, 99863,
+ 99867, 99871, 99875, 99879, 99886, 99890, 99896, 99900, 99904, 99908,
+ 99914, 99921, 99928, 99935, 99946, 99954, 99958, 99964, 99973, 99980,
+ 99986, 99989, 99993, 99997, 100003, 100012, 100020, 100024, 100030,
+ 100034, 100038, 100042, 100048, 100055, 100061, 100065, 100071, 100075,
+ 100079, 100088, 100100, 100104, 100111, 100118, 100128, 100135, 100147,
+ 100154, 100161, 100168, 100179, 100189, 100202, 100212, 100219, 100223,
+ 100227, 100231, 100235, 100244, 100253, 100262, 100279, 100288, 100294,
+ 100301, 100309, 100322, 100326, 100335, 100344, 100353, 100362, 100373,
+ 100382, 100391, 100400, 100409, 100418, 100427, 100437, 100440, 100444,
+ 100448, 100452, 100456, 100460, 100466, 100473, 100480, 100487, 100493,
+ 100499, 100506, 100512, 100519, 100527, 100531, 100538, 100545, 100552,
+ 100560, 100563, 100567, 100571, 100575, 100578, 100584, 100588, 100594,
+ 100601, 100608, 100614, 100621, 100628, 100635, 100642, 100649, 100656,
+ 100663, 100670, 100677, 100684, 100691, 100698, 100705, 100712, 100718,
+ 100722, 100731, 100735, 100739, 100743, 100747, 100753, 100760, 100767,
+ 100774, 100781, 100788, 100794, 100802, 100806, 100810, 100814, 100818,
+ 100824, 100841, 100858, 100862, 100866, 100870, 100874, 100878, 100882,
+ 100888, 100895, 100899, 100905, 100912, 100919, 100926, 100933, 100940,
+ 100949, 100956, 100963, 100970, 100977, 100981, 100985, 100991, 101003,
+ 101007, 101011, 101020, 101024, 101028, 101032, 101038, 101042, 101046,
+ 101055, 101059, 101063, 101067, 101074, 101078, 101082, 101086, 101090,
+ 101094, 101098, 101102, 101106, 101112, 101119, 101126, 101132, 101136,
+ 101153, 101159, 101163, 101169, 101175, 101181, 101187, 101193, 101199,
+ 101203, 101207, 101211, 101217, 101221, 101227, 101231, 101235, 101242,
+ 101249, 101266, 101270, 101274, 101278, 101282, 101286, 101298, 101301,
+ 101306, 101311, 101326, 101336, 101348, 101352, 101356, 101360, 101366,
+ 101373, 101380, 101390, 101402, 101408, 101414, 101423, 101427, 101431,
+ 101438, 101448, 101455, 101461, 101465, 101469, 101476, 101482, 101486,
+ 101492, 101496, 101504, 101510, 101514, 101522, 101530, 101537, 101543,
+ 101550, 101557, 101567, 101577, 101581, 101585, 101589, 101593, 101599,
+ 101606, 101612, 101619, 101626, 101633, 101642, 101649, 101656, 101662,
+ 101669, 101676, 101683, 101690, 101697, 101704, 101710, 101717, 101724,
+ 101731, 101740, 101747, 101754, 101758, 101764, 101768, 101774, 101781,
+ 101788, 101795, 101799, 101803, 101807, 101811, 101815, 101822, 101826,
+ 101830, 101836, 101844, 101848, 101852, 101856, 101860, 101867, 101871,
+ 101875, 101883, 101887, 101891, 101895, 101899, 101905, 101909, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101913, 101919, 101925, 101932,
+ 101939, 101946, 101953, 101960, 101967, 101973, 101980, 101987, 101994,
+ 102001, 102008, 102015, 102021, 102027, 102033, 102039, 102045, 102051,
+ 102057, 102063, 102069, 102076, 102083, 102090, 102097, 102104, 102111,
+ 102117, 102123, 102129, 102136, 102143, 102149, 102155, 102164, 102171,
+ 102178, 102185, 102192, 102199, 102206, 102212, 102218, 102224, 102233,
+ 102240, 102247, 102258, 102269, 102275, 102281, 102287, 102296, 102303,
+ 102310, 102320, 102330, 102341, 102352, 102364, 102377, 102388, 102399,
+ 102411, 102424, 102435, 102446, 102457, 102468, 102479, 102491, 102499,
+ 102507, 102516, 102525, 102534, 102540, 102546, 102552, 102559, 102569,
+ 102576, 102586, 102591, 102596, 102602, 102608, 102616, 102624, 102633,
+ 102644, 102655, 102663, 102671, 102680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 102689, 102700, 102707, 102715, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 102723, 102727, 102731, 102735, 102739, 102743, 102747, 102751, 102755,
+ 102759, 102763, 102767, 102771, 102775, 102779, 102783, 102787, 102791,
+ 102795, 102799, 102803, 102807, 102811, 102815, 102819, 102823, 102827,
+ 102831, 102835, 102839, 102843, 102847, 102851, 102855, 102859, 102863,
+ 102867, 102871, 102875, 102879, 102883, 102887, 102891, 102895, 102899,
+ 102903, 102907, 102911, 102915, 102919, 102923, 102927, 102931, 102935,
+ 102939, 102943, 102947, 102951, 102955, 102959, 102963, 102967, 102971,
+ 102975, 102979, 102983, 102987, 102991, 102995, 102999, 103003, 103007,
+ 103011, 103015, 103019, 103023, 103027, 103031, 103035, 103039, 103043,
+ 103047, 103051, 103055, 103059, 103063, 103067, 103071, 103075, 103079,
+ 103083, 103087, 103091, 103095, 103099, 103103, 103107, 103111, 103115,
+ 103119, 103123, 103127, 103131, 103135, 103139, 103143, 103147, 103151,
+ 103155, 103159, 103163, 103167, 103171, 103175, 103179, 103183, 103187,
+ 103191, 103195, 103199, 103203, 103207, 103211, 103215, 103219, 103223,
+ 103227, 103231, 103235, 103239, 103243, 103247, 103251, 103255, 103259,
+ 103263, 103267, 103271, 103275, 103279, 103283, 103287, 103291, 103295,
+ 103299, 103303, 103307, 103311, 103315, 103319, 103323, 103327, 103331,
+ 103335, 103339, 103343, 103347, 103351, 103355, 103359, 103363, 103367,
+ 103371, 103375, 103379, 103383, 103387, 103391, 103395, 103399, 103403,
+ 103407, 103411, 103415, 103419, 103423, 103427, 103431, 103435, 103439,
+ 103443, 103447, 103451, 103455, 103459, 103463, 103467, 103471, 103475,
+ 103479, 103483, 103487, 103491, 103495, 103499, 103503, 103507, 103511,
+ 103515, 103519, 103523, 103527, 103531, 103535, 103539, 103543, 103547,
+ 103551, 103555, 103559, 103563, 103567, 103571, 103575, 103579, 103583,
+ 103587, 103591, 103595, 103599, 103603, 103607, 103611, 103615, 103619,
+ 103623, 103627, 103631, 103635, 103639, 103643, 103647, 103651, 103655,
+ 103659, 103663, 103667, 103671, 103675, 103679, 103683, 103687, 103691,
+ 103695, 103699, 103703, 103707, 103711, 103715, 103719, 103723, 103727,
+ 103731, 103735, 103739, 103743, 103747, 103751, 103755, 103759, 103763,
+ 103767, 103771, 103775, 103779, 103783, 103787, 103791, 103795, 103799,
+ 103803, 103807, 103811, 103815, 103819, 103823, 103827, 103831, 103835,
+ 103839, 103843, 103847, 103851, 103855, 103859, 103863, 103867, 103871,
+ 103875, 103879, 103883, 103887, 103891, 103895, 103899, 103903, 103907,
+ 103911, 103915, 103919, 103923, 103927, 103931, 103935, 103939, 103943,
+ 103947, 103951, 103955, 103959, 103963, 103967, 103971, 103975, 103979,
+ 103983, 103987, 103991, 103995, 103999, 104003, 104007, 104011, 104015,
+ 104019, 104023, 104027, 104031, 104035, 104039, 104043, 104047, 104051,
+ 104055, 104059, 104063, 104067, 104071, 104075, 104079, 104083, 104087,
+ 104091, 104095, 104099, 104103, 104107, 104111, 104115, 104119, 104123,
+ 104127, 104131, 104135, 104139, 104143, 104147, 104151, 104155, 104159,
+ 104163, 104167, 104171, 104175, 104179, 104183, 104187, 104191, 104195,
+ 104199, 104203, 104207, 104211, 104215, 104219, 104223, 104227, 104231,
+ 104235, 104239, 104243, 104247, 104251, 104255, 104259, 104263, 104267,
+ 104271, 104275, 104279, 104283, 104287, 104291, 104295, 104299, 104303,
+ 104307, 104311, 104315, 104319, 104323, 104327, 104331, 104335, 104339,
+ 104343, 104347, 104351, 104355, 104359, 104363, 104367, 104371, 104375,
+ 104379, 104383, 104387, 104391, 104395, 104399, 104403, 104407, 104411,
+ 104415, 104419, 104423, 104427, 104431, 104435, 104439, 104443, 104447,
+ 104451, 104455, 104459, 104463, 104467, 104471, 104475, 104479, 104483,
+ 104487, 104491, 104495, 104499, 104503, 104507, 104511, 104515, 104519,
+ 104523, 104527, 104531, 104535, 104539, 104543, 104547, 104551, 104555,
+ 104559, 104563, 104567, 104571, 104575, 104579, 104583, 104587, 104591,
+ 104595, 104599, 104603, 104607, 104611, 104615, 104619, 104623, 104627,
+ 104631, 104635, 104639, 104643, 104647, 104651, 104655, 104659, 104663,
+ 104667, 104671, 104675, 104679, 104683, 104687, 104691, 104695, 104699,
+ 104703, 104707, 104711, 104715, 104719, 104723, 104727, 104731, 104735,
+ 104739, 104743, 104747, 104751, 104755, 104759, 104763, 104767, 104771,
+ 104775, 104779, 104783, 104787, 104791, 104795, 104799, 104803, 104807,
+ 104811, 104815, 104819, 104823, 104827, 104831, 104835, 104839, 104843,
+ 104847, 104851, 104855, 104859, 104863, 104867, 104871, 104875, 104879,
+ 104883, 104887, 104891, 104895, 104899, 104903, 104907, 104911, 104915,
+ 104919, 104923, 104927, 104931, 104935, 104939, 104943, 104947, 104951,
+ 104955, 104959, 104963, 104967, 104971, 104975, 104979, 104983, 104987,
+ 104991, 104995, 104999, 105003, 105007, 105011, 105015, 105019, 105023,
+ 105027, 105031, 105035, 105039, 105043, 105047, 105051, 105055, 105059,
+ 105063, 105067, 105071, 105075, 105079, 105083, 105087, 105091, 105095,
+ 105099, 105103, 105107, 105111, 105115, 105119, 105123, 105127, 105131,
+ 105135, 105139, 105143, 105147, 105151, 105155, 105159, 105163, 105167,
+ 105171, 105175, 105179, 105183, 105187, 105191, 105195, 105199, 105203,
+ 105207, 105211, 105215, 105219, 105223, 105227, 105231, 105235, 105239,
+ 105243, 105247, 105251, 105255, 105259, 105263, 105267, 105271, 105275,
+ 105279, 105283, 105287, 105291, 105295, 105299, 105303, 105307, 105311,
+ 105315, 105319, 105323, 105327, 105331, 105335, 105339, 105343, 105347,
+ 105351, 105355, 105359, 105363, 105367, 105371, 105375, 105379, 105383,
+ 105387, 105391, 105395, 105399, 105403, 105407, 105411, 105415, 105419,
+ 105423, 105427, 105431, 105435, 105439, 105443, 105447, 105451, 105455,
+ 105459, 105463, 105467, 105471, 105475, 105479, 105483, 105487, 105491,
+ 105495, 105499, 105503, 105507, 105511, 105515, 105519, 105523, 105527,
+ 105531, 105535, 105539, 105543, 105547, 105551, 105555, 105559, 105563,
+ 105567, 105571, 105575, 105579, 105583, 105587, 105591, 105595, 105599,
+ 105603, 105607, 105611, 105615, 105619, 105623, 105627, 105631, 105635,
+ 105639, 105643, 105647, 105651, 105655, 105659, 105663, 105667, 105671,
+ 105675, 105679, 105683, 105687, 105691, 105695, 105699, 105703, 105707,
+ 105711, 105715, 105719, 105723, 105727, 105731, 105735, 105739, 105743,
+ 105747, 105751, 105755, 105759, 105763, 105767, 105771, 105775, 105779,
+ 105783, 105787, 105791, 105795, 105799, 105803, 105807, 105811, 105815,
+ 105819, 105823, 105827, 105831, 105835, 105839, 105843, 105847, 105851,
+ 105855, 105859, 105863, 105867, 105871, 105875, 105879, 105883, 105887,
+ 105891, 105895, 105899, 105903, 105907, 105911, 105915, 105919, 105923,
+ 105927, 105931, 105935, 105939, 105943, 105947, 105951, 105955, 105959,
+ 105963, 105967, 105971, 105975, 105979, 105983, 105987, 105991, 105995,
+ 105999, 106003, 106007, 106011, 106015, 106019, 106023, 106027, 106031,
+ 106035, 106039, 106043, 106047, 106051, 106055, 106059, 106063, 106067,
+ 106071, 106075, 106079, 106083, 106087, 106091, 106095, 106099, 106103,
+ 106107, 106111, 106115, 106119, 106123, 106127, 106131, 106135, 106139,
+ 106143, 106147, 106151, 106155, 106159, 106163, 106167, 106171, 106175,
+ 106179, 106183, 106187, 106191, 106195, 106199, 106203, 106207, 106211,
+ 106215, 106219, 106223, 106227, 106231, 106235, 106239, 106243, 106247,
+ 106251, 106255, 106259, 106263, 106267, 106271, 106275, 106279, 106283,
+ 106287, 106291, 106295, 106299, 106303, 106307, 106311, 106315, 106319,
+ 106323, 106327, 106331, 106335, 106339, 106343, 106347, 106351, 106355,
+ 106359, 106363, 106367, 106371, 106375, 106379, 106383, 106387, 106391,
+ 106395, 106399, 106403, 106407, 106411, 106415, 106419, 106423, 106427,
+ 106431, 106435, 106439, 106443, 106447, 106451, 106455, 106459, 106463,
+ 106467, 106471, 106475, 106479, 106483, 106487, 106491, 106495, 106499,
+ 106503, 106507, 106511, 106515, 106519, 106523, 106527, 106531, 106535,
+ 106539, 106543, 106547, 106551, 106555, 106559, 106563, 106567, 106571,
+ 106575, 106579, 106583, 106587, 106591, 106595, 106599, 106603, 106607,
+ 106611, 106615, 106619, 106623, 106627, 106631, 106635, 106639, 106643,
+ 106647, 106651, 106655, 106659, 106663, 106667, 106671, 106675, 106679,
+ 106683, 106687, 106691, 106695, 106699, 106703, 106707, 106711, 106715,
+ 106719, 106723, 106727, 106731, 106735, 106739, 106743, 106747, 106751,
+ 106755, 106759, 106763, 106767, 106771, 106775, 106779, 106783, 106787,
+ 106791, 106795, 106799, 106803, 106807, 106811, 106815, 106819, 106823,
+ 106827, 106831, 106835, 106839, 106843, 106847, 106851, 106855, 106859,
+ 106863, 106867, 106871, 106875, 106879, 106883, 106887, 106891, 106895,
+ 106899, 106903, 106907, 106911, 106915, 106919, 106923, 106927, 106931,
+ 106935, 106939, 106943, 106947, 106951, 106955, 106959, 106963, 106967,
+ 106971, 106975, 106979, 106983, 106987, 106991, 106995, 106999, 107003,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 107002, 107009, 107016, 107025, 107034,
- 107041, 107046, 107053, 107060, 107069, 107080, 107091, 107096, 107103,
- 107108, 107113, 107118, 107123, 107128, 107133, 107138, 107143, 107148,
- 107153, 107158, 107165, 107172, 107177, 107182, 107187, 107192, 107199,
- 107206, 107214, 107219, 107226, 107231, 107236, 107241, 107246, 107251,
- 107258, 107265, 107270, 107275, 107280, 107285, 107290, 107295, 107300,
- 107305, 107310, 107315, 107320, 107325, 107330, 107335, 107340, 107345,
- 107350, 107355, 107360, 107367, 107372, 107377, 107386, 107393, 107398,
- 107403, 107408, 107413, 107418, 107423, 107428, 107433, 107438, 107443,
- 107448, 107453, 107458, 107463, 107468, 107473, 107478, 107483, 107488,
- 107493, 107498, 107504, 107512, 107518, 107526, 107534, 107542, 107548,
- 107554, 107560, 107566, 107572, 107580, 107590, 107598, 107606, 107612,
- 107618, 107626, 107634, 107640, 107648, 107656, 107664, 107670, 107676,
- 107682, 107688, 107694, 107700, 107708, 107716, 107722, 107728, 107734,
- 107740, 107746, 107754, 107760, 107766, 107772, 107778, 107784, 107790,
- 107798, 107804, 107810, 107816, 107822, 107830, 107838, 107844, 107850,
- 107856, 107861, 107867, 107873, 107880, 107885, 107890, 107895, 107900,
- 107905, 107910, 107915, 107920, 107925, 107934, 107941, 107946, 107951,
- 107956, 107963, 107968, 107973, 107978, 107985, 107990, 107995, 108000,
- 108005, 108010, 108015, 108020, 108025, 108030, 108035, 108040, 108047,
- 108052, 108059, 108064, 108069, 108076, 108081, 108086, 108091, 108096,
- 108101, 108106, 108111, 108116, 108121, 108126, 108131, 108136, 108141,
- 108146, 108151, 108156, 108161, 108166, 108171, 108178, 108183, 108188,
- 108193, 108198, 108203, 108208, 108213, 108218, 108223, 108228, 108233,
- 108238, 108243, 108250, 108255, 108260, 108267, 108272, 108277, 108282,
- 108287, 108292, 108297, 108302, 108307, 108312, 108317, 108324, 108329,
- 108334, 108339, 108344, 108349, 108356, 108363, 108368, 108373, 108378,
- 108383, 108388, 108393, 108398, 108403, 108408, 108413, 108418, 108423,
- 108428, 108433, 108438, 108443, 108448, 108453, 108458, 108463, 108468,
- 108473, 108478, 108483, 108488, 108493, 108498, 108503, 108508, 108513,
- 108518, 108523, 108528, 108533, 108538, 108543, 108550, 108555, 108560,
- 108565, 108570, 108575, 108580, 108585, 108590, 108595, 108600, 108605,
- 108610, 108615, 108620, 108625, 108630, 108635, 108640, 108645, 108650,
- 108655, 108660, 108665, 108670, 108675, 108680, 108685, 108690, 108695,
- 108700, 108705, 108710, 108715, 108720, 108725, 108730, 108735, 108740,
- 108745, 108750, 108755, 108760, 108765, 108770, 108775, 108780, 108785,
- 108790, 108795, 108800, 108805, 108810, 108815, 108820, 108825, 108830,
- 108835, 108840, 108847, 108852, 108857, 108862, 108867, 108872, 108877,
- 108881, 108886, 108891, 108896, 108901, 108906, 108911, 108916, 108921,
- 108926, 108931, 108936, 108941, 108946, 108951, 108958, 108963, 108968,
- 108974, 108979, 108984, 108989, 108994, 108999, 109004, 109009, 109014,
- 109019, 109024, 109029, 109034, 109039, 109044, 109049, 109054, 109059,
- 109064, 109069, 109074, 109079, 109084, 109089, 109094, 109099, 109104,
- 109109, 109114, 109119, 109124, 109129, 109134, 109139, 109144, 109149,
- 109154, 109159, 109164, 109169, 109174, 109179, 109184, 109189, 109196,
- 109201, 109206, 109213, 109220, 109225, 109230, 109235, 109240, 109245,
- 109250, 109255, 109260, 109265, 109270, 109275, 109280, 109285, 109290,
- 109295, 109300, 109305, 109310, 109315, 109320, 109325, 109330, 109335,
- 109340, 109345, 109352, 109357, 109362, 109367, 109372, 109377, 109382,
- 109387, 109392, 109397, 109402, 109407, 109412, 109417, 109422, 109427,
- 109432, 109437, 109442, 109449, 109454, 109459, 109464, 109469, 109474,
- 109479, 109484, 109490, 109495, 109500, 109505, 109510, 109515, 109520,
- 109525, 109530, 109537, 109544, 109549, 109554, 109558, 109563, 109567,
- 109571, 109576, 109583, 109588, 109593, 109602, 109607, 109612, 109617,
- 109622, 109629, 109636, 109641, 109646, 109651, 109656, 109663, 109668,
- 109673, 109678, 109683, 109688, 109693, 109698, 109703, 109708, 109713,
- 109718, 109723, 109730, 109734, 109739, 109744, 109749, 109754, 109758,
- 109763, 109768, 109773, 109778, 109783, 109788, 109793, 109798, 109803,
- 109809, 109815, 109821, 109827, 109833, 109839, 109845, 109851, 109857,
- 109863, 109869, 109875, 109880, 109886, 109892, 109898, 109904, 109910,
- 109916, 109922, 109928, 109934, 109940, 109946, 109951, 109957, 109963,
- 109969, 109975, 109981, 109987, 109993, 109999, 110005, 110011, 110017,
- 110023, 110029, 110035, 110041, 110047, 110053, 110059, 110065, 110071,
- 110076, 110082, 110088, 110094, 110100, 110106, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 107007, 107014, 107021, 107030, 107039,
+ 107046, 107051, 107058, 107065, 107074, 107085, 107096, 107101, 107108,
+ 107113, 107118, 107123, 107128, 107133, 107138, 107143, 107148, 107153,
+ 107158, 107163, 107170, 107177, 107182, 107187, 107192, 107197, 107204,
+ 107211, 107219, 107224, 107231, 107236, 107241, 107246, 107251, 107256,
+ 107263, 107270, 107275, 107280, 107285, 107290, 107295, 107300, 107305,
+ 107310, 107315, 107320, 107325, 107330, 107335, 107340, 107345, 107350,
+ 107355, 107360, 107365, 107372, 107377, 107382, 107391, 107398, 107403,
+ 107408, 107413, 107418, 107423, 107428, 107433, 107438, 107443, 107448,
+ 107453, 107458, 107463, 107468, 107473, 107478, 107483, 107488, 107493,
+ 107498, 107503, 107509, 107517, 107523, 107531, 107539, 107547, 107553,
+ 107559, 107565, 107571, 107577, 107585, 107595, 107603, 107611, 107617,
+ 107623, 107631, 107639, 107645, 107653, 107661, 107669, 107675, 107681,
+ 107687, 107693, 107699, 107705, 107713, 107721, 107727, 107733, 107739,
+ 107745, 107751, 107759, 107765, 107771, 107777, 107783, 107789, 107795,
+ 107803, 107809, 107815, 107821, 107827, 107835, 107843, 107849, 107855,
+ 107861, 107866, 107872, 107878, 107885, 107890, 107895, 107900, 107905,
+ 107910, 107915, 107920, 107925, 107930, 107939, 107946, 107951, 107956,
+ 107961, 107968, 107973, 107978, 107983, 107990, 107995, 108000, 108005,
+ 108010, 108015, 108020, 108025, 108030, 108035, 108040, 108045, 108052,
+ 108057, 108064, 108069, 108074, 108081, 108086, 108091, 108096, 108101,
+ 108106, 108111, 108116, 108121, 108126, 108131, 108136, 108141, 108146,
+ 108151, 108156, 108161, 108166, 108171, 108176, 108183, 108188, 108193,
+ 108198, 108203, 108208, 108213, 108218, 108223, 108228, 108233, 108238,
+ 108243, 108248, 108255, 108260, 108265, 108272, 108277, 108282, 108287,
+ 108292, 108297, 108302, 108307, 108312, 108317, 108322, 108329, 108334,
+ 108339, 108344, 108349, 108354, 108361, 108368, 108373, 108378, 108383,
+ 108388, 108393, 108398, 108403, 108408, 108413, 108418, 108423, 108428,
+ 108433, 108438, 108443, 108448, 108453, 108458, 108463, 108468, 108473,
+ 108478, 108483, 108488, 108493, 108498, 108503, 108508, 108513, 108518,
+ 108523, 108528, 108533, 108538, 108543, 108548, 108555, 108560, 108565,
+ 108570, 108575, 108580, 108585, 108590, 108595, 108600, 108605, 108610,
+ 108615, 108620, 108625, 108630, 108635, 108640, 108645, 108650, 108655,
+ 108660, 108665, 108670, 108675, 108680, 108685, 108690, 108695, 108700,
+ 108705, 108710, 108715, 108720, 108725, 108730, 108735, 108740, 108745,
+ 108750, 108755, 108760, 108765, 108770, 108775, 108780, 108785, 108790,
+ 108795, 108800, 108805, 108810, 108815, 108820, 108825, 108830, 108835,
+ 108840, 108845, 108852, 108857, 108862, 108867, 108872, 108877, 108882,
+ 108886, 108891, 108896, 108901, 108906, 108911, 108916, 108921, 108926,
+ 108931, 108936, 108941, 108946, 108951, 108956, 108963, 108968, 108973,
+ 108979, 108984, 108989, 108994, 108999, 109004, 109009, 109014, 109019,
+ 109024, 109029, 109034, 109039, 109044, 109049, 109054, 109059, 109064,
+ 109069, 109074, 109079, 109084, 109089, 109094, 109099, 109104, 109109,
+ 109114, 109119, 109124, 109129, 109134, 109139, 109144, 109149, 109154,
+ 109159, 109164, 109169, 109174, 109179, 109184, 109189, 109194, 109201,
+ 109206, 109211, 109218, 109225, 109230, 109235, 109240, 109245, 109250,
+ 109255, 109260, 109265, 109270, 109275, 109280, 109285, 109290, 109295,
+ 109300, 109305, 109310, 109315, 109320, 109325, 109330, 109335, 109340,
+ 109345, 109350, 109357, 109362, 109367, 109372, 109377, 109382, 109387,
+ 109392, 109397, 109402, 109407, 109412, 109417, 109422, 109427, 109432,
+ 109437, 109442, 109447, 109454, 109459, 109464, 109469, 109474, 109479,
+ 109484, 109489, 109495, 109500, 109505, 109510, 109515, 109520, 109525,
+ 109530, 109535, 109542, 109549, 109554, 109559, 109563, 109568, 109572,
+ 109576, 109581, 109588, 109593, 109598, 109607, 109612, 109617, 109622,
+ 109627, 109634, 109641, 109646, 109651, 109656, 109661, 109668, 109673,
+ 109678, 109683, 109688, 109693, 109698, 109703, 109708, 109713, 109718,
+ 109723, 109728, 109735, 109739, 109744, 109749, 109754, 109759, 109763,
+ 109768, 109773, 109778, 109783, 109788, 109793, 109798, 109803, 109808,
+ 109814, 109820, 109826, 109832, 109838, 109844, 109850, 109856, 109862,
+ 109868, 109874, 109880, 109885, 109891, 109897, 109903, 109909, 109915,
+ 109921, 109927, 109933, 109939, 109945, 109951, 109956, 109962, 109968,
+ 109974, 109980, 109986, 109992, 109998, 110004, 110010, 110016, 110022,
+ 110028, 110034, 110040, 110046, 110052, 110058, 110064, 110070, 110076,
+ 110081, 110087, 110093, 110099, 110105, 110111, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110112, 110115, 110119,
- 110123, 110127, 110130, 110134, 110139, 110143, 110147, 110151, 110155,
- 110159, 110164, 110169, 110173, 110177, 110180, 110184, 110189, 110194,
- 110198, 110202, 110206, 110210, 110214, 110218, 110222, 110226, 110230,
- 110234, 110237, 110241, 110245, 110249, 110253, 110257, 110261, 110267,
- 110270, 110274, 110278, 110282, 110286, 110290, 110294, 110298, 110302,
- 110306, 110311, 110316, 110322, 110326, 110330, 110334, 110338, 110342,
- 110346, 110351, 110354, 110358, 110362, 110366, 110370, 110376, 110380,
- 110384, 110388, 110392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110396, 110400,
- 110404, 110410, 110416, 110420, 110425, 110430, 110435, 110440, 110444,
- 110449, 110454, 110459, 110463, 110468, 110473, 110478, 110482, 110487,
- 110492, 110497, 110502, 110507, 110512, 110517, 110522, 110526, 110531,
- 110536, 110541, 110546, 110551, 110556, 110561, 110566, 110571, 110576,
- 110581, 110588, 110593, 110600, 110605, 110610, 110615, 110620, 110625,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110630, 110634, 110640,
- 110643, 110646, 110650, 110654, 110658, 110662, 110666, 110670, 110674,
- 110680, 110686, 110692, 110698, 110704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110117, 110120, 110124,
+ 110128, 110132, 110135, 110139, 110144, 110148, 110152, 110156, 110160,
+ 110164, 110169, 110174, 110178, 110182, 110185, 110189, 110194, 110199,
+ 110203, 110207, 110211, 110215, 110219, 110223, 110227, 110231, 110235,
+ 110239, 110242, 110246, 110250, 110254, 110258, 110262, 110266, 110272,
+ 110275, 110279, 110283, 110287, 110291, 110295, 110299, 110303, 110307,
+ 110311, 110316, 110321, 110327, 110331, 110335, 110339, 110343, 110347,
+ 110351, 110356, 110359, 110363, 110367, 110371, 110375, 110381, 110385,
+ 110389, 110393, 110397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110401, 110405,
+ 110409, 110415, 110421, 110425, 110430, 110435, 110440, 110445, 110449,
+ 110454, 110459, 110464, 110468, 110473, 110478, 110483, 110487, 110492,
+ 110497, 110502, 110507, 110512, 110517, 110522, 110527, 110531, 110536,
+ 110541, 110546, 110551, 110556, 110561, 110566, 110571, 110576, 110581,
+ 110586, 110593, 110598, 110605, 110610, 110615, 110620, 110625, 110630,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110635, 110639, 110645,
+ 110648, 110651, 110655, 110659, 110663, 110667, 110671, 110675, 110679,
+ 110685, 110691, 110697, 110703, 110709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110710, 110715, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110715, 110720, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 110721, 110726, 110731, 110736, 110743, 110750, 110757, 110764, 110769,
- 110774, 110779, 110784, 110791, 110796, 110803, 110810, 110815, 110820,
- 110825, 110832, 110837, 110842, 110849, 110856, 110861, 110866, 110871,
- 110878, 110885, 110892, 110897, 110902, 110909, 110916, 110923, 110930,
- 110935, 110940, 110945, 110952, 110957, 110962, 110967, 110974, 110983,
- 110990, 110995, 111000, 111005, 111010, 111015, 111020, 111029, 111036,
- 111041, 111048, 111055, 111060, 111065, 111070, 111077, 111082, 111089,
- 111096, 111101, 111106, 111111, 111118, 111125, 111130, 111135, 111142,
- 111149, 111156, 111161, 111166, 111171, 111176, 111183, 111192, 111201,
- 111206, 111213, 111222, 111227, 111232, 111237, 111242, 111249, 111256,
- 111263, 111270, 111275, 111280, 111285, 111292, 111299, 111306, 111311,
- 111316, 111323, 111328, 111335, 111340, 111347, 111352, 111359, 111366,
- 111371, 111376, 111381, 111386, 111391, 111396, 111401, 111406, 111411,
- 111418, 111425, 111432, 111439, 111446, 111455, 111460, 111465, 111472,
- 111479, 111484, 111491, 111498, 111505, 111512, 111519, 111526, 111531,
- 111536, 111541, 111546, 111551, 111560, 111569, 111578, 111587, 111596,
- 111605, 111614, 111623, 111628, 111639, 111650, 111659, 111664, 111669,
- 111674, 111679, 111688, 111695, 111702, 111709, 111716, 111723, 111730,
- 111739, 111748, 111759, 111768, 111779, 111788, 111795, 111804, 111815,
- 111824, 111833, 111842, 111851, 111858, 111865, 111872, 111881, 111890,
- 111901, 111910, 111919, 111930, 111935, 111940, 111951, 111959, 111968,
- 111977, 111986, 111997, 112006, 112015, 112026, 112037, 112048, 112059,
- 112070, 112081, 112088, 112095, 112102, 112109, 112120, 112129, 112136,
- 112143, 112150, 112161, 112172, 112183, 112194, 112205, 112216, 112227,
- 112238, 112245, 112252, 112261, 112270, 112277, 112284, 112291, 112300,
- 112309, 112318, 112325, 112334, 112343, 112352, 112359, 112366, 112371,
- 112377, 112384, 112391, 112398, 112405, 112412, 112419, 112428, 112437,
- 112446, 112455, 112462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112471, 112477,
- 112482, 112487, 112494, 112500, 112506, 112512, 112518, 112524, 112530,
- 112536, 112540, 112544, 112550, 112556, 112562, 112566, 112571, 112576,
- 112580, 112584, 112587, 112593, 112599, 112605, 112611, 112617, 112623,
- 112629, 112635, 112641, 112651, 112661, 112667, 112673, 112683, 112693,
- 112699, 0, 0, 112705, 112713, 112718, 112723, 112729, 112735, 112741,
- 112747, 112753, 112759, 112766, 112773, 112779, 112785, 112791, 112797,
- 112803, 112809, 112815, 112821, 112826, 112832, 112838, 112844, 112850,
- 112856, 112865, 112871, 112876, 112884, 112891, 112898, 112907, 112916,
- 112925, 112934, 112943, 112952, 112961, 112970, 112980, 112990, 112998,
- 113006, 113015, 113024, 113030, 113036, 113042, 113048, 113056, 113064,
- 113068, 113074, 113079, 113085, 113091, 113097, 113103, 113109, 113118,
- 113123, 113130, 113135, 113140, 113145, 113151, 113157, 113163, 113170,
- 113175, 113180, 113185, 113190, 113195, 113201, 113207, 113213, 113219,
- 113225, 113231, 113237, 113243, 113248, 113253, 113258, 113263, 113268,
- 113273, 113278, 113283, 113289, 113295, 113300, 113305, 113310, 113315,
- 113320, 113326, 113333, 113337, 113341, 113345, 113349, 113353, 113357,
- 113361, 113365, 113373, 113383, 113387, 113391, 113397, 113403, 113409,
- 113415, 113421, 113427, 113433, 113439, 113445, 113451, 113457, 113463,
- 113469, 113475, 113479, 113483, 113490, 113496, 113502, 113508, 113513,
- 113520, 113525, 113531, 113537, 113543, 113549, 113554, 113558, 113564,
- 113568, 113572, 113576, 113582, 113588, 113592, 113598, 113604, 113610,
- 113616, 113622, 113630, 113638, 113644, 113650, 113656, 113662, 113674,
- 113686, 113700, 113712, 113724, 113738, 113752, 113766, 113770, 113778,
- 113786, 113791, 113795, 113799, 113803, 113807, 113811, 113815, 113819,
- 113825, 113831, 113837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113843, 113849,
- 113855, 113861, 113867, 113873, 113879, 113885, 113891, 113897, 113903,
- 113909, 113915, 113921, 113927, 113933, 113939, 113945, 113951, 113957,
- 113963, 113969, 113975, 113981, 113987, 113993, 113999, 114005, 114011,
- 114017, 114023, 114029, 114035, 114041, 114047, 114053, 114059, 114065,
- 114071, 114077, 114083, 114089, 114095, 114101, 114107, 114113, 114119,
- 114125, 114131, 114137, 114143, 114149, 114155, 114161, 114167, 114173,
- 114179, 114185, 114191, 114197, 114203, 114209, 114215, 114221, 114227,
- 114233, 114239, 114244, 114249, 114254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 110726, 110731, 110736, 110741, 110748, 110755, 110762, 110769, 110774,
+ 110779, 110784, 110789, 110796, 110801, 110808, 110815, 110820, 110825,
+ 110830, 110837, 110842, 110847, 110854, 110861, 110866, 110871, 110876,
+ 110883, 110890, 110897, 110902, 110907, 110914, 110921, 110928, 110935,
+ 110940, 110945, 110950, 110957, 110962, 110967, 110972, 110979, 110988,
+ 110995, 111000, 111005, 111010, 111015, 111020, 111025, 111034, 111041,
+ 111046, 111053, 111060, 111065, 111070, 111075, 111082, 111087, 111094,
+ 111101, 111106, 111111, 111116, 111123, 111130, 111135, 111140, 111147,
+ 111154, 111161, 111166, 111171, 111176, 111181, 111188, 111197, 111206,
+ 111211, 111218, 111227, 111232, 111237, 111242, 111247, 111254, 111261,
+ 111268, 111275, 111280, 111285, 111290, 111297, 111304, 111311, 111316,
+ 111321, 111328, 111333, 111340, 111345, 111352, 111357, 111364, 111371,
+ 111376, 111381, 111386, 111391, 111396, 111401, 111406, 111411, 111416,
+ 111423, 111430, 111437, 111444, 111451, 111460, 111465, 111470, 111477,
+ 111484, 111489, 111496, 111503, 111510, 111517, 111524, 111531, 111536,
+ 111541, 111546, 111551, 111556, 111565, 111574, 111583, 111592, 111601,
+ 111610, 111619, 111628, 111633, 111644, 111655, 111664, 111669, 111674,
+ 111679, 111684, 111693, 111700, 111707, 111714, 111721, 111728, 111735,
+ 111744, 111753, 111764, 111773, 111784, 111793, 111800, 111809, 111820,
+ 111829, 111838, 111847, 111856, 111863, 111870, 111877, 111886, 111895,
+ 111906, 111915, 111924, 111935, 111940, 111945, 111956, 111964, 111973,
+ 111982, 111991, 112002, 112011, 112020, 112031, 112042, 112053, 112064,
+ 112075, 112086, 112093, 112100, 112107, 112114, 112125, 112134, 112141,
+ 112148, 112155, 112166, 112177, 112188, 112199, 112210, 112221, 112232,
+ 112243, 112250, 112257, 112266, 112275, 112282, 112289, 112296, 112305,
+ 112314, 112323, 112330, 112339, 112348, 112357, 112364, 112371, 112376,
+ 112382, 112389, 112396, 112403, 112410, 112417, 112424, 112433, 112442,
+ 112451, 112460, 112467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112476, 112482,
+ 112487, 112492, 112499, 112505, 112511, 112517, 112523, 112529, 112535,
+ 112541, 112545, 112549, 112555, 112561, 112567, 112571, 112576, 112581,
+ 112585, 112589, 112592, 112598, 112604, 112610, 112616, 112622, 112628,
+ 112634, 112640, 112646, 112656, 112666, 112672, 112678, 112688, 112698,
+ 112704, 0, 0, 112710, 112718, 112723, 112728, 112734, 112740, 112746,
+ 112752, 112758, 112764, 112771, 112778, 112784, 112790, 112796, 112802,
+ 112808, 112814, 112820, 112826, 112831, 112837, 112843, 112849, 112855,
+ 112861, 112870, 112876, 112881, 112889, 112896, 112903, 112912, 112921,
+ 112930, 112939, 112948, 112957, 112966, 112975, 112985, 112995, 113003,
+ 113011, 113020, 113029, 113035, 113041, 113047, 113053, 113061, 113069,
+ 113073, 113079, 113084, 113090, 113096, 113102, 113108, 113114, 113123,
+ 113128, 113135, 113140, 113145, 113150, 113156, 113162, 113168, 113175,
+ 113180, 113185, 113190, 113195, 113200, 113206, 113212, 113218, 113224,
+ 113230, 113236, 113242, 113248, 113253, 113258, 113263, 113268, 113273,
+ 113278, 113283, 113288, 113294, 113300, 113305, 113310, 113315, 113320,
+ 113325, 113331, 113338, 113342, 113346, 113350, 113354, 113358, 113362,
+ 113366, 113370, 113378, 113388, 113392, 113396, 113402, 113408, 113414,
+ 113420, 113426, 113432, 113438, 113444, 113450, 113456, 113462, 113468,
+ 113474, 113480, 113484, 113488, 113495, 113501, 113507, 113513, 113518,
+ 113525, 113530, 113536, 113542, 113548, 113554, 113559, 113563, 113569,
+ 113573, 113577, 113581, 113587, 113593, 113597, 113603, 113609, 113615,
+ 113621, 113627, 113635, 113643, 113649, 113655, 113661, 113667, 113679,
+ 113691, 113705, 113717, 113729, 113743, 113757, 113771, 113775, 113783,
+ 113791, 113796, 113800, 113804, 113808, 113812, 113816, 113820, 113824,
+ 113830, 113836, 113842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113848, 113854,
+ 113860, 113866, 113872, 113878, 113884, 113890, 113896, 113902, 113908,
+ 113914, 113920, 113926, 113932, 113938, 113944, 113950, 113956, 113962,
+ 113968, 113974, 113980, 113986, 113992, 113998, 114004, 114010, 114016,
+ 114022, 114028, 114034, 114040, 114046, 114052, 114058, 114064, 114070,
+ 114076, 114082, 114088, 114094, 114100, 114106, 114112, 114118, 114124,
+ 114130, 114136, 114142, 114148, 114154, 114160, 114166, 114172, 114178,
+ 114184, 114190, 114196, 114202, 114208, 114214, 114220, 114226, 114232,
+ 114238, 114244, 114249, 114254, 114259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 114258, 114263, 114270, 114277, 114284, 114291, 114296, 114300, 114306,
- 114310, 114314, 114320, 114324, 114328, 114332, 114338, 114345, 114349,
- 114353, 114357, 114361, 114365, 114369, 114375, 114379, 114383, 114387,
- 114391, 114395, 114399, 114403, 114407, 114411, 114415, 114419, 114423,
- 114428, 114432, 114436, 114440, 114444, 114448, 114452, 114456, 114460,
- 114464, 114471, 114475, 114483, 114487, 114491, 114495, 114499, 114503,
- 114507, 114511, 114518, 114522, 114526, 114530, 114534, 114538, 114544,
- 114548, 114554, 114558, 114562, 114566, 114570, 114574, 114578, 114582,
- 114586, 114590, 114594, 114598, 114602, 114606, 114610, 114614, 114618,
- 114622, 114626, 114630, 114638, 114642, 114646, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 114650, 114658, 114666, 114674, 114682, 114690, 114698, 114706,
- 114714, 114722, 114730, 114738, 114746, 114754, 114762, 114770, 114778,
- 114786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114794, 114798, 114803,
- 114808, 114813, 114817, 114822, 114827, 114832, 114836, 114841, 114846,
- 114850, 114854, 114859, 114863, 114868, 114873, 114877, 114882, 114887,
- 114891, 114896, 114901, 114906, 114911, 114916, 114920, 114925, 114930,
- 114935, 114939, 114944, 114949, 114954, 114958, 114963, 114968, 114972,
- 114976, 114981, 114985, 114990, 114995, 114999, 115004, 115009, 115013,
- 115018, 115023, 115028, 115033, 115038, 115042, 115047, 115052, 115057,
- 115061, 115066, 115071, 115076, 115080, 115085, 115090, 115094, 115098,
- 115103, 115107, 115112, 115117, 115121, 115126, 115131, 115135, 115140,
- 115145, 115150, 115155, 115160, 115164, 115169, 115174, 115179, 115183,
- 115188, 0, 115193, 115197, 115202, 115207, 115211, 115215, 115220,
- 115224, 115229, 115234, 115238, 115243, 115248, 115252, 115257, 115262,
- 115267, 115272, 115277, 115282, 115288, 115294, 115300, 115305, 115311,
- 115317, 115323, 115328, 115334, 115340, 115345, 115350, 115356, 115361,
- 115367, 115373, 115378, 115384, 115390, 115395, 115401, 115407, 115413,
- 115419, 115425, 115430, 115436, 115442, 115448, 115453, 115459, 115465,
- 115471, 115476, 115482, 115488, 115493, 115498, 115504, 115509, 115515,
- 115521, 115526, 115532, 115538, 115543, 115549, 115555, 115561, 115567,
- 115573, 0, 115577, 115582, 0, 0, 115587, 0, 0, 115592, 115597, 0, 0,
- 115602, 115607, 115611, 115616, 0, 115621, 115626, 115631, 115635,
- 115640, 115645, 115650, 115655, 115660, 115664, 115669, 115674, 0,
- 115679, 0, 115684, 115689, 115693, 115698, 115703, 115707, 115711, 0,
- 115716, 115721, 115726, 115730, 115735, 115740, 115744, 115749, 115754,
- 115759, 115764, 115769, 115774, 115780, 115786, 115792, 115797, 115803,
- 115809, 115815, 115820, 115826, 115832, 115837, 115842, 115848, 115853,
- 115859, 115865, 115870, 115876, 115882, 115887, 115893, 115899, 115905,
- 115911, 115917, 115922, 115928, 115934, 115940, 115945, 115951, 115957,
- 115963, 115968, 115974, 115980, 115985, 115990, 115996, 116001, 116007,
- 116013, 116018, 116024, 116030, 116035, 116041, 116047, 116053, 116059,
- 116065, 116069, 0, 116074, 116079, 116083, 116088, 0, 0, 116093, 116098,
- 116103, 116107, 116111, 116116, 116120, 116125, 0, 116130, 116135,
- 116140, 116144, 116149, 116154, 116159, 0, 116164, 116168, 116173,
- 116178, 116183, 116187, 116192, 116197, 116202, 116206, 116211, 116216,
- 116220, 116224, 116229, 116233, 116238, 116243, 116247, 116252, 116257,
- 116261, 116266, 116271, 116276, 116281, 116286, 116290, 0, 116295,
- 116300, 116304, 116309, 0, 116314, 116318, 116323, 116328, 116332, 0,
- 116336, 0, 0, 0, 116340, 116345, 116350, 116354, 116359, 116364, 116369,
- 0, 116374, 116378, 116383, 116388, 116393, 116397, 116402, 116407,
- 116412, 116416, 116421, 116426, 116430, 116434, 116439, 116443, 116448,
- 116453, 116457, 116462, 116467, 116471, 116476, 116481, 116486, 116491,
- 116496, 116501, 116507, 116513, 116519, 116524, 116530, 116536, 116542,
- 116547, 116553, 116559, 116564, 116569, 116575, 116580, 116586, 116592,
- 116597, 116603, 116609, 116614, 116620, 116626, 116632, 116638, 116644,
- 116649, 116655, 116661, 116667, 116672, 116678, 116684, 116690, 116695,
- 116701, 116707, 116712, 116717, 116723, 116728, 116734, 116740, 116745,
- 116751, 116757, 116762, 116768, 116774, 116780, 116786, 116792, 116796,
- 116801, 116806, 116811, 116815, 116820, 116825, 116830, 116834, 116839,
- 116844, 116848, 116852, 116857, 116861, 116866, 116871, 116875, 116880,
- 116885, 116889, 116894, 116899, 116904, 116909, 116914, 116918, 116923,
- 116928, 116933, 116937, 116942, 116947, 116952, 116956, 116961, 116966,
- 116970, 116974, 116979, 116983, 116988, 116993, 116997, 117002, 117007,
- 117011, 117016, 117021, 117026, 117031, 117036, 117041, 117047, 117053,
- 117059, 117064, 117070, 117076, 117082, 117087, 117093, 117099, 117104,
- 117109, 117115, 117120, 117126, 117132, 117137, 117143, 117149, 117154,
- 117160, 117166, 117172, 117178, 117184, 117189, 117195, 117201, 117207,
- 117212, 117218, 117224, 117230, 117235, 117241, 117247, 117252, 117257,
- 117263, 117268, 117274, 117280, 117285, 117291, 117297, 117302, 117308,
- 117314, 117320, 117326, 117332, 117337, 117343, 117349, 117355, 117360,
- 117366, 117372, 117378, 117383, 117389, 117395, 117400, 117405, 117411,
- 117416, 117422, 117428, 117433, 117439, 117445, 117450, 117456, 117462,
- 117468, 117474, 117480, 117485, 117491, 117497, 117503, 117508, 117514,
- 117520, 117526, 117531, 117537, 117543, 117548, 117553, 117559, 117564,
- 117570, 117576, 117581, 117587, 117593, 117598, 117604, 117610, 117616,
- 117622, 117628, 117634, 117641, 117648, 117655, 117661, 117668, 117675,
- 117682, 117688, 117695, 117702, 117708, 117714, 117721, 117727, 117734,
- 117741, 117747, 117754, 117761, 117767, 117774, 117781, 117788, 117795,
- 117802, 117808, 117815, 117822, 117829, 117835, 117842, 117849, 117856,
- 117862, 117869, 117876, 117882, 117888, 117895, 117901, 117908, 117915,
- 117921, 117928, 117935, 117941, 117948, 117955, 117962, 117969, 117976,
- 117981, 117987, 117993, 117999, 118004, 118010, 118016, 118022, 118027,
- 118033, 118039, 118044, 118049, 118055, 118060, 118066, 118072, 118077,
- 118083, 118089, 118094, 118100, 118106, 118112, 118118, 118124, 118129,
- 118135, 118141, 118147, 118152, 118158, 118164, 118170, 118175, 118181,
- 118187, 118192, 118197, 118203, 118208, 118214, 118220, 118225, 118231,
- 118237, 118242, 118248, 118254, 118260, 118266, 118272, 118278, 0, 0,
- 118285, 118290, 118295, 118300, 118305, 118310, 118315, 118320, 118325,
- 118330, 118335, 118340, 118345, 118350, 118355, 118360, 118365, 118370,
- 118376, 118381, 118386, 118391, 118396, 118401, 118406, 118411, 118415,
- 118420, 118425, 118430, 118435, 118440, 118445, 118450, 118455, 118460,
- 118465, 118470, 118475, 118480, 118485, 118490, 118495, 118500, 118506,
- 118511, 118516, 118521, 118526, 118531, 118536, 118541, 118547, 118552,
- 118557, 118562, 118567, 118572, 118577, 118582, 118587, 118592, 118597,
- 118602, 118607, 118612, 118617, 118622, 118627, 118632, 118637, 118642,
- 118647, 118652, 118657, 118662, 118668, 118673, 118678, 118683, 118688,
- 118693, 118698, 118703, 118707, 118712, 118717, 118722, 118727, 118732,
- 118737, 118742, 118747, 118752, 118757, 118762, 118767, 118772, 118777,
- 118782, 118787, 118792, 118798, 118803, 118808, 118813, 118818, 118823,
- 118828, 118833, 118839, 118844, 118849, 118854, 118859, 118864, 118869,
- 118875, 118881, 118887, 118893, 118899, 118905, 118911, 118917, 118923,
- 118929, 118935, 118941, 118947, 118953, 118959, 118965, 118971, 118978,
- 118984, 118990, 118996, 119002, 119008, 119014, 119020, 119025, 119031,
- 119037, 119043, 119049, 119055, 119061, 119067, 119073, 119079, 119085,
- 119091, 119097, 119103, 119109, 119115, 119121, 119127, 119134, 119140,
- 119146, 119152, 119158, 119164, 119170, 119176, 119183, 119189, 119195,
- 119201, 119207, 119213, 119219, 119225, 119231, 119237, 119243, 119249,
- 119255, 119261, 119267, 119273, 119279, 119285, 119291, 119297, 119303,
- 119309, 119315, 119321, 119328, 119334, 119340, 119346, 119352, 119358,
- 119364, 119370, 119375, 119381, 119387, 119393, 119399, 119405, 119411,
- 119417, 119423, 119429, 119435, 119441, 119447, 119453, 119459, 119465,
- 119471, 119477, 119484, 119490, 119496, 119502, 119508, 119514, 119520,
- 119526, 119533, 119539, 119545, 119551, 119557, 119563, 119569, 119576,
- 119583, 119590, 119597, 119604, 119611, 119618, 119625, 119632, 119639,
- 119646, 119653, 119660, 119667, 119674, 119681, 119688, 119696, 119703,
- 119710, 119717, 119724, 119731, 119738, 119745, 119751, 119758, 119765,
- 119772, 119779, 119786, 119793, 119800, 119807, 119814, 119821, 119828,
- 119835, 119842, 119849, 119856, 119863, 119870, 119878, 119885, 119892,
- 119899, 119906, 119913, 119920, 119927, 119935, 119942, 119949, 119956,
- 119963, 119970, 119977, 119982, 0, 0, 119987, 119992, 119996, 120000,
- 120004, 120008, 120012, 120016, 120020, 120024, 120028, 120033, 120037,
- 120041, 120045, 120049, 120053, 120057, 120061, 120065, 120069, 120074,
- 120078, 120082, 120086, 120090, 120094, 120098, 120102, 120106, 120110,
- 120116, 120121, 120126, 120131, 120136, 120141, 120146, 120151, 120156,
- 120161, 120167, 120172, 120177, 120182, 120187, 120192, 120197, 120202,
- 120207, 120212, 120216, 120220, 120224, 0, 120228, 120232, 120236,
- 120240, 120244, 120248, 120252, 120256, 120260, 120264, 120268, 120272,
- 120276, 120280, 120284, 120288, 120292, 120296, 120300, 120304, 120308,
- 120312, 120316, 120320, 120326, 120332, 120338, 0, 120344, 120349, 0,
- 120354, 0, 0, 120359, 0, 120364, 120369, 120374, 120379, 120384, 120389,
- 120394, 120399, 120404, 120409, 0, 120414, 120419, 120424, 120429, 0,
- 120434, 0, 120439, 0, 0, 0, 0, 0, 0, 120444, 0, 0, 0, 0, 120450, 0,
- 120456, 0, 120462, 0, 120468, 120474, 120480, 0, 120486, 120492, 0,
- 120498, 0, 0, 120504, 0, 120510, 0, 120516, 0, 120522, 0, 120530, 0,
- 120538, 120544, 0, 120550, 0, 0, 120556, 120562, 120568, 120574, 0,
- 120580, 120586, 120592, 120598, 120604, 120610, 120616, 0, 120622,
- 120628, 120634, 120640, 0, 120646, 120652, 120658, 120664, 0, 120672, 0,
- 120680, 120686, 120692, 120698, 120704, 120710, 120716, 120722, 120728,
- 120734, 0, 120740, 120746, 120752, 120758, 120764, 120770, 120776,
- 120782, 120788, 120794, 120800, 120806, 120812, 120818, 120824, 120830,
- 120836, 0, 0, 0, 0, 0, 120842, 120847, 120852, 0, 120857, 120862, 120867,
- 120872, 120877, 0, 120882, 120887, 120892, 120897, 120902, 120907,
- 120912, 120917, 120922, 120927, 120932, 120937, 120942, 120947, 120952,
- 120957, 120962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 114263, 114268, 114275, 114282, 114289, 114296, 114301, 114305, 114311,
+ 114315, 114319, 114325, 114329, 114333, 114337, 114343, 114350, 114354,
+ 114358, 114362, 114366, 114370, 114374, 114380, 114384, 114388, 114392,
+ 114396, 114400, 114404, 114408, 114412, 114416, 114420, 114424, 114428,
+ 114433, 114437, 114441, 114445, 114449, 114453, 114457, 114461, 114465,
+ 114469, 114476, 114480, 114488, 114492, 114496, 114500, 114504, 114508,
+ 114512, 114516, 114523, 114527, 114531, 114535, 114539, 114543, 114549,
+ 114553, 114559, 114563, 114567, 114571, 114575, 114579, 114583, 114587,
+ 114591, 114595, 114599, 114603, 114607, 114611, 114615, 114619, 114623,
+ 114627, 114631, 114635, 114643, 114647, 114651, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 114655, 114663, 114671, 114679, 114687, 114695, 114703, 114711,
+ 114719, 114727, 114735, 114743, 114751, 114759, 114767, 114775, 114783,
+ 114791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114799, 114803, 114808,
+ 114813, 114818, 114822, 114827, 114832, 114837, 114841, 114846, 114851,
+ 114855, 114859, 114864, 114868, 114873, 114878, 114882, 114887, 114892,
+ 114896, 114901, 114906, 114911, 114916, 114921, 114925, 114930, 114935,
+ 114940, 114944, 114949, 114954, 114959, 114963, 114968, 114973, 114977,
+ 114981, 114986, 114990, 114995, 115000, 115004, 115009, 115014, 115018,
+ 115023, 115028, 115033, 115038, 115043, 115047, 115052, 115057, 115062,
+ 115066, 115071, 115076, 115081, 115085, 115090, 115095, 115099, 115103,
+ 115108, 115112, 115117, 115122, 115126, 115131, 115136, 115140, 115145,
+ 115150, 115155, 115160, 115165, 115169, 115174, 115179, 115184, 115188,
+ 115193, 0, 115198, 115202, 115207, 115212, 115216, 115220, 115225,
+ 115229, 115234, 115239, 115243, 115248, 115253, 115257, 115262, 115267,
+ 115272, 115277, 115282, 115287, 115293, 115299, 115305, 115310, 115316,
+ 115322, 115328, 115333, 115339, 115345, 115350, 115355, 115361, 115366,
+ 115372, 115378, 115383, 115389, 115395, 115400, 115406, 115412, 115418,
+ 115424, 115430, 115435, 115441, 115447, 115453, 115458, 115464, 115470,
+ 115476, 115481, 115487, 115493, 115498, 115503, 115509, 115514, 115520,
+ 115526, 115531, 115537, 115543, 115548, 115554, 115560, 115566, 115572,
+ 115578, 0, 115582, 115587, 0, 0, 115592, 0, 0, 115597, 115602, 0, 0,
+ 115607, 115612, 115616, 115621, 0, 115626, 115631, 115636, 115640,
+ 115645, 115650, 115655, 115660, 115665, 115669, 115674, 115679, 0,
+ 115684, 0, 115689, 115694, 115698, 115703, 115708, 115712, 115716, 0,
+ 115721, 115726, 115731, 115735, 115740, 115745, 115749, 115754, 115759,
+ 115764, 115769, 115774, 115779, 115785, 115791, 115797, 115802, 115808,
+ 115814, 115820, 115825, 115831, 115837, 115842, 115847, 115853, 115858,
+ 115864, 115870, 115875, 115881, 115887, 115892, 115898, 115904, 115910,
+ 115916, 115922, 115927, 115933, 115939, 115945, 115950, 115956, 115962,
+ 115968, 115973, 115979, 115985, 115990, 115995, 116001, 116006, 116012,
+ 116018, 116023, 116029, 116035, 116040, 116046, 116052, 116058, 116064,
+ 116070, 116074, 0, 116079, 116084, 116088, 116093, 0, 0, 116098, 116103,
+ 116108, 116112, 116116, 116121, 116125, 116130, 0, 116135, 116140,
+ 116145, 116149, 116154, 116159, 116164, 0, 116169, 116173, 116178,
+ 116183, 116188, 116192, 116197, 116202, 116207, 116211, 116216, 116221,
+ 116225, 116229, 116234, 116238, 116243, 116248, 116252, 116257, 116262,
+ 116266, 116271, 116276, 116281, 116286, 116291, 116295, 0, 116300,
+ 116305, 116309, 116314, 0, 116319, 116323, 116328, 116333, 116337, 0,
+ 116341, 0, 0, 0, 116345, 116350, 116355, 116359, 116364, 116369, 116374,
+ 0, 116379, 116383, 116388, 116393, 116398, 116402, 116407, 116412,
+ 116417, 116421, 116426, 116431, 116435, 116439, 116444, 116448, 116453,
+ 116458, 116462, 116467, 116472, 116476, 116481, 116486, 116491, 116496,
+ 116501, 116506, 116512, 116518, 116524, 116529, 116535, 116541, 116547,
+ 116552, 116558, 116564, 116569, 116574, 116580, 116585, 116591, 116597,
+ 116602, 116608, 116614, 116619, 116625, 116631, 116637, 116643, 116649,
+ 116654, 116660, 116666, 116672, 116677, 116683, 116689, 116695, 116700,
+ 116706, 116712, 116717, 116722, 116728, 116733, 116739, 116745, 116750,
+ 116756, 116762, 116767, 116773, 116779, 116785, 116791, 116797, 116801,
+ 116806, 116811, 116816, 116820, 116825, 116830, 116835, 116839, 116844,
+ 116849, 116853, 116857, 116862, 116866, 116871, 116876, 116880, 116885,
+ 116890, 116894, 116899, 116904, 116909, 116914, 116919, 116923, 116928,
+ 116933, 116938, 116942, 116947, 116952, 116957, 116961, 116966, 116971,
+ 116975, 116979, 116984, 116988, 116993, 116998, 117002, 117007, 117012,
+ 117016, 117021, 117026, 117031, 117036, 117041, 117046, 117052, 117058,
+ 117064, 117069, 117075, 117081, 117087, 117092, 117098, 117104, 117109,
+ 117114, 117120, 117125, 117131, 117137, 117142, 117148, 117154, 117159,
+ 117165, 117171, 117177, 117183, 117189, 117194, 117200, 117206, 117212,
+ 117217, 117223, 117229, 117235, 117240, 117246, 117252, 117257, 117262,
+ 117268, 117273, 117279, 117285, 117290, 117296, 117302, 117307, 117313,
+ 117319, 117325, 117331, 117337, 117342, 117348, 117354, 117360, 117365,
+ 117371, 117377, 117383, 117388, 117394, 117400, 117405, 117410, 117416,
+ 117421, 117427, 117433, 117438, 117444, 117450, 117455, 117461, 117467,
+ 117473, 117479, 117485, 117490, 117496, 117502, 117508, 117513, 117519,
+ 117525, 117531, 117536, 117542, 117548, 117553, 117558, 117564, 117569,
+ 117575, 117581, 117586, 117592, 117598, 117603, 117609, 117615, 117621,
+ 117627, 117633, 117639, 117646, 117653, 117660, 117666, 117673, 117680,
+ 117687, 117693, 117700, 117707, 117713, 117719, 117726, 117732, 117739,
+ 117746, 117752, 117759, 117766, 117772, 117779, 117786, 117793, 117800,
+ 117807, 117813, 117820, 117827, 117834, 117840, 117847, 117854, 117861,
+ 117867, 117874, 117881, 117887, 117893, 117900, 117906, 117913, 117920,
+ 117926, 117933, 117940, 117946, 117953, 117960, 117967, 117974, 117981,
+ 117986, 117992, 117998, 118004, 118009, 118015, 118021, 118027, 118032,
+ 118038, 118044, 118049, 118054, 118060, 118065, 118071, 118077, 118082,
+ 118088, 118094, 118099, 118105, 118111, 118117, 118123, 118129, 118134,
+ 118140, 118146, 118152, 118157, 118163, 118169, 118175, 118180, 118186,
+ 118192, 118197, 118202, 118208, 118213, 118219, 118225, 118230, 118236,
+ 118242, 118247, 118253, 118259, 118265, 118271, 118277, 118283, 0, 0,
+ 118290, 118295, 118300, 118305, 118310, 118315, 118320, 118325, 118330,
+ 118335, 118340, 118345, 118350, 118355, 118360, 118365, 118370, 118375,
+ 118381, 118386, 118391, 118396, 118401, 118406, 118411, 118416, 118420,
+ 118425, 118430, 118435, 118440, 118445, 118450, 118455, 118460, 118465,
+ 118470, 118475, 118480, 118485, 118490, 118495, 118500, 118505, 118511,
+ 118516, 118521, 118526, 118531, 118536, 118541, 118546, 118552, 118557,
+ 118562, 118567, 118572, 118577, 118582, 118587, 118592, 118597, 118602,
+ 118607, 118612, 118617, 118622, 118627, 118632, 118637, 118642, 118647,
+ 118652, 118657, 118662, 118667, 118673, 118678, 118683, 118688, 118693,
+ 118698, 118703, 118708, 118712, 118717, 118722, 118727, 118732, 118737,
+ 118742, 118747, 118752, 118757, 118762, 118767, 118772, 118777, 118782,
+ 118787, 118792, 118797, 118803, 118808, 118813, 118818, 118823, 118828,
+ 118833, 118838, 118844, 118849, 118854, 118859, 118864, 118869, 118874,
+ 118880, 118886, 118892, 118898, 118904, 118910, 118916, 118922, 118928,
+ 118934, 118940, 118946, 118952, 118958, 118964, 118970, 118976, 118983,
+ 118989, 118995, 119001, 119007, 119013, 119019, 119025, 119030, 119036,
+ 119042, 119048, 119054, 119060, 119066, 119072, 119078, 119084, 119090,
+ 119096, 119102, 119108, 119114, 119120, 119126, 119132, 119139, 119145,
+ 119151, 119157, 119163, 119169, 119175, 119181, 119188, 119194, 119200,
+ 119206, 119212, 119218, 119224, 119230, 119236, 119242, 119248, 119254,
+ 119260, 119266, 119272, 119278, 119284, 119290, 119296, 119302, 119308,
+ 119314, 119320, 119326, 119333, 119339, 119345, 119351, 119357, 119363,
+ 119369, 119375, 119380, 119386, 119392, 119398, 119404, 119410, 119416,
+ 119422, 119428, 119434, 119440, 119446, 119452, 119458, 119464, 119470,
+ 119476, 119482, 119489, 119495, 119501, 119507, 119513, 119519, 119525,
+ 119531, 119538, 119544, 119550, 119556, 119562, 119568, 119574, 119581,
+ 119588, 119595, 119602, 119609, 119616, 119623, 119630, 119637, 119644,
+ 119651, 119658, 119665, 119672, 119679, 119686, 119693, 119701, 119708,
+ 119715, 119722, 119729, 119736, 119743, 119750, 119756, 119763, 119770,
+ 119777, 119784, 119791, 119798, 119805, 119812, 119819, 119826, 119833,
+ 119840, 119847, 119854, 119861, 119868, 119875, 119883, 119890, 119897,
+ 119904, 119911, 119918, 119925, 119932, 119940, 119947, 119954, 119961,
+ 119968, 119975, 119982, 119987, 0, 0, 119992, 119997, 120001, 120005,
+ 120009, 120013, 120017, 120021, 120025, 120029, 120033, 120038, 120042,
+ 120046, 120050, 120054, 120058, 120062, 120066, 120070, 120074, 120079,
+ 120083, 120087, 120091, 120095, 120099, 120103, 120107, 120111, 120115,
+ 120121, 120126, 120131, 120136, 120141, 120146, 120151, 120156, 120161,
+ 120166, 120172, 120177, 120182, 120187, 120192, 120197, 120202, 120207,
+ 120212, 120217, 120221, 120225, 120229, 0, 120233, 120237, 120241,
+ 120245, 120249, 120253, 120257, 120261, 120265, 120269, 120273, 120277,
+ 120281, 120285, 120289, 120293, 120297, 120301, 120305, 120309, 120313,
+ 120317, 120321, 120325, 120331, 120337, 120343, 0, 120349, 120354, 0,
+ 120359, 0, 0, 120364, 0, 120369, 120374, 120379, 120384, 120389, 120394,
+ 120399, 120404, 120409, 120414, 0, 120419, 120424, 120429, 120434, 0,
+ 120439, 0, 120444, 0, 0, 0, 0, 0, 0, 120449, 0, 0, 0, 0, 120455, 0,
+ 120461, 0, 120467, 0, 120473, 120479, 120485, 0, 120491, 120497, 0,
+ 120503, 0, 0, 120509, 0, 120515, 0, 120521, 0, 120527, 0, 120535, 0,
+ 120543, 120549, 0, 120555, 0, 0, 120561, 120567, 120573, 120579, 0,
+ 120585, 120591, 120597, 120603, 120609, 120615, 120621, 0, 120627,
+ 120633, 120639, 120645, 0, 120651, 120657, 120663, 120669, 0, 120677, 0,
+ 120685, 120691, 120697, 120703, 120709, 120715, 120721, 120727, 120733,
+ 120739, 0, 120745, 120751, 120757, 120763, 120769, 120775, 120781,
+ 120787, 120793, 120799, 120805, 120811, 120817, 120823, 120829, 120835,
+ 120841, 0, 0, 0, 0, 0, 120847, 120852, 120857, 0, 120862, 120867, 120872,
+ 120877, 120882, 0, 120887, 120892, 120897, 120902, 120907, 120912,
+ 120917, 120922, 120927, 120932, 120937, 120942, 120947, 120952, 120957,
+ 120962, 120967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 120967, 120977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 120985, 120992, 120999, 121006, 121013, 121020, 121027,
- 121033, 121040, 121047, 121054, 121062, 121070, 121078, 121086, 121094,
- 121102, 121109, 121116, 121123, 121131, 121139, 121147, 121155, 121163,
- 121171, 121178, 121185, 121192, 121200, 121208, 121216, 121224, 121232,
- 121240, 121245, 121250, 121255, 121260, 121265, 121270, 121275, 121280,
- 121285, 0, 0, 0, 0, 121290, 121295, 121299, 121303, 121307, 121311,
- 121315, 121319, 121323, 121327, 121331, 121335, 121339, 121343, 121347,
- 121351, 121355, 121359, 121363, 121367, 121371, 121375, 121379, 121383,
- 121387, 121391, 121395, 121399, 121403, 121407, 121411, 121415, 121419,
- 121423, 121427, 121431, 121435, 121439, 121443, 121447, 121451, 121455,
- 121459, 121463, 121467, 121471, 121475, 121479, 121483, 121487, 121491,
- 121496, 121500, 121504, 121508, 121512, 121516, 121520, 121524, 121528,
- 121532, 121536, 121540, 121544, 121548, 121552, 121556, 121560, 121564,
- 121568, 121572, 121576, 121580, 121584, 121588, 121592, 121596, 121600,
- 121604, 121608, 121612, 121616, 121620, 121624, 121628, 121632, 121636,
- 121640, 121644, 121648, 121652, 121656, 121660, 121664, 121668, 121672,
- 121676, 121680, 121684, 121688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 121692, 121698, 121707, 121715, 121723, 121732, 121741, 121750, 121759,
- 121768, 121777, 121786, 121795, 121804, 121813, 0, 0, 121822, 121831,
- 121839, 121847, 121856, 121865, 121874, 121883, 121892, 121901, 121910,
- 121919, 121928, 121937, 0, 0, 121946, 121955, 121963, 121971, 121980,
- 121989, 121998, 122007, 122016, 122025, 122034, 122043, 122052, 122061,
- 122070, 0, 122077, 122086, 122094, 122102, 122111, 122120, 122129,
- 122138, 122147, 122156, 122165, 122174, 122183, 122192, 122201, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 120972, 120982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 120990, 120997, 121004, 121011, 121018, 121025, 121032,
+ 121038, 121045, 121052, 121059, 121067, 121075, 121083, 121091, 121099,
+ 121107, 121114, 121121, 121128, 121136, 121144, 121152, 121160, 121168,
+ 121176, 121183, 121190, 121197, 121205, 121213, 121221, 121229, 121237,
+ 121245, 121250, 121255, 121260, 121265, 121270, 121275, 121280, 121285,
+ 121290, 0, 0, 0, 0, 121295, 121300, 121304, 121308, 121312, 121316,
+ 121320, 121324, 121328, 121332, 121336, 121340, 121344, 121348, 121352,
+ 121356, 121360, 121364, 121368, 121372, 121376, 121380, 121384, 121388,
+ 121392, 121396, 121400, 121404, 121408, 121412, 121416, 121420, 121424,
+ 121428, 121432, 121436, 121440, 121444, 121448, 121452, 121456, 121460,
+ 121464, 121468, 121472, 121476, 121480, 121484, 121488, 121492, 121496,
+ 121501, 121505, 121509, 121513, 121517, 121521, 121525, 121529, 121533,
+ 121537, 121541, 121545, 121549, 121553, 121557, 121561, 121565, 121569,
+ 121573, 121577, 121581, 121585, 121589, 121593, 121597, 121601, 121605,
+ 121609, 121613, 121617, 121621, 121625, 121629, 121633, 121637, 121641,
+ 121645, 121649, 121653, 121657, 121661, 121665, 121669, 121673, 121677,
+ 121681, 121685, 121689, 121693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 121697, 121703, 121712, 121720, 121728, 121737, 121746, 121755, 121764,
+ 121773, 121782, 121791, 121800, 121809, 121818, 0, 0, 121827, 121836,
+ 121844, 121852, 121861, 121870, 121879, 121888, 121897, 121906, 121915,
+ 121924, 121933, 121942, 0, 0, 121951, 121960, 121968, 121976, 121985,
+ 121994, 122003, 122012, 122021, 122030, 122039, 122048, 122057, 122066,
+ 122075, 0, 122082, 122091, 122099, 122107, 122116, 122125, 122134,
+ 122143, 122152, 122161, 122170, 122179, 122188, 122197, 122206, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 122208, 122215, 122220, 122224, 122228, 122232, 122237,
- 122242, 122247, 122252, 122257, 0, 0, 0, 0, 0, 122262, 122267, 122273,
- 122279, 122285, 122290, 122296, 122302, 122308, 122313, 122319, 122325,
- 122330, 122335, 122341, 122346, 122352, 122358, 122363, 122369, 122375,
- 122380, 122386, 122392, 122398, 122404, 122410, 122421, 122428, 122434,
- 122437, 0, 122440, 122445, 122451, 122457, 122463, 122468, 122474,
- 122480, 122486, 122491, 122497, 122503, 122508, 122513, 122519, 122524,
- 122530, 122536, 122541, 122547, 122553, 122558, 122564, 122570, 122576,
- 122582, 122588, 122591, 122594, 122597, 122600, 122603, 122606, 122612,
- 122619, 122626, 122633, 122639, 122646, 122653, 122660, 122666, 122673,
- 122680, 122686, 122692, 122699, 122705, 122712, 122719, 122725, 122732,
- 122739, 122745, 122752, 122759, 122766, 122773, 122780, 122785, 0, 0, 0,
- 0, 122790, 122796, 122803, 122810, 122817, 122823, 122830, 122837,
- 122844, 122850, 122857, 122864, 122870, 122876, 122883, 122889, 122896,
- 122903, 122909, 122916, 122923, 122929, 122936, 122943, 122950, 122957,
- 122964, 122973, 122977, 122980, 122983, 122987, 122991, 122994, 122997,
- 123000, 123003, 123006, 123009, 123012, 123015, 123018, 123024, 0, 0, 0,
+ 0, 0, 0, 0, 0, 122213, 122220, 122225, 122229, 122233, 122237, 122242,
+ 122247, 122252, 122257, 122262, 0, 0, 0, 0, 0, 122267, 122272, 122278,
+ 122284, 122290, 122295, 122301, 122307, 122313, 122318, 122324, 122330,
+ 122335, 122340, 122346, 122351, 122357, 122363, 122368, 122374, 122380,
+ 122385, 122391, 122397, 122403, 122409, 122415, 122426, 122433, 122439,
+ 122442, 0, 122445, 122450, 122456, 122462, 122468, 122473, 122479,
+ 122485, 122491, 122496, 122502, 122508, 122513, 122518, 122524, 122529,
+ 122535, 122541, 122546, 122552, 122558, 122563, 122569, 122575, 122581,
+ 122587, 122593, 122596, 122599, 122602, 122605, 122608, 122611, 122617,
+ 122624, 122631, 122638, 122644, 122651, 122658, 122665, 122671, 122678,
+ 122685, 122691, 122697, 122704, 122710, 122717, 122724, 122730, 122737,
+ 122744, 122750, 122757, 122764, 122771, 122778, 122785, 122790, 0, 0, 0,
+ 0, 122795, 122801, 122808, 122815, 122822, 122828, 122835, 122842,
+ 122849, 122855, 122862, 122869, 122875, 122881, 122888, 122894, 122901,
+ 122908, 122914, 122921, 122928, 122934, 122941, 122948, 122955, 122962,
+ 122969, 122978, 122982, 122985, 122988, 122992, 122996, 122999, 123002,
+ 123005, 123008, 123011, 123014, 123017, 123020, 123023, 123029, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 123027, 123034, 123042, 123050, 123058, 123065, 123073, 123081, 123089,
- 123096, 123104, 123112, 123119, 123126, 123134, 123141, 123149, 123157,
- 123164, 123172, 123180, 123187, 123195, 123203, 123211, 123219, 123227,
- 123231, 123235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123238, 123244,
- 123250, 123256, 123260, 123266, 123272, 123278, 123284, 123290, 123296,
- 123302, 123308, 123314, 123320, 123326, 123332, 123338, 123344, 123350,
- 123356, 123362, 123368, 123374, 123380, 123386, 123392, 123398, 123404,
- 123410, 123416, 123422, 123428, 123434, 123440, 123446, 123452, 123458,
- 123464, 123470, 123476, 123482, 123488, 0, 0, 0, 0, 0, 123494, 123505,
- 123516, 123527, 123538, 123549, 123560, 123571, 123582, 0, 0, 0, 0, 0, 0,
- 0, 123593, 123597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 123032, 123039, 123047, 123055, 123063, 123070, 123078, 123086, 123094,
+ 123101, 123109, 123117, 123124, 123131, 123139, 123146, 123154, 123162,
+ 123169, 123177, 123185, 123192, 123200, 123208, 123216, 123224, 123232,
+ 123236, 123240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123243, 123249,
+ 123255, 123261, 123265, 123271, 123277, 123283, 123289, 123295, 123301,
+ 123307, 123313, 123319, 123325, 123331, 123337, 123343, 123349, 123355,
+ 123361, 123367, 123373, 123379, 123385, 123391, 123397, 123403, 123409,
+ 123415, 123421, 123427, 123433, 123439, 123445, 123451, 123457, 123463,
+ 123469, 123475, 123481, 123487, 123493, 0, 0, 0, 0, 0, 123499, 123510,
+ 123521, 123532, 123543, 123554, 123565, 123576, 123587, 0, 0, 0, 0, 0, 0,
+ 0, 123598, 123602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 123601, 123603, 123605, 123609, 123614, 123619, 123621,
- 123627, 123632, 123634, 123640, 123644, 123646, 123650, 123656, 123662,
- 123668, 123673, 123677, 123684, 123691, 123698, 123703, 123710, 123717,
- 123724, 123728, 123734, 123743, 123752, 123759, 123764, 123768, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123772, 123774, 123776, 123780,
- 123784, 123788, 0, 123790, 123792, 123796, 123798, 123800, 123802,
- 123804, 123809, 123814, 123816, 123822, 123826, 123830, 123838, 123840,
- 123842, 123844, 123846, 123848, 123850, 123852, 123854, 123856, 123858,
- 123862, 123866, 123868, 123870, 123872, 123874, 123876, 123881, 123887,
- 123891, 123895, 123899, 123903, 123908, 123912, 123914, 123916, 123920,
- 123926, 123928, 123930, 123932, 123936, 123945, 123951, 123955, 123959,
- 123961, 123963, 123966, 123968, 123970, 123972, 123976, 123978, 123982,
- 123987, 123989, 123994, 124000, 124007, 124011, 124015, 124019, 124023,
- 124029, 0, 0, 0, 124033, 124035, 124039, 124043, 124045, 124049, 124053,
- 124055, 124059, 124061, 124065, 124069, 124073, 124077, 124081, 124085,
- 124089, 124093, 124099, 124103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 124107, 124111, 124115, 124119, 124126, 124128, 124132, 124134, 124136,
- 124140, 124144, 124148, 124150, 124154, 124158, 124162, 124166, 124170,
- 124172, 124176, 124178, 124184, 124187, 124192, 124194, 124196, 124199,
- 124201, 124203, 124206, 124213, 124220, 124227, 124232, 124236, 124238,
- 124240, 0, 124242, 124244, 124248, 124252, 124256, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124258, 124262, 124267, 124271,
- 124277, 124283, 124285, 124287, 124293, 124295, 124299, 124303, 124305,
- 124309, 124311, 124315, 124319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 124323, 124325, 124327, 124329, 124333, 124335, 124337, 124339,
- 124341, 124343, 124345, 124347, 124349, 124351, 124353, 124355, 124357,
- 124359, 124361, 124363, 124365, 124367, 124369, 124371, 124373, 124375,
- 124377, 124381, 124383, 124385, 124387, 124391, 124393, 124397, 124399,
- 124401, 124405, 124409, 124415, 124417, 124419, 124421, 124423, 124427,
- 124431, 124433, 124437, 124441, 124445, 124449, 124453, 124457, 124461,
- 124465, 124469, 124473, 124477, 124481, 124485, 124489, 124493, 124497,
- 124501, 0, 124505, 0, 124507, 124509, 124511, 124513, 124515, 124523,
- 124531, 124539, 124547, 124552, 124557, 124562, 124566, 124570, 124575,
- 124579, 124581, 124585, 124587, 124589, 124591, 124593, 124595, 124597,
- 124599, 124603, 124605, 124607, 124609, 124613, 124617, 124621, 124625,
- 124629, 124631, 124637, 124643, 124645, 124647, 124649, 124651, 124653,
- 124662, 124669, 124676, 124680, 124687, 124692, 124699, 124708, 124713,
- 124717, 124721, 124723, 124727, 124729, 124733, 124737, 124739, 124743,
- 124747, 124751, 124753, 124755, 124761, 124763, 124765, 124767, 124771,
- 124775, 124777, 124781, 124783, 124785, 124788, 124792, 124794, 124798,
- 124800, 124802, 124807, 124809, 124813, 124817, 124820, 124824, 124828,
- 124832, 124836, 124840, 124844, 124848, 124853, 124857, 124861, 124870,
- 124875, 124878, 124880, 124883, 124886, 124891, 124893, 124896, 124901,
- 124905, 124908, 124912, 124916, 124919, 124924, 124928, 124932, 124936,
- 124940, 124946, 124952, 124958, 124964, 124969, 124980, 124982, 124986,
- 124988, 124990, 124994, 124998, 125000, 125004, 125009, 125014, 125020,
- 125022, 125026, 125030, 125037, 125044, 125048, 125050, 125052, 125056,
- 125058, 125062, 125066, 125070, 125072, 125074, 125081, 125085, 125088,
- 125092, 125096, 125100, 125102, 125106, 125108, 125110, 125114, 125116,
- 125120, 125124, 125130, 125134, 125138, 125142, 125144, 125147, 125151,
- 125158, 125167, 125176, 125184, 125192, 125194, 125198, 125200, 125204,
- 125215, 125219, 125225, 125231, 125236, 0, 125238, 125242, 125244,
- 125246, 0, 0, 0, 125248, 125253, 125263, 125278, 125290, 125302, 125306,
- 125310, 125316, 125318, 125326, 125334, 125336, 125340, 125346, 125352,
- 125359, 125366, 125368, 125370, 125373, 125375, 125381, 125383, 125386,
- 125390, 125396, 125402, 125413, 125419, 125426, 125434, 125438, 125446,
- 125454, 125460, 125466, 125473, 125475, 125479, 125481, 125483, 125488,
- 125490, 125492, 125494, 125496, 125500, 125511, 125517, 125521, 125525,
- 125529, 125535, 125541, 125547, 125553, 125558, 125563, 125569, 125575,
- 125582, 0, 0, 125589, 125594, 125602, 125606, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 125615, 125622, 125629, 125636, 125644, 125652, 125660, 125668,
- 125676, 125684, 125692, 125700, 125708, 125714, 125720, 125726, 125732,
- 125738, 125744, 125750, 125756, 125762, 125768, 125774, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 123606, 123608, 123610, 123614, 123619, 123624, 123626,
+ 123632, 123637, 123639, 123645, 123649, 123651, 123655, 123661, 123667,
+ 123673, 123678, 123682, 123689, 123696, 123703, 123708, 123715, 123722,
+ 123729, 123733, 123739, 123748, 123757, 123764, 123769, 123773, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123777, 123779, 123781, 123785,
+ 123789, 123793, 0, 123795, 123797, 123801, 123803, 123805, 123807,
+ 123809, 123814, 123819, 123821, 123827, 123831, 123835, 123843, 123845,
+ 123847, 123849, 123851, 123853, 123855, 123857, 123859, 123861, 123863,
+ 123867, 123871, 123873, 123875, 123877, 123879, 123881, 123886, 123892,
+ 123896, 123900, 123904, 123908, 123913, 123917, 123919, 123921, 123925,
+ 123931, 123933, 123935, 123937, 123941, 123950, 123956, 123960, 123964,
+ 123966, 123968, 123971, 123973, 123975, 123977, 123981, 123983, 123987,
+ 123992, 123994, 123999, 124005, 124012, 124016, 124020, 124024, 124028,
+ 124034, 0, 0, 0, 124038, 124040, 124044, 124048, 124050, 124054, 124058,
+ 124060, 124064, 124066, 124070, 124074, 124078, 124082, 124086, 124090,
+ 124094, 124098, 124104, 124108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 124112, 124116, 124120, 124124, 124131, 124133, 124137, 124139, 124141,
+ 124145, 124149, 124153, 124155, 124159, 124163, 124167, 124171, 124175,
+ 124177, 124181, 124183, 124189, 124192, 124197, 124199, 124201, 124204,
+ 124206, 124208, 124211, 124218, 124225, 124232, 124237, 124241, 124243,
+ 124245, 0, 124247, 124249, 124253, 124257, 124261, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124263, 124267, 124272, 124276,
+ 124282, 124288, 124290, 124292, 124298, 124300, 124304, 124308, 124310,
+ 124314, 124316, 124320, 124324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 124328, 124330, 124332, 124334, 124338, 124340, 124342, 124344,
+ 124346, 124348, 124350, 124352, 124354, 124356, 124358, 124360, 124362,
+ 124364, 124366, 124368, 124370, 124372, 124374, 124376, 124378, 124380,
+ 124382, 124386, 124388, 124390, 124392, 124396, 124398, 124402, 124404,
+ 124406, 124410, 124414, 124420, 124422, 124424, 124426, 124428, 124432,
+ 124436, 124438, 124442, 124446, 124450, 124454, 124458, 124462, 124466,
+ 124470, 124474, 124478, 124482, 124486, 124490, 124494, 124498, 124502,
+ 124506, 0, 124510, 0, 124512, 124514, 124516, 124518, 124520, 124528,
+ 124536, 124544, 124552, 124557, 124562, 124567, 124571, 124575, 124580,
+ 124584, 124586, 124590, 124592, 124594, 124596, 124598, 124600, 124602,
+ 124604, 124608, 124610, 124612, 124614, 124618, 124622, 124626, 124630,
+ 124634, 124636, 124642, 124648, 124650, 124652, 124654, 124656, 124658,
+ 124667, 124674, 124681, 124685, 124692, 124697, 124704, 124713, 124718,
+ 124722, 124726, 124728, 124732, 124734, 124738, 124742, 124744, 124748,
+ 124752, 124756, 124758, 124760, 124766, 124768, 124770, 124772, 124776,
+ 124780, 124782, 124786, 124788, 124790, 124793, 124797, 124799, 124803,
+ 124805, 124807, 124812, 124814, 124818, 124822, 124825, 124829, 124833,
+ 124837, 124841, 124845, 124849, 124853, 124858, 124862, 124866, 124875,
+ 124880, 124883, 124885, 124888, 124891, 124896, 124898, 124901, 124906,
+ 124910, 124913, 124917, 124921, 124924, 124929, 124933, 124937, 124941,
+ 124945, 124951, 124957, 124963, 124969, 124974, 124985, 124987, 124991,
+ 124993, 124995, 124999, 125003, 125005, 125009, 125014, 125019, 125025,
+ 125027, 125031, 125035, 125042, 125049, 125053, 125055, 125057, 125061,
+ 125063, 125067, 125071, 125075, 125077, 125079, 125086, 125090, 125093,
+ 125097, 125101, 125105, 125107, 125111, 125113, 125115, 125119, 125121,
+ 125125, 125129, 125135, 125139, 125143, 125147, 125149, 125152, 125156,
+ 125163, 125172, 125181, 125189, 125197, 125199, 125203, 125205, 125209,
+ 125220, 125224, 125230, 125236, 125241, 0, 125243, 125247, 125249,
+ 125251, 0, 0, 0, 125253, 125258, 125268, 125283, 125295, 125307, 125311,
+ 125315, 125321, 125323, 125331, 125339, 125341, 125345, 125351, 125357,
+ 125364, 125371, 125373, 125375, 125378, 125380, 125386, 125388, 125391,
+ 125395, 125401, 125407, 125418, 125424, 125431, 125439, 125443, 125451,
+ 125459, 125465, 125471, 125478, 125480, 125484, 125486, 125488, 125493,
+ 125495, 125497, 125499, 125501, 125505, 125516, 125522, 125526, 125530,
+ 125534, 125540, 125546, 125552, 125558, 125563, 125568, 125574, 125580,
+ 125587, 0, 0, 125594, 125599, 125607, 125611, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 125620, 125627, 125634, 125641, 125649, 125657, 125665, 125673,
+ 125681, 125689, 125697, 125705, 125713, 125719, 125725, 125731, 125737,
+ 125743, 125749, 125755, 125761, 125767, 125773, 125779, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125780,
- 125784, 125788, 125793, 125798, 125800, 125804, 125813, 125821, 125829,
- 125842, 125855, 125868, 125875, 125882, 125886, 125895, 125903, 125907,
- 125916, 125923, 125927, 125931, 125935, 125939, 125946, 125950, 125954,
- 125958, 125962, 125969, 125978, 125987, 125994, 126006, 126018, 126022,
- 126026, 126030, 126034, 126038, 126042, 126050, 126058, 126066, 126070,
- 126074, 126078, 126082, 126086, 126090, 126096, 126102, 126106, 126117,
- 126125, 126129, 126133, 126137, 126141, 126147, 126154, 126165, 126175,
- 126185, 126196, 126205, 126216, 126222, 126228, 0, 0, 0, 0, 126234,
- 126243, 126250, 126256, 126260, 126264, 126268, 126277, 126289, 126293,
- 126300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125785,
+ 125789, 125793, 125798, 125803, 125805, 125809, 125818, 125826, 125834,
+ 125847, 125860, 125873, 125880, 125887, 125891, 125900, 125908, 125912,
+ 125921, 125928, 125932, 125936, 125940, 125944, 125951, 125955, 125959,
+ 125963, 125967, 125974, 125983, 125992, 125999, 126011, 126023, 126027,
+ 126031, 126035, 126039, 126043, 126047, 126055, 126063, 126071, 126075,
+ 126079, 126083, 126087, 126091, 126095, 126101, 126107, 126111, 126122,
+ 126130, 126134, 126138, 126142, 126146, 126152, 126159, 126170, 126180,
+ 126190, 126201, 126210, 126221, 126227, 126233, 0, 0, 0, 0, 126239,
+ 126248, 126255, 126261, 126265, 126269, 126273, 126282, 126294, 126298,
+ 126305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 126307, 126309, 126311, 126315, 126319, 126323, 126332, 126334,
- 126336, 126339, 126341, 126343, 126347, 126349, 126353, 126355, 126359,
- 126361, 126363, 126367, 126371, 126377, 126379, 126383, 126385, 126389,
- 126393, 126397, 126401, 126403, 126405, 126409, 126413, 126417, 126421,
- 126423, 126425, 126427, 126432, 126437, 126440, 126448, 126456, 126458,
- 126463, 126466, 126471, 126482, 126489, 126494, 126499, 126501, 126505,
- 126507, 126511, 126513, 126517, 126521, 126524, 126527, 126529, 126532,
- 126534, 126538, 126540, 126542, 126544, 126548, 126550, 126554, 0, 0, 0,
+ 0, 0, 126312, 126314, 126316, 126320, 126324, 126328, 126337, 126339,
+ 126341, 126344, 126346, 126348, 126352, 126354, 126358, 126360, 126364,
+ 126366, 126368, 126372, 126376, 126382, 126384, 126388, 126390, 126394,
+ 126398, 126402, 126406, 126408, 126410, 126414, 126418, 126422, 126426,
+ 126428, 126430, 126432, 126437, 126442, 126445, 126453, 126461, 126463,
+ 126468, 126471, 126476, 126487, 126494, 126499, 126504, 126506, 126510,
+ 126512, 126516, 126518, 126522, 126526, 126529, 126532, 126534, 126537,
+ 126539, 126543, 126545, 126547, 126549, 126553, 126555, 126559, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 126557, 126562, 126567, 126572, 126577, 126582,
- 126587, 126594, 126601, 126608, 126615, 126620, 126625, 126630, 126635,
- 126642, 126648, 126655, 126662, 126669, 126674, 126679, 126684, 126689,
- 126694, 126701, 126708, 126713, 126718, 126725, 126732, 126740, 126748,
- 126755, 126762, 126770, 126778, 126786, 126793, 126803, 126814, 126819,
- 126826, 126833, 126840, 126848, 126856, 126867, 126875, 126883, 126891,
- 126896, 126901, 126906, 126911, 126916, 126921, 126926, 126931, 126936,
- 126941, 126946, 126951, 126958, 126963, 126968, 126975, 126980, 126985,
- 126990, 126995, 127000, 127005, 127010, 127015, 127020, 127025, 127030,
- 127035, 127042, 127050, 127055, 127060, 127067, 127072, 127077, 127082,
- 127089, 127094, 127101, 127106, 127113, 127118, 127127, 127136, 127141,
- 127146, 127151, 127156, 127161, 127166, 127171, 127176, 127181, 127186,
- 127191, 127196, 127201, 127209, 127217, 127222, 127227, 127232, 127237,
- 127242, 127248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127254, 127258,
- 127262, 127266, 127270, 127274, 127278, 127282, 127286, 127290, 127294,
- 127298, 127302, 127306, 127310, 127314, 127318, 127322, 127326, 127330,
- 127334, 127338, 127342, 127346, 127350, 127354, 127358, 127362, 127366,
- 127370, 127374, 127378, 127382, 127386, 127390, 127394, 127398, 127402,
- 127406, 127410, 127414, 127418, 127422, 127426, 127430, 127434, 127438,
- 127442, 127446, 127450, 127454, 127458, 127462, 127466, 127470, 127474,
- 127478, 127482, 127486, 127490, 127494, 127498, 127502, 127506, 127510,
- 127514, 127518, 127522, 127526, 127530, 127534, 127538, 127542, 127546,
- 127550, 127554, 127558, 127562, 127566, 127570, 127574, 127578, 127582,
- 127586, 127590, 127594, 127598, 127602, 127606, 127610, 127614, 127618,
- 127622, 127626, 127630, 127634, 127638, 127642, 127646, 127650, 127654,
- 127658, 127662, 127666, 127670, 127674, 127678, 127682, 127686, 127690,
- 127694, 127698, 127702, 127706, 127710, 127714, 127718, 127722, 127726,
- 127730, 127734, 127738, 127742, 127746, 127750, 127754, 127758, 127762,
- 127766, 127770, 127774, 127778, 127782, 127786, 127790, 127794, 127798,
- 127802, 127806, 127810, 127814, 127818, 127822, 127826, 127830, 127834,
- 127838, 127842, 127846, 127850, 127854, 127858, 127862, 127866, 127870,
- 127874, 127878, 127882, 127886, 127890, 127894, 127898, 127902, 127906,
- 127910, 127914, 127918, 127922, 127926, 127930, 127934, 127938, 127942,
- 127946, 127950, 127954, 127958, 127962, 127966, 127970, 127974, 127978,
- 127982, 127986, 127990, 127994, 127998, 128002, 128006, 128010, 128014,
- 128018, 128022, 128026, 128030, 128034, 128038, 128042, 128046, 128050,
- 128054, 128058, 128062, 128066, 128070, 128074, 128078, 128082, 128086,
- 128090, 128094, 128098, 128102, 128106, 128110, 128114, 128118, 128122,
- 128126, 128130, 128134, 128138, 128142, 128146, 128150, 128154, 128158,
- 128162, 128166, 128170, 128174, 128178, 128182, 128186, 128190, 128194,
- 128198, 128202, 128206, 128210, 128214, 128218, 128222, 128226, 128230,
- 128234, 128238, 128242, 128246, 128250, 128254, 128258, 128262, 128266,
- 128270, 128274, 128278, 128282, 128286, 128290, 128294, 128298, 128302,
- 128306, 128310, 128314, 128318, 128322, 128326, 128330, 128334, 128338,
- 128342, 128346, 128350, 128354, 128358, 128362, 128366, 128370, 128374,
- 128378, 128382, 128386, 128390, 128394, 128398, 128402, 128406, 128410,
- 128414, 128418, 128422, 128426, 128430, 128434, 128438, 128442, 128446,
- 128450, 128454, 128458, 128462, 128466, 128470, 128474, 128478, 128482,
- 128486, 128490, 128494, 128498, 128502, 128506, 128510, 128514, 128518,
- 128522, 128526, 128530, 128534, 128538, 128542, 128546, 128550, 128554,
- 128558, 128562, 128566, 128570, 128574, 128578, 128582, 128586, 128590,
- 128594, 128598, 128602, 128606, 128610, 128614, 128618, 128622, 128626,
- 128630, 128634, 128638, 128642, 128646, 128650, 128654, 128658, 128662,
- 128666, 128670, 128674, 128678, 128682, 128686, 128690, 128694, 128698,
- 128702, 128706, 128710, 128714, 128718, 128722, 128726, 128730, 128734,
- 128738, 128742, 128746, 128750, 128754, 128758, 128762, 128766, 128770,
- 128774, 128778, 128782, 128786, 128790, 128794, 128798, 128802, 128806,
- 128810, 128814, 128818, 128822, 128826, 128830, 128834, 128838, 128842,
- 128846, 128850, 128854, 128858, 128862, 128866, 128870, 128874, 128878,
- 128882, 128886, 128890, 128894, 128898, 128902, 128906, 128910, 128914,
- 128918, 128922, 128926, 128930, 128934, 128938, 128942, 128946, 128950,
- 128954, 128958, 128962, 128966, 128970, 128974, 128978, 128982, 128986,
- 128990, 128994, 128998, 129002, 129006, 129010, 129014, 129018, 129022,
- 129026, 129030, 129034, 129038, 129042, 129046, 129050, 129054, 129058,
- 129062, 129066, 129070, 129074, 129078, 129082, 129086, 129090, 129094,
- 129098, 129102, 129106, 129110, 129114, 129118, 129122, 129126, 129130,
- 129134, 129138, 129142, 129146, 129150, 129154, 129158, 129162, 129166,
- 129170, 129174, 129178, 129182, 129186, 129190, 129194, 129198, 129202,
- 129206, 129210, 129214, 129218, 129222, 129226, 129230, 129234, 129238,
- 129242, 129246, 129250, 129254, 129258, 129262, 129266, 129270, 129274,
- 129278, 129282, 129286, 129290, 129294, 129298, 129302, 129306, 129310,
- 129314, 129318, 129322, 129326, 129330, 129334, 129338, 129342, 129346,
- 129350, 129354, 129358, 129362, 129366, 129370, 129374, 129378, 129382,
- 129386, 129390, 129394, 129398, 129402, 129406, 129410, 129414, 129418,
+ 0, 0, 0, 0, 0, 0, 0, 126562, 126567, 126572, 126577, 126582, 126587,
+ 126592, 126599, 126606, 126613, 126620, 126625, 126630, 126635, 126640,
+ 126647, 126653, 126660, 126667, 126674, 126679, 126684, 126689, 126694,
+ 126699, 126706, 126713, 126718, 126723, 126730, 126737, 126745, 126753,
+ 126760, 126767, 126775, 126783, 126791, 126798, 126808, 126819, 126824,
+ 126831, 126838, 126845, 126853, 126861, 126872, 126880, 126888, 126896,
+ 126901, 126906, 126911, 126916, 126921, 126926, 126931, 126936, 126941,
+ 126946, 126951, 126956, 126963, 126968, 126973, 126980, 126985, 126990,
+ 126995, 127000, 127005, 127010, 127015, 127020, 127025, 127030, 127035,
+ 127040, 127047, 127055, 127060, 127065, 127072, 127077, 127082, 127087,
+ 127094, 127099, 127106, 127111, 127118, 127123, 127132, 127141, 127146,
+ 127151, 127156, 127161, 127166, 127171, 127176, 127181, 127186, 127191,
+ 127196, 127201, 127206, 127214, 127222, 127227, 127232, 127237, 127242,
+ 127247, 127253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127259, 127263,
+ 127267, 127271, 127275, 127279, 127283, 127287, 127291, 127295, 127299,
+ 127303, 127307, 127311, 127315, 127319, 127323, 127327, 127331, 127335,
+ 127339, 127343, 127347, 127351, 127355, 127359, 127363, 127367, 127371,
+ 127375, 127379, 127383, 127387, 127391, 127395, 127399, 127403, 127407,
+ 127411, 127415, 127419, 127423, 127427, 127431, 127435, 127439, 127443,
+ 127447, 127451, 127455, 127459, 127463, 127467, 127471, 127475, 127479,
+ 127483, 127487, 127491, 127495, 127499, 127503, 127507, 127511, 127515,
+ 127519, 127523, 127527, 127531, 127535, 127539, 127543, 127547, 127551,
+ 127555, 127559, 127563, 127567, 127571, 127575, 127579, 127583, 127587,
+ 127591, 127595, 127599, 127603, 127607, 127611, 127615, 127619, 127623,
+ 127627, 127631, 127635, 127639, 127643, 127647, 127651, 127655, 127659,
+ 127663, 127667, 127671, 127675, 127679, 127683, 127687, 127691, 127695,
+ 127699, 127703, 127707, 127711, 127715, 127719, 127723, 127727, 127731,
+ 127735, 127739, 127743, 127747, 127751, 127755, 127759, 127763, 127767,
+ 127771, 127775, 127779, 127783, 127787, 127791, 127795, 127799, 127803,
+ 127807, 127811, 127815, 127819, 127823, 127827, 127831, 127835, 127839,
+ 127843, 127847, 127851, 127855, 127859, 127863, 127867, 127871, 127875,
+ 127879, 127883, 127887, 127891, 127895, 127899, 127903, 127907, 127911,
+ 127915, 127919, 127923, 127927, 127931, 127935, 127939, 127943, 127947,
+ 127951, 127955, 127959, 127963, 127967, 127971, 127975, 127979, 127983,
+ 127987, 127991, 127995, 127999, 128003, 128007, 128011, 128015, 128019,
+ 128023, 128027, 128031, 128035, 128039, 128043, 128047, 128051, 128055,
+ 128059, 128063, 128067, 128071, 128075, 128079, 128083, 128087, 128091,
+ 128095, 128099, 128103, 128107, 128111, 128115, 128119, 128123, 128127,
+ 128131, 128135, 128139, 128143, 128147, 128151, 128155, 128159, 128163,
+ 128167, 128171, 128175, 128179, 128183, 128187, 128191, 128195, 128199,
+ 128203, 128207, 128211, 128215, 128219, 128223, 128227, 128231, 128235,
+ 128239, 128243, 128247, 128251, 128255, 128259, 128263, 128267, 128271,
+ 128275, 128279, 128283, 128287, 128291, 128295, 128299, 128303, 128307,
+ 128311, 128315, 128319, 128323, 128327, 128331, 128335, 128339, 128343,
+ 128347, 128351, 128355, 128359, 128363, 128367, 128371, 128375, 128379,
+ 128383, 128387, 128391, 128395, 128399, 128403, 128407, 128411, 128415,
+ 128419, 128423, 128427, 128431, 128435, 128439, 128443, 128447, 128451,
+ 128455, 128459, 128463, 128467, 128471, 128475, 128479, 128483, 128487,
+ 128491, 128495, 128499, 128503, 128507, 128511, 128515, 128519, 128523,
+ 128527, 128531, 128535, 128539, 128543, 128547, 128551, 128555, 128559,
+ 128563, 128567, 128571, 128575, 128579, 128583, 128587, 128591, 128595,
+ 128599, 128603, 128607, 128611, 128615, 128619, 128623, 128627, 128631,
+ 128635, 128639, 128643, 128647, 128651, 128655, 128659, 128663, 128667,
+ 128671, 128675, 128679, 128683, 128687, 128691, 128695, 128699, 128703,
+ 128707, 128711, 128715, 128719, 128723, 128727, 128731, 128735, 128739,
+ 128743, 128747, 128751, 128755, 128759, 128763, 128767, 128771, 128775,
+ 128779, 128783, 128787, 128791, 128795, 128799, 128803, 128807, 128811,
+ 128815, 128819, 128823, 128827, 128831, 128835, 128839, 128843, 128847,
+ 128851, 128855, 128859, 128863, 128867, 128871, 128875, 128879, 128883,
+ 128887, 128891, 128895, 128899, 128903, 128907, 128911, 128915, 128919,
+ 128923, 128927, 128931, 128935, 128939, 128943, 128947, 128951, 128955,
+ 128959, 128963, 128967, 128971, 128975, 128979, 128983, 128987, 128991,
+ 128995, 128999, 129003, 129007, 129011, 129015, 129019, 129023, 129027,
+ 129031, 129035, 129039, 129043, 129047, 129051, 129055, 129059, 129063,
+ 129067, 129071, 129075, 129079, 129083, 129087, 129091, 129095, 129099,
+ 129103, 129107, 129111, 129115, 129119, 129123, 129127, 129131, 129135,
+ 129139, 129143, 129147, 129151, 129155, 129159, 129163, 129167, 129171,
+ 129175, 129179, 129183, 129187, 129191, 129195, 129199, 129203, 129207,
+ 129211, 129215, 129219, 129223, 129227, 129231, 129235, 129239, 129243,
+ 129247, 129251, 129255, 129259, 129263, 129267, 129271, 129275, 129279,
+ 129283, 129287, 129291, 129295, 129299, 129303, 129307, 129311, 129315,
+ 129319, 129323, 129327, 129331, 129335, 129339, 129343, 129347, 129351,
+ 129355, 129359, 129363, 129367, 129371, 129375, 129379, 129383, 129387,
+ 129391, 129395, 129399, 129403, 129407, 129411, 129415, 129419, 129423,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 129422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129426, 129429, 129433, 129437, 129440,
- 129444, 129448, 129451, 129454, 129458, 129462, 129465, 129468, 129471,
- 129474, 129479, 129482, 129486, 129489, 129492, 129495, 129498, 129501,
- 129504, 129507, 129510, 129513, 129516, 129519, 129523, 129527, 129531,
- 129535, 129540, 129545, 129551, 129557, 129563, 129568, 129574, 129580,
- 129586, 129591, 129597, 129603, 129608, 129613, 129619, 129624, 129630,
- 129636, 129641, 129647, 129653, 129658, 129664, 129670, 129676, 129682,
- 129688, 129692, 129697, 129701, 129706, 129710, 129715, 129720, 129726,
- 129732, 129738, 129743, 129749, 129755, 129761, 129766, 129772, 129778,
- 129783, 129788, 129794, 129799, 129805, 129811, 129816, 129822, 129828,
- 129833, 129839, 129845, 129851, 129857, 129863, 129868, 129872, 129877,
- 129879, 129883, 129886, 129889, 129892, 129895, 129898, 129901, 129904,
- 129907, 129910, 129913, 129916, 129919, 129922, 129925, 129928, 129931,
- 129934, 129937, 129940, 129943, 129946, 129949, 129952, 129955, 129958,
- 129961, 129964, 129967, 129970, 129973, 129976, 129979, 129982, 129985,
- 129988, 129991, 129994, 129997, 130000, 130003, 130006, 130009, 130012,
- 130015, 130018, 130021, 130024, 130027, 130030, 130033, 130036, 130039,
- 130042, 130045, 130048, 130051, 130054, 130057, 130060, 130063, 130066,
- 130069, 130072, 130075, 130078, 130081, 130084, 130087, 130090, 130093,
- 130096, 130099, 130102, 130105, 130108, 130111, 130114, 130117, 130120,
- 130123, 130126, 130129, 130132, 130135, 130138, 130141, 130144, 130147,
- 130150, 130153, 130156, 130159, 130162, 130165, 130168, 130171, 130174,
- 130177, 130180, 130183, 130186, 130189, 130192, 130195, 130198, 130201,
- 130204, 130207, 130210, 130213, 130216, 130219, 130222, 130225, 130228,
- 130231, 130234, 130237, 130240, 130243, 130246, 130249, 130252, 130255,
- 130258, 130261, 130264, 130267, 130270, 130273, 130276, 130279, 130282,
- 130285, 130288, 130291, 130294, 130297, 130300, 130303, 130306, 130309,
- 130312, 130315, 130318, 130321, 130324, 130327, 130330, 130333, 130336,
- 130339, 130342, 130345, 130348, 130351, 130354, 130357, 130360, 130363,
- 130366, 130369, 130372, 130375, 130378, 130381, 130384, 130387, 130390,
- 130393, 130396, 130399, 130402, 130405, 130408, 130411, 130414, 130417,
- 130420, 130423, 130426, 130429, 130432, 130435, 130438, 130441, 130444,
- 130447, 130450, 130453, 130456, 130459, 130462, 130465, 130468, 130471,
- 130474, 130477, 130480, 130483, 130486, 130489, 130492, 130495, 130498,
- 130501, 130504, 130507, 130510, 130513, 130516, 130519, 130522, 130525,
- 130528, 130531, 130534, 130537, 130540, 130543, 130546, 130549, 130552,
- 130555, 130558, 130561, 130564, 130567, 130570, 130573, 130576, 130579,
- 130582, 130585, 130588, 130591, 130594, 130597, 130600, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130603, 130605, 130607, 130612, 130614,
- 130619, 130621, 130626, 130628, 130633, 130635, 130637, 130639, 130641,
- 130643, 130645, 130647, 130649, 130651, 130654, 130657, 130659, 130661,
- 130665, 130668, 130673, 130675, 130677, 130679, 130683, 130686, 130688,
- 130692, 130694, 130698, 130700, 130704, 130707, 130709, 130713, 130717,
- 130719, 130725, 130727, 130732, 130734, 130739, 130741, 130746, 130748,
- 130753, 130755, 130758, 130760, 130764, 130766, 130773, 130775, 130777,
- 130779, 130784, 130786, 130788, 130790, 130792, 130794, 130799, 130803,
- 130805, 130810, 130814, 130816, 130821, 130825, 130827, 130832, 130836,
- 130838, 130840, 130842, 130844, 130848, 130850, 130855, 130857, 130863,
- 130865, 130871, 130873, 130875, 130877, 130881, 130883, 130890, 130892,
- 130899, 130901, 130906, 130911, 130913, 130919, 130925, 130927, 130933,
- 130938, 130940, 130946, 130952, 130954, 130960, 130966, 130968, 130974,
- 130978, 130980, 130985, 130987, 130989, 130994, 130996, 130998, 131004,
- 131006, 131011, 131015, 131017, 131022, 131026, 131028, 131034, 131036,
- 131040, 131042, 131046, 131048, 131055, 131062, 131064, 131071, 131078,
- 131080, 131085, 131087, 131094, 131096, 131101, 131103, 131109, 131111,
- 131115, 131117, 131123, 131125, 131129, 131131, 131137, 131139, 131141,
- 131143, 131148, 131153, 131155, 131159, 131166, 131173, 131178, 131183,
- 131195, 131197, 131199, 131201, 131203, 131205, 131207, 131209, 131211,
- 131213, 131215, 131217, 131219, 131221, 131223, 131225, 131227, 131229,
- 131235, 131242, 131247, 131252, 131263, 131265, 131267, 131269, 131271,
- 131273, 131275, 131277, 131279, 131281, 131283, 131285, 131287, 131289,
- 131291, 131293, 131295, 131300, 131302, 131304, 131315, 131317, 131319,
- 131321, 131323, 131325, 131327, 131329, 131331, 131333, 131335, 131337,
- 131339, 131341, 131343, 131345, 131347, 131349, 131351, 131353, 131355,
- 131357, 131359, 131361, 131363, 131365, 131367, 131369, 131371, 131373,
- 131375, 131377, 131379, 131381, 131383, 131385, 131387, 131389, 131391,
- 131393, 131395, 131397, 131399, 131401, 131403, 131405, 131407, 131409,
- 131411, 131413, 131415, 131417, 131419, 131421, 131423, 131425, 131427,
- 131429, 131431, 131433, 131435, 131437, 131439, 131441, 131443, 131445,
- 131447, 131449, 131451, 131453, 131455, 131457, 131459, 131461, 131463,
- 131465, 131467, 131469, 131471, 131473, 131475, 131477, 131479, 131481,
- 131483, 131485, 131487, 131489, 131491, 131493, 131495, 131497, 131499,
- 131501, 131503, 131505, 131507, 131509, 131511, 131513, 131515, 131517,
- 131519, 131521, 131523, 131525, 131527, 131529, 131531, 131533, 131535,
- 131537, 131539, 131541, 131543, 131545, 131547, 131549, 131551, 131553,
- 131555, 131557, 131559, 131561, 131563, 131565, 131567, 131569, 131571,
- 131573, 131575, 131577, 131579, 131581, 131583, 131585, 131587, 131589,
- 131591, 131593, 131595, 131597, 131599, 131601, 131603, 131605, 131607,
- 131609, 131611, 131613, 131615, 131617, 131619, 131621, 131623, 131625,
- 131627, 131629, 131631, 131633, 131635, 131637, 131639, 131641, 131643,
- 131645, 131647, 131649, 131651, 131653, 131655, 131657, 131659, 131661,
- 131663, 131665, 131667, 131669, 131671, 131673, 131675, 131677, 131679,
- 131681, 131683, 131685, 131687, 131689, 131691, 131693, 131695, 131697,
- 131699, 131701, 131703, 131705, 131707, 131709, 131711, 131713, 131715,
- 131717, 131719, 131721, 131723, 131725, 131727, 131729, 131731, 131733,
- 131735, 131737, 131739, 131741, 131743, 131745, 131747, 131749, 131751,
- 131753, 131755, 131757, 131759, 131761, 131763, 131765, 131767, 131769,
- 131771, 131773, 131775, 131777, 131779, 131781, 131783, 131785, 131787,
- 131789, 131791, 131793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 129427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129431, 129434, 129438, 129442, 129445,
+ 129449, 129453, 129456, 129459, 129463, 129467, 129470, 129473, 129476,
+ 129479, 129484, 129487, 129491, 129494, 129497, 129500, 129503, 129506,
+ 129509, 129512, 129515, 129518, 129521, 129524, 129528, 129532, 129536,
+ 129540, 129545, 129550, 129556, 129562, 129568, 129573, 129579, 129585,
+ 129591, 129596, 129602, 129608, 129613, 129618, 129624, 129629, 129635,
+ 129641, 129646, 129652, 129658, 129663, 129669, 129675, 129681, 129687,
+ 129693, 129697, 129702, 129706, 129711, 129715, 129720, 129725, 129731,
+ 129737, 129743, 129748, 129754, 129760, 129766, 129771, 129777, 129783,
+ 129788, 129793, 129799, 129804, 129810, 129816, 129821, 129827, 129833,
+ 129838, 129844, 129850, 129856, 129862, 129868, 129873, 129877, 129882,
+ 129884, 129888, 129891, 129894, 129897, 129900, 129903, 129906, 129909,
+ 129912, 129915, 129918, 129921, 129924, 129927, 129930, 129933, 129936,
+ 129939, 129942, 129945, 129948, 129951, 129954, 129957, 129960, 129963,
+ 129966, 129969, 129972, 129975, 129978, 129981, 129984, 129987, 129990,
+ 129993, 129996, 129999, 130002, 130005, 130008, 130011, 130014, 130017,
+ 130020, 130023, 130026, 130029, 130032, 130035, 130038, 130041, 130044,
+ 130047, 130050, 130053, 130056, 130059, 130062, 130065, 130068, 130071,
+ 130074, 130077, 130080, 130083, 130086, 130089, 130092, 130095, 130098,
+ 130101, 130104, 130107, 130110, 130113, 130116, 130119, 130122, 130125,
+ 130128, 130131, 130134, 130137, 130140, 130143, 130146, 130149, 130152,
+ 130155, 130158, 130161, 130164, 130167, 130170, 130173, 130176, 130179,
+ 130182, 130185, 130188, 130191, 130194, 130197, 130200, 130203, 130206,
+ 130209, 130212, 130215, 130218, 130221, 130224, 130227, 130230, 130233,
+ 130236, 130239, 130242, 130245, 130248, 130251, 130254, 130257, 130260,
+ 130263, 130266, 130269, 130272, 130275, 130278, 130281, 130284, 130287,
+ 130290, 130293, 130296, 130299, 130302, 130305, 130308, 130311, 130314,
+ 130317, 130320, 130323, 130326, 130329, 130332, 130335, 130338, 130341,
+ 130344, 130347, 130350, 130353, 130356, 130359, 130362, 130365, 130368,
+ 130371, 130374, 130377, 130380, 130383, 130386, 130389, 130392, 130395,
+ 130398, 130401, 130404, 130407, 130410, 130413, 130416, 130419, 130422,
+ 130425, 130428, 130431, 130434, 130437, 130440, 130443, 130446, 130449,
+ 130452, 130455, 130458, 130461, 130464, 130467, 130470, 130473, 130476,
+ 130479, 130482, 130485, 130488, 130491, 130494, 130497, 130500, 130503,
+ 130506, 130509, 130512, 130515, 130518, 130521, 130524, 130527, 130530,
+ 130533, 130536, 130539, 130542, 130545, 130548, 130551, 130554, 130557,
+ 130560, 130563, 130566, 130569, 130572, 130575, 130578, 130581, 130584,
+ 130587, 130590, 130593, 130596, 130599, 130602, 130605, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130608, 130610, 130612, 130617, 130619,
+ 130624, 130626, 130631, 130633, 130638, 130640, 130642, 130644, 130646,
+ 130648, 130650, 130652, 130654, 130656, 130659, 130662, 130664, 130666,
+ 130670, 130673, 130678, 130680, 130682, 130684, 130688, 130691, 130693,
+ 130697, 130699, 130703, 130705, 130709, 130712, 130714, 130718, 130722,
+ 130724, 130730, 130732, 130737, 130739, 130744, 130746, 130751, 130753,
+ 130758, 130760, 130763, 130765, 130769, 130771, 130778, 130780, 130782,
+ 130784, 130789, 130791, 130793, 130795, 130797, 130799, 130804, 130808,
+ 130810, 130815, 130819, 130821, 130826, 130830, 130832, 130837, 130841,
+ 130843, 130845, 130847, 130849, 130853, 130855, 130860, 130862, 130868,
+ 130870, 130876, 130878, 130880, 130882, 130886, 130888, 130895, 130897,
+ 130904, 130906, 130911, 130916, 130918, 130924, 130930, 130932, 130938,
+ 130943, 130945, 130951, 130957, 130959, 130965, 130971, 130973, 130979,
+ 130983, 130985, 130990, 130992, 130994, 130999, 131001, 131003, 131009,
+ 131011, 131016, 131020, 131022, 131027, 131031, 131033, 131039, 131041,
+ 131045, 131047, 131051, 131053, 131060, 131067, 131069, 131076, 131083,
+ 131085, 131090, 131092, 131099, 131101, 131106, 131108, 131114, 131116,
+ 131120, 131122, 131128, 131130, 131134, 131136, 131142, 131144, 131146,
+ 131148, 131153, 131158, 131160, 131169, 131173, 131180, 131187, 131192,
+ 131197, 131209, 131211, 131213, 131215, 131217, 131219, 131221, 131223,
+ 131225, 131227, 131229, 131231, 131233, 131235, 131237, 131239, 131241,
+ 131243, 131249, 131256, 131261, 131266, 131277, 131279, 131281, 131283,
+ 131285, 131287, 131289, 131291, 131293, 131295, 131297, 131299, 131301,
+ 131303, 131305, 131307, 131309, 131314, 131316, 131318, 131329, 131331,
+ 131333, 131335, 131337, 131339, 131341, 131343, 131345, 131347, 131349,
+ 131351, 131353, 131355, 131357, 131359, 131361, 131363, 131365, 131367,
+ 131369, 131371, 131373, 131375, 131377, 131379, 131381, 131383, 131385,
+ 131387, 131389, 131391, 131393, 131395, 131397, 131399, 131401, 131403,
+ 131405, 131407, 131409, 131411, 131413, 131415, 131417, 131419, 131421,
+ 131423, 131425, 131427, 131429, 131431, 131433, 131435, 131437, 131439,
+ 131441, 131443, 131445, 131447, 131449, 131451, 131453, 131455, 131457,
+ 131459, 131461, 131463, 131465, 131467, 131469, 131471, 131473, 131475,
+ 131477, 131479, 131481, 131483, 131485, 131487, 131489, 131491, 131493,
+ 131495, 131497, 131499, 131501, 131503, 131505, 131507, 131509, 131511,
+ 131513, 131515, 131517, 131519, 131521, 131523, 131525, 131527, 131529,
+ 131531, 131533, 131535, 131537, 131539, 131541, 131543, 131545, 131547,
+ 131549, 131551, 131553, 131555, 131557, 131559, 131561, 131563, 131565,
+ 131567, 131569, 131571, 131573, 131575, 131577, 131579, 131581, 131583,
+ 131585, 131587, 131589, 131591, 131593, 131595, 131597, 131599, 131601,
+ 131603, 131605, 131607, 131609, 131611, 131613, 131615, 131617, 131619,
+ 131621, 131623, 131625, 131627, 131629, 131631, 131633, 131635, 131637,
+ 131639, 131641, 131643, 131645, 131647, 131649, 131651, 131653, 131655,
+ 131657, 131659, 131661, 131663, 131665, 131667, 131669, 131671, 131673,
+ 131675, 131677, 131679, 131681, 131683, 131685, 131687, 131689, 131691,
+ 131693, 131695, 131697, 131699, 131701, 131703, 131705, 131707, 131709,
+ 131711, 131713, 131715, 131717, 131719, 131721, 131723, 131725, 131727,
+ 131729, 131731, 131733, 131735, 131737, 131739, 131741, 131743, 131745,
+ 131747, 131749, 131751, 131753, 131755, 131757, 131759, 131761, 131763,
+ 131765, 131767, 131769, 131771, 131773, 131775, 131777, 131779, 131781,
+ 131783, 131785, 131787, 131789, 131791, 131793, 131795, 131797, 131799,
+ 131801, 131803, 131805, 131807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 131795, 131805, 131815, 131824, 131833, 131846, 131859, 131871, 131883,
- 131893, 131903, 131913, 131923, 131934, 131945, 131955, 131964, 131973,
- 131982, 131995, 132008, 132020, 132032, 132042, 132052, 132062, 132072,
- 132081, 132090, 132099, 132108, 132117, 132126, 132135, 132144, 132153,
- 132162, 132171, 132180, 132191, 132201, 132211, 132224, 132234, 132247,
- 132254, 132264, 132271, 132278, 132285, 132292, 132299, 132306, 132315,
- 132324, 132333, 132342, 132351, 132360, 132369, 132378, 132386, 132394,
- 132401, 132411, 132420, 132428, 132435, 132445, 132454, 132458, 132462,
- 132466, 132470, 132474, 132478, 132482, 132486, 132490, 132494, 132497,
- 132501, 132504, 132507, 132511, 132515, 132519, 132523, 132527, 132531,
- 132535, 132539, 132543, 132547, 132551, 132555, 132559, 132563, 132567,
- 132571, 132575, 132579, 132583, 132587, 132591, 132595, 132599, 132603,
- 132607, 132611, 132615, 132619, 132623, 132627, 132631, 132635, 132639,
- 132643, 132647, 132651, 132655, 132659, 132663, 132667, 132671, 132675,
- 132679, 132683, 132687, 132691, 132695, 132699, 132703, 132707, 132711,
- 132715, 132719, 132723, 132727, 132731, 132735, 132739, 132743, 132747,
- 132751, 132755, 132759, 132763, 132767, 132771, 132775, 132779, 132783,
- 132787, 132791, 132795, 132799, 132803, 132807, 132811, 132815, 132819,
- 132823, 132827, 132831, 132835, 132839, 132843, 132847, 132850, 132854,
- 132858, 132862, 132866, 132870, 132874, 132878, 132882, 132886, 132890,
- 132894, 132898, 132902, 132906, 132910, 132914, 132918, 132922, 132926,
- 132930, 132934, 132938, 132942, 132946, 132950, 132954, 132958, 132962,
- 132966, 132970, 132974, 132978, 132982, 132986, 132990, 132994, 132998,
- 133002, 133006, 133010, 133014, 133018, 133022, 133026, 133030, 133034,
- 133038, 133042, 133046, 133050, 133054, 133058, 133062, 133066, 133070,
- 133074, 133078, 133082, 133086, 133090, 133094, 133098, 133102, 133106,
- 133110, 133114, 133118, 133122, 133126, 133130, 133134, 133138, 133142,
- 133146, 133150, 133154, 133158, 133162, 133166, 133170, 133174, 133178,
- 133182, 133186, 133190, 133194, 133198, 133202, 133206, 133210, 133214,
- 133218, 133222, 133226, 133230, 133234, 133238, 133242, 133246, 133250,
- 133254, 133258, 133262, 133266, 133270, 133274, 133278, 133282, 133286,
- 133290, 133294, 133298, 133302, 133306, 133310, 133314, 133318, 133322,
- 133326, 133330, 133334, 133338, 133342, 133346, 133350, 133354, 133358,
- 133362, 133366, 133370, 133374, 133378, 133382, 133386, 133390, 133394,
- 133398, 133402, 133406, 133410, 133414, 133418, 133422, 133426, 133430,
- 133434, 133438, 133442, 133446, 133450, 133454, 133458, 133462, 133466,
- 133470, 133474, 133478, 133482, 133486, 133490, 133494, 133498, 133502,
- 133506, 133510, 133514, 133518, 133522, 133526, 133530, 133534, 133538,
- 133542, 133546, 133550, 133554, 133558, 133562, 133566, 133570, 133574,
- 133578, 133582, 133586, 133590, 133594, 133598, 133602, 133606, 133610,
- 133614, 133619, 133624, 133629, 133633, 133639, 133646, 133653, 133660,
- 133667, 133674, 133681, 133688, 133695, 133702, 133709, 133716, 133723,
- 133730, 133736, 133743, 133750, 133756, 133763, 133770, 133777, 133784,
- 133791, 133798, 133805, 133812, 133819, 133826, 133833, 133840, 133847,
- 133853, 133859, 133866, 133873, 133882, 133891, 133900, 133909, 133914,
- 133919, 133925, 133931, 133937, 133943, 133949, 133955, 133961, 133967,
- 133973, 133979, 133985, 133991, 133996, 134002, 134012, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 131809, 131819, 131829, 131838, 131847, 131860, 131873, 131885, 131897,
+ 131907, 131917, 131927, 131937, 131948, 131959, 131969, 131978, 131987,
+ 131996, 132009, 132022, 132034, 132046, 132056, 132066, 132076, 132086,
+ 132095, 132104, 132113, 132122, 132131, 132140, 132149, 132158, 132167,
+ 132176, 132185, 132194, 132205, 132215, 132225, 132238, 132248, 132261,
+ 132268, 132278, 132285, 132292, 132299, 132306, 132313, 132320, 132329,
+ 132338, 132347, 132356, 132365, 132374, 132383, 132392, 132400, 132408,
+ 132415, 132425, 132434, 132442, 132449, 132459, 132468, 132472, 132476,
+ 132480, 132484, 132488, 132492, 132496, 132500, 132504, 132508, 132511,
+ 132515, 132518, 132521, 132525, 132529, 132533, 132537, 132541, 132545,
+ 132549, 132553, 132557, 132561, 132565, 132569, 132573, 132577, 132581,
+ 132585, 132589, 132593, 132597, 132601, 132605, 132609, 132613, 132617,
+ 132621, 132625, 132629, 132633, 132637, 132641, 132645, 132649, 132653,
+ 132657, 132661, 132665, 132669, 132673, 132677, 132681, 132685, 132689,
+ 132693, 132697, 132701, 132705, 132709, 132713, 132717, 132721, 132725,
+ 132729, 132733, 132737, 132741, 132745, 132749, 132753, 132757, 132761,
+ 132765, 132769, 132773, 132777, 132781, 132785, 132789, 132793, 132797,
+ 132801, 132805, 132809, 132813, 132817, 132821, 132825, 132829, 132833,
+ 132837, 132841, 132845, 132849, 132853, 132857, 132861, 132864, 132868,
+ 132872, 132876, 132880, 132884, 132888, 132892, 132896, 132900, 132904,
+ 132908, 132912, 132916, 132920, 132924, 132928, 132932, 132936, 132940,
+ 132944, 132948, 132952, 132956, 132960, 132964, 132968, 132972, 132976,
+ 132980, 132984, 132988, 132992, 132996, 133000, 133004, 133008, 133012,
+ 133016, 133020, 133024, 133028, 133032, 133036, 133040, 133044, 133048,
+ 133052, 133056, 133060, 133064, 133068, 133072, 133076, 133080, 133084,
+ 133088, 133092, 133096, 133100, 133104, 133108, 133112, 133116, 133120,
+ 133124, 133128, 133132, 133136, 133140, 133144, 133148, 133152, 133156,
+ 133160, 133164, 133168, 133172, 133176, 133180, 133184, 133188, 133192,
+ 133196, 133200, 133204, 133208, 133212, 133216, 133220, 133224, 133228,
+ 133232, 133236, 133240, 133244, 133248, 133252, 133256, 133260, 133264,
+ 133268, 133272, 133276, 133280, 133284, 133288, 133292, 133296, 133300,
+ 133304, 133308, 133312, 133316, 133320, 133324, 133328, 133332, 133336,
+ 133340, 133344, 133348, 133352, 133356, 133360, 133364, 133368, 133372,
+ 133376, 133380, 133384, 133388, 133392, 133396, 133400, 133404, 133408,
+ 133412, 133416, 133420, 133424, 133428, 133432, 133436, 133440, 133444,
+ 133448, 133452, 133456, 133460, 133464, 133468, 133472, 133476, 133480,
+ 133484, 133488, 133492, 133496, 133500, 133504, 133508, 133512, 133516,
+ 133520, 133524, 133528, 133532, 133536, 133540, 133544, 133548, 133552,
+ 133556, 133560, 133564, 133568, 133572, 133576, 133580, 133584, 133588,
+ 133592, 133596, 133600, 133604, 133608, 133612, 133616, 133620, 133624,
+ 133628, 133633, 133638, 133643, 133647, 133653, 133660, 133667, 133674,
+ 133681, 133688, 133695, 133702, 133709, 133716, 133723, 133730, 133737,
+ 133744, 133750, 133757, 133764, 133770, 133777, 133784, 133791, 133798,
+ 133805, 133812, 133819, 133826, 133833, 133840, 133847, 133854, 133861,
+ 133867, 133873, 133880, 133887, 133896, 133905, 133914, 133923, 133928,
+ 133933, 133939, 133945, 133951, 133957, 133963, 133969, 133975, 133981,
+ 133987, 133993, 133999, 134005, 134010, 134016, 134026, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -17117,9 +17119,9 @@ static unsigned int code_hash[] = {
64065, 64072, 64071, 63, 7233, 92212, 0, 41904, 6639, 64064, 983766,
128344, 0, 1176, 118959, 127930, 8162, 128667, 983822, 0, 120519, 66376,
66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, 66222,
- 69902, 7768, 0, 4199, 64708, 983413, 0, 0, 8708, 9560, 64077, 64076,
+ 69902, 7768, 0, 4199, 64708, 983414, 0, 0, 8708, 9560, 64077, 64076,
8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 126570, 0, 64615, 41915,
- 0, 12075, 70062, 0, 5174, 983215, 0, 127557, 3123, 0, 12685, 127904,
+ 0, 12075, 70062, 0, 5174, 983216, 0, 127557, 3123, 0, 12685, 127904,
8408, 64704, 0, 0, 9223, 0, 41616, 67999, 73797, 0, 1116, 128204, 43049,
7136, 43050, 8548, 120485, 0, 119061, 917999, 0, 13115, 43675, 64091,
9322, 0, 120595, 64095, 64094, 8111, 66247, 42332, 64089, 64088, 6199, 0,
@@ -17127,10 +17129,10 @@ static unsigned int code_hash[] = {
9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, 127881, 298, 0, 128114,
0, 42627, 0, 32, 6187, 119052, 11495, 11459, 3665, 983600, 42871, 0,
19923, 74335, 0, 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0,
- 983458, 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 69809, 6181,
+ 983459, 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 69809, 6181,
65014, 0, 0, 983196, 3639, 119588, 0, 0, 118904, 10073, 120206, 128862,
127186, 68409, 42844, 7498, 1098, 92565, 120205, 0, 983118, 10207, 8789,
- 983223, 0, 0, 983464, 9234, 0, 6182, 983466, 65058, 0, 983470, 983467, 0,
+ 983224, 0, 0, 983465, 9234, 0, 6182, 983467, 65058, 0, 983471, 983468, 0,
5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 94072, 0, 66238, 12844, 0,
1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, 64405, 41337, 0,
41631, 8947, 68390, 127844, 41694, 0, 0, 7908, 0, 10408, 6579, 0, 64618,
@@ -17177,7 +17179,7 @@ static unsigned int code_hash[] = {
12084, 127324, 127321, 92279, 127319, 127320, 127317, 127318, 127315,
12283, 1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0,
3239, 127311, 0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073,
- 5040, 0, 0, 983435, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184,
+ 5040, 0, 0, 983436, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184,
74293, 0, 64648, 0, 9359, 78416, 0, 128770, 65157, 6662, 0, 0, 3863,
73909, 4835, 55266, 43432, 127822, 4309, 7127, 194569, 0, 194568, 1301,
0, 42589, 569, 0, 73813, 711, 4389, 7133, 0, 73880, 11610, 11368, 0,
@@ -17202,16 +17204,16 @@ static unsigned int code_hash[] = {
6183, 0, 0, 0, 120448, 7623, 118925, 118889, 9235, 12760, 74176, 69662,
66445, 43540, 10062, 3743, 11514, 11078, 0, 12136, 0, 126597, 120435, 0,
7726, 0, 19922, 267, 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0,
- 41074, 4266, 10652, 41612, 41077, 3402, 9050, 3398, 0, 983340, 0, 3391,
+ 41074, 4266, 10652, 41612, 41077, 3402, 9050, 3398, 0, 983341, 0, 3391,
41075, 2476, 0, 128017, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934,
- 127537, 13014, 13013, 0, 6673, 0, 0, 0, 12438, 0, 983334, 0, 983871,
+ 127537, 13014, 13013, 0, 6673, 0, 0, 0, 12438, 0, 983335, 0, 983871,
126638, 9053, 13015, 74523, 0, 704, 66215, 6195, 983819, 6660, 78758,
- 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 983333,
+ 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 983334,
74547, 126585, 65448, 78100, 12948, 119001, 195002, 119238, 195004,
78099, 127085, 0, 128320, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816,
0, 42533, 168, 42845, 4898, 64298, 983141, 0, 4901, 1821, 0, 578, 3653,
0, 791, 9162, 6977, 0, 78889, 74561, 0, 73731, 8354, 43590, 119303,
- 983441, 7557, 119339, 119301, 8234, 7241, 0, 120671, 119167, 194996,
+ 983442, 7557, 119339, 119301, 8234, 7241, 0, 120671, 119167, 194996,
12811, 65925, 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276,
74599, 78449, 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452,
78083, 128824, 8729, 78456, 0, 7845, 917917, 71302, 4408, 4122, 6772,
@@ -17267,12 +17269,12 @@ static unsigned int code_hash[] = {
194587, 0, 1211, 0, 0, 0, 118832, 12318, 0, 0, 68005, 10622, 983770, 0,
78654, 6566, 78659, 0, 73780, 119196, 64864, 0, 78660, 0, 8284, 13081, 0,
3589, 42051, 4035, 6492, 92236, 4265, 6642, 3977, 74186, 41778, 836,
- 119216, 2488, 0, 4582, 0, 0, 41777, 12926, 983369, 7528, 10550, 0, 92706,
+ 119216, 2488, 0, 4582, 0, 0, 41777, 12926, 983370, 7528, 10550, 0, 92706,
0, 10961, 0, 1374, 64878, 119014, 0, 42389, 41374, 2286, 0, 78492, 41377,
127909, 0, 400, 12597, 120586, 0, 0, 6661, 983145, 64827, 0, 73817, 390,
- 0, 71301, 983853, 3473, 7718, 0, 0, 0, 55285, 0, 0, 0, 11969, 983382,
- 127841, 6365, 1887, 6763, 983362, 8080, 7006, 0, 983363, 6757, 64351,
- 1544, 0, 6766, 64677, 120716, 983364, 6146, 0, 771, 983365, 0, 12812,
+ 0, 71301, 983853, 3473, 7718, 0, 0, 0, 55285, 0, 0, 0, 11969, 983383,
+ 127841, 6365, 1887, 6763, 983363, 8080, 7006, 0, 983364, 6757, 64351,
+ 1544, 0, 6766, 64677, 120716, 983365, 6146, 0, 771, 983366, 0, 12812,
13168, 42272, 12200, 917927, 7904, 0, 953, 12917, 119560, 12300, 0,
11491, 9724, 10341, 983764, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0,
471, 7484, 7482, 6753, 7480, 5764, 7478, 7477, 6501, 7475, 6918, 7473,
@@ -17286,11 +17288,11 @@ static unsigned int code_hash[] = {
118928, 1118, 71334, 0, 0, 1081, 7436, 68420, 7252, 0, 5996, 69921, 4903,
0, 41386, 5162, 119189, 1330, 0, 7139, 0, 12047, 41384, 0, 0, 1848, 4334,
6324, 41975, 64777, 10674, 12308, 12186, 0, 0, 983732, 12715, 68002,
- 983471, 126630, 2018, 66672, 41979, 66685, 119157, 68000, 92464, 0,
+ 983472, 126630, 2018, 66672, 41979, 66685, 119157, 68000, 92464, 0,
126984, 68001, 9334, 92705, 92315, 70101, 7975, 0, 77957, 0, 66621, 4884,
66597, 69732, 0, 0, 6313, 65513, 69857, 0, 0, 0, 2345, 43697, 463, 0, 0,
- 119607, 3117, 5460, 0, 0, 983379, 0, 42279, 194577, 0, 78415, 0, 195008,
- 983376, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 1471, 0, 0,
+ 119607, 3117, 5460, 0, 0, 983380, 0, 42279, 194577, 0, 78415, 0, 195008,
+ 983377, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 1471, 0, 0,
42247, 12378, 73925, 69664, 0, 12374, 0, 0, 0, 983685, 2460, 0, 11944,
12376, 127868, 64679, 0, 12380, 10557, 64473, 5870, 0, 2024, 127180, 0,
0, 539, 0, 127765, 94052, 3853, 65180, 127923, 120796, 120245, 92324, 0,
@@ -17298,20 +17300,20 @@ static unsigned int code_hash[] = {
69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, 10946, 127310, 5000,
0, 983579, 0, 69672, 8213, 74017, 7771, 6161, 68018, 6709, 0, 78885,
983699, 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0,
- 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 983256, 0,
+ 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 983257, 0,
12210, 7221, 42147, 0, 74550, 74465, 64747, 118841, 0, 12516, 4444, 0,
92271, 74537, 10892, 8231, 0, 6473, 41968, 78388, 41973, 3591, 41969, 0,
2453, 128549, 92666, 64705, 0, 0, 10349, 10413, 43591, 41962, 3202,
74353, 0, 8316, 0, 0, 94060, 687, 0, 0, 0, 1840, 0, 68671, 119809, 4883,
285, 4723, 70099, 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0,
- 42323, 0, 9743, 120232, 13134, 126535, 0, 0, 0, 0, 42634, 983335, 43437,
+ 42323, 0, 9743, 120232, 13134, 126535, 0, 0, 0, 0, 42634, 983336, 43437,
3081, 11463, 120154, 0, 0, 10445, 0, 0, 66717, 2614, 9125, 119023, 1729,
0, 120236, 65221, 63883, 43334, 64852, 0, 65194, 66201, 0, 66578, 5001,
41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, 5150, 73889, 74182,
127915, 643, 3086, 0, 42448, 42299, 58, 0, 917952, 120083, 63873, 8491,
0, 0, 0, 4530, 42409, 7126, 194575, 2721, 120074, 119096, 19929, 0,
194574, 0, 4242, 4264, 120077, 120530, 66179, 42412, 65941, 13114, 64522,
- 10740, 3094, 0, 9754, 119102, 4437, 73948, 127074, 983232, 55280, 42174,
+ 10740, 3094, 0, 9754, 119102, 4437, 73948, 127074, 983233, 55280, 42174,
194925, 42430, 0, 0, 42355, 66026, 4306, 41380, 68432, 92586, 0, 66667,
127309, 0, 126521, 42200, 42566, 0, 0, 5088, 6948, 0, 8524, 0, 0, 12385,
0, 0, 69646, 1386, 64580, 11480, 6116, 65039, 65038, 12392, 65036, 8064,
@@ -17337,7 +17339,7 @@ static unsigned int code_hash[] = {
917776, 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 983826,
917782, 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0,
128014, 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436,
- 983239, 42021, 0, 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197,
+ 983240, 42021, 0, 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197,
11348, 0, 78037, 9194, 983184, 0, 19914, 12179, 983803, 2296, 194923,
63836, 63832, 917773, 10967, 63816, 2594, 3444, 63817, 64651, 0, 41503,
127478, 11265, 0, 120756, 194922, 0, 5664, 3972, 0, 0, 0, 128508, 12416,
@@ -17348,7 +17350,7 @@ static unsigned int code_hash[] = {
9171, 12741, 11400, 71305, 194799, 0, 128239, 0, 128881, 119604, 127523,
120190, 194773, 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514,
68651, 0, 983886, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809,
- 3889, 8521, 5083, 5082, 119859, 120184, 8519, 983235, 3014, 5081, 65853,
+ 3889, 8521, 5083, 5082, 119859, 120184, 8519, 983236, 3014, 5081, 65853,
120715, 0, 68014, 69951, 5079, 64802, 42210, 4597, 65532, 11828, 120185,
12371, 0, 8407, 0, 10805, 8518, 10779, 120188, 71303, 983924, 12367,
42170, 0, 92557, 629, 1924, 0, 12037, 74366, 5987, 8462, 8005, 12365,
@@ -17400,7 +17402,7 @@ static unsigned int code_hash[] = {
9594, 0, 0, 43527, 0, 727, 194703, 195023, 5805, 0, 6726, 0, 42176,
12370, 11655, 119095, 10591, 2280, 0, 12372, 120642, 120307, 0, 92343, 0,
12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 194701, 10803, 4132,
- 120306, 68474, 92473, 0, 983305, 74837, 120155, 1499, 0, 8055, 42740,
+ 120306, 68474, 92473, 0, 983306, 74837, 120155, 1499, 0, 8055, 42740,
63965, 0, 63962, 74042, 8924, 43123, 5988, 3660, 63969, 11781, 42718,
8788, 1357, 64851, 65743, 0, 8774, 0, 127086, 9941, 120172, 0, 1933,
69655, 9564, 0, 92435, 73866, 0, 0, 2487, 67614, 3121, 1804, 3311, 67615,
@@ -17452,7 +17454,7 @@ static unsigned int code_hash[] = {
64436, 3601, 195094, 128073, 983562, 609, 11555, 983099, 12496, 127839,
74181, 4343, 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0,
0, 43565, 71306, 126493, 12696, 128256, 0, 94062, 12929, 0, 712, 0, 4197,
- 983204, 42818, 126632, 0, 120490, 0, 119137, 1506, 43562, 0, 92491, 0,
+ 983205, 42818, 126632, 0, 120490, 0, 119137, 1506, 43562, 0, 92491, 0,
12651, 0, 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592,
118844, 0, 127088, 355, 9719, 127087, 13066, 64796, 0, 0, 12033, 42178,
0, 69760, 42571, 92635, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 0,
@@ -17485,7 +17487,7 @@ static unsigned int code_hash[] = {
66489, 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, 0,
10732, 68640, 850, 4972, 0, 12890, 2909, 68619, 44008, 68627, 983709,
11544, 10203, 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311,
- 777, 120187, 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 983230,
+ 777, 120187, 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 983231,
9454, 63778, 8658, 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765,
42502, 8280, 74520, 2701, 0, 127002, 5767, 0, 0, 9809, 8353, 63747,
66701, 63772, 983805, 63745, 1748, 63770, 0, 0, 0, 65542, 63766, 55244,
@@ -17495,7 +17497,7 @@ static unsigned int code_hash[] = {
10996, 92247, 1922, 0, 12498, 10987, 69936, 69939, 3894, 65543, 0,
194842, 983588, 493, 0, 43197, 1717, 4228, 479, 10303, 74020, 0, 917935,
10335, 3520, 917932, 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002,
- 12491, 0, 64911, 92615, 2096, 65120, 0, 78219, 983081, 11611, 11632,
+ 12491, 0, 64911, 92615, 2096, 65120, 0, 78219, 983081, 8378, 11632,
127041, 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, 8507,
66236, 66211, 66218, 92672, 66240, 78041, 66233, 8928, 983552, 7909,
66234, 11605, 63759, 983645, 66208, 73999, 63799, 63803, 244, 11542,
@@ -17515,7 +17517,7 @@ static unsigned int code_hash[] = {
9382, 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 983769, 9372,
12444, 0, 0, 13016, 8210, 983949, 42029, 11079, 12331, 43451, 42032,
8744, 726, 0, 983828, 4155, 0, 0, 42030, 5007, 12522, 43088, 0, 4951,
- 127805, 127240, 0, 9922, 43309, 983832, 12525, 983463, 12016, 65770,
+ 127805, 127240, 0, 9922, 43309, 983832, 12525, 983464, 12016, 65770,
9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, 92567, 65691, 63998,
1819, 10496, 0, 0, 119920, 0, 194668, 0, 12506, 0, 12231, 0, 12500,
44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, 120321, 78395,
@@ -17557,7 +17559,7 @@ static unsigned int code_hash[] = {
13043, 8056, 92494, 65681, 208, 127382, 41514, 0, 0, 0, 10699, 6408,
92227, 7825, 5661, 0, 120630, 3603, 41109, 2398, 3548, 126596, 0, 119933,
0, 3115, 9918, 0, 11321, 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468,
- 983266, 41558, 41471, 73950, 8158, 9944, 41472, 120298, 13051, 78689,
+ 983267, 41558, 41471, 73950, 8158, 9944, 41472, 120298, 13051, 78689,
3143, 194674, 6701, 41559, 1896, 66256, 13052, 194680, 5665, 0, 119071,
7025, 63974, 0, 74352, 74161, 4154, 9863, 43550, 12310, 5662, 42382,
194686, 73924, 1121, 78319, 63959, 0, 9942, 13231, 0, 64752, 4732,
@@ -17587,7 +17589,7 @@ static unsigned int code_hash[] = {
6153, 2867, 194708, 66312, 698, 128007, 194606, 10356, 70017, 194713,
651, 12641, 0, 0, 0, 0, 41552, 65115, 78465, 78467, 78463, 78464, 128851,
78461, 194697, 74356, 64945, 4716, 43277, 0, 78474, 12340, 120568, 0,
- 194700, 55264, 41211, 120676, 8703, 5462, 917629, 983487, 10101, 0,
+ 194700, 55264, 41211, 120676, 8703, 5462, 917629, 983488, 10101, 0,
70049, 8479, 4151, 41933, 0, 0, 66254, 120821, 0, 0, 128654, 0, 119194,
74050, 92701, 0, 0, 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0,
0, 2699, 0, 73845, 2985, 92568, 126475, 917845, 12192, 119314, 0, 119312,
@@ -17602,8 +17604,8 @@ static unsigned int code_hash[] = {
9632, 92323, 74761, 64323, 127335, 0, 0, 0, 310, 0, 41281, 10976, 0,
71325, 0, 74266, 10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215,
12730, 65163, 74044, 374, 43195, 816, 120161, 0, 0, 41934, 7465, 0,
- 128168, 983260, 4715, 6101, 94106, 41936, 0, 4879, 0, 65446, 0, 307,
- 127147, 9585, 5374, 983259, 128059, 0, 0, 126618, 120390, 0, 65567,
+ 128168, 983261, 4715, 6101, 94106, 41936, 0, 4879, 0, 65446, 0, 307,
+ 127147, 9585, 5374, 983260, 128059, 0, 0, 126618, 120390, 0, 65567,
120614, 1929, 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623,
5378, 78791, 128679, 41421, 0, 4462, 0, 126599, 128092, 821, 0, 2498,
5800, 120157, 983115, 1760, 2421, 4469, 2324, 828, 3611, 78400, 757,
@@ -17620,7 +17622,7 @@ static unsigned int code_hash[] = {
77950, 194578, 7074, 92648, 194579, 194582, 11414, 128868, 2531, 13034,
0, 0, 4211, 1259, 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219,
94034, 194566, 11064, 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153,
- 0, 64098, 65793, 4535, 194573, 4271, 78417, 128357, 6769, 41410, 983444,
+ 0, 64098, 65793, 4535, 194573, 4271, 78417, 128357, 6769, 41410, 983445,
64262, 6767, 41407, 0, 0, 6755, 118864, 9046, 127934, 126608, 0, 0, 0, 0,
67675, 0, 0, 0, 64338, 2563, 13033, 247, 118915, 0, 12338, 4651, 69895,
11270, 0, 0, 11933, 0, 0, 41903, 43447, 11001, 0, 42255, 0, 92661, 69821,
@@ -17650,7 +17652,7 @@ static unsigned int code_hash[] = {
1091, 12638, 7977, 4501, 41099, 0, 66309, 0, 0, 1494, 983146, 126613, 0,
11693, 126513, 10494, 92655, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0,
73794, 0, 8022, 0, 120462, 74106, 12413, 94069, 917994, 917993, 917995,
- 5570, 1881, 7210, 0, 1012, 43752, 0, 120709, 7208, 66442, 5569, 983236,
+ 5570, 1881, 7210, 0, 1012, 43752, 0, 120709, 7208, 66442, 5569, 983237,
42339, 0, 6063, 0, 78383, 119594, 6053, 65602, 0, 92201, 64727, 9160,
194827, 0, 0, 92180, 10503, 118810, 6055, 3870, 4279, 8490, 120114, 4319,
64786, 8602, 120110, 11326, 92204, 983116, 0, 120119, 78333, 120117,
@@ -17658,7 +17660,7 @@ static unsigned int code_hash[] = {
120108, 42085, 10107, 42159, 42870, 120101, 589, 7050, 983791, 43281,
10233, 41263, 66251, 65729, 66253, 126497, 74099, 42645, 0, 194815, 8583,
0, 5847, 6928, 128074, 0, 0, 0, 0, 66592, 12204, 917962, 19966, 77856,
- 42561, 120626, 983245, 0, 8120, 120701, 0, 0, 128012, 41063, 0, 10664, 0,
+ 42561, 120626, 983246, 0, 8120, 120701, 0, 0, 128012, 41063, 0, 10664, 0,
8369, 0, 4551, 194964, 3369, 0, 0, 9673, 66334, 65580, 10478, 118960,
12517, 557, 9457, 12034, 983662, 6355, 12519, 41004, 0, 195025, 74094, 0,
0, 77970, 983560, 0, 128175, 12111, 3927, 0, 12515, 1474, 67893, 5492,
@@ -17681,7 +17683,7 @@ static unsigned int code_hash[] = {
73898, 11979, 70051, 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469,
74227, 0, 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0,
42916, 0, 0, 0, 7282, 78728, 65733, 4445, 127138, 128082, 3494, 74606,
- 6555, 0, 77976, 0, 0, 78566, 0, 983189, 65898, 983238, 65312, 5447, 0,
+ 6555, 0, 77976, 0, 0, 78566, 0, 983189, 65898, 983239, 65312, 5447, 0,
12895, 65593, 4010, 0, 41106, 0, 64448, 0, 41105, 0, 65820, 6232, 0,
128280, 0, 43608, 119091, 0, 6538, 4335, 78364, 3941, 41122, 11061,
78363, 64892, 9113, 1954, 12155, 983665, 42878, 11500, 0, 0, 74578, 0,
@@ -17695,9 +17697,9 @@ static unsigned int code_hash[] = {
11428, 1730, 2457, 917808, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0,
92230, 0, 6129, 0, 128528, 128268, 0, 7874, 8681, 119092, 0, 13136, 0, 0,
70102, 63886, 118881, 9605, 71308, 13220, 128776, 120274, 5514, 0, 9228,
- 0, 0, 0, 5240, 9811, 10012, 3096, 0, 0, 983343, 66676, 65873, 0, 0, 0,
+ 0, 0, 0, 5240, 9811, 10012, 3096, 0, 0, 983344, 66676, 65873, 0, 0, 0,
9501, 0, 1272, 64536, 65465, 64654, 7467, 0, 1467, 10158, 10040, 0, 9519,
- 0, 917812, 0, 118899, 12193, 0, 0, 0, 0, 983345, 19935, 0, 92162, 69676,
+ 0, 917812, 0, 118899, 12193, 0, 0, 0, 0, 983346, 19935, 0, 92162, 69676,
0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, 11471, 43554, 65862, 11474,
66332, 66603, 128138, 2426, 12042, 92194, 983902, 9537, 3961, 12115,
77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, 11667, 42686, 77973,
@@ -17748,14 +17750,14 @@ static unsigned int code_hash[] = {
7142, 119881, 12350, 65554, 119882, 119877, 119876, 12785, 63863, 43795,
7770, 10712, 64853, 12686, 118916, 42375, 0, 127238, 66352, 10470, 0,
11059, 10791, 917944, 450, 119328, 0, 10432, 12097, 5450, 64691, 1233, 0,
- 44009, 78284, 66338, 0, 0, 1839, 118799, 983217, 10927, 1701, 983655,
+ 44009, 78284, 66338, 0, 0, 1839, 118799, 983218, 10927, 1701, 983655,
2388, 41749, 41761, 5453, 8361, 119865, 41758, 5444, 41763, 64889, 7143,
92493, 78677, 0, 92429, 78174, 66432, 8801, 3053, 4340, 983044, 0, 65812,
917831, 0, 41824, 67985, 120203, 194800, 194803, 42700, 194805, 127980,
194807, 78676, 92356, 194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826,
119325, 194811, 42439, 64638, 42327, 43528, 4489, 71331, 0, 194793, 1912,
42385, 10306, 10370, 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410,
- 92671, 983244, 118878, 0, 0, 9919, 120528, 559, 128157, 41825, 127975,
+ 92671, 983245, 118878, 0, 0, 9919, 120528, 559, 128157, 41825, 127975,
78188, 4892, 74016, 194781, 6542, 41957, 128865, 5777, 0, 759, 65749,
2079, 65248, 12788, 64487, 64552, 0, 10223, 42062, 0, 0, 126573, 3668,
65754, 43560, 12226, 67991, 65149, 2340, 41959, 194786, 194785, 194788,
@@ -17765,7 +17767,7 @@ static unsigned int code_hash[] = {
42809, 42807, 0, 120046, 10198, 4150, 64371, 8318, 41790, 67976, 41898,
2360, 41794, 917942, 71314, 127818, 0, 0, 2418, 983098, 2411, 11336, 799,
63823, 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980,
- 55284, 92203, 0, 10384, 983218, 0, 0, 7753, 2351, 6655, 64489, 69931, 0,
+ 55284, 92203, 0, 10384, 983219, 0, 0, 7753, 2351, 6655, 64489, 69931, 0,
77872, 4443, 42779, 230, 0, 0, 43549, 4855, 42150, 65739, 5441, 41896,
10288, 10320, 0, 855, 7046, 6109, 65045, 63839, 78198, 2049, 10098, 0,
74145, 127943, 10264, 10280, 9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0,
@@ -17776,7 +17778,7 @@ static unsigned int code_hash[] = {
78167, 10088, 6548, 0, 120156, 43978, 8988, 8888, 0, 0, 0, 0, 10666, 0,
73902, 69740, 0, 0, 9975, 128039, 119902, 4689, 8932, 0, 65560, 119209,
74441, 78810, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 92613,
- 128011, 0, 662, 0, 9244, 194863, 0, 119261, 983420, 0, 0, 0, 41929, 0, 0,
+ 128011, 0, 662, 0, 9244, 194863, 0, 119261, 983421, 0, 0, 0, 41929, 0, 0,
66674, 41926, 120408, 120443, 10513, 64637, 194862, 68013, 52, 13118,
6475, 0, 120341, 12095, 10225, 4812, 92578, 0, 67992, 74085, 0, 3978, 0,
917945, 127823, 11582, 120761, 12281, 0, 6544, 13241, 93961, 69782,
@@ -17786,7 +17788,7 @@ static unsigned int code_hash[] = {
120410, 0, 120453, 64821, 9478, 2508, 92683, 0, 202, 128246, 74131, 1242,
65514, 0, 63940, 128706, 64533, 120129, 0, 67842, 11990, 92430, 63939,
43375, 65440, 2504, 0, 78671, 64829, 983901, 6943, 917934, 5859, 0, 2858,
- 983353, 74294, 983905, 69239, 0, 119027, 12992, 2753, 1936, 70078, 92574,
+ 983354, 74294, 983905, 69239, 0, 119027, 12992, 2753, 1936, 70078, 92574,
2751, 12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0,
63920, 74128, 2856, 119910, 47, 69908, 126986, 65858, 0, 0, 0, 7899, 0,
8417, 43798, 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903,
@@ -17797,13 +17799,13 @@ static unsigned int code_hash[] = {
12624, 0, 1673, 4811, 92383, 5986, 9338, 3046, 74480, 5985, 917928,
119598, 9820, 0, 12187, 0, 0, 5984, 0, 43308, 4393, 67650, 0, 0, 0, 0,
74826, 64733, 0, 0, 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605,
- 92483, 7514, 983359, 0, 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610,
+ 92483, 7514, 983360, 0, 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610,
219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, 7147, 9535, 0, 93991,
0, 64530, 0, 64610, 11804, 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895,
5253, 70025, 5458, 0, 2866, 0, 127860, 65111, 68433, 6700, 120484, 0,
120583, 0, 8962, 77960, 9641, 43694, 7059, 983668, 0, 9604, 78700, 7441,
63826, 67970, 118941, 64392, 194735, 983678, 2844, 983932, 41974, 0,
- 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983227,
+ 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983228,
5308, 0, 290, 0, 0, 2862, 2792, 195088, 983070, 0, 3268, 66591, 0, 6552,
42367, 7035, 120558, 0, 0, 1814, 0, 10240, 92338, 74305, 0, 74528, 65903,
0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 127337, 8163, 65270, 0,
@@ -17864,7 +17866,7 @@ static unsigned int code_hash[] = {
93998, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0,
2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 983796, 74365, 7552, 0, 0,
65384, 7223, 4559, 0, 1956, 43138, 7024, 65728, 64501, 1210, 195077,
- 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 983285,
+ 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 983286,
983783, 0, 4357, 0, 119837, 917863, 74233, 9967, 78884, 42860, 119838,
10941, 65721, 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224,
92267, 128536, 11974, 92213, 42772, 127518, 11650, 5013, 92663, 126583,
@@ -17882,7 +17884,7 @@ static unsigned int code_hash[] = {
41869, 12619, 0, 10154, 983043, 74439, 2039, 0, 7446, 1684, 63979, 10974,
458, 120620, 0, 69791, 127161, 11916, 65016, 0, 69671, 42115, 983133,
12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, 13080, 0, 65808, 6610,
- 6030, 8059, 7508, 13131, 0, 983423, 0, 8794, 41278, 41629, 12154, 128192,
+ 6030, 8059, 7508, 13131, 0, 983424, 0, 8794, 41278, 41629, 12154, 128192,
41277, 64658, 0, 64380, 6625, 74354, 19904, 0, 0, 0, 65371, 7078, 0, 833,
0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0, 19916, 6913, 933, 1341,
9842, 6720, 65744, 0, 983592, 128295, 0, 7405, 10105, 65810, 0, 41632,
@@ -17897,7 +17899,7 @@ static unsigned int code_hash[] = {
6741, 43047, 0, 13180, 128517, 418, 917972, 64495, 10295, 10327, 10391,
41752, 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849,
41751, 69776, 8941, 983556, 4554, 0, 9023, 11685, 0, 9928, 78617, 0,
- 11437, 43741, 92163, 120700, 63967, 983475, 41206, 120724, 9049, 41185,
+ 11437, 43741, 92163, 120700, 63967, 983476, 41206, 120724, 9049, 41185,
43166, 0, 11680, 92619, 11686, 78544, 65224, 4565, 4655, 119553, 0,
92183, 64523, 10343, 10407, 0, 66671, 11466, 0, 128003, 42890, 74013,
12050, 68201, 2860, 0, 0, 0, 42792, 5743, 10424, 12065, 42872, 0, 92342,
@@ -17913,7 +17915,7 @@ static unsigned int code_hash[] = {
42690, 9880, 42010, 74824, 64589, 10111, 64875, 127880, 68399, 43998,
11360, 0, 0, 0, 118826, 42149, 0, 0, 0, 64941, 77919, 120421, 128077, 0,
55247, 4110, 66005, 6959, 10929, 119110, 0, 66703, 77921, 8617, 41982,
- 6025, 69242, 983176, 0, 0, 0, 9597, 42099, 43172, 983368, 10117, 983169,
+ 6025, 69242, 983176, 0, 0, 0, 9597, 42099, 43172, 983369, 10117, 983169,
92297, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0,
127517, 0, 8964, 65676, 7775, 0, 41948, 0, 0, 0, 41942, 65449, 3160,
10081, 13226, 42121, 42475, 42663, 128210, 41766, 119114, 65882, 78849,
@@ -17928,15 +17930,15 @@ static unsigned int code_hash[] = {
10716, 0, 42822, 0, 6434, 0, 6939, 7766, 6432, 128106, 69932, 916, 769,
41742, 11968, 74805, 6433, 5563, 547, 1943, 6439, 5560, 4994, 487,
126537, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, 8716, 1595, 41615,
- 0, 0, 74260, 0, 42854, 43219, 128709, 983452, 12185, 128879, 70072,
- 68355, 68357, 0, 42856, 8634, 0, 983389, 4209, 120702, 0, 65879, 41538,
- 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 983456, 5678, 11821, 0,
- 6711, 460, 0, 0, 983453, 0, 120747, 0, 0, 78050, 119022, 0, 983454, 0,
+ 0, 0, 74260, 0, 42854, 43219, 128709, 983453, 12185, 128879, 70072,
+ 68355, 68357, 0, 42856, 8634, 0, 983390, 4209, 120702, 0, 65879, 41538,
+ 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 983457, 5678, 11821, 0,
+ 6711, 460, 0, 0, 983454, 0, 120747, 0, 0, 78050, 119022, 0, 983455, 0,
7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, 128079,
- 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 983384, 0, 78119, 1549, 0, 0,
+ 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 983385, 0, 78119, 1549, 0, 0,
120398, 5682, 6206, 8670, 10256, 5680, 69935, 10001, 128512, 69768, 1449,
10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 68030, 5567,
- 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983248, 128026, 0, 65708,
+ 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983249, 128026, 0, 65708,
65709, 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468,
120561, 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647,
78702, 78703, 78690, 457, 78502, 65701, 1934, 43006, 119903, 8802, 78710,
@@ -17950,12 +17952,12 @@ static unsigned int code_hash[] = {
119570, 42239, 8536, 78740, 78324, 78726, 74432, 724, 0, 1455, 78749,
7183, 64583, 78747, 68443, 4175, 78741, 43614, 69801, 939, 0, 43520,
68613, 74569, 917958, 0, 78763, 78764, 78760, 10788, 6088, 78759, 78755,
- 190, 0, 12593, 0, 8188, 64408, 0, 4417, 983211, 92261, 6370, 0, 7827,
+ 190, 0, 12593, 0, 8188, 64408, 0, 4417, 983212, 92261, 6370, 0, 7827,
68441, 6965, 0, 0, 13201, 128205, 69896, 0, 74382, 73781, 7918, 73988, 0,
- 0, 917884, 1728, 0, 43764, 178, 12972, 92679, 0, 917887, 92563, 983373,
+ 0, 917884, 1728, 0, 43764, 178, 12972, 92679, 0, 917887, 92563, 983374,
0, 78327, 120405, 65690, 0, 0, 119054, 0, 9252, 917889, 4652, 68371, 0,
0, 0, 13065, 9923, 10806, 0, 11763, 70016, 120688, 6723, 78187, 0, 6993,
- 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983307, 69911, 11910,
+ 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983308, 69911, 11910,
92559, 8278, 8963, 4034, 128560, 0, 65344, 120517, 41747, 0, 0, 8677, 0,
12707, 9350, 66037, 128180, 8836, 12315, 12747, 8300, 983741, 0, 7491,
8856, 71361, 0, 43150, 127768, 120404, 65389, 120402, 120403, 10813,
@@ -17982,27 +17984,27 @@ static unsigned int code_hash[] = {
116, 12998, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103,
102, 101, 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, 77931, 1536,
64093, 73970, 77930, 127157, 0, 6020, 12716, 127112, 12744, 475, 120394,
- 13266, 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 983299, 8134,
+ 13266, 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 983300, 8134,
128028, 2913, 73870, 127113, 1866, 0, 195095, 0, 8923, 1645, 12059,
66585, 71297, 3196, 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859,
7916, 9861, 9860, 5258, 1882, 1892, 6731, 10882, 405, 11454, 73911, 0,
128781, 41169, 8939, 41245, 0, 41170, 1454, 11369, 6477, 12157, 0, 0, 0,
- 41172, 7855, 0, 0, 10480, 0, 0, 77936, 8264, 12610, 983300, 645, 126616,
+ 41172, 7855, 0, 0, 10480, 0, 0, 77936, 8264, 12610, 983301, 645, 126616,
7609, 40973, 69943, 73833, 69948, 5824, 984, 77918, 10688, 5851, 0, 7729,
73982, 120518, 0, 195086, 43369, 0, 128140, 68415, 983093, 4538, 120406,
- 43141, 0, 983208, 74214, 73886, 0, 0, 118902, 43005, 78448, 9552, 0, 0,
+ 43141, 0, 983209, 74214, 73886, 0, 0, 118902, 43005, 78448, 9552, 0, 0,
983159, 12997, 0, 0, 0, 0, 2381, 12883, 10994, 10529, 41906, 0, 0, 0,
12425, 10661, 10856, 9614, 2428, 41478, 8582, 10064, 73930, 0, 0, 0,
- 64896, 119162, 1952, 92181, 8455, 10082, 11575, 983482, 119566, 0, 12808,
+ 64896, 119162, 1952, 92181, 8455, 10082, 11575, 983483, 119566, 0, 12808,
12183, 6145, 118955, 64929, 92433, 0, 983193, 43186, 42509, 0, 3922,
9187, 983614, 0, 10191, 119057, 11752, 3353, 9358, 0, 71366, 66680,
- 120090, 8248, 7931, 8558, 9795, 68380, 983289, 0, 120082, 120081, 120084,
+ 120090, 8248, 7931, 8558, 9795, 68380, 983290, 0, 120082, 120081, 120084,
41027, 120086, 0, 120088, 7366, 7019, 120073, 0, 11751, 120078, 78294,
64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0,
43154, 41029, 0, 11332, 65380, 7728, 94077, 11294, 0, 66665, 7851, 0,
8375, 8699, 0, 42524, 0, 9085, 94041, 7504, 9327, 6160, 128095, 983855,
0, 8088, 0, 74012, 92500, 0, 4439, 6926, 983047, 12924, 128227, 42369,
- 4350, 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 983275, 0, 0,
+ 4350, 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 983276, 0, 0,
65825, 9577, 68199, 0, 64670, 983121, 78056, 6793, 11295, 0, 78053,
73872, 0, 0, 10902, 0, 0, 78070, 78068, 10472, 2995, 0, 0, 64682, 2371,
78069, 120808, 259, 1009, 92171, 2402, 2333, 6440, 194741, 0, 65125,
@@ -18016,13 +18018,13 @@ static unsigned int code_hash[] = {
11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0, 128584, 12622, 0,
0, 0, 194714, 127139, 13310, 773, 19933, 1539, 0, 126983, 42731, 67972,
0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250, 43991, 69687, 66649,
- 9510, 66237, 983294, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707,
+ 9510, 66237, 983295, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707,
917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882, 6686,
- 119584, 11613, 120772, 42754, 0, 983298, 92696, 0, 0, 0, 128523, 3225,
+ 119584, 11613, 120772, 42754, 0, 983299, 92696, 0, 0, 0, 128523, 3225,
917996, 4433, 41156, 43973, 43173, 1443, 4381, 0, 0, 10926, 11756, 11757,
64879, 917949, 917950, 127848, 13227, 0, 10021, 5160, 1387, 0, 917953,
41418, 0, 65914, 6721, 217, 917955, 917960, 917961, 10443, 10789, 41158,
- 119257, 4274, 983292, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232,
+ 119257, 4274, 983293, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232,
0, 41252, 66682, 0, 119637, 41249, 1366, 64635, 65047, 12466, 0, 0, 4397,
128037, 128336, 41296, 9545, 41291, 128049, 0, 41485, 3511, 41282, 5923,
10400, 0, 128818, 760, 0, 12088, 5786, 0, 42256, 119869, 119860, 417,
@@ -18032,7 +18034,7 @@ static unsigned int code_hash[] = {
119576, 0, 0, 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 69845,
120794, 7840, 0, 43630, 10252, 0, 128104, 43185, 0, 4396, 0, 119880,
10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, 0, 6072, 43025,
- 10299, 0, 0, 120608, 66326, 983439, 127794, 0, 43811, 9330, 120596, 7222,
+ 10299, 0, 0, 120608, 66326, 983440, 127794, 0, 43811, 9330, 120596, 7222,
10283, 10315, 10379, 4996, 983773, 13281, 66517, 7865, 10087, 78343, 0,
78347, 0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 7414, 77929, 43982,
74288, 622, 74023, 885, 43405, 1602, 0, 0, 852, 0, 12160, 0, 10212,
@@ -18063,7 +18065,7 @@ static unsigned int code_hash[] = {
7830, 11651, 13093, 64002, 0, 65742, 12874, 119597, 11590, 0, 74048,
128350, 8595, 0, 917947, 43703, 13097, 0, 64643, 13283, 12697, 0, 12381,
3488, 5933, 10033, 73738, 66241, 65570, 0, 12297, 119153, 1955, 0, 5349,
- 42538, 0, 0, 7411, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 983219, 7638,
+ 42538, 0, 0, 7411, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 983220, 7638,
41642, 42764, 0, 43109, 7637, 5752, 74037, 0, 73832, 128827, 120635,
128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 120798, 291, 0, 0, 2027,
66230, 10080, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431,
@@ -18110,14 +18112,14 @@ static unsigned int code_hash[] = {
0, 4916, 0, 380, 10958, 66563, 77955, 69773, 9773, 13167, 12918, 41096,
73980, 69245, 78254, 917893, 10684, 0, 917896, 0, 7946, 12541, 8182,
67586, 69780, 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 0, 68011, 8847, 0,
- 65876, 5535, 8329, 74590, 983206, 92609, 0, 0, 3127, 2595, 65713, 42013,
+ 65876, 5535, 8329, 74590, 983207, 92609, 0, 0, 3127, 2595, 65713, 42013,
983849, 5607, 41089, 0, 0, 74256, 2665, 11304, 43751, 74200, 4970, 8764,
120459, 8934, 92726, 41566, 4492, 0, 65011, 41090, 0, 0, 1188, 7254,
1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 68019, 3572, 10023, 4959,
- 13079, 0, 983268, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450,
- 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 983301, 972,
- 41453, 983434, 0, 73883, 68022, 73945, 983726, 2288, 19955, 9538, 0,
- 69807, 0, 0, 0, 0, 11396, 983432, 11019, 0, 0, 0, 68020, 41078, 71365,
+ 13079, 0, 983269, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450,
+ 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 983302, 972,
+ 41453, 983435, 0, 73883, 68022, 73945, 983726, 2288, 19955, 9538, 0,
+ 69807, 0, 0, 0, 0, 11396, 983433, 11019, 0, 0, 0, 68020, 41078, 71365,
261, 5927, 7791, 0, 7362, 0, 10696, 0, 6073, 9838, 118920, 0, 6075,
93995, 282, 126510, 6437, 74078, 128000, 9801, 0, 74177, 0, 0, 3474,
118787, 0, 120655, 6081, 0, 78874, 74076, 78879, 0, 0, 0, 0, 0, 8751,
@@ -18138,7 +18140,7 @@ static unsigned int code_hash[] = {
4564, 0, 0, 74271, 73753, 8374, 983156, 0, 6829, 5225, 128807, 127385, 0,
0, 119615, 0, 74793, 5626, 73807, 11771, 74075, 127236, 128019, 42614,
5353, 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 69942, 6952,
- 983264, 120752, 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471,
+ 983265, 120752, 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471,
120038, 120027, 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400,
5627, 120017, 120018, 120023, 64275, 120021, 8786, 0, 203, 0, 0, 0, 0,
78350, 0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065,
@@ -18175,10 +18177,10 @@ static unsigned int code_hash[] = {
612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 983163, 12280, 0, 540,
74564, 119017, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667,
0, 64684, 126992, 3359, 7800, 69934, 65177, 6226, 353, 12396, 0, 119612,
- 64742, 128682, 120282, 0, 983442, 12412, 19941, 0, 120277, 78847, 1884,
+ 64742, 128682, 120282, 0, 983443, 12412, 19941, 0, 120277, 78847, 1884,
9481, 42418, 70059, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0,
41328, 42344, 0, 12409, 0, 4360, 127009, 9739, 128550, 69933, 73921, 0,
- 42521, 8539, 983716, 0, 118986, 0, 4788, 0, 68023, 65734, 983447, 43790,
+ 42521, 8539, 983716, 0, 118986, 0, 4788, 0, 68023, 65734, 983448, 43790,
0, 13075, 74429, 94063, 64569, 43532, 10837, 2492, 127197, 118901, 68637,
41136, 43785, 11813, 9649, 41154, 119617, 5128, 4038, 41143, 65604,
64859, 41592, 6771, 1648, 5435, 917837, 6734, 41343, 119848, 65439,
@@ -18214,7 +18216,7 @@ static unsigned int code_hash[] = {
41461, 128823, 0, 127912, 0, 8819, 12663, 0, 41184, 74014, 232, 74835,
120646, 9168, 65786, 0, 0, 0, 9094, 0, 11758, 68425, 0, 1064, 42467,
128044, 10115, 19924, 92711, 0, 7862, 64551, 13224, 8516, 41862, 66650,
- 7561, 78618, 69793, 1878, 0, 983261, 2911, 0, 41178, 5427, 64823, 0, 0,
+ 7561, 78618, 69793, 1878, 0, 983262, 2911, 0, 41178, 5427, 64823, 0, 0,
3787, 41174, 0, 41458, 0, 41463, 42413, 11292, 2406, 775, 0, 65584,
69923, 6074, 9618, 128668, 983943, 43440, 0, 194901, 41436, 3656, 0,
120600, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456, 12598,
@@ -18236,7 +18238,7 @@ static unsigned int code_hash[] = {
41287, 92610, 0, 0, 42219, 128257, 0, 41987, 41676, 983059, 120823,
983144, 41670, 0, 92590, 2796, 55291, 11683, 9902, 74521, 67988, 11451,
983111, 128822, 42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133,
- 64368, 983233, 128795, 0, 397, 43622, 42139, 9547, 9590, 128238, 1614,
+ 64368, 983234, 128795, 0, 397, 43622, 42139, 9547, 9590, 128238, 1614,
43661, 64356, 66307, 6651, 1358, 0, 428, 9620, 1466, 78112, 10982,
118831, 1333, 7104, 407, 6425, 128834, 74253, 0, 0, 0, 5804, 11976, 8554,
92721, 0, 0, 9057, 42294, 41218, 0, 0, 78137, 1883, 10952, 8048, 78142,
@@ -18250,7 +18252,7 @@ static unsigned int code_hash[] = {
66315, 2106, 120222, 11273, 0, 43004, 7541, 0, 0, 961, 64307, 66324,
64906, 128591, 3106, 65917, 41284, 1696, 0, 891, 12105, 0, 42624, 12802,
3264, 8824, 13268, 43003, 10936, 0, 0, 0, 194826, 92688, 0, 2322, 120371,
- 983584, 11449, 128187, 42868, 41285, 3547, 0, 0, 128793, 983390, 43216,
+ 983584, 11449, 128187, 42868, 41285, 3547, 0, 0, 128793, 983391, 43216,
6089, 78682, 0, 120578, 4170, 1029, 127761, 127036, 119224, 42374, 0,
744, 0, 0, 0, 65823, 127826, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 983162,
65136, 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778,
@@ -18277,8 +18279,8 @@ static unsigned int code_hash[] = {
6352, 41892, 0, 7555, 13103, 5408, 2817, 1214, 69919, 92335, 983125, 0,
0, 0, 127195, 7957, 8689, 64723, 1056, 42896, 74147, 194813, 0, 55286,
7073, 65850, 12327, 983939, 119028, 0, 0, 0, 2341, 8450, 8484, 8474,
- 983252, 0, 70079, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451,
- 7571, 13073, 0, 0, 681, 983246, 703, 0, 3272, 8781, 12894, 70077, 11709,
+ 983253, 0, 70079, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451,
+ 7571, 13073, 0, 0, 681, 983247, 703, 0, 3272, 8781, 12894, 70077, 11709,
92288, 74446, 0, 92532, 0, 11338, 120768, 3276, 0, 0, 65928, 0, 0, 65021,
64795, 74574, 0, 10047, 78814, 3262, 78811, 42711, 0, 0, 68478, 163, 576,
9895, 1655, 78817, 74591, 78815, 78816, 983122, 0, 0, 0, 10039, 0,
@@ -18288,7 +18290,7 @@ static unsigned int code_hash[] = {
0, 71362, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128,
65118, 0, 119151, 74205, 92651, 0, 2401, 68144, 8792, 983639, 0, 65455,
0, 92246, 0, 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161,
- 10396, 74135, 983445, 118945, 78118, 73851, 3010, 6441, 78122, 1458,
+ 10396, 74135, 983446, 118945, 78118, 73851, 3010, 6441, 78122, 1458,
41475, 128672, 93975, 0, 11479, 0, 120356, 6350, 12864, 69674, 78114,
1061, 64780, 2001, 43111, 55230, 128686, 4052, 0, 7626, 0, 0, 1045, 0,
5631, 41113, 0, 0, 43707, 74127, 0, 0, 8486, 0, 73758, 2335, 4362,
@@ -18304,8 +18306,8 @@ static unsigned int code_hash[] = {
92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 128285, 66447, 8046,
64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 93965, 10487,
69878, 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771,
- 983229, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 2283,
- 983231, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0,
+ 983230, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 2283,
+ 983232, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0,
92717, 70074, 4770, 0, 917567, 8731, 65378, 127362, 120619, 9122, 128033,
126600, 4774, 3019, 9997, 12834, 0, 9456, 10215, 120547, 0, 0, 0, 0,
74776, 4281, 4768, 0, 41535, 4099, 9017, 0, 0, 78095, 0, 78096, 0, 0, 0,
@@ -18333,7 +18335,7 @@ static unsigned int code_hash[] = {
41521, 118934, 494, 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740,
73734, 0, 0, 0, 66449, 13263, 74281, 69217, 13171, 127796, 0, 0, 92294,
0, 1044, 41276, 0, 0, 0, 42068, 11795, 0, 0, 0, 0, 42450, 3907, 0, 64526,
- 11829, 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 983446, 7098, 0,
+ 11829, 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 983447, 7098, 0,
0, 1057, 566, 42696, 0, 3016, 42274, 43464, 66490, 12921, 66571, 78472,
92510, 3006, 4620, 127237, 983578, 0, 0, 64659, 0, 127749, 55253, 6357,
6362, 8626, 71337, 2216, 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0,
@@ -18364,9 +18366,9 @@ static unsigned int code_hash[] = {
42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, 983957,
5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, 9218,
1731, 0, 983737, 0, 67990, 0, 0, 0, 120001, 127018, 92492, 5155, 120000,
- 5358, 983735, 0, 917767, 64424, 983225, 3840, 64314, 41432, 0, 78315,
+ 5358, 983735, 0, 917767, 64424, 983226, 3840, 64314, 41432, 0, 78315,
68430, 67980, 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109,
- 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 67978, 74842, 983276,
+ 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 67978, 74842, 983277,
983712, 12149, 13088, 551, 0, 10156, 12119, 92572, 0, 2544, 65074,
119211, 0, 0, 78011, 351, 119149, 0, 0, 55229, 0, 74268, 0, 0, 0, 42377,
0, 0, 0, 983915, 0, 9013, 4054, 0, 983570, 0, 0, 73960, 5585, 65881,
@@ -18439,33 +18441,33 @@ static unsigned int code_hash[] = {
0, 43435, 0, 0, 4993, 0, 6168, 10934, 1946, 741, 0, 5494, 4639, 983147,
1990, 66589, 4498, 78664, 119183, 0, 0, 69734, 2960, 73779, 0, 8969,
128117, 43424, 127059, 0, 2950, 119579, 6210, 65753, 370, 0, 0, 0, 4953,
- 983673, 0, 0, 0, 69230, 0, 0, 65688, 983240, 5063, 3517, 2964, 43663,
+ 983673, 0, 0, 0, 69230, 0, 0, 65688, 983241, 5063, 3517, 2964, 43663,
917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, 66016, 78253, 0,
71317, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, 0, 65883, 0,
917774, 120602, 3761, 0, 0, 70068, 0, 12912, 119012, 3850, 128191, 0, 0,
0, 0, 908, 0, 8611, 0, 0, 127555, 43691, 41197, 0, 8978, 120540, 119135,
41586, 10527, 0, 917848, 3848, 78739, 194937, 127536, 65241, 5336,
- 983251, 128786, 663, 0, 10780, 0, 0, 78767, 983249, 127163, 68193, 347,
+ 983252, 128786, 663, 0, 10780, 0, 0, 78767, 983250, 127163, 68193, 347,
0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143,
69657, 78512, 0, 43441, 41804, 78523, 0, 78525, 0, 128859, 41584, 10681,
0, 983686, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518,
- 6609, 10434, 0, 11319, 1097, 0, 917850, 41730, 983212, 0, 73847, 78761,
+ 6609, 10434, 0, 11319, 1097, 0, 917850, 41730, 983213, 0, 73847, 78761,
65172, 41728, 41721, 0, 0, 0, 41203, 917612, 13110, 41726, 983846, 0,
1000, 69651, 0, 41140, 1209, 73978, 0, 73750, 1073, 6321, 77878, 41138,
0, 68213, 0, 12167, 1115, 41605, 9794, 127062, 67671, 55248, 12237,
78787, 66314, 6587, 9290, 78782, 78783, 9231, 78781, 2959, 7926, 0, 0, 0,
64398, 0, 119970, 12311, 983718, 78796, 78798, 78794, 78795, 68434,
78793, 66670, 0, 0, 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131,
- 0, 9627, 78536, 78542, 78535, 983210, 1944, 1248, 10148, 127755, 119990,
+ 0, 9627, 78536, 78542, 78535, 983211, 1944, 1248, 10148, 127755, 119990,
119991, 12701, 78376, 11308, 119995, 0, 119997, 119998, 65305, 65100,
4031, 42794, 120003, 7075, 8154, 119985, 120007, 41817, 73934, 42275,
120011, 120012, 78526, 120014, 120015, 6041, 0, 41899, 0, 8002, 0, 4364,
0, 0, 64332, 0, 7813, 9064, 119986, 10124, 7526, 8601, 7281, 78455, 7279,
- 12041, 1418, 10885, 12673, 0, 0, 9660, 983272, 13012, 4571, 0, 0, 120164,
+ 12041, 1418, 10885, 12673, 0, 0, 9660, 983273, 13012, 4571, 0, 0, 120164,
12078, 2970, 0, 10933, 0, 77870, 0, 127015, 0, 41599, 0, 128831, 0,
12950, 92160, 3486, 0, 78311, 4239, 0, 127799, 66511, 0, 2637, 64629,
8460, 127053, 8476, 983966, 0, 0, 0, 65673, 1019, 78495, 4148, 0, 12289,
- 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 0, 73864, 983201, 41734,
+ 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 0, 73864, 983202, 41734,
8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, 7120, 41736, 92546,
41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, 127284, 0, 73963,
41855, 41867, 65564, 11277, 65892, 11536, 10620, 92272, 7115, 66030,
@@ -18473,8 +18475,8 @@ static unsigned int code_hash[] = {
92512, 0, 66377, 69781, 0, 983690, 78511, 3161, 295, 120207, 0, 92223,
127856, 78742, 9016, 43454, 63903, 63902, 43641, 0, 3971, 0, 70063, 2952,
78765, 11038, 10901, 63900, 63899, 63898, 94043, 667, 12332, 63887, 6086,
- 41722, 0, 5172, 0, 0, 4159, 0, 0, 9815, 63884, 19934, 63882, 41198, 8555,
- 63878, 63877, 42460, 6050, 42708, 63881, 63872, 0, 42421, 0, 41723,
+ 41722, 0, 5172, 0, 983271, 4159, 0, 0, 9815, 63884, 19934, 63882, 41198,
+ 8555, 63878, 63877, 42460, 6050, 42708, 63881, 63872, 0, 42421, 0, 41723,
63875, 63874, 11460, 7432, 1913, 41913, 63852, 126636, 0, 42348, 73892,
6752, 446, 41911, 127906, 63851, 63850, 41910, 0, 63846, 2972, 12932,
7262, 0, 63849, 63848, 63847, 128070, 6570, 8302, 7259, 63842, 4178,
@@ -18515,7 +18517,7 @@ static unsigned int code_hash[] = {
0, 10515, 41589, 128698, 0, 6218, 0, 1430, 0, 0, 120606, 78754, 5413,
7619, 3255, 3493, 74032, 11549, 10735, 41743, 73937, 6801, 983624, 4518,
10990, 65073, 5167, 4481, 3771, 120158, 2710, 0, 69243, 41724, 0, 43073,
- 41690, 12479, 983626, 0, 0, 983809, 70046, 1628, 127149, 983479, 983722,
+ 41690, 12479, 983626, 0, 0, 983809, 70046, 1628, 127149, 983480, 983722,
65262, 6333, 10783, 42315, 0, 63855, 94056, 0, 0, 5339, 74323, 0, 13004,
0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, 68464, 12633,
12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, 74251, 0, 120647,
@@ -18542,7 +18544,7 @@ static unsigned int code_hash[] = {
73859, 65904, 7363, 1686, 0, 78406, 11467, 3664, 65921, 64299, 194664, 0,
0, 4324, 126, 42246, 119152, 0, 74378, 65926, 7744, 194636, 74277, 74302,
78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0, 0, 4762, 1103, 0, 0,
- 4765, 983484, 13078, 0, 4760, 63827, 2050, 10871, 43199, 1102, 0, 42236,
+ 4765, 983485, 13078, 0, 4760, 63827, 2050, 10871, 43199, 1102, 0, 42236,
128867, 194667, 11546, 74794, 337, 0, 42591, 8627, 12279, 1111, 0, 92161,
4707, 68206, 10143, 7883, 127081, 7880, 4522, 8645, 5704, 13010, 0, 8304,
917561, 0, 119575, 2293, 0, 66654, 0, 92676, 0, 13008, 0, 4385, 0, 13011,
@@ -18566,7 +18568,7 @@ static unsigned int code_hash[] = {
1349, 63750, 63749, 0, 0, 0, 63753, 63802, 41084, 120622, 68133, 41930,
63805, 63804, 43632, 63801, 41082, 8140, 63798, 6260, 0, 0, 94074, 63793,
11988, 3898, 128241, 10201, 12238, 63795, 42194, 10367, 12521, 10431,
- 42114, 41932, 1068, 0, 12523, 12945, 983321, 42203, 7950, 10804, 63771,
+ 42114, 41932, 1068, 0, 12523, 12945, 983322, 42203, 7950, 10804, 63771,
42787, 4386, 12224, 6973, 2793, 12475, 0, 0, 63769, 9530, 983119, 12232,
13135, 8596, 5681, 63762, 4595, 63760, 792, 0, 64803, 0, 8742, 0, 11053,
128796, 63744, 128107, 0, 7588, 63748, 1693, 63746, 43204, 5055, 68426,
@@ -18595,7 +18597,7 @@ static unsigned int code_hash[] = {
65835, 0, 2365, 7841, 0, 42855, 118856, 42866, 0, 0, 0, 66438, 41785,
12617, 64172, 13173, 4372, 119354, 0, 983568, 0, 0, 92402, 128062, 12965,
384, 64512, 10404, 10340, 119352, 1556, 5274, 13210, 120125, 10017, 9733,
- 41787, 983237, 126994, 41373, 78039, 12303, 0, 13232, 13233, 349, 4863,
+ 41787, 983238, 126994, 41373, 78039, 12303, 0, 13232, 13233, 349, 4863,
41371, 11656, 0, 120703, 119883, 12861, 4398, 8543, 65618, 128018, 1096,
0, 0, 42688, 12441, 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243,
13237, 12719, 126646, 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864,
@@ -18623,7 +18625,7 @@ static unsigned int code_hash[] = {
5841, 5837, 55234, 0, 3105, 12829, 5838, 5796, 0, 119592, 5793, 0, 5866,
5797, 41011, 5865, 120091, 7956, 598, 0, 64649, 5806, 42398, 0, 9037,
5671, 120041, 0, 0, 0, 128855, 0, 847, 128242, 9529, 0, 66657, 6980,
- 78483, 120035, 78484, 983483, 0, 120033, 78486, 0, 0, 120039, 42683, 0,
+ 78483, 120035, 78484, 983484, 0, 120033, 78486, 0, 0, 120039, 42683, 0,
983055, 7114, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929,
6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546, 69727,
68141, 8372, 0, 65116, 0, 120022, 10175, 10388, 42799, 94100, 41013,
@@ -18631,7 +18633,7 @@ static unsigned int code_hash[] = {
42608, 78469, 9884, 4759, 0, 0, 10266, 41359, 1170, 43365, 69810, 73908,
1609, 902, 0, 63936, 128875, 11661, 8122, 5818, 0, 0, 3861, 9540, 11028,
2554, 5158, 5714, 2213, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, 0,
- 42155, 0, 41356, 74110, 118801, 126614, 0, 8676, 983283, 0, 5582, 451,
+ 42155, 0, 41356, 74110, 118801, 126614, 0, 8676, 983284, 0, 5582, 451,
63941, 5798, 9349, 42018, 127858, 0, 0, 43609, 5906, 120553, 1440, 0,
128853, 120016, 74283, 11005, 0, 66656, 66044, 0, 194698, 0, 0, 43393,
10094, 0, 11529, 10857, 120643, 66436, 6546, 93, 8102, 0, 68405, 0, 0,
@@ -18665,7 +18667,7 @@ static unsigned int code_hash[] = {
0, 1862, 65800, 9155, 66623, 9786, 65082, 41919, 8579, 41914, 7981, 0,
66017, 4508, 64883, 92456, 92522, 127814, 0, 64592, 74276, 120080, 6784,
78788, 68181, 0, 0, 0, 127534, 12147, 9024, 66378, 66472, 983920, 64289,
- 65289, 78151, 66658, 194929, 64509, 78152, 0, 126505, 11051, 983288, 0,
+ 65289, 78151, 66658, 194929, 64509, 78152, 0, 126505, 11051, 983289, 0,
11355, 65885, 0, 128310, 41214, 0, 12299, 0, 7500, 4506, 7773, 0, 0,
9963, 68649, 126609, 4040, 120570, 6167, 0, 63922, 6594, 983731, 0, 0,
3624, 43036, 0, 6387, 63990, 19947, 63988, 41955, 0, 63993, 10440, 9611,
@@ -18680,7 +18682,7 @@ static unsigned int code_hash[] = {
119625, 42922, 42103, 8628, 9813, 0, 42453, 1604, 9565, 10539, 69701,
65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992, 0, 0, 63980,
11801, 3622, 983124, 64336, 12017, 10463, 63981, 4967, 64189, 1966,
- 43628, 0, 983284, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973,
+ 43628, 0, 983285, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973,
402, 0, 13147, 128692, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805,
0, 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 0, 74425, 11299, 1561, 0,
92359, 64942, 983559, 194733, 983677, 194732, 0, 74301, 0, 11280, 0,
@@ -18691,7 +18693,7 @@ static unsigned int code_hash[] = {
3355, 9508, 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0,
983753, 42691, 917886, 127198, 74767, 0, 127075, 1379, 246, 0, 983752,
3788, 983106, 11041, 92549, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0,
- 983688, 10656, 0, 65214, 119242, 42567, 92217, 13163, 983202, 120831,
+ 983688, 10656, 0, 65214, 119242, 42567, 92217, 13163, 983203, 120831,
74597, 3182, 0, 0, 0, 65034, 65889, 42169, 4755, 74244, 194621, 11443, 0,
66319, 74598, 608, 600, 0, 1219, 3934, 64206, 11483, 74510, 0, 74485,
42442, 65470, 983898, 64202, 13160, 7759, 42482, 485, 128006, 0, 9828, 0,
@@ -18703,14 +18705,14 @@ static unsigned int code_hash[] = {
0, 194675, 1406, 0, 0, 92659, 0, 68223, 4143, 194677, 0, 65748, 4141,
9682, 65287, 1508, 127013, 8779, 10569, 8725, 13299, 66638, 65750, 42263,
4145, 6380, 65751, 66613, 43994, 65738, 55250, 9185, 9550, 0, 43403, 0,
- 0, 0, 65736, 41951, 64816, 65756, 983203, 12955, 10596, 2888, 194645, 0,
+ 0, 0, 65736, 41951, 64816, 65756, 983204, 12955, 10596, 2888, 194645, 0,
0, 9657, 9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 43552, 7501,
6328, 0, 10429, 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986,
126542, 10632, 11934, 11452, 1332, 0, 0, 126647, 0, 118887, 1791, 5191,
9288, 64822, 2892, 0, 43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512,
7289, 74055, 64161, 8854, 64162, 5858, 41927, 10582, 0, 1784, 1361,
195047, 0, 7905, 0, 64868, 128813, 13158, 92166, 7211, 0, 9371, 73973,
- 917553, 6828, 1625, 92302, 0, 1342, 68440, 64171, 126704, 10903, 983486,
+ 917553, 6828, 1625, 92302, 0, 1342, 68440, 64171, 126704, 10903, 983487,
0, 0, 0, 0, 4482, 41606, 0, 128569, 983112, 0, 64381, 0, 0, 195090,
42245, 126467, 41972, 0, 444, 0, 9127, 66687, 66619, 126489, 78025, 0,
11349, 40991, 917570, 0, 119599, 120830, 0, 1197, 128282, 1149, 194970,
@@ -18736,10 +18738,10 @@ static unsigned int code_hash[] = {
4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0, 0, 64914, 917787,
65101, 0, 11694, 92475, 11690, 5835, 127164, 66625, 10842, 41354, 42123,
43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, 0, 9972, 73865, 4519,
- 6114, 10898, 43072, 0, 0, 93960, 983314, 126581, 10695, 0, 7540, 0, 881,
+ 6114, 10898, 43072, 0, 0, 93960, 983315, 126581, 10695, 0, 7540, 0, 881,
7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, 8359, 0, 12689,
- 0, 194594, 0, 983304, 983872, 68183, 0, 983306, 1287, 5436, 0, 983309,
- 74142, 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 983315, 0,
+ 0, 194594, 0, 983305, 983872, 68183, 0, 983307, 1287, 5436, 0, 983310,
+ 74142, 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 983316, 0,
127242, 0, 0, 3652, 10537, 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0,
1489, 0, 0, 0, 3899, 1007, 42124, 983557, 42122, 92337, 92367, 0, 11985,
1345, 78600, 0, 0, 8956, 43083, 94057, 42138, 78610, 0, 12151, 78608,
@@ -18754,14 +18756,14 @@ static unsigned int code_hash[] = {
78627, 78628, 78625, 2399, 69693, 8994, 10944, 41208, 983704, 41168,
8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, 78634, 1947, 0, 0,
92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, 65359, 0, 8017, 119831,
- 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 983325,
+ 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 983326,
69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0,
5398, 0, 127386, 93953, 0, 0, 119015, 0, 0, 9476, 0, 983768, 12763,
126603, 3629, 0, 13005, 0, 3628, 0, 0, 92502, 3469, 42107, 42116, 917578,
64809, 2928, 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, 0, 42583,
9315, 4822, 4906, 3852, 2847, 119821, 3236, 11317, 1251, 7777, 41852,
11410, 10964, 0, 43222, 12646, 120269, 10259, 9865, 65821, 0, 6018,
- 92290, 0, 12276, 0, 68372, 0, 92259, 119244, 0, 983224, 10467, 0, 2443,
+ 92290, 0, 12276, 0, 68372, 0, 92259, 119244, 0, 983225, 10467, 0, 2443,
10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0,
118828, 120271, 65678, 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904,
518, 65857, 0, 128674, 13204, 4387, 857, 0, 65369, 0, 92336, 43125,
@@ -18777,19 +18779,19 @@ static unsigned int code_hash[] = {
78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051, 10460, 43364,
118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703, 43152, 42489,
42112, 127978, 1875, 10808, 42109, 120284, 41860, 64862, 13305, 64907,
- 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 983269,
+ 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 983270,
119830, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151,
73759, 43100, 69888, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753,
65178, 4684, 78701, 119653, 0, 126551, 0, 6048, 74460, 42110, 73965,
10870, 8557, 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731,
- 6035, 0, 7651, 10296, 64443, 0, 983287, 917987, 0, 118966, 74144, 40997,
+ 6035, 0, 7651, 10296, 64443, 0, 983288, 917987, 0, 118966, 74144, 40997,
0, 10392, 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 13307, 41000, 0,
119239, 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505,
41200, 128583, 4425, 0, 0, 0, 43074, 73799, 983200, 78147, 0, 12173,
78545, 0, 127011, 65338, 0, 0, 119582, 4474, 0, 43093, 128644, 1587, 0,
127372, 64475, 128098, 1369, 983663, 9959, 7927, 0, 4560, 0, 0, 92277, 0,
64948, 4430, 74347, 42601, 4514, 66434, 93955, 8194, 65462, 10626, 10965,
- 0, 8893, 983293, 12542, 0, 65341, 0, 65829, 7925, 119822, 10475, 0, 0,
+ 0, 8893, 983294, 12542, 0, 65341, 0, 65829, 7925, 119822, 10475, 0, 0,
1352, 11069, 7707, 127560, 126486, 65279, 127102, 68207, 127100, 7099,
6040, 127097, 10071, 0, 9336, 43750, 0, 8899, 7798, 64474, 64259, 69873,
65188, 7820, 43018, 127082, 0, 7746, 1492, 78551, 10884, 77982, 0, 5127,
@@ -18811,7 +18813,7 @@ static unsigned int code_hash[] = {
40988, 92592, 74809, 41727, 0, 42848, 2396, 917766, 0, 74018, 917538,
64940, 7027, 3886, 0, 42457, 119008, 0, 996, 68123, 94058, 4249, 0,
917594, 11707, 8222, 0, 7939, 92454, 92460, 127801, 917592, 128359, 8534,
- 127154, 40983, 0, 983234, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549,
+ 127154, 40983, 0, 983235, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549,
10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, 0, 1563, 128034, 9619,
983931, 0, 0, 127872, 71363, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0,
65009, 983933, 12567, 128703, 0, 41412, 0, 0, 3607, 9200, 10046, 9612,
@@ -18822,13 +18824,13 @@ static unsigned int code_hash[] = {
12328, 501, 93985, 10601, 0, 583, 0, 41977, 0, 66004, 119350, 6505,
74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, 73764, 0, 92376,
12745, 9678, 0, 120587, 9869, 128815, 1771, 0, 8936, 0, 0, 4208, 78341,
- 78567, 78342, 0, 983448, 74101, 0, 11762, 0, 92422, 77997, 68010, 66475,
+ 78567, 78342, 0, 983449, 74101, 0, 11762, 0, 92422, 77997, 68010, 66475,
0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026,
- 983247, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138,
+ 983248, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138,
119361, 983564, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0,
3440, 78215, 1562, 128656, 127175, 119358, 1716, 983670, 10600, 917867,
620, 41001, 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025,
- 69892, 983207, 0, 118885, 0, 65557, 0, 74541, 983587, 11599, 128209,
+ 69892, 983208, 0, 118885, 0, 65557, 0, 74541, 983587, 11599, 128209,
11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569,
65275, 8906, 127096, 5755, 2636, 0, 10815, 11619, 2301, 41540, 7815,
11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048,
@@ -18943,7 +18945,7 @@ static unsigned int code_hash[] = {
120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 917919, 4569, 74130, 0,
43487, 194630, 611, 74129, 64871, 118891, 65629, 0, 194858, 0, 0, 127545,
120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, 0, 983581, 74054,
- 127754, 195029, 0, 839, 983311, 7695, 8769, 65246, 4829, 194663, 4859,
+ 127754, 195029, 0, 839, 983312, 7695, 8769, 65246, 4829, 194663, 4859,
64467, 0, 983954, 118998, 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210,
983854, 127936, 804, 0, 0, 12298, 0, 66653, 0, 64924, 10091, 73931, 9468,
74245, 0, 0, 74246, 92503, 12839, 64669, 92202, 0, 1279, 1425, 6224,
@@ -18966,7 +18968,7 @@ static unsigned int code_hash[] = {
19936, 7833, 120691, 0, 42599, 42597, 42709, 120409, 127044, 0, 8537, 0,
0, 9354, 983164, 128833, 41199, 10121, 2028, 0, 983194, 69715, 0, 3062,
0, 74447, 12608, 0, 66440, 7545, 9700, 12580, 92205, 120777, 120502,
- 41155, 0, 74071, 0, 983449, 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040,
+ 41155, 0, 74071, 0, 983450, 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040,
64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, 983970, 1230, 0, 0, 3597,
4446, 10584, 74235, 92215, 4037, 127938, 8352, 0, 5687, 0, 64515, 0,
194801, 55265, 67846, 78434, 9704, 0, 0, 70080, 71338, 0, 8660, 126495,
@@ -18986,7 +18988,7 @@ static unsigned int code_hash[] = {
119173, 0, 0, 7805, 0, 94007, 6935, 92292, 78325, 78326, 78323, 43327,
43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543,
78335, 78332, 77832, 65849, 77831, 983952, 0, 12451, 0, 8684, 0, 6102, 0,
- 5298, 0, 5294, 0, 0, 983451, 195062, 9949, 119826, 43617, 119215, 0,
+ 5298, 0, 5294, 0, 0, 983452, 195062, 9949, 119826, 43617, 119215, 0,
12073, 0, 0, 77863, 13108, 120617, 11439, 41468, 983748, 0, 5292, 55272,
983874, 1939, 5302, 3970, 917879, 12455, 1793, 0, 0, 0, 6643, 92477,
65263, 0, 78330, 41293, 78328, 65923, 0, 13219, 9569, 0, 74383, 0, 74197,
@@ -18997,7 +18999,7 @@ static unsigned int code_hash[] = {
0, 0, 78074, 6947, 41152, 887, 9249, 6565, 78510, 41990, 78509, 41811,
74466, 93966, 6670, 77882, 0, 0, 43092, 43325, 0, 10168, 0, 9781, 128655,
9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, 69860, 315, 12813,
- 983450, 78432, 78256, 78351, 78352, 0, 983648, 0, 0, 1378, 9509, 0, 0,
+ 983451, 78432, 78256, 78351, 78352, 0, 983648, 0, 0, 1378, 9509, 0, 0,
74475, 3066, 92220, 67847, 0, 92355, 0, 78365, 8787, 120379, 194616,
41618, 194615, 78261, 194614, 0, 64652, 0, 194612, 0, 78366, 42088, 0,
195061, 7176, 43756, 10137, 6121, 10995, 78259, 74534, 8119, 64874,
@@ -19016,7 +19018,7 @@ static unsigned int code_hash[] = {
549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0, 12606, 78433,
2825, 0, 10825, 8079, 2821, 41046, 92327, 7365, 983744, 120593, 13071, 0,
452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0, 64703,
- 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187, 983377,
+ 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187, 983378,
42628, 78575, 0, 128777, 0, 3240, 128518, 12194, 0, 11591, 41065, 5323,
8166, 0, 0, 0, 74535, 1623, 65297, 128856, 571, 0, 4918, 0, 5288, 127295,
8916, 65048, 1909, 8864, 0, 0, 10736, 92508, 11571, 7615, 127300, 92296,
@@ -19033,7 +19035,7 @@ static unsigned int code_hash[] = {
66010, 119552, 6078, 9954, 0, 1475, 119247, 9938, 6084, 917546, 41064,
41062, 0, 0, 3256, 10189, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0,
0, 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 71351, 0,
- 3635, 64337, 983273, 0, 0, 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0,
+ 3635, 64337, 983274, 0, 0, 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0,
65613, 77909, 92420, 73997, 0, 0, 119218, 7984, 8600, 74434, 127770,
4176, 70050, 2034, 92551, 120805, 65891, 127038, 0, 318, 2038, 128860,
78596, 0, 3649, 13149, 42145, 42798, 3634, 120291, 118927, 67677, 120124,
@@ -19043,13 +19045,13 @@ static unsigned int code_hash[] = {
194567, 12989, 66474, 9368, 12848, 1624, 43270, 0, 74278, 10818, 126644,
9953, 0, 78421, 1194, 3242, 9761, 9555, 8598, 120299, 6169, 12871, 1551,
2798, 65176, 4958, 42752, 119025, 0, 67875, 120301, 3495, 66648, 194768,
- 0, 68364, 983222, 4891, 0, 10641, 0, 73746, 0, 68352, 0, 73787, 194829,
+ 0, 68364, 983223, 4891, 0, 10641, 0, 73746, 0, 68352, 0, 73787, 194829,
194633, 7199, 64955, 0, 0, 0, 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0,
- 5271, 92318, 92517, 118882, 1362, 13297, 0, 128094, 0, 983323, 73789, 0,
- 6658, 4426, 0, 92628, 983833, 92319, 7276, 42163, 5220, 0, 0, 983322,
+ 5271, 92318, 92517, 118882, 1362, 13297, 0, 128094, 0, 983324, 73789, 0,
+ 6658, 4426, 0, 92628, 983833, 92319, 7276, 42163, 5220, 0, 0, 983323,
2416, 3310, 42703, 0, 379, 0, 43755, 0, 0, 3223, 65492, 1284, 194771,
4549, 0, 0, 983154, 127763, 10807, 9558, 194613, 0, 8515, 8688, 12866,
- 65308, 3294, 983324, 8529, 128101, 43385, 7564, 0, 43329, 0, 92458,
+ 65308, 3294, 983325, 8529, 128101, 43385, 7564, 0, 43329, 0, 92458,
73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 92198, 3215, 0,
7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228, 66354, 1501,
0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196, 7476, 74399, 0,
@@ -19076,20 +19078,20 @@ static unsigned int code_hash[] = {
126469, 11946, 0, 3257, 0, 12307, 1845, 983157, 43526, 0, 0, 1886, 42342,
10089, 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879,
43692, 4563, 0, 0, 7591, 65887, 867, 9520, 872, 126607, 868, 873, 7642,
- 0, 869, 874, 7644, 120674, 875, 790, 128303, 0, 0, 0, 66182, 983250,
- 5429, 195055, 66180, 126480, 66181, 68452, 983281, 983242, 42067, 0,
+ 0, 869, 874, 7644, 120674, 875, 790, 128303, 0, 0, 0, 66182, 983251,
+ 5429, 195055, 66180, 126480, 66181, 68452, 983282, 983243, 42067, 0,
5433, 10657, 7911, 194622, 1547, 66176, 42012, 120576, 5425, 4977, 9999,
5317, 5423, 4611, 0, 67637, 0, 9679, 74122, 0, 0, 0, 66194, 4418, 66184,
4628, 4245, 119648, 0, 0, 1851, 0, 127189, 11908, 0, 9360, 118897,
- 983270, 42776, 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809,
- 69881, 0, 983142, 120604, 983052, 983873, 0, 983262, 0, 0, 7427, 9958,
+ 983201, 42776, 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809,
+ 69881, 0, 983142, 120604, 983052, 983873, 0, 983263, 0, 0, 7427, 9958,
4588, 43680, 0, 74484, 194968, 2433, 0, 119622, 3352, 74363, 983876, 0,
793, 74404, 0, 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647,
118877, 0, 7837, 917625, 818, 5337, 194628, 917621, 41376, 119978,
126576, 120594, 74086, 917615, 917614, 917613, 10973, 66359, 1372,
127172, 917608, 4969, 1254, 917605, 917604, 93967, 917602, 65228, 78221,
126612, 0, 2840, 0, 119982, 983930, 0, 3245, 9068, 68194, 64725, 0, 0,
- 12991, 0, 2651, 68016, 983257, 917611, 127026, 128883, 0, 0, 43648,
+ 12991, 0, 2651, 68016, 983258, 917611, 127026, 128883, 0, 0, 43648,
120812, 0, 43322, 92662, 0, 0, 64372, 92698, 3226, 655, 752, 7457, 7456,
7452, 3285, 128779, 127821, 119988, 65610, 2391, 0, 92248, 671, 250,
7434, 618, 668, 610, 42800, 7431, 1152, 42801, 640, 120666, 7448, 7439,
@@ -19106,7 +19108,7 @@ static unsigned int code_hash[] = {
120285, 74225, 94111, 8267, 0, 127265, 0, 7516, 0, 2625, 983968, 8034,
74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, 0, 43384, 12660, 0, 0,
0, 74850, 41069, 0, 128156, 12099, 4310, 10032, 6252, 713, 7990, 0, 3990,
- 0, 983254, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800, 983120,
+ 0, 983255, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800, 983120,
9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650, 94,
1880, 74766, 983829, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0,
126572, 41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 120335, 64785, 7394,
@@ -19125,17 +19127,17 @@ static unsigned int code_hash[] = {
65302, 40989, 0, 194696, 0, 42760, 0, 983566, 0, 40987, 4667, 0, 983923,
8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 92675, 0, 921, 4744, 0, 12702,
242, 0, 1566, 8217, 0, 64653, 78386, 128121, 74036, 74505, 43274, 5313,
- 951, 0, 0, 983858, 7604, 983282, 4009, 127816, 983701, 120562, 0, 983711,
+ 951, 0, 0, 983858, 7604, 983283, 4009, 127816, 983701, 120562, 0, 983711,
64860, 119138, 119069, 0, 127370, 4048, 983598, 0, 70024, 1646, 77890,
64534, 73995, 120705, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107,
3441, 119894, 2975, 74442, 9822, 983926, 55220, 10084, 73943, 118840, 0,
917562, 194610, 3399, 9851, 983708, 11909, 9059, 0, 7687, 0, 6789, 0, 0,
0, 71367, 0, 0, 1777, 9151, 1137, 69767, 749, 42366, 0, 5385, 128574,
128218, 0, 0, 5989, 0, 0, 128091, 0, 41685, 69223, 0, 9769, 41684,
- 983214, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, 41297, 0, 3666,
+ 983215, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, 41297, 0, 3666,
74473, 41300, 74468, 65160, 0, 69688, 69771, 74479, 0, 6558, 0, 0, 69765,
120750, 252, 0, 41302, 0, 0, 0, 69763, 0, 11729, 8719, 9060, 0, 120139,
- 10761, 0, 0, 0, 118792, 11734, 983221, 11730, 0, 9593, 5757, 2403, 64808,
+ 10761, 0, 0, 0, 118792, 11734, 983222, 11730, 0, 9593, 5757, 2403, 64808,
55275, 0, 11728, 43572, 0, 0, 7764, 983705, 11094, 120825, 0, 0, 4282,
8298, 0, 0, 0, 0, 0, 64449, 0, 126650, 63854, 8456, 0, 74783, 65670, 0,
78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, 120764, 0, 10019, 74762, 0,
@@ -19150,48 +19152,48 @@ static unsigned int code_hash[] = {
70065, 2588, 2914, 7011, 55281, 0, 2471, 194631, 2883, 2749, 119563,
73774, 10913, 0, 0, 8666, 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232,
10928, 0, 41153, 41229, 118967, 0, 3738, 94016, 0, 12711, 3181, 66212,
- 74289, 68472, 42857, 8262, 983371, 0, 983220, 0, 42347, 12092, 9615,
+ 74289, 68472, 42857, 8262, 983372, 0, 983221, 0, 42347, 12092, 9615,
7234, 74047, 983088, 0, 43744, 0, 0, 73846, 2934, 12722, 120762, 922,
43983, 74507, 983126, 74461, 3218, 120471, 74290, 120469, 64562, 120475,
8569, 11404, 11932, 73728, 3214, 120461, 120468, 12128, 3207, 65486,
78729, 1901, 78727, 127326, 120460, 7425, 3205, 68003, 78737, 78736,
78735, 43383, 69940, 65459, 2606, 78730, 73897, 0, 11496, 1173, 0, 41272,
- 119661, 0, 0, 983313, 120737, 0, 983962, 983312, 378, 2610, 0, 65079,
- 983317, 65695, 126559, 37, 7068, 0, 120480, 120479, 3209, 120477, 0,
- 10638, 9768, 69952, 119909, 983391, 0, 0, 0, 0, 65510, 0, 0, 5233,
- 983327, 64792, 983326, 0, 126633, 0, 7060, 9847, 120144, 1685, 595, 0,
+ 119661, 0, 0, 983314, 120737, 0, 983962, 983313, 378, 2610, 0, 65079,
+ 983318, 65695, 126559, 37, 7068, 0, 120480, 120479, 3209, 120477, 0,
+ 10638, 9768, 69952, 119909, 983392, 0, 0, 0, 0, 65510, 0, 0, 5233,
+ 983328, 64792, 983327, 0, 126633, 0, 7060, 9847, 120144, 1685, 595, 0,
73971, 1292, 8940, 7380, 11088, 0, 10004, 126997, 0, 6541, 0, 0, 0, 3243,
9014, 5606, 0, 538, 64620, 5602, 8467, 74391, 6547, 128132, 8203, 78488,
983090, 8458, 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, 2465,
69901, 8193, 55279, 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0,
92414, 8982, 0, 0, 0, 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548,
68650, 92507, 1832, 5604, 5735, 41141, 119020, 4376, 0, 11787, 3745, 0,
- 0, 42888, 65712, 983296, 3869, 11937, 5725, 127539, 1783, 68648, 5728, 0,
+ 0, 42888, 65712, 983297, 3869, 11937, 5725, 127539, 1783, 68648, 5728, 0,
0, 0, 11918, 66567, 5724, 0, 5727, 78521, 0, 0, 764, 0, 128116, 43531, 0,
9033, 0, 42532, 6223, 11042, 120749, 11423, 0, 119861, 71344, 43465, 0,
128267, 6559, 64557, 71348, 92649, 120648, 43019, 43477, 10238, 74491, 0,
43377, 92282, 71346, 1478, 9783, 11825, 2607, 64740, 0, 7739, 74543, 0,
0, 0, 6132, 0, 63765, 0, 70058, 41144, 0, 92438, 43537, 6761, 10093,
4369, 917791, 0, 983148, 8820, 3947, 0, 0, 11515, 526, 128103, 41295,
- 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, 983374,
+ 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, 983375,
1543, 3713, 41221, 12423, 42281, 917788, 74024, 12293, 0, 64357, 11794,
42082, 0, 1737, 8987, 42081, 0, 7205, 0, 9335, 12850, 119870, 6553, 7055,
0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, 12990, 1160, 42084, 119650,
41217, 119660, 10018, 360, 0, 0, 68176, 5863, 3137, 0, 4147, 983170,
- 41216, 7844, 2616, 119190, 68461, 65234, 983286, 13076, 3135, 983279,
+ 41216, 7844, 2616, 119190, 68461, 65234, 983287, 13076, 3135, 983280,
78143, 119139, 3142, 92451, 94068, 10819, 119580, 10183, 0, 2608, 1470,
73967, 94008, 6227, 0, 127173, 69741, 983582, 6163, 983558, 0, 127314, 0,
0, 8603, 0, 119866, 3306, 10876, 43392, 119573, 127931, 5751, 0, 6222, 0,
0, 12086, 7403, 1600, 64309, 64939, 0, 64783, 92658, 11310, 0, 8882, 0,
- 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, 6974, 0, 0, 983209, 5002, 0,
+ 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, 6974, 0, 0, 983210, 5002, 0,
41286, 69946, 127019, 0, 43585, 0, 6551, 983953, 128229, 0, 41289, 0,
- 194602, 0, 8977, 602, 120814, 0, 128778, 128661, 0, 983367, 41279, 0, 0,
+ 194602, 0, 8977, 602, 120814, 0, 128778, 128661, 0, 983368, 41279, 0, 0,
0, 11081, 43615, 0, 0, 0, 983612, 12727, 0, 0, 78397, 9475, 7112, 65105,
0, 9633, 10886, 43592, 7831, 983820, 194571, 0, 73915, 8076, 43048, 8290,
8291, 43051, 92570, 0, 2596, 43584, 0, 13113, 0, 127757, 2393, 7058,
9087, 74067, 68673, 41574, 78337, 0, 74058, 6376, 0, 0, 0, 0, 9854,
127748, 64696, 0, 128220, 0, 6994, 0, 1720, 0, 0, 0, 6529, 7063, 983182,
- 3751, 9120, 983477, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, 12430,
+ 3751, 9120, 983478, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, 12430,
8137, 94098, 92642, 0, 0, 245, 128097, 11456, 41233, 7070, 0, 94046,
6136, 917609, 65677, 8682, 41235, 92595, 42045, 9804, 118963, 432, 3595,
194945, 65437, 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, 0, 77894,
@@ -19203,7 +19205,7 @@ static unsigned int code_hash[] = {
3733, 11346, 0, 12054, 0, 74098, 42827, 0, 13091, 0, 0, 0, 917915, 0,
127025, 0, 74821, 0, 983724, 119042, 0, 127865, 13090, 66643, 0, 1270,
1132, 42360, 0, 74096, 66655, 42569, 127824, 0, 64761, 0, 41021, 8510,
- 42432, 0, 0, 194782, 0, 64496, 74109, 70030, 9915, 0, 983216, 7061,
+ 42432, 0, 0, 194782, 0, 64496, 74109, 70030, 9915, 0, 983217, 7061,
41336, 3854, 69700, 13141, 68413, 43401, 42319, 13082, 0, 7067, 68221, 0,
127383, 127171, 0, 0, 127797, 9029, 43543, 119315, 2353, 6308, 0, 74792,
2611, 119186, 0, 0, 0, 43664, 92399, 66627, 0, 4484, 8509, 118976, 11066,
@@ -19217,7 +19219,7 @@ static unsigned int code_hash[] = {
396, 41580, 68146, 0, 12901, 43058, 0, 343, 7129, 42680, 41360, 78154, 0,
4743, 0, 0, 74040, 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 71349,
0, 3964, 6592, 0, 128693, 66040, 0, 42568, 69806, 128113, 1778, 3956, 0,
- 42070, 6563, 43075, 9018, 94006, 983388, 12067, 41312, 0, 5547, 74531,
+ 42070, 6563, 43075, 9018, 94006, 983389, 12067, 41312, 0, 5547, 74531,
127969, 0, 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703,
118822, 1750, 0, 4394, 68368, 1807, 983879, 92298, 0, 5889, 0, 7180, 0,
119145, 0, 917558, 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583,
@@ -19238,26 +19240,26 @@ static unsigned int code_hash[] = {
128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 71336, 0, 0, 0, 64293,
68098, 2635, 0, 0, 983837, 0, 983632, 7835, 70040, 0, 194988, 92285,
64558, 127122, 0, 127121, 0, 127913, 0, 5784, 983102, 0, 0, 70033, 4011,
- 917616, 68101, 0, 7864, 4254, 65095, 983488, 5600, 3903, 127083, 10447,
+ 917616, 68101, 0, 7864, 4254, 65095, 983489, 5600, 3903, 127083, 10447,
5598, 1207, 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597,
- 194778, 194772, 9321, 983476, 983473, 983474, 0, 1719, 68356, 68354,
- 9671, 1125, 4399, 127479, 917610, 983480, 7631, 5488, 7128, 120532, 0,
+ 194778, 194772, 9321, 983477, 983474, 983475, 0, 1719, 68356, 68354,
+ 9671, 1125, 4399, 127479, 917610, 983481, 7631, 5488, 7128, 120532, 0,
5491, 0, 8937, 43044, 2604, 74187, 5490, 43046, 5489, 7212, 11768, 43043,
6300, 0, 7122, 0, 4390, 454, 41397, 0, 9875, 7593, 194791, 92274, 118913,
7207, 0, 65901, 2394, 2575, 0, 3746, 11016, 65752, 120037, 0, 43423,
128683, 11989, 0, 0, 0, 0, 0, 8249, 128172, 0, 78531, 6640, 74806, 2598,
- 513, 0, 6586, 8656, 0, 120710, 65008, 0, 194784, 194989, 194795, 983465,
- 92515, 68475, 93973, 0, 0, 78637, 12647, 0, 128043, 69893, 1036, 983469,
- 92419, 1723, 128056, 74217, 0, 41579, 2444, 0, 10705, 73876, 983461,
- 74486, 983459, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, 68437,
+ 513, 0, 6586, 8656, 0, 120710, 65008, 0, 194784, 194989, 194795, 983466,
+ 92515, 68475, 93973, 0, 0, 78637, 12647, 0, 128043, 69893, 1036, 983470,
+ 92419, 1723, 128056, 74217, 0, 41579, 2444, 0, 10705, 73876, 983462,
+ 74486, 983460, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, 68437,
78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263, 11907,
195000, 5690, 92255, 93992, 0, 43181, 13095, 0, 127857, 64498, 0, 9506,
6978, 194993, 77992, 0, 0, 194992, 0, 127845, 1122, 317, 0, 0, 0, 0,
1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, 5226,
12602, 94044, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725,
69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, 233,
- 127490, 983433, 42816, 94036, 65140, 74797, 0, 8830, 6568, 42300, 10524,
- 41175, 983440, 983437, 983438, 5296, 983436, 42492, 43402, 92466, 3302,
+ 127490, 983434, 42816, 94036, 65140, 74797, 0, 8830, 6568, 42300, 10524,
+ 41175, 983441, 983438, 983439, 5296, 983437, 42492, 43402, 92466, 3302,
0, 0, 6516, 6515, 6514, 6513, 6512, 0, 7856, 8690, 0, 0, 12122, 119602,
43976, 0, 1785, 69925, 68622, 65153, 194810, 5138, 0, 0, 118869, 0, 4540,
41181, 0, 6200, 0, 5134, 0, 322, 4643, 5132, 0, 6389, 128533, 5143, 0,
@@ -19275,14 +19277,14 @@ static unsigned int code_hash[] = {
5198, 4349, 10390, 74202, 5196, 43224, 6113, 42009, 5205, 0, 43307, 0,
118973, 0, 12134, 0, 0, 118843, 9126, 435, 0, 12014, 10377, 8093, 9079,
3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, 128178, 5738,
- 983213, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, 1260,
+ 983214, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, 1260,
3149, 5359, 120134, 0, 7914, 5357, 92170, 128659, 2624, 5364, 0, 11431,
120030, 9101, 11058, 78288, 0, 78293, 42271, 78289, 42917, 120793, 0,
65566, 6717, 10619, 43360, 78385, 78384, 11832, 78382, 78381, 78380,
78379, 9319, 7097, 119055, 77906, 3232, 73824, 74581, 120632, 0, 0,
41889, 92453, 0, 1161, 41895, 74103, 9701, 8622, 0, 0, 73819, 120588,
5012, 77912, 41362, 69862, 78296, 11921, 0, 11769, 0, 68609, 41364, 0,
- 74228, 41352, 41361, 0, 41366, 0, 3356, 0, 917, 68422, 119915, 7134,
+ 74228, 41352, 41361, 0, 41366, 0, 3356, 11611, 917, 68422, 119915, 7134,
8199, 78389, 119917, 677, 119916, 0, 119932, 127169, 0, 0, 0, 3349,
74125, 7022, 8927, 4739, 0, 5802, 0, 8615, 0, 0, 491, 128819, 10190,
120698, 65837, 128820, 8426, 11092, 9891, 0, 42497, 7113, 7586, 42305,
@@ -19323,7 +19325,7 @@ static unsigned int code_hash[] = {
0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 983664, 43367, 64579,
917930, 7852, 0, 0, 6754, 6312, 0, 64672, 65296, 0, 118957, 0, 416,
12296, 68457, 73834, 68177, 11050, 10984, 92208, 0, 0, 92182, 0, 983605,
- 9532, 66355, 0, 983228, 917925, 64343, 195032, 128281, 195031, 0, 195030,
+ 9532, 66355, 0, 983229, 917925, 64343, 195032, 128281, 195031, 0, 195030,
195057, 11445, 0, 2112, 195056, 128814, 10185, 1021, 128130, 9507, 10210,
74544, 8023, 1200, 12243, 78001, 5282, 78003, 9624, 11545, 0, 120493,
3343, 4424, 11047, 1885, 43268, 3896, 78444, 66497, 2947, 392, 7894,
@@ -19358,43 +19360,43 @@ static unsigned int code_hash[] = {
66454, 9592, 42851, 126993, 1542, 92303, 0, 0, 0, 0, 74311, 78497, 0,
10181, 0, 43624, 0, 7779, 0, 10195, 9479, 6029, 0, 92268, 9689, 0, 65577,
8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237, 69787, 2030, 0,
- 6027, 8370, 4322, 0, 65207, 0, 983331, 983330, 983329, 983328, 2735,
+ 6027, 8370, 4322, 0, 65207, 0, 983332, 983331, 983330, 983329, 2735,
42831, 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140,
983919, 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063,
7709, 41112, 983132, 66560, 42041, 4572, 12876, 66561, 983749, 6758,
- 983917, 1615, 5855, 809, 0, 92283, 128316, 128004, 5799, 983320, 70100,
- 983318, 7260, 983316, 43031, 64425, 65128, 78819, 64386, 65257, 0, 68616,
+ 983917, 1615, 5855, 809, 0, 92283, 128316, 128004, 5799, 983321, 70100,
+ 983319, 7260, 983317, 43031, 64425, 65128, 78819, 64386, 65257, 0, 68616,
120607, 9347, 128067, 6532, 0, 0, 0, 127060, 65828, 0, 283, 68665, 78813,
532, 78663, 0, 983787, 120609, 0, 3370, 0, 11361, 5443, 78778, 8153,
- 73767, 0, 10741, 0, 2298, 0, 983908, 65495, 64706, 983310, 43344, 983308,
- 7144, 9466, 78866, 9824, 983303, 983302, 0, 0, 915, 43425, 0, 0, 0, 0,
+ 73767, 0, 10741, 0, 2298, 0, 983908, 65495, 64706, 983311, 43344, 983309,
+ 7144, 9466, 78866, 9824, 983304, 983303, 0, 0, 915, 43425, 0, 0, 0, 0,
127178, 43264, 70096, 0, 0, 43038, 78864, 6730, 78862, 68161, 64550,
5186, 7360, 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107,
- 77826, 0, 42562, 0, 128821, 0, 128520, 11485, 6103, 127123, 983297,
- 11718, 983295, 12889, 92657, 127137, 0, 0, 0, 55245, 0, 1630, 128232,
+ 77826, 0, 42562, 0, 128821, 0, 128520, 11485, 6103, 127123, 983298,
+ 11718, 983296, 12889, 92657, 127137, 0, 0, 0, 55245, 0, 1630, 128232,
65483, 0, 12565, 0, 65476, 120013, 0, 119554, 9283, 7700, 917537, 9690,
65499, 0, 64593, 512, 3376, 68210, 0, 128677, 77892, 632, 12940, 77891,
- 42529, 78587, 0, 5957, 110593, 8926, 983291, 983290, 128273, 10745,
+ 42529, 78587, 0, 5957, 110593, 8926, 983292, 983291, 128273, 10745,
10174, 7379, 64581, 5386, 120686, 11713, 10633, 69708, 5056, 0, 0, 0,
120773, 0, 9812, 0, 4460, 0, 0, 71307, 128038, 0, 0, 127174, 64278,
92370, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835, 119029, 0, 73823, 0,
- 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 983278, 983277,
- 128570, 12106, 983274, 74207, 1755, 10482, 12863, 77898, 1163, 2951,
+ 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 983279, 983278,
+ 128570, 12106, 983275, 74207, 1755, 10482, 12863, 77898, 1163, 2951,
9522, 74079, 78266, 66604, 0, 3384, 69227, 10702, 830, 77902, 77899,
77900, 8451, 0, 0, 0, 69739, 0, 0, 0, 0, 2908, 0, 43386, 64902, 4243, 0,
- 12239, 0, 0, 4441, 0, 983271, 73940, 64352, 127513, 983267, 411, 983265,
- 9199, 983263, 4056, 118992, 41890, 0, 2730, 41604, 983928, 5428, 194743,
+ 12239, 0, 0, 4441, 0, 983272, 73940, 64352, 127513, 983268, 411, 983266,
+ 9199, 983264, 4056, 118992, 41890, 0, 2730, 41604, 983928, 5428, 194743,
3364, 42265, 64437, 127935, 118816, 194742, 9684, 216, 0, 1401, 128053,
44012, 0, 0, 92585, 9158, 77842, 69905, 5768, 0, 0, 0, 484, 194739, 0, 0,
- 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 983255, 93962, 2794,
+ 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 983256, 93962, 2794,
8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509,
77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 78717, 0, 981, 0, 4330, 73929,
120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547,
- 128259, 674, 63991, 983243, 2946, 5354, 5251, 5328, 5307, 3759, 11411,
+ 128259, 674, 63991, 983244, 2946, 5354, 5251, 5328, 5307, 3759, 11411,
8364, 5123, 119628, 5281, 5469, 5121, 119245, 118993, 0, 5130, 0, 0,
77990, 0, 120726, 1221, 2733, 11746, 77991, 5216, 0, 0, 0, 0, 3468, 7033,
9230, 5939, 195052, 0, 0, 120677, 68400, 7278, 10321, 10289, 64613,
- 10385, 41706, 0, 0, 983405, 0, 11739, 983418, 41981, 0, 5938, 0, 43766,
+ 10385, 41706, 0, 0, 983406, 0, 11739, 983419, 41981, 0, 5938, 0, 43766,
12448, 7576, 10401, 10337, 73852, 0, 13057, 0, 126976, 0, 10009, 0,
41703, 983629, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 92457, 0,
4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 128340, 0, 0, 0, 10970,
@@ -19406,53 +19408,53 @@ static unsigned int code_hash[] = {
0, 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961, 66198, 41880,
66188, 11623, 78148, 11955, 66190, 66191, 41111, 66189, 73788, 7788,
4847, 0, 127759, 0, 0, 0, 1581, 6535, 78161, 12954, 430, 78160, 55259,
- 78158, 128036, 5278, 4945, 42883, 4950, 983430, 68625, 983428, 7269, 0,
- 5964, 12908, 983555, 0, 74764, 74477, 119146, 194936, 4949, 983421, 443,
- 983419, 4944, 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0,
+ 78158, 128036, 5278, 4945, 42883, 4950, 983431, 68625, 983429, 7269, 0,
+ 5964, 12908, 983555, 0, 74764, 74477, 119146, 194936, 4949, 983422, 443,
+ 983420, 4944, 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0,
194931, 119962, 41306, 73984, 2698, 127159, 0, 12072, 3193, 0, 41304,
824, 128676, 12091, 78893, 78894, 119816, 4673, 64804, 4678, 119820,
119819, 65059, 0, 6739, 0, 5481, 3490, 1199, 119811, 8356, 69947, 119832,
4677, 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170,
78166, 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, 127024,
- 1855, 983404, 68669, 983402, 92445, 127554, 0, 127339, 119652, 2745,
- 11797, 983410, 128159, 9202, 4654, 983406, 983408, 68638, 73993, 10525,
- 4649, 65209, 983409, 0, 4648, 43080, 983398, 983399, 983396, 6246, 64950,
+ 1855, 983405, 68669, 983403, 92445, 127554, 0, 127339, 119652, 2745,
+ 11797, 983411, 128159, 9202, 4654, 983407, 983409, 68638, 73993, 10525,
+ 4649, 65209, 983410, 0, 4648, 43080, 983399, 983400, 983397, 6246, 64950,
7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, 43187, 8669,
- 983407, 6821, 65093, 0, 78881, 2716, 0, 983060, 983411, 0, 68369, 120054,
+ 983408, 6821, 65093, 0, 78881, 2716, 0, 983060, 983412, 0, 68369, 120054,
11060, 8547, 2711, 42165, 78027, 78026, 7992, 0, 0, 4662, 78033, 78032,
9149, 9146, 599, 2081, 78031, 78030, 194962, 4656, 10130, 68450, 7811,
- 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, 983403,
+ 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, 983404,
0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, 3054,
- 194956, 9744, 78860, 7605, 4622, 119656, 983387, 94070, 983385, 983386,
- 983383, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883,
- 983378, 41732, 4616, 10518, 10423, 10359, 983372, 5958, 0, 983425, 4215,
- 9789, 917941, 4321, 4621, 983381, 41313, 522, 5368, 0, 65803, 0, 5366,
- 12201, 5372, 0, 983401, 0, 7720, 7390, 2696, 983392, 0, 4638, 983397,
+ 194956, 9744, 78860, 7605, 4622, 119656, 983388, 94070, 983386, 983387,
+ 983384, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883,
+ 983379, 41732, 4616, 10518, 10423, 10359, 983373, 5958, 0, 983426, 4215,
+ 9789, 917941, 4321, 4621, 983382, 41313, 522, 5368, 0, 65803, 0, 5366,
+ 12201, 5372, 0, 983402, 0, 7720, 7390, 2696, 983393, 0, 4638, 983398,
1790, 78242, 5965, 64363, 66569, 68646, 127833, 5376, 1835, 5335, 194966,
128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, 42094,
5331, 4634, 11928, 983594, 5338, 4637, 128170, 5971, 42414, 0, 1268,
65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758,
- 983366, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231,
- 74384, 983370, 68377, 6248, 983354, 983355, 983352, 42318, 92582, 5229,
+ 983367, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231,
+ 74384, 983371, 68377, 6248, 983355, 983356, 983353, 42318, 92582, 5229,
4757, 0, 0, 2728, 4752, 64563, 65235, 5234, 0, 128145, 0, 10713, 7166, 0,
2622, 7460, 127302, 0, 0, 8954, 74760, 65189, 2632, 42617, 10108, 1011,
5574, 1853, 2709, 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 42177,
- 5316, 0, 5314, 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 983412,
- 983863, 194907, 44003, 0, 983472, 983415, 120498, 127851, 195009, 983856,
- 74022, 983414, 64609, 68643, 120634, 983481, 5721, 983393, 5519, 8632,
- 66465, 11267, 73961, 92278, 5720, 983344, 1692, 4219, 4610, 8696, 4305,
- 0, 4609, 43478, 4614, 541, 983347, 5287, 5309, 5285, 68389, 5961, 4647,
- 56, 4216, 10577, 41381, 601, 4613, 983341, 983338, 77849, 4608, 64260,
+ 5316, 0, 5314, 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 983413,
+ 983863, 194907, 44003, 0, 983473, 983416, 120498, 127851, 195009, 983856,
+ 74022, 983415, 64609, 68643, 120634, 983482, 5721, 983394, 5519, 8632,
+ 66465, 11267, 73961, 92278, 5720, 983345, 1692, 4219, 4610, 8696, 4305,
+ 0, 4609, 43478, 4614, 541, 983348, 5287, 5309, 5285, 68389, 5961, 4647,
+ 56, 4216, 10577, 41381, 601, 4613, 983342, 983339, 77849, 4608, 64260,
41124, 5190, 67628, 0, 68145, 7086, 0, 67998, 67620, 0, 2734, 11074, 0,
67627, 43593, 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114,
119939, 0, 68180, 5501, 119952, 42508, 7442, 43665, 359, 41253, 68392,
6239, 119956, 41256, 0, 68134, 0, 74209, 917550, 9346, 69660, 41254,
128047, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724,
7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 983831, 4869, 120563, 0,
- 4223, 128201, 6650, 126509, 0, 983455, 127890, 4870, 120445, 68661, 6716,
+ 4223, 128201, 6650, 126509, 0, 983456, 127890, 4870, 120445, 68661, 6716,
78176, 68667, 68382, 68676, 127925, 10122, 4864, 66568, 4144, 7937, 0,
6245, 68652, 2732, 42734, 745, 0, 195097, 92195, 4777, 7821, 0, 68631,
- 42775, 0, 194954, 0, 3097, 0, 5966, 983478, 4778, 0, 10863, 0, 4781, 0,
+ 42775, 0, 194954, 0, 3097, 0, 5966, 983479, 4778, 0, 10863, 0, 4781, 0,
64407, 0, 128323, 8577, 128562, 68196, 43285, 10216, 4782, 0, 0, 120757,
68618, 12325, 43056, 8717, 0, 0, 4776, 73818, 11492, 8700, 0, 13176,
68363, 10426, 0, 917599, 10362, 194706, 1715, 4849, 8242, 9561, 73922,
@@ -19460,19 +19462,19 @@ static unsigned int code_hash[] = {
4854, 127918, 5164, 983861, 1350, 5124, 64420, 1993, 5362, 8471, 2708,
92471, 12445, 3785, 234, 3199, 0, 41268, 4848, 2530, 917909, 2068, 1964,
0, 73762, 10458, 0, 8576, 78543, 0, 2704, 4794, 0, 68211, 8322, 4797,
- 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, 983416, 303, 983101, 92622,
- 983417, 2437, 0, 4221, 4844, 92216, 0, 0, 0, 70042, 0, 43292, 0, 2441,
+ 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, 983417, 303, 983101, 92622,
+ 983418, 2437, 0, 4221, 4844, 92216, 0, 0, 0, 70042, 0, 43292, 0, 2441,
10739, 65090, 0, 119327, 126541, 2451, 2714, 119326, 0, 43379, 4937,
43376, 753, 5849, 10597, 43089, 11722, 9248, 92555, 42879, 11725, 0, 0,
2726, 3107, 73958, 4941, 64937, 119233, 9140, 1408, 5261, 4607, 0, 181,
- 983422, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257,
+ 983423, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257,
983601, 0, 4964, 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180,
64179, 9482, 4873, 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500,
0, 119024, 78028, 92408, 9830, 43642, 389, 10893, 7521, 127879, 4872,
5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0,
- 11494, 126492, 9563, 10865, 74570, 43279, 64186, 983431, 78714, 64191,
+ 11494, 126492, 9563, 10865, 74570, 43279, 64186, 983432, 78714, 64191,
64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, 78805,
- 41031, 78801, 11960, 6745, 3082, 983429, 78539, 73919, 10573, 41744,
+ 41031, 78801, 11960, 6745, 3082, 983430, 78539, 73919, 10573, 41744,
7079, 5856, 127043, 5163, 78809, 128162, 1817, 66724, 78538, 0, 10564,
7763, 13077, 41813, 4400, 41745, 64207, 10275, 8925, 10371, 10307, 41814,
4248, 0, 0, 4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, 126471,
@@ -19488,30 +19490,30 @@ static unsigned int code_hash[] = {
3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 983864,
42130, 0, 5151, 917829, 917823, 0, 93980, 0, 7620, 3800, 65122, 0, 0,
8355, 7854, 0, 954, 64927, 4185, 41045, 127141, 41438, 41439, 68666,
- 10711, 4593, 127745, 120584, 983400, 64774, 8053, 10532, 66727, 0, 0, 0,
+ 10711, 4593, 127745, 120584, 983401, 64774, 8053, 10532, 66727, 0, 0, 0,
64759, 6381, 5166, 9888, 127800, 5148, 42834, 0, 78205, 78206, 43787,
78204, 64131, 3119, 917814, 0, 3060, 64135, 9986, 0, 77876, 636, 11698,
- 0, 983443, 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431,
- 119960, 1477, 43289, 0, 74358, 8618, 983394, 9908, 983972, 0, 0, 3937,
- 12312, 0, 983395, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244,
- 92209, 71341, 3935, 120665, 983468, 0, 11950, 5392, 42248, 65129, 68656,
+ 0, 983444, 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431,
+ 119960, 1477, 43289, 0, 74358, 8618, 983395, 9908, 983972, 0, 0, 3937,
+ 12312, 0, 983396, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244,
+ 92209, 71341, 3935, 120665, 983469, 0, 11950, 5392, 42248, 65129, 68656,
5397, 0, 12046, 12599, 0, 128261, 5395, 0, 5393, 354, 68615, 119948,
78503, 0, 0, 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780, 0, 0, 128874,
0, 0, 43297, 983079, 4311, 4644, 8818, 0, 128186, 0, 7145, 3918, 66452,
3797, 1644, 92346, 9658, 4140, 11385, 65947, 6455, 9030, 813, 119945,
68131, 4146, 119957, 5360, 2466, 0, 67669, 119942, 6249, 42117, 92287,
- 128224, 0, 0, 74046, 43745, 4911, 988, 917807, 0, 983460, 43061, 7054,
+ 128224, 0, 0, 74046, 43745, 4911, 988, 917807, 0, 983461, 43061, 7054,
64147, 0, 64920, 68195, 6698, 118933, 92506, 0, 120006, 11981, 12202, 0,
11032, 67654, 6093, 11608, 975, 68662, 65843, 170, 0, 0, 4169, 0, 41859,
6058, 120401, 13203, 120657, 0, 0, 68657, 9818, 10178, 10324, 42106,
5898, 74540, 4738, 41856, 7062, 917865, 4737, 11779, 4742, 120564, 92391,
- 73736, 983356, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741,
- 42108, 983346, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620,
- 917916, 127331, 65549, 9496, 64598, 118866, 983358, 7876, 68132, 917872,
+ 73736, 983357, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741,
+ 42108, 983347, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620,
+ 917916, 127331, 65549, 9496, 64598, 118866, 983359, 7876, 68132, 917872,
3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0,
4171, 12008, 6251, 3923, 1490, 0, 119591, 126512, 40972, 5245, 0, 10114,
42001, 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849,
- 4825, 69240, 917852, 68655, 0, 983380, 0, 0, 68628, 983339, 9850, 118937,
+ 4825, 69240, 917852, 68655, 0, 983381, 0, 0, 68628, 983340, 9850, 118937,
367, 1472, 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261,
11023, 119559, 4830, 9134, 78666, 64126, 43011, 0, 126626, 64101, 0, 0,
4824, 10614, 119659, 0, 1888, 1960, 7861, 917856, 78524, 41836, 43012,
@@ -19520,7 +19522,7 @@ static unsigned int code_hash[] = {
64118, 126998, 12962, 0, 126580, 4017, 12827, 5241, 120392, 0, 41118,
3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844, 917564, 0, 11363,
12057, 11917, 1567, 74000, 4721, 126641, 66202, 8957, 4139, 0, 0, 0, 0,
- 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 983375, 4726, 0,
+ 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 983376, 4726, 0,
194892, 0, 128321, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, 0,
128294, 64212, 41020, 1382, 64209, 64216, 44002, 64214, 1656, 41831, 0,
0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 127328, 8552, 64113, 41845,
@@ -19537,11 +19539,11 @@ static unsigned int code_hash[] = {
4814, 0, 4810, 0, 0, 64928, 10543, 0, 3522, 71335, 414, 65404, 0, 195027,
6456, 73820, 0, 6691, 42193, 92225, 128171, 0, 74495, 0, 0, 0, 118820,
9751, 65407, 128085, 11770, 3919, 0, 0, 65061, 0, 0, 0, 12235, 0, 0,
- 127233, 64092, 983462, 64080, 0, 64090, 0, 69913, 10162, 10310, 0, 8454,
+ 127233, 64092, 983463, 64080, 0, 64090, 0, 69913, 10162, 10310, 0, 8454,
127888, 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732,
78116, 0, 983139, 0, 983074, 8896, 0, 375, 6976, 66582, 119005, 983865,
- 0, 983426, 119202, 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529,
- 119200, 119201, 119198, 119199, 69692, 983424, 69698, 13150, 64492, 0, 0,
+ 0, 983427, 119202, 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529,
+ 119200, 119201, 119198, 119199, 69692, 983425, 69698, 13150, 64492, 0, 0,
2291, 12902, 0, 42891, 66327, 74298, 917857, 10799, 69690, 2587, 66372,
0, 4193, 92250, 4241, 983057, 7998, 0, 0, 0, 126640, 2316, 118821, 0, 0,
0, 64297, 74799, 92442, 74140, 0, 5373, 0, 983877, 3762, 10015, 120672,
@@ -19550,13 +19552,13 @@ static unsigned int code_hash[] = {
280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478, 43310, 7231, 0,
11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 983743, 119237, 0, 128805,
4470, 11826, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, 127143, 0,
- 5377, 120585, 68143, 1688, 78245, 983348, 69685, 983747, 0, 0, 44020,
+ 5377, 120585, 68143, 1688, 78245, 983349, 69685, 983747, 0, 0, 44020,
6808, 41319, 1300, 10650, 41692, 64505, 2290, 0, 119624, 1465, 10850,
3943, 0, 41205, 41315, 118961, 0, 0, 5352, 0, 0, 8839, 41314, 7384, 7785,
41204, 127322, 41209, 69637, 92241, 43607, 0, 0, 5420, 3897, 10134, 0,
74417, 4018, 7150, 68127, 0, 0, 0, 0, 127526, 2561, 68621, 3542, 7148,
12076, 7951, 68152, 118857, 5303, 6276, 1706, 0, 78751, 7146, 0, 65150,
- 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 983427, 69641, 10753,
+ 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 983428, 69641, 10753,
10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028,
0, 0, 67996, 2020, 0, 4022, 128783, 0, 77923, 126593, 41691, 0, 0, 74329,
0, 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904,
@@ -19590,9 +19592,9 @@ static unsigned int code_hash[] = {
9425, 9426, 9427, 9428, 9429, 64758, 2362, 9655, 0, 2004, 9096, 9782,
128848, 9172, 128545, 19965, 0, 5955, 67666, 1108, 0, 74773, 0, 0, 64782,
3926, 92448, 65210, 8798, 0, 92165, 1392, 0, 0, 127364, 10606, 8065,
- 118805, 10353, 10417, 0, 0, 64524, 92418, 4019, 0, 983280, 43280, 8219,
+ 118805, 10353, 10417, 0, 0, 64524, 92418, 4019, 0, 983281, 43280, 8219,
68402, 1812, 119963, 983683, 0, 126488, 42410, 74448, 119132, 6054,
- 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 983253, 68678,
+ 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 983254, 68678,
0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, 3921, 0, 11775, 64760,
11766, 1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733, 36, 0,
5153, 41805, 0, 73735, 763, 41808, 64910, 983130, 2009, 0, 0, 127142,
@@ -19634,9 +19636,9 @@ static unsigned int code_hash[] = {
120130, 4267, 1631, 42206, 77983, 0, 195046, 65700, 66562, 0, 64645, 0,
0, 126588, 12586, 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 983788,
7793, 78275, 9328, 119104, 78393, 12604, 0, 6615, 2285, 92344, 3986,
- 44025, 0, 8912, 64555, 7409, 0, 983350, 9541, 78276, 0, 11275, 8540,
- 11498, 0, 983349, 41040, 2459, 0, 13060, 41041, 74413, 983138, 0, 0,
- 68427, 10450, 12551, 41043, 7020, 120353, 3765, 983342, 0, 1606, 120348,
+ 44025, 0, 8912, 64555, 7409, 0, 983351, 9541, 78276, 0, 11275, 8540,
+ 11498, 0, 983350, 41040, 2459, 0, 13060, 41041, 74413, 983138, 0, 0,
+ 68427, 10450, 12551, 41043, 7020, 120353, 3765, 983343, 0, 1606, 120348,
120351, 3093, 68436, 0, 983061, 119613, 0, 0, 4312, 74091, 120337,
120336, 11923, 4023, 120333, 5763, 94015, 4827, 10894, 12810, 64406,
118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 118837, 11973,
@@ -19646,11 +19648,11 @@ static unsigned int code_hash[] = {
7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 93996, 2376, 0, 119320,
0, 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0,
0, 0, 983084, 0, 0, 0, 74188, 71342, 983086, 983573, 120047, 128575, 0,
- 0, 120049, 0, 1847, 0, 10339, 983357, 42384, 0, 4227, 74158, 0, 92501,
- 43032, 0, 42365, 0, 12671, 11384, 0, 983457, 0, 64797, 983337, 5820,
- 983336, 120052, 120065, 0, 120064, 120650, 42137, 9893, 2754, 12664,
+ 0, 120049, 0, 1847, 0, 10339, 983358, 42384, 0, 4227, 74158, 0, 92501,
+ 43032, 0, 42365, 0, 12671, 11384, 0, 983458, 0, 64797, 983338, 5820,
+ 983337, 120052, 120065, 0, 120064, 120650, 42137, 9893, 2754, 12664,
120063, 0, 7377, 127867, 41799, 65530, 1711, 12984, 43039, 3114, 6255,
- 983332, 118938, 0, 10853, 926, 983361, 74184, 983360, 120055, 0, 43175,
+ 983333, 118938, 0, 10853, 926, 983362, 74184, 983361, 120055, 0, 43175,
0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, 119605, 520, 4200,
12699, 8331, 0, 3091, 41034, 127353, 983672, 8360, 0, 78044, 321, 4229,
64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195, 92386,
@@ -19664,7 +19666,7 @@ static unsigned int code_hash[] = {
78222, 1346, 0, 917631, 64573, 64897, 423, 1818, 65144, 0, 8272, 127812,
19911, 4218, 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 983893,
74359, 12626, 9106, 0, 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265,
- 41795, 64666, 126508, 43530, 2752, 0, 0, 983485, 59, 0, 983593, 0, 92371,
+ 41795, 64666, 126508, 43530, 2752, 0, 0, 983486, 59, 0, 983593, 0, 92371,
77873, 41810, 0, 7010, 0, 41809, 41495, 119364, 0, 42252, 42213, 8009,
3305, 43033, 511, 92700, 66255, 13127, 120067, 0, 74397, 120235, 917977,
65915, 1400, 41812, 10685, 194870, 2103, 10387, 4453, 43276, 917783,
@@ -19703,7 +19705,7 @@ static unsigned int code_hash[] = {
78719, 66573, 0, 78724, 78712, 11761, 194655, 0, 41094, 0, 0, 194893, 0,
92689, 6196, 6945, 93969, 194890, 128184, 120491, 11816, 194943, 5733,
2930, 0, 0, 41098, 0, 41093, 0, 66626, 588, 9760, 0, 194717, 1238, 200,
- 983205, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, 983697, 3394,
+ 983206, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, 983697, 3394,
194894, 120668, 0, 0, 127358, 66219, 127183, 43284, 194656, 7817, 1841,
11055, 120533, 194979, 194982, 1669, 10776, 194981, 7701, 194980, 0,
194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, 0, 65324, 914,
@@ -19732,7 +19734,7 @@ static unsigned int code_hash[] = {
68465, 13027, 42824, 120574, 1039, 7151, 10155, 5745, 188, 41858, 11592,
0, 74015, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, 2786, 0, 4856,
8051, 0, 119609, 71327, 9644, 0, 0, 0, 194916, 120732, 66710, 118834,
- 983351, 73906, 128680, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157,
+ 983352, 73906, 128680, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157,
194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, 10226, 65142,
128025, 3594, 42424, 194959, 40, 12657, 983656, 0, 386, 0, 8834, 0,
12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 65322, 4304,
@@ -19746,7 +19748,7 @@ static unsigned int code_hash[] = {
42507, 1962, 43305, 78476, 42505, 11660, 0, 2072, 92312, 6995, 74173,
5437, 74174, 10669, 8702, 7964, 92352, 0, 199, 194843, 4105, 194845,
194699, 194847, 194710, 119875, 13148, 7560, 78479, 9226, 78480, 195070,
- 6472, 65814, 73954, 0, 4724, 0, 0, 9191, 0, 64432, 983808, 983241,
+ 6472, 65814, 73954, 0, 4724, 0, 0, 9191, 0, 64432, 983808, 983242,
195024, 10196, 7886, 0, 6585, 0, 6680, 195042, 0, 195051, 6679, 74412,
92251, 194866, 74421, 11382, 983622, 983628, 127891, 127484, 194833,
194832, 6681, 127482, 12693, 194836, 42727, 78196, 128252, 78195, 65442,
@@ -19792,11 +19794,11 @@ static unsigned int code_hash[] = {
64032, 42735, 64038, 64037, 64036, 64035, 4291, 194928, 64015, 64014,
64681, 194930, 0, 78145, 0, 43090, 0, 3476, 8973, 64012, 42473, 64010,
64008, 64007, 2003, 7706, 64517, 78153, 2538, 64009, 204, 0, 4802, 4111,
- 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 983258, 0, 4767, 9343,
+ 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 983259, 0, 4767, 9343,
64049, 64048, 120034, 1133, 64053, 64052, 43453, 64050, 41340, 118975,
194835, 10005, 12329, 41333, 0, 8489, 1942, 0, 194834, 42520, 128249, 0,
0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025, 9167, 42151, 78244,
- 983226, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, 78252, 78248,
+ 983227, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, 78252, 78248,
77914, 78246, 78247, 0, 77915, 78766, 6788, 13094, 77920, 7532, 41414,
78520, 3179, 78518, 64769, 78514, 78517, 11461, 74454, 10751, 9051,
120720, 6708, 10535, 0, 68218, 55274, 2008, 64031, 64030, 294, 41874, 0,
@@ -19804,7 +19806,7 @@ static unsigned int code_hash[] = {
6343, 43247, 119888, 0, 119886, 119891, 119892, 119889, 11433, 119895,
119896, 0, 7801, 65578, 194839, 12915, 43968, 3297, 9699, 194955, 1135,
0, 0, 128525, 1995, 6722, 983916, 0, 2552, 41546, 60, 68394, 8649, 41549,
- 78496, 983319, 0, 6682, 0, 78679, 64710, 41547, 983621, 2013, 128291,
+ 78496, 983320, 0, 6682, 0, 78679, 64710, 41547, 983621, 2013, 128291,
78530, 78532, 78528, 78529, 12832, 78493, 8081, 8362, 3537, 119908, 9137,
7155, 8999, 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, 2002, 2000,
120175, 537, 0, 4179, 65119, 1998, 0, 1842, 0, 92674, 9628, 68446, 12081,
@@ -19819,7 +19821,7 @@ static unsigned int code_hash[] = {
#define code_poly 32771
static const unsigned int aliases_start = 0xf0000;
-static const unsigned int aliases_end = 0xf01c1;
+static const unsigned int aliases_end = 0xf01c2;
static const unsigned int name_aliases[] = {
0x0000,
0x0000,
@@ -19982,6 +19984,7 @@ static const unsigned int name_aliases[] = {
0x01A2,
0x01A3,
0x034F,
+ 0x0709,
0x0CDE,
0x0E9D,
0x0E9F,
diff --git a/Modules/zipimport.c b/Modules/zipimport.c
index 2feb2a8..603efd6 100644
--- a/Modules/zipimport.c
+++ b/Modules/zipimport.c
@@ -862,6 +862,7 @@ read_directory(PyObject *archive)
long l, count;
Py_ssize_t i;
char name[MAXPATHLEN + 5];
+ char dummy[8]; /* Buffer to read unused header values into */
PyObject *nameobj = NULL;
char *p, endof_central_dir[22];
Py_ssize_t arc_offset; /* Absolute offset to start of the zip-archive. */
@@ -905,17 +906,23 @@ read_directory(PyObject *archive)
/* Start of Central Directory */
count = 0;
+ if (fseek(fp, header_offset, 0) == -1)
+ goto file_error;
for (;;) {
PyObject *t;
int err;
- if (fseek(fp, header_offset, 0) == -1) /* Start of file header */
- goto fseek_error;
+ /* Start of file header */
l = PyMarshal_ReadLongFromFile(fp);
if (l != 0x02014B50)
break; /* Bad: Central Dir File Header */
- if (fseek(fp, header_offset + 8, 0) == -1)
- goto fseek_error;
+
+ /* On Windows, calling fseek to skip over the fields we don't use is
+ slower than reading the data into a dummy buffer because fseek flushes
+ stdio's internal buffers. See issue #8745. */
+ if (fread(dummy, 1, 4, fp) != 4) /* Skip unused fields, avoid fseek */
+ goto file_error;
+
flags = (unsigned short)PyMarshal_ReadShortFromFile(fp);
compress = PyMarshal_ReadShortFromFile(fp);
time = PyMarshal_ReadShortFromFile(fp);
@@ -924,11 +931,11 @@ read_directory(PyObject *archive)
data_size = PyMarshal_ReadLongFromFile(fp);
file_size = PyMarshal_ReadLongFromFile(fp);
name_size = PyMarshal_ReadShortFromFile(fp);
- header_size = 46 + name_size +
+ header_size = name_size +
PyMarshal_ReadShortFromFile(fp) +
PyMarshal_ReadShortFromFile(fp);
- if (fseek(fp, header_offset + 42, 0) == -1)
- goto fseek_error;
+ if (fread(dummy, 1, 8, fp) != 8) /* Skip unused fields, avoid fseek */
+ goto file_error;
file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset;
if (name_size > MAXPATHLEN)
name_size = MAXPATHLEN;
@@ -941,7 +948,9 @@ read_directory(PyObject *archive)
p++;
}
*p = 0; /* Add terminating null byte */
- header_offset += header_size;
+ for (; i < header_size; i++) /* Skip the rest of the header */
+ if(getc(fp) == EOF) /* Avoid fseek */
+ goto file_error;
bootstrap = 0;
if (flags & 0x0800)
@@ -988,7 +997,7 @@ read_directory(PyObject *archive)
PySys_FormatStderr("# zipimport: found %ld names in %R\n",
count, archive);
return files;
-fseek_error:
+file_error:
fclose(fp);
Py_XDECREF(files);
Py_XDECREF(nameobj);
@@ -1249,7 +1258,7 @@ normalize_line_endings(PyObject *source)
}
/* Given a string buffer containing Python source code, compile it
- return and return a code object as a new reference. */
+ and return a code object as a new reference. */
static PyObject *
compile_source(PyObject *pathname, PyObject *source)
{
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index e718795..169903e 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -132,10 +132,30 @@ newcompobject(PyTypeObject *type)
}
#ifdef WITH_THREAD
self->lock = PyThread_allocate_lock();
+ if (self->lock == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
+ return NULL;
+ }
#endif
return self;
}
+static void*
+PyZlib_Malloc(voidpf ctx, uInt items, uInt size)
+{
+ if (items > (size_t)PY_SSIZE_T_MAX / size)
+ return NULL;
+ /* PyMem_Malloc() cannot be used: the GIL is not held when
+ inflate() and deflate() are called */
+ return PyMem_RawMalloc(items * size);
+}
+
+static void
+PyZlib_Free(voidpf ctx, void *ptr)
+{
+ PyMem_RawFree(ptr);
+}
+
PyDoc_STRVAR(compress__doc__,
"compress(string[, level]) -- Returned compressed string.\n"
"\n"
@@ -161,11 +181,11 @@ PyZlib_compress(PyObject *self, PyObject *args)
goto error;
}
input = pinput.buf;
- length = pinput.len;
+ length = (unsigned int)pinput.len;
zst.avail_out = length + length/1000 + 12 + 1;
- output = (Byte*)malloc(zst.avail_out);
+ output = (Byte*)PyMem_Malloc(zst.avail_out);
if (output == NULL) {
PyErr_SetString(PyExc_MemoryError,
"Can't allocate memory to compress data");
@@ -175,8 +195,9 @@ PyZlib_compress(PyObject *self, PyObject *args)
/* Past the point of no return. From here on out, we need to make sure
we clean up mallocs & INCREFs. */
- zst.zalloc = (alloc_func)NULL;
- zst.zfree = (free_func)Z_NULL;
+ zst.opaque = NULL;
+ zst.zalloc = PyZlib_Malloc;
+ zst.zfree = PyZlib_Free;
zst.next_out = (Byte *)output;
zst.next_in = (Byte *)input;
zst.avail_in = length;
@@ -218,7 +239,7 @@ PyZlib_compress(PyObject *self, PyObject *args)
error:
PyBuffer_Release(&pinput);
- free(output);
+ PyMem_Free(output);
return ReturnVal;
}
@@ -251,7 +272,7 @@ PyZlib_decompress(PyObject *self, PyObject *args)
goto error;
}
input = pinput.buf;
- length = pinput.len;
+ length = (unsigned int)pinput.len;
if (r_strlen <= 0)
r_strlen = 1;
@@ -262,8 +283,9 @@ PyZlib_decompress(PyObject *self, PyObject *args)
if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen)))
goto error;
- zst.zalloc = (alloc_func)NULL;
- zst.zfree = (free_func)Z_NULL;
+ zst.opaque = NULL;
+ zst.zalloc = PyZlib_Malloc;
+ zst.zfree = PyZlib_Free;
zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
zst.next_in = (Byte *)input;
err = inflateInit2(&zst, wsize);
@@ -356,8 +378,9 @@ PyZlib_compressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
self = newcompobject(&Comptype);
if (self==NULL)
goto error;
- self->zst.zalloc = (alloc_func)NULL;
- self->zst.zfree = (free_func)Z_NULL;
+ self->zst.opaque = NULL;
+ self->zst.zalloc = PyZlib_Malloc;
+ self->zst.zfree = PyZlib_Free;
self->zst.next_in = NULL;
self->zst.avail_in = 0;
err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
@@ -420,8 +443,9 @@ PyZlib_decompressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
self = newcompobject(&Decomptype);
if (self == NULL)
return(NULL);
- self->zst.zalloc = (alloc_func)NULL;
- self->zst.zfree = (free_func)Z_NULL;
+ self->zst.opaque = NULL;
+ self->zst.zalloc = PyZlib_Malloc;
+ self->zst.zfree = PyZlib_Free;
self->zst.next_in = NULL;
self->zst.avail_in = 0;
if (zdict != NULL) {
@@ -525,8 +549,7 @@ PyZlib_objcompress(compobject *self, PyObject *args)
so extend the output buffer and try again */
while (err == Z_OK && self->zst.avail_out == 0) {
if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
- Py_DECREF(RetVal);
- RetVal = NULL;
+ Py_CLEAR(RetVal);
goto error;
}
self->zst.next_out =
@@ -550,8 +573,7 @@ PyZlib_objcompress(compobject *self, PyObject *args)
goto error;
}
if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
- Py_DECREF(RetVal);
- RetVal = NULL;
+ Py_CLEAR(RetVal);
}
error:
@@ -573,7 +595,7 @@ save_unconsumed_input(compobject *self, int err)
Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
Py_ssize_t new_size;
PyObject *new_data;
- if (self->zst.avail_in > PY_SSIZE_T_MAX - old_size) {
+ if ((Py_ssize_t)self->zst.avail_in > PY_SSIZE_T_MAX - old_size) {
PyErr_NoMemory();
return -1;
}
@@ -698,8 +720,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
length = max_length;
if (_PyBytes_Resize(&RetVal, length) < 0) {
- Py_DECREF(RetVal);
- RetVal = NULL;
+ Py_CLEAR(RetVal);
goto error;
}
self->zst.next_out =
@@ -733,8 +754,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
}
if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
- Py_DECREF(RetVal);
- RetVal = NULL;
+ Py_CLEAR(RetVal);
}
error:
@@ -787,8 +807,7 @@ PyZlib_flush(compobject *self, PyObject *args)
so extend the output buffer and try again */
while (err == Z_OK && self->zst.avail_out == 0) {
if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
- Py_DECREF(RetVal);
- RetVal = NULL;
+ Py_CLEAR(RetVal);
goto error;
}
self->zst.next_out =
@@ -827,8 +846,7 @@ PyZlib_flush(compobject *self, PyObject *args)
}
if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
- Py_DECREF(RetVal);
- RetVal = NULL;
+ Py_CLEAR(RetVal);
}
error:
@@ -988,8 +1006,7 @@ PyZlib_unflush(compobject *self, PyObject *args)
so extend the output buffer and try again */
while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
if (_PyBytes_Resize(&retval, length << 1) < 0) {
- Py_DECREF(retval);
- retval = NULL;
+ Py_CLEAR(retval);
goto error;
}
self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
@@ -1021,8 +1038,7 @@ PyZlib_unflush(compobject *self, PyObject *args)
}
if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
- Py_DECREF(retval);
- retval = NULL;
+ Py_CLEAR(retval);
}
error:
@@ -1094,10 +1110,10 @@ PyZlib_adler32(PyObject *self, PyObject *args)
buf += (size_t) UINT_MAX;
len -= (size_t) UINT_MAX;
}
- adler32val = adler32(adler32val, buf, len);
+ adler32val = adler32(adler32val, buf, (unsigned int)len);
Py_END_ALLOW_THREADS
} else {
- adler32val = adler32(adler32val, pbuf.buf, pbuf.len);
+ adler32val = adler32(adler32val, pbuf.buf, (unsigned int)pbuf.len);
}
PyBuffer_Release(&pbuf);
return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
@@ -1132,10 +1148,10 @@ PyZlib_crc32(PyObject *self, PyObject *args)
buf += (size_t) UINT_MAX;
len -= (size_t) UINT_MAX;
}
- signed_val = crc32(crc32val, buf, len);
+ signed_val = crc32(crc32val, buf, (unsigned int)len);
Py_END_ALLOW_THREADS
} else {
- signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
+ signed_val = crc32(crc32val, pbuf.buf, (unsigned int)pbuf.len);
}
PyBuffer_Release(&pbuf);
return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
@@ -1266,20 +1282,20 @@ PyInit_zlib(void)
Py_INCREF(ZlibError);
PyModule_AddObject(m, "error", ZlibError);
}
- PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
- PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
- PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
- PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
- PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
- PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
- PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
- PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
- PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
-
- PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
- PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
- PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
- PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
+ PyModule_AddIntMacro(m, MAX_WBITS);
+ PyModule_AddIntMacro(m, DEFLATED);
+ PyModule_AddIntMacro(m, DEF_MEM_LEVEL);
+ PyModule_AddIntMacro(m, Z_BEST_SPEED);
+ PyModule_AddIntMacro(m, Z_BEST_COMPRESSION);
+ PyModule_AddIntMacro(m, Z_DEFAULT_COMPRESSION);
+ PyModule_AddIntMacro(m, Z_FILTERED);
+ PyModule_AddIntMacro(m, Z_HUFFMAN_ONLY);
+ PyModule_AddIntMacro(m, Z_DEFAULT_STRATEGY);
+
+ PyModule_AddIntMacro(m, Z_FINISH);
+ PyModule_AddIntMacro(m, Z_NO_FLUSH);
+ PyModule_AddIntMacro(m, Z_SYNC_FLUSH);
+ PyModule_AddIntMacro(m, Z_FULL_FLUSH);
ver = PyUnicode_FromString(ZLIB_VERSION);
if (ver != NULL)
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 7f1808f..5f11c3d 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -64,49 +64,70 @@ PyObject_Length(PyObject *o)
}
#define PyObject_Length PyObject_Size
+int
+_PyObject_HasLen(PyObject *o) {
+ return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
+ (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
+}
/* The length hint function returns a non-negative value from o.__len__()
- or o.__length_hint__(). If those methods aren't found or return a negative
- value, then the defaultvalue is returned. If one of the calls fails,
+ or o.__length_hint__(). If those methods aren't found the defaultvalue is
+ returned. If one of the calls fails with an exception other than TypeError
this function returns -1.
*/
Py_ssize_t
-_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
+PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
{
+ PyObject *hint, *result;
+ Py_ssize_t res;
_Py_IDENTIFIER(__length_hint__);
- PyObject *ro, *hintmeth;
- Py_ssize_t rv;
-
- /* try o.__len__() */
- rv = PyObject_Size(o);
- if (rv >= 0)
- return rv;
- if (PyErr_Occurred()) {
- if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ res = PyObject_Length(o);
+ if (res < 0 && PyErr_Occurred()) {
+ if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
return -1;
+ }
PyErr_Clear();
}
-
- /* try o.__length_hint__() */
- hintmeth = _PyObject_LookupSpecial(o, &PyId___length_hint__);
- if (hintmeth == NULL) {
- if (PyErr_Occurred())
+ else {
+ return res;
+ }
+ hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
+ if (hint == NULL) {
+ if (PyErr_Occurred()) {
return -1;
- else
+ }
+ return defaultvalue;
+ }
+ result = PyObject_CallFunctionObjArgs(hint, NULL);
+ Py_DECREF(hint);
+ if (result == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
+ PyErr_Clear();
return defaultvalue;
+ }
+ return -1;
}
- ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
- Py_DECREF(hintmeth);
- if (ro == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_TypeError))
- return -1;
- PyErr_Clear();
+ else if (result == Py_NotImplemented) {
+ Py_DECREF(result);
return defaultvalue;
}
- rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
- Py_DECREF(ro);
- return rv;
+ if (!PyLong_Check(result)) {
+ PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
+ Py_TYPE(result)->tp_name);
+ Py_DECREF(result);
+ return -1;
+ }
+ res = PyLong_AsSsize_t(result);
+ Py_DECREF(result);
+ if (res < 0 && PyErr_Occurred()) {
+ return -1;
+ }
+ if (res < 0) {
+ PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
+ return -1;
+ }
+ return res;
}
PyObject *
@@ -1217,7 +1238,7 @@ PyNumber_AsSsize_t(PyObject *item, PyObject *err)
to be an int or have an __int__ method. Steals integral's
reference. error_format will be used to create the TypeError if integral
isn't actually an Integral instance. error_format should be a format string
- that can accept a char* naming integral's type.
+ that can accept a char* naming integral's type.
*/
static PyObject *
convert_integral_to_int(PyObject *integral, const char *error_format)
@@ -1236,7 +1257,7 @@ convert_integral_to_int(PyObject *integral, const char *error_format)
}
PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
Py_DECREF(integral);
- return NULL;
+ return NULL;
}
@@ -1670,7 +1691,7 @@ PySequence_Tuple(PyObject *v)
return NULL;
/* Guess result size and allocate space. */
- n = _PyObject_LengthHint(v, 10);
+ n = PyObject_LengthHint(v, 10);
if (n == -1)
goto Fail;
result = PyTuple_New(n);
@@ -2064,10 +2085,15 @@ PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
return NULL;
result = (*call)(func, arg, kw);
Py_LeaveRecursiveCall();
- if (result == NULL && !PyErr_Occurred())
+#ifdef NDEBUG
+ if (result == NULL && !PyErr_Occurred()) {
PyErr_SetString(
PyExc_SystemError,
"NULL result without error in PyObject_Call");
+ }
+#else
+ assert(result != NULL || PyErr_Occurred());
+#endif
return result;
}
PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
@@ -2102,7 +2128,7 @@ call_function_tail(PyObject *callable, PyObject *args)
}
PyObject *
-PyObject_CallFunction(PyObject *callable, char *format, ...)
+PyObject_CallFunction(PyObject *callable, const char *format, ...)
{
va_list va;
PyObject *args;
@@ -2122,7 +2148,7 @@ PyObject_CallFunction(PyObject *callable, char *format, ...)
}
PyObject *
-_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
+_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
{
va_list va;
PyObject *args;
@@ -2142,7 +2168,7 @@ _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
}
static PyObject*
-callmethod(PyObject* func, char *format, va_list va, int is_size_t)
+callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
{
PyObject *retval = NULL;
PyObject *args;
@@ -2171,7 +2197,7 @@ callmethod(PyObject* func, char *format, va_list va, int is_size_t)
}
PyObject *
-PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
+PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
{
va_list va;
PyObject *func = NULL;
@@ -2192,7 +2218,8 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
}
PyObject *
-_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name, char *format, ...)
+_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
+ const char *format, ...)
{
va_list va;
PyObject *func = NULL;
@@ -2213,7 +2240,8 @@ _PyObject_CallMethodId(PyObject *o, _Py_Identifier *name, char *format, ...)
}
PyObject *
-_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
+_PyObject_CallMethod_SizeT(PyObject *o, const char *name,
+ const char *format, ...)
{
va_list va;
PyObject *func = NULL;
@@ -2233,7 +2261,8 @@ _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
}
PyObject *
-_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name, char *format, ...)
+_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
+ const char *format, ...)
{
va_list va;
PyObject *func = NULL;
@@ -2303,7 +2332,7 @@ PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
}
PyObject *
-_PyObject_CallMethodObjIdArgs(PyObject *callable,
+_PyObject_CallMethodIdObjArgs(PyObject *callable,
struct _Py_Identifier *name, ...)
{
PyObject *args, *tmp;
@@ -2678,8 +2707,8 @@ PyIter_Next(PyObject *iter)
* NULL terminated string pointers with a NULL char* terminating the array.
* (ie: an argv or env list)
*
- * Memory allocated for the returned list is allocated using malloc() and MUST
- * be freed by the caller using a free() loop or _Py_FreeCharPArray().
+ * Memory allocated for the returned list is allocated using PyMem_Malloc()
+ * and MUST be freed by _Py_FreeCharPArray().
*/
char *const *
_PySequence_BytesToCharpArray(PyObject* self)
@@ -2687,6 +2716,7 @@ _PySequence_BytesToCharpArray(PyObject* self)
char **array;
Py_ssize_t i, argc;
PyObject *item = NULL;
+ Py_ssize_t size;
argc = PySequence_Size(self);
if (argc == -1)
@@ -2699,7 +2729,7 @@ _PySequence_BytesToCharpArray(PyObject* self)
return NULL;
}
- array = malloc((argc + 1) * sizeof(char *));
+ array = PyMem_Malloc((argc + 1) * sizeof(char *));
if (array == NULL) {
PyErr_NoMemory();
return NULL;
@@ -2718,11 +2748,13 @@ _PySequence_BytesToCharpArray(PyObject* self)
array[i] = NULL;
goto fail;
}
- array[i] = strdup(data);
+ size = PyBytes_GET_SIZE(item) + 1;
+ array[i] = PyMem_Malloc(size);
if (!array[i]) {
PyErr_NoMemory();
goto fail;
}
+ memcpy(array[i], data, size);
Py_DECREF(item);
}
array[argc] = NULL;
@@ -2742,7 +2774,7 @@ _Py_FreeCharPArray(char *const array[])
{
Py_ssize_t i;
for (i = 0; array[i] != NULL; ++i) {
- free(array[i]);
+ PyMem_Free(array[i]);
}
- free((void*)array);
+ PyMem_Free((void*)array);
}
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 60b2811..6ea654e 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -862,9 +862,9 @@ bytearray_repr(PyByteArrayObject *self)
/* 15 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
size_t newsize;
PyObject *v;
- register Py_ssize_t i;
- register char c;
- register char *p;
+ Py_ssize_t i;
+ char c;
+ char *p;
int quote;
char *test, *start;
char *buffer;
@@ -1038,6 +1038,7 @@ bytearray_dealloc(PyByteArrayObject *self)
#define FASTSEARCH fastsearch
#define STRINGLIB(F) stringlib_##F
#define STRINGLIB_CHAR char
+#define STRINGLIB_SIZEOF_CHAR 1
#define STRINGLIB_LEN PyByteArray_GET_SIZE
#define STRINGLIB_STR PyByteArray_AS_STRING
#define STRINGLIB_NEW PyByteArray_FromStringAndSize
@@ -1049,6 +1050,7 @@ bytearray_dealloc(PyByteArrayObject *self)
#include "stringlib/fastsearch.h"
#include "stringlib/count.h"
#include "stringlib/find.h"
+#include "stringlib/join.h"
#include "stringlib/partition.h"
#include "stringlib/split.h"
#include "stringlib/ctype.h"
@@ -1429,9 +1431,9 @@ table, which must be a bytes object of length 256.");
static PyObject *
bytearray_translate(PyByteArrayObject *self, PyObject *args)
{
- register char *input, *output;
- register const char *table;
- register Py_ssize_t i, c;
+ char *input, *output;
+ const char *table;
+ Py_ssize_t i, c;
PyObject *input_obj = (PyObject*)self;
const char *output_start;
Py_ssize_t inlen;
@@ -2291,7 +2293,7 @@ bytearray_extend(PyByteArrayObject *self, PyObject *arg)
return NULL;
/* Try to determine the length of the argument. 32 is arbitrary. */
- buf_size = _PyObject_LengthHint(arg, 32);
+ buf_size = PyObject_LengthHint(arg, 32);
if (buf_size == -1) {
Py_DECREF(it);
return NULL;
@@ -2578,73 +2580,9 @@ Concatenate any number of bytes/bytearray objects, with B\n\
in between each pair, and return the result as a new bytearray.");
static PyObject *
-bytearray_join(PyByteArrayObject *self, PyObject *it)
+bytearray_join(PyObject *self, PyObject *iterable)
{
- PyObject *seq;
- Py_ssize_t mysize = Py_SIZE(self);
- Py_ssize_t i;
- Py_ssize_t n;
- PyObject **items;
- Py_ssize_t totalsize = 0;
- PyObject *result;
- char *dest;
-
- seq = PySequence_Fast(it, "can only join an iterable");
- if (seq == NULL)
- return NULL;
- n = PySequence_Fast_GET_SIZE(seq);
- items = PySequence_Fast_ITEMS(seq);
-
- /* Compute the total size, and check that they are all bytes */
- /* XXX Shouldn't we use _getbuffer() on these items instead? */
- for (i = 0; i < n; i++) {
- PyObject *obj = items[i];
- if (!PyByteArray_Check(obj) && !PyBytes_Check(obj)) {
- PyErr_Format(PyExc_TypeError,
- "can only join an iterable of bytes "
- "(item %ld has type '%.100s')",
- /* XXX %ld isn't right on Win64 */
- (long)i, Py_TYPE(obj)->tp_name);
- goto error;
- }
- if (i > 0)
- totalsize += mysize;
- totalsize += Py_SIZE(obj);
- if (totalsize < 0) {
- PyErr_NoMemory();
- goto error;
- }
- }
-
- /* Allocate the result, and copy the bytes */
- result = PyByteArray_FromStringAndSize(NULL, totalsize);
- if (result == NULL)
- goto error;
- dest = PyByteArray_AS_STRING(result);
- for (i = 0; i < n; i++) {
- PyObject *obj = items[i];
- Py_ssize_t size = Py_SIZE(obj);
- char *buf;
- if (PyByteArray_Check(obj))
- buf = PyByteArray_AS_STRING(obj);
- else
- buf = PyBytes_AS_STRING(obj);
- if (i) {
- memcpy(dest, self->ob_bytes, mysize);
- dest += mysize;
- }
- memcpy(dest, buf, size);
- dest += size;
- }
-
- /* Done */
- Py_DECREF(seq);
- return result;
-
- /* Error handling */
- error:
- Py_DECREF(seq);
- return NULL;
+ return stringlib_bytes_join(self, iterable);
}
PyDoc_STRVAR(splitlines__doc__,
diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c
index ef3c2f7..4e8107b 100644
--- a/Objects/bytes_methods.c
+++ b/Objects/bytes_methods.c
@@ -10,9 +10,9 @@ and there is at least one character in B, False otherwise.");
PyObject*
_Py_bytes_isspace(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
/* Shortcut for single character strings */
if (len == 1 && Py_ISSPACE(*p))
@@ -40,9 +40,9 @@ and there is at least one character in B, False otherwise.");
PyObject*
_Py_bytes_isalpha(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
/* Shortcut for single character strings */
if (len == 1 && Py_ISALPHA(*p))
@@ -70,9 +70,9 @@ and there is at least one character in B, False otherwise.");
PyObject*
_Py_bytes_isalnum(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
/* Shortcut for single character strings */
if (len == 1 && Py_ISALNUM(*p))
@@ -100,9 +100,9 @@ and there is at least one character in B, False otherwise.");
PyObject*
_Py_bytes_isdigit(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
/* Shortcut for single character strings */
if (len == 1 && Py_ISDIGIT(*p))
@@ -130,9 +130,9 @@ at least one cased character in B, False otherwise.");
PyObject*
_Py_bytes_islower(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
int cased;
/* Shortcut for single character strings */
@@ -164,9 +164,9 @@ at least one cased character in B, False otherwise.");
PyObject*
_Py_bytes_isupper(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
int cased;
/* Shortcut for single character strings */
@@ -200,9 +200,9 @@ otherwise.");
PyObject*
_Py_bytes_istitle(const char *cptr, Py_ssize_t len)
{
- register const unsigned char *p
+ const unsigned char *p
= (unsigned char *) cptr;
- register const unsigned char *e;
+ const unsigned char *e;
int cased, previous_is_cased;
/* Shortcut for single character strings */
@@ -217,7 +217,7 @@ _Py_bytes_istitle(const char *cptr, Py_ssize_t len)
cased = 0;
previous_is_cased = 0;
for (; p < e; p++) {
- register const unsigned char ch = *p;
+ const unsigned char ch = *p;
if (Py_ISUPPER(ch)) {
if (previous_is_cased)
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 47898fe..3a2906c 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -10,9 +10,18 @@
static Py_ssize_t
_getbuffer(PyObject *obj, Py_buffer *view)
{
- PyBufferProcs *buffer = Py_TYPE(obj)->tp_as_buffer;
-
- if (buffer == NULL || buffer->bf_getbuffer == NULL)
+ PyBufferProcs *bufferprocs;
+ if (PyBytes_CheckExact(obj)) {
+ /* Fast path, e.g. for .join() of many bytes objects */
+ Py_INCREF(obj);
+ view->obj = obj;
+ view->buf = PyBytes_AS_STRING(obj);
+ view->len = PyBytes_GET_SIZE(obj);
+ return view->len;
+ }
+
+ bufferprocs = Py_TYPE(obj)->tp_as_buffer;
+ if (bufferprocs == NULL || bufferprocs->bf_getbuffer == NULL)
{
PyErr_Format(PyExc_TypeError,
"Type %.100s doesn't support the buffer API",
@@ -20,7 +29,7 @@ _getbuffer(PyObject *obj, Py_buffer *view)
return -1;
}
- if (buffer->bf_getbuffer(obj, view, PyBUF_SIMPLE) < 0)
+ if (bufferprocs->bf_getbuffer(obj, view, PyBUF_SIMPLE) < 0)
return -1;
return view->len;
}
@@ -65,7 +74,7 @@ static PyBytesObject *nullstring;
PyObject *
PyBytes_FromStringAndSize(const char *str, Py_ssize_t size)
{
- register PyBytesObject *op;
+ PyBytesObject *op;
if (size < 0) {
PyErr_SetString(PyExc_SystemError,
"Negative size passed to PyBytes_FromStringAndSize");
@@ -117,8 +126,8 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size)
PyObject *
PyBytes_FromString(const char *str)
{
- register size_t size;
- register PyBytesObject *op;
+ size_t size;
+ PyBytesObject *op;
assert(str != NULL);
size = strlen(str);
@@ -504,7 +513,7 @@ PyObject *PyBytes_DecodeEscape(const char *s,
/* object api */
Py_ssize_t
-PyBytes_Size(register PyObject *op)
+PyBytes_Size(PyObject *op)
{
if (!PyBytes_Check(op)) {
PyErr_Format(PyExc_TypeError,
@@ -515,7 +524,7 @@ PyBytes_Size(register PyObject *op)
}
char *
-PyBytes_AsString(register PyObject *op)
+PyBytes_AsString(PyObject *op)
{
if (!PyBytes_Check(op)) {
PyErr_Format(PyExc_TypeError,
@@ -526,9 +535,9 @@ PyBytes_AsString(register PyObject *op)
}
int
-PyBytes_AsStringAndSize(register PyObject *obj,
- register char **s,
- register Py_ssize_t *len)
+PyBytes_AsStringAndSize(PyObject *obj,
+ char **s,
+ Py_ssize_t *len)
{
if (s == NULL) {
PyErr_BadInternalCall();
@@ -560,6 +569,7 @@ PyBytes_AsStringAndSize(register PyObject *obj,
#include "stringlib/fastsearch.h"
#include "stringlib/count.h"
#include "stringlib/find.h"
+#include "stringlib/join.h"
#include "stringlib/partition.h"
#include "stringlib/split.h"
#include "stringlib/ctype.h"
@@ -569,7 +579,7 @@ PyBytes_AsStringAndSize(register PyObject *obj,
PyObject *
PyBytes_Repr(PyObject *obj, int smartquotes)
{
- register PyBytesObject* op = (PyBytesObject*) obj;
+ PyBytesObject* op = (PyBytesObject*) obj;
Py_ssize_t i, length = Py_SIZE(op);
size_t newsize, squotes, dquotes;
PyObject *v;
@@ -708,12 +718,12 @@ bytes_concat(PyObject *a, PyObject *b)
}
static PyObject *
-bytes_repeat(register PyBytesObject *a, register Py_ssize_t n)
+bytes_repeat(PyBytesObject *a, Py_ssize_t n)
{
- register Py_ssize_t i;
- register Py_ssize_t j;
- register Py_ssize_t size;
- register PyBytesObject *op;
+ Py_ssize_t i;
+ Py_ssize_t j;
+ Py_ssize_t size;
+ PyBytesObject *op;
size_t nbytes;
if (n < 0)
n = 0;
@@ -783,7 +793,7 @@ bytes_contains(PyObject *self, PyObject *arg)
}
static PyObject *
-bytes_item(PyBytesObject *a, register Py_ssize_t i)
+bytes_item(PyBytesObject *a, Py_ssize_t i)
{
if (i < 0 || i >= Py_SIZE(a)) {
PyErr_SetString(PyExc_IndexError, "index out of range");
@@ -1112,94 +1122,9 @@ Concatenate any number of bytes objects, with B in between each pair.\n\
Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'.");
static PyObject *
-bytes_join(PyObject *self, PyObject *orig)
-{
- char *sep = PyBytes_AS_STRING(self);
- const Py_ssize_t seplen = PyBytes_GET_SIZE(self);
- PyObject *res = NULL;
- char *p;
- Py_ssize_t seqlen = 0;
- size_t sz = 0;
- Py_ssize_t i;
- PyObject *seq, *item;
-
- seq = PySequence_Fast(orig, "");
- if (seq == NULL) {
- return NULL;
- }
-
- seqlen = PySequence_Size(seq);
- if (seqlen == 0) {
- Py_DECREF(seq);
- return PyBytes_FromString("");
- }
- if (seqlen == 1) {
- item = PySequence_Fast_GET_ITEM(seq, 0);
- if (PyBytes_CheckExact(item)) {
- Py_INCREF(item);
- Py_DECREF(seq);
- return item;
- }
- }
-
- /* There are at least two things to join, or else we have a subclass
- * of the builtin types in the sequence.
- * Do a pre-pass to figure out the total amount of space we'll
- * need (sz), and see whether all argument are bytes.
- */
- /* XXX Shouldn't we use _getbuffer() on these items instead? */
- for (i = 0; i < seqlen; i++) {
- const size_t old_sz = sz;
- item = PySequence_Fast_GET_ITEM(seq, i);
- if (!PyBytes_Check(item) && !PyByteArray_Check(item)) {
- PyErr_Format(PyExc_TypeError,
- "sequence item %zd: expected bytes,"
- " %.80s found",
- i, Py_TYPE(item)->tp_name);
- Py_DECREF(seq);
- return NULL;
- }
- sz += Py_SIZE(item);
- if (i != 0)
- sz += seplen;
- if (sz < old_sz || sz > PY_SSIZE_T_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "join() result is too long for bytes");
- Py_DECREF(seq);
- return NULL;
- }
- }
-
- /* Allocate result space. */
- res = PyBytes_FromStringAndSize((char*)NULL, sz);
- if (res == NULL) {
- Py_DECREF(seq);
- return NULL;
- }
-
- /* Catenate everything. */
- /* I'm not worried about a PyByteArray item growing because there's
- nowhere in this function where we release the GIL. */
- p = PyBytes_AS_STRING(res);
- for (i = 0; i < seqlen; ++i) {
- size_t n;
- char *q;
- if (i) {
- Py_MEMCPY(p, sep, seplen);
- p += seplen;
- }
- item = PySequence_Fast_GET_ITEM(seq, i);
- n = Py_SIZE(item);
- if (PyBytes_Check(item))
- q = PyBytes_AS_STRING(item);
- else
- q = PyByteArray_AS_STRING(item);
- Py_MEMCPY(p, q, n);
- p += n;
- }
-
- Py_DECREF(seq);
- return res;
+bytes_join(PyObject *self, PyObject *iterable)
+{
+ return stringlib_bytes_join(self, iterable);
}
PyObject *
@@ -1536,9 +1461,9 @@ table, which must be a bytes object of length 256.");
static PyObject *
bytes_translate(PyBytesObject *self, PyObject *args)
{
- register char *input, *output;
+ char *input, *output;
const char *table;
- register Py_ssize_t i, c, changed = 0;
+ Py_ssize_t i, c, changed = 0;
PyObject *input_obj = (PyObject*)self;
const char *output_start, *del_table=NULL;
Py_ssize_t inlen, tablen, dellen = 0;
@@ -2316,8 +2241,6 @@ bytes_decode(PyObject *self, PyObject *args, PyObject *kwargs)
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode", kwlist, &encoding, &errors))
return NULL;
- if (encoding == NULL)
- encoding = PyUnicode_GetDefaultEncoding();
return PyUnicode_FromEncodedObject(self, encoding, errors);
}
@@ -2679,7 +2602,7 @@ PyBytes_FromObject(PyObject *x)
}
/* For iterator version, create a string object and resize as needed */
- size = _PyObject_LengthHint(x, 64);
+ size = PyObject_LengthHint(x, 64);
if (size == -1 && PyErr_Occurred())
return NULL;
/* Allocate an extra byte to prevent PyBytes_FromStringAndSize() from
@@ -2825,9 +2748,9 @@ PyTypeObject PyBytes_Type = {
};
void
-PyBytes_Concat(register PyObject **pv, register PyObject *w)
+PyBytes_Concat(PyObject **pv, PyObject *w)
{
- register PyObject *v;
+ PyObject *v;
assert(pv != NULL);
if (*pv == NULL)
return;
@@ -2841,7 +2764,7 @@ PyBytes_Concat(register PyObject **pv, register PyObject *w)
}
void
-PyBytes_ConcatAndDel(register PyObject **pv, register PyObject *w)
+PyBytes_ConcatAndDel(PyObject **pv, PyObject *w)
{
PyBytes_Concat(pv, w);
Py_XDECREF(w);
@@ -2865,8 +2788,8 @@ PyBytes_ConcatAndDel(register PyObject **pv, register PyObject *w)
int
_PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
{
- register PyObject *v;
- register PyBytesObject *sv;
+ PyObject *v;
+ PyBytesObject *sv;
v = *pv;
if (!PyBytes_Check(v) || Py_REFCNT(v) != 1 || newsize < 0) {
*pv = 0;
diff --git a/Objects/classobject.c b/Objects/classobject.c
index cdc9b1c..27f7ef4 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -44,7 +44,7 @@ PyMethod_Self(PyObject *im)
PyObject *
PyMethod_New(PyObject *func, PyObject *self)
{
- register PyMethodObject *im;
+ PyMethodObject *im;
if (self == NULL) {
PyErr_BadInternalCall();
return NULL;
@@ -164,7 +164,7 @@ method_new(PyTypeObject* type, PyObject* args, PyObject *kw)
}
static void
-method_dealloc(register PyMethodObject *im)
+method_dealloc(PyMethodObject *im)
{
_PyObject_GC_UNTRACK(im);
if (im->im_weakreflist != NULL)
@@ -509,7 +509,7 @@ instancemethod_call(PyObject *self, PyObject *arg, PyObject *kw)
static PyObject *
instancemethod_descr_get(PyObject *descr, PyObject *obj, PyObject *type) {
- register PyObject *func = PyInstanceMethod_GET_FUNCTION(descr);
+ PyObject *func = PyInstanceMethod_GET_FUNCTION(descr);
if (obj == NULL) {
Py_INCREF(func);
return func;
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 403c60c..5747450 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -211,7 +211,7 @@ complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
PyObject *
PyComplex_FromCComplex(Py_complex cval)
{
- register PyComplexObject *op;
+ PyComplexObject *op;
/* Inline PyObject_New */
op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
@@ -271,6 +271,12 @@ try_complex_special_method(PyObject *op) {
if (f) {
PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
Py_DECREF(f);
+ if (res != NULL && !PyComplex_Check(res)) {
+ PyErr_SetString(PyExc_TypeError,
+ "__complex__ should return a complex object");
+ Py_DECREF(res);
+ return NULL;
+ }
return res;
}
return NULL;
@@ -296,12 +302,6 @@ PyComplex_AsCComplex(PyObject *op)
newop = try_complex_special_method(op);
if (newop) {
- if (!PyComplex_Check(newop)) {
- PyErr_SetString(PyExc_TypeError,
- "__complex__ should return a complex object");
- Py_DECREF(newop);
- return cv;
- }
cv = ((PyComplexObject *)newop)->cval;
Py_DECREF(newop);
return cv;
@@ -705,7 +705,7 @@ complex__format__(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
- _PyUnicodeWriter_Init(&writer, 0);
+ _PyUnicodeWriter_Init(&writer);
ret = _PyComplex_FormatAdvancedWriter(
&writer,
self,
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index abcc002..d4f8048 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -115,7 +115,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
((PyTypeObject *)type)->tp_name);
return NULL;
}
- return PyCFunction_New(descr->d_method, type);
+ return PyCFunction_NewEx(descr->d_method, type, NULL);
}
static PyObject *
@@ -125,7 +125,7 @@ method_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
if (descr_check((PyDescrObject *)descr, obj, &res))
return res;
- return PyCFunction_New(descr->d_method, obj);
+ return PyCFunction_NewEx(descr->d_method, obj, NULL);
}
static PyObject *
@@ -239,7 +239,7 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds)
return NULL;
}
- func = PyCFunction_New(descr->d_method, self);
+ func = PyCFunction_NewEx(descr->d_method, self, NULL);
if (func == NULL)
return NULL;
args = PyTuple_GetSlice(args, 1, argc);
@@ -292,7 +292,7 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args,
return NULL;
}
- func = PyCFunction_New(descr->d_method, self);
+ func = PyCFunction_NewEx(descr->d_method, self, NULL);
if (func == NULL)
return NULL;
args = PyTuple_GetSlice(args, 1, argc);
@@ -1009,7 +1009,7 @@ wrapper_dealloc(wrapperobject *wp)
static PyObject *
wrapper_richcompare(PyObject *a, PyObject *b, int op)
{
- int result;
+ Py_intptr_t result;
PyObject *v;
PyWrapperDescrObject *a_descr, *b_descr;
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 7aa5ea8..b5cbfb1 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -305,9 +305,9 @@ PyDict_Fini(void)
* #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
*/
-/* GROWTH_RATE. Growth rate upon hitting maximum load.
- * Currently set to used*2 + capacity/2.
- * This means that dicts double in size when growing without deletions,
+/* GROWTH_RATE. Growth rate upon hitting maximum load.
+ * Currently set to used*2 + capacity/2.
+ * This means that dicts double in size when growing without deletions,
* but have more head room when the number of deletions is on a par with the
* number of insertions.
* Raising this to used*4 doubles memory consumption depending on the size of
@@ -389,6 +389,7 @@ static PyObject *
new_dict(PyDictKeysObject *keys, PyObject **values)
{
PyDictObject *mp;
+ assert(keys != NULL);
if (numfree) {
mp = free_list[--numfree];
assert (mp != NULL);
@@ -431,7 +432,10 @@ new_dict_with_shared_keys(PyDictKeysObject *keys)
PyObject *
PyDict_New(void)
{
- return new_dict(new_keys_object(PyDict_MINSIZE_COMBINED), NULL);
+ PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_COMBINED);
+ if (keys == NULL)
+ return NULL;
+ return new_dict(keys, NULL);
}
/*
@@ -463,13 +467,13 @@ static PyDictKeyEntry *
lookdict(PyDictObject *mp, PyObject *key,
Py_hash_t hash, PyObject ***value_addr)
{
- register size_t i;
- register size_t perturb;
- register PyDictKeyEntry *freeslot;
- register size_t mask;
+ size_t i;
+ size_t perturb;
+ PyDictKeyEntry *freeslot;
+ size_t mask;
PyDictKeyEntry *ep0;
- register PyDictKeyEntry *ep;
- register int cmp;
+ PyDictKeyEntry *ep;
+ int cmp;
PyObject *startkey;
top:
@@ -555,12 +559,12 @@ static PyDictKeyEntry *
lookdict_unicode(PyDictObject *mp, PyObject *key,
Py_hash_t hash, PyObject ***value_addr)
{
- register size_t i;
- register size_t perturb;
- register PyDictKeyEntry *freeslot;
- register size_t mask = DK_MASK(mp->ma_keys);
+ size_t i;
+ size_t perturb;
+ PyDictKeyEntry *freeslot;
+ size_t mask = DK_MASK(mp->ma_keys);
PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
- register PyDictKeyEntry *ep;
+ PyDictKeyEntry *ep;
/* Make sure this function doesn't have to handle non-unicode keys,
including subclasses of str; e.g., one reason to subclass
@@ -620,11 +624,11 @@ static PyDictKeyEntry *
lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
Py_hash_t hash, PyObject ***value_addr)
{
- register size_t i;
- register size_t perturb;
- register size_t mask = DK_MASK(mp->ma_keys);
+ size_t i;
+ size_t perturb;
+ size_t mask = DK_MASK(mp->ma_keys);
PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
- register PyDictKeyEntry *ep;
+ PyDictKeyEntry *ep;
/* Make sure this function doesn't have to handle non-unicode keys,
including subclasses of str; e.g., one reason to subclass
@@ -665,11 +669,11 @@ static PyDictKeyEntry *
lookdict_split(PyDictObject *mp, PyObject *key,
Py_hash_t hash, PyObject ***value_addr)
{
- register size_t i;
- register size_t perturb;
- register size_t mask = DK_MASK(mp->ma_keys);
+ size_t i;
+ size_t perturb;
+ size_t mask = DK_MASK(mp->ma_keys);
PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
- register PyDictKeyEntry *ep;
+ PyDictKeyEntry *ep;
if (!PyUnicode_CheckExact(key)) {
ep = lookdict(mp, key, hash, value_addr);
@@ -1391,7 +1395,7 @@ dict_dealloc(PyDictObject *mp)
}
DK_DECREF(keys);
}
- else {
+ else if (keys != NULL) {
assert(keys->dk_refcnt == 1);
DK_DECREF(keys);
}
@@ -1439,6 +1443,9 @@ dict_repr(PyDictObject *mp)
Py_INCREF(value);
s = PyObject_Repr(key);
PyUnicode_Append(&s, colon);
+ if (s == NULL)
+ goto Done;
+
PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
Py_DECREF(key);
Py_DECREF(value);
@@ -1491,7 +1498,7 @@ dict_length(PyDictObject *mp)
}
static PyObject *
-dict_subscript(PyDictObject *mp, register PyObject *key)
+dict_subscript(PyDictObject *mp, PyObject *key)
{
PyObject *v;
Py_hash_t hash;
@@ -1547,10 +1554,10 @@ static PyMappingMethods dict_as_mapping = {
};
static PyObject *
-dict_keys(register PyDictObject *mp)
+dict_keys(PyDictObject *mp)
{
- register PyObject *v;
- register Py_ssize_t i, j;
+ PyObject *v;
+ Py_ssize_t i, j;
PyDictKeyEntry *ep;
Py_ssize_t size, n, offset;
PyObject **value_ptr;
@@ -1591,10 +1598,10 @@ dict_keys(register PyDictObject *mp)
}
static PyObject *
-dict_values(register PyDictObject *mp)
+dict_values(PyDictObject *mp)
{
- register PyObject *v;
- register Py_ssize_t i, j;
+ PyObject *v;
+ Py_ssize_t i, j;
Py_ssize_t size, n, offset;
PyObject **value_ptr;
@@ -1633,10 +1640,10 @@ dict_values(register PyDictObject *mp)
}
static PyObject *
-dict_items(register PyDictObject *mp)
+dict_items(PyDictObject *mp)
{
- register PyObject *v;
- register Py_ssize_t i, j, n;
+ PyObject *v;
+ Py_ssize_t i, j, n;
Py_ssize_t size, offset;
PyObject *item, *key;
PyDictKeyEntry *ep;
@@ -1908,8 +1915,8 @@ PyDict_Update(PyObject *a, PyObject *b)
int
PyDict_Merge(PyObject *a, PyObject *b, int override)
{
- register PyDictObject *mp, *other;
- register Py_ssize_t i, n;
+ PyDictObject *mp, *other;
+ Py_ssize_t i, n;
PyDictKeyEntry *entry;
/* We accept for the argument either a concrete dictionary object,
@@ -2006,7 +2013,7 @@ PyDict_Merge(PyObject *a, PyObject *b, int override)
}
static PyObject *
-dict_copy(register PyDictObject *mp)
+dict_copy(PyDictObject *mp)
{
return PyDict_Copy((PyObject*)mp);
}
@@ -2118,13 +2125,18 @@ dict_equal(PyDictObject *a, PyDictObject *b)
if (aval != NULL) {
int cmp;
PyObject *bval;
+ PyObject **vaddr;
PyObject *key = ep->me_key;
/* temporarily bump aval's refcount to ensure it stays
alive until we're done with it */
Py_INCREF(aval);
/* ditto for key */
Py_INCREF(key);
- bval = PyDict_GetItemWithError((PyObject *)b, key);
+ /* reuse the known hash value */
+ if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
+ bval = NULL;
+ else
+ bval = *vaddr;
Py_DECREF(key);
if (bval == NULL) {
Py_DECREF(aval);
@@ -2163,7 +2175,7 @@ dict_richcompare(PyObject *v, PyObject *w, int op)
}
static PyObject *
-dict_contains(register PyDictObject *mp, PyObject *key)
+dict_contains(PyDictObject *mp, PyObject *key)
{
Py_hash_t hash;
PyDictKeyEntry *ep;
@@ -2182,7 +2194,7 @@ dict_contains(register PyDictObject *mp, PyObject *key)
}
static PyObject *
-dict_get(register PyDictObject *mp, PyObject *args)
+dict_get(PyDictObject *mp, PyObject *args)
{
PyObject *key;
PyObject *failobj = Py_None;
@@ -2210,19 +2222,19 @@ dict_get(register PyDictObject *mp, PyObject *args)
return val;
}
-static PyObject *
-dict_setdefault(register PyDictObject *mp, PyObject *args)
+PyObject *
+PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
{
- PyObject *key;
- PyObject *failobj = Py_None;
+ PyDictObject *mp = (PyDictObject *)d;
PyObject *val = NULL;
Py_hash_t hash;
PyDictKeyEntry *ep;
PyObject **value_addr;
- if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
+ if (!PyDict_Check(d)) {
+ PyErr_BadInternalCall();
return NULL;
-
+ }
if (!PyUnicode_CheckExact(key) ||
(hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
@@ -2240,23 +2252,35 @@ dict_setdefault(register PyDictObject *mp, PyObject *args)
return NULL;
ep = find_empty_slot(mp, key, hash, &value_addr);
}
- Py_INCREF(failobj);
+ Py_INCREF(defaultobj);
Py_INCREF(key);
- MAINTAIN_TRACKING(mp, key, failobj);
+ MAINTAIN_TRACKING(mp, key, defaultobj);
ep->me_key = key;
ep->me_hash = hash;
- *value_addr = failobj;
- val = failobj;
+ *value_addr = defaultobj;
+ val = defaultobj;
mp->ma_keys->dk_usable--;
mp->ma_used++;
}
- Py_INCREF(val);
return val;
}
+static PyObject *
+dict_setdefault(PyDictObject *mp, PyObject *args)
+{
+ PyObject *key, *val;
+ PyObject *defaultobj = Py_None;
+
+ if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &defaultobj))
+ return NULL;
+
+ val = PyDict_SetDefault((PyObject *)mp, key, defaultobj);
+ Py_XINCREF(val);
+ return val;
+}
static PyObject *
-dict_clear(register PyDictObject *mp)
+dict_clear(PyDictObject *mp)
{
PyDict_Clear((PyObject *)mp);
Py_RETURN_NONE;
@@ -2460,10 +2484,10 @@ PyDoc_STRVAR(popitem__doc__,
2-tuple; but raise KeyError if D is empty.");
PyDoc_STRVAR(update__doc__,
-"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n"
-"If E present and has a .keys() method, does: for k in E: D[k] = E[k]\n\
-If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v\n\
-In either case, this is followed by: for k in F: D[k] = F[k]");
+"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
+If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
+If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
+In either case, this is followed by: for k in F: D[k] = F[k]");
PyDoc_STRVAR(fromkeys__doc__,
"dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
@@ -2568,22 +2592,23 @@ static PyObject *
dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *self;
+ PyDictObject *d;
assert(type != NULL && type->tp_alloc != NULL);
self = type->tp_alloc(type, 0);
- if (self != NULL) {
- PyDictObject *d = (PyDictObject *)self;
- d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
- /* XXX - Should we raise a no-memory error? */
- if (d->ma_keys == NULL) {
- DK_INCREF(Py_EMPTY_KEYS);
- d->ma_keys = Py_EMPTY_KEYS;
- d->ma_values = empty_values;
- }
- d->ma_used = 0;
- /* The object has been implicitly tracked by tp_alloc */
- if (type == &PyDict_Type)
- _PyObject_GC_UNTRACK(d);
+ if (self == NULL)
+ return NULL;
+ d = (PyDictObject *)self;
+
+ /* The object has been implicitly tracked by tp_alloc */
+ if (type == &PyDict_Type)
+ _PyObject_GC_UNTRACK(d);
+
+ d->ma_used = 0;
+ d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
+ if (d->ma_keys == NULL) {
+ Py_DECREF(self);
+ return NULL;
}
return self;
}
@@ -2659,8 +2684,10 @@ _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
{
PyObject *kv;
kv = _PyUnicode_FromId(key); /* borrowed */
- if (kv == NULL)
+ if (kv == NULL) {
+ PyErr_Clear();
return NULL;
+ }
return PyDict_GetItem(dp, kv);
}
@@ -2671,8 +2698,10 @@ PyDict_GetItemString(PyObject *v, const char *key)
{
PyObject *kv, *rv;
kv = PyUnicode_FromString(key);
- if (kv == NULL)
+ if (kv == NULL) {
+ PyErr_Clear();
return NULL;
+ }
rv = PyDict_GetItem(v, kv);
Py_DECREF(kv);
return rv;
@@ -2795,8 +2824,8 @@ static PyMethodDef dictiter_methods[] = {
static PyObject *dictiter_iternextkey(dictiterobject *di)
{
PyObject *key;
- register Py_ssize_t i, mask, offset;
- register PyDictKeysObject *k;
+ Py_ssize_t i, mask, offset;
+ PyDictKeysObject *k;
PyDictObject *d = di->di_dict;
PyObject **value_ptr;
@@ -2878,7 +2907,7 @@ PyTypeObject PyDictIterKey_Type = {
static PyObject *dictiter_iternextvalue(dictiterobject *di)
{
PyObject *value;
- register Py_ssize_t i, mask, offset;
+ Py_ssize_t i, mask, offset;
PyDictObject *d = di->di_dict;
PyObject **value_ptr;
@@ -2959,7 +2988,7 @@ PyTypeObject PyDictIterValue_Type = {
static PyObject *dictiter_iternextitem(dictiterobject *di)
{
PyObject *key, *value, *result = di->di_result;
- register Py_ssize_t i, mask, offset;
+ Py_ssize_t i, mask, offset;
PyDictObject *d = di->di_dict;
PyObject **value_ptr;
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index 6b04700..79bbb8f 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -2327,7 +2327,7 @@ PyObject *PyExc_RecursionErrorInst = NULL;
}
#ifdef MS_WINDOWS
-#include <Winsock2.h>
+#include <winsock2.h>
/* The following constants were added to errno.h in VS2010 but have
preferred WSA equivalents. */
#undef EADDRINUSE
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 3a31314..e0c5bfe 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -390,7 +390,7 @@ stdprinter_write(PyStdPrinter_Object *self, PyObject *args)
Py_BEGIN_ALLOW_THREADS
errno = 0;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#ifdef MS_WINDOWS
if (n > INT_MAX)
n = INT_MAX;
n = write(self->fd, c, (int)n);
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index b571ca8..fea83fa 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -9,11 +9,6 @@
#include <ctype.h>
#include <float.h>
-#undef MAX
-#undef MIN
-#define MAX(x, y) ((x) < (y) ? (y) : (x))
-#define MIN(x, y) ((x) < (y) ? (x) : (y))
-
/* Special free list
free_list is a singly-linked list of available PyFloatObjects, linked
@@ -114,7 +109,7 @@ PyFloat_GetInfo(void)
PyObject *
PyFloat_FromDouble(double fval)
{
- register PyFloatObject *op = free_list;
+ PyFloatObject *op = free_list;
if (op != NULL) {
free_list = (PyFloatObject *) Py_TYPE(op);
numfree--;
@@ -246,7 +241,7 @@ PyFloat_AsDouble(PyObject *op)
static int
convert_to_double(PyObject **v, double *dbl)
{
- register PyObject *obj = *v;
+ PyObject *obj = *v;
if (PyLong_Check(obj)) {
*dbl = PyLong_AsDouble(obj);
@@ -1131,7 +1126,7 @@ float_hex(PyObject *v)
}
m = frexp(fabs(x), &e);
- shift = 1 - MAX(DBL_MIN_EXP - e, 0);
+ shift = 1 - Py_MAX(DBL_MIN_EXP - e, 0);
m = ldexp(m, shift);
e -= shift;
@@ -1285,8 +1280,8 @@ float_fromhex(PyObject *cls, PyObject *arg)
fdigits = coeff_end - s_store;
if (ndigits == 0)
goto parse_error;
- if (ndigits > MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2,
- LONG_MAX/2 + 1 - DBL_MAX_EXP)/4)
+ if (ndigits > Py_MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2,
+ LONG_MAX/2 + 1 - DBL_MAX_EXP)/4)
goto insane_length_error;
/* [p <exponent>] */
@@ -1342,7 +1337,7 @@ float_fromhex(PyObject *cls, PyObject *arg)
/* lsb = exponent of least significant bit of the *rounded* value.
This is top_exp - DBL_MANT_DIG unless result is subnormal. */
- lsb = MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG;
+ lsb = Py_MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG;
x = 0.0;
if (exp >= lsb) {
@@ -1711,7 +1706,7 @@ float__format__(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
- _PyUnicodeWriter_Init(&writer, 0);
+ _PyUnicodeWriter_Init(&writer);
ret = _PyFloat_FormatAdvancedWriter(
&writer,
self,
@@ -1858,7 +1853,7 @@ PyTypeObject PyFloat_Type = {
float_new, /* tp_new */
};
-void
+int
_PyFloat_Init(void)
{
/* We attempt to determine if this machine is using IEEE
@@ -1908,8 +1903,11 @@ _PyFloat_Init(void)
float_format = detected_float_format;
/* Init float info */
- if (FloatInfoType.tp_name == 0)
- PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc);
+ if (FloatInfoType.tp_name == NULL) {
+ if (PyStructSequence_InitType2(&FloatInfoType, &floatinfo_desc) < 0)
+ return 0;
+ }
+ return 1;
}
int
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 808e595..a62a45e 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -7,11 +7,6 @@
#include "opcode.h"
#include "structmember.h"
-#undef MIN
-#undef MAX
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-
#define OFF(x) offsetof(PyFrameObject, x)
static PyMemberDef frame_memberlist[] = {
@@ -160,8 +155,8 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
/* We're now ready to look at the bytecode. */
PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len);
- min_addr = MIN(new_lasti, f->f_lasti);
- max_addr = MAX(new_lasti, f->f_lasti);
+ min_addr = Py_MIN(new_lasti, f->f_lasti);
+ max_addr = Py_MAX(new_lasti, f->f_lasti);
/* You can't jump onto a line with an 'except' statement on it -
* they expect to have an exception on the top of the stack, which
@@ -293,7 +288,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
break;
}
- min_delta_iblock = MIN(min_delta_iblock, delta_iblock);
+ min_delta_iblock = Py_MIN(min_delta_iblock, delta_iblock);
if (op >= HAVE_ARGUMENT) {
addr += 2;
@@ -466,7 +461,7 @@ static int
frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
{
PyObject **fastlocals, **p;
- int i, slots;
+ Py_ssize_t i, slots;
Py_VISIT(f->f_back);
Py_VISIT(f->f_code);
@@ -493,10 +488,10 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
}
static void
-frame_clear(PyFrameObject *f)
+frame_tp_clear(PyFrameObject *f)
{
PyObject **fastlocals, **p, **oldtop;
- int i, slots;
+ Py_ssize_t i, slots;
/* Before anything else, make sure that this frame is clearly marked
* as being defunct! Else, e.g., a generator reachable from this
@@ -505,6 +500,7 @@ frame_clear(PyFrameObject *f)
*/
oldtop = f->f_stacktop;
f->f_stacktop = NULL;
+ f->f_executing = 0;
Py_CLEAR(f->f_exc_type);
Py_CLEAR(f->f_exc_value);
@@ -525,6 +521,25 @@ frame_clear(PyFrameObject *f)
}
static PyObject *
+frame_clear(PyFrameObject *f)
+{
+ if (f->f_executing) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "cannot clear an executing frame");
+ return NULL;
+ }
+ if (f->f_gen) {
+ _PyGen_Finalize(f->f_gen);
+ assert(f->f_gen == NULL);
+ }
+ frame_tp_clear(f);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(clear__doc__,
+"F.clear(): clear most references held by the frame");
+
+static PyObject *
frame_sizeof(PyFrameObject *f)
{
Py_ssize_t res, extras, ncells, nfrees;
@@ -543,6 +558,8 @@ PyDoc_STRVAR(sizeof__doc__,
"F.__sizeof__() -> size of F in memory, in bytes");
static PyMethodDef frame_methods[] = {
+ {"clear", (PyCFunction)frame_clear, METH_NOARGS,
+ clear__doc__},
{"__sizeof__", (PyCFunction)frame_sizeof, METH_NOARGS,
sizeof__doc__},
{NULL, NULL} /* sentinel */
@@ -571,7 +588,7 @@ PyTypeObject PyFrame_Type = {
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
0, /* tp_doc */
(traverseproc)frame_traverse, /* tp_traverse */
- (inquiry)frame_clear, /* tp_clear */
+ (inquiry)frame_tp_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
@@ -713,6 +730,8 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
f->f_lasti = -1;
f->f_lineno = code->co_firstlineno;
f->f_iblock = 0;
+ f->f_executing = 0;
+ f->f_gen = NULL;
_PyObject_GC_TRACK(f);
return f;
@@ -848,7 +867,7 @@ PyFrame_FastToLocals(PyFrameObject *f)
PyObject *error_type, *error_value, *error_traceback;
PyCodeObject *co;
Py_ssize_t j;
- int ncells, nfreevars;
+ Py_ssize_t ncells, nfreevars;
if (f == NULL)
return;
locals = f->f_locals;
@@ -900,7 +919,7 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
PyObject *error_type, *error_value, *error_traceback;
PyCodeObject *co;
Py_ssize_t j;
- int ncells, nfreevars;
+ Py_ssize_t ncells, nfreevars;
if (f == NULL)
return;
locals = f->f_locals;
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 49415b9..b043934 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -8,60 +8,59 @@
PyObject *
PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
{
- PyFunctionObject *op = PyObject_GC_New(PyFunctionObject,
- &PyFunction_Type);
- static PyObject *__name__ = 0;
- if (op != NULL) {
- PyObject *doc;
- PyObject *consts;
- PyObject *module;
- op->func_weakreflist = NULL;
- Py_INCREF(code);
- op->func_code = code;
- Py_INCREF(globals);
- op->func_globals = globals;
- op->func_name = ((PyCodeObject *)code)->co_name;
- Py_INCREF(op->func_name);
- op->func_defaults = NULL; /* No default arguments */
- op->func_kwdefaults = NULL; /* No keyword only defaults */
- op->func_closure = NULL;
- consts = ((PyCodeObject *)code)->co_consts;
- if (PyTuple_Size(consts) >= 1) {
- doc = PyTuple_GetItem(consts, 0);
- if (!PyUnicode_Check(doc))
- doc = Py_None;
- }
- else
+ PyFunctionObject *op;
+ PyObject *doc, *consts, *module;
+ static PyObject *__name__ = NULL;
+
+ if (__name__ == NULL) {
+ __name__ = PyUnicode_InternFromString("__name__");
+ if (__name__ == NULL)
+ return NULL;
+ }
+
+ op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type);
+ if (op == NULL)
+ return NULL;
+
+ op->func_weakreflist = NULL;
+ Py_INCREF(code);
+ op->func_code = code;
+ Py_INCREF(globals);
+ op->func_globals = globals;
+ op->func_name = ((PyCodeObject *)code)->co_name;
+ Py_INCREF(op->func_name);
+ op->func_defaults = NULL; /* No default arguments */
+ op->func_kwdefaults = NULL; /* No keyword only defaults */
+ op->func_closure = NULL;
+
+ consts = ((PyCodeObject *)code)->co_consts;
+ if (PyTuple_Size(consts) >= 1) {
+ doc = PyTuple_GetItem(consts, 0);
+ if (!PyUnicode_Check(doc))
doc = Py_None;
- Py_INCREF(doc);
- op->func_doc = doc;
- op->func_dict = NULL;
- op->func_module = NULL;
- op->func_annotations = NULL;
-
- /* __module__: If module name is in globals, use it.
- Otherwise, use None.
- */
- if (!__name__) {
- __name__ = PyUnicode_InternFromString("__name__");
- if (!__name__) {
- Py_DECREF(op);
- return NULL;
- }
- }
- module = PyDict_GetItem(globals, __name__);
- if (module) {
- Py_INCREF(module);
- op->func_module = module;
- }
- if (qualname)
- op->func_qualname = qualname;
- else
- op->func_qualname = op->func_name;
- Py_INCREF(op->func_qualname);
}
else
- return NULL;
+ doc = Py_None;
+ Py_INCREF(doc);
+ op->func_doc = doc;
+
+ op->func_dict = NULL;
+ op->func_module = NULL;
+ op->func_annotations = NULL;
+
+ /* __module__: If module name is in globals, use it.
+ Otherwise, use None. */
+ module = PyDict_GetItem(globals, __name__);
+ if (module) {
+ Py_INCREF(module);
+ op->func_module = module;
+ }
+ if (qualname)
+ op->func_qualname = qualname;
+ else
+ op->func_qualname = op->func_name;
+ Py_INCREF(op->func_qualname);
+
_PyObject_GC_TRACK(op);
return (PyObject *)op;
}
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 016bfa2..08d30bf 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -15,6 +15,31 @@ gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
return 0;
}
+void
+_PyGen_Finalize(PyObject *self)
+{
+ PyGenObject *gen = (PyGenObject *)self;
+ PyObject *res;
+ PyObject *error_type, *error_value, *error_traceback;
+
+ if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL)
+ /* Generator isn't paused, so no need to close */
+ return;
+
+ /* Save the current exception, if any. */
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+
+ res = gen_close(gen, NULL);
+
+ if (res == NULL)
+ PyErr_WriteUnraisable(self);
+ else
+ Py_DECREF(res);
+
+ /* Restore the saved exception. */
+ PyErr_Restore(error_type, error_value, error_traceback);
+}
+
static void
gen_dealloc(PyGenObject *gen)
{
@@ -27,12 +52,8 @@ gen_dealloc(PyGenObject *gen)
_PyObject_GC_TRACK(self);
- if (gen->gi_frame != NULL && gen->gi_frame->f_stacktop != NULL) {
- /* Generator is paused, so we need to close */
- Py_TYPE(gen)->tp_del(self);
- if (self->ob_refcnt > 0)
- return; /* resurrected. :( */
- }
+ if (PyObject_CallFinalizerFromDealloc(self))
+ return; /* resurrected. :( */
_PyObject_GC_UNTRACK(self);
Py_CLEAR(gen->gi_frame);
@@ -40,7 +61,6 @@ gen_dealloc(PyGenObject *gen)
PyObject_GC_Del(gen);
}
-
static PyObject *
gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
{
@@ -120,6 +140,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
Py_XDECREF(t);
Py_XDECREF(v);
Py_XDECREF(tb);
+ gen->gi_frame->f_gen = NULL;
gen->gi_frame = NULL;
Py_DECREF(f);
}
@@ -222,68 +243,6 @@ gen_close(PyGenObject *gen, PyObject *args)
return NULL;
}
-static void
-gen_del(PyObject *self)
-{
- PyObject *res;
- PyObject *error_type, *error_value, *error_traceback;
- PyGenObject *gen = (PyGenObject *)self;
-
- if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL)
- /* Generator isn't paused, so no need to close */
- return;
-
- /* Temporarily resurrect the object. */
- assert(self->ob_refcnt == 0);
- self->ob_refcnt = 1;
-
- /* Save the current exception, if any. */
- PyErr_Fetch(&error_type, &error_value, &error_traceback);
-
- res = gen_close(gen, NULL);
-
- if (res == NULL)
- PyErr_WriteUnraisable(self);
- else
- Py_DECREF(res);
-
- /* Restore the saved exception. */
- PyErr_Restore(error_type, error_value, error_traceback);
-
- /* Undo the temporary resurrection; can't use DECREF here, it would
- * cause a recursive call.
- */
- assert(self->ob_refcnt > 0);
- if (--self->ob_refcnt == 0)
- return; /* this is the normal path out */
-
- /* close() resurrected it! Make it look like the original Py_DECREF
- * never happened.
- */
- {
- Py_ssize_t refcnt = self->ob_refcnt;
- _Py_NewReference(self);
- self->ob_refcnt = refcnt;
- }
- assert(PyType_IS_GC(Py_TYPE(self)) &&
- _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
-
- /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
- * we need to undo that. */
- _Py_DEC_REFTOTAL;
- /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
- * chain, so no more to do there.
- * If COUNT_ALLOCS, the original decref bumped tp_frees, and
- * _Py_NewReference bumped tp_allocs: both of those need to be
- * undone.
- */
-#ifdef COUNT_ALLOCS
- --(Py_TYPE(self)->tp_frees);
- --(Py_TYPE(self)->tp_allocs);
-#endif
-}
-
-
PyDoc_STRVAR(throw_doc,
"throw(typ[,val[,tb]]) -> raise exception in generator,\n\
@@ -517,7 +476,8 @@ PyTypeObject PyGen_Type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
+ Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
0, /* tp_doc */
(traverseproc)gen_traverse, /* tp_traverse */
0, /* tp_clear */
@@ -544,7 +504,9 @@ PyTypeObject PyGen_Type = {
0, /* tp_cache */
0, /* tp_subclasses */
0, /* tp_weaklist */
- gen_del, /* tp_del */
+ 0, /* tp_del */
+ 0, /* tp_version_tag */
+ _PyGen_Finalize, /* tp_finalize */
};
PyObject *
@@ -556,6 +518,7 @@ PyGen_New(PyFrameObject *f)
return NULL;
}
gen->gi_frame = f;
+ f->f_gen = (PyObject *) gen;
Py_INCREF(f->f_code);
gen->gi_code = (PyObject *)(f->f_code);
gen->gi_running = 0;
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 3cfbeaf..77ff810 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -4,7 +4,7 @@
typedef struct {
PyObject_HEAD
- long it_index;
+ Py_ssize_t it_index;
PyObject *it_seq; /* Set to NULL when iterator is exhausted */
} seqiterobject;
@@ -76,9 +76,14 @@ iter_len(seqiterobject *it)
Py_ssize_t seqsize, len;
if (it->it_seq) {
- seqsize = PySequence_Size(it->it_seq);
- if (seqsize == -1)
- return NULL;
+ if (_PyObject_HasLen(it->it_seq)) {
+ seqsize = PySequence_Size(it->it_seq);
+ if (seqsize == -1)
+ return NULL;
+ }
+ else {
+ Py_RETURN_NOTIMPLEMENTED;
+ }
len = seqsize - it->it_index;
if (len >= 0)
return PyLong_FromSsize_t(len);
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 6e0d094..c08c1f6 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -213,11 +213,11 @@ PyList_GetItem(PyObject *op, Py_ssize_t i)
}
int
-PyList_SetItem(register PyObject *op, register Py_ssize_t i,
- register PyObject *newitem)
+PyList_SetItem(PyObject *op, Py_ssize_t i,
+ PyObject *newitem)
{
- register PyObject *olditem;
- register PyObject **p;
+ PyObject *olditem;
+ PyObject **p;
if (!PyList_Check(op)) {
Py_XDECREF(newitem);
PyErr_BadInternalCall();
@@ -644,9 +644,14 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
memcpy(recycle, &item[ilow], s);
if (d < 0) { /* Delete -d items */
- memmove(&item[ihigh+d], &item[ihigh],
- (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
- list_resize(a, Py_SIZE(a) + d);
+ Py_ssize_t tail;
+ tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *);
+ memmove(&item[ihigh+d], &item[ihigh], tail);
+ if (list_resize(a, Py_SIZE(a) + d) < 0) {
+ memmove(&item[ihigh], &item[ihigh+d], tail);
+ memcpy(&item[ilow], recycle, s);
+ goto Error;
+ }
item = a->ob_item;
}
else if (d > 0) { /* Insert d items */
@@ -826,7 +831,7 @@ listextend(PyListObject *self, PyObject *b)
iternext = *it->ob_type->tp_iternext;
/* Guess a result list size. */
- n = _PyObject_LengthHint(b, 8);
+ n = PyObject_LengthHint(b, 8);
if (n == -1) {
Py_DECREF(it);
return NULL;
@@ -871,8 +876,10 @@ listextend(PyListObject *self, PyObject *b)
}
/* Cut back result list if initial guess was too large. */
- if (Py_SIZE(self) < self->allocated)
- list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
+ if (Py_SIZE(self) < self->allocated) {
+ if (list_resize(self, Py_SIZE(self)) < 0)
+ goto error;
+ }
Py_DECREF(it);
Py_RETURN_NONE;
@@ -925,17 +932,17 @@ listpop(PyListObject *self, PyObject *args)
v = self->ob_item[i];
if (i == Py_SIZE(self) - 1) {
status = list_resize(self, Py_SIZE(self) - 1);
- assert(status >= 0);
- return v; /* and v now owns the reference the list had */
+ if (status >= 0)
+ return v; /* and v now owns the reference the list had */
+ else
+ return NULL;
}
Py_INCREF(v);
status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
- assert(status >= 0);
- /* Use status, so that in a release build compilers don't
- * complain about the unused name.
- */
- (void) status;
-
+ if (status < 0) {
+ Py_DECREF(v);
+ return NULL;
+ }
return v;
}
@@ -1051,9 +1058,9 @@ sortslice_advance(sortslice *slice, Py_ssize_t n)
static int
binarysort(sortslice lo, PyObject **hi, PyObject **start)
{
- register Py_ssize_t k;
- register PyObject **l, **p, **r;
- register PyObject *pivot;
+ Py_ssize_t k;
+ PyObject **l, **p, **r;
+ PyObject *pivot;
assert(lo.keys <= start && start <= hi);
/* assert [lo, start) is sorted */
@@ -2660,7 +2667,7 @@ PyTypeObject PyList_Type = {
typedef struct {
PyObject_HEAD
- long it_index;
+ Py_ssize_t it_index;
PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
} listiterobject;
@@ -2797,7 +2804,7 @@ listiter_reduce(listiterobject *it)
static PyObject *
listiter_setstate(listiterobject *it, PyObject *state)
{
- long index = PyLong_AsLong(state);
+ Py_ssize_t index = PyLong_AsSsize_t(state);
if (index == -1 && PyErr_Occurred())
return NULL;
if (it->it_seq != NULL) {
@@ -2958,7 +2965,7 @@ listiter_reduce_general(void *_it, int forward)
if (forward) {
listiterobject *it = (listiterobject *)_it;
if (it->it_seq)
- return Py_BuildValue("N(O)l", _PyObject_GetBuiltin("iter"),
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
it->it_seq, it->it_index);
} else {
listreviterobject *it = (listreviterobject *)_it;
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 30ffc94..9784734 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -17,7 +17,8 @@
#endif
/* convert a PyLong of size 1, 0 or -1 to an sdigit */
-#define MEDIUM_VALUE(x) (Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] : \
+#define MEDIUM_VALUE(x) (assert(-1 <= Py_SIZE(x) && Py_SIZE(x) <= 1), \
+ Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] : \
(Py_SIZE(x) == 0 ? (sdigit)0 : \
(sdigit)(x)->ob_digit[0]))
#define ABS(x) ((x) < 0 ? -(x) : (x))
@@ -70,11 +71,21 @@ maybe_small_long(PyLongObject *v)
/* If a freshly-allocated long is already shared, it must
be a small integer, so negating it must go to PyLong_FromLong */
-#define NEGATE(x) \
- do if (Py_REFCNT(x) == 1) Py_SIZE(x) = -Py_SIZE(x); \
- else { PyObject* tmp=PyLong_FromLong(-MEDIUM_VALUE(x)); \
- Py_DECREF(x); (x) = (PyLongObject*)tmp; } \
- while(0)
+Py_LOCAL_INLINE(void)
+_PyLong_Negate(PyLongObject **x_p)
+{
+ PyLongObject *x;
+
+ x = (PyLongObject *)*x_p;
+ if (Py_REFCNT(x) == 1) {
+ Py_SIZE(x) = -Py_SIZE(x);
+ return;
+ }
+
+ *x_p = (PyLongObject *)PyLong_FromLong(-MEDIUM_VALUE(x));
+ Py_DECREF(x);
+}
+
/* For long multiplication, use the O(N**2) school algorithm unless
* both operands contain more than KARATSUBA_CUTOFF digits (this
* being an internal Python long digit, in base BASE).
@@ -89,11 +100,6 @@ maybe_small_long(PyLongObject *v)
*/
#define FIVEARY_CUTOFF 8
-#undef MIN
-#undef MAX
-#define MAX(x, y) ((x) < (y) ? (y) : (x))
-#define MIN(x, y) ((x) > (y) ? (y) : (x))
-
#define SIGCHECK(PyTryBlock) \
do { \
if (PyErr_CheckSignals()) PyTryBlock \
@@ -104,7 +110,7 @@ maybe_small_long(PyLongObject *v)
of the algorithms used, this could save at most be one word anyway. */
static PyLongObject *
-long_normalize(register PyLongObject *v)
+long_normalize(PyLongObject *v)
{
Py_ssize_t j = ABS(Py_SIZE(v));
Py_ssize_t i = j;
@@ -334,7 +340,7 @@ long
PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
{
/* This version by Tim Peters */
- register PyLongObject *v;
+ PyLongObject *v;
unsigned long x, prev;
long res;
Py_ssize_t i;
@@ -457,7 +463,7 @@ _PyLong_AsInt(PyObject *obj)
Py_ssize_t
PyLong_AsSsize_t(PyObject *vv) {
- register PyLongObject *v;
+ PyLongObject *v;
size_t x, prev;
Py_ssize_t i;
int sign;
@@ -513,7 +519,7 @@ PyLong_AsSsize_t(PyObject *vv) {
unsigned long
PyLong_AsUnsignedLong(PyObject *vv)
{
- register PyLongObject *v;
+ PyLongObject *v;
unsigned long x, prev;
Py_ssize_t i;
@@ -543,7 +549,7 @@ PyLong_AsUnsignedLong(PyObject *vv)
x = (x << PyLong_SHIFT) | v->ob_digit[i];
if ((x >> PyLong_SHIFT) != prev) {
PyErr_SetString(PyExc_OverflowError,
- "python int too large to convert "
+ "Python int too large to convert "
"to C unsigned long");
return (unsigned long) -1;
}
@@ -557,7 +563,7 @@ PyLong_AsUnsignedLong(PyObject *vv)
size_t
PyLong_AsSize_t(PyObject *vv)
{
- register PyLongObject *v;
+ PyLongObject *v;
size_t x, prev;
Py_ssize_t i;
@@ -600,7 +606,7 @@ PyLong_AsSize_t(PyObject *vv)
static unsigned long
_PyLong_AsUnsignedLongMask(PyObject *vv)
{
- register PyLongObject *v;
+ PyLongObject *v;
unsigned long x;
Py_ssize_t i;
int sign;
@@ -628,7 +634,7 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
}
unsigned long
-PyLong_AsUnsignedLongMask(register PyObject *op)
+PyLong_AsUnsignedLongMask(PyObject *op)
{
PyNumberMethods *nb;
PyLongObject *lo;
@@ -954,9 +960,6 @@ PyObject *
PyLong_FromVoidPtr(void *p)
{
#if SIZEOF_VOID_P <= SIZEOF_LONG
- /* special-case null pointer */
- if (!p)
- return PyLong_FromLong(0);
return PyLong_FromUnsignedLong((unsigned long)(Py_uintptr_t)p);
#else
@@ -966,9 +969,6 @@ PyLong_FromVoidPtr(void *p)
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
#endif
- /* special-case null pointer */
- if (!p)
- return PyLong_FromLong(0);
return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)(Py_uintptr_t)p);
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
@@ -1014,7 +1014,6 @@ PyLong_AsVoidPtr(PyObject *vv)
* rewritten to use the newer PyLong_{As,From}ByteArray API.
*/
-#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
#define PY_ABS_LLONG_MIN (0-(unsigned PY_LONG_LONG)PY_LLONG_MIN)
/* Create a new long int object from a C PY_LONG_LONG int. */
@@ -1167,7 +1166,6 @@ PyLong_AsLongLong(PyObject *vv)
{
PyLongObject *v;
PY_LONG_LONG bytes;
- int one = 1;
int res;
if (vv == NULL) {
@@ -1202,7 +1200,7 @@ PyLong_AsLongLong(PyObject *vv)
case 1: return v->ob_digit[0];
}
res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
- SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
+ SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 1);
/* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
if (res < 0)
@@ -1219,7 +1217,6 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
{
PyLongObject *v;
unsigned PY_LONG_LONG bytes;
- int one = 1;
int res;
if (vv == NULL) {
@@ -1238,7 +1235,7 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
}
res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
- SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
+ SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 0);
/* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
if (res < 0)
@@ -1253,7 +1250,7 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
static unsigned PY_LONG_LONG
_PyLong_AsUnsignedLongLongMask(PyObject *vv)
{
- register PyLongObject *v;
+ PyLongObject *v;
unsigned PY_LONG_LONG x;
Py_ssize_t i;
int sign;
@@ -1281,7 +1278,7 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
}
unsigned PY_LONG_LONG
-PyLong_AsUnsignedLongLongMask(register PyObject *op)
+PyLong_AsUnsignedLongLongMask(PyObject *op)
{
PyNumberMethods *nb;
PyLongObject *lo;
@@ -1314,7 +1311,6 @@ PyLong_AsUnsignedLongLongMask(register PyObject *op)
return (unsigned PY_LONG_LONG)-1;
}
}
-#undef IS_LITTLE_ENDIAN
/* Get a C long long int from a long int object or any object that has an
__int__ method.
@@ -1330,7 +1326,7 @@ PY_LONG_LONG
PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
{
/* This version by Tim Peters */
- register PyLongObject *v;
+ PyLongObject *v;
unsigned PY_LONG_LONG x, prev;
PY_LONG_LONG res;
Py_ssize_t i;
@@ -1606,7 +1602,7 @@ long_to_decimal_string_internal(PyObject *aa,
*/
if (size_a > PY_SSIZE_T_MAX / PyLong_SHIFT) {
PyErr_SetString(PyExc_OverflowError,
- "long is too large to format");
+ "int too large to format");
return -1;
}
/* the expression size_a * PyLong_SHIFT is now safe from overflow */
@@ -1676,7 +1672,6 @@ long_to_decimal_string_internal(PyObject *aa,
else \
p = (TYPE*)PyUnicode_DATA(str) + strlen; \
\
- *p = '\0'; \
/* pout[0] through pout[size-2] contribute exactly \
_PyLong_DECIMAL_SHIFT digits each */ \
for (i=0; i < size - 1; i++) { \
@@ -1749,7 +1744,7 @@ static int
long_format_binary(PyObject *aa, int base, int alternate,
PyObject **p_output, _PyUnicodeWriter *writer)
{
- register PyLongObject *a = (PyLongObject *)aa;
+ PyLongObject *a = (PyLongObject *)aa;
PyObject *v;
Py_ssize_t sz;
Py_ssize_t size_a;
@@ -1790,7 +1785,7 @@ long_format_binary(PyObject *aa, int base, int alternate,
/* Ensure overflow doesn't occur during computation of sz. */
if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
PyErr_SetString(PyExc_OverflowError,
- "int is too large to format");
+ "int too large to format");
return -1;
}
size_a_in_bits = (size_a - 1) * PyLong_SHIFT +
@@ -2146,7 +2141,7 @@ that triggers it(!). Instead the code was tested by artificially allocating
just 1 digit at the start, so that the copying code was exercised for every
digit beyond the first.
***/
- register twodigits c; /* current input character */
+ twodigits c; /* current input character */
Py_ssize_t size_z;
int i;
int convwidth;
@@ -2292,7 +2287,7 @@ digit beyond the first.
if (strobj == NULL)
return NULL;
PyErr_Format(PyExc_ValueError,
- "invalid literal for int() with base %d: %R",
+ "invalid literal for int() with base %d: %.200R",
base, strobj);
Py_DECREF(strobj);
return NULL;
@@ -2316,7 +2311,7 @@ _PyLong_FromBytes(const char *s, Py_ssize_t len, int base)
strobj = PyBytes_FromStringAndSize(s, Py_MIN(len, 200));
if (strobj != NULL) {
PyErr_Format(PyExc_ValueError,
- "invalid literal for int() with base %d: %R",
+ "invalid literal for int() with base %d: %.200R",
base, strobj);
Py_DECREF(strobj);
}
@@ -2337,7 +2332,7 @@ PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
PyObject *
PyLong_FromUnicodeObject(PyObject *u, int base)
{
- PyObject *result, *asciidig, *strobj;
+ PyObject *result, *asciidig;
char *buffer, *end = NULL;
Py_ssize_t buflen;
@@ -2359,13 +2354,9 @@ PyLong_FromUnicodeObject(PyObject *u, int base)
Py_DECREF(asciidig);
Py_XDECREF(result);
}
- strobj = PySequence_GetSlice(u, 0, 200);
- if (strobj != NULL) {
- PyErr_Format(PyExc_ValueError,
- "invalid literal for int() with base %d: %R",
- base, strobj);
- Py_DECREF(strobj);
- }
+ PyErr_Format(PyExc_ValueError,
+ "invalid literal for int() with base %d: %.200R",
+ base, u);
return NULL;
}
@@ -2419,10 +2410,21 @@ long_divrem(PyLongObject *a, PyLongObject *b,
The quotient z has the sign of a*b;
the remainder r has the sign of a,
so a = b*z + r. */
- if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0))
- NEGATE(z);
- if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0)
- NEGATE(*prem);
+ if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0)) {
+ _PyLong_Negate(&z);
+ if (z == NULL) {
+ Py_CLEAR(*prem);
+ return -1;
+ }
+ }
+ if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) {
+ _PyLong_Negate(prem);
+ if (*prem == NULL) {
+ Py_DECREF(z);
+ Py_CLEAR(*prem);
+ return -1;
+ }
+ }
*pdiv = maybe_small_long(z);
return 0;
}
@@ -2698,7 +2700,7 @@ PyLong_AsDouble(PyObject *v)
x = _PyLong_Frexp((PyLongObject *)v, &exponent);
if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
PyErr_SetString(PyExc_OverflowError,
- "long int too large to convert to float");
+ "int too large to convert to float");
return -1.0;
}
return ldexp(x, (int)exponent);
@@ -2918,8 +2920,11 @@ x_sub(PyLongObject *a, PyLongObject *b)
borrow &= 1; /* Keep only one sign bit */
}
assert(borrow == 0);
- if (sign < 0)
- NEGATE(z);
+ if (sign < 0) {
+ _PyLong_Negate(&z);
+ if (z == NULL)
+ return NULL;
+ }
return long_normalize(z);
}
@@ -3086,7 +3091,7 @@ kmul_split(PyLongObject *n,
Py_ssize_t size_lo, size_hi;
const Py_ssize_t size_n = ABS(Py_SIZE(n));
- size_lo = MIN(size_n, size);
+ size_lo = Py_MIN(size_n, size);
size_hi = size_n - size_lo;
if ((hi = _PyLong_New(size_hi)) == NULL)
@@ -3357,7 +3362,7 @@ k_lopsided_mul(PyLongObject *a, PyLongObject *b)
nbdone = 0;
while (bsize > 0) {
PyLongObject *product;
- const Py_ssize_t nbtouse = MIN(bsize, asize);
+ const Py_ssize_t nbtouse = Py_MIN(bsize, asize);
/* Multiply the next slice of b by a. */
memcpy(bslice->ob_digit, b->ob_digit + nbdone,
@@ -3410,8 +3415,11 @@ long_mul(PyLongObject *a, PyLongObject *b)
z = k_mul(a, b);
/* Negate if exactly one of the inputs is negative. */
- if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z)
- NEGATE(z);
+ if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) {
+ _PyLong_Negate(&z);
+ if (z == NULL)
+ return NULL;
+ }
return (PyObject *)z;
}
@@ -3648,7 +3656,7 @@ long_true_divide(PyObject *v, PyObject *w)
goto underflow_or_zero;
/* Choose value for shift; see comments for step 1 above. */
- shift = MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
+ shift = Py_MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
inexact = 0;
@@ -3719,7 +3727,7 @@ long_true_divide(PyObject *v, PyObject *w)
x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]);
/* The number of extra bits that have to be rounded away. */
- extra_bits = MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
+ extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
assert(extra_bits == 2 || extra_bits == 3);
/* Round by directly modifying the low digit of x. */
@@ -3858,7 +3866,9 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
Py_DECREF(c);
c = temp;
temp = NULL;
- NEGATE(c);
+ _PyLong_Negate(&c);
+ if (c == NULL)
+ goto Error;
}
/* if modulus == 1:
@@ -3958,10 +3968,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
goto Done;
Error:
- if (z != NULL) {
- Py_DECREF(z);
- z = NULL;
- }
+ Py_CLEAR(z);
/* fall through */
Done:
if (Py_SIZE(b) > FIVEARY_CUTOFF) {
@@ -4091,10 +4098,10 @@ long_lshift(PyObject *v, PyObject *w)
shiftby = PyLong_AsSsize_t((PyObject *)b);
if (shiftby == -1L && PyErr_Occurred())
- goto lshift_error;
+ return NULL;
if (shiftby < 0) {
PyErr_SetString(PyExc_ValueError, "negative shift count");
- goto lshift_error;
+ return NULL;
}
/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
wordshift = shiftby / PyLong_SHIFT;
@@ -4106,9 +4113,11 @@ long_lshift(PyObject *v, PyObject *w)
++newsize;
z = _PyLong_New(newsize);
if (z == NULL)
- goto lshift_error;
- if (Py_SIZE(a) < 0)
- NEGATE(z);
+ return NULL;
+ if (Py_SIZE(a) < 0) {
+ assert(Py_REFCNT(z) == 1);
+ Py_SIZE(z) = -Py_SIZE(z);
+ }
for (i = 0; i < wordshift; i++)
z->ob_digit[i] = 0;
accum = 0;
@@ -4122,7 +4131,6 @@ long_lshift(PyObject *v, PyObject *w)
else
assert(!accum);
z = long_normalize(z);
- lshift_error:
return (PyObject *) maybe_small_long(z);
}
@@ -4147,7 +4155,7 @@ v_complement(digit *z, digit *a, Py_ssize_t m)
static PyObject *
long_bitwise(PyLongObject *a,
- int op, /* '&', '|', '^' */
+ char op, /* '&', '|', '^' */
PyLongObject *b)
{
int nega, negb, negz;
@@ -4322,8 +4330,7 @@ static PyObject *
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *obase = NULL, *x = NULL;
- long base;
- int overflow;
+ Py_ssize_t base;
static char *kwlist[] = {"x", "base", 0};
if (type != &PyLong_Type)
@@ -4342,10 +4349,10 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (obase == NULL)
return PyNumber_Long(x);
- base = PyLong_AsLongAndOverflow(obase, &overflow);
+ base = PyNumber_AsSsize_t(obase, NULL);
if (base == -1 && PyErr_Occurred())
return NULL;
- if (overflow || (base != 0 && base < 2) || base > 36) {
+ if ((base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError,
"int() base must be >= 2 and <= 36");
return NULL;
@@ -4426,7 +4433,7 @@ long__format__(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
- _PyUnicodeWriter_Init(&writer, 0);
+ _PyUnicodeWriter_Init(&writer);
ret = _PyLong_FormatAdvancedWriter(
&writer,
self,
@@ -5083,8 +5090,10 @@ _PyLong_Init(void)
}
#endif
/* initialize int_info */
- if (Int_InfoType.tp_name == 0)
- PyStructSequence_InitType(&Int_InfoType, &int_info_desc);
+ if (Int_InfoType.tp_name == NULL) {
+ if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0)
+ return 0;
+ }
return 1;
}
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index f0685dd..11c8b6e 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -13,6 +13,15 @@ static int numfree = 0;
#define PyCFunction_MAXFREELIST 256
#endif
+/* undefine macro trampoline to PyCFunction_NewEx */
+#undef PyCFunction_New
+
+PyObject *
+PyCFunction_New(PyMethodDef *ml, PyObject *self)
+{
+ return PyCFunction_NewEx(ml, self, NULL);
+}
+
PyObject *
PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
{
@@ -70,23 +79,34 @@ PyCFunction_GetFlags(PyObject *op)
PyObject *
PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
{
+#define CHECK_RESULT(res) assert(res != NULL || PyErr_Occurred())
+
PyCFunctionObject* f = (PyCFunctionObject*)func;
PyCFunction meth = PyCFunction_GET_FUNCTION(func);
PyObject *self = PyCFunction_GET_SELF(func);
+ PyObject *res;
Py_ssize_t size;
switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
case METH_VARARGS:
- if (kw == NULL || PyDict_Size(kw) == 0)
- return (*meth)(self, arg);
+ if (kw == NULL || PyDict_Size(kw) == 0) {
+ res = (*meth)(self, arg);
+ CHECK_RESULT(res);
+ return res;
+ }
break;
case METH_VARARGS | METH_KEYWORDS:
- return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
+ res = (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
+ CHECK_RESULT(res);
+ return res;
case METH_NOARGS:
if (kw == NULL || PyDict_Size(kw) == 0) {
size = PyTuple_GET_SIZE(arg);
- if (size == 0)
- return (*meth)(self, NULL);
+ if (size == 0) {
+ res = (*meth)(self, NULL);
+ CHECK_RESULT(res);
+ return res;
+ }
PyErr_Format(PyExc_TypeError,
"%.200s() takes no arguments (%zd given)",
f->m_ml->ml_name, size);
@@ -96,8 +116,11 @@ PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
case METH_O:
if (kw == NULL || PyDict_Size(kw) == 0) {
size = PyTuple_GET_SIZE(arg);
- if (size == 1)
- return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
+ if (size == 1) {
+ res = (*meth)(self, PyTuple_GET_ITEM(arg, 0));
+ CHECK_RESULT(res);
+ return res;
+ }
PyErr_Format(PyExc_TypeError,
"%.200s() takes exactly one argument (%zd given)",
f->m_ml->ml_name, size);
@@ -114,6 +137,8 @@ PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
f->m_ml->ml_name);
return NULL;
+
+#undef CHECK_RESULT
}
/* Methods (the standard built-in methods, that is) */
@@ -346,17 +371,3 @@ _PyCFunction_DebugMallocStats(FILE *out)
"free PyCFunctionObject",
numfree, sizeof(PyCFunctionObject));
}
-
-/* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(),
- but it's part of the API so we need to keep a function around that
- existing C extensions can call.
-*/
-
-#undef PyCFunction_New
-PyAPI_FUNC(PyObject *) PyCFunction_New(PyMethodDef *, PyObject *);
-
-PyObject *
-PyCFunction_New(PyMethodDef *ml, PyObject *self)
-{
- return PyCFunction_NewEx(ml, self, NULL);
-}
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 2f2bd36..3ea3be8 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -11,6 +11,8 @@ typedef struct {
PyObject *md_dict;
struct PyModuleDef *md_def;
void *md_state;
+ PyObject *md_weaklist;
+ PyObject *md_name; /* for logging purposes after md_dict is cleared */
} PyModuleObject;
static PyMemberDef module_members[] = {
@@ -26,6 +28,33 @@ static PyTypeObject moduledef_type = {
};
+static int
+module_init_dict(PyModuleObject *mod, PyObject *md_dict,
+ PyObject *name, PyObject *doc)
+{
+ if (md_dict == NULL)
+ return -1;
+ if (doc == NULL)
+ doc = Py_None;
+
+ if (PyDict_SetItemString(md_dict, "__name__", name) != 0)
+ return -1;
+ if (PyDict_SetItemString(md_dict, "__doc__", doc) != 0)
+ return -1;
+ if (PyDict_SetItemString(md_dict, "__package__", Py_None) != 0)
+ return -1;
+ if (PyDict_SetItemString(md_dict, "__loader__", Py_None) != 0)
+ return -1;
+ if (PyUnicode_CheckExact(name)) {
+ Py_INCREF(name);
+ Py_XDECREF(mod->md_name);
+ mod->md_name = name;
+ }
+
+ return 0;
+}
+
+
PyObject *
PyModule_NewObject(PyObject *name)
{
@@ -35,14 +64,10 @@ PyModule_NewObject(PyObject *name)
return NULL;
m->md_def = NULL;
m->md_state = NULL;
+ m->md_weaklist = NULL;
+ m->md_name = NULL;
m->md_dict = PyDict_New();
- if (m->md_dict == NULL)
- goto fail;
- if (PyDict_SetItemString(m->md_dict, "__name__", name) != 0)
- goto fail;
- if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
- goto fail;
- if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
+ if (module_init_dict(m, m->md_dict, name, NULL) != 0)
goto fail;
PyObject_GC_Track(m);
return (PyObject *)m;
@@ -347,9 +372,7 @@ module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
return -1;
m->md_dict = dict;
}
- if (PyDict_SetItemString(dict, "__name__", name) < 0)
- return -1;
- if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
+ if (module_init_dict(m, dict, name, doc) < 0)
return -1;
return 0;
}
@@ -358,12 +381,15 @@ static void
module_dealloc(PyModuleObject *m)
{
PyObject_GC_UnTrack(m);
+ if (Py_VerboseFlag && m->md_name) {
+ PySys_FormatStderr("# destroy %S\n", m->md_name);
+ }
+ if (m->md_weaklist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) m);
if (m->md_def && m->md_def->m_free)
m->md_def->m_free(m);
- if (m->md_dict != NULL) {
- _PyModule_Clear((PyObject *)m);
- Py_DECREF(m->md_dict);
- }
+ Py_XDECREF(m->md_dict);
+ Py_XDECREF(m->md_name);
if (m->md_state != NULL)
PyMem_FREE(m->md_state);
Py_TYPE(m)->tp_free((PyObject *)m);
@@ -380,7 +406,7 @@ module_repr(PyModuleObject *m)
if (m->md_dict != NULL) {
loader = PyDict_GetItemString(m->md_dict, "__loader__");
}
- if (loader != NULL) {
+ if (loader != NULL && loader != Py_None) {
repr = PyObject_CallMethod(loader, "module_repr", "(O)",
(PyObject *)m, NULL);
if (repr == NULL) {
@@ -404,10 +430,10 @@ module_repr(PyModuleObject *m)
filename = PyModule_GetFilenameObject((PyObject *)m);
if (filename == NULL) {
PyErr_Clear();
- /* There's no m.__file__, so if there was an __loader__, use that in
+ /* There's no m.__file__, so if there was a __loader__, use that in
* the repr, otherwise, the only thing you can use is m.__name__
*/
- if (loader == NULL) {
+ if (loader == NULL || loader == Py_None) {
repr = PyUnicode_FromFormat("<module %R>", name);
}
else {
@@ -509,7 +535,7 @@ PyTypeObject PyModule_Type = {
(traverseproc)module_traverse, /* tp_traverse */
(inquiry)module_clear, /* tp_clear */
0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
+ offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
module_methods, /* tp_methods */
diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c
index ff278d3..9e95094 100644
--- a/Objects/namespaceobject.c
+++ b/Objects/namespaceobject.c
@@ -44,7 +44,7 @@ namespace_init(_PyNamespaceObject *ns, PyObject *args, PyObject *kwds)
if (args != NULL) {
Py_ssize_t argcount = PyObject_Size(args);
if (argcount < 0)
- return argcount;
+ return -1;
else if (argcount > 0) {
PyErr_Format(PyExc_TypeError, "no positional arguments expected");
return -1;
@@ -66,16 +66,20 @@ namespace_dealloc(_PyNamespaceObject *ns)
static PyObject *
-namespace_repr(_PyNamespaceObject *ns)
+namespace_repr(PyObject *ns)
{
int i, loop_error = 0;
PyObject *pairs = NULL, *d = NULL, *keys = NULL, *keys_iter = NULL;
PyObject *key;
PyObject *separator, *pairsrepr, *repr = NULL;
+ const char * name;
+
+ name = (Py_TYPE(ns) == &_PyNamespace_Type) ? "namespace"
+ : ns->ob_type->tp_name;
- i = Py_ReprEnter((PyObject *)ns);
+ i = Py_ReprEnter(ns);
if (i != 0) {
- return i > 0 ? PyUnicode_FromString("namespace(...)") : NULL;
+ return i > 0 ? PyUnicode_FromFormat("%s(...)", name) : NULL;
}
pairs = PyList_New(0);
@@ -127,8 +131,7 @@ namespace_repr(_PyNamespaceObject *ns)
if (pairsrepr == NULL)
goto error;
- repr = PyUnicode_FromFormat("%s(%S)",
- ((PyObject *)ns)->ob_type->tp_name, pairsrepr);
+ repr = PyUnicode_FromFormat("%s(%S)", name, pairsrepr);
Py_DECREF(pairsrepr);
error:
@@ -136,7 +139,7 @@ error:
Py_XDECREF(d);
Py_XDECREF(keys);
Py_XDECREF(keys_iter);
- Py_ReprLeave((PyObject *)ns);
+ Py_ReprLeave(ns);
return repr;
}
@@ -158,14 +161,49 @@ namespace_clear(_PyNamespaceObject *ns)
}
+static PyObject *
+namespace_richcompare(PyObject *self, PyObject *other, int op)
+{
+ if (PyObject_IsInstance(self, (PyObject *)&_PyNamespace_Type) &&
+ PyObject_IsInstance(other, (PyObject *)&_PyNamespace_Type))
+ return PyObject_RichCompare(((_PyNamespaceObject *)self)->ns_dict,
+ ((_PyNamespaceObject *)other)->ns_dict, op);
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+}
+
+
+PyDoc_STRVAR(namespace_reduce__doc__, "Return state information for pickling");
+
+static PyObject *
+namespace_reduce(_PyNamespaceObject *ns)
+{
+ PyObject *result, *args = PyTuple_New(0);
+
+ if (!args)
+ return NULL;
+
+ result = PyTuple_Pack(3, (PyObject *)Py_TYPE(ns), args, ns->ns_dict);
+ Py_DECREF(args);
+ return result;
+}
+
+
+static PyMethodDef namespace_methods[] = {
+ {"__reduce__", (PyCFunction)namespace_reduce, METH_NOARGS,
+ namespace_reduce__doc__},
+ {NULL, NULL} /* sentinel */
+};
+
+
PyDoc_STRVAR(namespace_doc,
"A simple attribute-based namespace.\n\
\n\
-namespace(**kwargs)");
+SimpleNamespace(**kwargs)");
PyTypeObject _PyNamespace_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- "namespace", /* tp_name */
+ "types.SimpleNamespace", /* tp_name */
sizeof(_PyNamespaceObject), /* tp_size */
0, /* tp_itemsize */
(destructor)namespace_dealloc, /* tp_dealloc */
@@ -188,11 +226,11 @@ PyTypeObject _PyNamespace_Type = {
namespace_doc, /* tp_doc */
(traverseproc)namespace_traverse, /* tp_traverse */
(inquiry)namespace_clear, /* tp_clear */
- 0, /* tp_richcompare */
+ namespace_richcompare, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
- 0, /* tp_methods */
+ namespace_methods, /* tp_methods */
namespace_members, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
diff --git a/Objects/object.c b/Objects/object.c
index 949e7dc..8d4fe42 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -255,6 +255,72 @@ _PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
return PyObject_INIT_VAR(op, tp, nitems);
}
+void
+PyObject_CallFinalizer(PyObject *self)
+{
+ PyTypeObject *tp = Py_TYPE(self);
+
+ /* The former could happen on heaptypes created from the C API, e.g.
+ PyType_FromSpec(). */
+ if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_FINALIZE) ||
+ tp->tp_finalize == NULL)
+ return;
+ /* tp_finalize should only be called once. */
+ if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
+ return;
+
+ tp->tp_finalize(self);
+ if (PyType_IS_GC(tp))
+ _PyGC_SET_FINALIZED(self, 1);
+}
+
+int
+PyObject_CallFinalizerFromDealloc(PyObject *self)
+{
+ Py_ssize_t refcnt;
+
+ /* Temporarily resurrect the object. */
+ if (self->ob_refcnt != 0) {
+ Py_FatalError("PyObject_CallFinalizerFromDealloc called on "
+ "object with a non-zero refcount");
+ }
+ self->ob_refcnt = 1;
+
+ PyObject_CallFinalizer(self);
+
+ /* Undo the temporary resurrection; can't use DECREF here, it would
+ * cause a recursive call.
+ */
+ assert(self->ob_refcnt > 0);
+ if (--self->ob_refcnt == 0)
+ return 0; /* this is the normal path out */
+
+ /* tp_finalize resurrected it! Make it look like the original Py_DECREF
+ * never happened.
+ */
+ refcnt = self->ob_refcnt;
+ _Py_NewReference(self);
+ self->ob_refcnt = refcnt;
+
+ if (PyType_IS_GC(Py_TYPE(self))) {
+ assert(_PyGC_REFS(self) != _PyGC_REFS_UNTRACKED);
+ }
+ /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
+ * we need to undo that. */
+ _Py_DEC_REFTOTAL;
+ /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
+ * chain, so no more to do there.
+ * If COUNT_ALLOCS, the original decref bumped tp_frees, and
+ * _Py_NewReference bumped tp_allocs: both of those need to be
+ * undone.
+ */
+#ifdef COUNT_ALLOCS
+ --Py_TYPE(self)->tp_frees;
+ --Py_TYPE(self)->tp_allocs;
+#endif
+ return -1;
+}
+
int
PyObject_Print(PyObject *op, FILE *fp, int flags)
{
@@ -377,6 +443,14 @@ PyObject_Repr(PyObject *v)
if (Py_TYPE(v)->tp_repr == NULL)
return PyUnicode_FromFormat("<%s object at %p>",
v->ob_type->tp_name, v);
+
+#ifdef Py_DEBUG
+ /* PyObject_Repr() must not be called with an exception set,
+ because it may clear it (directly or indirectly) and so the
+ caller looses its exception */
+ assert(!PyErr_Occurred());
+#endif
+
res = (*v->ob_type->tp_repr)(v);
if (res == NULL)
return NULL;
@@ -408,6 +482,7 @@ PyObject_Str(PyObject *v)
#endif
if (v == NULL)
return PyUnicode_FromString("<NULL>");
+
if (PyUnicode_CheckExact(v)) {
#ifndef Py_DEBUG
if (PyUnicode_READY(v) < 0)
@@ -419,6 +494,13 @@ PyObject_Str(PyObject *v)
if (Py_TYPE(v)->tp_str == NULL)
return PyObject_Repr(v);
+#ifdef Py_DEBUG
+ /* PyObject_Str() must not be called with an exception set,
+ because it may clear it (directly or indirectly) and so the
+ caller looses its exception */
+ assert(!PyErr_Occurred());
+#endif
+
/* It is possible for a type to have a tp_str representation that loops
infinitely. */
if (Py_EnterRecursiveCall(" while getting the str of an object"))
@@ -451,6 +533,9 @@ PyObject_ASCII(PyObject *v)
if (repr == NULL)
return NULL;
+ if (PyUnicode_IS_ASCII(repr))
+ return repr;
+
/* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
Py_DECREF(repr);
@@ -1524,12 +1609,21 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
Py_RETURN_NOTIMPLEMENTED;
}
+static void
+notimplemented_dealloc(PyObject* ignore)
+{
+ /* This should never get called, but we also don't want to SEGV if
+ * we accidentally decref NotImplemented out of existence.
+ */
+ Py_FatalError("deallocating NotImplemented");
+}
+
static PyTypeObject PyNotImplemented_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"NotImplementedType",
0,
0,
- none_dealloc, /*tp_dealloc*/ /*never called*/
+ notimplemented_dealloc, /*tp_dealloc*/ /*never called*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
@@ -1699,15 +1793,6 @@ _Py_ReadyTypes(void)
if (PyType_Ready(&PyMemberDescr_Type) < 0)
Py_FatalError("Can't initialize member descriptor type");
- if (PyType_Ready(&PyFilter_Type) < 0)
- Py_FatalError("Can't initialize filter type");
-
- if (PyType_Ready(&PyMap_Type) < 0)
- Py_FatalError("Can't initialize map type");
-
- if (PyType_Ready(&PyZip_Type) < 0)
- Py_FatalError("Can't initialize zip type");
-
if (PyType_Ready(&_PyNamespace_Type) < 0)
Py_FatalError("Can't initialize namespace type");
@@ -1749,10 +1834,10 @@ _Py_NewReference(PyObject *op)
}
void
-_Py_ForgetReference(register PyObject *op)
+_Py_ForgetReference(PyObject *op)
{
#ifdef SLOW_UNREF_CHECK
- register PyObject *p;
+ PyObject *p;
#endif
if (op->ob_refcnt < 0)
Py_FatalError("UNREF negative refcnt");
@@ -1856,26 +1941,6 @@ PyTypeObject *_PyCapsule_hack = &PyCapsule_Type;
Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size;
-/* Python's malloc wrappers (see pymem.h) */
-
-void *
-PyMem_Malloc(size_t nbytes)
-{
- return PyMem_MALLOC(nbytes);
-}
-
-void *
-PyMem_Realloc(void *p, size_t nbytes)
-{
- return PyMem_REALLOC(p, nbytes);
-}
-
-void
-PyMem_Free(void *p)
-{
- PyMem_FREE(p);
-}
-
void
_PyObject_DebugTypeStats(FILE *out)
{
@@ -1927,7 +1992,8 @@ Py_ReprEnter(PyObject *obj)
if (PyList_GET_ITEM(list, i) == obj)
return 1;
}
- PyList_Append(list, obj);
+ if (PyList_Append(list, obj) < 0)
+ return -1;
return 0;
}
@@ -1937,13 +2003,18 @@ Py_ReprLeave(PyObject *obj)
PyObject *dict;
PyObject *list;
Py_ssize_t i;
+ PyObject *error_type, *error_value, *error_traceback;
+
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
dict = PyThreadState_GetDict();
if (dict == NULL)
- return;
+ goto finally;
+
list = PyDict_GetItemString(dict, KEY);
if (list == NULL || !PyList_Check(list))
- return;
+ goto finally;
+
i = PyList_GET_SIZE(list);
/* Count backwards because we always expect obj to be list[-1] */
while (--i >= 0) {
@@ -1952,6 +2023,10 @@ Py_ReprLeave(PyObject *obj)
break;
}
}
+
+finally:
+ /* ignore exceptions because there is no way to report them. */
+ PyErr_Restore(error_type, error_value, error_traceback);
}
/* Trashcan support. */
@@ -1972,7 +2047,7 @@ void
_PyTrash_deposit_object(PyObject *op)
{
assert(PyObject_IS_GC(op));
- assert(_Py_AS_GC(op)->gc.gc_refs == _PyGC_REFS_UNTRACKED);
+ assert(_PyGC_REFS(op) == _PyGC_REFS_UNTRACKED);
assert(op->ob_refcnt == 0);
_Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *)_PyTrash_delete_later;
_PyTrash_delete_later = op;
@@ -1984,7 +2059,7 @@ _PyTrash_thread_deposit_object(PyObject *op)
{
PyThreadState *tstate = PyThreadState_GET();
assert(PyObject_IS_GC(op));
- assert(_Py_AS_GC(op)->gc.gc_refs == _PyGC_REFS_UNTRACKED);
+ assert(_PyGC_REFS(op) == _PyGC_REFS_UNTRACKED);
assert(op->ob_refcnt == 0);
_Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *) tstate->trash_delete_later;
tstate->trash_delete_later = op;
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index 50fc7c1..f146222 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -1,14 +1,354 @@
#include "Python.h"
+/* Python's malloc wrappers (see pymem.h) */
+
+#ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */
+/* Forward declaration */
+static void* _PyMem_DebugMalloc(void *ctx, size_t size);
+static void _PyMem_DebugFree(void *ctx, void *p);
+static void* _PyMem_DebugRealloc(void *ctx, void *ptr, size_t size);
+
+static void _PyObject_DebugDumpAddress(const void *p);
+static void _PyMem_DebugCheckAddress(char api_id, const void *p);
+#endif
+
+#ifdef WITH_PYMALLOC
+
+#ifdef MS_WINDOWS
+# include <windows.h>
+#elif defined(HAVE_MMAP)
+# include <sys/mman.h>
+# ifdef MAP_ANONYMOUS
+# define ARENAS_USE_MMAP
+# endif
+#endif
+
+/* Forward declaration */
+static void* _PyObject_Malloc(void *ctx, size_t size);
+static void _PyObject_Free(void *ctx, void *p);
+static void* _PyObject_Realloc(void *ctx, void *ptr, size_t size);
+#endif
+
+
+static void *
+_PyMem_RawMalloc(void *ctx, size_t size)
+{
+ /* PyMem_Malloc(0) means malloc(1). Some systems would return NULL
+ for malloc(0), which would be treated as an error. Some platforms would
+ return a pointer with no memory behind it, which would break pymalloc.
+ To solve these problems, allocate an extra byte. */
+ if (size == 0)
+ size = 1;
+ return malloc(size);
+}
+
+static void *
+_PyMem_RawRealloc(void *ctx, void *ptr, size_t size)
+{
+ if (size == 0)
+ size = 1;
+ return realloc(ptr, size);
+}
+
+static void
+_PyMem_RawFree(void *ctx, void *ptr)
+{
+ free(ptr);
+}
+
+
+#ifdef MS_WINDOWS
+static void *
+_PyObject_ArenaVirtualAlloc(void *ctx, size_t size)
+{
+ return VirtualAlloc(NULL, size,
+ MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+}
+
+static void
+_PyObject_ArenaVirtualFree(void *ctx, void *ptr, size_t size)
+{
+ VirtualFree(ptr, 0, MEM_RELEASE);
+}
+
+#elif defined(ARENAS_USE_MMAP)
+static void *
+_PyObject_ArenaMmap(void *ctx, size_t size)
+{
+ void *ptr;
+ ptr = mmap(NULL, size, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (ptr == MAP_FAILED)
+ return NULL;
+ assert(ptr != NULL);
+ return ptr;
+}
+
+static void
+_PyObject_ArenaMunmap(void *ctx, void *ptr, size_t size)
+{
+ munmap(ptr, size);
+}
+
+#else
+static void *
+_PyObject_ArenaMalloc(void *ctx, size_t size)
+{
+ return malloc(size);
+}
+
+static void
+_PyObject_ArenaFree(void *ctx, void *ptr, size_t size)
+{
+ free(ptr);
+}
+#endif
+
+
+#define PYRAW_FUNCS _PyMem_RawMalloc, _PyMem_RawRealloc, _PyMem_RawFree
#ifdef WITH_PYMALLOC
+#define PYOBJECT_FUNCS _PyObject_Malloc, _PyObject_Realloc, _PyObject_Free
+#else
+#define PYOBJECT_FUNCS PYRAW_FUNCS
+#endif
-#ifdef HAVE_MMAP
- #include <sys/mman.h>
- #ifdef MAP_ANONYMOUS
- #define ARENAS_USE_MMAP
- #endif
+#ifdef PYMALLOC_DEBUG
+typedef struct {
+ /* We tag each block with an API ID in order to tag API violations */
+ char api_id;
+ PyMemAllocator alloc;
+} debug_alloc_api_t;
+static struct {
+ debug_alloc_api_t raw;
+ debug_alloc_api_t mem;
+ debug_alloc_api_t obj;
+} _PyMem_Debug = {
+ {'r', {NULL, PYRAW_FUNCS}},
+ {'m', {NULL, PYRAW_FUNCS}},
+ {'o', {NULL, PYOBJECT_FUNCS}}
+ };
+
+#define PYDEBUG_FUNCS _PyMem_DebugMalloc, _PyMem_DebugRealloc, _PyMem_DebugFree
#endif
+static PyMemAllocator _PyMem_Raw = {
+#ifdef PYMALLOC_DEBUG
+ &_PyMem_Debug.raw, PYDEBUG_FUNCS
+#else
+ NULL, PYRAW_FUNCS
+#endif
+ };
+
+static PyMemAllocator _PyMem = {
+#ifdef PYMALLOC_DEBUG
+ &_PyMem_Debug.mem, PYDEBUG_FUNCS
+#else
+ NULL, PYRAW_FUNCS
+#endif
+ };
+
+static PyMemAllocator _PyObject = {
+#ifdef PYMALLOC_DEBUG
+ &_PyMem_Debug.obj, PYDEBUG_FUNCS
+#else
+ NULL, PYOBJECT_FUNCS
+#endif
+ };
+
+#undef PYRAW_FUNCS
+#undef PYOBJECT_FUNCS
+#undef PYDEBUG_FUNCS
+
+static PyObjectArenaAllocator _PyObject_Arena = {NULL,
+#ifdef MS_WINDOWS
+ _PyObject_ArenaVirtualAlloc, _PyObject_ArenaVirtualFree
+#elif defined(ARENAS_USE_MMAP)
+ _PyObject_ArenaMmap, _PyObject_ArenaMunmap
+#else
+ _PyObject_ArenaMalloc, _PyObject_ArenaFree
+#endif
+ };
+
+void
+PyMem_SetupDebugHooks(void)
+{
+#ifdef PYMALLOC_DEBUG
+ PyMemAllocator alloc;
+
+ alloc.malloc = _PyMem_DebugMalloc;
+ alloc.realloc = _PyMem_DebugRealloc;
+ alloc.free = _PyMem_DebugFree;
+
+ if (_PyMem_Raw.malloc != _PyMem_DebugMalloc) {
+ alloc.ctx = &_PyMem_Debug.raw;
+ PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &_PyMem_Debug.raw.alloc);
+ PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
+ }
+
+ if (_PyMem.malloc != _PyMem_DebugMalloc) {
+ alloc.ctx = &_PyMem_Debug.mem;
+ PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &_PyMem_Debug.mem.alloc);
+ PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
+ }
+
+ if (_PyObject.malloc != _PyMem_DebugMalloc) {
+ alloc.ctx = &_PyMem_Debug.obj;
+ PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &_PyMem_Debug.obj.alloc);
+ PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
+ }
+#endif
+}
+
+void
+PyMem_GetAllocator(PyMemAllocatorDomain domain, PyMemAllocator *allocator)
+{
+ switch(domain)
+ {
+ case PYMEM_DOMAIN_RAW: *allocator = _PyMem_Raw; break;
+ case PYMEM_DOMAIN_MEM: *allocator = _PyMem; break;
+ case PYMEM_DOMAIN_OBJ: *allocator = _PyObject; break;
+ default:
+ /* unknown domain */
+ allocator->ctx = NULL;
+ allocator->malloc = NULL;
+ allocator->realloc = NULL;
+ allocator->free = NULL;
+ }
+}
+
+void
+PyMem_SetAllocator(PyMemAllocatorDomain domain, PyMemAllocator *allocator)
+{
+ switch(domain)
+ {
+ case PYMEM_DOMAIN_RAW: _PyMem_Raw = *allocator; break;
+ case PYMEM_DOMAIN_MEM: _PyMem = *allocator; break;
+ case PYMEM_DOMAIN_OBJ: _PyObject = *allocator; break;
+ /* ignore unknown domain */
+ }
+
+}
+
+void
+PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator)
+{
+ *allocator = _PyObject_Arena;
+}
+
+void
+PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator)
+{
+ _PyObject_Arena = *allocator;
+}
+
+void *
+PyMem_RawMalloc(size_t size)
+{
+ /*
+ * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
+ * Most python internals blindly use a signed Py_ssize_t to track
+ * things without checking for overflows or negatives.
+ * As size_t is unsigned, checking for size < 0 is not required.
+ */
+ if (size > (size_t)PY_SSIZE_T_MAX)
+ return NULL;
+
+ return _PyMem_Raw.malloc(_PyMem_Raw.ctx, size);
+}
+
+void*
+PyMem_RawRealloc(void *ptr, size_t new_size)
+{
+ /* see PyMem_RawMalloc() */
+ if (new_size > (size_t)PY_SSIZE_T_MAX)
+ return NULL;
+ return _PyMem_Raw.realloc(_PyMem_Raw.ctx, ptr, new_size);
+}
+
+void PyMem_RawFree(void *ptr)
+{
+ _PyMem_Raw.free(_PyMem_Raw.ctx, ptr);
+}
+
+void *
+PyMem_Malloc(size_t size)
+{
+ /* see PyMem_RawMalloc() */
+ if (size > (size_t)PY_SSIZE_T_MAX)
+ return NULL;
+ return _PyMem.malloc(_PyMem.ctx, size);
+}
+
+void *
+PyMem_Realloc(void *ptr, size_t new_size)
+{
+ /* see PyMem_RawMalloc() */
+ if (new_size > (size_t)PY_SSIZE_T_MAX)
+ return NULL;
+ return _PyMem.realloc(_PyMem.ctx, ptr, new_size);
+}
+
+void
+PyMem_Free(void *ptr)
+{
+ _PyMem.free(_PyMem.ctx, ptr);
+}
+
+char *
+_PyMem_RawStrdup(const char *str)
+{
+ size_t size;
+ char *copy;
+
+ size = strlen(str) + 1;
+ copy = PyMem_RawMalloc(size);
+ if (copy == NULL)
+ return NULL;
+ memcpy(copy, str, size);
+ return copy;
+}
+
+char *
+_PyMem_Strdup(const char *str)
+{
+ size_t size;
+ char *copy;
+
+ size = strlen(str) + 1;
+ copy = PyMem_Malloc(size);
+ if (copy == NULL)
+ return NULL;
+ memcpy(copy, str, size);
+ return copy;
+}
+
+void *
+PyObject_Malloc(size_t size)
+{
+ /* see PyMem_RawMalloc() */
+ if (size > (size_t)PY_SSIZE_T_MAX)
+ return NULL;
+ return _PyObject.malloc(_PyObject.ctx, size);
+}
+
+void *
+PyObject_Realloc(void *ptr, size_t new_size)
+{
+ /* see PyMem_RawMalloc() */
+ if (new_size > (size_t)PY_SSIZE_T_MAX)
+ return NULL;
+ return _PyObject.realloc(_PyObject.ctx, ptr, new_size);
+}
+
+void
+PyObject_Free(void *ptr)
+{
+ _PyObject.free(_PyObject.ctx, ptr);
+}
+
+
+#ifdef WITH_PYMALLOC
+
#ifdef WITH_VALGRIND
#include <valgrind/valgrind.h>
@@ -525,6 +865,15 @@ static size_t ntimes_arena_allocated = 0;
/* High water mark (max value ever seen) for narenas_currently_allocated. */
static size_t narenas_highwater = 0;
+static Py_ssize_t _Py_AllocatedBlocks = 0;
+
+Py_ssize_t
+_Py_GetAllocatedBlocks(void)
+{
+ return _Py_AllocatedBlocks;
+}
+
+
/* Allocate a new arena. If we run out of memory, return NULL. Else
* allocate a new arena, and return the address of an arena_object
* describing the new arena. It's expected that the caller will set
@@ -536,7 +885,6 @@ new_arena(void)
struct arena_object* arenaobj;
uint excess; /* number of bytes above pool alignment */
void *address;
- int err;
#ifdef PYMALLOC_DEBUG
if (Py_GETENV("PYTHONMALLOCSTATS"))
@@ -558,7 +906,7 @@ new_arena(void)
return NULL; /* overflow */
#endif
nbytes = numarenas * sizeof(*arenas);
- arenaobj = (struct arena_object *)realloc(arenas, nbytes);
+ arenaobj = (struct arena_object *)PyMem_Realloc(arenas, nbytes);
if (arenaobj == NULL)
return NULL;
arenas = arenaobj;
@@ -589,15 +937,8 @@ new_arena(void)
arenaobj = unused_arena_objects;
unused_arena_objects = arenaobj->nextarena;
assert(arenaobj->address == 0);
-#ifdef ARENAS_USE_MMAP
- address = mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- err = (address == MAP_FAILED);
-#else
- address = malloc(ARENA_SIZE);
- err = (address == 0);
-#endif
- if (err) {
+ address = _PyObject_Arena.alloc(_PyObject_Arena.ctx, ARENA_SIZE);
+ if (address == NULL) {
/* The allocation failed: return NULL after putting the
* arenaobj back.
*/
@@ -760,15 +1101,16 @@ int Py_ADDRESS_IN_RANGE(void *P, poolp pool) Py_NO_INLINE;
* Unless the optimizer reorders everything, being too smart...
*/
-#undef PyObject_Malloc
-void *
-PyObject_Malloc(size_t nbytes)
+static void *
+_PyObject_Malloc(void *ctx, size_t nbytes)
{
block *bp;
poolp pool;
poolp next;
uint size;
+ _Py_AllocatedBlocks++;
+
#ifdef WITH_VALGRIND
if (UNLIKELY(running_on_valgrind == -1))
running_on_valgrind = RUNNING_ON_VALGRIND;
@@ -777,15 +1119,6 @@ PyObject_Malloc(size_t nbytes)
#endif
/*
- * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
- * Most python internals blindly use a signed Py_ssize_t to track
- * things without checking for overflows or negatives.
- * As size_t is unsigned, checking for nbytes < 0 is not required.
- */
- if (nbytes > PY_SSIZE_T_MAX)
- return NULL;
-
- /*
* This implicitly redirects malloc(0).
*/
if ((nbytes - 1) < SMALL_REQUEST_THRESHOLD) {
@@ -901,6 +1234,7 @@ PyObject_Malloc(size_t nbytes)
* and free list are already initialized.
*/
bp = pool->freeblock;
+ assert(bp != NULL);
pool->freeblock = *(block **)bp;
UNLOCK();
return (void *)bp;
@@ -956,16 +1290,18 @@ redirect:
* last chance to serve the request) or when the max memory limit
* has been reached.
*/
- if (nbytes == 0)
- nbytes = 1;
- return (void *)malloc(nbytes);
+ {
+ void *result = PyMem_Malloc(nbytes);
+ if (!result)
+ _Py_AllocatedBlocks--;
+ return result;
+ }
}
/* free */
-#undef PyObject_Free
-void
-PyObject_Free(void *p)
+static void
+_PyObject_Free(void *ctx, void *p)
{
poolp pool;
block *lastfree;
@@ -978,6 +1314,8 @@ PyObject_Free(void *p)
if (p == NULL) /* free(NULL) has no effect */
return;
+ _Py_AllocatedBlocks--;
+
#ifdef WITH_VALGRIND
if (UNLIKELY(running_on_valgrind > 0))
goto redirect;
@@ -1072,11 +1410,8 @@ PyObject_Free(void *p)
unused_arena_objects = ao;
/* Free the entire arena. */
-#ifdef ARENAS_USE_MMAP
- munmap((void *)ao->address, ARENA_SIZE);
-#else
- free((void *)ao->address);
-#endif
+ _PyObject_Arena.free(_PyObject_Arena.ctx,
+ (void *)ao->address, ARENA_SIZE);
ao->address = 0; /* mark unassociated */
--narenas_currently_allocated;
@@ -1185,7 +1520,7 @@ PyObject_Free(void *p)
redirect:
#endif
/* We didn't allocate this address. */
- free(p);
+ PyMem_Free(p);
}
/* realloc. If p is NULL, this acts like malloc(nbytes). Else if nbytes==0,
@@ -1193,9 +1528,8 @@ redirect:
* return a non-NULL result.
*/
-#undef PyObject_Realloc
-void *
-PyObject_Realloc(void *p, size_t nbytes)
+static void *
+_PyObject_Realloc(void *ctx, void *p, size_t nbytes)
{
void *bp;
poolp pool;
@@ -1205,16 +1539,7 @@ PyObject_Realloc(void *p, size_t nbytes)
#endif
if (p == NULL)
- return PyObject_Malloc(nbytes);
-
- /*
- * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
- * Most python internals blindly use a signed Py_ssize_t to track
- * things without checking for overflows or negatives.
- * As size_t is unsigned, checking for nbytes < 0 is not required.
- */
- if (nbytes > PY_SSIZE_T_MAX)
- return NULL;
+ return _PyObject_Malloc(ctx, nbytes);
#ifdef WITH_VALGRIND
/* Treat running_on_valgrind == -1 the same as 0 */
@@ -1242,10 +1567,10 @@ PyObject_Realloc(void *p, size_t nbytes)
}
size = nbytes;
}
- bp = PyObject_Malloc(nbytes);
+ bp = _PyObject_Malloc(ctx, nbytes);
if (bp != NULL) {
memcpy(bp, p, size);
- PyObject_Free(p);
+ _PyObject_Free(ctx, p);
}
return bp;
}
@@ -1263,14 +1588,14 @@ PyObject_Realloc(void *p, size_t nbytes)
* at p. Instead we punt: let C continue to manage this block.
*/
if (nbytes)
- return realloc(p, nbytes);
+ return PyMem_Realloc(p, nbytes);
/* C doesn't define the result of realloc(p, 0) (it may or may not
* return NULL then), but Python's docs promise that nbytes==0 never
* returns NULL. We don't pass 0 to realloc(), to avoid that endcase
* to begin with. Even then, we can't be sure that realloc() won't
* return NULL.
*/
- bp = realloc(p, 1);
+ bp = PyMem_Realloc(p, 1);
return bp ? bp : p;
}
@@ -1280,23 +1605,12 @@ PyObject_Realloc(void *p, size_t nbytes)
/* pymalloc not enabled: Redirect the entry points to malloc. These will
* only be used by extensions that are compiled with pymalloc enabled. */
-void *
-PyObject_Malloc(size_t n)
-{
- return PyMem_MALLOC(n);
-}
-
-void *
-PyObject_Realloc(void *p, size_t n)
+Py_ssize_t
+_Py_GetAllocatedBlocks(void)
{
- return PyMem_REALLOC(p, n);
+ return 0;
}
-void
-PyObject_Free(void *p)
-{
- PyMem_FREE(p);
-}
#endif /* WITH_PYMALLOC */
#ifdef PYMALLOC_DEBUG
@@ -1316,10 +1630,6 @@ PyObject_Free(void *p)
#define DEADBYTE 0xDB /* dead (newly freed) memory */
#define FORBIDDENBYTE 0xFB /* untouchable bytes at each end of a block */
-/* We tag each block with an API ID in order to tag API violations */
-#define _PYMALLOC_MEM_ID 'm' /* the PyMem_Malloc() API */
-#define _PYMALLOC_OBJ_ID 'o' /* The PyObject_Malloc() API */
-
static size_t serialno = 0; /* incremented on each debug {m,re}alloc */
/* serialno is always incremented via calling this routine. The point is
@@ -1402,58 +1712,18 @@ p[2*S: 2*S+n]
p[2*S+n: 2*S+n+S]
Copies of FORBIDDENBYTE. Used to catch over- writes and reads.
p[2*S+n+S: 2*S+n+2*S]
- A serial number, incremented by 1 on each call to _PyObject_DebugMalloc
- and _PyObject_DebugRealloc.
+ A serial number, incremented by 1 on each call to _PyMem_DebugMalloc
+ and _PyMem_DebugRealloc.
This is a big-endian size_t.
If "bad memory" is detected later, the serial number gives an
excellent way to set a breakpoint on the next run, to capture the
instant at which this block was passed out.
*/
-/* debug replacements for the PyMem_* memory API */
-void *
-_PyMem_DebugMalloc(size_t nbytes)
-{
- return _PyObject_DebugMallocApi(_PYMALLOC_MEM_ID, nbytes);
-}
-void *
-_PyMem_DebugRealloc(void *p, size_t nbytes)
-{
- return _PyObject_DebugReallocApi(_PYMALLOC_MEM_ID, p, nbytes);
-}
-void
-_PyMem_DebugFree(void *p)
-{
- _PyObject_DebugFreeApi(_PYMALLOC_MEM_ID, p);
-}
-
-/* debug replacements for the PyObject_* memory API */
-void *
-_PyObject_DebugMalloc(size_t nbytes)
-{
- return _PyObject_DebugMallocApi(_PYMALLOC_OBJ_ID, nbytes);
-}
-void *
-_PyObject_DebugRealloc(void *p, size_t nbytes)
-{
- return _PyObject_DebugReallocApi(_PYMALLOC_OBJ_ID, p, nbytes);
-}
-void
-_PyObject_DebugFree(void *p)
-{
- _PyObject_DebugFreeApi(_PYMALLOC_OBJ_ID, p);
-}
-void
-_PyObject_DebugCheckAddress(const void *p)
-{
- _PyObject_DebugCheckAddressApi(_PYMALLOC_OBJ_ID, p);
-}
-
-
-/* generic debug memory api, with an "id" to identify the API in use */
-void *
-_PyObject_DebugMallocApi(char id, size_t nbytes)
+static void *
+_PyMem_DebugMalloc(void *ctx, size_t nbytes)
{
+ debug_alloc_api_t *api = (debug_alloc_api_t *)ctx;
uchar *p; /* base address of malloc'ed block */
uchar *tail; /* p + 2*SST + nbytes == pointer to tail pad bytes */
size_t total; /* nbytes + 4*SST */
@@ -1464,14 +1734,14 @@ _PyObject_DebugMallocApi(char id, size_t nbytes)
/* overflow: can't represent total as a size_t */
return NULL;
- p = (uchar *)PyObject_Malloc(total);
+ p = (uchar *)api->alloc.malloc(api->alloc.ctx, total);
if (p == NULL)
return NULL;
/* at p, write size (SST bytes), id (1 byte), pad (SST-1 bytes) */
write_size_t(p, nbytes);
- p[SST] = (uchar)id;
- memset(p + SST + 1 , FORBIDDENBYTE, SST-1);
+ p[SST] = (uchar)api->api_id;
+ memset(p + SST + 1, FORBIDDENBYTE, SST-1);
if (nbytes > 0)
memset(p + 2*SST, CLEANBYTE, nbytes);
@@ -1489,35 +1759,37 @@ _PyObject_DebugMallocApi(char id, size_t nbytes)
Then fills the original bytes with DEADBYTE.
Then calls the underlying free.
*/
-void
-_PyObject_DebugFreeApi(char api, void *p)
+static void
+_PyMem_DebugFree(void *ctx, void *p)
{
+ debug_alloc_api_t *api = (debug_alloc_api_t *)ctx;
uchar *q = (uchar *)p - 2*SST; /* address returned from malloc */
size_t nbytes;
if (p == NULL)
return;
- _PyObject_DebugCheckAddressApi(api, p);
+ _PyMem_DebugCheckAddress(api->api_id, p);
nbytes = read_size_t(q);
nbytes += 4*SST;
if (nbytes > 0)
memset(q, DEADBYTE, nbytes);
- PyObject_Free(q);
+ api->alloc.free(api->alloc.ctx, q);
}
-void *
-_PyObject_DebugReallocApi(char api, void *p, size_t nbytes)
+static void *
+_PyMem_DebugRealloc(void *ctx, void *p, size_t nbytes)
{
- uchar *q = (uchar *)p;
+ debug_alloc_api_t *api = (debug_alloc_api_t *)ctx;
+ uchar *q = (uchar *)p, *oldq;
uchar *tail;
size_t total; /* nbytes + 4*SST */
size_t original_nbytes;
int i;
if (p == NULL)
- return _PyObject_DebugMallocApi(api, nbytes);
+ return _PyMem_DebugMalloc(ctx, nbytes);
- _PyObject_DebugCheckAddressApi(api, p);
+ _PyMem_DebugCheckAddress(api->api_id, p);
bumpserialno();
original_nbytes = read_size_t(q - 2*SST);
total = nbytes + 4*SST;
@@ -1525,24 +1797,26 @@ _PyObject_DebugReallocApi(char api, void *p, size_t nbytes)
/* overflow: can't represent total as a size_t */
return NULL;
- if (nbytes < original_nbytes) {
- /* shrinking: mark old extra memory dead */
- memset(q + nbytes, DEADBYTE, original_nbytes - nbytes + 2*SST);
- }
-
/* Resize and add decorations. We may get a new pointer here, in which
* case we didn't get the chance to mark the old memory with DEADBYTE,
* but we live with that.
*/
- q = (uchar *)PyObject_Realloc(q - 2*SST, total);
+ oldq = q;
+ q = (uchar *)api->alloc.realloc(api->alloc.ctx, q - 2*SST, total);
if (q == NULL)
return NULL;
+ if (q == oldq && nbytes < original_nbytes) {
+ /* shrinking: mark old extra memory dead */
+ memset(q + nbytes, DEADBYTE, original_nbytes - nbytes);
+ }
+
write_size_t(q, nbytes);
- assert(q[SST] == (uchar)api);
+ assert(q[SST] == (uchar)api->api_id);
for (i = 1; i < SST; ++i)
assert(q[SST + i] == FORBIDDENBYTE);
q += 2*SST;
+
tail = q + nbytes;
memset(tail, FORBIDDENBYTE, SST);
write_size_t(tail + SST, serialno);
@@ -1561,8 +1835,8 @@ _PyObject_DebugReallocApi(char api, void *p, size_t nbytes)
* and call Py_FatalError to kill the program.
* The API id, is also checked.
*/
- void
-_PyObject_DebugCheckAddressApi(char api, const void *p)
+static void
+_PyMem_DebugCheckAddress(char api, const void *p)
{
const uchar *q = (const uchar *)p;
char msgbuf[64];
@@ -1614,7 +1888,7 @@ error:
}
/* Display info to stderr about the memory block at p. */
-void
+static void
_PyObject_DebugDumpAddress(const void *p)
{
const uchar *q = (const uchar *)p;
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index 214b455..ba51fec 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -318,195 +318,6 @@ range_item(rangeobject *r, Py_ssize_t i)
return res;
}
-/* Additional helpers, since the standard slice helpers
- * all clip to PY_SSIZE_T_MAX
- */
-
-/* Replace _PyEval_SliceIndex */
-static PyObject *
-compute_slice_element(PyObject *obj)
-{
- PyObject *result = NULL;
- if (obj != NULL) {
- if (PyIndex_Check(obj)) {
- result = PyNumber_Index(obj);
- }
- else {
- PyErr_SetString(PyExc_TypeError,
- "slice indices must be integers or "
- "None or have an __index__ method");
- }
- }
- return result;
-}
-
-/* Replace PySlice_GetIndicesEx
- * Result indicates whether or not the slice is empty
- * (-1 = error, 0 = empty slice, 1 = slice contains elements)
- */
-static int
-compute_slice_indices(rangeobject *r, PySliceObject *slice,
- PyObject **start, PyObject **stop, PyObject **step)
-{
- int cmp_result, has_elements;
- Py_ssize_t clamped_step = 0;
- PyObject *zero = NULL, *one = NULL, *neg_one = NULL, *candidate = NULL;
- PyObject *tmp_start = NULL, *tmp_stop = NULL, *tmp_step = NULL;
- zero = PyLong_FromLong(0);
- if (zero == NULL) goto Fail;
- one = PyLong_FromLong(1);
- if (one == NULL) goto Fail;
- neg_one = PyLong_FromLong(-1);
- if (neg_one == NULL) goto Fail;
-
- /* Calculate step value */
- if (slice->step == Py_None) {
- clamped_step = 1;
- tmp_step = one;
- Py_INCREF(tmp_step);
- } else {
- if (!_PyEval_SliceIndex(slice->step, &clamped_step)) goto Fail;
- if (clamped_step == 0) {
- PyErr_SetString(PyExc_ValueError,
- "slice step cannot be zero");
- goto Fail;
- }
- tmp_step = compute_slice_element(slice->step);
- if (tmp_step == NULL) goto Fail;
- }
-
- /* Calculate start value */
- if (slice->start == Py_None) {
- if (clamped_step < 0) {
- tmp_start = PyNumber_Subtract(r->length, one);
- if (tmp_start == NULL) goto Fail;
- } else {
- tmp_start = zero;
- Py_INCREF(tmp_start);
- }
- } else {
- candidate = compute_slice_element(slice->start);
- if (candidate == NULL) goto Fail;
- cmp_result = PyObject_RichCompareBool(candidate, zero, Py_LT);
- if (cmp_result == -1) goto Fail;
- if (cmp_result) {
- /* candidate < 0 */
- tmp_start = PyNumber_Add(r->length, candidate);
- if (tmp_start == NULL) goto Fail;
- Py_CLEAR(candidate);
- } else {
- /* candidate >= 0 */
- tmp_start = candidate;
- candidate = NULL;
- }
- cmp_result = PyObject_RichCompareBool(tmp_start, zero, Py_LT);
- if (cmp_result == -1) goto Fail;
- if (cmp_result) {
- /* tmp_start < 0 */
- Py_CLEAR(tmp_start);
- if (clamped_step < 0) {
- tmp_start = neg_one;
- } else {
- tmp_start = zero;
- }
- Py_INCREF(tmp_start);
- } else {
- /* tmp_start >= 0 */
- cmp_result = PyObject_RichCompareBool(tmp_start, r->length, Py_GE);
- if (cmp_result == -1) goto Fail;
- if (cmp_result) {
- /* tmp_start >= r->length */
- Py_CLEAR(tmp_start);
- if (clamped_step < 0) {
- tmp_start = PyNumber_Subtract(r->length, one);
- if (tmp_start == NULL) goto Fail;
- } else {
- tmp_start = r->length;
- Py_INCREF(tmp_start);
- }
- }
- }
- }
-
- /* Calculate stop value */
- if (slice->stop == Py_None) {
- if (clamped_step < 0) {
- tmp_stop = neg_one;
- } else {
- tmp_stop = r->length;
- }
- Py_INCREF(tmp_stop);
- } else {
- candidate = compute_slice_element(slice->stop);
- if (candidate == NULL) goto Fail;
- cmp_result = PyObject_RichCompareBool(candidate, zero, Py_LT);
- if (cmp_result == -1) goto Fail;
- if (cmp_result) {
- /* candidate < 0 */
- tmp_stop = PyNumber_Add(r->length, candidate);
- if (tmp_stop == NULL) goto Fail;
- Py_CLEAR(candidate);
- } else {
- /* candidate >= 0 */
- tmp_stop = candidate;
- candidate = NULL;
- }
- cmp_result = PyObject_RichCompareBool(tmp_stop, zero, Py_LT);
- if (cmp_result == -1) goto Fail;
- if (cmp_result) {
- /* tmp_stop < 0 */
- Py_CLEAR(tmp_stop);
- if (clamped_step < 0) {
- tmp_stop = neg_one;
- } else {
- tmp_stop = zero;
- }
- Py_INCREF(tmp_stop);
- } else {
- /* tmp_stop >= 0 */
- cmp_result = PyObject_RichCompareBool(tmp_stop, r->length, Py_GE);
- if (cmp_result == -1) goto Fail;
- if (cmp_result) {
- /* tmp_stop >= r->length */
- Py_CLEAR(tmp_stop);
- if (clamped_step < 0) {
- tmp_stop = PyNumber_Subtract(r->length, one);
- if (tmp_stop == NULL) goto Fail;
- } else {
- tmp_stop = r->length;
- Py_INCREF(tmp_stop);
- }
- }
- }
- }
-
- /* Check if the slice is empty or not */
- if (clamped_step < 0) {
- has_elements = PyObject_RichCompareBool(tmp_start, tmp_stop, Py_GT);
- } else {
- has_elements = PyObject_RichCompareBool(tmp_start, tmp_stop, Py_LT);
- }
- if (has_elements == -1) goto Fail;
-
- *start = tmp_start;
- *stop = tmp_stop;
- *step = tmp_step;
- Py_DECREF(neg_one);
- Py_DECREF(one);
- Py_DECREF(zero);
- return has_elements;
-
- Fail:
- Py_XDECREF(tmp_start);
- Py_XDECREF(tmp_stop);
- Py_XDECREF(tmp_step);
- Py_XDECREF(candidate);
- Py_XDECREF(neg_one);
- Py_XDECREF(one);
- Py_XDECREF(zero);
- return -1;
-}
-
static PyObject *
compute_slice(rangeobject *r, PyObject *_slice)
{
@@ -514,10 +325,11 @@ compute_slice(rangeobject *r, PyObject *_slice)
rangeobject *result;
PyObject *start = NULL, *stop = NULL, *step = NULL;
PyObject *substart = NULL, *substop = NULL, *substep = NULL;
- int has_elements;
+ int error;
- has_elements = compute_slice_indices(r, slice, &start, &stop, &step);
- if (has_elements == -1) return NULL;
+ error = _PySlice_GetLongIndices(slice, r->length, &start, &stop, &step);
+ if (error == -1)
+ return NULL;
substep = PyNumber_Multiply(r->step, step);
if (substep == NULL) goto fail;
@@ -527,13 +339,8 @@ compute_slice(rangeobject *r, PyObject *_slice)
if (substart == NULL) goto fail;
Py_CLEAR(start);
- if (has_elements) {
- substop = compute_item(r, stop);
- if (substop == NULL) goto fail;
- } else {
- substop = substart;
- Py_INCREF(substop);
- }
+ substop = compute_item(r, stop);
+ if (substop == NULL) goto fail;
Py_CLEAR(stop);
result = make_range_object(Py_TYPE(r), substart, substop, substep);
diff --git a/Objects/setobject.c b/Objects/setobject.c
index ea5a24c..f84c929 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -68,6 +68,11 @@ chaining would be substantial (100% with typical malloc overhead).
The initial probe index is computed as hash mod the table size. Subsequent
probe indices are computed as explained in Objects/dictobject.c.
+To improve cache locality, each probe is done in pairs.
+After the probe is examined, an adjacent entry is then examined as well.
+The likelihood is that an adjacent entry is in the same cache line and
+can be examined more cheaply than another probe elsewhere in memory.
+
All arithmetic on hash should ignore overflow.
Unlike the dictionary implementation, the lookkey functions can return
@@ -75,26 +80,54 @@ NULL if the rich comparison returns an error.
*/
static setentry *
-set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
+set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
{
- register size_t i; /* Unsigned for defined overflow behavior. */
- register size_t perturb;
- register setentry *freeslot;
- register size_t mask = so->mask;
+ size_t i, j; /* Unsigned for defined overflow behavior. */
+ size_t perturb;
+ setentry *freeslot;
+ size_t mask = so->mask;
setentry *table = so->table;
- register setentry *entry;
- register int cmp;
+ setentry *entry;
+ int cmp;
PyObject *startkey;
i = (size_t)hash & mask;
entry = &table[i];
if (entry->key == NULL || entry->key == key)
return entry;
+ if (entry->hash == hash && entry->key != dummy) {
+ startkey = entry->key;
+ Py_INCREF(startkey);
+ cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
+ Py_DECREF(startkey);
+ if (cmp < 0)
+ return NULL;
+ if (table == so->table && entry->key == startkey) {
+ if (cmp > 0)
+ return entry;
+ }
+ else {
+ /* Start over if the compare altered the set */
+ return set_lookkey(so, key, hash);
+ }
+ }
+ freeslot = (entry->key == dummy) ? entry : NULL;
- if (entry->key == dummy)
- freeslot = entry;
- else {
- if (entry->hash == hash) {
+ /* In the loop, key == dummy is by far (factor of 100s)
+ the least likely outcome, so test for that last. */
+ j = i;
+ perturb = hash;
+ while (1) {
+ j ^= 1;
+ entry = &table[j];
+ if (entry->key == NULL) {
+ if (freeslot != NULL)
+ entry = freeslot;
+ break;
+ }
+ if (entry->key == key)
+ break;
+ if (entry->hash == hash && entry->key != dummy) {
startkey = entry->key;
Py_INCREF(startkey);
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -103,23 +136,20 @@ set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
return NULL;
if (table == so->table && entry->key == startkey) {
if (cmp > 0)
- return entry;
+ break;
}
else {
- /* The compare did major nasty stuff to the
- * set: start over.
- */
return set_lookkey(so, key, hash);
}
}
- freeslot = NULL;
- }
+ if (entry->key == dummy && freeslot == NULL)
+ freeslot = entry;
+
+ i = i * 5 + perturb + 1;
+ j = i & mask;
+ perturb >>= PERTURB_SHIFT;
- /* In the loop, key == dummy is by far (factor of 100s) the
- least likely outcome, so test for that last. */
- for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
- i = (i << 2) + i + perturb + 1;
- entry = &table[i & mask];
+ entry = &table[j];
if (entry->key == NULL) {
if (freeslot != NULL)
entry = freeslot;
@@ -139,14 +169,12 @@ set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
break;
}
else {
- /* The compare did major nasty stuff to the
- * set: start over.
- */
return set_lookkey(so, key, hash);
}
}
- else if (entry->key == dummy && freeslot == NULL)
+ if (entry->key == dummy && freeslot == NULL)
freeslot = entry;
+
}
return entry;
}
@@ -157,14 +185,14 @@ set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
* see if the comparison altered the table.
*/
static setentry *
-set_lookkey_unicode(PySetObject *so, PyObject *key, register Py_hash_t hash)
+set_lookkey_unicode(PySetObject *so, PyObject *key, Py_hash_t hash)
{
- register size_t i; /* Unsigned for defined overflow behavior. */
- register size_t perturb;
- register setentry *freeslot;
- register size_t mask = so->mask;
+ size_t i, j; /* Unsigned for defined overflow behavior. */
+ size_t perturb;
+ setentry *freeslot;
+ size_t mask = so->mask;
setentry *table = so->table;
- register setentry *entry;
+ setentry *entry;
/* Make sure this function doesn't have to handle non-unicode keys,
including subclasses of str; e.g., one reason to subclass
@@ -174,6 +202,7 @@ set_lookkey_unicode(PySetObject *so, PyObject *key, register Py_hash_t hash)
so->lookup = set_lookkey;
return set_lookkey(so, key, hash);
}
+
i = (size_t)hash & mask;
entry = &table[i];
if (entry->key == NULL || entry->key == key)
@@ -186,11 +215,26 @@ set_lookkey_unicode(PySetObject *so, PyObject *key, register Py_hash_t hash)
freeslot = NULL;
}
- /* In the loop, key == dummy is by far (factor of 100s) the
- least likely outcome, so test for that last. */
- for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
- i = (i << 2) + i + perturb + 1;
- entry = &table[i & mask];
+ j = i;
+ perturb = hash;
+ while (1) {
+ j ^= 1;
+ entry = &table[j];
+ if (entry->key == NULL)
+ return freeslot == NULL ? entry : freeslot;
+ if (entry->key == key
+ || (entry->hash == hash
+ && entry->key != dummy
+ && unicode_eq(entry->key, key)))
+ return entry;
+ if (entry->key == dummy && freeslot == NULL)
+ freeslot = entry;
+
+ i = i * 5 + perturb + 1;
+ j = i & mask;
+ perturb >>= PERTURB_SHIFT;
+
+ entry = &table[j];
if (entry->key == NULL)
return freeslot == NULL ? entry : freeslot;
if (entry->key == key
@@ -211,9 +255,9 @@ Used by the public insert routine.
Eats a reference to key.
*/
static int
-set_insert_key(register PySetObject *so, PyObject *key, Py_hash_t hash)
+set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
{
- register setentry *entry;
+ setentry *entry;
assert(so->lookup != NULL);
entry = so->lookup(so, key, hash);
@@ -247,19 +291,25 @@ Note that no refcounts are changed by this routine; if needed, the caller
is responsible for incref'ing `key`.
*/
static void
-set_insert_clean(register PySetObject *so, PyObject *key, Py_hash_t hash)
+set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash)
{
- register size_t i;
- register size_t perturb;
- register size_t mask = (size_t)so->mask;
setentry *table = so->table;
- register setentry *entry;
+ setentry *entry;
+ size_t perturb = hash;
+ size_t mask = (size_t)so->mask;
+ size_t i, j;
- i = (size_t)hash & mask;
- entry = &table[i];
- for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) {
- i = (i << 2) + i + perturb + 1;
- entry = &table[i & mask];
+ i = j = (size_t)hash & mask;
+ while (1) {
+ entry = &table[j];
+ if (entry->key == NULL)
+ break;
+ entry = &table[j ^ 1];
+ if (entry->key == NULL)
+ break;
+ i = i * 5 + perturb + 1;
+ j = i & mask;
+ perturb >>= PERTURB_SHIFT;
}
so->fill++;
entry->key = key;
@@ -280,6 +330,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
Py_ssize_t i;
int is_oldtable_malloced;
setentry small_copy[PySet_MINSIZE];
+ PyObject *dummy_entry;
assert(minused >= 0);
@@ -336,11 +387,12 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
/* Copy the data over; this is refcount-neutral for active entries;
dummy entries aren't copied over, of course */
+ dummy_entry = dummy;
for (entry = oldtable; i > 0; entry++) {
if (entry->key == NULL) {
/* UNUSED */
;
- } else if (entry->key == dummy) {
+ } else if (entry->key == dummy_entry) {
/* DUMMY */
--i;
assert(entry->key == dummy);
@@ -360,9 +412,9 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
/* CAUTION: set_add_key/entry() must guarantee it won't resize the table */
static int
-set_add_entry(register PySetObject *so, setentry *entry)
+set_add_entry(PySetObject *so, setentry *entry)
{
- register Py_ssize_t n_used;
+ Py_ssize_t n_used;
PyObject *key = entry->key;
Py_hash_t hash = entry->hash;
@@ -379,10 +431,10 @@ set_add_entry(register PySetObject *so, setentry *entry)
}
static int
-set_add_key(register PySetObject *so, PyObject *key)
+set_add_key(PySetObject *so, PyObject *key)
{
- register Py_hash_t hash;
- register Py_ssize_t n_used;
+ Py_hash_t hash;
+ Py_ssize_t n_used;
if (!PyUnicode_CheckExact(key) ||
(hash = ((PyASCIIObject *) key)->hash) == -1) {
@@ -407,7 +459,7 @@ set_add_key(register PySetObject *so, PyObject *key)
static int
set_discard_entry(PySetObject *so, setentry *oldentry)
-{ register setentry *entry;
+{ setentry *entry;
PyObject *old_key;
entry = (so->lookup)(so, oldentry->key, oldentry->hash);
@@ -426,8 +478,8 @@ set_discard_entry(PySetObject *so, setentry *oldentry)
static int
set_discard_key(PySetObject *so, PyObject *key)
{
- register Py_hash_t hash;
- register setentry *entry;
+ Py_hash_t hash;
+ setentry *entry;
PyObject *old_key;
assert (PyAnySet_Check(so));
@@ -533,7 +585,7 @@ set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
{
Py_ssize_t i;
Py_ssize_t mask;
- register setentry *table;
+ setentry *table;
assert (PyAnySet_Check(so));
i = *pos_ptr;
@@ -553,7 +605,7 @@ set_next(PySetObject *so, Py_ssize_t *pos_ptr, setentry **entry_ptr)
static void
set_dealloc(PySetObject *so)
{
- register setentry *entry;
+ setentry *entry;
Py_ssize_t fill = so->fill;
PyObject_GC_UnTrack(so);
Py_TRASHCAN_SAFE_BEGIN(so)
@@ -631,9 +683,10 @@ set_merge(PySetObject *so, PyObject *otherset)
{
PySetObject *other;
PyObject *key;
+ PyObject *dummy_entry;
Py_hash_t hash;
- register Py_ssize_t i;
- register setentry *entry;
+ Py_ssize_t i;
+ setentry *entry;
assert (PyAnySet_Check(so));
assert (PyAnySet_Check(otherset));
@@ -650,12 +703,13 @@ set_merge(PySetObject *so, PyObject *otherset)
if (set_table_resize(so, (so->used + other->used)*2) != 0)
return -1;
}
+ dummy_entry = dummy;
for (i = 0; i <= other->mask; i++) {
entry = &other->table[i];
key = entry->key;
hash = entry->hash;
if (key != NULL &&
- key != dummy) {
+ key != dummy_entry) {
Py_INCREF(key);
if (set_insert_key(so, key, hash) == -1) {
Py_DECREF(key);
@@ -701,8 +755,8 @@ set_contains_entry(PySetObject *so, setentry *entry)
static PyObject *
set_pop(PySetObject *so)
{
- register Py_ssize_t i = 0;
- register setentry *entry;
+ Py_ssize_t i = 0;
+ setentry *entry;
PyObject *key;
assert (PyAnySet_Check(so));
@@ -869,8 +923,8 @@ static PyMethodDef setiter_methods[] = {
static PyObject *setiter_iternext(setiterobject *si)
{
PyObject *key;
- register Py_ssize_t i, mask;
- register setentry *entry;
+ Py_ssize_t i, mask;
+ setentry *entry;
PySetObject *so = si->si_set;
if (so == NULL)
@@ -1024,7 +1078,7 @@ PyDoc_STRVAR(update_doc,
static PyObject *
make_new_set(PyTypeObject *type, PyObject *iterable)
{
- register PySetObject *so = NULL;
+ PySetObject *so = NULL;
if (dummy == NULL) { /* Auto-initialize dummy */
dummy = PyUnicode_FromString("<dummy key>");
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index 1593335..52f1c89 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -299,23 +299,198 @@ static PyMemberDef slice_members[] = {
{0}
};
+/* Helper function to convert a slice argument to a PyLong, and raise TypeError
+ with a suitable message on failure. */
+
static PyObject*
-slice_indices(PySliceObject* self, PyObject* len)
+evaluate_slice_index(PyObject *v)
{
- Py_ssize_t ilen, start, stop, step, slicelength;
+ if (PyIndex_Check(v)) {
+ return PyNumber_Index(v);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "slice indices must be integers or "
+ "None or have an __index__ method");
+ return NULL;
+ }
+}
- ilen = PyNumber_AsSsize_t(len, PyExc_OverflowError);
+/* Compute slice indices given a slice and length. Return -1 on failure. Used
+ by slice.indices and rangeobject slicing. Assumes that `len` is a
+ nonnegative instance of PyLong. */
- if (ilen == -1 && PyErr_Occurred()) {
- return NULL;
+int
+_PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
+ PyObject **start_ptr, PyObject **stop_ptr,
+ PyObject **step_ptr)
+{
+ PyObject *start=NULL, *stop=NULL, *step=NULL;
+ PyObject *upper=NULL, *lower=NULL;
+ int step_is_negative, cmp_result;
+
+ /* Convert step to an integer; raise for zero step. */
+ if (self->step == Py_None) {
+ step = PyLong_FromLong(1L);
+ if (step == NULL)
+ goto error;
+ step_is_negative = 0;
+ }
+ else {
+ int step_sign;
+ step = evaluate_slice_index(self->step);
+ if (step == NULL)
+ goto error;
+ step_sign = _PyLong_Sign(step);
+ if (step_sign == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "slice step cannot be zero");
+ goto error;
+ }
+ step_is_negative = step_sign < 0;
+ }
+
+ /* Find lower and upper bounds for start and stop. */
+ if (step_is_negative) {
+ lower = PyLong_FromLong(-1L);
+ if (lower == NULL)
+ goto error;
+
+ upper = PyNumber_Add(length, lower);
+ if (upper == NULL)
+ goto error;
+ }
+ else {
+ lower = PyLong_FromLong(0L);
+ if (lower == NULL)
+ goto error;
+
+ upper = length;
+ Py_INCREF(upper);
}
- if (PySlice_GetIndicesEx((PyObject*)self, ilen, &start, &stop,
- &step, &slicelength) < 0) {
+ /* Compute start. */
+ if (self->start == Py_None) {
+ start = step_is_negative ? upper : lower;
+ Py_INCREF(start);
+ }
+ else {
+ start = evaluate_slice_index(self->start);
+ if (start == NULL)
+ goto error;
+
+ if (_PyLong_Sign(start) < 0) {
+ /* start += length */
+ PyObject *tmp = PyNumber_Add(start, length);
+ Py_DECREF(start);
+ start = tmp;
+ if (start == NULL)
+ goto error;
+
+ cmp_result = PyObject_RichCompareBool(start, lower, Py_LT);
+ if (cmp_result < 0)
+ goto error;
+ if (cmp_result) {
+ Py_INCREF(lower);
+ Py_DECREF(start);
+ start = lower;
+ }
+ }
+ else {
+ cmp_result = PyObject_RichCompareBool(start, upper, Py_GT);
+ if (cmp_result < 0)
+ goto error;
+ if (cmp_result) {
+ Py_INCREF(upper);
+ Py_DECREF(start);
+ start = upper;
+ }
+ }
+ }
+
+ /* Compute stop. */
+ if (self->stop == Py_None) {
+ stop = step_is_negative ? lower : upper;
+ Py_INCREF(stop);
+ }
+ else {
+ stop = evaluate_slice_index(self->stop);
+ if (stop == NULL)
+ goto error;
+
+ if (_PyLong_Sign(stop) < 0) {
+ /* stop += length */
+ PyObject *tmp = PyNumber_Add(stop, length);
+ Py_DECREF(stop);
+ stop = tmp;
+ if (stop == NULL)
+ goto error;
+
+ cmp_result = PyObject_RichCompareBool(stop, lower, Py_LT);
+ if (cmp_result < 0)
+ goto error;
+ if (cmp_result) {
+ Py_INCREF(lower);
+ Py_DECREF(stop);
+ stop = lower;
+ }
+ }
+ else {
+ cmp_result = PyObject_RichCompareBool(stop, upper, Py_GT);
+ if (cmp_result < 0)
+ goto error;
+ if (cmp_result) {
+ Py_INCREF(upper);
+ Py_DECREF(stop);
+ stop = upper;
+ }
+ }
+ }
+
+ *start_ptr = start;
+ *stop_ptr = stop;
+ *step_ptr = step;
+ Py_DECREF(upper);
+ Py_DECREF(lower);
+ return 0;
+
+ error:
+ *start_ptr = *stop_ptr = *step_ptr = NULL;
+ Py_XDECREF(start);
+ Py_XDECREF(stop);
+ Py_XDECREF(step);
+ Py_XDECREF(upper);
+ Py_XDECREF(lower);
+ return -1;
+}
+
+/* Implementation of slice.indices. */
+
+static PyObject*
+slice_indices(PySliceObject* self, PyObject* len)
+{
+ PyObject *start, *stop, *step;
+ PyObject *length;
+ int error;
+
+ /* Convert length to an integer if necessary; raise for negative length. */
+ length = PyNumber_Index(len);
+ if (length == NULL)
+ return NULL;
+
+ if (_PyLong_Sign(length) < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "length should not be negative");
+ Py_DECREF(length);
return NULL;
}
- return Py_BuildValue("(nnn)", start, stop, step);
+ error = _PySlice_GetLongIndices(self, length, &start, &stop, &step);
+ Py_DECREF(length);
+ if (error == -1)
+ return NULL;
+ else
+ return Py_BuildValue("(NNN)", start, stop, step);
}
PyDoc_STRVAR(slice_indices_doc,
diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h
index f62813d..d0fc18d 100644
--- a/Objects/stringlib/asciilib.h
+++ b/Objects/stringlib/asciilib.h
@@ -19,7 +19,6 @@
#define STRINGLIB_STR PyUnicode_1BYTE_DATA
#define STRINGLIB_LEN PyUnicode_GET_LENGTH
#define STRINGLIB_NEW(STR,LEN) _PyUnicode_FromASCII((char*)(STR),(LEN))
-#define STRINGLIB_RESIZE not_supported
#define STRINGLIB_CHECK PyUnicode_Check
#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h
index f353367..57319c6 100644
--- a/Objects/stringlib/codecs.h
+++ b/Objects/stringlib/codecs.h
@@ -38,8 +38,8 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end,
*/
if (_Py_IS_ALIGNED(s, SIZEOF_LONG)) {
/* Help register allocation */
- register const char *_s = s;
- register STRINGLIB_CHAR *_p = p;
+ const char *_s = s;
+ STRINGLIB_CHAR *_p = p;
while (_s < aligned_end) {
/* Read a whole long at a time (either 4 or 8 bytes),
and do a fast unrolled copy if it only contains ASCII
@@ -47,7 +47,7 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end,
unsigned long value = *(unsigned long *) _s;
if (value & ASCII_CHAR_MASK)
break;
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+#if PY_LITTLE_ENDIAN
_p[0] = (STRINGLIB_CHAR)(value & 0xFFu);
_p[1] = (STRINGLIB_CHAR)((value >> 8) & 0xFFu);
_p[2] = (STRINGLIB_CHAR)((value >> 16) & 0xFFu);
@@ -486,7 +486,7 @@ STRINGLIB(utf16_decode)(const unsigned char **inptr, const unsigned char *e,
const unsigned char *q = *inptr;
STRINGLIB_CHAR *p = dest + *outpos;
/* Offsets from q for retrieving byte pairs in the right order. */
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+#if PY_LITTLE_ENDIAN
int ihi = !!native_ordering, ilo = !native_ordering;
#else
int ihi = !native_ordering, ilo = !!native_ordering;
@@ -499,7 +499,7 @@ STRINGLIB(utf16_decode)(const unsigned char **inptr, const unsigned char *e,
reads are more expensive, better to defer to another iteration. */
if (_Py_IS_ALIGNED(q, SIZEOF_LONG)) {
/* Fast path for runs of in-range non-surrogate chars. */
- register const unsigned char *_q = q;
+ const unsigned char *_q = q;
while (_q < aligned_end) {
unsigned long block = * (unsigned long *) _q;
if (native_ordering) {
@@ -517,7 +517,7 @@ STRINGLIB(utf16_decode)(const unsigned char **inptr, const unsigned char *e,
block = SWAB(block);
#endif
}
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+#if PY_LITTLE_ENDIAN
# if SIZEOF_LONG == 4
p[0] = (STRINGLIB_CHAR)(block & 0xFFFFu);
p[1] = (STRINGLIB_CHAR)(block >> 16);
diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h
index 3e5f510..f8fd384 100644
--- a/Objects/stringlib/eq.h
+++ b/Objects/stringlib/eq.h
@@ -6,8 +6,8 @@
Py_LOCAL_INLINE(int)
unicode_eq(PyObject *aa, PyObject *bb)
{
- register PyUnicodeObject *a = (PyUnicodeObject *)aa;
- register PyUnicodeObject *b = (PyUnicodeObject *)bb;
+ PyUnicodeObject *a = (PyUnicodeObject *)aa;
+ PyUnicodeObject *b = (PyUnicodeObject *)bb;
if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) {
assert(0 && "unicode_eq ready fail");
diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h
index 55ac77d..cd7cac4 100644
--- a/Objects/stringlib/fastsearch.h
+++ b/Objects/stringlib/fastsearch.h
@@ -142,6 +142,8 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
mask = 0;
if (mode != FAST_RSEARCH) {
+ const STRINGLIB_CHAR *ss = s + m - 1;
+ const STRINGLIB_CHAR *pp = p + m - 1;
/* create compressed boyer-moore delta 1 table */
@@ -156,7 +158,7 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
for (i = 0; i <= w; i++) {
/* note: using mlast in the skip path slows things down on x86 */
- if (s[i+m-1] == p[m-1]) {
+ if (ss[i] == pp[0]) {
/* candidate match */
for (j = 0; j < mlast; j++)
if (s[i+j] != p[j])
@@ -172,13 +174,13 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
continue;
}
/* miss: check if next character is part of pattern */
- if (!STRINGLIB_BLOOM(mask, s[i+m]))
+ if (!STRINGLIB_BLOOM(mask, ss[i+1]))
i = i + m;
else
i = i + skip;
} else {
/* skip: check if next character is part of pattern */
- if (!STRINGLIB_BLOOM(mask, s[i+m]))
+ if (!STRINGLIB_BLOOM(mask, ss[i+1]))
i = i + m;
}
}
diff --git a/Objects/stringlib/find_max_char.h b/Objects/stringlib/find_max_char.h
index 06559c8..eb3fe88 100644
--- a/Objects/stringlib/find_max_char.h
+++ b/Objects/stringlib/find_max_char.h
@@ -24,7 +24,7 @@ STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end)
while (p < end) {
if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) {
/* Help register allocation */
- register const unsigned char *_p = p;
+ const unsigned char *_p = p;
while (_p < aligned_end) {
unsigned long value = *(unsigned long *) _p;
if (value & UCS1_ASCII_CHAR_MASK)
@@ -66,7 +66,7 @@ STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end)
#else
#error Invalid STRINGLIB_SIZEOF_CHAR (must be 1, 2 or 4)
#endif
- register Py_UCS4 mask;
+ Py_UCS4 mask;
Py_ssize_t n = end - begin;
const STRINGLIB_CHAR *p = begin;
const STRINGLIB_CHAR *unrolled_end = begin + _Py_SIZE_ROUND_DOWN(n, 4);
diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h
new file mode 100644
index 0000000..5568b31
--- /dev/null
+++ b/Objects/stringlib/join.h
@@ -0,0 +1,133 @@
+/* stringlib: bytes joining implementation */
+
+#if STRINGLIB_SIZEOF_CHAR != 1
+#error join.h only compatible with byte-wise strings
+#endif
+
+Py_LOCAL_INLINE(PyObject *)
+STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable)
+{
+ char *sepstr = STRINGLIB_STR(sep);
+ const Py_ssize_t seplen = STRINGLIB_LEN(sep);
+ PyObject *res = NULL;
+ char *p;
+ Py_ssize_t seqlen = 0;
+ Py_ssize_t sz = 0;
+ Py_ssize_t i, nbufs;
+ PyObject *seq, *item;
+ Py_buffer *buffers = NULL;
+#define NB_STATIC_BUFFERS 10
+ Py_buffer static_buffers[NB_STATIC_BUFFERS];
+
+ seq = PySequence_Fast(iterable, "can only join an iterable");
+ if (seq == NULL) {
+ return NULL;
+ }
+
+ seqlen = PySequence_Fast_GET_SIZE(seq);
+ if (seqlen == 0) {
+ Py_DECREF(seq);
+ return STRINGLIB_NEW(NULL, 0);
+ }
+#ifndef STRINGLIB_MUTABLE
+ if (seqlen == 1) {
+ item = PySequence_Fast_GET_ITEM(seq, 0);
+ if (STRINGLIB_CHECK_EXACT(item)) {
+ Py_INCREF(item);
+ Py_DECREF(seq);
+ return item;
+ }
+ }
+#endif
+ if (seqlen > NB_STATIC_BUFFERS) {
+ buffers = PyMem_NEW(Py_buffer, seqlen);
+ if (buffers == NULL) {
+ Py_DECREF(seq);
+ PyErr_NoMemory();
+ return NULL;
+ }
+ }
+ else {
+ buffers = static_buffers;
+ }
+
+ /* Here is the general case. Do a pre-pass to figure out the total
+ * amount of space we'll need (sz), and see whether all arguments are
+ * buffer-compatible.
+ */
+ for (i = 0, nbufs = 0; i < seqlen; i++) {
+ Py_ssize_t itemlen;
+ item = PySequence_Fast_GET_ITEM(seq, i);
+ if (_getbuffer(item, &buffers[i]) < 0) {
+ PyErr_Format(PyExc_TypeError,
+ "sequence item %zd: expected bytes, bytearray, "
+ "or an object with the buffer interface, %.80s found",
+ i, Py_TYPE(item)->tp_name);
+ goto error;
+ }
+ nbufs = i + 1; /* for error cleanup */
+ itemlen = buffers[i].len;
+ if (itemlen > PY_SSIZE_T_MAX - sz) {
+ PyErr_SetString(PyExc_OverflowError,
+ "join() result is too long");
+ goto error;
+ }
+ sz += itemlen;
+ if (i != 0) {
+ if (seplen > PY_SSIZE_T_MAX - sz) {
+ PyErr_SetString(PyExc_OverflowError,
+ "join() result is too long");
+ goto error;
+ }
+ sz += seplen;
+ }
+ if (seqlen != PySequence_Fast_GET_SIZE(seq)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "sequence changed size during iteration");
+ goto error;
+ }
+ }
+
+ /* Allocate result space. */
+ res = STRINGLIB_NEW(NULL, sz);
+ if (res == NULL)
+ goto error;
+
+ /* Catenate everything. */
+ p = STRINGLIB_STR(res);
+ if (!seplen) {
+ /* fast path */
+ for (i = 0; i < nbufs; i++) {
+ Py_ssize_t n = buffers[i].len;
+ char *q = buffers[i].buf;
+ Py_MEMCPY(p, q, n);
+ p += n;
+ }
+ goto done;
+ }
+ for (i = 0; i < nbufs; i++) {
+ Py_ssize_t n;
+ char *q;
+ if (i) {
+ Py_MEMCPY(p, sepstr, seplen);
+ p += seplen;
+ }
+ n = buffers[i].len;
+ q = buffers[i].buf;
+ Py_MEMCPY(p, q, n);
+ p += n;
+ }
+ goto done;
+
+error:
+ res = NULL;
+done:
+ Py_DECREF(seq);
+ for (i = 0; i < nbufs; i++)
+ PyBuffer_Release(&buffers[i]);
+ if (buffers != static_buffers)
+ PyMem_FREE(buffers);
+ return res;
+}
+
+#undef NB_STATIC_BUFFERS
diff --git a/Objects/stringlib/replace.h b/Objects/stringlib/replace.h
new file mode 100644
index 0000000..ef318ed
--- /dev/null
+++ b/Objects/stringlib/replace.h
@@ -0,0 +1,53 @@
+/* stringlib: replace implementation */
+
+#ifndef STRINGLIB_FASTSEARCH_H
+#error must include "stringlib/fastsearch.h" before including this module
+#endif
+
+Py_LOCAL_INLINE(void)
+STRINGLIB(replace_1char_inplace)(STRINGLIB_CHAR* s, STRINGLIB_CHAR* end,
+ Py_UCS4 u1, Py_UCS4 u2, Py_ssize_t maxcount)
+{
+ *s = u2;
+ while (--maxcount && ++s != end) {
+ /* Find the next character to be replaced.
+
+ If it occurs often, it is faster to scan for it using an inline
+ loop. If it occurs seldom, it is faster to scan for it using a
+ function call; the overhead of the function call is amortized
+ across the many characters that call covers. We start with an
+ inline loop and use a heuristic to determine whether to fall back
+ to a function call. */
+ if (*s != u1) {
+ int attempts = 10;
+ /* search u1 in a dummy loop */
+ while (1) {
+ if (++s == end)
+ return;
+ if (*s == u1)
+ break;
+ if (!--attempts) {
+ /* if u1 was not found for attempts iterations,
+ use FASTSEARCH() or memchr() */
+#if STRINGLIB_SIZEOF_CHAR == 1
+ s++;
+ s = memchr(s, u1, end - s);
+ if (s == NULL)
+ return;
+#else
+ Py_ssize_t i;
+ STRINGLIB_CHAR ch1 = (STRINGLIB_CHAR) u1;
+ s++;
+ i = FASTSEARCH(s, end - s, &ch1, 1, 0, FAST_SEARCH);
+ if (i < 0)
+ return;
+ s += i;
+#endif
+ /* restart the dummy loop */
+ break;
+ }
+ }
+ }
+ *s = u2;
+ }
+}
diff --git a/Objects/stringlib/split.h b/Objects/stringlib/split.h
index 947dd28..31f77a7 100644
--- a/Objects/stringlib/split.h
+++ b/Objects/stringlib/split.h
@@ -345,8 +345,8 @@ STRINGLIB(splitlines)(PyObject* str_obj,
and the appends only done when the prealloc buffer is full.
That's too much work for little gain.*/
- register Py_ssize_t i;
- register Py_ssize_t j;
+ Py_ssize_t i;
+ Py_ssize_t j;
PyObject *list = PyList_New(0);
PyObject *sub;
diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h
index 7bb91a7..ce27f3e 100644
--- a/Objects/stringlib/stringdefs.h
+++ b/Objects/stringlib/stringdefs.h
@@ -21,7 +21,6 @@
#define STRINGLIB_STR PyBytes_AS_STRING
#define STRINGLIB_LEN PyBytes_GET_SIZE
#define STRINGLIB_NEW PyBytes_FromStringAndSize
-#define STRINGLIB_RESIZE _PyBytes_Resize
#define STRINGLIB_CHECK PyBytes_Check
#define STRINGLIB_CHECK_EXACT PyBytes_CheckExact
#define STRINGLIB_TOSTR PyObject_Str
diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h
index e8c6fcb..ce1eb57 100644
--- a/Objects/stringlib/ucs1lib.h
+++ b/Objects/stringlib/ucs1lib.h
@@ -19,7 +19,6 @@
#define STRINGLIB_STR PyUnicode_1BYTE_DATA
#define STRINGLIB_LEN PyUnicode_GET_LENGTH
#define STRINGLIB_NEW _PyUnicode_FromUCS1
-#define STRINGLIB_RESIZE not_supported
#define STRINGLIB_CHECK PyUnicode_Check
#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h
index 45e5729..f900cb6 100644
--- a/Objects/stringlib/ucs2lib.h
+++ b/Objects/stringlib/ucs2lib.h
@@ -19,7 +19,6 @@
#define STRINGLIB_STR PyUnicode_2BYTE_DATA
#define STRINGLIB_LEN PyUnicode_GET_LENGTH
#define STRINGLIB_NEW _PyUnicode_FromUCS2
-#define STRINGLIB_RESIZE not_supported
#define STRINGLIB_CHECK PyUnicode_Check
#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h
index 647a27e..86a480f 100644
--- a/Objects/stringlib/ucs4lib.h
+++ b/Objects/stringlib/ucs4lib.h
@@ -19,7 +19,6 @@
#define STRINGLIB_STR PyUnicode_4BYTE_DATA
#define STRINGLIB_LEN PyUnicode_GET_LENGTH
#define STRINGLIB_NEW _PyUnicode_FromUCS4
-#define STRINGLIB_RESIZE not_supported
#define STRINGLIB_CHECK PyUnicode_Check
#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h
index 03117ec..f9d3f1d 100644
--- a/Objects/stringlib/undef.h
+++ b/Objects/stringlib/undef.h
@@ -6,7 +6,6 @@
#undef STRINGLIB_STR
#undef STRINGLIB_LEN
#undef STRINGLIB_NEW
-#undef STRINGLIB_RESIZE
#undef _Py_InsertThousandsGrouping
#undef STRINGLIB_IS_UNICODE
diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h
index c1c2cf3..aec221a 100644
--- a/Objects/stringlib/unicode_format.h
+++ b/Objects/stringlib/unicode_format.h
@@ -543,7 +543,7 @@ done:
static int
parse_field(SubString *str, SubString *field_name, SubString *format_spec,
- Py_UCS4 *conversion)
+ int *format_spec_needs_expanding, Py_UCS4 *conversion)
{
/* Note this function works if the field name is zero length,
which is good. Zero length field names are handled later, in
@@ -561,6 +561,15 @@ parse_field(SubString *str, SubString *field_name, SubString *format_spec,
field_name->start = str->start;
while (str->start < str->end) {
switch ((c = PyUnicode_READ_CHAR(str->str, str->start++))) {
+ case '{':
+ PyErr_SetString(PyExc_ValueError, "unexpected '{' in field name");
+ return 0;
+ case '[':
+ for (; str->start < str->end; str->start++)
+ if (PyUnicode_READ_CHAR(str->str, str->start) == ']')
+ break;
+ continue;
+ case '}':
case ':':
case '!':
break;
@@ -570,41 +579,62 @@ parse_field(SubString *str, SubString *field_name, SubString *format_spec,
break;
}
+ field_name->end = str->start - 1;
if (c == '!' || c == ':') {
+ Py_ssize_t count;
/* we have a format specifier and/or a conversion */
/* don't include the last character */
- field_name->end = str->start-1;
-
- /* the format specifier is the rest of the string */
- format_spec->str = str->str;
- format_spec->start = str->start;
- format_spec->end = str->end;
/* see if there's a conversion specifier */
if (c == '!') {
/* there must be another character present */
- if (format_spec->start >= format_spec->end) {
+ if (str->start >= str->end) {
PyErr_SetString(PyExc_ValueError,
- "end of format while looking for conversion "
+ "end of string while looking for conversion "
"specifier");
return 0;
}
- *conversion = PyUnicode_READ_CHAR(format_spec->str, format_spec->start++);
+ *conversion = PyUnicode_READ_CHAR(str->str, str->start++);
- /* if there is another character, it must be a colon */
- if (format_spec->start < format_spec->end) {
- c = PyUnicode_READ_CHAR(format_spec->str, format_spec->start++);
+ if (str->start < str->end) {
+ c = PyUnicode_READ_CHAR(str->str, str->start++);
+ if (c == '}')
+ return 1;
if (c != ':') {
PyErr_SetString(PyExc_ValueError,
- "expected ':' after format specifier");
+ "expected ':' after conversion specifier");
return 0;
}
}
}
+ format_spec->str = str->str;
+ format_spec->start = str->start;
+ count = 1;
+ while (str->start < str->end) {
+ switch ((c = PyUnicode_READ_CHAR(str->str, str->start++))) {
+ case '{':
+ *format_spec_needs_expanding = 1;
+ count++;
+ break;
+ case '}':
+ count--;
+ if (count == 0) {
+ format_spec->end = str->start - 1;
+ return 1;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ PyErr_SetString(PyExc_ValueError, "unmatched '{' in format spec");
+ return 0;
+ }
+ else if (c != '}') {
+ PyErr_SetString(PyExc_ValueError, "expected '}' before end of string");
+ return 0;
}
- else
- /* end of string, there's no format_spec or conversion */
- field_name->end = str->start;
return 1;
}
@@ -638,10 +668,9 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
SubString *format_spec, Py_UCS4 *conversion,
int *format_spec_needs_expanding)
{
- int at_end, hit_format_spec;
+ int at_end;
Py_UCS4 c = 0;
Py_ssize_t start;
- int count;
Py_ssize_t len;
int markup_follows = 0;
@@ -713,50 +742,12 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
if (!markup_follows)
return 2;
- /* this is markup, find the end of the string by counting nested
- braces. note that this prohibits escaped braces, so that
- format_specs cannot have braces in them. */
+ /* this is markup; parse the field */
*field_present = 1;
- count = 1;
-
- start = self->str.start;
-
- /* we know we can't have a zero length string, so don't worry
- about that case */
- hit_format_spec = 0;
- while (self->str.start < self->str.end) {
- switch (c = PyUnicode_READ_CHAR(self->str.str, self->str.start++)) {
- case ':':
- hit_format_spec = 1;
- count = 1;
- break;
- case '{':
- /* the format spec needs to be recursively expanded.
- this is an optimization, and not strictly needed */
- if (hit_format_spec)
- *format_spec_needs_expanding = 1;
- count++;
- break;
- case '}':
- count--;
- if (count <= 0) {
- /* we're done. parse and get out */
- SubString s;
-
- SubString_init(&s, self->str.str, start, self->str.start - 1);
- if (parse_field(&s, field_name, format_spec, conversion) == 0)
- return 0;
-
- /* success */
- return 2;
- }
- break;
- }
- }
-
- /* end of string while searching for matching '}' */
- PyErr_SetString(PyExc_ValueError, "unmatched '{' in format");
- return 0;
+ if (!parse_field(&self->str, field_name, format_spec,
+ format_spec_needs_expanding, conversion))
+ return 0;
+ return 2;
}
@@ -875,25 +866,19 @@ do_markup(SubString *input, PyObject *args, PyObject *kwargs,
SubString literal;
SubString field_name;
SubString format_spec;
- Py_UCS4 conversion, maxchar;
- Py_ssize_t sublen;
- int err;
+ Py_UCS4 conversion;
MarkupIterator_init(&iter, input->str, input->start, input->end);
while ((result = MarkupIterator_next(&iter, &literal, &field_present,
&field_name, &format_spec,
&conversion,
&format_spec_needs_expanding)) == 2) {
- sublen = literal.end - literal.start;
- if (sublen) {
- maxchar = _PyUnicode_FindMaxChar(literal.str,
- literal.start, literal.end);
- err = _PyUnicodeWriter_Prepare(writer, sublen, maxchar);
- if (err == -1)
+ if (literal.end != literal.start) {
+ if (!field_present && iter.str.start == iter.str.end)
+ writer->overallocate = 0;
+ if (_PyUnicodeWriter_WriteSubstring(writer, literal.str,
+ literal.start, literal.end) < 0)
return 0;
- _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
- literal.str, literal.start, sublen);
- writer->pos += sublen;
}
if (field_present) {
@@ -918,7 +903,6 @@ build_string(SubString *input, PyObject *args, PyObject *kwargs,
int recursion_depth, AutoNumber *auto_number)
{
_PyUnicodeWriter writer;
- Py_ssize_t minlen;
/* check the recursion level */
if (recursion_depth <= 0) {
@@ -927,8 +911,9 @@ build_string(SubString *input, PyObject *args, PyObject *kwargs,
return NULL;
}
- minlen = PyUnicode_GET_LENGTH(input->str) + 100;
- _PyUnicodeWriter_Init(&writer, minlen);
+ _PyUnicodeWriter_Init(&writer);
+ writer.overallocate = 1;
+ writer.min_length = PyUnicode_GET_LENGTH(input->str) + 100;
if (!do_markup(input, args, kwargs, &writer, recursion_depth,
auto_number)) {
diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h
index f16f21e..3db5629 100644
--- a/Objects/stringlib/unicodedefs.h
+++ b/Objects/stringlib/unicodedefs.h
@@ -21,17 +21,11 @@
#define STRINGLIB_STR PyUnicode_AS_UNICODE
#define STRINGLIB_LEN PyUnicode_GET_SIZE
#define STRINGLIB_NEW PyUnicode_FromUnicode
-#define STRINGLIB_RESIZE PyUnicode_Resize
#define STRINGLIB_CHECK PyUnicode_Check
#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
-#if PY_VERSION_HEX < 0x03000000
-#define STRINGLIB_TOSTR PyObject_Unicode
-#define STRINGLIB_TOASCII PyObject_Repr
-#else
#define STRINGLIB_TOSTR PyObject_Str
#define STRINGLIB_TOASCII PyObject_ASCII
-#endif
#define STRINGLIB_WANT_CONTAINS_OBJ 1
diff --git a/Objects/structseq.c b/Objects/structseq.c
index c3b9a72..664344b 100644
--- a/Objects/structseq.c
+++ b/Objects/structseq.c
@@ -11,17 +11,20 @@ static char unnamed_fields_key[] = "n_unnamed_fields";
/* Fields with this name have only a field index, not a field name.
They are only allowed for indices < n_visible_fields. */
char *PyStructSequence_UnnamedField = "unnamed field";
+_Py_IDENTIFIER(n_sequence_fields);
+_Py_IDENTIFIER(n_fields);
+_Py_IDENTIFIER(n_unnamed_fields);
#define VISIBLE_SIZE(op) Py_SIZE(op)
#define VISIBLE_SIZE_TP(tp) PyLong_AsLong( \
- PyDict_GetItemString((tp)->tp_dict, visible_length_key))
+ _PyDict_GetItemId((tp)->tp_dict, &PyId_n_sequence_fields))
#define REAL_SIZE_TP(tp) PyLong_AsLong( \
- PyDict_GetItemString((tp)->tp_dict, real_length_key))
+ _PyDict_GetItemId((tp)->tp_dict, &PyId_n_fields))
#define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op))
#define UNNAMED_FIELDS_TP(tp) PyLong_AsLong( \
- PyDict_GetItemString((tp)->tp_dict, unnamed_fields_key))
+ _PyDict_GetItemId((tp)->tp_dict, &PyId_n_unnamed_fields))
#define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op))
@@ -59,7 +62,7 @@ static void
structseq_dealloc(PyStructSequence *obj)
{
Py_ssize_t i, size;
-
+
size = REAL_SIZE(obj);
for (i = 0; i < size; ++i) {
Py_XDECREF(obj->ob_item[i]);
@@ -230,8 +233,8 @@ structseq_repr(PyStructSequence *obj)
static PyObject *
structseq_reduce(PyStructSequence* self)
{
- PyObject* tup;
- PyObject* dict;
+ PyObject* tup = NULL;
+ PyObject* dict = NULL;
PyObject* result;
Py_ssize_t n_fields, n_visible_fields, n_unnamed_fields;
int i;
@@ -240,15 +243,12 @@ structseq_reduce(PyStructSequence* self)
n_visible_fields = VISIBLE_SIZE(self);
n_unnamed_fields = UNNAMED_FIELDS(self);
tup = PyTuple_New(n_visible_fields);
- if (!tup) {
- return NULL;
- }
+ if (!tup)
+ goto error;
dict = PyDict_New();
- if (!dict) {
- Py_DECREF(tup);
- return NULL;
- }
+ if (!dict)
+ goto error;
for (i = 0; i < n_visible_fields; i++) {
Py_INCREF(self->ob_item[i]);
@@ -257,8 +257,8 @@ structseq_reduce(PyStructSequence* self)
for (; i < n_fields; i++) {
char *n = Py_TYPE(self)->tp_members[i-n_unnamed_fields].name;
- PyDict_SetItemString(dict, n,
- self->ob_item[i]);
+ if (PyDict_SetItemString(dict, n, self->ob_item[i]) < 0)
+ goto error;
}
result = Py_BuildValue("(O(OO))", Py_TYPE(self), tup, dict);
@@ -267,6 +267,11 @@ structseq_reduce(PyStructSequence* self)
Py_DECREF(dict);
return result;
+
+error:
+ Py_XDECREF(tup);
+ Py_XDECREF(dict);
+ return NULL;
}
static PyMethodDef structseq_methods[] = {
@@ -315,12 +320,13 @@ static PyTypeObject _struct_sequence_template = {
structseq_new, /* tp_new */
};
-void
-PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
+int
+PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
{
PyObject *dict;
PyMemberDef* members;
int n_members, n_unnamed_members, i, k;
+ PyObject *v;
#ifdef Py_TRACE_REFS
/* if the type object was chained, unchain it first
@@ -342,8 +348,10 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
type->tp_doc = desc->doc;
members = PyMem_NEW(PyMemberDef, n_members-n_unnamed_members+1);
- if (members == NULL)
- return;
+ if (members == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
for (i = k = 0; i < n_members; ++i) {
if (desc->fields[i].name == PyStructSequence_UnnamedField)
@@ -361,30 +369,56 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
type->tp_members = members;
if (PyType_Ready(type) < 0)
- return;
+ return -1;
Py_INCREF(type);
dict = type->tp_dict;
#define SET_DICT_FROM_INT(key, value) \
do { \
- PyObject *v = PyLong_FromLong((long) value); \
- if (v != NULL) { \
- PyDict_SetItemString(dict, key, v); \
+ v = PyLong_FromLong((long) value); \
+ if (v == NULL) \
+ return -1; \
+ if (PyDict_SetItemString(dict, key, v) < 0) { \
Py_DECREF(v); \
+ return -1; \
} \
+ Py_DECREF(v); \
} while (0)
SET_DICT_FROM_INT(visible_length_key, desc->n_in_sequence);
SET_DICT_FROM_INT(real_length_key, n_members);
SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members);
+
+ return 0;
+}
+
+void
+PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
+{
+ (void)PyStructSequence_InitType2(type, desc);
}
PyTypeObject*
PyStructSequence_NewType(PyStructSequence_Desc *desc)
{
- PyTypeObject *result = (PyTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
- if (result != NULL) {
- PyStructSequence_InitType(result, desc);
+ PyTypeObject *result;
+
+ result = (PyTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
+ if (result == NULL)
+ return NULL;
+ if (PyStructSequence_InitType2(result, desc) < 0) {
+ Py_DECREF(result);
+ return NULL;
}
return result;
}
+
+int _PyStructSequence_Init(void)
+{
+ if (_PyUnicode_FromId(&PyId_n_sequence_fields) == NULL
+ || _PyUnicode_FromId(&PyId_n_fields) == NULL
+ || _PyUnicode_FromId(&PyId_n_unnamed_fields) == NULL)
+ return -1;
+
+ return 0;
+}
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index ec3f91b..a33d8c0 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -63,9 +63,9 @@ _PyTuple_DebugMallocStats(FILE *out)
}
PyObject *
-PyTuple_New(register Py_ssize_t size)
+PyTuple_New(Py_ssize_t size)
{
- register PyTupleObject *op;
+ PyTupleObject *op;
Py_ssize_t i;
if (size < 0) {
PyErr_BadInternalCall();
@@ -122,7 +122,7 @@ PyTuple_New(register Py_ssize_t size)
}
Py_ssize_t
-PyTuple_Size(register PyObject *op)
+PyTuple_Size(PyObject *op)
{
if (!PyTuple_Check(op)) {
PyErr_BadInternalCall();
@@ -133,7 +133,7 @@ PyTuple_Size(register PyObject *op)
}
PyObject *
-PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
+PyTuple_GetItem(PyObject *op, Py_ssize_t i)
{
if (!PyTuple_Check(op)) {
PyErr_BadInternalCall();
@@ -147,10 +147,10 @@ PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
}
int
-PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
+PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem)
{
- register PyObject *olditem;
- register PyObject **p;
+ PyObject *olditem;
+ PyObject **p;
if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Py_XDECREF(newitem);
PyErr_BadInternalCall();
@@ -224,10 +224,10 @@ PyTuple_Pack(Py_ssize_t n, ...)
/* Methods */
static void
-tupledealloc(register PyTupleObject *op)
+tupledealloc(PyTupleObject *op)
{
- register Py_ssize_t i;
- register Py_ssize_t len = Py_SIZE(op);
+ Py_ssize_t i;
+ Py_ssize_t len = Py_SIZE(op);
PyObject_GC_UnTrack(op);
Py_TRASHCAN_SAFE_BEGIN(op)
if (len > 0) {
@@ -322,15 +322,18 @@ error:
1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
1330111, 1412633, 1165069, 1247599, 1495177, 1577699
+
+ Tests have shown that it's not worth to cache the hash value, see
+ issue #9685.
*/
static Py_hash_t
tuplehash(PyTupleObject *v)
{
- register Py_uhash_t x; /* Unsigned for defined overflow behavior. */
- register Py_hash_t y;
- register Py_ssize_t len = Py_SIZE(v);
- register PyObject **p;
+ Py_uhash_t x; /* Unsigned for defined overflow behavior. */
+ Py_hash_t y;
+ Py_ssize_t len = Py_SIZE(v);
+ PyObject **p;
Py_uhash_t mult = _PyHASH_MULTIPLIER;
x = 0x345678UL;
p = v->ob_item;
@@ -367,7 +370,7 @@ tuplecontains(PyTupleObject *a, PyObject *el)
}
static PyObject *
-tupleitem(register PyTupleObject *a, register Py_ssize_t i)
+tupleitem(PyTupleObject *a, Py_ssize_t i)
{
if (i < 0 || i >= Py_SIZE(a)) {
PyErr_SetString(PyExc_IndexError, "tuple index out of range");
@@ -378,12 +381,12 @@ tupleitem(register PyTupleObject *a, register Py_ssize_t i)
}
static PyObject *
-tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
- register Py_ssize_t ihigh)
+tupleslice(PyTupleObject *a, Py_ssize_t ilow,
+ Py_ssize_t ihigh)
{
- register PyTupleObject *np;
+ PyTupleObject *np;
PyObject **src, **dest;
- register Py_ssize_t i;
+ Py_ssize_t i;
Py_ssize_t len;
if (ilow < 0)
ilow = 0;
@@ -420,10 +423,10 @@ PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
}
static PyObject *
-tupleconcat(register PyTupleObject *a, register PyObject *bb)
+tupleconcat(PyTupleObject *a, PyObject *bb)
{
- register Py_ssize_t size;
- register Py_ssize_t i;
+ Py_ssize_t size;
+ Py_ssize_t i;
PyObject **src, **dest;
PyTupleObject *np;
if (!PyTuple_Check(bb)) {
@@ -833,8 +836,8 @@ PyTypeObject PyTuple_Type = {
int
_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
{
- register PyTupleObject *v;
- register PyTupleObject *sv;
+ PyTupleObject *v;
+ PyTupleObject *sv;
Py_ssize_t i;
Py_ssize_t oldsize;
@@ -927,7 +930,7 @@ PyTuple_Fini(void)
typedef struct {
PyObject_HEAD
- long it_index;
+ Py_ssize_t it_index;
PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
} tupleiterobject;
@@ -985,7 +988,7 @@ static PyObject *
tupleiter_reduce(tupleiterobject *it)
{
if (it->it_seq)
- return Py_BuildValue("N(O)l", _PyObject_GetBuiltin("iter"),
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
it->it_seq, it->it_index);
else
return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
@@ -994,7 +997,7 @@ tupleiter_reduce(tupleiterobject *it)
static PyObject *
tupleiter_setstate(tupleiterobject *it, PyObject *state)
{
- long index = PyLong_AsLong(state);
+ Py_ssize_t index = PyLong_AsSsize_t(state);
if (index == -1 && PyErr_Occurred())
return NULL;
if (it->it_seq != NULL) {
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index a55d977..3ff42da 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -736,6 +736,13 @@ type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
+#ifdef Py_DEBUG
+ /* type_call() must not be called with an exception set,
+ because it may clear it (directly or indirectly) and so the
+ caller looses its exception */
+ assert(!PyErr_Occurred());
+#endif
+
obj = type->tp_new(type, args, kwds);
if (obj != NULL) {
/* Ugly exception: when the call was type(something),
@@ -750,10 +757,12 @@ type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyType_IsSubtype(Py_TYPE(obj), type))
return obj;
type = Py_TYPE(obj);
- if (type->tp_init != NULL &&
- type->tp_init(obj, args, kwds) < 0) {
- Py_DECREF(obj);
- obj = NULL;
+ if (type->tp_init != NULL) {
+ int res = type->tp_init(obj, args, kwds);
+ if (res < 0) {
+ Py_DECREF(obj);
+ obj = NULL;
+ }
}
}
return obj;
@@ -912,6 +921,7 @@ subtype_dealloc(PyObject *self)
PyTypeObject *type, *base;
destructor basedealloc;
PyThreadState *tstate = PyThreadState_GET();
+ int has_finalizer;
/* Extract the type; we expect it to be a heap type */
type = Py_TYPE(self);
@@ -927,6 +937,10 @@ subtype_dealloc(PyObject *self)
clear_slots(), or DECREF the dict, or clear weakrefs. */
/* Maybe call finalizer; exit early if resurrected */
+ if (type->tp_finalize) {
+ if (PyObject_CallFinalizerFromDealloc(self) < 0)
+ return;
+ }
if (type->tp_del) {
type->tp_del(self);
if (self->ob_refcnt > 0)
@@ -978,25 +992,36 @@ subtype_dealloc(PyObject *self)
assert(base);
}
- /* If we added a weaklist, we clear it. Do this *before* calling
- the finalizer (__del__), clearing slots, or clearing the instance
- dict. */
+ has_finalizer = type->tp_finalize || type->tp_del;
+
+ /* Maybe call finalizer; exit early if resurrected */
+ if (has_finalizer)
+ _PyObject_GC_TRACK(self);
+ if (type->tp_finalize) {
+ if (PyObject_CallFinalizerFromDealloc(self) < 0) {
+ /* Resurrected */
+ goto endlabel;
+ }
+ }
+ /* If we added a weaklist, we clear it. Do this *before* calling
+ tp_del, clearing slots, or clearing the instance dict. */
if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
PyObject_ClearWeakRefs(self);
- /* Maybe call finalizer; exit early if resurrected */
if (type->tp_del) {
- _PyObject_GC_TRACK(self);
type->tp_del(self);
- if (self->ob_refcnt > 0)
- goto endlabel; /* resurrected */
- else
- _PyObject_GC_UNTRACK(self);
+ if (self->ob_refcnt > 0) {
+ /* Resurrected */
+ goto endlabel;
+ }
+ }
+ if (has_finalizer) {
+ _PyObject_GC_UNTRACK(self);
/* New weakrefs could be created during the finalizer call.
- If this occurs, clear them out without calling their
- finalizers since they might rely on part of the object
- being finalized that has already been destroyed. */
+ If this occurs, clear them out without calling their
+ finalizers since they might rely on part of the object
+ being finalized that has already been destroyed. */
if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
/* Modeled after GET_WEAKREFS_LISTPTR() */
PyWeakReference **list = (PyWeakReference **) \
@@ -1456,8 +1481,10 @@ pmerge(PyObject *acc, PyObject* to_merge) {
that is not included in acc.
*/
remain = (int *)PyMem_MALLOC(SIZEOF_INT*to_merge_size);
- if (remain == NULL)
+ if (remain == NULL) {
+ PyErr_NoMemory();
return -1;
+ }
for (i = 0; i < to_merge_size; i++)
remain[i] = 0;
@@ -1489,7 +1516,7 @@ pmerge(PyObject *acc, PyObject* to_merge) {
}
ok = PyList_Append(acc, candidate);
if (ok < 0) {
- PyMem_Free(remain);
+ PyMem_FREE(remain);
return -1;
}
for (j = 0; j < to_merge_size; j++) {
@@ -1949,7 +1976,7 @@ type_init(PyObject *cls, PyObject *args, PyObject *kwds)
return res;
}
-long
+unsigned long
PyType_GetFlags(PyTypeObject *type)
{
return type->tp_flags;
@@ -2220,7 +2247,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
/* Initialize tp_flags */
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
- Py_TPFLAGS_BASETYPE;
+ Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE;
if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
type->tp_flags |= Py_TPFLAGS_HAVE_GC;
@@ -2290,8 +2317,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
/* Silently truncate the docstring if it contains null bytes. */
len = strlen(doc_str);
tp_doc = (char *)PyObject_MALLOC(len + 1);
- if (tp_doc == NULL)
+ if (tp_doc == NULL) {
+ PyErr_NoMemory();
goto error;
+ }
memcpy(tp_doc, doc_str, len + 1);
type->tp_doc = tp_doc;
}
@@ -2411,7 +2440,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
char *s;
char *res_start = (char*)res;
PyType_Slot *slot;
-
+
/* Set the type name and qualname */
s = strrchr(spec->name, '.');
if (s == NULL)
@@ -2432,7 +2461,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
type->tp_name = spec->name;
if (!type->tp_name)
goto fail;
-
+
/* Adjust for empty tuple bases */
if (!bases) {
base = &PyBaseObject_Type;
@@ -2494,8 +2523,10 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
if (slot->slot == Py_tp_doc) {
size_t len = strlen(slot->pfunc)+1;
char *tp_doc = PyObject_MALLOC(len);
- if (tp_doc == NULL)
+ if (tp_doc == NULL) {
+ PyErr_NoMemory();
goto fail;
+ }
memcpy(tp_doc, slot->pfunc, len);
type->tp_doc = tp_doc;
}
@@ -2516,7 +2547,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
/* Set type.__module__ */
s = strrchr(spec->name, '.');
if (s != NULL)
- _PyDict_SetItemId(type->tp_dict, &PyId___module__,
+ _PyDict_SetItemId(type->tp_dict, &PyId___module__,
PyUnicode_FromStringAndSize(
spec->name, (Py_ssize_t)(s - spec->name)));
@@ -3323,7 +3354,7 @@ object_set_class(PyObject *self, PyObject *value, void *closure)
"__class__ assignment: only for heap types");
return -1;
}
- if (compatible_for_assignment(newto, oldto, "__class__")) {
+ if (compatible_for_assignment(oldto, newto, "__class__")) {
Py_INCREF(newto);
Py_TYPE(self) = newto;
Py_DECREF(oldto);
@@ -3669,16 +3700,9 @@ object_format(PyObject *self, PyObject *args)
/* Issue 7994: If we're converting to a string, we
should reject format specifications */
if (PyUnicode_GET_LENGTH(format_spec) > 0) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "object.__format__ with a non-empty format "
- "string is deprecated", 1) < 0) {
- goto done;
- }
- /* Eventually this will become an error:
- PyErr_Format(PyExc_TypeError,
+ PyErr_SetString(PyExc_TypeError,
"non-empty format string passed to object.__format__");
- goto done;
- */
+ goto done;
}
result = PyObject_Format(self_as_str, format_spec);
@@ -3833,7 +3857,7 @@ add_methods(PyTypeObject *type, PyMethodDef *meth)
descr = PyDescr_NewClassMethod(type, meth);
}
else if (meth->ml_flags & METH_STATIC) {
- PyObject *cfunc = PyCFunction_New(meth, (PyObject*)type);
+ PyObject *cfunc = PyCFunction_NewEx(meth, (PyObject*)type, NULL);
if (cfunc == NULL)
return -1;
descr = PyStaticMethod_New(cfunc);
@@ -4103,6 +4127,10 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
COPYSLOT(tp_init);
COPYSLOT(tp_alloc);
COPYSLOT(tp_is_gc);
+ if ((type->tp_flags & Py_TPFLAGS_HAVE_FINALIZE) &&
+ (base->tp_flags & Py_TPFLAGS_HAVE_FINALIZE)) {
+ COPYSLOT(tp_finalize);
+ }
if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
(base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
/* They agree about gc. */
@@ -4255,11 +4283,15 @@ PyType_Ready(PyTypeObject *type)
PyObject *doc = PyUnicode_FromString(type->tp_doc);
if (doc == NULL)
goto error;
- _PyDict_SetItemId(type->tp_dict, &PyId___doc__, doc);
+ if (_PyDict_SetItemId(type->tp_dict, &PyId___doc__, doc) < 0) {
+ Py_DECREF(doc);
+ goto error;
+ }
Py_DECREF(doc);
} else {
- _PyDict_SetItemId(type->tp_dict,
- &PyId___doc__, Py_None);
+ if (_PyDict_SetItemId(type->tp_dict,
+ &PyId___doc__, Py_None) < 0)
+ goto error;
}
}
@@ -4303,13 +4335,11 @@ PyType_Ready(PyTypeObject *type)
/* Warn for a type that implements tp_compare (now known as
tp_reserved) but not tp_richcompare. */
if (type->tp_reserved && !type->tp_richcompare) {
- int error;
- error = PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
+ PyErr_Format(PyExc_TypeError,
"Type %.100s defines tp_reserved (formerly tp_compare) "
"but not tp_richcompare. Comparisons may not behave as intended.",
type->tp_name);
- if (error == -1)
- goto error;
+ goto error;
}
/* All done -- set the ready flag */
@@ -4338,6 +4368,8 @@ add_subclass(PyTypeObject *base, PyTypeObject *type)
}
assert(PyList_Check(list));
newobj = PyWeakref_NewRef((PyObject *)type, NULL);
+ if (newobj == NULL)
+ return -1;
i = PyList_GET_SIZE(list);
while (--i >= 0) {
ref = PyList_GET_ITEM(list, i);
@@ -4725,6 +4757,18 @@ wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
}
static PyObject *
+wrap_del(PyObject *self, PyObject *args, void *wrapped)
+{
+ destructor func = (destructor)wrapped;
+
+ if (!check_num_args(args, 0))
+ return NULL;
+
+ (*func)(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
{
richcmpfunc func = (richcmpfunc)wrapped;
@@ -4903,7 +4947,7 @@ add_tp_new_wrapper(PyTypeObject *type)
if (_PyDict_GetItemId(type->tp_dict, &PyId___new__) != NULL)
return 0;
- func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
+ func = PyCFunction_NewEx(tp_new_methoddef, (PyObject *)type, NULL);
if (func == NULL)
return -1;
if (_PyDict_SetItemId(type->tp_dict, &PyId___new__, func)) {
@@ -5281,29 +5325,12 @@ slot_tp_str(PyObject *self)
_Py_IDENTIFIER(__str__);
func = lookup_method(self, &PyId___str__);
- if (func != NULL) {
+ if (func == NULL)
+ return NULL;
res = PyEval_CallObject(func, NULL);
Py_DECREF(func);
return res;
}
- else {
- /* PyObject *ress; */
- PyErr_Clear();
- res = slot_tp_repr(self);
- if (!res)
- return NULL;
- /* XXX this is non-sensical. Why should we return
- a bytes object from __str__. Is this code even
- used? - mvl */
- assert(0);
- return res;
- /*
- ress = _PyUnicode_AsDefaultEncodedString(res);
- Py_DECREF(res);
- return ress;
- */
- }
-}
static Py_hash_t
slot_tp_hash(PyObject *self)
@@ -5622,16 +5649,12 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
static void
-slot_tp_del(PyObject *self)
+slot_tp_finalize(PyObject *self)
{
_Py_IDENTIFIER(__del__);
PyObject *del, *res;
PyObject *error_type, *error_value, *error_traceback;
- /* Temporarily resurrect the object. */
- assert(self->ob_refcnt == 0);
- self->ob_refcnt = 1;
-
/* Save the current exception, if any. */
PyErr_Fetch(&error_type, &error_value, &error_traceback);
@@ -5648,37 +5671,6 @@ slot_tp_del(PyObject *self)
/* Restore the saved exception. */
PyErr_Restore(error_type, error_value, error_traceback);
-
- /* Undo the temporary resurrection; can't use DECREF here, it would
- * cause a recursive call.
- */
- assert(self->ob_refcnt > 0);
- if (--self->ob_refcnt == 0)
- return; /* this is the normal path out */
-
- /* __del__ resurrected it! Make it look like the original Py_DECREF
- * never happened.
- */
- {
- Py_ssize_t refcnt = self->ob_refcnt;
- _Py_NewReference(self);
- self->ob_refcnt = refcnt;
- }
- assert(!PyType_IS_GC(Py_TYPE(self)) ||
- _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
- /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
- * we need to undo that. */
- _Py_DEC_REFTOTAL;
- /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
- * chain, so no more to do there.
- * If COUNT_ALLOCS, the original decref bumped tp_frees, and
- * _Py_NewReference bumped tp_allocs: both of those need to be
- * undone.
- */
-#ifdef COUNT_ALLOCS
- --Py_TYPE(self)->tp_frees;
- --Py_TYPE(self)->tp_allocs;
-#endif
}
@@ -5787,7 +5779,7 @@ static slotdef slotdefs[] = {
"see help(type(x)) for signature",
PyWrapperFlag_KEYWORDS),
TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
- TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
+ TPSLOT("__del__", tp_finalize, slot_tp_finalize, (wrapperfunc)wrap_del, ""),
BINSLOT("__add__", nb_add, slot_nb_add,
"+"),
diff --git a/Objects/unicodectype.c b/Objects/unicodectype.c
index a572c12..ea540d6 100644
--- a/Objects/unicodectype.c
+++ b/Objects/unicodectype.c
@@ -61,7 +61,7 @@ gettyperecord(Py_UCS4 code)
/* Returns the titlecase Unicode characters corresponding to ch or just
ch if no titlecase mapping is known. */
-Py_UCS4 _PyUnicode_ToTitlecase(register Py_UCS4 ch)
+Py_UCS4 _PyUnicode_ToTitlecase(Py_UCS4 ch)
{
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 440d35a..f1d687a 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -47,14 +47,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <windows.h>
#endif
-/* Endianness switches; defaults to little endian */
-
-#ifdef WORDS_BIGENDIAN
-# define BYTEORDER_IS_BIG_ENDIAN
-#else
-# define BYTEORDER_IS_LITTLE_ENDIAN
-#endif
-
/* --- Globals ------------------------------------------------------------
NOTE: In the interpreter's initialization phase, some globals are currently
@@ -130,16 +122,14 @@ extern "C" {
/* true if the Unicode object has an allocated UTF-8 memory block
(not shared with other data) */
#define _PyUnicode_HAS_UTF8_MEMORY(op) \
- (assert(_PyUnicode_CHECK(op)), \
- (!PyUnicode_IS_COMPACT_ASCII(op) \
+ ((!PyUnicode_IS_COMPACT_ASCII(op) \
&& _PyUnicode_UTF8(op) \
&& _PyUnicode_UTF8(op) != PyUnicode_DATA(op)))
/* true if the Unicode object has an allocated wstr memory block
(not shared with other data) */
#define _PyUnicode_HAS_WSTR_MEMORY(op) \
- (assert(_PyUnicode_CHECK(op)), \
- (_PyUnicode_WSTR(op) && \
+ ((_PyUnicode_WSTR(op) && \
(!PyUnicode_IS_READY(op) || \
_PyUnicode_WSTR(op) != PyUnicode_DATA(op))))
@@ -199,6 +189,10 @@ static PyObject *unicode_empty = NULL;
return unicode_empty; \
} while (0)
+/* Forward declaration */
+Py_LOCAL_INLINE(int)
+_PyUnicodeWriter_WriteCharInline(_PyUnicodeWriter *writer, Py_UCS4 ch);
+
/* List of static strings. */
static _Py_Identifier *static_strings = NULL;
@@ -427,8 +421,6 @@ unicode_result_wchar(PyObject *unicode)
#ifndef Py_DEBUG
Py_ssize_t len;
- assert(Py_REFCNT(unicode) == 1);
-
len = _PyUnicode_WSTR_LENGTH(unicode);
if (len == 0) {
Py_DECREF(unicode);
@@ -445,10 +437,12 @@ unicode_result_wchar(PyObject *unicode)
}
if (_PyUnicode_Ready(unicode) < 0) {
- Py_XDECREF(unicode);
+ Py_DECREF(unicode);
return NULL;
}
#else
+ assert(Py_REFCNT(unicode) == 1);
+
/* don't make the result ready in debug mode to ensure that the caller
makes the string ready before using it */
assert(_PyUnicode_CheckConsistency(unicode, 1));
@@ -471,7 +465,9 @@ unicode_result_ready(PyObject *unicode)
}
if (length == 1) {
- Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0);
+ void *data = PyUnicode_DATA(unicode);
+ int kind = PyUnicode_KIND(unicode);
+ Py_UCS4 ch = PyUnicode_READ(kind, data, 0);
if (ch < 256) {
PyObject *latin1_char = unicode_latin1[ch];
if (latin1_char != NULL) {
@@ -544,7 +540,6 @@ static OSVERSIONINFOEX winver;
static BLOOM_MASK bloom_linebreak = ~(BLOOM_MASK)0;
-#define BLOOM_ADD(mask, ch) ((mask |= (1UL << ((ch) & (BLOOM_WIDTH - 1)))))
#define BLOOM(mask, ch) ((mask & (1UL << ((ch) & (BLOOM_WIDTH - 1)))))
#define BLOOM_LINEBREAK(ch) \
@@ -554,21 +549,40 @@ static BLOOM_MASK bloom_linebreak = ~(BLOOM_MASK)0;
Py_LOCAL_INLINE(BLOOM_MASK)
make_bloom_mask(int kind, void* ptr, Py_ssize_t len)
{
+#define BLOOM_UPDATE(TYPE, MASK, PTR, LEN) \
+ do { \
+ TYPE *data = (TYPE *)PTR; \
+ TYPE *end = data + LEN; \
+ Py_UCS4 ch; \
+ for (; data != end; data++) { \
+ ch = *data; \
+ MASK |= (1UL << (ch & (BLOOM_WIDTH - 1))); \
+ } \
+ break; \
+ } while (0)
+
/* calculate simple bloom-style bitmask for a given unicode string */
BLOOM_MASK mask;
- Py_ssize_t i;
mask = 0;
- for (i = 0; i < len; i++)
- BLOOM_ADD(mask, PyUnicode_READ(kind, ptr, i));
-
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ BLOOM_UPDATE(Py_UCS1, mask, ptr, len);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ BLOOM_UPDATE(Py_UCS2, mask, ptr, len);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ BLOOM_UPDATE(Py_UCS4, mask, ptr, len);
+ break;
+ default:
+ assert(0);
+ }
return mask;
-}
-#define BLOOM_MEMBER(mask, chr, str) \
- (BLOOM(mask, chr) \
- && (PyUnicode_FindChar(str, chr, 0, PyUnicode_GET_LENGTH(str), 1) >= 0))
+#undef BLOOM_UPDATE
+}
/* Compilation of templated routines */
@@ -588,6 +602,7 @@ make_bloom_mask(int kind, void* ptr, Py_ssize_t len)
#include "stringlib/split.h"
#include "stringlib/count.h"
#include "stringlib/find.h"
+#include "stringlib/replace.h"
#include "stringlib/find_max_char.h"
#include "stringlib/localeutil.h"
#include "stringlib/undef.h"
@@ -598,6 +613,7 @@ make_bloom_mask(int kind, void* ptr, Py_ssize_t len)
#include "stringlib/split.h"
#include "stringlib/count.h"
#include "stringlib/find.h"
+#include "stringlib/replace.h"
#include "stringlib/find_max_char.h"
#include "stringlib/localeutil.h"
#include "stringlib/undef.h"
@@ -608,6 +624,7 @@ make_bloom_mask(int kind, void* ptr, Py_ssize_t len)
#include "stringlib/split.h"
#include "stringlib/count.h"
#include "stringlib/find.h"
+#include "stringlib/replace.h"
#include "stringlib/find_max_char.h"
#include "stringlib/localeutil.h"
#include "stringlib/undef.h"
@@ -654,6 +671,25 @@ Py_LOCAL_INLINE(Py_ssize_t) findchar(void *s, int kind,
}
}
+#ifdef Py_DEBUG
+/* Fill the data of an Unicode string with invalid characters to detect bugs
+ earlier.
+
+ _PyUnicode_CheckConsistency(str, 1) detects invalid characters, at least for
+ ASCII and UCS-4 strings. U+00FF is invalid in ASCII and U+FFFFFFFF is an
+ invalid character in Unicode 6.0. */
+static void
+unicode_fill_invalid(PyObject *unicode, Py_ssize_t old_length)
+{
+ int kind = PyUnicode_KIND(unicode);
+ Py_UCS1 *data = PyUnicode_1BYTE_DATA(unicode);
+ Py_ssize_t length = _PyUnicode_LENGTH(unicode);
+ if (length <= old_length)
+ return;
+ memset(data + old_length * kind, 0xff, (length - old_length) * kind);
+}
+#endif
+
static PyObject*
resize_compact(PyObject *unicode, Py_ssize_t length)
{
@@ -662,6 +698,10 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
Py_ssize_t new_size;
int share_wstr;
PyObject *new_unicode;
+#ifdef Py_DEBUG
+ Py_ssize_t old_length = _PyUnicode_LENGTH(unicode);
+#endif
+
assert(unicode_modifiable(unicode));
assert(PyUnicode_IS_READY(unicode));
assert(PyUnicode_IS_COMPACT(unicode));
@@ -701,6 +741,9 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
PyObject_DEL(_PyUnicode_WSTR(unicode));
_PyUnicode_WSTR(unicode) = NULL;
}
+#ifdef Py_DEBUG
+ unicode_fill_invalid(unicode, old_length);
+#endif
PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
length, 0);
assert(_PyUnicode_CheckConsistency(unicode, 0));
@@ -719,6 +762,9 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
Py_ssize_t char_size;
int share_wstr, share_utf8;
void *data;
+#ifdef Py_DEBUG
+ Py_ssize_t old_length = _PyUnicode_LENGTH(unicode);
+#endif
data = _PyUnicode_DATA_ANY(unicode);
char_size = PyUnicode_KIND(unicode);
@@ -754,6 +800,9 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
}
_PyUnicode_LENGTH(unicode) = length;
PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0);
+#ifdef Py_DEBUG
+ unicode_fill_invalid(unicode, old_length);
+#endif
if (share_wstr || _PyUnicode_WSTR(unicode) == NULL) {
assert(_PyUnicode_CheckConsistency(unicode, 0));
return 0;
@@ -806,8 +855,8 @@ resize_copy(PyObject *unicode, Py_ssize_t length)
return NULL;
copy_length = _PyUnicode_WSTR_LENGTH(unicode);
copy_length = Py_MIN(copy_length, length);
- Py_UNICODE_COPY(_PyUnicode_WSTR(w), _PyUnicode_WSTR(unicode),
- copy_length);
+ Py_MEMCPY(_PyUnicode_WSTR(w), _PyUnicode_WSTR(unicode),
+ copy_length * sizeof(wchar_t));
return w;
}
}
@@ -824,7 +873,7 @@ resize_copy(PyObject *unicode, Py_ssize_t length)
static PyUnicodeObject *
_PyUnicode_New(Py_ssize_t length)
{
- register PyUnicodeObject *unicode;
+ PyUnicodeObject *unicode;
size_t new_size;
/* Optimization for empty strings */
@@ -1078,11 +1127,7 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar)
}
}
#ifdef Py_DEBUG
- /* Fill the data with invalid characters to detect bugs earlier.
- _PyUnicode_CheckConsistency(str, 1) detects invalid characters,
- at least for ASCII and UCS-4 strings. U+00FF is invalid in ASCII
- and U+FFFFFFFF is an invalid character in Unicode 6.0. */
- memset(data, 0xff, size * kind);
+ unicode_fill_invalid((PyObject*)unicode, 0);
#endif
assert(_PyUnicode_CheckConsistency((PyObject*)unicode, 0));
return obj;
@@ -1512,7 +1557,7 @@ _PyUnicode_Ready(PyObject *unicode)
}
static void
-unicode_dealloc(register PyObject *unicode)
+unicode_dealloc(PyObject *unicode)
{
switch (PyUnicode_CHECK_INTERNED(unicode)) {
case SSTATE_NOT_INTERNED:
@@ -1644,38 +1689,6 @@ PyUnicode_Resize(PyObject **p_unicode, Py_ssize_t length)
return unicode_resize(p_unicode, length);
}
-static int
-unicode_widen(PyObject **p_unicode, Py_ssize_t length,
- unsigned int maxchar)
-{
- PyObject *result;
- assert(PyUnicode_IS_READY(*p_unicode));
- assert(length <= PyUnicode_GET_LENGTH(*p_unicode));
- if (maxchar <= PyUnicode_MAX_CHAR_VALUE(*p_unicode))
- return 0;
- result = PyUnicode_New(PyUnicode_GET_LENGTH(*p_unicode),
- maxchar);
- if (result == NULL)
- return -1;
- _PyUnicode_FastCopyCharacters(result, 0, *p_unicode, 0, length);
- Py_DECREF(*p_unicode);
- *p_unicode = result;
- return 0;
-}
-
-static int
-unicode_putchar(PyObject **p_unicode, Py_ssize_t *pos,
- Py_UCS4 ch)
-{
- assert(ch <= MAX_UNICODE);
- if (unicode_widen(p_unicode, *pos, ch) < 0)
- return -1;
- PyUnicode_WRITE(PyUnicode_KIND(*p_unicode),
- PyUnicode_DATA(*p_unicode),
- (*pos)++, ch);
- return 0;
-}
-
/* Copy a ASCII or latin1 char* string into a Python Unicode string.
WARNING: The function doesn't copy the terminating null character and
@@ -1692,6 +1705,14 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index,
switch (kind) {
case PyUnicode_1BYTE_KIND: {
assert(index + len <= PyUnicode_GET_LENGTH(unicode));
+#ifdef Py_DEBUG
+ if (PyUnicode_IS_ASCII(unicode)) {
+ Py_UCS4 maxchar = ucs1lib_find_max_char(
+ (const Py_UCS1*)str,
+ (const Py_UCS1*)str + len);
+ assert(maxchar < 128);
+ }
+#endif
memcpy((char *) data + index, str, len);
break;
}
@@ -1937,13 +1958,17 @@ _PyUnicode_FromUCS2(const Py_UCS2 *u, Py_ssize_t size)
assert(size > 0);
if (size == 1) {
Py_UCS4 ch = u[0];
+ int kind;
+ void *data;
if (ch < 256)
return get_latin1_char((unsigned char)ch);
res = PyUnicode_New(1, ch);
if (res == NULL)
return NULL;
- PyUnicode_WRITE(PyUnicode_KIND(res), PyUnicode_DATA(res), 0, ch);
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ PyUnicode_WRITE(kind, data, 0, ch);
assert(_PyUnicode_CheckConsistency(res, 1));
return res;
}
@@ -1973,13 +1998,17 @@ _PyUnicode_FromUCS4(const Py_UCS4 *u, Py_ssize_t size)
assert(size > 0);
if (size == 1) {
Py_UCS4 ch = u[0];
+ int kind;
+ void *data;
if (ch < 256)
return get_latin1_char((unsigned char)ch);
res = PyUnicode_New(1, ch);
if (res == NULL)
return NULL;
- PyUnicode_WRITE(PyUnicode_KIND(res), PyUnicode_DATA(res), 0, ch);
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ PyUnicode_WRITE(kind, data, 0, ch);
assert(_PyUnicode_CheckConsistency(res, 1));
return res;
}
@@ -2258,7 +2287,7 @@ PyUnicode_AsUCS4Copy(PyObject *string)
#ifdef HAVE_WCHAR_H
PyObject *
-PyUnicode_FromWideChar(register const wchar_t *w, Py_ssize_t size)
+PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size)
{
if (w == NULL) {
if (size == 0)
@@ -2278,16 +2307,9 @@ PyUnicode_FromWideChar(register const wchar_t *w, Py_ssize_t size)
static void
makefmt(char *fmt, int longflag, int longlongflag, int size_tflag,
- int zeropad, int width, int precision, char c)
+ char c)
{
*fmt++ = '%';
- if (width) {
- if (zeropad)
- *fmt++ = '0';
- fmt += sprintf(fmt, "%d", width);
- }
- if (precision)
- fmt += sprintf(fmt, ".%d", precision);
if (longflag)
*fmt++ = 'l';
else if (longlongflag) {
@@ -2312,44 +2334,139 @@ makefmt(char *fmt, int longflag, int longlongflag, int size_tflag,
*fmt = '\0';
}
-/* helper for PyUnicode_FromFormatV() */
+/* maximum number of characters required for output of %lld or %p.
+ We need at most ceil(log10(256)*SIZEOF_LONG_LONG) digits,
+ plus 1 for the sign. 53/22 is an upper bound for log10(256). */
+#define MAX_LONG_LONG_CHARS (2 + (SIZEOF_LONG_LONG*53-1) / 22)
+
+static int
+unicode_fromformat_write_str(_PyUnicodeWriter *writer, PyObject *str,
+ Py_ssize_t width, Py_ssize_t precision)
+{
+ Py_ssize_t length, fill, arglen;
+ Py_UCS4 maxchar;
+
+ if (PyUnicode_READY(str) == -1)
+ return -1;
+
+ length = PyUnicode_GET_LENGTH(str);
+ if ((precision == -1 || precision >= length)
+ && width <= length)
+ return _PyUnicodeWriter_WriteStr(writer, str);
+
+ if (precision != -1)
+ length = Py_MIN(precision, length);
+
+ arglen = Py_MAX(length, width);
+ if (PyUnicode_MAX_CHAR_VALUE(str) > writer->maxchar)
+ maxchar = _PyUnicode_FindMaxChar(str, 0, length);
+ else
+ maxchar = writer->maxchar;
+
+ if (_PyUnicodeWriter_Prepare(writer, arglen, maxchar) == -1)
+ return -1;
+
+ if (width > length) {
+ fill = width - length;
+ if (PyUnicode_Fill(writer->buffer, writer->pos, fill, ' ') == -1)
+ return -1;
+ writer->pos += fill;
+ }
+
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ str, 0, length);
+ writer->pos += length;
+ return 0;
+}
+
+static int
+unicode_fromformat_write_cstr(_PyUnicodeWriter *writer, const char *str,
+ Py_ssize_t width, Py_ssize_t precision)
+{
+ /* UTF-8 */
+ Py_ssize_t length;
+ PyObject *unicode;
+ int res;
+
+ length = strlen(str);
+ if (precision != -1)
+ length = Py_MIN(length, precision);
+ unicode = PyUnicode_DecodeUTF8Stateful(str, length, "replace", NULL);
+ if (unicode == NULL)
+ return -1;
+
+ res = unicode_fromformat_write_str(writer, unicode, width, -1);
+ Py_DECREF(unicode);
+ return res;
+}
static const char*
-parse_format_flags(const char *f,
- int *p_width, int *p_precision,
- int *p_longflag, int *p_longlongflag, int *p_size_tflag)
+unicode_fromformat_arg(_PyUnicodeWriter *writer,
+ const char *f, va_list *vargs)
{
- int width, precision, longflag, longlongflag, size_tflag;
+ const char *p;
+ Py_ssize_t len;
+ int zeropad;
+ Py_ssize_t width;
+ Py_ssize_t precision;
+ int longflag;
+ int longlongflag;
+ int size_tflag;
+ Py_ssize_t fill;
- /* parse the width.precision part, e.g. "%2.5s" => width=2, precision=5 */
+ p = f;
f++;
- width = 0;
- while (Py_ISDIGIT((unsigned)*f))
- width = (width*10) + *f++ - '0';
- precision = 0;
+ zeropad = 0;
+ if (*f == '0') {
+ zeropad = 1;
+ f++;
+ }
+
+ /* parse the width.precision part, e.g. "%2.5s" => width=2, precision=5 */
+ width = -1;
+ if (Py_ISDIGIT((unsigned)*f)) {
+ width = *f - '0';
+ f++;
+ while (Py_ISDIGIT((unsigned)*f)) {
+ if (width > (PY_SSIZE_T_MAX - ((int)*f - '0')) / 10) {
+ PyErr_SetString(PyExc_ValueError,
+ "width too big");
+ return NULL;
+ }
+ width = (width * 10) + (*f - '0');
+ f++;
+ }
+ }
+ precision = -1;
if (*f == '.') {
f++;
- while (Py_ISDIGIT((unsigned)*f))
- precision = (precision*10) + *f++ - '0';
+ if (Py_ISDIGIT((unsigned)*f)) {
+ precision = (*f - '0');
+ f++;
+ while (Py_ISDIGIT((unsigned)*f)) {
+ if (precision > (PY_SSIZE_T_MAX - ((int)*f - '0')) / 10) {
+ PyErr_SetString(PyExc_ValueError,
+ "precision too big");
+ return NULL;
+ }
+ precision = (precision * 10) + (*f - '0');
+ f++;
+ }
+ }
if (*f == '%') {
/* "%.3%s" => f points to "3" */
f--;
}
}
if (*f == '\0') {
- /* bogus format "%.1" => go backward, f points to "1" */
+ /* bogus format "%.123" => go backward, f points to "3" */
f--;
}
- if (p_width != NULL)
- *p_width = width;
- if (p_precision != NULL)
- *p_precision = precision;
/* Handle %ld, %lu, %lld and %llu. */
longflag = 0;
longlongflag = 0;
size_tflag = 0;
-
if (*f == 'l') {
if (f[1] == 'd' || f[1] == 'u' || f[1] == 'i') {
longflag = 1;
@@ -2368,499 +2485,289 @@ parse_format_flags(const char *f,
size_tflag = 1;
++f;
}
- if (p_longflag != NULL)
- *p_longflag = longflag;
- if (p_longlongflag != NULL)
- *p_longlongflag = longlongflag;
- if (p_size_tflag != NULL)
- *p_size_tflag = size_tflag;
- return f;
-}
-/* maximum number of characters required for output of %ld. 21 characters
- allows for 64-bit integers (in decimal) and an optional sign. */
-#define MAX_LONG_CHARS 21
-/* maximum number of characters required for output of %lld.
- We need at most ceil(log10(256)*SIZEOF_LONG_LONG) digits,
- plus 1 for the sign. 53/22 is an upper bound for log10(256). */
-#define MAX_LONG_LONG_CHARS (2 + (SIZEOF_LONG_LONG*53-1) / 22)
+ if (f[1] == '\0')
+ writer->overallocate = 0;
-PyObject *
-PyUnicode_FromFormatV(const char *format, va_list vargs)
-{
- va_list count;
- Py_ssize_t callcount = 0;
- PyObject **callresults = NULL;
- PyObject **callresult = NULL;
- Py_ssize_t n = 0;
- int width = 0;
- int precision = 0;
- int zeropad;
- const char* f;
- PyObject *string;
- /* used by sprintf */
- char fmt[61]; /* should be enough for %0width.precisionlld */
- Py_UCS4 maxchar = 127; /* result is ASCII by default */
- Py_UCS4 argmaxchar;
- Py_ssize_t numbersize = 0;
- char *numberresults = NULL;
- char *numberresult = NULL;
- Py_ssize_t i;
- int kind;
- void *data;
+ switch (*f) {
+ case 'c':
+ {
+ int ordinal = va_arg(*vargs, int);
+ if (ordinal < 0 || ordinal > MAX_UNICODE) {
+ PyErr_SetString(PyExc_OverflowError,
+ "character argument not in range(0x110000)");
+ return NULL;
+ }
+ if (_PyUnicodeWriter_WriteCharInline(writer, ordinal) < 0)
+ return NULL;
+ break;
+ }
- Py_VA_COPY(count, vargs);
- /* step 1: count the number of %S/%R/%A/%s format specifications
- * (we call PyObject_Str()/PyObject_Repr()/PyObject_ASCII()/
- * PyUnicode_DecodeUTF8() for these objects once during step 3 and put the
- * result in an array)
- * also estimate a upper bound for all the number formats in the string,
- * numbers will be formatted in step 3 and be kept in a '\0'-separated
- * buffer before putting everything together. */
- for (f = format; *f; f++) {
- if (*f == '%') {
- int longlongflag;
- /* skip width or width.precision (eg. "1.2" of "%1.2f") */
- f = parse_format_flags(f, &width, NULL, NULL, &longlongflag, NULL);
- if (*f == 's' || *f=='S' || *f=='R' || *f=='A' || *f=='V')
- ++callcount;
+ case 'i':
+ case 'd':
+ case 'u':
+ case 'x':
+ {
+ /* used by sprintf */
+ char fmt[10]; /* should be enough for "%0lld\0" */
+ char buffer[MAX_LONG_LONG_CHARS];
+ Py_ssize_t arglen;
+
+ if (*f == 'u') {
+ makefmt(fmt, longflag, longlongflag, size_tflag, *f);
- else if (*f == 'd' || *f=='u' || *f=='i' || *f=='x' || *f=='p') {
+ if (longflag)
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, unsigned long));
#ifdef HAVE_LONG_LONG
- if (longlongflag) {
- if (width < MAX_LONG_LONG_CHARS)
- width = MAX_LONG_LONG_CHARS;
- }
- else
+ else if (longlongflag)
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, unsigned PY_LONG_LONG));
#endif
- /* MAX_LONG_CHARS is enough to hold a 64-bit integer,
- including sign. Decimal takes the most space. This
- isn't enough for octal. If a width is specified we
- need more (which we allocate later). */
- if (width < MAX_LONG_CHARS)
- width = MAX_LONG_CHARS;
-
- /* account for the size + '\0' to separate numbers
- inside of the numberresults buffer */
- numbersize += (width + 1);
- }
+ else if (size_tflag)
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, size_t));
+ else
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, unsigned int));
+ }
+ else if (*f == 'x') {
+ makefmt(fmt, 0, 0, 0, 'x');
+ len = sprintf(buffer, fmt, va_arg(*vargs, int));
+ }
+ else {
+ makefmt(fmt, longflag, longlongflag, size_tflag, *f);
+
+ if (longflag)
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, long));
+#ifdef HAVE_LONG_LONG
+ else if (longlongflag)
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, PY_LONG_LONG));
+#endif
+ else if (size_tflag)
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, Py_ssize_t));
+ else
+ len = sprintf(buffer, fmt,
+ va_arg(*vargs, int));
}
- else if ((unsigned char)*f > 127) {
- PyErr_Format(PyExc_ValueError,
- "PyUnicode_FromFormatV() expects an ASCII-encoded format "
- "string, got a non-ASCII byte: 0x%02x",
- (unsigned char)*f);
+ assert(len >= 0);
+
+ if (precision < len)
+ precision = len;
+
+ arglen = Py_MAX(precision, width);
+ assert(ucs1lib_find_max_char((Py_UCS1*)buffer, (Py_UCS1*)buffer + len) <= 127);
+ if (_PyUnicodeWriter_Prepare(writer, arglen, 127) == -1)
return NULL;
+
+ if (width > precision) {
+ Py_UCS4 fillchar;
+ fill = width - precision;
+ fillchar = zeropad?'0':' ';
+ if (PyUnicode_Fill(writer->buffer, writer->pos, fill, fillchar) == -1)
+ return NULL;
+ writer->pos += fill;
}
+ if (precision > len) {
+ fill = precision - len;
+ if (PyUnicode_Fill(writer->buffer, writer->pos, fill, '0') == -1)
+ return NULL;
+ writer->pos += fill;
+ }
+
+ unicode_write_cstr(writer->buffer, writer->pos, buffer, len);
+ writer->pos += len;
+ break;
}
- /* step 2: allocate memory for the results of
- * PyObject_Str()/PyObject_Repr()/PyUnicode_DecodeUTF8() calls */
- if (callcount) {
- callresults = PyObject_Malloc(sizeof(PyObject *) * callcount);
- if (!callresults) {
- PyErr_NoMemory();
+
+ case 'p':
+ {
+ char number[MAX_LONG_LONG_CHARS];
+
+ len = sprintf(number, "%p", va_arg(*vargs, void*));
+ assert(len >= 0);
+
+ /* %p is ill-defined: ensure leading 0x. */
+ if (number[1] == 'X')
+ number[1] = 'x';
+ else if (number[1] != 'x') {
+ memmove(number + 2, number,
+ strlen(number) + 1);
+ number[0] = '0';
+ number[1] = 'x';
+ len += 2;
+ }
+
+ assert(ucs1lib_find_max_char((Py_UCS1*)number, (Py_UCS1*)number + len) <= 127);
+ if (_PyUnicodeWriter_Prepare(writer, len, 127) == -1)
+ return NULL;
+ unicode_write_cstr(writer->buffer, writer->pos, number, len);
+ writer->pos += len;
+ break;
+ }
+
+ case 's':
+ {
+ /* UTF-8 */
+ const char *s = va_arg(*vargs, const char*);
+ if (unicode_fromformat_write_cstr(writer, s, width, precision) < 0)
+ return NULL;
+ break;
+ }
+
+ case 'U':
+ {
+ PyObject *obj = va_arg(*vargs, PyObject *);
+ assert(obj && _PyUnicode_CHECK(obj));
+
+ if (unicode_fromformat_write_str(writer, obj, width, precision) == -1)
return NULL;
+ break;
+ }
+
+ case 'V':
+ {
+ PyObject *obj = va_arg(*vargs, PyObject *);
+ const char *str = va_arg(*vargs, const char *);
+ if (obj) {
+ assert(_PyUnicode_CHECK(obj));
+ if (unicode_fromformat_write_str(writer, obj, width, precision) == -1)
+ return NULL;
+ }
+ else {
+ assert(str != NULL);
+ if (unicode_fromformat_write_cstr(writer, str, width, precision) < 0)
+ return NULL;
}
- callresult = callresults;
+ break;
}
- /* step 2.5: allocate memory for the results of formating numbers */
- if (numbersize) {
- numberresults = PyObject_Malloc(numbersize);
- if (!numberresults) {
- PyErr_NoMemory();
- goto fail;
+
+ case 'S':
+ {
+ PyObject *obj = va_arg(*vargs, PyObject *);
+ PyObject *str;
+ assert(obj);
+ str = PyObject_Str(obj);
+ if (!str)
+ return NULL;
+ if (unicode_fromformat_write_str(writer, str, width, precision) == -1) {
+ Py_DECREF(str);
+ return NULL;
}
- numberresult = numberresults;
+ Py_DECREF(str);
+ break;
}
- /* step 3: format numbers and figure out how large a buffer we need */
- for (f = format; *f; f++) {
- if (*f == '%') {
- const char* p;
- int longflag;
- int longlongflag;
- int size_tflag;
- int numprinted;
+ case 'R':
+ {
+ PyObject *obj = va_arg(*vargs, PyObject *);
+ PyObject *repr;
+ assert(obj);
+ repr = PyObject_Repr(obj);
+ if (!repr)
+ return NULL;
+ if (unicode_fromformat_write_str(writer, repr, width, precision) == -1) {
+ Py_DECREF(repr);
+ return NULL;
+ }
+ Py_DECREF(repr);
+ break;
+ }
- p = f;
- zeropad = (f[1] == '0');
- f = parse_format_flags(f, &width, &precision,
- &longflag, &longlongflag, &size_tflag);
- switch (*f) {
- case 'c':
- {
- int ordinal = va_arg(count, int);
- if (ordinal < 0 || ordinal > MAX_UNICODE) {
- PyErr_SetString(PyExc_OverflowError,
- "%c arg not in range(0x110000)");
- goto fail;
- }
- maxchar = Py_MAX(maxchar, (Py_UCS4)ordinal);
- n++;
- break;
- }
- case '%':
- n++;
- break;
- case 'i':
- case 'd':
- makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
- width, precision, *f);
- if (longflag)
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, long));
-#ifdef HAVE_LONG_LONG
- else if (longlongflag)
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, PY_LONG_LONG));
-#endif
- else if (size_tflag)
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, Py_ssize_t));
- else
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, int));
- n += numprinted;
- /* advance by +1 to skip over the '\0' */
- numberresult += (numprinted + 1);
- assert(*(numberresult - 1) == '\0');
- assert(*(numberresult - 2) != '\0');
- assert(numprinted >= 0);
- assert(numberresult <= numberresults + numbersize);
- break;
- case 'u':
- makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
- width, precision, 'u');
- if (longflag)
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, unsigned long));
-#ifdef HAVE_LONG_LONG
- else if (longlongflag)
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, unsigned PY_LONG_LONG));
-#endif
- else if (size_tflag)
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, size_t));
- else
- numprinted = sprintf(numberresult, fmt,
- va_arg(count, unsigned int));
- n += numprinted;
- numberresult += (numprinted + 1);
- assert(*(numberresult - 1) == '\0');
- assert(*(numberresult - 2) != '\0');
- assert(numprinted >= 0);
- assert(numberresult <= numberresults + numbersize);
- break;
- case 'x':
- makefmt(fmt, 0, 0, 0, zeropad, width, precision, 'x');
- numprinted = sprintf(numberresult, fmt, va_arg(count, int));
- n += numprinted;
- numberresult += (numprinted + 1);
- assert(*(numberresult - 1) == '\0');
- assert(*(numberresult - 2) != '\0');
- assert(numprinted >= 0);
- assert(numberresult <= numberresults + numbersize);
- break;
- case 'p':
- numprinted = sprintf(numberresult, "%p", va_arg(count, void*));
- /* %p is ill-defined: ensure leading 0x. */
- if (numberresult[1] == 'X')
- numberresult[1] = 'x';
- else if (numberresult[1] != 'x') {
- memmove(numberresult + 2, numberresult,
- strlen(numberresult) + 1);
- numberresult[0] = '0';
- numberresult[1] = 'x';
- numprinted += 2;
- }
- n += numprinted;
- numberresult += (numprinted + 1);
- assert(*(numberresult - 1) == '\0');
- assert(*(numberresult - 2) != '\0');
- assert(numprinted >= 0);
- assert(numberresult <= numberresults + numbersize);
- break;
- case 's':
- {
- /* UTF-8 */
- const char *s = va_arg(count, const char*);
- PyObject *str = PyUnicode_DecodeUTF8Stateful(s, strlen(s), "replace", NULL);
- if (!str)
- goto fail;
- /* since PyUnicode_DecodeUTF8 returns already flexible
- unicode objects, there is no need to call ready on them */
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(str);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(str);
- /* Remember the str and switch to the next slot */
- *callresult++ = str;
- break;
- }
- case 'U':
- {
- PyObject *obj = va_arg(count, PyObject *);
- assert(obj && _PyUnicode_CHECK(obj));
- if (PyUnicode_READY(obj) == -1)
- goto fail;
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(obj);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(obj);
- break;
- }
- case 'V':
- {
- PyObject *obj = va_arg(count, PyObject *);
- const char *str = va_arg(count, const char *);
- PyObject *str_obj;
- assert(obj || str);
- assert(!obj || _PyUnicode_CHECK(obj));
- if (obj) {
- if (PyUnicode_READY(obj) == -1)
- goto fail;
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(obj);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(obj);
- *callresult++ = NULL;
- }
- else {
- str_obj = PyUnicode_DecodeUTF8Stateful(str, strlen(str), "replace", NULL);
- if (!str_obj)
- goto fail;
- if (PyUnicode_READY(str_obj) == -1) {
- Py_DECREF(str_obj);
- goto fail;
- }
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(str_obj);
- *callresult++ = str_obj;
- }
- break;
- }
- case 'S':
- {
- PyObject *obj = va_arg(count, PyObject *);
- PyObject *str;
- assert(obj);
- str = PyObject_Str(obj);
- if (!str)
- goto fail;
- if (PyUnicode_READY(str) == -1) {
- Py_DECREF(str);
- goto fail;
- }
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(str);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(str);
- /* Remember the str and switch to the next slot */
- *callresult++ = str;
- break;
- }
- case 'R':
- {
- PyObject *obj = va_arg(count, PyObject *);
- PyObject *repr;
- assert(obj);
- repr = PyObject_Repr(obj);
- if (!repr)
- goto fail;
- if (PyUnicode_READY(repr) == -1) {
- Py_DECREF(repr);
- goto fail;
- }
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(repr);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(repr);
- /* Remember the repr and switch to the next slot */
- *callresult++ = repr;
- break;
- }
- case 'A':
- {
- PyObject *obj = va_arg(count, PyObject *);
- PyObject *ascii;
- assert(obj);
- ascii = PyObject_ASCII(obj);
- if (!ascii)
- goto fail;
- if (PyUnicode_READY(ascii) == -1) {
- Py_DECREF(ascii);
- goto fail;
- }
- argmaxchar = PyUnicode_MAX_CHAR_VALUE(ascii);
- maxchar = Py_MAX(maxchar, argmaxchar);
- n += PyUnicode_GET_LENGTH(ascii);
- /* Remember the repr and switch to the next slot */
- *callresult++ = ascii;
- break;
- }
- default:
- /* if we stumble upon an unknown
- formatting code, copy the rest of
- the format string to the output
- string. (we cannot just skip the
- code, since there's no way to know
- what's in the argument list) */
- n += strlen(p);
- goto expand;
- }
- } else
- n++;
- }
- expand:
- /* step 4: fill the buffer */
- /* Since we've analyzed how much space we need,
- we don't have to resize the string.
- There can be no errors beyond this point. */
- string = PyUnicode_New(n, maxchar);
- if (!string)
- goto fail;
- kind = PyUnicode_KIND(string);
- data = PyUnicode_DATA(string);
- callresult = callresults;
- numberresult = numberresults;
+ case 'A':
+ {
+ PyObject *obj = va_arg(*vargs, PyObject *);
+ PyObject *ascii;
+ assert(obj);
+ ascii = PyObject_ASCII(obj);
+ if (!ascii)
+ return NULL;
+ if (unicode_fromformat_write_str(writer, ascii, width, precision) == -1) {
+ Py_DECREF(ascii);
+ return NULL;
+ }
+ Py_DECREF(ascii);
+ break;
+ }
+
+ case '%':
+ if (_PyUnicodeWriter_WriteCharInline(writer, '%') < 0)
+ return NULL;
+ break;
+
+ default:
+ /* if we stumble upon an unknown formatting code, copy the rest
+ of the format string to the output string. (we cannot just
+ skip the code, since there's no way to know what's in the
+ argument list) */
+ len = strlen(p);
+ if (_PyUnicodeWriter_WriteCstr(writer, p, len) == -1)
+ return NULL;
+ f = p+len;
+ return f;
+ }
+
+ f++;
+ return f;
+}
+
+PyObject *
+PyUnicode_FromFormatV(const char *format, va_list vargs)
+{
+ va_list vargs2;
+ const char *f;
+ _PyUnicodeWriter writer;
- for (i = 0, f = format; *f; f++) {
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = strlen(format) + 100;
+ writer.overallocate = 1;
+
+ /* va_list may be an array (of 1 item) on some platforms (ex: AMD64).
+ Copy it to be able to pass a reference to a subfunction. */
+ Py_VA_COPY(vargs2, vargs);
+
+ for (f = format; *f; ) {
if (*f == '%') {
- const char* p;
+ f = unicode_fromformat_arg(&writer, f, &vargs2);
+ if (f == NULL)
+ goto fail;
+ }
+ else {
+ const char *p;
+ Py_ssize_t len;
p = f;
- f = parse_format_flags(f, NULL, NULL, NULL, NULL, NULL);
- /* checking for == because the last argument could be a empty
- string, which causes i to point to end, the assert at the end of
- the loop */
- assert(i <= PyUnicode_GET_LENGTH(string));
-
- switch (*f) {
- case 'c':
- {
- const int ordinal = va_arg(vargs, int);
- PyUnicode_WRITE(kind, data, i++, ordinal);
- break;
- }
- case 'i':
- case 'd':
- case 'u':
- case 'x':
- case 'p':
- {
- Py_ssize_t len;
- /* unused, since we already have the result */
- if (*f == 'p')
- (void) va_arg(vargs, void *);
- else
- (void) va_arg(vargs, int);
- /* extract the result from numberresults and append. */
- len = strlen(numberresult);
- unicode_write_cstr(string, i, numberresult, len);
- /* skip over the separating '\0' */
- i += len;
- numberresult += len;
- assert(*numberresult == '\0');
- numberresult++;
- assert(numberresult <= numberresults + numbersize);
- break;
- }
- case 's':
- {
- /* unused, since we already have the result */
- Py_ssize_t size;
- (void) va_arg(vargs, char *);
- size = PyUnicode_GET_LENGTH(*callresult);
- assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string));
- _PyUnicode_FastCopyCharacters(string, i, *callresult, 0, size);
- i += size;
- /* We're done with the unicode()/repr() => forget it */
- Py_DECREF(*callresult);
- /* switch to next unicode()/repr() result */
- ++callresult;
- break;
- }
- case 'U':
+ do
{
- PyObject *obj = va_arg(vargs, PyObject *);
- Py_ssize_t size;
- assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string));
- size = PyUnicode_GET_LENGTH(obj);
- _PyUnicode_FastCopyCharacters(string, i, obj, 0, size);
- i += size;
- break;
- }
- case 'V':
- {
- Py_ssize_t size;
- PyObject *obj = va_arg(vargs, PyObject *);
- va_arg(vargs, const char *);
- if (obj) {
- size = PyUnicode_GET_LENGTH(obj);
- assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string));
- _PyUnicode_FastCopyCharacters(string, i, obj, 0, size);
- i += size;
- } else {
- size = PyUnicode_GET_LENGTH(*callresult);
- assert(PyUnicode_KIND(*callresult) <=
- PyUnicode_KIND(string));
- _PyUnicode_FastCopyCharacters(string, i, *callresult, 0, size);
- i += size;
- Py_DECREF(*callresult);
+ if ((unsigned char)*p > 127) {
+ PyErr_Format(PyExc_ValueError,
+ "PyUnicode_FromFormatV() expects an ASCII-encoded format "
+ "string, got a non-ASCII byte: 0x%02x",
+ (unsigned char)*p);
+ return NULL;
}
- ++callresult;
- break;
- }
- case 'S':
- case 'R':
- case 'A':
- {
- Py_ssize_t size = PyUnicode_GET_LENGTH(*callresult);
- /* unused, since we already have the result */
- (void) va_arg(vargs, PyObject *);
- assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string));
- _PyUnicode_FastCopyCharacters(string, i, *callresult, 0, size);
- i += size;
- /* We're done with the unicode()/repr() => forget it */
- Py_DECREF(*callresult);
- /* switch to next unicode()/repr() result */
- ++callresult;
- break;
- }
- case '%':
- PyUnicode_WRITE(kind, data, i++, '%');
- break;
- default:
- {
- Py_ssize_t len = strlen(p);
- unicode_write_cstr(string, i, p, len);
- i += len;
- assert(i == PyUnicode_GET_LENGTH(string));
- goto end;
- }
+ p++;
}
- }
- else {
- assert(i < PyUnicode_GET_LENGTH(string));
- PyUnicode_WRITE(kind, data, i++, *f);
+ while (*p != '\0' && *p != '%');
+ len = p - f;
+
+ if (*p == '\0')
+ writer.overallocate = 0;
+ if (_PyUnicodeWriter_Prepare(&writer, len, 127) == -1)
+ goto fail;
+ unicode_write_cstr(writer.buffer, writer.pos, f, len);
+ writer.pos += len;
+
+ f = p;
}
}
- assert(i == PyUnicode_GET_LENGTH(string));
+ return _PyUnicodeWriter_Finish(&writer);
- end:
- if (callresults)
- PyObject_Free(callresults);
- if (numberresults)
- PyObject_Free(numberresults);
- return unicode_result(string);
fail:
- if (callresults) {
- PyObject **callresult2 = callresults;
- while (callresult2 < callresult) {
- Py_XDECREF(*callresult2);
- ++callresult2;
- }
- PyObject_Free(callresults);
- }
- if (numberresults)
- PyObject_Free(numberresults);
+ _PyUnicodeWriter_Dealloc(&writer);
return NULL;
}
@@ -2968,6 +2875,9 @@ PyObject *
PyUnicode_FromOrdinal(int ordinal)
{
PyObject *v;
+ void *data;
+ int kind;
+
if (ordinal < 0 || ordinal > MAX_UNICODE) {
PyErr_SetString(PyExc_ValueError,
"chr() arg not in range(0x110000)");
@@ -2980,13 +2890,15 @@ PyUnicode_FromOrdinal(int ordinal)
v = PyUnicode_New(1, ordinal);
if (v == NULL)
return NULL;
- PyUnicode_WRITE(PyUnicode_KIND(v), PyUnicode_DATA(v), 0, ordinal);
+ kind = PyUnicode_KIND(v);
+ data = PyUnicode_DATA(v);
+ PyUnicode_WRITE(kind, data, 0, ordinal);
assert(_PyUnicode_CheckConsistency(v, 1));
return v;
}
PyObject *
-PyUnicode_FromObject(register PyObject *obj)
+PyUnicode_FromObject(PyObject *obj)
{
/* XXX Perhaps we should make this API an alias of
PyObject_Str() instead ?! */
@@ -3008,7 +2920,7 @@ PyUnicode_FromObject(register PyObject *obj)
}
PyObject *
-PyUnicode_FromEncodedObject(register PyObject *obj,
+PyUnicode_FromEncodedObject(PyObject *obj,
const char *encoding,
const char *errors)
{
@@ -3060,8 +2972,8 @@ PyUnicode_FromEncodedObject(register PyObject *obj,
1 on success. */
int
_Py_normalize_encoding(const char *encoding,
- char *lower,
- size_t lower_len)
+ char *lower,
+ size_t lower_len)
{
const char *e;
char *l;
@@ -3343,7 +3255,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors)
}
if (surrogateescape) {
- /* locale encoding with surrogateescape */
+ /* "surrogateescape" error handler */
char *str;
str = _Py_wchar2char(wstr, &error_pos);
@@ -3363,6 +3275,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors)
PyMem_Free(str);
}
else {
+ /* strict mode */
size_t len, len2;
len = wcstombs(NULL, wstr, 0);
@@ -3401,7 +3314,7 @@ encode_error:
wstr = _Py_char2wchar(errmsg, &errlen);
if (wstr != NULL) {
reason = PyUnicode_FromWideChar(wstr, errlen);
- PyMem_Free(wstr);
+ PyMem_RawFree(wstr);
} else
errmsg = NULL;
}
@@ -3608,8 +3521,8 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
return NULL;
}
- if (surrogateescape)
- {
+ if (surrogateescape) {
+ /* "surrogateescape" error handler */
wstr = _Py_char2wchar(str, &wlen);
if (wstr == NULL) {
if (wlen == (size_t)-1)
@@ -3620,9 +3533,10 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
}
unicode = PyUnicode_FromWideChar(wstr, wlen);
- PyMem_Free(wstr);
+ PyMem_RawFree(wstr);
}
else {
+ /* strict mode */
#ifndef HAVE_BROKEN_MBSTOWCS
wlen = mbstowcs(NULL, str, 0);
#else
@@ -3642,7 +3556,6 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
return PyErr_NoMemory();
}
- /* This shouldn't fail now */
wlen2 = mbstowcs(wstr, str, wlen+1);
if (wlen2 == (size_t)-1) {
if (wstr != smallbuf)
@@ -3668,7 +3581,7 @@ decode_error:
wstr = _Py_char2wchar(errmsg, &errlen);
if (wstr != NULL) {
reason = PyUnicode_FromWideChar(wstr, errlen);
- PyMem_Free(wstr);
+ PyMem_RawFree(wstr);
} else
errmsg = NULL;
}
@@ -3736,18 +3649,20 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size)
int
-_PyUnicode_HasNULChars(PyObject* s)
+_PyUnicode_HasNULChars(PyObject* str)
{
- static PyObject *nul = NULL;
+ Py_ssize_t pos;
- if (nul == NULL)
- nul = PyUnicode_FromStringAndSize("\0", 1);
- if (nul == NULL)
+ if (PyUnicode_READY(str) == -1)
return -1;
- return PyUnicode_Contains(s, nul);
+ pos = findchar(PyUnicode_DATA(str), PyUnicode_KIND(str),
+ PyUnicode_GET_LENGTH(str), '\0', 1);
+ if (pos == -1)
+ return 0;
+ else
+ return 1;
}
-
int
PyUnicode_FSConverter(PyObject* arg, void* addr)
{
@@ -4019,6 +3934,9 @@ PyUnicode_GetLength(PyObject *unicode)
Py_UCS4
PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index)
{
+ void *data;
+ int kind;
+
if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) == -1) {
PyErr_BadArgument();
return (Py_UCS4)-1;
@@ -4027,7 +3945,9 @@ PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index)
PyErr_SetString(PyExc_IndexError, "string index out of range");
return (Py_UCS4)-1;
}
- return PyUnicode_READ_CHAR(unicode, index);
+ data = PyUnicode_DATA(unicode);
+ kind = PyUnicode_KIND(unicode);
+ return PyUnicode_READ(kind, data, index);
}
int
@@ -4086,6 +4006,7 @@ onError:
*exceptionObject = NULL;
}
+#ifdef HAVE_MBCS
/* error handling callback helper:
build arguments, call the callback and check the arguments,
if no exception occurred, copy the replacement to the output
@@ -4094,11 +4015,12 @@ onError:
*/
static int
-unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler,
- const char *encoding, const char *reason,
- const char **input, const char **inend, Py_ssize_t *startinpos,
- Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
- PyObject **output, Py_ssize_t *outpos)
+unicode_decode_call_errorhandler_wchar(
+ const char *errors, PyObject **errorHandler,
+ const char *encoding, const char *reason,
+ const char **input, const char **inend, Py_ssize_t *startinpos,
+ Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
+ PyObject **output, Py_ssize_t *outpos)
{
static char *argparse = "O!n;decoding error handler must return (str, int) tuple";
@@ -4109,12 +4031,11 @@ unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler,
Py_ssize_t requiredsize;
Py_ssize_t newpos;
PyObject *inputobj = NULL;
- int res = -1;
+ wchar_t *repwstr;
+ Py_ssize_t repwlen;
- if (_PyUnicode_KIND(*output) != PyUnicode_WCHAR_KIND)
- outsize = PyUnicode_GET_LENGTH(*output);
- else
- outsize = _PyUnicode_WSTR_LENGTH(*output);
+ assert (_PyUnicode_KIND(*output) == PyUnicode_WCHAR_KIND);
+ outsize = _PyUnicode_WSTR_LENGTH(*output);
if (*errorHandler == NULL) {
*errorHandler = PyCodec_LookupError(errors);
@@ -4139,8 +4060,6 @@ unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler,
}
if (!PyArg_ParseTuple(restuple, argparse, &PyUnicode_Type, &repunicode, &newpos))
goto onError;
- if (PyUnicode_READY(repunicode) == -1)
- goto onError;
/* Copy back the bytes variables, which might have been modified by the
callback */
@@ -4164,54 +4083,118 @@ unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler,
goto onError;
}
- if (_PyUnicode_KIND(*output) != PyUnicode_WCHAR_KIND) {
- /* need more space? (at least enough for what we
- have+the replacement+the rest of the string (starting
- at the new input position), so we won't have to check space
- when there are no errors in the rest of the string) */
- Py_ssize_t replen = PyUnicode_GET_LENGTH(repunicode);
- requiredsize = *outpos + replen + insize-newpos;
- if (requiredsize > outsize) {
- if (requiredsize<2*outsize)
- requiredsize = 2*outsize;
- if (unicode_resize(output, requiredsize) < 0)
- goto onError;
- }
- if (unicode_widen(output, *outpos,
- PyUnicode_MAX_CHAR_VALUE(repunicode)) < 0)
+ repwstr = PyUnicode_AsUnicodeAndSize(repunicode, &repwlen);
+ if (repwstr == NULL)
+ goto onError;
+ /* need more space? (at least enough for what we
+ have+the replacement+the rest of the string (starting
+ at the new input position), so we won't have to check space
+ when there are no errors in the rest of the string) */
+ requiredsize = *outpos + repwlen + insize-newpos;
+ if (requiredsize > outsize) {
+ if (requiredsize < 2*outsize)
+ requiredsize = 2*outsize;
+ if (unicode_resize(output, requiredsize) < 0)
goto onError;
- _PyUnicode_FastCopyCharacters(*output, *outpos, repunicode, 0, replen);
- *outpos += replen;
}
- else {
- wchar_t *repwstr;
- Py_ssize_t repwlen;
- repwstr = PyUnicode_AsUnicodeAndSize(repunicode, &repwlen);
- if (repwstr == NULL)
+ wcsncpy(_PyUnicode_WSTR(*output) + *outpos, repwstr, repwlen);
+ *outpos += repwlen;
+
+ *endinpos = newpos;
+ *inptr = *input + newpos;
+
+ /* we made it! */
+ Py_XDECREF(restuple);
+ return 0;
+
+ onError:
+ Py_XDECREF(restuple);
+ return -1;
+}
+#endif /* HAVE_MBCS */
+
+static int
+unicode_decode_call_errorhandler_writer(
+ const char *errors, PyObject **errorHandler,
+ const char *encoding, const char *reason,
+ const char **input, const char **inend, Py_ssize_t *startinpos,
+ Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
+ _PyUnicodeWriter *writer /* PyObject **output, Py_ssize_t *outpos */)
+{
+ static char *argparse = "O!n;decoding error handler must return (str, int) tuple";
+
+ PyObject *restuple = NULL;
+ PyObject *repunicode = NULL;
+ Py_ssize_t insize;
+ Py_ssize_t newpos;
+ Py_ssize_t replen;
+ PyObject *inputobj = NULL;
+
+ if (*errorHandler == NULL) {
+ *errorHandler = PyCodec_LookupError(errors);
+ if (*errorHandler == NULL)
goto onError;
- /* need more space? (at least enough for what we
- have+the replacement+the rest of the string (starting
- at the new input position), so we won't have to check space
- when there are no errors in the rest of the string) */
- requiredsize = *outpos + repwlen + insize-newpos;
- if (requiredsize > outsize) {
- if (requiredsize < 2*outsize)
- requiredsize = 2*outsize;
- if (unicode_resize(output, requiredsize) < 0)
- goto onError;
- }
- wcsncpy(_PyUnicode_WSTR(*output) + *outpos, repwstr, repwlen);
- *outpos += repwlen;
}
+
+ make_decode_exception(exceptionObject,
+ encoding,
+ *input, *inend - *input,
+ *startinpos, *endinpos,
+ reason);
+ if (*exceptionObject == NULL)
+ goto onError;
+
+ restuple = PyObject_CallFunctionObjArgs(*errorHandler, *exceptionObject, NULL);
+ if (restuple == NULL)
+ goto onError;
+ if (!PyTuple_Check(restuple)) {
+ PyErr_SetString(PyExc_TypeError, &argparse[4]);
+ goto onError;
+ }
+ if (!PyArg_ParseTuple(restuple, argparse, &PyUnicode_Type, &repunicode, &newpos))
+ goto onError;
+
+ /* Copy back the bytes variables, which might have been modified by the
+ callback */
+ inputobj = PyUnicodeDecodeError_GetObject(*exceptionObject);
+ if (!inputobj)
+ goto onError;
+ if (!PyBytes_Check(inputobj)) {
+ PyErr_Format(PyExc_TypeError, "exception attribute object must be bytes");
+ }
+ *input = PyBytes_AS_STRING(inputobj);
+ insize = PyBytes_GET_SIZE(inputobj);
+ *inend = *input + insize;
+ /* we can DECREF safely, as the exception has another reference,
+ so the object won't go away. */
+ Py_DECREF(inputobj);
+
+ if (newpos<0)
+ newpos = insize+newpos;
+ if (newpos<0 || newpos>insize) {
+ PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos);
+ goto onError;
+ }
+
+ if (PyUnicode_READY(repunicode) < 0)
+ goto onError;
+ replen = PyUnicode_GET_LENGTH(repunicode);
+ writer->min_length += replen;
+ if (replen > 1)
+ writer->overallocate = 1;
+ if (_PyUnicodeWriter_WriteStr(writer, repunicode) == -1)
+ goto onError;
+
*endinpos = newpos;
*inptr = *input + newpos;
/* we made it! */
- res = 0;
+ Py_XDECREF(restuple);
+ return 0;
onError:
Py_XDECREF(restuple);
- return res;
+ return -1;
}
/* --- UTF-7 Codec -------------------------------------------------------- */
@@ -4319,9 +4302,8 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
const char *e;
- PyObject *unicode;
+ _PyUnicodeWriter writer;
const char *errmsg = "";
int inShift = 0;
Py_ssize_t shiftOutStart;
@@ -4331,17 +4313,17 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
- /* Start off assuming it's all ASCII. Widen later as necessary. */
- unicode = PyUnicode_New(size, 127);
- if (!unicode)
- return NULL;
if (size == 0) {
if (consumed)
*consumed = 0;
- return unicode;
+ _Py_RETURN_UNICODE_EMPTY();
}
- shiftOutStart = outpos = 0;
+ /* Start off assuming it's all ASCII. Widen later as necessary. */
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = size;
+
+ shiftOutStart = 0;
e = s + size;
while (s < e) {
@@ -4363,13 +4345,13 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
/* expecting a second surrogate */
if (Py_UNICODE_IS_LOW_SURROGATE(outCh)) {
Py_UCS4 ch2 = Py_UNICODE_JOIN_SURROGATES(surrogate, outCh);
- if (unicode_putchar(&unicode, &outpos, ch2) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch2) < 0)
goto onError;
surrogate = 0;
continue;
}
else {
- if (unicode_putchar(&unicode, &outpos, surrogate) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, surrogate) < 0)
goto onError;
surrogate = 0;
}
@@ -4379,7 +4361,7 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
surrogate = outCh;
}
else {
- if (unicode_putchar(&unicode, &outpos, outCh) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, outCh) < 0)
goto onError;
}
}
@@ -4388,7 +4370,7 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
inShift = 0;
s++;
if (surrogate) {
- if (unicode_putchar(&unicode, &outpos, surrogate) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, surrogate) < 0)
goto onError;
surrogate = 0;
}
@@ -4409,7 +4391,7 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
if (ch != '-') {
/* '-' is absorbed; other terminating
characters are preserved */
- if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0)
goto onError;
}
}
@@ -4419,19 +4401,19 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
s++; /* consume '+' */
if (s < e && *s == '-') { /* '+-' encodes '+' */
s++;
- if (unicode_putchar(&unicode, &outpos, '+') < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, '+') < 0)
goto onError;
}
else { /* begin base64-encoded section */
inShift = 1;
- shiftOutStart = outpos;
+ shiftOutStart = writer.pos;
base64bits = 0;
}
}
else if (DECODE_DIRECT(ch)) { /* character decodes as itself */
- if (unicode_putchar(&unicode, &outpos, ch) < 0)
- goto onError;
s++;
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0)
+ goto onError;
}
else {
startinpos = s-starts;
@@ -4442,11 +4424,11 @@ PyUnicode_DecodeUTF7Stateful(const char *s,
continue;
utf7Error:
endinpos = s-starts;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"utf7", errmsg,
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos))
+ &writer))
goto onError;
}
@@ -4458,11 +4440,11 @@ utf7Error:
(base64bits >= 6) ||
(base64bits > 0 && base64buffer != 0)) {
endinpos = size;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"utf7", "unterminated shift sequence",
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos))
+ &writer))
goto onError;
if (s < e)
goto restart;
@@ -4472,7 +4454,7 @@ utf7Error:
/* return state */
if (consumed) {
if (inShift) {
- outpos = shiftOutStart; /* back off output */
+ writer.pos = shiftOutStart; /* back off output */
*consumed = startinpos;
}
else {
@@ -4480,17 +4462,14 @@ utf7Error:
}
}
- if (unicode_resize(&unicode, outpos) < 0)
- goto onError;
-
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(unicode);
+ return _PyUnicodeWriter_Finish(&writer);
onError:
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- Py_DECREF(unicode);
+ _PyUnicodeWriter_Dealloc(&writer);
return NULL;
}
@@ -4573,7 +4552,7 @@ encode_char:
/* code first surrogate */
base64bits += 16;
- base64buffer = (base64buffer << 16) | 0xd800 | ((ch-0x10000) >> 10);
+ base64buffer = (base64buffer << 16) | Py_UNICODE_HIGH_SURROGATE(ch);
while (base64bits >= 6) {
*out++ = TO_BASE64(base64buffer >> (base64bits-6));
base64bits -= 6;
@@ -4674,9 +4653,9 @@ ascii_decode(const char *start, const char *end, Py_UCS1 *dest)
if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) {
/* Fast path, see in STRINGLIB(utf8_decode) for
an explanation. */
- /* Help register allocation */
- register const char *_p = p;
- register Py_UCS1 * q = dest;
+ /* Help allocation */
+ const char *_p = p;
+ Py_UCS1 * q = dest;
while (_p < aligned_end) {
unsigned long value = *(const unsigned long *) _p;
if (value & ASCII_CHAR_MASK)
@@ -4699,8 +4678,8 @@ ascii_decode(const char *start, const char *end, Py_UCS1 *dest)
/* Fast path, see in STRINGLIB(utf8_decode) in stringlib/codecs.h
for an explanation. */
if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) {
- /* Help register allocation */
- register const char *_p = p;
+ /* Help allocation */
+ const char *_p = p;
while (_p < aligned_end) {
unsigned long value = *(unsigned long *) _p;
if (value & ASCII_CHAR_MASK)
@@ -4725,10 +4704,9 @@ PyUnicode_DecodeUTF8Stateful(const char *s,
const char *errors,
Py_ssize_t *consumed)
{
- PyObject *unicode;
+ _PyUnicodeWriter writer;
const char *starts = s;
const char *end = s + size;
- Py_ssize_t outpos;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
@@ -4749,29 +4727,26 @@ PyUnicode_DecodeUTF8Stateful(const char *s,
return get_latin1_char((unsigned char)s[0]);
}
- unicode = PyUnicode_New(size, 127);
- if (!unicode)
- return NULL;
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = size;
+ if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1)
+ goto onError;
- outpos = ascii_decode(s, end, PyUnicode_1BYTE_DATA(unicode));
- s += outpos;
+ writer.pos = ascii_decode(s, end, writer.data);
+ s += writer.pos;
while (s < end) {
Py_UCS4 ch;
- int kind = PyUnicode_KIND(unicode);
+ int kind = writer.kind;
if (kind == PyUnicode_1BYTE_KIND) {
- if (PyUnicode_IS_ASCII(unicode))
- ch = asciilib_utf8_decode(&s, end,
- PyUnicode_1BYTE_DATA(unicode), &outpos);
+ if (PyUnicode_IS_ASCII(writer.buffer))
+ ch = asciilib_utf8_decode(&s, end, writer.data, &writer.pos);
else
- ch = ucs1lib_utf8_decode(&s, end,
- PyUnicode_1BYTE_DATA(unicode), &outpos);
+ ch = ucs1lib_utf8_decode(&s, end, writer.data, &writer.pos);
} else if (kind == PyUnicode_2BYTE_KIND) {
- ch = ucs2lib_utf8_decode(&s, end,
- PyUnicode_2BYTE_DATA(unicode), &outpos);
+ ch = ucs2lib_utf8_decode(&s, end, writer.data, &writer.pos);
} else {
assert(kind == PyUnicode_4BYTE_KIND);
- ch = ucs4lib_utf8_decode(&s, end,
- PyUnicode_4BYTE_DATA(unicode), &outpos);
+ ch = ucs4lib_utf8_decode(&s, end, writer.data, &writer.pos);
}
switch (ch) {
@@ -4795,35 +4770,31 @@ PyUnicode_DecodeUTF8Stateful(const char *s,
endinpos = startinpos + ch - 1;
break;
default:
- if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0)
goto onError;
continue;
}
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"utf-8", errmsg,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos))
+ &writer))
goto onError;
}
End:
- if (unicode_resize(&unicode, outpos) < 0)
- goto onError;
-
if (consumed)
*consumed = s - starts;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- assert(_PyUnicode_CheckConsistency(unicode, 1));
- return unicode;
+ return _PyUnicodeWriter_Finish(&writer);
onError:
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- Py_XDECREF(unicode);
+ _PyUnicodeWriter_Dealloc(&writer);
return NULL;
}
@@ -4833,7 +4804,7 @@ onError:
used to decode the command line arguments on Mac OS X.
Return a pointer to a newly allocated wide character string (use
- PyMem_Free() to free the memory), or NULL on memory allocation error. */
+ PyMem_RawFree() to free the memory), or NULL on memory allocation error. */
wchar_t*
_Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size)
@@ -4846,7 +4817,7 @@ _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size)
character count */
if (PY_SSIZE_T_MAX / sizeof(wchar_t) < (size + 1))
return NULL;
- unicode = PyMem_Malloc((size + 1) * sizeof(wchar_t));
+ unicode = PyMem_RawMalloc((size + 1) * sizeof(wchar_t));
if (!unicode)
return NULL;
@@ -4969,17 +4940,10 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
- PyObject *unicode;
+ _PyUnicodeWriter writer;
const unsigned char *q, *e;
- int bo = 0; /* assume native ordering by default */
+ int le, bo = 0; /* assume native ordering by default */
const char *errmsg = "";
- /* Offsets from q for retrieving bytes in the right order. */
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
- int iorder[] = {0, 1, 2, 3};
-#else
- int iorder[] = {3, 2, 1, 0};
-#endif
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
@@ -4993,107 +4957,106 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
byte order setting accordingly. In native mode, the leading BOM
mark is skipped, in all other modes, it is copied to the output
stream as-is (giving a ZWNBSP character). */
- if (bo == 0) {
- if (size >= 4) {
- const Py_UCS4 bom = (q[iorder[3]] << 24) | (q[iorder[2]] << 16) |
- (q[iorder[1]] << 8) | q[iorder[0]];
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
- if (bom == 0x0000FEFF) {
- q += 4;
- bo = -1;
- }
- else if (bom == 0xFFFE0000) {
- q += 4;
- bo = 1;
- }
-#else
- if (bom == 0x0000FEFF) {
- q += 4;
- bo = 1;
- }
- else if (bom == 0xFFFE0000) {
- q += 4;
- bo = -1;
- }
-#endif
+ if (bo == 0 && size >= 4) {
+ Py_UCS4 bom = (q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
+ if (bom == 0x0000FEFF) {
+ bo = -1;
+ q += 4;
+ }
+ else if (bom == 0xFFFE0000) {
+ bo = 1;
+ q += 4;
}
+ if (byteorder)
+ *byteorder = bo;
}
- if (bo == -1) {
- /* force LE */
- iorder[0] = 0;
- iorder[1] = 1;
- iorder[2] = 2;
- iorder[3] = 3;
- }
- else if (bo == 1) {
- /* force BE */
- iorder[0] = 3;
- iorder[1] = 2;
- iorder[2] = 1;
- iorder[3] = 0;
+ if (q == e) {
+ if (consumed)
+ *consumed = size;
+ _Py_RETURN_UNICODE_EMPTY();
}
- /* This might be one to much, because of a BOM */
- unicode = PyUnicode_New((size+3)/4, 127);
- if (!unicode)
- return NULL;
- if (size == 0)
- return unicode;
- outpos = 0;
+#ifdef WORDS_BIGENDIAN
+ le = bo < 0;
+#else
+ le = bo <= 0;
+#endif
- while (q < e) {
- Py_UCS4 ch;
- /* remaining bytes at the end? (size should be divisible by 4) */
- if (e-q<4) {
- if (consumed)
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = (e - q + 3) / 4;
+ if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1)
+ goto onError;
+
+ while (1) {
+ Py_UCS4 ch = 0;
+ Py_UCS4 maxch = PyUnicode_MAX_CHAR_VALUE(writer.buffer);
+
+ if (e - q >= 4) {
+ enum PyUnicode_Kind kind = writer.kind;
+ void *data = writer.data;
+ const unsigned char *last = e - 4;
+ Py_ssize_t pos = writer.pos;
+ if (le) {
+ do {
+ ch = (q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
+ if (ch > maxch)
+ break;
+ PyUnicode_WRITE(kind, data, pos++, ch);
+ q += 4;
+ } while (q <= last);
+ }
+ else {
+ do {
+ ch = (q[0] << 24) | (q[1] << 16) | (q[2] << 8) | q[3];
+ if (ch > maxch)
+ break;
+ PyUnicode_WRITE(kind, data, pos++, ch);
+ q += 4;
+ } while (q <= last);
+ }
+ writer.pos = pos;
+ }
+
+ if (ch <= maxch) {
+ if (q == e || consumed)
break;
+ /* remaining bytes at the end? (size should be divisible by 4) */
errmsg = "truncated data";
- startinpos = ((const char *)q)-starts;
- endinpos = ((const char *)e)-starts;
- goto utf32Error;
- /* The remaining input chars are ignored if the callback
- chooses to skip the input */
+ startinpos = ((const char *)q) - starts;
+ endinpos = ((const char *)e) - starts;
}
- ch = (q[iorder[3]] << 24) | (q[iorder[2]] << 16) |
- (q[iorder[1]] << 8) | q[iorder[0]];
-
- if (ch >= 0x110000)
- {
+ else {
+ if (ch < 0x110000) {
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0)
+ goto onError;
+ q += 4;
+ continue;
+ }
errmsg = "codepoint not in range(0x110000)";
- startinpos = ((const char *)q)-starts;
- endinpos = startinpos+4;
- goto utf32Error;
+ startinpos = ((const char *)q) - starts;
+ endinpos = startinpos + 4;
}
- if (unicode_putchar(&unicode, &outpos, ch) < 0)
- goto onError;
- q += 4;
- continue;
- utf32Error:
- if (unicode_decode_call_errorhandler(
+
+ /* The remaining input chars are ignored if the callback
+ chooses to skip the input */
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"utf32", errmsg,
&starts, (const char **)&e, &startinpos, &endinpos, &exc, (const char **)&q,
- &unicode, &outpos))
+ &writer))
goto onError;
}
- if (byteorder)
- *byteorder = bo;
-
if (consumed)
*consumed = (const char *)q-starts;
- /* Adjust length */
- if (unicode_resize(&unicode, outpos) < 0)
- goto onError;
-
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(unicode);
+ return _PyUnicodeWriter_Finish(&writer);
onError:
- Py_DECREF(unicode);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
@@ -5111,7 +5074,7 @@ _PyUnicode_EncodeUTF32(PyObject *str,
unsigned char *p;
Py_ssize_t nsize, i;
/* Offsets from p for storing byte pairs in the right order. */
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+#if PY_LITTLE_ENDIAN
int iorder[] = {0, 1, 2, 3};
#else
int iorder[] = {3, 2, 1, 0};
@@ -5214,8 +5177,7 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
- PyObject *unicode;
+ _PyUnicodeWriter writer;
const unsigned char *q, *e;
int bo = 0; /* assume native ordering by default */
int native_ordering;
@@ -5253,7 +5215,7 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
_Py_RETURN_UNICODE_EMPTY();
}
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+#if PY_LITTLE_ENDIAN
native_ordering = bo <= 0;
#else
native_ordering = bo >= 0;
@@ -5261,32 +5223,32 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
/* Note: size will always be longer than the resulting Unicode
character count */
- unicode = PyUnicode_New((e - q + 1) / 2, 127);
- if (!unicode)
- return NULL;
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = (e - q + 1) / 2;
+ if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1)
+ goto onError;
- outpos = 0;
while (1) {
Py_UCS4 ch = 0;
if (e - q >= 2) {
- int kind = PyUnicode_KIND(unicode);
+ int kind = writer.kind;
if (kind == PyUnicode_1BYTE_KIND) {
- if (PyUnicode_IS_ASCII(unicode))
+ if (PyUnicode_IS_ASCII(writer.buffer))
ch = asciilib_utf16_decode(&q, e,
- PyUnicode_1BYTE_DATA(unicode), &outpos,
+ (Py_UCS1*)writer.data, &writer.pos,
native_ordering);
else
ch = ucs1lib_utf16_decode(&q, e,
- PyUnicode_1BYTE_DATA(unicode), &outpos,
+ (Py_UCS1*)writer.data, &writer.pos,
native_ordering);
} else if (kind == PyUnicode_2BYTE_KIND) {
ch = ucs2lib_utf16_decode(&q, e,
- PyUnicode_2BYTE_DATA(unicode), &outpos,
+ (Py_UCS2*)writer.data, &writer.pos,
native_ordering);
} else {
assert(kind == PyUnicode_4BYTE_KIND);
ch = ucs4lib_utf16_decode(&q, e,
- PyUnicode_4BYTE_DATA(unicode), &outpos,
+ (Py_UCS4*)writer.data, &writer.pos,
native_ordering);
}
}
@@ -5322,12 +5284,12 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
endinpos = startinpos + 2;
break;
default:
- if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0)
goto onError;
continue;
}
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors,
&errorHandler,
"utf16", errmsg,
@@ -5337,8 +5299,7 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
&endinpos,
&exc,
(const char **)&q,
- &unicode,
- &outpos))
+ &writer))
goto onError;
}
@@ -5346,16 +5307,12 @@ End:
if (consumed)
*consumed = (const char *)q-starts;
- /* Adjust length */
- if (unicode_resize(&unicode, outpos) < 0)
- goto onError;
-
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(unicode);
+ return _PyUnicodeWriter_Finish(&writer);
onError:
- Py_DECREF(unicode);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
@@ -5373,7 +5330,7 @@ _PyUnicode_EncodeUTF16(PyObject *str,
unsigned short *out;
Py_ssize_t bytesize;
Py_ssize_t pairs;
-#ifdef WORDS_BIGENDIAN
+#if PY_BIG_ENDIAN
int native_ordering = byteorder >= 0;
#else
int native_ordering = byteorder <= 0;
@@ -5521,27 +5478,26 @@ PyUnicode_DecodeUnicodeEscape(const char *s,
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- PyObject *v;
+ _PyUnicodeWriter writer;
const char *end;
char* message;
Py_UCS4 chr = 0xffffffff; /* in case 'getcode' messes up */
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
Py_ssize_t len;
- Py_ssize_t i;
len = length_of_escaped_ascii_string(s, size);
+ if (len == 0)
+ _Py_RETURN_UNICODE_EMPTY();
/* After length_of_escaped_ascii_string() there are two alternatives,
either the string is pure ASCII with named escapes like \n, etc.
and we determined it's exact size (common case)
or it contains \x, \u, ... escape sequences. then we create a
legacy wchar string and resize it at the end of this function. */
- if (len >= 0) {
- v = PyUnicode_New(len, 127);
- if (!v)
- goto onError;
- assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND);
+ _PyUnicodeWriter_Init(&writer);
+ if (len > 0) {
+ writer.min_length = len;
}
else {
/* Escaped strings will always be longer than the resulting
@@ -5549,15 +5505,11 @@ PyUnicode_DecodeUnicodeEscape(const char *s,
length after conversion to the true value.
(but if the error callback returns a long replacement string
we'll have to allocate more space) */
- v = PyUnicode_New(size, 127);
- if (!v)
- goto onError;
- len = size;
+ writer.min_length = size;
}
if (size == 0)
- return v;
- i = 0;
+ return _PyUnicodeWriter_Finish(&writer);
end = s + size;
while (s < end) {
@@ -5565,13 +5517,11 @@ PyUnicode_DecodeUnicodeEscape(const char *s,
Py_UCS4 x;
int digits;
- /* The only case in which i == ascii_length is a backslash
- followed by a newline. */
- assert(i <= len);
-
/* Non-escape characters are interpreted as Unicode ordinals */
if (*s != '\\') {
- if (unicode_putchar(&v, &i, (unsigned char) *s++) < 0)
+ x = (unsigned char)*s;
+ s++;
+ if (_PyUnicodeWriter_WriteCharInline(&writer, x) < 0)
goto onError;
continue;
}
@@ -5583,18 +5533,14 @@ PyUnicode_DecodeUnicodeEscape(const char *s,
if (s > end)
c = '\0'; /* Invalid after \ */
- /* The only case in which i == ascii_length is a backslash
- followed by a newline. */
- assert(i < len || (i == len && c == '\n'));
-
switch (c) {
/* \x escapes */
-#define WRITECHAR(ch) \
- do { \
- if (unicode_putchar(&v, &i, ch) < 0) \
- goto onError; \
- }while(0)
+#define WRITECHAR(ch) \
+ do { \
+ if (_PyUnicodeWriter_WriteCharInline(&writer, (ch)) < 0) \
+ goto onError; \
+ } while(0)
case '\n': break;
case '\\': WRITECHAR('\\'); break;
@@ -5718,35 +5664,32 @@ PyUnicode_DecodeUnicodeEscape(const char *s,
error:
endinpos = s-starts;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"unicodeescape", message,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &i))
+ &writer))
goto onError;
- len = PyUnicode_GET_LENGTH(v);
continue;
}
#undef WRITECHAR
- if (unicode_resize(&v, i) < 0)
- goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(v);
+ return _PyUnicodeWriter_Finish(&writer);
ucnhashError:
PyErr_SetString(
PyExc_UnicodeError,
"\\N escapes not supported (can't load unicodedata module)"
);
- Py_XDECREF(v);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
onError:
- Py_XDECREF(v);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
@@ -5899,23 +5842,22 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
- PyObject *v;
+ _PyUnicodeWriter writer;
const char *end;
const char *bs;
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
+ if (size == 0)
+ _Py_RETURN_UNICODE_EMPTY();
+
/* Escaped strings will always be longer than the resulting
Unicode string, so we start with size here and then reduce the
length after conversion to the true value. (But decoding error
handler might have to resize the string) */
- v = PyUnicode_New(size, 127);
- if (v == NULL)
- goto onError;
- if (size == 0)
- return v;
- outpos = 0;
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = size;
+
end = s + size;
while (s < end) {
unsigned char c;
@@ -5925,7 +5867,8 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
/* Non-escape characters are interpreted as Unicode ordinals */
if (*s != '\\') {
- if (unicode_putchar(&v, &outpos, (unsigned char)*s++) < 0)
+ x = (unsigned char)*s++;
+ if (_PyUnicodeWriter_WriteCharInline(&writer, x) < 0)
goto onError;
continue;
}
@@ -5937,7 +5880,8 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
for (;s < end;) {
if (*s != '\\')
break;
- if (unicode_putchar(&v, &outpos, (unsigned char)*s++) < 0)
+ x = (unsigned char)*s++;
+ if (_PyUnicodeWriter_WriteCharInline(&writer, x) < 0)
goto onError;
}
if (((s - bs) & 1) == 0 ||
@@ -5945,7 +5889,7 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
(*s != 'u' && *s != 'U')) {
continue;
}
- outpos--;
+ writer.pos--;
count = *s=='u' ? 4 : 8;
s++;
@@ -5954,11 +5898,11 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
c = (unsigned char)*s;
if (!Py_ISXDIGIT(c)) {
endinpos = s-starts;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"rawunicodeescape", "truncated \\uXXXX",
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos))
+ &writer))
goto onError;
goto nextByte;
}
@@ -5971,28 +5915,27 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
x += 10 + c - 'A';
}
if (x <= MAX_UNICODE) {
- if (unicode_putchar(&v, &outpos, x) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, x) < 0)
goto onError;
- } else {
+ }
+ else {
endinpos = s-starts;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"rawunicodeescape", "\\Uxxxxxxxx out of range",
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos))
+ &writer))
goto onError;
}
nextByte:
;
}
- if (unicode_resize(&v, outpos) < 0)
- goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(v);
+ return _PyUnicodeWriter_Finish(&writer);
onError:
- Py_XDECREF(v);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
@@ -6092,8 +6035,7 @@ _PyUnicode_DecodeUnicodeInternal(const char *s,
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
- PyObject *v;
+ _PyUnicodeWriter writer;
const char *end;
const char *reason;
PyObject *errorHandler = NULL;
@@ -6104,15 +6046,17 @@ _PyUnicode_DecodeUnicodeInternal(const char *s,
1))
return NULL;
- /* XXX overflow detection missing */
- v = PyUnicode_New((size+Py_UNICODE_SIZE-1)/ Py_UNICODE_SIZE, 127);
- if (v == NULL)
+ if (size == 0)
+ _Py_RETURN_UNICODE_EMPTY();
+
+ _PyUnicodeWriter_Init(&writer);
+ if (size / Py_UNICODE_SIZE > PY_SSIZE_T_MAX - 1) {
+ PyErr_NoMemory();
goto onError;
- if (PyUnicode_GET_LENGTH(v) == 0)
- return v;
- outpos = 0;
- end = s + size;
+ }
+ writer.min_length = (size + (Py_UNICODE_SIZE - 1)) / Py_UNICODE_SIZE;
+ end = s + size;
while (s < end) {
Py_UNICODE uch;
Py_UCS4 ch;
@@ -6154,28 +6098,26 @@ _PyUnicode_DecodeUnicodeInternal(const char *s,
}
#endif
- if (unicode_putchar(&v, &outpos, ch) < 0)
+ if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0)
goto onError;
continue;
error:
startinpos = s - starts;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"unicode_internal", reason,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos))
+ &writer))
goto onError;
}
- if (unicode_resize(&v, outpos) < 0)
- goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(v);
+ return _PyUnicodeWriter_Finish(&writer);
onError:
- Py_XDECREF(v);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
@@ -6539,7 +6481,7 @@ PyUnicode_DecodeASCII(const char *s,
const char *errors)
{
const char *starts = s;
- PyObject *unicode;
+ _PyUnicodeWriter writer;
int kind;
void *data;
Py_ssize_t startinpos;
@@ -6556,46 +6498,46 @@ PyUnicode_DecodeASCII(const char *s,
if (size == 1 && (unsigned char)s[0] < 128)
return get_latin1_char((unsigned char)s[0]);
- unicode = PyUnicode_New(size, 127);
- if (unicode == NULL)
- goto onError;
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = size;
+ if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) < 0)
+ return NULL;
e = s + size;
- data = PyUnicode_1BYTE_DATA(unicode);
+ data = writer.data;
outpos = ascii_decode(s, e, (Py_UCS1 *)data);
- if (outpos == size)
- return unicode;
+ writer.pos = outpos;
+ if (writer.pos == size)
+ return _PyUnicodeWriter_Finish(&writer);
- s += outpos;
- kind = PyUnicode_1BYTE_KIND;
+ s += writer.pos;
+ kind = writer.kind;
while (s < e) {
- register unsigned char c = (unsigned char)*s;
+ unsigned char c = (unsigned char)*s;
if (c < 128) {
- PyUnicode_WRITE(kind, data, outpos++, c);
+ PyUnicode_WRITE(kind, data, writer.pos, c);
+ writer.pos++;
++s;
}
else {
startinpos = s-starts;
endinpos = startinpos + 1;
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_writer(
errors, &errorHandler,
"ascii", "ordinal not in range(128)",
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos))
+ &writer))
goto onError;
- kind = PyUnicode_KIND(unicode);
- data = PyUnicode_DATA(unicode);
+ kind = writer.kind;
+ data = writer.data;
}
}
- if (unicode_resize(&unicode, outpos) < 0)
- goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- assert(_PyUnicode_CheckConsistency(unicode, 1));
- return unicode;
+ return _PyUnicodeWriter_Finish(&writer);
onError:
- Py_XDECREF(unicode);
+ _PyUnicodeWriter_Dealloc(&writer);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
@@ -6627,7 +6569,7 @@ _PyUnicode_AsASCIIString(PyObject *unicode, const char *errors)
return NULL;
/* Fast path: if it is an ASCII-only string, construct bytes object
directly. Else defer to above function to raise the exception. */
- if (PyUnicode_MAX_CHAR_VALUE(unicode) < 128)
+ if (PyUnicode_IS_ASCII(unicode))
return PyBytes_FromStringAndSize(PyUnicode_DATA(unicode),
PyUnicode_GET_LENGTH(unicode));
return unicode_encode_ucs1(unicode, errors, 128);
@@ -6705,8 +6647,8 @@ decode_code_page_flags(UINT code_page)
* Decode a byte string from a Windows code page into unicode object in strict
* mode.
*
- * Returns consumed size if succeed, returns -2 on decode error, or raise a
- * WindowsError and returns -1 on other error.
+ * Returns consumed size if succeed, returns -2 on decode error, or raise an
+ * OSError and returns -1 on other error.
*/
static int
decode_code_page_strict(UINT code_page,
@@ -6757,7 +6699,7 @@ error:
* Decode a byte string from a code page into unicode object with an error
* handler.
*
- * Returns consumed size if succeed, or raise a WindowsError or
+ * Returns consumed size if succeed, or raise an OSError or
* UnicodeDecodeError exception and returns -1 on error.
*/
static int
@@ -6776,7 +6718,8 @@ decode_code_page_errors(UINT code_page,
/* each step cannot decode more than 1 character, but a character can be
represented as a surrogate pair */
wchar_t buffer[2], *startout, *out;
- int insize, outsize;
+ int insize;
+ Py_ssize_t outsize;
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
PyObject *encoding_obj = NULL;
@@ -6856,7 +6799,7 @@ decode_code_page_errors(UINT code_page,
startinpos = in - startin;
endinpos = startinpos + 1;
outpos = out - PyUnicode_AS_UNICODE(*v);
- if (unicode_decode_call_errorhandler(
+ if (unicode_decode_call_errorhandler_wchar(
errors, &errorHandler,
encoding, reason,
&startin, &endin, &startinpos, &endinpos, &exc, &in,
@@ -7012,7 +6955,7 @@ encode_code_page_flags(UINT code_page, const char *errors)
* mode.
*
* Returns consumed characters if succeed, returns -2 on encode error, or raise
- * a WindowsError and returns -1 on other error.
+ * an OSError and returns -1 on other error.
*/
static int
encode_code_page_strict(UINT code_page, PyObject **outbytes,
@@ -7046,10 +6989,11 @@ encode_code_page_strict(UINT code_page, PyObject **outbytes,
Py_DECREF(substring);
return -1;
}
+ assert(size <= INT_MAX);
/* First get the size of the result */
outsize = WideCharToMultiByte(code_page, flags,
- p, size,
+ p, (int)size,
NULL, 0,
NULL, pusedDefaultChar);
if (outsize <= 0)
@@ -7086,7 +7030,7 @@ encode_code_page_strict(UINT code_page, PyObject **outbytes,
/* Do the conversion */
outsize = WideCharToMultiByte(code_page, flags,
- p, size,
+ p, (int)size,
out, outsize,
NULL, pusedDefaultChar);
Py_CLEAR(substring);
@@ -7108,7 +7052,7 @@ error:
* Encode a Unicode string to a Windows code page into a byte string using a
* error handler.
*
- * Returns consumed characters if succeed, or raise a WindowsError and returns
+ * Returns consumed characters if succeed, or raise an OSError and returns
* -1 on other error.
*/
static int
@@ -7194,9 +7138,8 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes,
charsize = 1;
}
else {
- ch -= 0x10000;
- chars[0] = 0xd800 + (ch >> 10);
- chars[1] = 0xdc00 + (ch & 0x3ff);
+ chars[0] = Py_UNICODE_HIGH_SURROGATE(ch);
+ chars[1] = Py_UNICODE_LOW_SURROGATE(ch);
charsize = 2;
}
@@ -7389,220 +7332,258 @@ PyUnicode_AsMBCSString(PyObject *unicode)
/* --- Character Mapping Codec -------------------------------------------- */
-PyObject *
-PyUnicode_DecodeCharmap(const char *s,
- Py_ssize_t size,
- PyObject *mapping,
- const char *errors)
+static int
+charmap_decode_string(const char *s,
+ Py_ssize_t size,
+ PyObject *mapping,
+ const char *errors,
+ _PyUnicodeWriter *writer)
{
const char *starts = s;
- Py_ssize_t startinpos;
- Py_ssize_t endinpos;
- Py_ssize_t outpos;
const char *e;
- PyObject *v;
- Py_ssize_t extrachars = 0;
- PyObject *errorHandler = NULL;
- PyObject *exc = NULL;
+ Py_ssize_t startinpos, endinpos;
+ PyObject *errorHandler = NULL, *exc = NULL;
+ Py_ssize_t maplen;
+ enum PyUnicode_Kind mapkind;
+ void *mapdata;
+ Py_UCS4 x;
+ unsigned char ch;
+
+ if (PyUnicode_READY(mapping) == -1)
+ return -1;
- /* Default to Latin-1 */
- if (mapping == NULL)
- return PyUnicode_DecodeLatin1(s, size, errors);
+ maplen = PyUnicode_GET_LENGTH(mapping);
+ mapdata = PyUnicode_DATA(mapping);
+ mapkind = PyUnicode_KIND(mapping);
- v = PyUnicode_New(size, 127);
- if (v == NULL)
- goto onError;
- if (size == 0)
- return v;
- outpos = 0;
e = s + size;
- if (PyUnicode_CheckExact(mapping)) {
- Py_ssize_t maplen;
- enum PyUnicode_Kind mapkind;
- void *mapdata;
- Py_UCS4 x;
- if (PyUnicode_READY(mapping) == -1)
- return NULL;
+ if (mapkind == PyUnicode_1BYTE_KIND && maplen >= 256) {
+ /* fast-path for cp037, cp500 and iso8859_1 encodings. iso8859_1
+ * is disabled in encoding aliases, latin1 is preferred because
+ * its implementation is faster. */
+ Py_UCS1 *mapdata_ucs1 = (Py_UCS1 *)mapdata;
+ Py_UCS1 *outdata = (Py_UCS1 *)writer->data;
+ Py_UCS4 maxchar = writer->maxchar;
- maplen = PyUnicode_GET_LENGTH(mapping);
- mapdata = PyUnicode_DATA(mapping);
- mapkind = PyUnicode_KIND(mapping);
+ assert (writer->kind == PyUnicode_1BYTE_KIND);
while (s < e) {
- unsigned char ch;
- if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) {
- enum PyUnicode_Kind outkind = PyUnicode_KIND(v);
- if (outkind == PyUnicode_1BYTE_KIND) {
- void *outdata = PyUnicode_DATA(v);
- Py_UCS4 maxchar = PyUnicode_MAX_CHAR_VALUE(v);
- while (s < e) {
- unsigned char ch = *s;
- x = PyUnicode_READ(PyUnicode_2BYTE_KIND, mapdata, ch);
- if (x > maxchar)
- goto Error;
- PyUnicode_WRITE(PyUnicode_1BYTE_KIND, outdata, outpos++, x);
- ++s;
- }
- break;
+ ch = *s;
+ x = mapdata_ucs1[ch];
+ if (x > maxchar) {
+ if (_PyUnicodeWriter_Prepare(writer, 1, 0xff) == -1)
+ goto onError;
+ maxchar = writer->maxchar;
+ outdata = (Py_UCS1 *)writer->data;
+ }
+ outdata[writer->pos] = x;
+ writer->pos++;
+ ++s;
+ }
+ return 0;
+ }
+
+ while (s < e) {
+ if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) {
+ enum PyUnicode_Kind outkind = writer->kind;
+ Py_UCS2 *mapdata_ucs2 = (Py_UCS2 *)mapdata;
+ if (outkind == PyUnicode_1BYTE_KIND) {
+ Py_UCS1 *outdata = (Py_UCS1 *)writer->data;
+ Py_UCS4 maxchar = writer->maxchar;
+ while (s < e) {
+ ch = *s;
+ x = mapdata_ucs2[ch];
+ if (x > maxchar)
+ goto Error;
+ outdata[writer->pos] = x;
+ writer->pos++;
+ ++s;
}
- else if (outkind == PyUnicode_2BYTE_KIND) {
- void *outdata = PyUnicode_DATA(v);
- while (s < e) {
- unsigned char ch = *s;
- x = PyUnicode_READ(PyUnicode_2BYTE_KIND, mapdata, ch);
- if (x == 0xFFFE)
- goto Error;
- PyUnicode_WRITE(PyUnicode_2BYTE_KIND, outdata, outpos++, x);
- ++s;
- }
- break;
+ break;
+ }
+ else if (outkind == PyUnicode_2BYTE_KIND) {
+ Py_UCS2 *outdata = (Py_UCS2 *)writer->data;
+ while (s < e) {
+ ch = *s;
+ x = mapdata_ucs2[ch];
+ if (x == 0xFFFE)
+ goto Error;
+ outdata[writer->pos] = x;
+ writer->pos++;
+ ++s;
}
+ break;
}
- ch = *s;
+ }
+ ch = *s;
- if (ch < maplen)
- x = PyUnicode_READ(mapkind, mapdata, ch);
- else
- x = 0xfffe; /* invalid value */
+ if (ch < maplen)
+ x = PyUnicode_READ(mapkind, mapdata, ch);
+ else
+ x = 0xfffe; /* invalid value */
Error:
- if (x == 0xfffe)
- {
- /* undefined mapping */
- startinpos = s-starts;
- endinpos = startinpos+1;
- if (unicode_decode_call_errorhandler(
- errors, &errorHandler,
- "charmap", "character maps to <undefined>",
- &starts, &e, &startinpos, &endinpos, &exc, &s,
- &v, &outpos)) {
- goto onError;
- }
- continue;
+ if (x == 0xfffe)
+ {
+ /* undefined mapping */
+ startinpos = s-starts;
+ endinpos = startinpos+1;
+ if (unicode_decode_call_errorhandler_writer(
+ errors, &errorHandler,
+ "charmap", "character maps to <undefined>",
+ &starts, &e, &startinpos, &endinpos, &exc, &s,
+ writer)) {
+ goto onError;
}
+ continue;
+ }
+
+ if (_PyUnicodeWriter_WriteCharInline(writer, x) < 0)
+ goto onError;
+ ++s;
+ }
+ Py_XDECREF(errorHandler);
+ Py_XDECREF(exc);
+ return 0;
+
+onError:
+ Py_XDECREF(errorHandler);
+ Py_XDECREF(exc);
+ return -1;
+}
+
+static int
+charmap_decode_mapping(const char *s,
+ Py_ssize_t size,
+ PyObject *mapping,
+ const char *errors,
+ _PyUnicodeWriter *writer)
+{
+ const char *starts = s;
+ const char *e;
+ Py_ssize_t startinpos, endinpos;
+ PyObject *errorHandler = NULL, *exc = NULL;
+ unsigned char ch;
+ PyObject *key, *item = NULL;
+
+ e = s + size;
+
+ while (s < e) {
+ ch = *s;
- if (unicode_putchar(&v, &outpos, x) < 0)
+ /* Get mapping (char ordinal -> integer, Unicode char or None) */
+ key = PyLong_FromLong((long)ch);
+ if (key == NULL)
+ goto onError;
+
+ item = PyObject_GetItem(mapping, key);
+ Py_DECREF(key);
+ if (item == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_LookupError)) {
+ /* No mapping found means: mapping is undefined. */
+ PyErr_Clear();
+ goto Undefined;
+ } else
goto onError;
- ++s;
}
- }
- else {
- while (s < e) {
- unsigned char ch = *s;
- PyObject *w, *x;
- /* Get mapping (char ordinal -> integer, Unicode char or None) */
- w = PyLong_FromLong((long)ch);
- if (w == NULL)
+ /* Apply mapping */
+ if (item == Py_None)
+ goto Undefined;
+ if (PyLong_Check(item)) {
+ long value = PyLong_AS_LONG(item);
+ if (value == 0xFFFE)
+ goto Undefined;
+ if (value < 0 || value > MAX_UNICODE) {
+ PyErr_Format(PyExc_TypeError,
+ "character mapping must be in range(0x%lx)",
+ (unsigned long)MAX_UNICODE + 1);
goto onError;
- x = PyObject_GetItem(mapping, w);
- Py_DECREF(w);
- if (x == NULL) {
- if (PyErr_ExceptionMatches(PyExc_LookupError)) {
- /* No mapping found means: mapping is undefined. */
- PyErr_Clear();
- goto Undefined;
- } else
- goto onError;
}
- /* Apply mapping */
- if (x == Py_None)
- goto Undefined;
- if (PyLong_Check(x)) {
- long value = PyLong_AS_LONG(x);
+ if (_PyUnicodeWriter_WriteCharInline(writer, value) < 0)
+ goto onError;
+ }
+ else if (PyUnicode_Check(item)) {
+ if (PyUnicode_READY(item) == -1)
+ goto onError;
+ if (PyUnicode_GET_LENGTH(item) == 1) {
+ Py_UCS4 value = PyUnicode_READ_CHAR(item, 0);
if (value == 0xFFFE)
goto Undefined;
- if (value < 0 || value > MAX_UNICODE) {
- PyErr_Format(PyExc_TypeError,
- "character mapping must be in range(0x%lx)",
- (unsigned long)MAX_UNICODE + 1);
- Py_DECREF(x);
- goto onError;
- }
- if (unicode_putchar(&v, &outpos, value) < 0) {
- Py_DECREF(x);
+ if (_PyUnicodeWriter_WriteCharInline(writer, value) < 0)
goto onError;
- }
- }
- else if (PyUnicode_Check(x)) {
- Py_ssize_t targetsize;
-
- if (PyUnicode_READY(x) == -1) {
- Py_DECREF(x);
- goto onError;
- }
- targetsize = PyUnicode_GET_LENGTH(x);
-
- if (targetsize == 1) {
- /* 1-1 mapping */
- Py_UCS4 value = PyUnicode_READ_CHAR(x, 0);
- if (value == 0xFFFE)
- goto Undefined;
- if (unicode_putchar(&v, &outpos, value) < 0) {
- Py_DECREF(x);
- goto onError;
- }
- }
- else if (targetsize > 1) {
- /* 1-n mapping */
- if (targetsize > extrachars) {
- /* resize first */
- Py_ssize_t needed = (targetsize - extrachars) + \
- (targetsize << 2);
- extrachars += needed;
- /* XXX overflow detection missing */
- if (unicode_resize(&v,
- PyUnicode_GET_LENGTH(v) + needed) < 0)
- {
- Py_DECREF(x);
- goto onError;
- }
- }
- if (unicode_widen(&v, outpos,
- PyUnicode_MAX_CHAR_VALUE(x)) < 0) {
- Py_DECREF(x);
- goto onError;
- }
- PyUnicode_CopyCharacters(v, outpos, x, 0, targetsize);
- outpos += targetsize;
- extrachars -= targetsize;
- }
- /* 1-0 mapping: skip the character */
}
else {
- /* wrong return value */
- PyErr_SetString(PyExc_TypeError,
- "character mapping must return integer, None or str");
- Py_DECREF(x);
- goto onError;
+ writer->overallocate = 1;
+ if (_PyUnicodeWriter_WriteStr(writer, item) == -1)
+ goto onError;
}
- Py_DECREF(x);
- ++s;
- continue;
+ }
+ else {
+ /* wrong return value */
+ PyErr_SetString(PyExc_TypeError,
+ "character mapping must return integer, None or str");
+ goto onError;
+ }
+ Py_CLEAR(item);
+ ++s;
+ continue;
+
Undefined:
- /* undefined mapping */
- Py_XDECREF(x);
- startinpos = s-starts;
- endinpos = startinpos+1;
- if (unicode_decode_call_errorhandler(
- errors, &errorHandler,
- "charmap", "character maps to <undefined>",
- &starts, &e, &startinpos, &endinpos, &exc, &s,
- &v, &outpos)) {
- goto onError;
- }
+ /* undefined mapping */
+ Py_CLEAR(item);
+ startinpos = s-starts;
+ endinpos = startinpos+1;
+ if (unicode_decode_call_errorhandler_writer(
+ errors, &errorHandler,
+ "charmap", "character maps to <undefined>",
+ &starts, &e, &startinpos, &endinpos, &exc, &s,
+ writer)) {
+ goto onError;
}
}
- if (unicode_resize(&v, outpos) < 0)
- goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return unicode_result(v);
+ return 0;
- onError:
+onError:
+ Py_XDECREF(item);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- Py_XDECREF(v);
+ return -1;
+}
+
+PyObject *
+PyUnicode_DecodeCharmap(const char *s,
+ Py_ssize_t size,
+ PyObject *mapping,
+ const char *errors)
+{
+ _PyUnicodeWriter writer;
+
+ /* Default to Latin-1 */
+ if (mapping == NULL)
+ return PyUnicode_DecodeLatin1(s, size, errors);
+
+ if (size == 0)
+ _Py_RETURN_UNICODE_EMPTY();
+ _PyUnicodeWriter_Init(&writer);
+ writer.min_length = size;
+ if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1)
+ goto onError;
+
+ if (PyUnicode_CheckExact(mapping)) {
+ if (charmap_decode_string(s, size, mapping, errors, &writer) < 0)
+ goto onError;
+ }
+ else {
+ if (charmap_decode_mapping(s, size, mapping, errors, &writer) < 0)
+ goto onError;
+ }
+ return _PyUnicodeWriter_Finish(&writer);
+
+ onError:
+ _PyUnicodeWriter_Dealloc(&writer);
return NULL;
}
@@ -8116,10 +8097,14 @@ _PyUnicode_EncodeCharmap(PyObject *unicode,
* -1=not initialized, 0=unknown, 1=strict, 2=replace,
* 3=ignore, 4=xmlcharrefreplace */
int known_errorHandler = -1;
+ void *data;
+ int kind;
if (PyUnicode_READY(unicode) == -1)
return NULL;
size = PyUnicode_GET_LENGTH(unicode);
+ data = PyUnicode_DATA(unicode);
+ kind = PyUnicode_KIND(unicode);
/* Default to Latin-1 */
if (mapping == NULL)
@@ -8134,7 +8119,7 @@ _PyUnicode_EncodeCharmap(PyObject *unicode,
return res;
while (inpos<size) {
- Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, inpos);
+ Py_UCS4 ch = PyUnicode_READ(kind, data, inpos);
/* try to encode it */
charmapencode_result x = charmapencode_output(ch, mapping, &res, &respos);
if (x==enc_EXCEPTION) /* error */
@@ -8220,19 +8205,6 @@ make_translate_exception(PyObject **exceptionObject,
}
}
-/* raises a UnicodeTranslateError */
-static void
-raise_translate_exception(PyObject **exceptionObject,
- PyObject *unicode,
- Py_ssize_t startpos, Py_ssize_t endpos,
- const char *reason)
-{
- make_translate_exception(exceptionObject,
- unicode, startpos, endpos, reason);
- if (*exceptionObject != NULL)
- PyCodec_StrictErrors(*exceptionObject);
-}
-
/* error handling callback helper:
build arguments, call the callback and check the arguments,
put the result into newpos and return the replacement string, which
@@ -8508,8 +8480,10 @@ _PyUnicode_TranslateCharmap(PyObject *input,
}
switch (known_errorHandler) {
case 1: /* strict */
- raise_translate_exception(&exc, input, collstart,
- collend, reason);
+ make_translate_exception(&exc,
+ input, collstart, collend, reason);
+ if (exc != NULL)
+ PyCodec_StrictErrors(exc);
goto onError;
case 2: /* replace */
/* No need to check for space, this is a 1:1 replacement */
@@ -9101,7 +9075,7 @@ tailmatch(PyObject *self,
if (PyUnicode_READY(self) == -1 ||
PyUnicode_READY(substring) == -1)
- return 0;
+ return -1;
if (PyUnicode_GET_LENGTH(substring) == 0)
return 1;
@@ -9139,7 +9113,6 @@ tailmatch(PyObject *self,
/* We do not need to compare 0 and len(substring)-1 because
the if statement above ensured already that they are equal
when we end up here. */
- /* TODO: honor direction and do a forward or backwards search */
for (i = 1; i < end_sub; ++i) {
if (PyUnicode_READ(kind_self, data_self, offset + i) !=
PyUnicode_READ(kind_sub, data_sub, i))
@@ -9601,41 +9574,49 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
sep_data = PyUnicode_1BYTE_DATA(sep);
}
#endif
- for (i = 0, res_offset = 0; i < seqlen; ++i) {
- Py_ssize_t itemlen;
- item = items[i];
- /* Copy item, and maybe the separator. */
- if (i && seplen != 0) {
- if (use_memcpy) {
+ if (use_memcpy) {
+ for (i = 0; i < seqlen; ++i) {
+ Py_ssize_t itemlen;
+ item = items[i];
+
+ /* Copy item, and maybe the separator. */
+ if (i && seplen != 0) {
Py_MEMCPY(res_data,
sep_data,
kind * seplen);
res_data += kind * seplen;
}
- else {
- _PyUnicode_FastCopyCharacters(res, res_offset, sep, 0, seplen);
- res_offset += seplen;
- }
- }
- itemlen = PyUnicode_GET_LENGTH(item);
- if (itemlen != 0) {
- if (use_memcpy) {
+
+ itemlen = PyUnicode_GET_LENGTH(item);
+ if (itemlen != 0) {
Py_MEMCPY(res_data,
PyUnicode_DATA(item),
kind * itemlen);
res_data += kind * itemlen;
}
- else {
+ }
+ assert(res_data == PyUnicode_1BYTE_DATA(res)
+ + kind * PyUnicode_GET_LENGTH(res));
+ }
+ else {
+ for (i = 0, res_offset = 0; i < seqlen; ++i) {
+ Py_ssize_t itemlen;
+ item = items[i];
+
+ /* Copy item, and maybe the separator. */
+ if (i && seplen != 0) {
+ _PyUnicode_FastCopyCharacters(res, res_offset, sep, 0, seplen);
+ res_offset += seplen;
+ }
+
+ itemlen = PyUnicode_GET_LENGTH(item);
+ if (itemlen != 0) {
_PyUnicode_FastCopyCharacters(res, res_offset, item, 0, itemlen);
res_offset += itemlen;
}
}
- }
- if (use_memcpy)
- assert(res_data == PyUnicode_1BYTE_DATA(res)
- + kind * PyUnicode_GET_LENGTH(res));
- else
assert(res_offset == PyUnicode_GET_LENGTH(res));
+ }
Py_DECREF(fseq);
Py_XDECREF(sep);
@@ -10027,6 +10008,31 @@ anylib_count(int kind, PyObject *sstr, void* sbuf, Py_ssize_t slen,
return 0;
}
+static void
+replace_1char_inplace(PyObject *u, Py_ssize_t pos,
+ Py_UCS4 u1, Py_UCS4 u2, Py_ssize_t maxcount)
+{
+ int kind = PyUnicode_KIND(u);
+ void *data = PyUnicode_DATA(u);
+ Py_ssize_t len = PyUnicode_GET_LENGTH(u);
+ if (kind == PyUnicode_1BYTE_KIND) {
+ ucs1lib_replace_1char_inplace((Py_UCS1 *)data + pos,
+ (Py_UCS1 *)data + len,
+ u1, u2, maxcount);
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ ucs2lib_replace_1char_inplace((Py_UCS2 *)data + pos,
+ (Py_UCS2 *)data + len,
+ u1, u2, maxcount);
+ }
+ else {
+ assert(kind == PyUnicode_4BYTE_KIND);
+ ucs4lib_replace_1char_inplace((Py_UCS4 *)data + pos,
+ (Py_UCS4 *)data + len,
+ u1, u2, maxcount);
+ }
+}
+
static PyObject *
replace(PyObject *self, PyObject *str1,
PyObject *str2, Py_ssize_t maxcount)
@@ -10043,7 +10049,7 @@ replace(PyObject *self, PyObject *str1,
Py_ssize_t len1 = PyUnicode_GET_LENGTH(str1);
Py_ssize_t len2 = PyUnicode_GET_LENGTH(str2);
int mayshrink;
- Py_UCS4 maxchar, maxchar_str2;
+ Py_UCS4 maxchar, maxchar_str1, maxchar_str2;
if (maxcount < 0)
maxcount = PY_SSIZE_T_MAX;
@@ -10052,15 +10058,16 @@ replace(PyObject *self, PyObject *str1,
if (str1 == str2)
goto nothing;
- if (skind < kind1)
- /* substring too wide to be present */
- goto nothing;
maxchar = PyUnicode_MAX_CHAR_VALUE(self);
+ maxchar_str1 = PyUnicode_MAX_CHAR_VALUE(str1);
+ if (maxchar < maxchar_str1)
+ /* substring too wide to be present */
+ goto nothing;
maxchar_str2 = PyUnicode_MAX_CHAR_VALUE(str2);
/* Replacing str1 with str2 may cause a maxchar reduction in the
result string. */
- mayshrink = (maxchar_str2 < maxchar);
+ mayshrink = (maxchar_str2 < maxchar_str1) && (maxchar == maxchar_str1);
maxchar = Py_MAX(maxchar, maxchar_str2);
if (len1 == len2) {
@@ -10070,35 +10077,19 @@ replace(PyObject *self, PyObject *str1,
if (len1 == 1) {
/* replace characters */
Py_UCS4 u1, u2;
- int rkind;
- Py_ssize_t index, pos;
- char *src;
+ Py_ssize_t pos;
- u1 = PyUnicode_READ_CHAR(str1, 0);
- pos = findchar(sbuf, PyUnicode_KIND(self), slen, u1, 1);
+ u1 = PyUnicode_READ(kind1, buf1, 0);
+ pos = findchar(sbuf, skind, slen, u1, 1);
if (pos < 0)
goto nothing;
- u2 = PyUnicode_READ_CHAR(str2, 0);
+ u2 = PyUnicode_READ(kind2, buf2, 0);
u = PyUnicode_New(slen, maxchar);
if (!u)
goto error;
- _PyUnicode_FastCopyCharacters(u, 0, self, 0, slen);
- rkind = PyUnicode_KIND(u);
- PyUnicode_WRITE(rkind, PyUnicode_DATA(u), pos, u2);
- index = 0;
- src = sbuf;
- while (--maxcount)
- {
- pos++;
- src += pos * PyUnicode_KIND(self);
- slen -= pos;
- index += pos;
- pos = findchar(src, PyUnicode_KIND(self), slen, u1, 1);
- if (pos < 0)
- break;
- PyUnicode_WRITE(rkind, PyUnicode_DATA(u), index + pos, u2);
- }
+ _PyUnicode_FastCopyCharacters(u, 0, self, 0, slen);
+ replace_1char_inplace(u, pos, u1, u2, maxcount);
}
else {
int rkind = skind;
@@ -10410,9 +10401,28 @@ unicode_center(PyObject *self, PyObject *args)
static int
unicode_compare(PyObject *str1, PyObject *str2)
{
+#define COMPARE(TYPE1, TYPE2) \
+ do { \
+ TYPE1* p1 = (TYPE1 *)data1; \
+ TYPE2* p2 = (TYPE2 *)data2; \
+ TYPE1* end = p1 + len; \
+ Py_UCS4 c1, c2; \
+ for (; p1 != end; p1++, p2++) { \
+ c1 = *p1; \
+ c2 = *p2; \
+ if (c1 != c2) \
+ return (c1 < c2) ? -1 : 1; \
+ } \
+ } \
+ while (0)
+
int kind1, kind2;
void *data1, *data2;
- Py_ssize_t len1, len2, i;
+ Py_ssize_t len1, len2, len;
+
+ /* a string is equal to itself */
+ if (str1 == str2)
+ return 0;
kind1 = PyUnicode_KIND(str1);
kind2 = PyUnicode_KIND(str2);
@@ -10420,19 +10430,120 @@ unicode_compare(PyObject *str1, PyObject *str2)
data2 = PyUnicode_DATA(str2);
len1 = PyUnicode_GET_LENGTH(str1);
len2 = PyUnicode_GET_LENGTH(str2);
+ len = Py_MIN(len1, len2);
- for (i = 0; i < len1 && i < len2; ++i) {
- Py_UCS4 c1, c2;
- c1 = PyUnicode_READ(kind1, data1, i);
- c2 = PyUnicode_READ(kind2, data2, i);
-
- if (c1 != c2)
- return (c1 < c2) ? -1 : 1;
+ switch(kind1) {
+ case PyUnicode_1BYTE_KIND:
+ {
+ switch(kind2) {
+ case PyUnicode_1BYTE_KIND:
+ {
+ int cmp = memcmp(data1, data2, len);
+ /* normalize result of memcmp() into the range [-1; 1] */
+ if (cmp < 0)
+ return -1;
+ if (cmp > 0)
+ return 1;
+ break;
+ }
+ case PyUnicode_2BYTE_KIND:
+ COMPARE(Py_UCS1, Py_UCS2);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ COMPARE(Py_UCS1, Py_UCS4);
+ break;
+ default:
+ assert(0);
+ }
+ break;
}
+ case PyUnicode_2BYTE_KIND:
+ {
+ switch(kind2) {
+ case PyUnicode_1BYTE_KIND:
+ COMPARE(Py_UCS2, Py_UCS1);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ {
+ COMPARE(Py_UCS2, Py_UCS2);
+ break;
+ }
+ case PyUnicode_4BYTE_KIND:
+ COMPARE(Py_UCS2, Py_UCS4);
+ break;
+ default:
+ assert(0);
+ }
+ break;
+ }
+ case PyUnicode_4BYTE_KIND:
+ {
+ switch(kind2) {
+ case PyUnicode_1BYTE_KIND:
+ COMPARE(Py_UCS4, Py_UCS1);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ COMPARE(Py_UCS4, Py_UCS2);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ {
+#if defined(HAVE_WMEMCMP) && SIZEOF_WCHAR_T == 4
+ int cmp = wmemcmp((wchar_t *)data1, (wchar_t *)data2, len);
+ /* normalize result of wmemcmp() into the range [-1; 1] */
+ if (cmp < 0)
+ return -1;
+ if (cmp > 0)
+ return 1;
+#else
+ COMPARE(Py_UCS4, Py_UCS4);
+#endif
+ break;
+ }
+ default:
+ assert(0);
+ }
+ break;
+ }
+ default:
+ assert(0);
+ }
+
+ if (len1 == len2)
+ return 0;
+ if (len1 < len2)
+ return -1;
+ else
+ return 1;
+
+#undef COMPARE
+}
+
+static int
+unicode_compare_eq(PyObject *str1, PyObject *str2)
+{
+ int kind;
+ void *data1, *data2;
+ Py_ssize_t len;
+ int cmp;
+
+ /* a string is equal to itself */
+ if (str1 == str2)
+ return 1;
+
+ len = PyUnicode_GET_LENGTH(str1);
+ if (PyUnicode_GET_LENGTH(str2) != len)
+ return 0;
+ kind = PyUnicode_KIND(str1);
+ if (PyUnicode_KIND(str2) != kind)
+ return 0;
+ data1 = PyUnicode_DATA(str1);
+ data2 = PyUnicode_DATA(str2);
- return (len1 < len2) ? -1 : (len1 != len2);
+ cmp = memcmp(data1, data2, len * kind);
+ return (cmp == 0);
}
+
int
PyUnicode_Compare(PyObject *left, PyObject *right)
{
@@ -10483,36 +10594,27 @@ PyObject *
PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
{
int result;
+ PyObject *v;
- if (PyUnicode_Check(left) && PyUnicode_Check(right)) {
- PyObject *v;
- if (PyUnicode_READY(left) == -1 ||
- PyUnicode_READY(right) == -1)
- return NULL;
- if (PyUnicode_GET_LENGTH(left) != PyUnicode_GET_LENGTH(right) ||
- PyUnicode_KIND(left) != PyUnicode_KIND(right)) {
- if (op == Py_EQ) {
- Py_INCREF(Py_False);
- return Py_False;
- }
- if (op == Py_NE) {
- Py_INCREF(Py_True);
- return Py_True;
- }
- }
- if (left == right)
- result = 0;
+ if (!PyUnicode_Check(left) || !PyUnicode_Check(right))
+ Py_RETURN_NOTIMPLEMENTED;
+
+ if (PyUnicode_READY(left) == -1 ||
+ PyUnicode_READY(right) == -1)
+ return NULL;
+
+ if (op == Py_EQ || op == Py_NE) {
+ result = unicode_compare_eq(left, right);
+ if (op == Py_EQ)
+ v = TEST_COND(result);
else
- result = unicode_compare(left, right);
+ v = TEST_COND(!result);
+ }
+ else {
+ result = unicode_compare(left, right);
/* Convert the return value to a Boolean */
switch (op) {
- case Py_EQ:
- v = TEST_COND(result == 0);
- break;
- case Py_NE:
- v = TEST_COND(result != 0);
- break;
case Py_LE:
v = TEST_COND(result <= 0);
break;
@@ -10529,18 +10631,16 @@ PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
PyErr_BadArgument();
return NULL;
}
- Py_INCREF(v);
- return v;
}
-
- Py_RETURN_NOTIMPLEMENTED;
+ Py_INCREF(v);
+ return v;
}
int
PyUnicode_Contains(PyObject *container, PyObject *element)
{
PyObject *str, *sub;
- int kind1, kind2, kind;
+ int kind1, kind2;
void *buf1, *buf2;
Py_ssize_t len1, len2;
int result;
@@ -10559,23 +10659,18 @@ PyUnicode_Contains(PyObject *container, PyObject *element)
Py_DECREF(sub);
return -1;
}
- if (PyUnicode_READY(sub) == -1 || PyUnicode_READY(str) == -1) {
- Py_DECREF(sub);
- Py_DECREF(str);
- }
kind1 = PyUnicode_KIND(str);
kind2 = PyUnicode_KIND(sub);
- kind = kind1;
buf1 = PyUnicode_DATA(str);
buf2 = PyUnicode_DATA(sub);
- if (kind2 != kind) {
- if (kind2 > kind) {
+ if (kind2 != kind1) {
+ if (kind2 > kind1) {
Py_DECREF(sub);
Py_DECREF(str);
return 0;
}
- buf2 = _PyUnicode_AsKind(sub, kind);
+ buf2 = _PyUnicode_AsKind(sub, kind1);
}
if (!buf2) {
Py_DECREF(sub);
@@ -10585,7 +10680,7 @@ PyUnicode_Contains(PyObject *container, PyObject *element)
len1 = PyUnicode_GET_LENGTH(str);
len2 = PyUnicode_GET_LENGTH(sub);
- switch (kind) {
+ switch (kind1) {
case PyUnicode_1BYTE_KIND:
result = ucs1lib_find(buf1, len1, buf2, len2, 0) != -1;
break;
@@ -10603,7 +10698,7 @@ PyUnicode_Contains(PyObject *container, PyObject *element)
Py_DECREF(str);
Py_DECREF(sub);
- if (kind2 != kind)
+ if (kind2 != kind1)
PyMem_Free(buf2);
return result;
@@ -10679,7 +10774,8 @@ PyUnicode_Append(PyObject **p_left, PyObject *right)
return;
}
left = *p_left;
- if (right == NULL || left == NULL || !PyUnicode_Check(left)) {
+ if (right == NULL || left == NULL
+ || !PyUnicode_Check(left) || !PyUnicode_Check(right)) {
if (!PyErr_Occurred())
PyErr_BadInternalCall();
goto error;
@@ -10719,15 +10815,9 @@ PyUnicode_Append(PyObject **p_left, PyObject *right)
&& !(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right)))
{
/* append inplace */
- if (unicode_resize(p_left, new_len) != 0) {
- /* XXX if _PyUnicode_Resize() fails, 'left' has been
- * deallocated so it cannot be put back into
- * 'variable'. The MemoryError is raised when there
- * is no value in 'variable', which might (very
- * remotely) be a cause of incompatibilities.
- */
+ if (unicode_resize(p_left, new_len) != 0)
goto error;
- }
+
/* copy 'right' into the newly allocated area of 'left' */
_PyUnicode_FastCopyCharacters(*p_left, left_len, right, 0, right_len);
}
@@ -10783,8 +10873,10 @@ unicode_count(PyObject *self, PyObject *args)
kind1 = PyUnicode_KIND(self);
kind2 = PyUnicode_KIND(substring);
- if (kind2 > kind1)
+ if (kind2 > kind1) {
+ Py_DECREF(substring);
return PyLong_FromLong(0);
+ }
kind = kind1;
buf1 = PyUnicode_DATA(self);
buf2 = PyUnicode_DATA(substring);
@@ -10962,10 +11054,14 @@ unicode_find(PyObject *self, PyObject *args)
&start, &end))
return NULL;
- if (PyUnicode_READY(self) == -1)
+ if (PyUnicode_READY(self) == -1) {
+ Py_DECREF(substring);
return NULL;
- if (PyUnicode_READY(substring) == -1)
+ }
+ if (PyUnicode_READY(substring) == -1) {
+ Py_DECREF(substring);
return NULL;
+ }
result = any_find_slice(1, self, substring, start, end);
@@ -11088,10 +11184,14 @@ unicode_index(PyObject *self, PyObject *args)
&start, &end))
return NULL;
- if (PyUnicode_READY(self) == -1)
+ if (PyUnicode_READY(self) == -1) {
+ Py_DECREF(substring);
return NULL;
- if (PyUnicode_READY(substring) == -1)
+ }
+ if (PyUnicode_READY(substring) == -1) {
+ Py_DECREF(substring);
return NULL;
+ }
result = any_find_slice(1, self, substring, start, end);
@@ -11621,6 +11721,7 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj)
int kind;
Py_ssize_t i, j, len;
BLOOM_MASK sepmask;
+ Py_ssize_t seplen;
if (PyUnicode_READY(self) == -1 || PyUnicode_READY(sepobj) == -1)
return NULL;
@@ -11628,24 +11729,35 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj)
kind = PyUnicode_KIND(self);
data = PyUnicode_DATA(self);
len = PyUnicode_GET_LENGTH(self);
+ seplen = PyUnicode_GET_LENGTH(sepobj);
sepmask = make_bloom_mask(PyUnicode_KIND(sepobj),
PyUnicode_DATA(sepobj),
- PyUnicode_GET_LENGTH(sepobj));
+ seplen);
i = 0;
if (striptype != RIGHTSTRIP) {
- while (i < len &&
- BLOOM_MEMBER(sepmask, PyUnicode_READ(kind, data, i), sepobj)) {
+ while (i < len) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (!BLOOM(sepmask, ch))
+ break;
+ if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
+ break;
i++;
}
}
j = len;
if (striptype != LEFTSTRIP) {
- do {
+ j--;
+ while (j >= i) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, j);
+ if (!BLOOM(sepmask, ch))
+ break;
+ if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
+ break;
j--;
- } while (j >= i &&
- BLOOM_MEMBER(sepmask, PyUnicode_READ(kind, data, j), sepobj));
+ }
+
j++;
}
@@ -11692,30 +11804,63 @@ PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end)
static PyObject *
do_strip(PyObject *self, int striptype)
{
- int kind;
- void *data;
Py_ssize_t len, i, j;
if (PyUnicode_READY(self) == -1)
return NULL;
- kind = PyUnicode_KIND(self);
- data = PyUnicode_DATA(self);
len = PyUnicode_GET_LENGTH(self);
- i = 0;
- if (striptype != RIGHTSTRIP) {
- while (i < len && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, i))) {
- i++;
+ if (PyUnicode_IS_ASCII(self)) {
+ Py_UCS1 *data = PyUnicode_1BYTE_DATA(self);
+
+ i = 0;
+ if (striptype != RIGHTSTRIP) {
+ while (i < len) {
+ Py_UCS1 ch = data[i];
+ if (!_Py_ascii_whitespace[ch])
+ break;
+ i++;
+ }
+ }
+
+ j = len;
+ if (striptype != LEFTSTRIP) {
+ j--;
+ while (j >= i) {
+ Py_UCS1 ch = data[j];
+ if (!_Py_ascii_whitespace[ch])
+ break;
+ j--;
+ }
+ j++;
}
}
+ else {
+ int kind = PyUnicode_KIND(self);
+ void *data = PyUnicode_DATA(self);
- j = len;
- if (striptype != LEFTSTRIP) {
- do {
+ i = 0;
+ if (striptype != RIGHTSTRIP) {
+ while (i < len) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (!Py_UNICODE_ISSPACE(ch))
+ break;
+ i++;
+ }
+ }
+
+ j = len;
+ if (striptype != LEFTSTRIP) {
j--;
- } while (j >= i && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, j)));
- j++;
+ while (j >= i) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, j);
+ if (!Py_UNICODE_ISSPACE(ch))
+ break;
+ j--;
+ }
+ j++;
+ }
}
return PyUnicode_Substring(self, i, j);
@@ -11939,7 +12084,7 @@ unicode_repr(PyObject *unicode)
Py_ssize_t isize;
Py_ssize_t osize, squote, dquote, i, o;
Py_UCS4 max, quote;
- int ikind, okind;
+ int ikind, okind, unchanged;
void *idata, *odata;
if (PyUnicode_READY(unicode) == -1)
@@ -11950,7 +12095,7 @@ unicode_repr(PyObject *unicode)
/* Compute length of output, quote characters, and
maximum character */
- osize = 2; /* quotes */
+ osize = 0;
max = 127;
squote = dquote = 0;
ikind = PyUnicode_KIND(unicode);
@@ -11981,7 +12126,9 @@ unicode_repr(PyObject *unicode)
}
quote = '\'';
+ unchanged = (osize == isize);
if (squote) {
+ unchanged = 0;
if (dquote)
/* Both squote and dquote present. Use squote,
and escape them */
@@ -11989,6 +12136,7 @@ unicode_repr(PyObject *unicode)
else
quote = '"';
}
+ osize += 2; /* quotes */
repr = PyUnicode_New(osize, max);
if (repr == NULL)
@@ -11998,82 +12146,88 @@ unicode_repr(PyObject *unicode)
PyUnicode_WRITE(okind, odata, 0, quote);
PyUnicode_WRITE(okind, odata, osize-1, quote);
+ if (unchanged) {
+ _PyUnicode_FastCopyCharacters(repr, 1,
+ unicode, 0,
+ isize);
+ }
+ else {
+ for (i = 0, o = 1; i < isize; i++) {
+ Py_UCS4 ch = PyUnicode_READ(ikind, idata, i);
- for (i = 0, o = 1; i < isize; i++) {
- Py_UCS4 ch = PyUnicode_READ(ikind, idata, i);
-
- /* Escape quotes and backslashes */
- if ((ch == quote) || (ch == '\\')) {
- PyUnicode_WRITE(okind, odata, o++, '\\');
- PyUnicode_WRITE(okind, odata, o++, ch);
- continue;
- }
+ /* Escape quotes and backslashes */
+ if ((ch == quote) || (ch == '\\')) {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, ch);
+ continue;
+ }
- /* Map special whitespace to '\t', \n', '\r' */
- if (ch == '\t') {
- PyUnicode_WRITE(okind, odata, o++, '\\');
- PyUnicode_WRITE(okind, odata, o++, 't');
- }
- else if (ch == '\n') {
- PyUnicode_WRITE(okind, odata, o++, '\\');
- PyUnicode_WRITE(okind, odata, o++, 'n');
- }
- else if (ch == '\r') {
- PyUnicode_WRITE(okind, odata, o++, '\\');
- PyUnicode_WRITE(okind, odata, o++, 'r');
- }
+ /* Map special whitespace to '\t', \n', '\r' */
+ if (ch == '\t') {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 't');
+ }
+ else if (ch == '\n') {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 'n');
+ }
+ else if (ch == '\r') {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 'r');
+ }
- /* Map non-printable US ASCII to '\xhh' */
- else if (ch < ' ' || ch == 0x7F) {
- PyUnicode_WRITE(okind, odata, o++, '\\');
- PyUnicode_WRITE(okind, odata, o++, 'x');
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]);
- }
+ /* Map non-printable US ASCII to '\xhh' */
+ else if (ch < ' ' || ch == 0x7F) {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 'x');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]);
+ }
- /* Copy ASCII characters as-is */
- else if (ch < 0x7F) {
- PyUnicode_WRITE(okind, odata, o++, ch);
- }
+ /* Copy ASCII characters as-is */
+ else if (ch < 0x7F) {
+ PyUnicode_WRITE(okind, odata, o++, ch);
+ }
- /* Non-ASCII characters */
- else {
- /* Map Unicode whitespace and control characters
- (categories Z* and C* except ASCII space)
- */
- if (!Py_UNICODE_ISPRINTABLE(ch)) {
- PyUnicode_WRITE(okind, odata, o++, '\\');
- /* Map 8-bit characters to '\xhh' */
- if (ch <= 0xff) {
- PyUnicode_WRITE(okind, odata, o++, 'x');
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]);
- }
- /* Map 16-bit characters to '\uxxxx' */
- else if (ch <= 0xffff) {
- PyUnicode_WRITE(okind, odata, o++, 'u');
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]);
+ /* Non-ASCII characters */
+ else {
+ /* Map Unicode whitespace and control characters
+ (categories Z* and C* except ASCII space)
+ */
+ if (!Py_UNICODE_ISPRINTABLE(ch)) {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ /* Map 8-bit characters to '\xhh' */
+ if (ch <= 0xff) {
+ PyUnicode_WRITE(okind, odata, o++, 'x');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]);
+ }
+ /* Map 16-bit characters to '\uxxxx' */
+ else if (ch <= 0xffff) {
+ PyUnicode_WRITE(okind, odata, o++, 'u');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]);
+ }
+ /* Map 21-bit characters to '\U00xxxxxx' */
+ else {
+ PyUnicode_WRITE(okind, odata, o++, 'U');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 28) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 24) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 20) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 16) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]);
+ }
}
- /* Map 21-bit characters to '\U00xxxxxx' */
+ /* Copy characters as-is */
else {
- PyUnicode_WRITE(okind, odata, o++, 'U');
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 28) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 24) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 20) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 16) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]);
- PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, ch);
}
}
- /* Copy characters as-is */
- else {
- PyUnicode_WRITE(okind, odata, o++, ch);
- }
}
}
/* Closing quote already added at the beginning */
@@ -12102,10 +12256,14 @@ unicode_rfind(PyObject *self, PyObject *args)
&start, &end))
return NULL;
- if (PyUnicode_READY(self) == -1)
+ if (PyUnicode_READY(self) == -1) {
+ Py_DECREF(substring);
return NULL;
- if (PyUnicode_READY(substring) == -1)
+ }
+ if (PyUnicode_READY(substring) == -1) {
+ Py_DECREF(substring);
return NULL;
+ }
result = any_find_slice(-1, self, substring, start, end);
@@ -12134,10 +12292,14 @@ unicode_rindex(PyObject *self, PyObject *args)
&start, &end))
return NULL;
- if (PyUnicode_READY(self) == -1)
+ if (PyUnicode_READY(self) == -1) {
+ Py_DECREF(substring);
return NULL;
- if (PyUnicode_READY(substring) == -1)
+ }
+ if (PyUnicode_READY(substring) == -1) {
+ Py_DECREF(substring);
return NULL;
+ }
result = any_find_slice(-1, self, substring, start, end);
@@ -12726,6 +12888,8 @@ unicode_startswith(PyObject *self,
return NULL;
result = tailmatch(self, substring, start, end, -1);
Py_DECREF(substring);
+ if (result == -1)
+ return NULL;
if (result) {
Py_RETURN_TRUE;
}
@@ -12742,6 +12906,8 @@ unicode_startswith(PyObject *self,
}
result = tailmatch(self, substring, start, end, -1);
Py_DECREF(substring);
+ if (result == -1)
+ return NULL;
return PyBool_FromLong(result);
}
@@ -12775,6 +12941,8 @@ unicode_endswith(PyObject *self,
return NULL;
result = tailmatch(self, substring, start, end, +1);
Py_DECREF(substring);
+ if (result == -1)
+ return NULL;
if (result) {
Py_RETURN_TRUE;
}
@@ -12790,27 +12958,35 @@ unicode_endswith(PyObject *self,
}
result = tailmatch(self, substring, start, end, +1);
Py_DECREF(substring);
+ if (result == -1)
+ return NULL;
return PyBool_FromLong(result);
}
Py_LOCAL_INLINE(void)
_PyUnicodeWriter_Update(_PyUnicodeWriter *writer)
{
- writer->size = PyUnicode_GET_LENGTH(writer->buffer);
+ if (!writer->readonly)
+ writer->size = PyUnicode_GET_LENGTH(writer->buffer);
+ else {
+ /* Copy-on-write mode: set buffer size to 0 so
+ * _PyUnicodeWriter_Prepare() will copy (and enlarge) the buffer on
+ * next write. */
+ writer->size = 0;
+ }
writer->maxchar = PyUnicode_MAX_CHAR_VALUE(writer->buffer);
writer->data = PyUnicode_DATA(writer->buffer);
writer->kind = PyUnicode_KIND(writer->buffer);
}
void
-_PyUnicodeWriter_Init(_PyUnicodeWriter *writer, Py_ssize_t min_length)
+_PyUnicodeWriter_Init(_PyUnicodeWriter *writer)
{
memset(writer, 0, sizeof(*writer));
#ifdef Py_DEBUG
writer->kind = 5; /* invalid kind */
#endif
- writer->min_length = Py_MAX(min_length, 100);
- writer->overallocate = (min_length > 0);
+ writer->min_char = 127;
}
int
@@ -12828,29 +13004,28 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
}
newlen = writer->pos + length;
+ maxchar = Py_MAX(maxchar, writer->min_char);
+
if (writer->buffer == NULL) {
- if (writer->overallocate) {
+ assert(!writer->readonly);
+ if (writer->overallocate && newlen <= (PY_SSIZE_T_MAX - newlen / 4)) {
/* overallocate 25% to limit the number of resize */
- if (newlen <= (PY_SSIZE_T_MAX - newlen / 4))
- newlen += newlen / 4;
- if (newlen < writer->min_length)
- newlen = writer->min_length;
+ newlen += newlen / 4;
}
+ if (newlen < writer->min_length)
+ newlen = writer->min_length;
+
writer->buffer = PyUnicode_New(newlen, maxchar);
if (writer->buffer == NULL)
return -1;
- _PyUnicodeWriter_Update(writer);
- return 0;
}
-
- if (newlen > writer->size) {
- if (writer->overallocate) {
+ else if (newlen > writer->size) {
+ if (writer->overallocate && newlen <= (PY_SSIZE_T_MAX - newlen / 4)) {
/* overallocate 25% to limit the number of resize */
- if (newlen <= (PY_SSIZE_T_MAX - newlen / 4))
- newlen += newlen / 4;
- if (newlen < writer->min_length)
- newlen = writer->min_length;
+ newlen += newlen / 4;
}
+ if (newlen < writer->min_length)
+ newlen = writer->min_length;
if (maxchar > writer->maxchar || writer->readonly) {
/* resize + widen */
@@ -12868,7 +13043,6 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
return -1;
}
writer->buffer = newbuffer;
- _PyUnicodeWriter_Update(writer);
}
else if (maxchar > writer->maxchar) {
assert(!writer->readonly);
@@ -12879,12 +13053,28 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
writer->buffer, 0, writer->pos);
Py_DECREF(writer->buffer);
writer->buffer = newbuffer;
- _PyUnicodeWriter_Update(writer);
}
+ _PyUnicodeWriter_Update(writer);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+_PyUnicodeWriter_WriteCharInline(_PyUnicodeWriter *writer, Py_UCS4 ch)
+{
+ if (_PyUnicodeWriter_Prepare(writer, 1, ch) < 0)
+ return -1;
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, ch);
+ writer->pos++;
return 0;
}
int
+_PyUnicodeWriter_WriteChar(_PyUnicodeWriter *writer, Py_UCS4 ch)
+{
+ return _PyUnicodeWriter_WriteCharInline(writer, ch);
+}
+
+int
_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str)
{
Py_UCS4 maxchar;
@@ -12898,11 +13088,10 @@ _PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str)
maxchar = PyUnicode_MAX_CHAR_VALUE(str);
if (maxchar > writer->maxchar || len > writer->size - writer->pos) {
if (writer->buffer == NULL && !writer->overallocate) {
+ writer->readonly = 1;
Py_INCREF(str);
writer->buffer = str;
_PyUnicodeWriter_Update(writer);
- writer->readonly = 1;
- writer->size = 0;
writer->pos += len;
return 0;
}
@@ -12915,28 +13104,82 @@ _PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str)
return 0;
}
+int
+_PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer, PyObject *str,
+ Py_ssize_t start, Py_ssize_t end)
+{
+ Py_UCS4 maxchar;
+ Py_ssize_t len;
+
+ if (PyUnicode_READY(str) == -1)
+ return -1;
+
+ assert(0 <= start);
+ assert(end <= PyUnicode_GET_LENGTH(str));
+ assert(start <= end);
+
+ if (end == 0)
+ return 0;
+
+ if (start == 0 && end == PyUnicode_GET_LENGTH(str))
+ return _PyUnicodeWriter_WriteStr(writer, str);
+
+ if (PyUnicode_MAX_CHAR_VALUE(str) > writer->maxchar)
+ maxchar = _PyUnicode_FindMaxChar(str, start, end);
+ else
+ maxchar = writer->maxchar;
+ len = end - start;
+
+ if (_PyUnicodeWriter_Prepare(writer, len, maxchar) < 0)
+ return -1;
+
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ str, start, len);
+ writer->pos += len;
+ return 0;
+}
+
+int
+_PyUnicodeWriter_WriteCstr(_PyUnicodeWriter *writer, const char *str, Py_ssize_t len)
+{
+ Py_UCS4 maxchar;
+
+ maxchar = ucs1lib_find_max_char((Py_UCS1*)str, (Py_UCS1*)str + len);
+ if (_PyUnicodeWriter_Prepare(writer, len, maxchar) == -1)
+ return -1;
+ unicode_write_cstr(writer->buffer, writer->pos, str, len);
+ writer->pos += len;
+ return 0;
+}
+
PyObject *
_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer)
{
+ PyObject *str;
if (writer->pos == 0) {
- Py_XDECREF(writer->buffer);
+ Py_CLEAR(writer->buffer);
_Py_RETURN_UNICODE_EMPTY();
}
if (writer->readonly) {
- assert(PyUnicode_GET_LENGTH(writer->buffer) == writer->pos);
- return writer->buffer;
+ str = writer->buffer;
+ writer->buffer = NULL;
+ assert(PyUnicode_GET_LENGTH(str) == writer->pos);
+ return str;
}
if (PyUnicode_GET_LENGTH(writer->buffer) != writer->pos) {
PyObject *newbuffer;
newbuffer = resize_compact(writer->buffer, writer->pos);
if (newbuffer == NULL) {
Py_DECREF(writer->buffer);
+ writer->buffer = NULL;
return NULL;
}
writer->buffer = newbuffer;
}
- assert(_PyUnicode_CheckConsistency(writer->buffer, 1));
- return unicode_result_ready(writer->buffer);
+ str = writer->buffer;
+ writer->buffer = NULL;
+ assert(_PyUnicode_CheckConsistency(str, 1));
+ return unicode_result_ready(str);
}
void
@@ -12971,7 +13214,7 @@ unicode__format__(PyObject* self, PyObject* args)
if (PyUnicode_READY(self) == -1)
return NULL;
- _PyUnicodeWriter_Init(&writer, 0);
+ _PyUnicodeWriter_Init(&writer);
ret = _PyUnicode_FormatAdvancedWriter(&writer,
self, format_spec, 0,
PyUnicode_GET_LENGTH(format_spec));
@@ -13190,16 +13433,39 @@ static PyMappingMethods unicode_as_mapping = {
/* Helpers for PyUnicode_Format() */
+struct unicode_formatter_t {
+ PyObject *args;
+ int args_owned;
+ Py_ssize_t arglen, argidx;
+ PyObject *dict;
+
+ enum PyUnicode_Kind fmtkind;
+ Py_ssize_t fmtcnt, fmtpos;
+ void *fmtdata;
+ PyObject *fmtstr;
+
+ _PyUnicodeWriter writer;
+};
+
+struct unicode_format_arg_t {
+ Py_UCS4 ch;
+ int flags;
+ Py_ssize_t width;
+ int prec;
+ int sign;
+};
+
static PyObject *
-getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
+unicode_format_getnextarg(struct unicode_formatter_t *ctx)
{
- Py_ssize_t argidx = *p_argidx;
- if (argidx < arglen) {
- (*p_argidx)++;
- if (arglen < 0)
- return args;
+ Py_ssize_t argidx = ctx->argidx;
+
+ if (argidx < ctx->arglen) {
+ ctx->argidx++;
+ if (ctx->arglen < 0)
+ return ctx->args;
else
- return PyTuple_GetItem(args, argidx);
+ return PyTuple_GetItem(ctx->args, argidx);
}
PyErr_SetString(PyExc_TypeError,
"not enough arguments for format string");
@@ -13208,23 +13474,34 @@ getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
/* Returns a new reference to a PyUnicode object, or NULL on failure. */
+/* Format a float into the writer if the writer is not NULL, or into *p_output
+ otherwise.
+
+ Return 0 on success, raise an exception and return -1 on error. */
static int
-formatfloat(PyObject *v, int flags, int prec, int type,
- PyObject **p_output, _PyUnicodeWriter *writer)
+formatfloat(PyObject *v, struct unicode_format_arg_t *arg,
+ PyObject **p_output,
+ _PyUnicodeWriter *writer)
{
char *p;
double x;
Py_ssize_t len;
+ int prec;
+ int dtoa_flags;
x = PyFloat_AsDouble(v);
if (x == -1.0 && PyErr_Occurred())
return -1;
+ prec = arg->prec;
if (prec < 0)
prec = 6;
- p = PyOS_double_to_string(x, type, prec,
- (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
+ if (arg->flags & F_ALT)
+ dtoa_flags = Py_DTSF_ALT;
+ else
+ dtoa_flags = 0;
+ p = PyOS_double_to_string(x, arg->ch, prec, dtoa_flags, NULL);
if (p == NULL)
return -1;
len = strlen(p);
@@ -13261,7 +13538,7 @@ formatfloat(PyObject *v, int flags, int prec, int type,
* produce a '-' sign, but can for Python's unbounded ints.
*/
static PyObject*
-formatlong(PyObject *val, int flags, int prec, int type)
+formatlong(PyObject *val, struct unicode_format_arg_t *arg)
{
PyObject *result = NULL;
char *buf;
@@ -13271,6 +13548,8 @@ formatlong(PyObject *val, int flags, int prec, int type)
Py_ssize_t llen;
int numdigits; /* len == numnondigits + numdigits */
int numnondigits = 0;
+ int prec = arg->prec;
+ int type = arg->ch;
/* Avoid exceeding SSIZE_T_MAX */
if (prec > INT_MAX-3) {
@@ -13282,7 +13561,10 @@ formatlong(PyObject *val, int flags, int prec, int type)
assert(PyLong_Check(val));
switch (type) {
+ default:
+ assert(!"'type' not in [diuoxX]");
case 'd':
+ case 'i':
case 'u':
/* Special-case boolean: we want 0/1 */
if (PyBool_Check(val))
@@ -13299,8 +13581,6 @@ formatlong(PyObject *val, int flags, int prec, int type)
numnondigits = 2;
result = PyNumber_ToBase(val, 16);
break;
- default:
- assert(!"'type' not in [duoxX]");
}
if (!result)
return NULL;
@@ -13311,12 +13591,14 @@ formatlong(PyObject *val, int flags, int prec, int type)
/* To modify the string in-place, there can only be one reference. */
if (Py_REFCNT(result) != 1) {
+ Py_DECREF(result);
PyErr_BadInternalCall();
return NULL;
}
buf = PyUnicode_DATA(result);
llen = PyUnicode_GET_LENGTH(result);
if (llen > INT_MAX) {
+ Py_DECREF(result);
PyErr_SetString(PyExc_ValueError,
"string too large in _PyBytes_FormatLong");
return NULL;
@@ -13328,7 +13610,7 @@ formatlong(PyObject *val, int flags, int prec, int type)
assert(numdigits > 0);
/* Get rid of base marker unless F_ALT */
- if (((flags & F_ALT) == 0 &&
+ if (((arg->flags & F_ALT) == 0 &&
(type == 'o' || type == 'x' || type == 'X'))) {
assert(buf[sign] == '0');
assert(buf[sign+1] == 'x' || buf[sign+1] == 'X' ||
@@ -13373,15 +13655,100 @@ formatlong(PyObject *val, int flags, int prec, int type)
if (buf[i] >= 'a' && buf[i] <= 'x')
buf[i] -= 'a'-'A';
}
- if (!PyUnicode_Check(result) || len != PyUnicode_GET_LENGTH(result)) {
+ if (!PyUnicode_Check(result)
+ || buf != PyUnicode_DATA(result)) {
PyObject *unicode;
unicode = _PyUnicode_FromASCII(buf, len);
Py_DECREF(result);
result = unicode;
}
+ else if (len != PyUnicode_GET_LENGTH(result)) {
+ if (PyUnicode_Resize(&result, len) < 0)
+ Py_CLEAR(result);
+ }
return result;
}
+/* Format an integer.
+ * Return 1 if the number has been formatted into the writer,
+ * 0 if the number has been formatted into *p_output
+ * -1 and raise an exception on error */
+static int
+mainformatlong(PyObject *v,
+ struct unicode_format_arg_t *arg,
+ PyObject **p_output,
+ _PyUnicodeWriter *writer)
+{
+ PyObject *iobj, *res;
+ char type = (char)arg->ch;
+
+ if (!PyNumber_Check(v))
+ goto wrongtype;
+
+ if (!PyLong_Check(v)) {
+ iobj = PyNumber_Long(v);
+ if (iobj == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_TypeError))
+ goto wrongtype;
+ return -1;
+ }
+ assert(PyLong_Check(iobj));
+ }
+ else {
+ iobj = v;
+ Py_INCREF(iobj);
+ }
+
+ if (PyLong_CheckExact(v)
+ && arg->width == -1 && arg->prec == -1
+ && !(arg->flags & (F_SIGN | F_BLANK))
+ && type != 'X')
+ {
+ /* Fast path */
+ int alternate = arg->flags & F_ALT;
+ int base;
+
+ switch(type)
+ {
+ default:
+ assert(0 && "'type' not in [diuoxX]");
+ case 'd':
+ case 'i':
+ case 'u':
+ base = 10;
+ break;
+ case 'o':
+ base = 8;
+ break;
+ case 'x':
+ case 'X':
+ base = 16;
+ break;
+ }
+
+ if (_PyLong_FormatWriter(writer, v, base, alternate) == -1) {
+ Py_DECREF(iobj);
+ return -1;
+ }
+ Py_DECREF(iobj);
+ return 1;
+ }
+
+ res = formatlong(iobj, arg);
+ Py_DECREF(iobj);
+ if (res == NULL)
+ return -1;
+ *p_output = res;
+ return 0;
+
+wrongtype:
+ PyErr_Format(PyExc_TypeError,
+ "%%%c format: a number is required, "
+ "not %.200s",
+ type, Py_TYPE(v)->tp_name);
+ return -1;
+}
+
static Py_UCS4
formatchar(PyObject *v)
{
@@ -13414,540 +13781,587 @@ formatchar(PyObject *v)
return (Py_UCS4) -1;
}
-PyObject *
-PyUnicode_Format(PyObject *format, PyObject *args)
-{
- Py_ssize_t fmtcnt, fmtpos, arglen, argidx;
- int args_owned = 0;
- PyObject *dict = NULL;
- PyObject *temp = NULL;
- PyObject *second = NULL;
- PyObject *uformat;
- void *fmt;
- enum PyUnicode_Kind kind, fmtkind;
- _PyUnicodeWriter writer;
- Py_ssize_t sublen;
- Py_UCS4 maxchar;
+/* Parse options of an argument: flags, width, precision.
+ Handle also "%(name)" syntax.
- if (format == NULL || args == NULL) {
- PyErr_BadInternalCall();
- return NULL;
- }
- uformat = PyUnicode_FromObject(format);
- if (uformat == NULL)
- return NULL;
- if (PyUnicode_READY(uformat) == -1) {
- Py_DECREF(uformat);
- return NULL;
- }
+ Return 0 if the argument has been formatted into arg->str.
+ Return 1 if the argument has been written into ctx->writer,
+ Raise an exception and return -1 on error. */
+static int
+unicode_format_arg_parse(struct unicode_formatter_t *ctx,
+ struct unicode_format_arg_t *arg)
+{
+#define FORMAT_READ(ctx) \
+ PyUnicode_READ((ctx)->fmtkind, (ctx)->fmtdata, (ctx)->fmtpos)
- fmt = PyUnicode_DATA(uformat);
- fmtkind = PyUnicode_KIND(uformat);
- fmtcnt = PyUnicode_GET_LENGTH(uformat);
- fmtpos = 0;
+ PyObject *v;
- _PyUnicodeWriter_Init(&writer, fmtcnt + 100);
+ if (arg->ch == '(') {
+ /* Get argument value from a dictionary. Example: "%(name)s". */
+ Py_ssize_t keystart;
+ Py_ssize_t keylen;
+ PyObject *key;
+ int pcount = 1;
- if (PyTuple_Check(args)) {
- arglen = PyTuple_Size(args);
- argidx = 0;
- }
- else {
- arglen = -1;
- argidx = -2;
+ if (ctx->dict == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "format requires a mapping");
+ return -1;
+ }
+ ++ctx->fmtpos;
+ --ctx->fmtcnt;
+ keystart = ctx->fmtpos;
+ /* Skip over balanced parentheses */
+ while (pcount > 0 && --ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ if (arg->ch == ')')
+ --pcount;
+ else if (arg->ch == '(')
+ ++pcount;
+ ctx->fmtpos++;
+ }
+ keylen = ctx->fmtpos - keystart - 1;
+ if (ctx->fmtcnt < 0 || pcount > 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "incomplete format key");
+ return -1;
+ }
+ key = PyUnicode_Substring(ctx->fmtstr,
+ keystart, keystart + keylen);
+ if (key == NULL)
+ return -1;
+ if (ctx->args_owned) {
+ Py_DECREF(ctx->args);
+ ctx->args_owned = 0;
+ }
+ ctx->args = PyObject_GetItem(ctx->dict, key);
+ Py_DECREF(key);
+ if (ctx->args == NULL)
+ return -1;
+ ctx->args_owned = 1;
+ ctx->arglen = -1;
+ ctx->argidx = -2;
+ }
+
+ /* Parse flags. Example: "%+i" => flags=F_SIGN. */
+ while (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
+ switch (arg->ch) {
+ case '-': arg->flags |= F_LJUST; continue;
+ case '+': arg->flags |= F_SIGN; continue;
+ case ' ': arg->flags |= F_BLANK; continue;
+ case '#': arg->flags |= F_ALT; continue;
+ case '0': arg->flags |= F_ZERO; continue;
+ }
+ break;
}
- if (PyMapping_Check(args) && !PyTuple_Check(args) && !PyUnicode_Check(args))
- dict = args;
-
- while (--fmtcnt >= 0) {
- if (PyUnicode_READ(fmtkind, fmt, fmtpos) != '%') {
- Py_ssize_t nonfmtpos;
- nonfmtpos = fmtpos++;
- while (fmtcnt >= 0 &&
- PyUnicode_READ(fmtkind, fmt, fmtpos) != '%') {
- fmtpos++;
- fmtcnt--;
- }
- if (fmtcnt < 0)
- fmtpos--;
- sublen = fmtpos - nonfmtpos;
- maxchar = _PyUnicode_FindMaxChar(uformat,
- nonfmtpos, nonfmtpos + sublen);
- if (_PyUnicodeWriter_Prepare(&writer, sublen, maxchar) == -1)
- goto onError;
- _PyUnicode_FastCopyCharacters(writer.buffer, writer.pos,
- uformat, nonfmtpos, sublen);
- writer.pos += sublen;
+ /* Parse width. Example: "%10s" => width=10 */
+ if (arg->ch == '*') {
+ v = unicode_format_getnextarg(ctx);
+ if (v == NULL)
+ return -1;
+ if (!PyLong_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "* wants int");
+ return -1;
}
- else {
- /* Got a format specifier */
- int flags = 0;
- Py_ssize_t width = -1;
- int prec = -1;
- Py_UCS4 c = '\0';
- Py_UCS4 fill;
- int sign;
- Py_UCS4 signchar;
- int isnumok;
- PyObject *v = NULL;
- void *pbuf = NULL;
- Py_ssize_t pindex, len;
- Py_UCS4 bufmaxchar;
- Py_ssize_t buflen;
-
- fmtpos++;
- c = PyUnicode_READ(fmtkind, fmt, fmtpos);
- if (c == '(') {
- Py_ssize_t keystart;
- Py_ssize_t keylen;
- PyObject *key;
- int pcount = 1;
-
- if (dict == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "format requires a mapping");
- goto onError;
- }
- ++fmtpos;
- --fmtcnt;
- keystart = fmtpos;
- /* Skip over balanced parentheses */
- while (pcount > 0 && --fmtcnt >= 0) {
- c = PyUnicode_READ(fmtkind, fmt, fmtpos);
- if (c == ')')
- --pcount;
- else if (c == '(')
- ++pcount;
- fmtpos++;
- }
- keylen = fmtpos - keystart - 1;
- if (fmtcnt < 0 || pcount > 0) {
- PyErr_SetString(PyExc_ValueError,
- "incomplete format key");
- goto onError;
- }
- key = PyUnicode_Substring(uformat,
- keystart, keystart + keylen);
- if (key == NULL)
- goto onError;
- if (args_owned) {
- Py_DECREF(args);
- args_owned = 0;
- }
- args = PyObject_GetItem(dict, key);
- Py_DECREF(key);
- if (args == NULL) {
- goto onError;
- }
- args_owned = 1;
- arglen = -1;
- argidx = -2;
- }
- while (--fmtcnt >= 0) {
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
- switch (c) {
- case '-': flags |= F_LJUST; continue;
- case '+': flags |= F_SIGN; continue;
- case ' ': flags |= F_BLANK; continue;
- case '#': flags |= F_ALT; continue;
- case '0': flags |= F_ZERO; continue;
- }
+ arg->width = PyLong_AsSsize_t(v);
+ if (arg->width == -1 && PyErr_Occurred())
+ return -1;
+ if (arg->width < 0) {
+ arg->flags |= F_LJUST;
+ arg->width = -arg->width;
+ }
+ if (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
+ }
+ }
+ else if (arg->ch >= '0' && arg->ch <= '9') {
+ arg->width = arg->ch - '0';
+ while (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
+ if (arg->ch < '0' || arg->ch > '9')
break;
+ /* Since arg->ch is unsigned, the RHS would end up as unsigned,
+ mixing signed and unsigned comparison. Since arg->ch is between
+ '0' and '9', casting to int is safe. */
+ if (arg->width > (PY_SSIZE_T_MAX - ((int)arg->ch - '0')) / 10) {
+ PyErr_SetString(PyExc_ValueError,
+ "width too big");
+ return -1;
}
- if (c == '*') {
- v = getnextarg(args, arglen, &argidx);
- if (v == NULL)
- goto onError;
- if (!PyLong_Check(v)) {
- PyErr_SetString(PyExc_TypeError,
- "* wants int");
- goto onError;
- }
- width = PyLong_AsSsize_t(v);
- if (width == -1 && PyErr_Occurred())
- goto onError;
- if (width < 0) {
- flags |= F_LJUST;
- width = -width;
- }
- if (--fmtcnt >= 0)
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
- }
- else if (c >= '0' && c <= '9') {
- width = c - '0';
- while (--fmtcnt >= 0) {
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
- if (c < '0' || c > '9')
- break;
- /* Since c is unsigned, the RHS would end up as unsigned,
- mixing signed and unsigned comparison. Since c is between
- '0' and '9', casting to int is safe. */
- if (width > (PY_SSIZE_T_MAX - ((int)c - '0')) / 10) {
- PyErr_SetString(PyExc_ValueError,
- "width too big");
- goto onError;
- }
- width = width*10 + (c - '0');
- }
+ arg->width = arg->width*10 + (arg->ch - '0');
+ }
+ }
+
+ /* Parse precision. Example: "%.3f" => prec=3 */
+ if (arg->ch == '.') {
+ arg->prec = 0;
+ if (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
+ }
+ if (arg->ch == '*') {
+ v = unicode_format_getnextarg(ctx);
+ if (v == NULL)
+ return -1;
+ if (!PyLong_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "* wants int");
+ return -1;
}
- if (c == '.') {
- prec = 0;
- if (--fmtcnt >= 0)
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
- if (c == '*') {
- v = getnextarg(args, arglen, &argidx);
- if (v == NULL)
- goto onError;
- if (!PyLong_Check(v)) {
- PyErr_SetString(PyExc_TypeError,
- "* wants int");
- goto onError;
- }
- prec = _PyLong_AsInt(v);
- if (prec == -1 && PyErr_Occurred())
- goto onError;
- if (prec < 0)
- prec = 0;
- if (--fmtcnt >= 0)
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
- }
- else if (c >= '0' && c <= '9') {
- prec = c - '0';
- while (--fmtcnt >= 0) {
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
- if (c < '0' || c > '9')
- break;
- if (prec > (INT_MAX - ((int)c - '0')) / 10) {
- PyErr_SetString(PyExc_ValueError,
- "prec too big");
- goto onError;
- }
- prec = prec*10 + (c - '0');
- }
- }
- } /* prec */
- if (fmtcnt >= 0) {
- if (c == 'h' || c == 'l' || c == 'L') {
- if (--fmtcnt >= 0)
- c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
+ arg->prec = _PyLong_AsInt(v);
+ if (arg->prec == -1 && PyErr_Occurred())
+ return -1;
+ if (arg->prec < 0)
+ arg->prec = 0;
+ if (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
+ }
+ }
+ else if (arg->ch >= '0' && arg->ch <= '9') {
+ arg->prec = arg->ch - '0';
+ while (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
+ if (arg->ch < '0' || arg->ch > '9')
+ break;
+ if (arg->prec > (INT_MAX - ((int)arg->ch - '0')) / 10) {
+ PyErr_SetString(PyExc_ValueError,
+ "precision too big");
+ return -1;
}
+ arg->prec = arg->prec*10 + (arg->ch - '0');
}
- if (fmtcnt < 0) {
- PyErr_SetString(PyExc_ValueError,
- "incomplete format");
- goto onError;
- }
- if (fmtcnt == 0)
- writer.overallocate = 0;
+ }
+ }
- if (c == '%') {
- if (_PyUnicodeWriter_Prepare(&writer, 1, '%') == -1)
- goto onError;
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos, '%');
- writer.pos += 1;
- continue;
+ /* Ignore "h", "l" and "L" format prefix (ex: "%hi" or "%ls") */
+ if (ctx->fmtcnt >= 0) {
+ if (arg->ch == 'h' || arg->ch == 'l' || arg->ch == 'L') {
+ if (--ctx->fmtcnt >= 0) {
+ arg->ch = FORMAT_READ(ctx);
+ ctx->fmtpos++;
}
+ }
+ }
+ if (ctx->fmtcnt < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "incomplete format");
+ return -1;
+ }
+ return 0;
- v = getnextarg(args, arglen, &argidx);
- if (v == NULL)
- goto onError;
+#undef FORMAT_READ
+}
- sign = 0;
- signchar = '\0';
- fill = ' ';
- switch (c) {
-
- case 's':
- case 'r':
- case 'a':
- if (PyLong_CheckExact(v) && width == -1 && prec == -1) {
- /* Fast path */
- if (_PyLong_FormatWriter(&writer, v, 10, flags & F_ALT) == -1)
- goto onError;
- goto nextarg;
- }
+/* Format one argument. Supported conversion specifiers:
- if (PyUnicode_CheckExact(v) && c == 's') {
- temp = v;
- Py_INCREF(temp);
- }
- else {
- if (c == 's')
- temp = PyObject_Str(v);
- else if (c == 'r')
- temp = PyObject_Repr(v);
- else
- temp = PyObject_ASCII(v);
- }
- break;
+ - "s", "r", "a": any type
+ - "i", "d", "u", "o", "x", "X": int
+ - "e", "E", "f", "F", "g", "G": float
+ - "c": int or str (1 character)
- case 'i':
- case 'd':
- case 'u':
- case 'o':
- case 'x':
- case 'X':
- if (PyLong_CheckExact(v)
- && width == -1 && prec == -1
- && !(flags & (F_SIGN | F_BLANK)))
- {
- /* Fast path */
- switch(c)
- {
- case 'd':
- case 'i':
- case 'u':
- if (_PyLong_FormatWriter(&writer, v, 10, flags & F_ALT) == -1)
- goto onError;
- goto nextarg;
- case 'x':
- if (_PyLong_FormatWriter(&writer, v, 16, flags & F_ALT) == -1)
- goto onError;
- goto nextarg;
- case 'o':
- if (_PyLong_FormatWriter(&writer, v, 8, flags & F_ALT) == -1)
- goto onError;
- goto nextarg;
- default:
- break;
- }
- }
+ When possible, the output is written directly into the Unicode writer
+ (ctx->writer). A string is created when padding is required.
- isnumok = 0;
- if (PyNumber_Check(v)) {
- PyObject *iobj=NULL;
+ Return 0 if the argument has been formatted into *p_str,
+ 1 if the argument has been written into ctx->writer,
+ -1 on error. */
+static int
+unicode_format_arg_format(struct unicode_formatter_t *ctx,
+ struct unicode_format_arg_t *arg,
+ PyObject **p_str)
+{
+ PyObject *v;
+ _PyUnicodeWriter *writer = &ctx->writer;
- if (PyLong_Check(v)) {
- iobj = v;
- Py_INCREF(iobj);
- }
- else {
- iobj = PyNumber_Long(v);
- }
- if (iobj!=NULL) {
- if (PyLong_Check(iobj)) {
- isnumok = 1;
- sign = 1;
- temp = formatlong(iobj, flags, prec, (c == 'i'? 'd': c));
- Py_DECREF(iobj);
- }
- else {
- Py_DECREF(iobj);
- }
- }
- }
- if (!isnumok) {
- PyErr_Format(PyExc_TypeError,
- "%%%c format: a number is required, "
- "not %.200s", (char)c, Py_TYPE(v)->tp_name);
- goto onError;
- }
- if (flags & F_ZERO)
- fill = '0';
- break;
+ if (ctx->fmtcnt == 0)
+ ctx->writer.overallocate = 0;
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- if (width == -1 && prec == -1
- && !(flags & (F_SIGN | F_BLANK)))
- {
- /* Fast path */
- if (formatfloat(v, flags, prec, c, NULL, &writer) == -1)
- goto onError;
- goto nextarg;
- }
+ if (arg->ch == '%') {
+ if (_PyUnicodeWriter_WriteCharInline(writer, '%') < 0)
+ return -1;
+ return 1;
+ }
- sign = 1;
- if (flags & F_ZERO)
- fill = '0';
- if (formatfloat(v, flags, prec, c, &temp, NULL) == -1)
- temp = NULL;
- break;
+ v = unicode_format_getnextarg(ctx);
+ if (v == NULL)
+ return -1;
- case 'c':
- {
- Py_UCS4 ch = formatchar(v);
- if (ch == (Py_UCS4) -1)
- goto onError;
- if (width == -1 && prec == -1) {
- /* Fast path */
- if (_PyUnicodeWriter_Prepare(&writer, 1, ch) == -1)
- goto onError;
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos, ch);
- writer.pos += 1;
- goto nextarg;
- }
- temp = PyUnicode_FromOrdinal(ch);
- break;
- }
- default:
- PyErr_Format(PyExc_ValueError,
- "unsupported format character '%c' (0x%x) "
- "at index %zd",
- (31<=c && c<=126) ? (char)c : '?',
- (int)c,
- fmtpos - 1);
- goto onError;
- }
- if (temp == NULL)
- goto onError;
- assert (PyUnicode_Check(temp));
+ switch (arg->ch) {
+ case 's':
+ case 'r':
+ case 'a':
+ if (PyLong_CheckExact(v) && arg->width == -1 && arg->prec == -1) {
+ /* Fast path */
+ if (_PyLong_FormatWriter(writer, v, 10, arg->flags & F_ALT) == -1)
+ return -1;
+ return 1;
+ }
- if (width == -1 && prec == -1
- && !(flags & (F_SIGN | F_BLANK)))
- {
- /* Fast path */
- if (_PyUnicodeWriter_WriteStr(&writer, temp) == -1)
- goto onError;
- goto nextarg;
- }
+ if (PyUnicode_CheckExact(v) && arg->ch == 's') {
+ *p_str = v;
+ Py_INCREF(*p_str);
+ }
+ else {
+ if (arg->ch == 's')
+ *p_str = PyObject_Str(v);
+ else if (arg->ch == 'r')
+ *p_str = PyObject_Repr(v);
+ else
+ *p_str = PyObject_ASCII(v);
+ }
+ break;
- if (PyUnicode_READY(temp) == -1) {
- Py_CLEAR(temp);
- goto onError;
- }
- kind = PyUnicode_KIND(temp);
- pbuf = PyUnicode_DATA(temp);
- len = PyUnicode_GET_LENGTH(temp);
+ case 'i':
+ case 'd':
+ case 'u':
+ case 'o':
+ case 'x':
+ case 'X':
+ {
+ int ret = mainformatlong(v, arg, p_str, writer);
+ if (ret != 0)
+ return ret;
+ arg->sign = 1;
+ break;
+ }
- if (c == 's' || c == 'r' || c == 'a') {
- if (prec >= 0 && len > prec)
- len = prec;
- }
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'F':
+ case 'g':
+ case 'G':
+ if (arg->width == -1 && arg->prec == -1
+ && !(arg->flags & (F_SIGN | F_BLANK)))
+ {
+ /* Fast path */
+ if (formatfloat(v, arg, NULL, writer) == -1)
+ return -1;
+ return 1;
+ }
- /* pbuf is initialized here. */
- pindex = 0;
- if (sign) {
- Py_UCS4 ch = PyUnicode_READ(kind, pbuf, pindex);
- if (ch == '-' || ch == '+') {
- signchar = ch;
- len--;
- pindex++;
- }
- else if (flags & F_SIGN)
- signchar = '+';
- else if (flags & F_BLANK)
- signchar = ' ';
- else
- sign = 0;
- }
- if (width < len)
- width = len;
-
- /* Compute the length and maximum character of the
- written characters */
- bufmaxchar = 127;
- if (!(flags & F_LJUST)) {
- if (sign) {
- if ((width-1) > len)
- bufmaxchar = Py_MAX(bufmaxchar, fill);
- }
- else {
- if (width > len)
- bufmaxchar = Py_MAX(bufmaxchar, fill);
- }
- }
- maxchar = _PyUnicode_FindMaxChar(temp, 0, pindex+len);
- bufmaxchar = Py_MAX(bufmaxchar, maxchar);
+ arg->sign = 1;
+ if (formatfloat(v, arg, p_str, NULL) == -1)
+ return -1;
+ break;
- buflen = width;
- if (sign && len == width)
- buflen++;
+ case 'c':
+ {
+ Py_UCS4 ch = formatchar(v);
+ if (ch == (Py_UCS4) -1)
+ return -1;
+ if (arg->width == -1 && arg->prec == -1) {
+ /* Fast path */
+ if (_PyUnicodeWriter_WriteCharInline(writer, ch) < 0)
+ return -1;
+ return 1;
+ }
+ *p_str = PyUnicode_FromOrdinal(ch);
+ break;
+ }
- if (_PyUnicodeWriter_Prepare(&writer, buflen, bufmaxchar) == -1)
- goto onError;
+ default:
+ PyErr_Format(PyExc_ValueError,
+ "unsupported format character '%c' (0x%x) "
+ "at index %zd",
+ (31<=arg->ch && arg->ch<=126) ? (char)arg->ch : '?',
+ (int)arg->ch,
+ ctx->fmtpos - 1);
+ return -1;
+ }
+ if (*p_str == NULL)
+ return -1;
+ assert (PyUnicode_Check(*p_str));
+ return 0;
+}
- /* Write characters */
- if (sign) {
- if (fill != ' ') {
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos, signchar);
- writer.pos += 1;
- }
- if (width > len)
- width--;
- }
- if ((flags & F_ALT) && (c == 'x' || c == 'X' || c == 'o')) {
- assert(PyUnicode_READ(kind, pbuf, pindex) == '0');
- assert(PyUnicode_READ(kind, pbuf, pindex + 1) == c);
- if (fill != ' ') {
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos, '0');
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos+1, c);
- writer.pos += 2;
- pindex += 2;
- }
- width -= 2;
- if (width < 0)
- width = 0;
- len -= 2;
- }
- if (width > len && !(flags & F_LJUST)) {
- sublen = width - len;
- FILL(writer.kind, writer.data, fill, writer.pos, sublen);
- writer.pos += sublen;
- width = len;
- }
- if (fill == ' ') {
- if (sign) {
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos, signchar);
- writer.pos += 1;
- }
- if ((flags & F_ALT) && (c == 'x' || c == 'X' || c == 'o')) {
- assert(PyUnicode_READ(kind, pbuf, pindex) == '0');
- assert(PyUnicode_READ(kind, pbuf, pindex+1) == c);
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos, '0');
- PyUnicode_WRITE(writer.kind, writer.data, writer.pos+1, c);
- writer.pos += 2;
- pindex += 2;
- }
- }
+static int
+unicode_format_arg_output(struct unicode_formatter_t *ctx,
+ struct unicode_format_arg_t *arg,
+ PyObject *str)
+{
+ Py_ssize_t len;
+ enum PyUnicode_Kind kind;
+ void *pbuf;
+ Py_ssize_t pindex;
+ Py_UCS4 signchar;
+ Py_ssize_t buflen;
+ Py_UCS4 maxchar;
+ Py_ssize_t sublen;
+ _PyUnicodeWriter *writer = &ctx->writer;
+ Py_UCS4 fill;
+
+ fill = ' ';
+ if (arg->sign && arg->flags & F_ZERO)
+ fill = '0';
- if (len) {
- _PyUnicode_FastCopyCharacters(writer.buffer, writer.pos,
- temp, pindex, len);
- writer.pos += len;
+ if (PyUnicode_READY(str) == -1)
+ return -1;
+
+ len = PyUnicode_GET_LENGTH(str);
+ if ((arg->width == -1 || arg->width <= len)
+ && (arg->prec == -1 || arg->prec >= len)
+ && !(arg->flags & (F_SIGN | F_BLANK)))
+ {
+ /* Fast path */
+ if (_PyUnicodeWriter_WriteStr(writer, str) == -1)
+ return -1;
+ return 0;
+ }
+
+ /* Truncate the string for "s", "r" and "a" formats
+ if the precision is set */
+ if (arg->ch == 's' || arg->ch == 'r' || arg->ch == 'a') {
+ if (arg->prec >= 0 && len > arg->prec)
+ len = arg->prec;
+ }
+
+ /* Adjust sign and width */
+ kind = PyUnicode_KIND(str);
+ pbuf = PyUnicode_DATA(str);
+ pindex = 0;
+ signchar = '\0';
+ if (arg->sign) {
+ Py_UCS4 ch = PyUnicode_READ(kind, pbuf, pindex);
+ if (ch == '-' || ch == '+') {
+ signchar = ch;
+ len--;
+ pindex++;
+ }
+ else if (arg->flags & F_SIGN)
+ signchar = '+';
+ else if (arg->flags & F_BLANK)
+ signchar = ' ';
+ else
+ arg->sign = 0;
+ }
+ if (arg->width < len)
+ arg->width = len;
+
+ /* Prepare the writer */
+ maxchar = writer->maxchar;
+ if (!(arg->flags & F_LJUST)) {
+ if (arg->sign) {
+ if ((arg->width-1) > len)
+ maxchar = Py_MAX(maxchar, fill);
+ }
+ else {
+ if (arg->width > len)
+ maxchar = Py_MAX(maxchar, fill);
+ }
+ }
+ if (PyUnicode_MAX_CHAR_VALUE(str) > maxchar) {
+ Py_UCS4 strmaxchar = _PyUnicode_FindMaxChar(str, 0, pindex+len);
+ maxchar = Py_MAX(maxchar, strmaxchar);
+ }
+
+ buflen = arg->width;
+ if (arg->sign && len == arg->width)
+ buflen++;
+ if (_PyUnicodeWriter_Prepare(writer, buflen, maxchar) == -1)
+ return -1;
+
+ /* Write the sign if needed */
+ if (arg->sign) {
+ if (fill != ' ') {
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, signchar);
+ writer->pos += 1;
+ }
+ if (arg->width > len)
+ arg->width--;
+ }
+
+ /* Write the numeric prefix for "x", "X" and "o" formats
+ if the alternate form is used.
+ For example, write "0x" for the "%#x" format. */
+ if ((arg->flags & F_ALT) && (arg->ch == 'x' || arg->ch == 'X' || arg->ch == 'o')) {
+ assert(PyUnicode_READ(kind, pbuf, pindex) == '0');
+ assert(PyUnicode_READ(kind, pbuf, pindex + 1) == arg->ch);
+ if (fill != ' ') {
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, '0');
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos+1, arg->ch);
+ writer->pos += 2;
+ pindex += 2;
+ }
+ arg->width -= 2;
+ if (arg->width < 0)
+ arg->width = 0;
+ len -= 2;
+ }
+
+ /* Pad left with the fill character if needed */
+ if (arg->width > len && !(arg->flags & F_LJUST)) {
+ sublen = arg->width - len;
+ FILL(writer->kind, writer->data, fill, writer->pos, sublen);
+ writer->pos += sublen;
+ arg->width = len;
+ }
+
+ /* If padding with spaces: write sign if needed and/or numeric prefix if
+ the alternate form is used */
+ if (fill == ' ') {
+ if (arg->sign) {
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, signchar);
+ writer->pos += 1;
+ }
+ if ((arg->flags & F_ALT) && (arg->ch == 'x' || arg->ch == 'X' || arg->ch == 'o')) {
+ assert(PyUnicode_READ(kind, pbuf, pindex) == '0');
+ assert(PyUnicode_READ(kind, pbuf, pindex+1) == arg->ch);
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos, '0');
+ PyUnicode_WRITE(writer->kind, writer->data, writer->pos+1, arg->ch);
+ writer->pos += 2;
+ pindex += 2;
+ }
+ }
+
+ /* Write characters */
+ if (len) {
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ str, pindex, len);
+ writer->pos += len;
+ }
+
+ /* Pad right with the fill character if needed */
+ if (arg->width > len) {
+ sublen = arg->width - len;
+ FILL(writer->kind, writer->data, ' ', writer->pos, sublen);
+ writer->pos += sublen;
+ }
+ return 0;
+}
+
+/* Helper of PyUnicode_Format(): format one arg.
+ Return 0 on success, raise an exception and return -1 on error. */
+static int
+unicode_format_arg(struct unicode_formatter_t *ctx)
+{
+ struct unicode_format_arg_t arg;
+ PyObject *str;
+ int ret;
+
+ arg.ch = PyUnicode_READ(ctx->fmtkind, ctx->fmtdata, ctx->fmtpos);
+ arg.flags = 0;
+ arg.width = -1;
+ arg.prec = -1;
+ arg.sign = 0;
+ str = NULL;
+
+ ret = unicode_format_arg_parse(ctx, &arg);
+ if (ret == -1)
+ return -1;
+
+ ret = unicode_format_arg_format(ctx, &arg, &str);
+ if (ret == -1)
+ return -1;
+
+ if (ret != 1) {
+ ret = unicode_format_arg_output(ctx, &arg, str);
+ Py_DECREF(str);
+ if (ret == -1)
+ return -1;
+ }
+
+ if (ctx->dict && (ctx->argidx < ctx->arglen) && arg.ch != '%') {
+ PyErr_SetString(PyExc_TypeError,
+ "not all arguments converted during string formatting");
+ return -1;
+ }
+ return 0;
+}
+
+PyObject *
+PyUnicode_Format(PyObject *format, PyObject *args)
+{
+ struct unicode_formatter_t ctx;
+
+ if (format == NULL || args == NULL) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+
+ ctx.fmtstr = PyUnicode_FromObject(format);
+ if (ctx.fmtstr == NULL)
+ return NULL;
+ if (PyUnicode_READY(ctx.fmtstr) == -1) {
+ Py_DECREF(ctx.fmtstr);
+ return NULL;
+ }
+ ctx.fmtdata = PyUnicode_DATA(ctx.fmtstr);
+ ctx.fmtkind = PyUnicode_KIND(ctx.fmtstr);
+ ctx.fmtcnt = PyUnicode_GET_LENGTH(ctx.fmtstr);
+ ctx.fmtpos = 0;
+
+ _PyUnicodeWriter_Init(&ctx.writer);
+ ctx.writer.min_length = ctx.fmtcnt + 100;
+ ctx.writer.overallocate = 1;
+
+ if (PyTuple_Check(args)) {
+ ctx.arglen = PyTuple_Size(args);
+ ctx.argidx = 0;
+ }
+ else {
+ ctx.arglen = -1;
+ ctx.argidx = -2;
+ }
+ ctx.args_owned = 0;
+ if (PyMapping_Check(args) && !PyTuple_Check(args) && !PyUnicode_Check(args))
+ ctx.dict = args;
+ else
+ ctx.dict = NULL;
+ ctx.args = args;
+
+ while (--ctx.fmtcnt >= 0) {
+ if (PyUnicode_READ(ctx.fmtkind, ctx.fmtdata, ctx.fmtpos) != '%') {
+ Py_ssize_t nonfmtpos;
+
+ nonfmtpos = ctx.fmtpos++;
+ while (ctx.fmtcnt >= 0 &&
+ PyUnicode_READ(ctx.fmtkind, ctx.fmtdata, ctx.fmtpos) != '%') {
+ ctx.fmtpos++;
+ ctx.fmtcnt--;
}
- if (width > len) {
- sublen = width - len;
- FILL(writer.kind, writer.data, ' ', writer.pos, sublen);
- writer.pos += sublen;
+ if (ctx.fmtcnt < 0) {
+ ctx.fmtpos--;
+ ctx.writer.overallocate = 0;
}
-nextarg:
- if (dict && (argidx < arglen) && c != '%') {
- PyErr_SetString(PyExc_TypeError,
- "not all arguments converted during string formatting");
+ if (_PyUnicodeWriter_WriteSubstring(&ctx.writer, ctx.fmtstr,
+ nonfmtpos, ctx.fmtpos) < 0)
goto onError;
- }
- Py_CLEAR(temp);
- } /* '%' */
- } /* until end */
- if (argidx < arglen && !dict) {
+ }
+ else {
+ ctx.fmtpos++;
+ if (unicode_format_arg(&ctx) == -1)
+ goto onError;
+ }
+ }
+
+ if (ctx.argidx < ctx.arglen && !ctx.dict) {
PyErr_SetString(PyExc_TypeError,
"not all arguments converted during string formatting");
goto onError;
}
- if (args_owned) {
- Py_DECREF(args);
+ if (ctx.args_owned) {
+ Py_DECREF(ctx.args);
}
- Py_DECREF(uformat);
- Py_XDECREF(temp);
- Py_XDECREF(second);
- return _PyUnicodeWriter_Finish(&writer);
+ Py_DECREF(ctx.fmtstr);
+ return _PyUnicodeWriter_Finish(&ctx.writer);
onError:
- Py_DECREF(uformat);
- Py_XDECREF(temp);
- Py_XDECREF(second);
- _PyUnicodeWriter_Dealloc(&writer);
- if (args_owned) {
- Py_DECREF(args);
+ Py_DECREF(ctx.fmtstr);
+ _PyUnicodeWriter_Dealloc(&ctx.writer);
+ if (ctx.args_owned) {
+ Py_DECREF(ctx.args);
}
return NULL;
}
@@ -14207,7 +14621,7 @@ _PyUnicode_Fini(void)
void
PyUnicode_InternInPlace(PyObject **p)
{
- register PyObject *s = *p;
+ PyObject *s = *p;
PyObject *t;
#ifdef Py_DEBUG
assert(s != NULL);
@@ -14236,12 +14650,12 @@ PyUnicode_InternInPlace(PyObject **p)
t = PyDict_GetItem(interned, s);
Py_END_ALLOW_RECURSION
- if (t) {
- Py_INCREF(t);
- Py_DECREF(*p);
- *p = t;
- return;
- }
+ if (t) {
+ Py_INCREF(t);
+ Py_DECREF(*p);
+ *p = t;
+ return;
+ }
PyThreadState_GET()->recursion_critical = 1;
if (PyDict_SetItem(interned, s, s) < 0) {
@@ -14540,7 +14954,7 @@ Py_UNICODE_strcmp(const Py_UNICODE *s1, const Py_UNICODE *s2)
int
Py_UNICODE_strncmp(const Py_UNICODE *s1, const Py_UNICODE *s2, size_t n)
{
- register Py_UNICODE u1, u2;
+ Py_UNICODE u1, u2;
for (; n != 0; n--) {
u1 = *s1;
u2 = *s2;
diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h
index 46a92bb..57add8f 100644
--- a/Objects/unicodetype_db.h
+++ b/Objects/unicodetype_db.h
@@ -1919,7 +1919,7 @@ static unsigned short index2[] = {
246, 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 95, 245, 26, 22, 23, 246,
247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 0, 95, 95, 95, 95, 95, 95, 95,
95, 95, 95, 95, 95, 95, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 113, 5, 5,
@@ -2593,10 +2593,10 @@ static unsigned short index2[] = {
0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 141, 141, 141, 252, 252, 141, 141, 141,
141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 141, 141, 252, 252, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
@@ -2925,6 +2925,9 @@ static unsigned short index2[] = {
double _PyUnicode_ToNumeric(Py_UCS4 ch)
{
switch (ch) {
+ case 0x12456:
+ case 0x12457:
+ return (double) -1.0;
case 0x0F33:
return (double) -1.0/2.0;
case 0x0030:
@@ -3427,6 +3430,8 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
return (double) 20000.0;
case 0x3251:
return (double) 21.0;
+ case 0x12432:
+ return (double) 216000.0;
case 0x3252:
return (double) 22.0;
case 0x3253:
@@ -3721,6 +3726,8 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
return (double) 42.0;
case 0x32B8:
return (double) 43.0;
+ case 0x12433:
+ return (double) 432000.0;
case 0x32B9:
return (double) 44.0;
case 0x32BA:
@@ -4271,7 +4278,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
/* Returns 1 for Unicode characters having the bidirectional
* type 'WS', 'B' or 'S' or the category 'Zs', 0 otherwise.
*/
-int _PyUnicode_IsWhitespace(register const Py_UCS4 ch)
+int _PyUnicode_IsWhitespace(const Py_UCS4 ch)
{
switch (ch) {
case 0x0009:
@@ -4313,7 +4320,7 @@ int _PyUnicode_IsWhitespace(register const Py_UCS4 ch)
* property 'BK', 'CR', 'LF' or 'NL' or having bidirectional
* type 'B', 0 otherwise.
*/
-int _PyUnicode_IsLinebreak(register const Py_UCS4 ch)
+int _PyUnicode_IsLinebreak(const Py_UCS4 ch)
{
switch (ch) {
case 0x000A:
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index b49dcee..c083f8f 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -338,6 +338,11 @@ weakref___init__(PyObject *self, PyObject *args, PyObject *kwargs)
}
+static PyMemberDef weakref_members[] = {
+ {"__callback__", T_OBJECT, offsetof(PyWeakReference, wr_callback), READONLY},
+ {NULL} /* Sentinel */
+};
+
PyTypeObject
_PyWeakref_RefType = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
@@ -369,7 +374,7 @@ _PyWeakref_RefType = {
0, /*tp_iter*/
0, /*tp_iternext*/
0, /*tp_methods*/
- 0, /*tp_members*/
+ weakref_members, /*tp_members*/
0, /*tp_getset*/
0, /*tp_base*/
0, /*tp_dict*/
diff --git a/PC/VC6/_ctypes.dsp b/PC/VC6/_ctypes.dsp
deleted file mode 100644
index 1c98eac..0000000
--- a/PC/VC6/_ctypes.dsp
+++ /dev/null
@@ -1,131 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_ctypes" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_ctypes - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_ctypes.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_ctypes.mak" CFG="_ctypes - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_ctypes - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_ctypes - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_ctypes"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_ctypes - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_ctypes"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /I "..\..\Modules\_ctypes\libffi_msvc" /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1d1a0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_ctypes.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_ctypes - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_ctypes"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /I "..\..\Modules\_ctypes\libffi_msvc" /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1d1a0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_ctypes_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_ctypes - Win32 Release"
-# Name "_ctypes - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\_ctypes.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\callbacks.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\callproc.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\cfield.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\libffi_msvc\ffi.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\malloc_closure.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\libffi_msvc\prep_cif.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\stgdict.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\libffi_msvc\win32.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_ctypes_test.dsp b/PC/VC6/_ctypes_test.dsp
deleted file mode 100644
index d1eb217..0000000
--- a/PC/VC6/_ctypes_test.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_ctypes_test" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_ctypes_test - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_ctypes_test.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_ctypes_test.mak" CFG="_ctypes_test - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_ctypes_test - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_ctypes_test - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_ctypes_test"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_ctypes_test - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_ctypes_test"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"./_ctypes_test.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_ctypes_test - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_ctypes_test"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"./_ctypes_test_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_ctypes_test - Win32 Release"
-# Name "_ctypes_test - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_ctypes\_ctypes_test.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_elementtree.dsp b/PC/VC6/_elementtree.dsp
deleted file mode 100644
index 8dc0cdd..0000000
--- a/PC/VC6/_elementtree.dsp
+++ /dev/null
@@ -1,111 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_elementtree" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_elementtree - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_elementtree.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_elementtree.mak" CFG="_elementtree - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_elementtree - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_elementtree - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_elementtree"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_elementtree - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_elementtree"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /I "..\..\Modules\expat" /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "XML_NS" /D "XML_DTD" /D "BYTEORDER=1234" /D "XML_CONTEXT_BYTES=1024" /D "USE_PYEXPAT_CAPI" /D "XML_STATIC" /D "HAVE_MEMMOVE" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1d100000" /subsystem:windows /dll /debug /machine:I386 /out:"./_elementtree.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_elementtree - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_elementtree"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /I "..\..\Modules\expat" /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "XML_NS" /D "XML_DTD" /D "BYTEORDER=1234" /D "XML_CONTEXT_BYTES=1024" /D "USE_PYEXPAT_CAPI" /D "XML_STATIC" /D "HAVE_MEMMOVE" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1d100000" /subsystem:windows /dll /debug /machine:I386 /out:"./_elementtree_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_elementtree - Win32 Release"
-# Name "_elementtree - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_elementtree.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\expat\xmlparse.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\expat\xmlrole.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\expat\xmltok.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_msi.dsp b/PC/VC6/_msi.dsp
deleted file mode 100644
index 76a61bc..0000000
--- a/PC/VC6/_msi.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_msi" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_msi - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_msi.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_msi.mak" CFG="_msi - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_msi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_msi - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_msi"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_msi - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_msi"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib fci.lib msi.lib rpcrt4.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib fci.lib msi.lib rpcrt4.lib /nologo /base:"0x1d1a0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_msi.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_msi - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_msi"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib fci.lib msi.lib rpcrt4.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib fci.lib msi.lib rpcrt4.lib /nologo /base:"0x1d1a0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_msi_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_msi - Win32 Release"
-# Name "_msi - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\PC\_msi.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_multiprocessing.dsp b/PC/VC6/_multiprocessing.dsp
deleted file mode 100644
index e1b8470..0000000
--- a/PC/VC6/_multiprocessing.dsp
+++ /dev/null
@@ -1,107 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_multiprocessing" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_multiprocessing - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_multiprocessing.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_multiprocessing.mak" CFG="_multiprocessing - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_multiprocessing - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_multiprocessing - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_multiprocessing"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_multiprocessing - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_multiprocessing"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_multiprocessing.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_multiprocessing - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_multiprocessing"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /base:"0x1e1d0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_multiprocessing_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_multiprocessing - Win32 Release"
-# Name "_multiprocessing - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_multiprocessing\multiprocessing.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_multiprocessing\semaphore.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_multiprocessing\win32_functions.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_socket.dsp b/PC/VC6/_socket.dsp
deleted file mode 100644
index 55ee8f2..0000000
--- a/PC/VC6/_socket.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_socket" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_socket - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_socket.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_socket.mak" CFG="_socket - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_socket - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_socket - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_socket"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_socket - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_socket"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_socket.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_socket - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_socket"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /base:"0x1e1D0000" /subsystem:windows /dll /debug /machine:I386 /out:"./_socket_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_socket - Win32 Release"
-# Name "_socket - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\socketmodule.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_sqlite3.dsp b/PC/VC6/_sqlite3.dsp
deleted file mode 100644
index 3869938..0000000
--- a/PC/VC6/_sqlite3.dsp
+++ /dev/null
@@ -1,131 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_sqlite3" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_sqlite3 - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_sqlite3.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_sqlite3.mak" CFG="_sqlite3 - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_sqlite3 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_sqlite3 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_sqlite3"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_sqlite3 - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_sqlite3"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /I "..\..\..\sqlite-source-3.3.4" /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D MODULE_NAME=\"sqlite3\" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\..\sqlite-source-3.3.4\sqlite3.lib /nologo /base:"0x1e180000" /subsystem:windows /dll /debug /machine:I386 /out:"./_sqlite3.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_sqlite3 - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_sqlite3"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /I "..\..\..\sqlite-source-3.3.4" /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D MODULE_NAME=\"sqlite3\" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\..\sqlite-source-3.3.4\sqlite3.lib /nologo /base:"0x1e180000" /subsystem:windows /dll /debug /machine:I386 /out:"./_sqlite3_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_sqlite3 - Win32 Release"
-# Name "_sqlite3 - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\cache.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\connection.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\cursor.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\microprotocols.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\module.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\prepare_protocol.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\row.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\statement.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sqlite\util.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_ssl.dsp b/PC/VC6/_ssl.dsp
deleted file mode 100644
index e8bb993..0000000
--- a/PC/VC6/_ssl.dsp
+++ /dev/null
@@ -1,89 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_ssl" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) External Target" 0x0106
-
-CFG=_ssl - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_ssl.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_ssl.mak" CFG="_ssl - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_ssl - Win32 Release" (based on "Win32 (x86) External Target")
-!MESSAGE "_ssl - Win32 Debug" (based on "Win32 (x86) External Target")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-
-!IF "$(CFG)" == "_ssl - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Cmd_Line "NMAKE /f _ssl.mak"
-# PROP BASE Rebuild_Opt "/a"
-# PROP BASE Target_File "_ssl.exe"
-# PROP BASE Bsc_Name "_ssl.bsc"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_ssl"
-# PROP Cmd_Line "python build_ssl.py"
-# PROP Rebuild_Opt "-a"
-# PROP Target_File "_ssl.pyd"
-# PROP Bsc_Name ""
-# PROP Target_Dir ""
-
-!ELSEIF "$(CFG)" == "_ssl - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "x86-temp-debug\_ssl"
-# PROP BASE Intermediate_Dir "x86-temp-debug\_ssl"
-# PROP BASE Cmd_Line "NMAKE /f _ssl.mak"
-# PROP BASE Rebuild_Opt "/a"
-# PROP BASE Target_File "_ssl_d.pyd"
-# PROP BASE Bsc_Name "_ssl_d.bsc"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_ssl"
-# PROP Cmd_Line "python_d -u build_ssl.py -d"
-# PROP Rebuild_Opt "-a"
-# PROP Target_File "_ssl_d.pyd"
-# PROP Bsc_Name ""
-# PROP Target_Dir ""
-
-!ENDIF
-
-# Begin Target
-
-# Name "_ssl - Win32 Release"
-# Name "_ssl - Win32 Debug"
-
-!IF "$(CFG)" == "_ssl - Win32 Release"
-
-!ELSEIF "$(CFG)" == "_ssl - Win32 Debug"
-
-!ENDIF
-
-# Begin Source File
-
-SOURCE=..\..\Modules\_ssl.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_ssl.mak b/PC/VC6/_ssl.mak
deleted file mode 100644
index 877a614..0000000
--- a/PC/VC6/_ssl.mak
+++ /dev/null
@@ -1,22 +0,0 @@
-
-!IFDEF DEBUG
-MODULE=_ssl_d.pyd
-TEMP_DIR=x86-temp-debug/_ssl
-CFLAGS=/Od /Zi /MDd /LDd /DDEBUG /D_DEBUG /DWIN32
-LFLAGS=/nodefaultlib:"msvcrt"
-!ELSE
-MODULE=_ssl.pyd
-TEMP_DIR=x86-temp-release/_ssl
-CFLAGS=/Ox /MD /LD /DWIN32
-LFLAGS=
-!ENDIF
-
-INCLUDES=-I ../../Include -I .. -I $(SSL_DIR)/inc32
-SSL_LIB_DIR=$(SSL_DIR)/out32
-LIBS=gdi32.lib wsock32.lib user32.lib advapi32.lib /libpath:$(SSL_LIB_DIR) libeay32.lib ssleay32.lib
-
-SOURCE=../../Modules/_ssl.c $(SSL_LIB_DIR)/libeay32.lib $(SSL_LIB_DIR)/ssleay32.lib
-
-$(MODULE): $(SOURCE) ../*.h ../../Include/*.h
- @if not exist "$(TEMP_DIR)/." mkdir "$(TEMP_DIR)"
- cl /nologo $(SOURCE) $(CFLAGS) /Fo$(TEMP_DIR)\$*.obj $(INCLUDES) /link /out:$(MODULE) $(LIBS) $(LFLAGS)
diff --git a/PC/VC6/_testcapi.dsp b/PC/VC6/_testcapi.dsp
deleted file mode 100644
index 0eaa25a..0000000
--- a/PC/VC6/_testcapi.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_testcapi" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_testcapi - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_testcapi.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_testcapi.mak" CFG="_testcapi - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_testcapi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_testcapi - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_testcapi"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_testcapi - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_testcapi"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "NDEBUG"
-# ADD RSC /l 0xc09 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1e1F0000" /dll /machine:I386 /out:"./_testcapi.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_testcapi - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_testcapi"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "_DEBUG"
-# ADD RSC /l 0xc09 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1e1F0000" /dll /debug /machine:I386 /out:"./_testcapi_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_testcapi - Win32 Release"
-# Name "_testcapi - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_testcapimodule.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/_tkinter.dsp b/PC/VC6/_tkinter.dsp
deleted file mode 100644
index 5d69f59..0000000
--- a/PC/VC6/_tkinter.dsp
+++ /dev/null
@@ -1,103 +0,0 @@
-# Microsoft Developer Studio Project File - Name="_tkinter" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=_tkinter - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "_tkinter.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "_tkinter.mak" CFG="_tkinter - Win32 Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "_tkinter - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "_tkinter - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "_tkinter"
-# PROP Scc_LocalPath "..\..\.."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "_tkinter - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\_tkinter"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\..\tcltk\include" /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "WITH_APPINIT" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 ..\..\..\tcltk\lib\tk85g.lib ..\..\..\tcltk\lib\tcl85g.lib odbc32.lib odbccp32.lib user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /base:"0x1e190000" /subsystem:windows /dll /debug /machine:I386 /out:"./_tkinter_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "_tkinter - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\_tkinter"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\..\tcltk\include" /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "WITH_APPINIT" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 ..\..\..\tcltk\lib\tk85.lib ..\..\..\tcltk\lib\tcl85.lib odbc32.lib odbccp32.lib user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /base:"0x1e190000" /subsystem:windows /dll /debug /machine:I386 /out:"./_tkinter.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "_tkinter - Win32 Release"
-# Name "_tkinter - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_tkinter.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\tkappinit.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/build_ssl.py b/PC/VC6/build_ssl.py
deleted file mode 100644
index 95af084..0000000
--- a/PC/VC6/build_ssl.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# Script for building the _ssl module for Windows.
-# Uses Perl to setup the OpenSSL environment correctly
-# and build OpenSSL, then invokes a simple nmake session
-# for _ssl.pyd itself.
-
-# THEORETICALLY, you can:
-# * Unpack the latest SSL release one level above your main Python source
-# directory. It is likely you will already find the zlib library and
-# any other external packages there.
-# * Install ActivePerl and ensure it is somewhere on your path.
-# * Run this script from the PC/VC6 directory.
-#
-# it should configure and build SSL, then build the ssl Python extension
-# without intervention.
-
-# Modified by Christian Heimes
-# Now this script supports pre-generated makefiles and assembly files.
-# Developers don't need an installation of Perl anymore to build Python. A svn
-# checkout from our svn repository is enough.
-
-import os, sys, re, shutil
-
-# Find all "foo.exe" files on the PATH.
-def find_all_on_path(filename, extras = None):
- entries = os.environ["PATH"].split(os.pathsep)
- ret = []
- for p in entries:
- fname = os.path.abspath(os.path.join(p, filename))
- if os.path.isfile(fname) and fname not in ret:
- ret.append(fname)
- if extras:
- for p in extras:
- fname = os.path.abspath(os.path.join(p, filename))
- if os.path.isfile(fname) and fname not in ret:
- ret.append(fname)
- return ret
-
-# Find a suitable Perl installation for OpenSSL.
-# cygwin perl does *not* work. ActivePerl does.
-# Being a Perl dummy, the simplest way I can check is if the "Win32" package
-# is available.
-def find_working_perl(perls):
- for perl in perls:
- fh = os.popen('"%s" -e "use Win32;"' % perl)
- fh.read()
- rc = fh.close()
- if rc:
- continue
- return perl
- print("Can not find a suitable PERL:")
- if perls:
- print(" the following perl interpreters were found:")
- for p in perls:
- print(" ", p)
- print(" None of these versions appear suitable for building OpenSSL")
- else:
- print(" NO perl interpreters were found on this machine at all!")
- print(" Please install ActivePerl and ensure it appears on your path")
- return None
-
-# Locate the best SSL directory given a few roots to look into.
-def find_best_ssl_dir(sources):
- candidates = []
- for s in sources:
- try:
- # note: do not abspath s; the build will fail if any
- # higher up directory name has spaces in it.
- fnames = os.listdir(s)
- except os.error:
- fnames = []
- for fname in fnames:
- fqn = os.path.join(s, fname)
- if os.path.isdir(fqn) and fname.startswith("openssl-"):
- candidates.append(fqn)
- # Now we have all the candidates, locate the best.
- best_parts = []
- best_name = None
- for c in candidates:
- parts = re.split("[.-]", os.path.basename(c))[1:]
- # eg - openssl-0.9.7-beta1 - ignore all "beta" or any other qualifiers
- if len(parts) >= 4:
- continue
- if parts > best_parts:
- best_parts = parts
- best_name = c
- if best_name is not None:
- print("Found an SSL directory at '%s'" % (best_name,))
- else:
- print("Could not find an SSL directory in '%s'" % (sources,))
- sys.stdout.flush()
- return best_name
-
-def fix_makefile(makefile):
- """Fix some stuff in all makefiles
- """
- if not os.path.isfile(makefile):
- return
- with open(makefile) as fin:
- lines = fin.readlines()
- with open(makefile, 'w') as fout:
- for line in lines:
- if line.startswith("PERL="):
- continue
- if line.startswith("CP="):
- line = "CP=copy\n"
- if line.startswith("MKDIR="):
- line = "MKDIR=mkdir\n"
- if line.startswith("CFLAG="):
- line = line.strip()
- for algo in ("RC5", "MDC2", "IDEA"):
- noalgo = " -DOPENSSL_NO_%s" % algo
- if noalgo not in line:
- line = line + noalgo
- line = line + '\n'
- fout.write(line)
-
-def run_configure(configure, do_script):
- print("perl Configure "+configure)
- os.system("perl Configure "+configure)
- print(do_script)
- os.system(do_script)
-
-def cmp(f1, f2):
- bufsize = 1024 * 8
- with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
- while True:
- b1 = fp1.read(bufsize)
- b2 = fp2.read(bufsize)
- if b1 != b2:
- return False
- if not b1:
- return True
-
-def copy(src, dst):
- if os.path.isfile(dst) and cmp(src, dst):
- return
- shutil.copy(src, dst)
-
-def main():
- debug = "-d" in sys.argv
- build_all = "-a" in sys.argv
- if 1: # Win32
- arch = "x86"
- configure = "VC-WIN32"
- do_script = "ms\\do_nasm"
- makefile="ms\\nt.mak"
- m32 = makefile
- dirsuffix = "32"
- configure += " no-idea no-rc5 no-mdc2"
- make_flags = ""
- if build_all:
- make_flags = "-a"
- # perl should be on the path, but we also look in "\perl" and "c:\\perl"
- # as "well known" locations
- perls = find_all_on_path("perl.exe", ["\\perl\\bin", "C:\\perl\\bin"])
- perl = find_working_perl(perls)
- if perl:
- print("Found a working perl at '%s'" % (perl,))
- else:
- print("No Perl installation was found. Existing Makefiles are used.")
- sys.stdout.flush()
- # Look for SSL 3 levels up from PC/VC6 - ie, same place zlib etc all live.
- ssl_dir = find_best_ssl_dir(("..\\..\\..",))
- if ssl_dir is None:
- sys.exit(1)
-
- old_cd = os.getcwd()
- try:
- os.chdir(ssl_dir)
- # If the ssl makefiles do not exist, we invoke Perl to generate them.
- # Due to a bug in this script, the makefile sometimes ended up empty
- # Force a regeneration if it is.
- if not os.path.isfile(makefile) or os.path.getsize(makefile)==0:
- if perl is None:
- print("Perl is required to build the makefiles!")
- sys.exit(1)
-
- print("Creating the makefiles...")
- sys.stdout.flush()
- # Put our working Perl at the front of our path
- os.environ["PATH"] = os.path.dirname(perl) + \
- os.pathsep + \
- os.environ["PATH"]
- run_configure(configure, do_script)
- if debug:
- print("OpenSSL debug builds aren't supported.")
- #if arch=="x86" and debug:
- # # the do_masm script in openssl doesn't generate a debug
- # # build makefile so we generate it here:
- # os.system("perl util\mk1mf.pl debug "+configure+" >"+makefile)
-
- fix_makefile(makefile)
- copy(r"crypto\buildinf.h", r"crypto\buildinf_%s.h" % arch)
- copy(r"crypto\opensslconf.h", r"crypto\opensslconf_%s.h" % arch)
-
- # If the assembler files don't exist in tmpXX, copy them there
- if perl is None and os.path.exists("asm"+dirsuffix):
- if not os.path.exists("tmp"+dirsuffix):
- os.mkdir("tmp"+dirsuffix)
- for f in os.listdir("asm"+dirsuffix):
- if not f.endswith(".asm"): continue
- if os.path.isfile(r"tmp%s\%s" % (dirsuffix, f)): continue
- shutil.copy(r"asm%s\%s" % (dirsuffix, f), "tmp"+dirsuffix)
-
- # Now run make.
- copy(r"crypto\buildinf_%s.h" % arch, r"crypto\buildinf.h")
- copy(r"crypto\opensslconf_%s.h" % arch, r"crypto\opensslconf.h")
-
- #makeCommand = "nmake /nologo PERL=\"%s\" -f \"%s\"" %(perl, makefile)
- makeCommand = "nmake /nologo -f \"%s\"" % makefile
- print("Executing ssl makefiles:", makeCommand)
- sys.stdout.flush()
- rc = os.system(makeCommand)
- if rc:
- print("Executing "+makefile+" failed")
- print(rc)
- sys.exit(rc)
- finally:
- os.chdir(old_cd)
- # And finally, we can build the _ssl module itself for Python.
- defs = "SSL_DIR=%s" % (ssl_dir,)
- if debug:
- defs = defs + " " + "DEBUG=1"
- rc = os.system('nmake /nologo -f _ssl.mak ' + defs + " " + make_flags)
- sys.exit(rc)
-
-if __name__=='__main__':
- main()
diff --git a/PC/VC6/build_tkinter.py b/PC/VC6/build_tkinter.py
deleted file mode 100644
index e5ca92c..0000000
--- a/PC/VC6/build_tkinter.py
+++ /dev/null
@@ -1,81 +0,0 @@
-import os
-import sys
-import subprocess
-
-TCL_MAJOR = 8
-TCL_MINOR = 5
-TCL_PATCH = 2
-
-TIX_MAJOR = 8
-TIX_MINOR = 4
-TIX_PATCH = 3
-
-def abspath(name):
- par = os.path.pardir
- return os.path.abspath(os.path.join(__file__, par, par, par, par, name))
-
-TCL_DIR = abspath("tcl%d.%d.%d" % (TCL_MAJOR, TCL_MINOR, TCL_PATCH))
-TK_DIR = abspath("tk%d.%d.%d" % (TCL_MAJOR, TCL_MINOR, TCL_PATCH))
-TIX_DIR = abspath("tix%d.%d.%d" % (TIX_MAJOR, TIX_MINOR, TIX_PATCH))
-OUT_DIR = abspath("tcltk")
-
-def have_args(*a):
- return any(s in sys.argv[1:] for s in a)
-
-def enter(dir):
- os.chdir(os.path.join(dir, "win"))
-
-def main():
- debug = have_args("-d", "--debug")
- clean = have_args("clean")
- install = have_args("install")
- tcl = have_args("tcl")
- tk = have_args("tk")
- tix = have_args("tix")
- if not(tcl) and not(tk) and not(tix):
- tcl = tk = tix = True
-
- def nmake(makefile, *a):
- args = ["nmake", "/nologo", "/f", makefile, "DEBUG=%d" % debug]
- args.extend(a)
- subprocess.check_call(args)
-
- if tcl:
- enter(TCL_DIR)
- def nmake_tcl(*a):
- nmake("makefile.vc", *a)
- if clean:
- nmake_tcl("clean")
- elif install:
- nmake_tcl("install", "INSTALLDIR=" + OUT_DIR)
- else:
- nmake_tcl()
-
- if tk:
- enter(TK_DIR)
- def nmake_tk(*a):
- nmake("makefile.vc", "TCLDIR=" + TCL_DIR, *a)
- if clean:
- nmake_tk("clean")
- elif install:
- nmake_tk("install", "INSTALLDIR=" + OUT_DIR)
- else:
- nmake_tk()
-
- if tix:
- enter(TIX_DIR)
- def nmake_tix(*a):
- nmake("python.mak",
- "TCL_MAJOR=%d" % TCL_MAJOR,
- "TCL_MINOR=%d" % TCL_MINOR,
- "TCL_PATCH=%d" % TCL_PATCH,
- "MACHINE=IX86", *a)
- if clean:
- nmake_tix("clean")
- elif install:
- nmake_tix("install", "INSTALL_DIR=" + OUT_DIR)
- else:
- nmake_tix()
-
-if __name__ == '__main__':
- main()
diff --git a/PC/VC6/bz2.dsp b/PC/VC6/bz2.dsp
deleted file mode 100644
index 352cbad..0000000
--- a/PC/VC6/bz2.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="bz2" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=bz2 - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "bz2.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "bz2.mak" CFG="bz2 - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "bz2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "bz2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "bz2"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "bz2 - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\bz2"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /I "..\..\..\bzip2-1.0.6" /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 ..\..\..\bzip2-1.0.6\libbz2.lib /nologo /base:"0x1D170000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./bz2.pyd"
-# SUBTRACT LINK32 /pdb:none /nodefaultlib
-
-!ELSEIF "$(CFG)" == "bz2 - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\bz2"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /I "..\..\..\bzip2-1.0.6" /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 ..\..\..\bzip2-1.0.6\libbz2.lib /nologo /base:"0x1D170000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"msvcrt" /nodefaultlib:"libc" /out:"./bz2_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "bz2 - Win32 Release"
-# Name "bz2 - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\bz2module.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/make_versioninfo.dsp b/PC/VC6/make_versioninfo.dsp
deleted file mode 100644
index a735e12..0000000
--- a/PC/VC6/make_versioninfo.dsp
+++ /dev/null
@@ -1,108 +0,0 @@
-# Microsoft Developer Studio Project File - Name="make_versioninfo" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=make_versioninfo - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "make_versioninfo.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "make_versioninfo.mak" CFG="make_versioninfo - Win32 Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "make_versioninfo - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "make_versioninfo - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "make_versioninfo"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "make_versioninfo - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\make_versioninfo"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /base:"0x1d000000" /subsystem:console /debug /machine:I386
-# SUBTRACT LINK32 /pdb:none
-# Begin Custom Build
-InputPath=.\make_versioninfo.exe
-SOURCE="$(InputPath)"
-
-"..\pythonnt_rc.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- .\make_versioninfo.exe >..\pythonnt_rc.h
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "make_versioninfo - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\make_versioninfo"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /i "..\..\Include" /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /base:"0x1d000000" /subsystem:console /debug /machine:I386 /out:"./make_versioninfo_d.exe" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-# Begin Custom Build
-InputPath=.\make_versioninfo_d.exe
-SOURCE="$(InputPath)"
-
-"..\pythonnt_rc_d.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- .\make_versioninfo_d.exe >..\pythonnt_rc_d.h
-
-# End Custom Build
-
-!ENDIF
-
-# Begin Target
-
-# Name "make_versioninfo - Win32 Release"
-# Name "make_versioninfo - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\make_versioninfo.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/pcbuild.dsw b/PC/VC6/pcbuild.dsw
deleted file mode 100644
index 87b2ebc..0000000
--- a/PC/VC6/pcbuild.dsw
+++ /dev/null
@@ -1,306 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "_ctypes"=".\_ctypes.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "_ctypes_test"=".\_ctypes_test.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "_elementtree"=".\_elementtree.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "_msi"=".\_msi.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "_multiprocessing"=".\_multiprocessing.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "_socket"=".\_socket.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "_sqlite3"=".\_sqlite3.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "_ssl"=".\_ssl.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name python
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name w9xpopen
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "_testcapi"=".\_testcapi.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "_tkinter"=".\_tkinter.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "bz2"=".\bz2.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "make_versioninfo"=".\make_versioninfo.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "pyexpat"=".\pyexpat.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "python"=".\python.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "pythoncore"=".\pythoncore.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name make_versioninfo
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "pythonw"=".\pythonw.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "select"=".\select.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "unicodedata"=".\unicodedata.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "w9xpopen"=".\w9xpopen.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "winsound"=".\winsound.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name pythoncore
- End Project Dependency
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
-
diff --git a/PC/VC6/pyexpat.dsp b/PC/VC6/pyexpat.dsp
deleted file mode 100644
index 561c9ef..0000000
--- a/PC/VC6/pyexpat.dsp
+++ /dev/null
@@ -1,111 +0,0 @@
-# Microsoft Developer Studio Project File - Name="pyexpat" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=pyexpat - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "pyexpat.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "pyexpat.mak" CFG="pyexpat - Win32 Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "pyexpat - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "pyexpat - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "pyexpat"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "pyexpat - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\pyexpat"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /I "..\..\Modules\expat" /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "XML_NS" /D "XML_DTD" /D BYTEORDER=1234 /D XML_CONTEXT_BYTES=1024 /D "XML_STATIC" /D "HAVE_MEMMOVE" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1D100000" /subsystem:windows /dll /debug /machine:I386 /out:"./pyexpat.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "pyexpat - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\pyexpat"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /I "..\..\Modules\expat" /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "HAVE_EXPAT_H" /D "WIN32" /D "_WINDOWS" /D "XML_NS" /D "XML_DTD" /D BYTEORDER=1234 /D XML_CONTEXT_BYTES=1024 /D "XML_STATIC" /D "HAVE_MEMMOVE" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1D100000" /subsystem:windows /dll /debug /machine:I386 /out:"./pyexpat_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "pyexpat - Win32 Release"
-# Name "pyexpat - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\pyexpat.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\expat\xmlparse.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\expat\xmlrole.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\expat\xmltok.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/python.dsp b/PC/VC6/python.dsp
deleted file mode 100644
index fa8b772..0000000
--- a/PC/VC6/python.dsp
+++ /dev/null
@@ -1,100 +0,0 @@
-# Microsoft Developer Studio Project File - Name="python" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=python - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "python.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "python.mak" CFG="python - Win32 Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "python - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "python - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "python"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "python - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\python"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /base:"0x1d000000" /subsystem:console /debug /machine:I386
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "python - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\python"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /i "....\\Include" /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /base:"0x1d000000" /stack:0x200000 /subsystem:console /debug /machine:I386 /out:"./python_d.exe" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "python - Win32 Release"
-# Name "python - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\pycon.ico
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\python.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\python_exe.rc
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/pythoncore.dsp b/PC/VC6/pythoncore.dsp
deleted file mode 100644
index 0ce98d1..0000000
--- a/PC/VC6/pythoncore.dsp
+++ /dev/null
@@ -1,780 +0,0 @@
-# Microsoft Developer Studio Project File - Name="pythoncore" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=pythoncore - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "pythoncore.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "pythoncore.mak" CFG="pythoncore - Win32 Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "pythoncore - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "pythoncore - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "pythoncore"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "pythoncore - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\pythoncore"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /I "..\..\modules\zlib" /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "USE_DL_EXPORT" /YX /FD /Zm200 /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /i "..\..\Include" /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e000000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python33.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "pythoncore - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\pythoncore"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /I "..\..\modules\zlib" /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "USE_DL_EXPORT" /D "WIN32" /D "_WINDOWS" /YX /FD /Zm200 /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /i "..\..\Include" /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e000000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python33_d.dll" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "pythoncore - Win32 Release"
-# Name "pythoncore - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\_bisectmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\_codecs_cn.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\_codecs_hk.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\_codecs_iso2022.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\_codecs_jp.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\_codecs_kr.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\_codecs_tw.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_codecsmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_collectionsmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_csv.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_datetimemodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_functoolsmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_heapqmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\_iomodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_json.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_localemodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_lsprof.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_math.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_pickle.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_randommodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_sre.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_struct.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\PC\_subprocess.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_threadmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_time.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\_warnings.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_weakref.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\abstract.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\accu.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\acceler.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\adler32.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\arraymodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\asdl.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\ast.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\atexitmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\audioop.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\binascii.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\bitset.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\bltinmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\boolobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\bufferedio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\bytearrayobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\bytes_methods.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\bytesio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\bytesobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\capsule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\cellobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\ceval.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\classobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cmathmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\codecs.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\codeobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\compile.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\complexobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\compress.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\config.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\crc32.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\dynamic_annotations.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\deflate.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\descrobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\dictobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\dl_nt.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\dtoa.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\dynload_win.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\enumobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\errnomodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\errors.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\exceptions.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\fileio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\fileobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\fileutils.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\firstsets.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\floatobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\formatter_unicode.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\frameobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\frozen.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\funcobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\future.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\gcmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\genobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\getargs.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\getbuildinfo.c
-# ADD CPP /D BUILD=46
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\getcompiler.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\getcopyright.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\getopt.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\getpathp.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\getplatform.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\getversion.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\graminit.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\grammar.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\grammar1.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\gzio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\import.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\importdl.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\infback.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\inffast.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\inflate.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\inftrees.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\iobase.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\iterobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\itertoolsmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\listnode.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\listobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\longobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\main.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\marshal.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\mathmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\md5module.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\memoryobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\metagrammar.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\methodobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\mmapmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\modsupport.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\moduleobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\msvcrtmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\cjkcodecs\multibytecodec.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\myreadline.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\mysnprintf.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\mystrtoul.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\node.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\object.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\obmalloc.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\operator.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\parser.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\parsermodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\parsetok.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\peephole.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\posixmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pyarena.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pyctype.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pyfpe.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pymath.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pystate.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pystrcmp.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pystrtod.c
-# End Source File
-# Begin Source File
-
-SOURCE="..\..\Python\Python-ast.c"
-# End Source File
-# Begin Source File
-
-SOURCE=..\python_nt.rc
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pythonrun.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\pytime.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\random.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\rangeobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\rotatingtree.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\setobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\sha1module.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\sha256module.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\sha512module.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\signalmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\sliceobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\stringio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\structmember.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\structseq.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\symtable.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\symtablemodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\sysmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\_io\textio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\thread.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\timemodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Parser\tokenizer.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Python\traceback.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\trees.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\tupleobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\typeobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\uncompr.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\unicodectype.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\unicodeobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Objects\weakrefobject.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\winreg.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\xxsubtype.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zipimport.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlibmodule.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\Modules\zlib\zutil.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/pythonw.dsp b/PC/VC6/pythonw.dsp
deleted file mode 100644
index e9c325c..0000000
--- a/PC/VC6/pythonw.dsp
+++ /dev/null
@@ -1,101 +0,0 @@
-# Microsoft Developer Studio Project File - Name="pythonw" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Application" 0x0101
-
-CFG=pythonw - Win32 Alpha Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "pythonw.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "pythonw.mak" CFG="pythonw - Win32 Alpha Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "pythonw - Win32 Release" (based on "Win32 (x86) Application")
-!MESSAGE "pythonw - Win32 Debug" (based on "Win32 (x86) Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "pythonw"
-# PROP Scc_LocalPath "..\pc"
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "pythonw - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\pythonw"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1d000000" /subsystem:windows /debug /machine:I386
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "pythonw - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\pythonw"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1d000000" /subsystem:windows /debug /machine:I386 /out:"./pythonw_d.exe" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "pythonw - Win32 Release"
-# Name "pythonw - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\python_exe.rc
-# End Source File
-# Begin Source File
-
-SOURCE=..\WinMain.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/readme.txt b/PC/VC6/readme.txt
deleted file mode 100644
index f978f85..0000000
--- a/PC/VC6/readme.txt
+++ /dev/null
@@ -1,192 +0,0 @@
-Building Python using VC++ 6.0 or 5.0
--------------------------------------
-This directory is used to build Python for Win32 platforms, e.g. Windows
-2000 and XP. It requires Microsoft Visual C++ 6.x or 5.x and Platform
-SDK February 2003 Edition (Core SDK).
-(For other Windows platforms and compilers, see ../readme.txt.)
-
-All you need to do is open the workspace "pcbuild.dsw" in MSVC++, select
-the Debug or Release setting (using Build -> Set Active Configuration...),
-and build the projects.
-
-The proper order to build subprojects:
-
-1) pythoncore (this builds the main Python DLL and library files,
- python33.{dll, lib} in Release mode)
-
-2) python (this builds the main Python executable,
- python.exe in Release mode)
-
-3) the other subprojects, as desired or needed (note: you probably don't
- want to build most of the other subprojects, unless you're building an
- entire Python distribution from scratch, or specifically making changes
- to the subsystems they implement; see SUBPROJECTS below)
-
-When using the Debug setting, the output files have a _d added to
-their name: python33_d.dll, python_d.exe, pyexpat_d.pyd, and so on.
-
-SUBPROJECTS
------------
-These subprojects should build out of the box. Subprojects other than the
-main ones (pythoncore, python, pythonw) generally build a DLL (renamed to
-.pyd) from a specific module so that users don't have to load the code
-supporting that module unless they import the module.
-
-pythoncore
- .dll and .lib
-python
- .exe
-pythonw
- pythonw.exe, a variant of python.exe that doesn't pop up a DOS box
-_msi
- _msi.c. You need to install Windows Installer SDK to build this module.
-_socket
- socketmodule.c
-_testcapi
- tests of the Python C API, run via Lib/test/test_capi.py, and
- implemented by module Modules/_testcapimodule.c
-pyexpat
- Python wrapper for accelerated XML parsing, which incorporates stable
- code from the Expat project: http://sourceforge.net/projects/expat/
-select
- selectmodule.c
-unicodedata
- large tables of Unicode data
-winsound
- play sounds (typically .wav files) under Windows
-
-The following subprojects will generally NOT build out of the box. They
-wrap code Python doesn't control, and you'll need to download the base
-packages first and unpack them into siblings of PCbuilds's parent
-directory; for example, if your PCbuild is .......\dist\src\PCbuild\,
-unpack into new subdirectories of dist\.
-
-_tkinter
- Python wrapper for the Tk windowing system. Requires building
- Tcl/Tk first. Following are instructions for Tcl/Tk 8.5.2.
-
- Get source
- ----------
- In the dist directory, run
- svn export http://svn.python.org/projects/external/tcl-8.5.2.1 tcl8.5.2
- svn export http://svn.python.org/projects/external/tk-8.5.2.0 tk8.5.2
- svn export http://svn.python.org/projects/external/tix-8.4.3.1 tix8.4.3
-
- Debug Build
- -----------
- To build debug version, add DEBUG=1 to all nmake call bellow.
-
- Build Tcl first (done here w/ MSVC 6 on Win2K)
- ---------------
- If your environment doesn't have struct _stat64, you need to apply
- tcl852.patch in this directory to dist\tcl8.5.2\generic\tcl.h.
-
- cd dist\tcl8.5.2\win
- run vcvars32.bat
- nmake -f makefile.vc
- nmake -f makefile.vc INSTALLDIR=..\..\tcltk install
-
- XXX Should we compile with OPTS=threads?
-
- Optional: run tests, via
- nmake -f makefile.vc test
-
- all.tcl: Total 24242 Passed 23358 Skipped 877 Failed 7
- Sourced 137 Test Files.
- Files with failing tests: exec.test http.test io.test main.test string.test stri
- ngObj.test
-
- Build Tk
- --------
- cd dist\tk8.5.2\win
- nmake -f makefile.vc TCLDIR=..\..\tcl8.5.2
- nmake -f makefile.vc TCLDIR=..\..\tcl8.5.2 INSTALLDIR=..\..\tcltk install
-
- XXX Should we compile with OPTS=threads?
-
- XXX I have no idea whether "nmake -f makefile.vc test" passed or
- XXX failed. It popped up tons of little windows, and did lots of
- XXX stuff, and nothing blew up.
-
- Build Tix
- ---------
- cd dist\tix8.4.3\win
- nmake -f python.mak TCL_MAJOR=8 TCL_MINOR=5 TCL_PATCH=2 MACHINE=IX86 DEBUG=0
- nmake -f python.mak TCL_MAJOR=8 TCL_MINOR=5 TCL_PATCH=2 MACHINE=IX86 DEBUG=0 INSTALL_DIR=..\..\tcltk install
-
-bz2
- Python wrapper for the libbz2 compression library. Homepage
- http://www.bzip.org/
- Download the source from the python.org copy into the dist
- directory:
-
- svn export http://svn.python.org/projects/external/bzip2-1.0.6
-
- And requires building bz2 first.
-
- cd dist\bzip2-1.0.6
- nmake -f makefile.msc
-
- All of this managed to build bzip2-1.0.6\libbz2.lib, which the Python
- project links in.
-
-
-_sqlite3
- Python wrapper for SQLite library.
-
- Get the source code through
-
- svn export http://svn.python.org/projects/external/sqlite-source-3.3.4
-
- To use the extension module in a Python build tree, copy sqlite3.dll into
- the PC/VC6 folder.
-
-
-_ssl
- Python wrapper for the secure sockets library.
-
- Get the latest source code for OpenSSL from
- http://www.openssl.org
-
- You (probably) don't want the "engine" code. For example, don't get
- openssl-engine-0.9.6g.tar.gz
-
- Unpack into the "dist" directory, retaining the folder name from
- the archive - for example, the latest stable OpenSSL will install as
- dist/openssl-1.0.1e
-
- You need to use version 1.0.1e of OpenSSL.
-
- You can install the NASM assembler from
- http://www.nasm.us/
- for x86 builds. Put nasmw.exe anywhere in your PATH.
- Note: recent releases of nasm only have nasm.exe. Just rename it to
- nasmw.exe.
-
- You can also install ActivePerl from
- http://www.activestate.com/activeperl/
- if you like to use the official sources instead of the files from
- python's subversion repository. The svn version contains pre-build
- makefiles and assembly files.
-
- The MSVC project simply invokes PC/VC6/build_ssl.py to perform
- the build. This Python script locates and builds your OpenSSL
- installation, then invokes a simple makefile to build the final .pyd.
-
- build_ssl.py attempts to catch the most common errors (such as not
- being able to find OpenSSL sources, or not being able to find a Perl
- that works with OpenSSL) and give a reasonable error message.
- If you have a problem that doesn't seem to be handled correctly
- (eg, you know you have ActivePerl but we can't find it), please take
- a peek at build_ssl.py and suggest patches. Note that build_ssl.py
- should be able to be run directly from the command-line.
-
- build_ssl.py/MSVC isn't clever enough to clean OpenSSL - you must do
- this by hand.
-
-
-YOUR OWN EXTENSION DLLs
------------------------
-If you want to create your own extension module DLL, there's an example
-with easy-to-follow instructions in ../PC/example/; read the file
-readme.txt there first.
diff --git a/PC/VC6/rmpyc.py b/PC/VC6/rmpyc.py
deleted file mode 100644
index b8d6823..0000000
--- a/PC/VC6/rmpyc.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Remove all the .pyc and .pyo files under ../Lib.
-
-
-def deltree(root):
- import os
- from os.path import join
-
- npyc = npyo = 0
- for root, dirs, files in os.walk(root):
- for name in files:
- delete = False
- if name.endswith('.pyc'):
- delete = True
- npyc += 1
- elif name.endswith('.pyo'):
- delete = True
- npyo += 1
-
- if delete:
- os.remove(join(root, name))
-
- return npyc, npyo
-
-npyc, npyo = deltree("../../Lib")
-print npyc, ".pyc deleted,", npyo, ".pyo deleted"
diff --git a/PC/VC6/rt.bat b/PC/VC6/rt.bat
deleted file mode 100755
index a9eadd7..0000000
--- a/PC/VC6/rt.bat
+++ /dev/null
@@ -1,41 +0,0 @@
-@rem Run Tests. Run the regression test suite.
-@rem Usage: rt [-d] [-O] [-q] regrtest_args
-@rem -d Run Debug build (python_d.exe). Else release build.
-@rem -O Run python.exe or python_d.exe (see -d) with -O.
-@rem -q "quick" -- normally the tests are run twice, the first time
-@rem after deleting all the .py[co] files reachable from Lib/.
-@rem -q runs the tests just once, and without deleting .py[co] files.
-@rem All leading instances of these switches are shifted off, and
-@rem whatever remains is passed to regrtest.py. For example,
-@rem rt -O -d -x test_thread
-@rem runs
-@rem python_d -O ../../lib/test/regrtest.py -x test_thread
-@rem twice, and
-@rem rt -q -g test_binascii
-@rem runs
-@rem python_d ../../lib/test/regrtest.py -g test_binascii
-@rem to generate the expected-output file for binascii quickly.
-@set _exe=python
-@set _qmode=no
-@set _dashO=
-@goto CheckOpts
-:Again
-@shift
-:CheckOpts
-@if "%1"=="-O" set _dashO=-O
-@if "%1"=="-O" goto Again
-@if "%1"=="-q" set _qmode=yes
-@if "%1"=="-q" goto Again
-@if "%1"=="-d" set _exe=python_d
-@if "%1"=="-d" goto Again
-@if "%_qmode%"=="yes" goto Qmode
-@echo Deleting .pyc/.pyo files ...
-@%_exe% rmpyc.py
-%_exe% %_dashO% -E ../../lib/test/regrtest.py %1 %2 %3 %4 %5 %6 %7 %8 %9
-@echo About to run again without deleting .pyc/.pyo first:
-@pause
-:Qmode
-%_exe% %_dashO% -E ../../lib/test/regrtest.py %1 %2 %3 %4 %5 %6 %7 %8 %9
-@set _exe=
-@set _qmode=
-@set _dashO=
diff --git a/PC/VC6/select.dsp b/PC/VC6/select.dsp
deleted file mode 100644
index d0e528c..0000000
--- a/PC/VC6/select.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="select" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=select - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "select.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "select.mak" CFG="select - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "select - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "select - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "select"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "select - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\select"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /base:"0x1D110000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./select.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "select - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\select"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /base:"0x1D110000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"msvcrt" /out:"./select_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "select - Win32 Release"
-# Name "select - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\selectmodule.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/tcl852.patch b/PC/VC6/tcl852.patch
deleted file mode 100644
index ed6780a..0000000
--- a/PC/VC6/tcl852.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- tcl8.5.2\generic\tcl.h Fri Jun 13 03:35:39 2008
-+++ tcl8.5.2\generic\tcl.h Sun Jan 4 16:52:30 2009
-@@ -367,7 +367,7 @@
- typedef struct stati64 Tcl_StatBuf;
- # define TCL_LL_MODIFIER "L"
- # else /* __BORLANDC__ */
--# if _MSC_VER < 1400 && !defined(_M_IX86)
-+# if _MSC_VER < 1400 /*&& !defined(_M_IX86)*/
- typedef struct _stati64 Tcl_StatBuf;
- # else
- typedef struct _stat64 Tcl_StatBuf;
diff --git a/PC/VC6/unicodedata.dsp b/PC/VC6/unicodedata.dsp
deleted file mode 100644
index a04db67..0000000
--- a/PC/VC6/unicodedata.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="unicodedata" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=unicodedata - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "unicodedata.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "unicodedata.mak" CFG="unicodedata - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "unicodedata - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "unicodedata - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "unicodedata"
-# PROP Scc_LocalPath ".."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "unicodedata - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\unicodedata"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "NDEBUG"
-# ADD RSC /l 0xc09 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1D120000" /dll /machine:I386 /out:"./unicodedata.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "unicodedata - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\unicodedata"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "_DEBUG"
-# ADD RSC /l 0xc09 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1D120000" /dll /debug /machine:I386 /out:"./unicodedata_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "unicodedata - Win32 Release"
-# Name "unicodedata - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\..\Modules\unicodedata.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/w9xpopen.dsp b/PC/VC6/w9xpopen.dsp
deleted file mode 100644
index 6a6403c..0000000
--- a/PC/VC6/w9xpopen.dsp
+++ /dev/null
@@ -1,97 +0,0 @@
-# Microsoft Developer Studio Project File - Name="w9xpopen" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Application" 0x0101
-
-CFG=w9xpopen - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "w9xpopen.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "w9xpopen.mak" CFG="w9xpopen - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "w9xpopen - Win32 Release" (based on "Win32 (x86) Application")
-!MESSAGE "w9xpopen - Win32 Debug" (based on "Win32 (x86) Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "w9xpopen - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\w9xpopen"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "NDEBUG"
-# ADD RSC /l 0xc09 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
-# ADD LINK32 user32.lib /nologo /machine:I386
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "w9xpopen - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\w9xpopen"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "_DEBUG"
-# ADD RSC /l 0xc09 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib /nologo /debug /machine:I386 /out:"./w9xpopen_d.exe" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "w9xpopen - Win32 Release"
-# Name "w9xpopen - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\w9xpopen.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VC6/winsound.dsp b/PC/VC6/winsound.dsp
deleted file mode 100644
index 6e09b9b..0000000
--- a/PC/VC6/winsound.dsp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Microsoft Developer Studio Project File - Name="winsound" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=winsound - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "winsound.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "winsound.mak" CFG="winsound - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "winsound - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "winsound - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "winsound"
-# PROP Scc_LocalPath "..\pc"
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "winsound - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-release\winsound"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINSOUND_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINSOUND_EXPORTS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "NDEBUG"
-# ADD RSC /l 0xc09 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 kernel32.lib winmm.lib user32.lib /nologo /base:"0x1D160000" /dll /machine:I386 /out:"./winsound.pyd"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF "$(CFG)" == "winsound - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "."
-# PROP Intermediate_Dir "x86-temp-debug\winsound"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-F90=df.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINSOUND_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\Include" /I ".." /D "Py_BUILD_CORE_MODULE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WINSOUND_EXPORTS" /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0xc09 /d "_DEBUG"
-# ADD RSC /l 0xc09 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 user32.lib kernel32.lib winmm.lib /nologo /base:"0x1D160000" /dll /debug /machine:I386 /out:"./winsound_d.pyd" /pdbtype:sept
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF
-
-# Begin Target
-
-# Name "winsound - Win32 Release"
-# Name "winsound - Win32 Debug"
-# Begin Source File
-
-SOURCE=..\winsound.c
-# End Source File
-# End Target
-# End Project
diff --git a/PC/VS7.1/Uninstal.wse b/PC/VS7.1/Uninstal.wse
deleted file mode 100644
index 216dd30..0000000
--- a/PC/VS7.1/Uninstal.wse
+++ /dev/null
@@ -1,514 +0,0 @@
-Document Type: WSE
-item: Global
- Version=8.14
- Flags=00000100
- Split=1420
- Languages=65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- Copy Default=1
- Japanese Font Name=MS Gothic
- Japanese Font Size=10
- Start Gradient=0 0 255
- End Gradient=0 0 0
- Windows Flags=00000000000000000000101000001000
- Message Font=MS Sans Serif
- Font Size=8
- Disk Label=GLBS
- Disk Filename=INSTALL
- Patch Flags=0000000000000001
- Patch Threshold=200
- Patch Memory=4096
- Per-User Version ID=1
- Crystal Format=10111100101100000010001001001001
- Step View=&Properties
-end
-item: Remark
- Text=Note from Tim: This is a verbatim copy of Wise's Uninstal.wse, altered at the end to write
-end
-item: Remark
- Text=uninstall info under HKCU instead of HKLM if our DOADMIN var is false.
-end
-item: Remark
-end
-item: Remark
- Text= Install Support for uninstalling the application.
-end
-item: Remark
-end
-item: Set Variable
- Variable=UNINSTALL_PATH
- Value=%_LOGFILE_PATH_%
- Flags=00000010
-end
-item: Set Variable
- Variable=UNINSTALL_PATH
- Value=%UNINSTALL_PATH%\UNWISE.EXE
-end
-item: Compiler Variable If
- Variable=_EXE_OS_TYPE_
- Value=WIN32
-end
-item: Install File
- Source=%_WISE_%\UNWISE32.EXE
- Destination=%UNINSTALL_PATH%
- Flags=0000000000000010
-end
-item: Compiler Variable Else
-end
-item: Install File
- Source=%_WISE_%\UNWISE.EXE
- Destination=%UNINSTALL_PATH%
- Flags=0000000000000010
-end
-item: Compiler Variable End
-end
-item: Remark
-end
-item: Remark
- Text= Install Support for multiple languages
-end
-item: Remark
-end
-item: Set Variable
- Variable=UNINSTALL_LANG
- Value=%UNINSTALL_PATH%
- Flags=00000010
-end
-item: Set Variable
- Variable=UNINSTALL_LANG
- Value=%UNINSTALL_LANG%\UNWISE.INI
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=C
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.FRA
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_C_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.FRA
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=D
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.FRA
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_D_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.FRA
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=E
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.DEU
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_E_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.DEU
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=F
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.PTG
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_F_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.PTG
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=G
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.ESP
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_G_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.ESP
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=H
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.ESP
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_H_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.ESP
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=I
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.ITA
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_I_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.ITA
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=J
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.DAN
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_J_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.DAN
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=K
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.FIN
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_K_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.FIN
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=L
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.ISL
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_L_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.ISL
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=M
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.NLD
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_M_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.NLD
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=N
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.NOR
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_N_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.NOR
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=O
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.SVE
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_O_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.SVE
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Compiler Variable If
- Variable=_LANG_LIST_
- Value=P
- Flags=00000010
-end
-item: Compiler Variable If
- Value=%_WISE_%\LANGUAGE\UNWISE.JPN
- Flags=00000011
-end
-item: If/While Statement
- Variable=LANG
- Value=%_LANG_P_NAME_%
-end
-item: Install File
- Source=%_WISE_%\LANGUAGE\UNWISE.JPN
- Destination=%UNINSTALL_LANG%
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Compiler Variable End
-end
-item: Compiler Variable End
-end
-item: Remark
-end
-item: Remark
- Text= Install the add/remove or uninstall icon
-end
-item: Remark
-end
-item: Set Variable
- Variable=UNINSTALL_PATH
- Value=%UNINSTALL_PATH%
- Flags=00010100
-end
-item: Set Variable
- Variable=INST_LOG_PATH
- Value=%_LOGFILE_PATH_%
- Flags=00010100
-end
-item: Check Configuration
- Flags=10111011
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=1
-end
-item: Remark
- Text=Write uninstall info under HKLM. This if/else/end block added by Tim.
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%APPTITLE%
- Value Name=DisplayName
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%UNINSTALL_PATH% %INST_LOG_PATH%
- New Value=
- Value Name=UninstallString
- Root=2
-end
-item: Else Statement
-end
-item: Remark
- Text=The same, but write under HKCU instead.
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%APPTITLE%
- Value Name=DisplayName
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%UNINSTALL_PATH% %INST_LOG_PATH%
- New Value=
- Value Name=UninstallString
- Root=1
-end
-item: End Block
-end
-item: Else Statement
-end
-item: Add ProgMan Icon
- Group=%GROUP%
- Icon Name=Uninstall %APPTITLE%
- Command Line=%UNINSTALL_PATH% %INST_LOG_PATH%
-end
-item: End Block
-end
-item: Check Configuration
- Flags=11110010
-end
-item: If/While Statement
- Variable=DOBRAND
- Value=1
-end
-item: Edit Registry
- Total Keys=2
- item: Key
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%COMPANY%
- Value Name=RegCompany
- Root=2
- end
- item: Key
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%NAME%
- Value Name=RegOwner
- Root=2
- end
-end
-item: End Block
-end
-item: End Block
-end
diff --git a/PC/VS7.1/_ctypes.vcproj b/PC/VS7.1/_ctypes.vcproj
deleted file mode 100644
index c359d88..0000000
--- a/PC/VS7.1/_ctypes.vcproj
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_ctypes"
- ProjectGUID="{F22F40F4-D318-40DC-96B3-88DC81CE0894}"
- RootNamespace="_ctypes"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_ctypes"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\_ctypes\libffi_msvc"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS"
- MinimalRebuild="FALSE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="FALSE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions="/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE"
- OutputFile="./_ctypes_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_ctypes_d.pdb"
- SubSystem="0"
- BaseAddress="0x1D1A0000"
- ImportLibrary=".\./_ctypes_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_ctypes"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\_ctypes\libffi_msvc"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="FALSE"
- DebugInformationFormat="0"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions="/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE"
- OutputFile="./_ctypes.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="FALSE"
- ProgramDatabaseFile=".\./_ctypes.pdb"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- BaseAddress="0x1D1A0000"
- ImportLibrary=".\./_ctypes.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_ctypes"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\_ctypes\libffi_msvc"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK /EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE"
- OutputFile="./_ctypes.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="FALSE"
- ProgramDatabaseFile=".\./_ctypes.pdb"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- BaseAddress="0x1D1A0000"
- ImportLibrary=".\./_ctypes.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="."
- IntermediateDirectory="ia64-temp-release\_ctypes"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\_ctypes\libffi_msvc"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK /EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE"
- OutputFile="./_ctypes.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="FALSE"
- ProgramDatabaseFile=".\./_ctypes.pdb"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- BaseAddress="0x1D1A0000"
- ImportLibrary=".\./_ctypes.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_ctypes\_ctypes.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\callbacks.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\callproc.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\cfield.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\libffi_msvc\ffi.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\malloc_closure.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\libffi_msvc\prep_cif.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\stgdict.c">
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\libffi_msvc\win32.c">
- <FileConfiguration
- Name="ReleaseAMD64|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCLCompilerTool"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\Modules\_ctypes\libffi_msvc\win64.asm">
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCustomBuildTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCustomBuildTool"/>
- </FileConfiguration>
- <FileConfiguration
- Name="ReleaseAMD64|Win32">
- <Tool
- Name="VCCustomBuildTool"
- CommandLine="amd64_ml64 /nologo /c /Fo &quot;$(IntDir)\win64.obj&quot; &quot;$(InputPath)&quot;
-"
- Outputs="&quot;$(IntDir)\win64.obj&quot;"/>
- </FileConfiguration>
- <FileConfiguration
- Name="ReleaseItanium|Win32"
- ExcludedFromBuild="TRUE">
- <Tool
- Name="VCCustomBuildTool"/>
- </FileConfiguration>
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_ctypes_test.vcproj b/PC/VS7.1/_ctypes_test.vcproj
deleted file mode 100644
index e8e8a2c..0000000
--- a/PC/VS7.1/_ctypes_test.vcproj
+++ /dev/null
@@ -1,242 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_ctypes_test"
- ProjectGUID="{8CF334D9-4F82-42EB-97AF-83592C5AFD2F}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_ctypes_test"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS"
- MinimalRebuild="FALSE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./_ctypes_test_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_ctypes_test_d.pdb"
- SubSystem="0"
- ImportLibrary=".\./_ctypes_test_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_ctypes_test"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./_ctypes_test.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="FALSE"
- ProgramDatabaseFile=".\./_ctypes_test.pdb"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- ImportLibrary=".\./_ctypes_test.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="."
- IntermediateDirectory="ia64-temp-release\_ctypes_test"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS"
- MinimalRebuild="FALSE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="3"
- BufferSecurityCheck="FALSE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- OutputFile="./_ctypes_test_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_ctypes_test_d.pdb"
- SubSystem="0"
- ImportLibrary=".\./_ctypes_test_d.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_ctypes_test"
- ConfigurationType="2"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- OutputFile="./_ctypes_test.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="FALSE"
- ProgramDatabaseFile=".\./_ctypes_test.pdb"
- SubSystem="0"
- OptimizeReferences="0"
- EnableCOMDATFolding="0"
- ImportLibrary=".\./_ctypes_test.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_ctypes\_ctypes_test.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_elementtree.vcproj b/PC/VS7.1/_elementtree.vcproj
deleted file mode 100644
index ba2b9d9..0000000
--- a/PC/VS7.1/_elementtree.vcproj
+++ /dev/null
@@ -1,264 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_elementtree"
- ProjectGUID="{1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}"
- SccProjectName="_elementtree"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_elementtree"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;HAVE_EXPAT_H;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./_elementtree_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_elementtree_d.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./_elementtree_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_elementtree"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./_elementtree.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_elementtree.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./_elementtree.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\_elementtree"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./_elementtree.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_elementtree.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./_elementtree.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_elementtree"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./_elementtree.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_elementtree.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./_elementtree.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_elementtree.c">
- </File>
- <File
- RelativePath="..\..\Modules\expat\xmlparse.c">
- </File>
- <File
- RelativePath="..\..\Modules\expat\xmlrole.c">
- </File>
- <File
- RelativePath="..\..\Modules\expat\xmltok.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_msi.vcproj b/PC/VS7.1/_msi.vcproj
deleted file mode 100644
index d4fd447..0000000
--- a/PC/VS7.1/_msi.vcproj
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_msi"
- ProjectGUID="{2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}"
- SccProjectName="_msi"
- SccLocalPath="..\..\pc">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_msi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS;_USRDLL"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="fci.lib msi.lib rpcrt4.lib"
- OutputFile="./_msi_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_msi_d.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./_msi_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_msi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="fci.lib msi.lib rpcrt4.lib"
- OutputFile="./_msi.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./_msi.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./_msi.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\ia64-temp-release\_msi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="fci.lib msi.lib rpcrt4.lib bufferoverflowU.lib"
- OutputFile="./_msi.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./_msi.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./_msi.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_msi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="fci.lib msi.lib rpcrt4.lib bufferoverflowU.lib"
- OutputFile="./_msi.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./_msi.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./_msi.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\PC\_msi.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_socket.vcproj b/PC/VS7.1/_socket.vcproj
deleted file mode 100644
index ffed8e4..0000000
--- a/PC/VS7.1/_socket.vcproj
+++ /dev/null
@@ -1,254 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_socket"
- SccProjectName="_socket"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_socket"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;WIN32;_WINDOWS"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./_socket_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_socket_d.pdb"
- SubSystem="2"
- BaseAddress="0x1e1D0000"
- ImportLibrary=".\./_socket_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_socket"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./_socket.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_socket.pdb"
- SubSystem="2"
- BaseAddress="0x1e1D0000"
- ImportLibrary=".\./_socket.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\_socket"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./_socket.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_socket.pdb"
- SubSystem="2"
- BaseAddress="0x1e1D0000"
- ImportLibrary=".\./_socket.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_socket"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./_socket.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_socket.pdb"
- SubSystem="2"
- BaseAddress="0x1e1D0000"
- ImportLibrary=".\./_socket.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\socketmodule.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_sqlite3.vcproj b/PC/VS7.1/_sqlite3.vcproj
deleted file mode 100644
index 9f7d991..0000000
--- a/PC/VS7.1/_sqlite3.vcproj
+++ /dev/null
@@ -1,283 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_sqlite3"
- ProjectGUID="{2FF0A312-22F9-4C34-B070-842916DE27A9}"
- SccProjectName="_sqlite3"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_sqlite3"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include;..\..\PC;..\..\..\sqlite-source-3.3.4"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;WIN32;_WINDOWS;MODULE_NAME=\&quot;sqlite3\&quot;"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="..\..\..\sqlite-source-3.3.4\sqlite3.lib"
- OutputFile="./_sqlite3_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_sqlite3_d.pdb"
- SubSystem="2"
- BaseAddress="0x1e180000"
- ImportLibrary=".\./_sqlite3_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_sqlite3"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include;..\..\PC;..\..\..\sqlite-source-3.3.4"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;MODULE_NAME=\&quot;sqlite3\&quot;"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="..\..\..\sqlite-source-3.3.4\sqlite3.lib"
- OutputFile="./_sqlite3.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_sqlite3.pdb"
- SubSystem="2"
- BaseAddress="0x1e180000"
- ImportLibrary=".\./_sqlite3.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\_sqlite3"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include;..\..\PC;..\..\..\sqlite-source-3.3.4"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;MODULE_NAME=\&quot;sqlite3\&quot;"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="..\..\..\sqlite-source-3.3.4\ia64\sqlite3.lib"
- OutputFile="./_sqlite3.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_sqlite3.pdb"
- SubSystem="2"
- BaseAddress="0x1e180000"
- ImportLibrary=".\./_sqlite3.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_sqlite3"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include;..\..\PC;..\..\..\sqlite-source-3.3.4"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;MODULE_NAME=\&quot;sqlite3\&quot;"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="..\..\..\sqlite-source-3.3.4\amd64\sqlite3.lib"
- OutputFile="./_sqlite3.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_sqlite3.pdb"
- SubSystem="2"
- BaseAddress="0x1e180000"
- ImportLibrary=".\./_sqlite3.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_sqlite\cache.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\connection.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\cursor.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\microprotocols.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\module.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\prepare_protocol.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\row.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\statement.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sqlite\util.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_ssl.mak b/PC/VS7.1/_ssl.mak
deleted file mode 100644
index 8476a63..0000000
--- a/PC/VS7.1/_ssl.mak
+++ /dev/null
@@ -1,38 +0,0 @@
-EXTRA_LIBS=
-
-!IFDEF DEBUG
-SUFFIX=_d.pyd
-TEMP=x86-temp-debug/
-CFLAGS=/Od /Zi /MDd /LDd /DDEBUG /D_DEBUG /DWIN32
-SSL_LIB_DIR=$(SSL_DIR)/out32.dbg
-!ELSE
-SUFFIX=.pyd
-TEMP=x86-temp-release/
-CFLAGS=/Ox /MD /LD /DWIN32
-SSL_LIB_DIR=$(SSL_DIR)/out32
-!ENDIF
-
-INCLUDES=-I ../../Include -I ../../PC -I $(SSL_DIR)/inc32
-
-SSL_LIBS=gdi32.lib wsock32.lib user32.lib advapi32.lib /LIBPATH:$(SSL_LIB_DIR) libeay32.lib ssleay32.lib
-SSL_SOURCE=../../Modules/_ssl.c
-
-HASH_LIBS=gdi32.lib user32.lib advapi32.lib /libpath:$(SSL_LIB_DIR) libeay32.lib
-HASH_SOURCE=../../Modules/_hashopenssl.c
-
-all: _ssl$(SUFFIX) _hashlib$(SUFFIX)
-
-# Split compile/link into two steps to better support VSExtComp
-_ssl$(SUFFIX): $(SSL_SOURCE) $(SSL_LIB_DIR)/libeay32.lib $(SSL_LIB_DIR)/ssleay32.lib ../../PC/*.h ../../Include/*.h
- @if not exist "$(TEMP)/_ssl/." mkdir "$(TEMP)/_ssl"
- cl /nologo /c $(SSL_SOURCE) $(CFLAGS) /Fo$(TEMP)\_ssl\$*.obj $(INCLUDES)
- link /nologo @<<
- /dll /out:_ssl$(SUFFIX) $(TEMP)\_ssl\$*.obj $(SSL_LIBS) $(EXTRA_LIBS)
-<<
-
-_hashlib$(SUFFIX): $(HASH_SOURCE) $(SSL_LIB_DIR)/libeay32.lib ../../PC/*.h ../../Include/*.h
- @if not exist "$(TEMP)/_hashlib/." mkdir "$(TEMP)/_hashlib"
- cl /nologo /c $(HASH_SOURCE) $(CFLAGS) $(EXTRA_CFLAGS) /Fo$(TEMP)\_hashlib\$*.obj $(INCLUDES)
- link /nologo @<<
- /dll /out:_hashlib$(SUFFIX) $(HASH_LIBS) $(EXTRA_LIBS) $(TEMP)\_hashlib\$*.obj
-<<
diff --git a/PC/VS7.1/_ssl.vcproj b/PC/VS7.1/_ssl.vcproj
deleted file mode 100644
index 56d65fe..0000000
--- a/PC/VS7.1/_ssl.vcproj
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_ssl"
- RootNamespace="_ssl"
- SccProjectName=""
- SccLocalPath=""
- Keyword="MakeFileProj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_ssl"
- ConfigurationType="0"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCNMakeTool"
- BuildCommandLine="build_ssl.bat $(ConfigurationName)"
- ReBuildCommandLine="build_ssl.bat $(ConfigurationName) -a"
- CleanCommandLine="echo Nothing to do"
- Output="_ssl.pyd"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_ssl"
- ConfigurationType="0"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCNMakeTool"
- BuildCommandLine="build_ssl.bat $(ConfigurationName)"
- ReBuildCommandLine="build_ssl.bat $(ConfigurationName) -a"
- CleanCommandLine="echo Nothing to do"
- Output="_ssl_d.pyd"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\_ssl"
- ConfigurationType="0"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCNMakeTool"
- BuildCommandLine="build_ssl.bat $(ConfigurationName)"
- ReBuildCommandLine="build_ssl.bat $(ConfigurationName) -a"
- CleanCommandLine="echo Nothing to do"
- Output="_ssl.pyd"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_ssl"
- ConfigurationType="0"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCNMakeTool"
- BuildCommandLine="build_ssl.bat $(ConfigurationName)"
- ReBuildCommandLine="build_ssl.bat $(ConfigurationName) -a"
- CleanCommandLine="echo Nothing to do"
- Output="_ssl.pyd"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_ssl.c">
- </File>
- <File
- RelativePath="..\..\Modules\_hashopenssl.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_testcapi.vcproj b/PC/VS7.1/_testcapi.vcproj
deleted file mode 100644
index 0197842..0000000
--- a/PC/VS7.1/_testcapi.vcproj
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_testcapi"
- SccProjectName="_testcapi"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_testcapi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./_testcapi.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./_testcapi.pdb"
- BaseAddress="0x1e1F0000"
- ImportLibrary=".\./_testcapi.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_testcapi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./_testcapi_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_testcapi_d.pdb"
- BaseAddress="0x1e1F0000"
- ImportLibrary=".\./_testcapi_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\_testcapi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- OutputFile="./_testcapi.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./_testcapi.pdb"
- BaseAddress="0x1e1F0000"
- ImportLibrary=".\./_testcapi.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_testcapi"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- OutputFile="./_testcapi.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./_testcapi.pdb"
- BaseAddress="0x1e1F0000"
- ImportLibrary=".\./_testcapi.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_testcapimodule.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/_tkinter.vcproj b/PC/VS7.1/_tkinter.vcproj
deleted file mode 100644
index 5f73416..0000000
--- a/PC/VS7.1/_tkinter.vcproj
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="_tkinter"
- SccProjectName="_tkinter"
- SccLocalPath="..\..\..\..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\_tkinter"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\tcltk\include,..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;WITH_APPINIT"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="..\..\..\tcltk\lib\tk84.lib ..\..\..\tcltk\lib\tcl84.lib odbccp32.lib"
- OutputFile="./_tkinter.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- AdditionalLibraryDirectories=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_tkinter.pdb"
- SubSystem="2"
- BaseAddress="0x1e190000"
- ImportLibrary=".\./_tkinter.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\_tkinter"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\tcltk\include,..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;WIN32;_WINDOWS;WITH_APPINIT"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="..\..\..\tcltk\lib\tk84.lib ..\..\..\tcltk\lib\tcl84.lib odbccp32.lib"
- OutputFile="./_tkinter_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- AdditionalLibraryDirectories=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_tkinter_d.pdb"
- SubSystem="2"
- BaseAddress="0x1e190000"
- ImportLibrary=".\./_tkinter_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\_tkinter"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\tcltk\include,..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;WITH_APPINIT"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="..\..\..\tcltk\lib\tk84.lib ..\..\..\tcltk\lib\tcl84.lib odbccp32.lib"
- OutputFile="./_tkinter.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- AdditionalLibraryDirectories=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_tkinter.pdb"
- SubSystem="2"
- BaseAddress="0x1e190000"
- ImportLibrary=".\./_tkinter.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\_tkinter"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\tcltk\include,..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;WITH_APPINIT"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="..\..\..\tcltk\lib\tk84.lib ..\..\..\tcltk\lib\tcl84.lib odbccp32.lib"
- OutputFile="./_tkinter.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- AdditionalLibraryDirectories=""
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./_tkinter.pdb"
- SubSystem="2"
- BaseAddress="0x1e190000"
- ImportLibrary=".\./_tkinter.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\_tkinter.c">
- </File>
- <File
- RelativePath="..\..\Modules\tkappinit.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/amd64_ml64.bat b/PC/VS7.1/amd64_ml64.bat
deleted file mode 100644
index fa9acf1..0000000
--- a/PC/VS7.1/amd64_ml64.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-@echo off
-rem Try to find the AMD64 assembler and call it with the supplied arguments.
-
-set MLEXE=Microsoft Platform SDK\Bin\Win64\x86\AMD64\ml64.EXE
-
-rem For the environment variables see also
-rem http://msdn.microsoft.com/library/en-us/win64/win64/wow64_implementation_details.asp
-
-if exist "%ProgramFiles%\%MLEXE%" (
- set ML64="%ProgramFiles%\%MLEXE%"
-) else if exist "%ProgramW6432%\%MLEXE%" (
- set ML64="%ProgramW6432%\%MLEXE%"
-) else (
- set ML64=ml64.exe
-)
-
-%ML64% %*
diff --git a/PC/VS7.1/build_ssl.bat b/PC/VS7.1/build_ssl.bat
deleted file mode 100644
index f6be3c0..0000000
--- a/PC/VS7.1/build_ssl.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-if "%1" == "ReleaseAMD64" call "%MSSdk%\SetEnv" /XP64 /RETAIL
-
-@echo off
-if not defined HOST_PYTHON (
- if %1 EQU Debug (
- set HOST_PYTHON=python_d.exe
- ) ELSE (
- set HOST_PYTHON=python.exe
- )
-)
-%HOST_PYTHON% build_ssl.py %1 %2
-
diff --git a/PC/VS7.1/build_ssl.py b/PC/VS7.1/build_ssl.py
deleted file mode 100644
index 2e9f4e3..0000000
--- a/PC/VS7.1/build_ssl.py
+++ /dev/null
@@ -1,181 +0,0 @@
-# Script for building the _ssl and _hashlib modules for Windows.
-# Uses Perl to setup the OpenSSL environment correctly
-# and build OpenSSL, then invokes a simple nmake session
-# for the actual _ssl.pyd and _hashlib.pyd DLLs.
-
-# THEORETICALLY, you can:
-# * Unpack the latest SSL release one level above your main Python source
-# directory. It is likely you will already find the zlib library and
-# any other external packages there.
-# * Install ActivePerl and ensure it is somewhere on your path.
-# * Run this script from the PCBuild directory.
-#
-# it should configure and build SSL, then build the _ssl and _hashlib
-# Python extensions without intervention.
-
-import os, sys, re
-
-# Find all "foo.exe" files on the PATH.
-def find_all_on_path(filename, extras = None):
- entries = os.environ["PATH"].split(os.pathsep)
- ret = []
- for p in entries:
- fname = os.path.abspath(os.path.join(p, filename))
- if os.path.isfile(fname) and fname not in ret:
- ret.append(fname)
- if extras:
- for p in extras:
- fname = os.path.abspath(os.path.join(p, filename))
- if os.path.isfile(fname) and fname not in ret:
- ret.append(fname)
- return ret
-
-# Find a suitable Perl installation for OpenSSL.
-# cygwin perl does *not* work. ActivePerl does.
-# Being a Perl dummy, the simplest way I can check is if the "Win32" package
-# is available.
-def find_working_perl(perls):
- for perl in perls:
- fh = os.popen(perl + ' -e "use Win32;"')
- fh.read()
- rc = fh.close()
- if rc:
- continue
- return perl
- print "Can not find a suitable PERL:"
- if perls:
- print " the following perl interpreters were found:"
- for p in perls:
- print " ", p
- print " None of these versions appear suitable for building OpenSSL"
- else:
- print " NO perl interpreters were found on this machine at all!"
- print " Please install ActivePerl and ensure it appears on your path"
- print "The Python SSL module was not built"
- return None
-
-# Locate the best SSL directory given a few roots to look into.
-def find_best_ssl_dir(sources):
- candidates = []
- for s in sources:
- try:
- # note: do not abspath s; the build will fail if any
- # higher up directory name has spaces in it.
- fnames = os.listdir(s)
- except os.error:
- fnames = []
- for fname in fnames:
- fqn = os.path.join(s, fname)
- if os.path.isdir(fqn) and fname.startswith("openssl-"):
- candidates.append(fqn)
- # Now we have all the candidates, locate the best.
- best_parts = []
- best_name = None
- for c in candidates:
- parts = re.split("[.-]", os.path.basename(c))[1:]
- # eg - openssl-0.9.7-beta1 - ignore all "beta" or any other qualifiers
- if len(parts) >= 4:
- continue
- if parts > best_parts:
- best_parts = parts
- best_name = c
- if best_name is not None:
- print "Found an SSL directory at '%s'" % (best_name,)
- else:
- print "Could not find an SSL directory in '%s'" % (sources,)
- sys.stdout.flush()
- return best_name
-
-def run_configure(configure, do_script):
- os.system("perl Configure "+configure)
- os.system(do_script)
-
-def main():
- build_all = "-a" in sys.argv
- if sys.argv[1] == "Release":
- arch = "x86"
- debug = False
- configure = "VC-WIN32"
- do_script = "ms\\do_masm"
- makefile = "ms\\nt.mak"
- elif sys.argv[1] == "Debug":
- arch = "x86"
- debug = True
- configure = "VC-WIN32"
- do_script = "ms\\do_masm"
- makefile="ms\\d32.mak"
- elif sys.argv[1] == "ReleaseItanium":
- arch = "ia64"
- debug = False
- configure = "VC-WIN64I"
- do_script = "ms\\do_win64i"
- makefile = "ms\\nt.mak"
- os.environ["VSEXTCOMP_USECL"] = "MS_ITANIUM"
- elif sys.argv[1] == "ReleaseAMD64":
- arch="amd64"
- debug=False
- configure = "VC-WIN64A"
- do_script = "ms\\do_win64a"
- makefile = "ms\\nt.mak"
- os.environ["VSEXTCOMP_USECL"] = "MS_OPTERON"
- make_flags = ""
- if build_all:
- make_flags = "-a"
- # perl should be on the path, but we also look in "\perl" and "c:\\perl"
- # as "well known" locations
- perls = find_all_on_path("perl.exe", ["\\perl\\bin", "C:\\perl\\bin"])
- perl = find_working_perl(perls)
- if perl is None:
- sys.exit(1)
-
- print "Found a working perl at '%s'" % (perl,)
- sys.stdout.flush()
- # Look for SSL 2 levels up from pcbuild - ie, same place zlib etc all live.
- ssl_dir = find_best_ssl_dir(("..\\..\\..",))
- if ssl_dir is None:
- sys.exit(1)
-
- old_cd = os.getcwd()
- try:
- os.chdir(ssl_dir)
- # If the ssl makefiles do not exist, we invoke Perl to generate them.
- # Due to a bug in this script, the makefile sometimes ended up empty
- # Force a regeneration if it is.
- if not os.path.isfile(makefile) or os.path.getsize(makefile)==0:
- print "Creating the makefiles..."
- sys.stdout.flush()
- # Put our working Perl at the front of our path
- os.environ["PATH"] = os.path.dirname(perl) + \
- os.pathsep + \
- os.environ["PATH"]
- run_configure(configure, do_script)
- if arch=="x86" and debug:
- # the do_masm script in openssl doesn't generate a debug
- # build makefile so we generate it here:
- os.system("perl util\mk1mf.pl debug "+configure+" >"+makefile)
-
- # Now run make.
- makeCommand = "nmake /nologo PERL=\"%s\" -f \"%s\"" %(perl, makefile)
- print "Executing ssl makefiles:", makeCommand
- sys.stdout.flush()
- rc = os.system(makeCommand)
- if rc:
- print "Executing "+makefile+" failed"
- print rc
- sys.exit(rc)
- finally:
- os.chdir(old_cd)
- # And finally, we can build the _ssl module itself for Python.
- defs = "SSL_DIR=\"%s\"" % (ssl_dir,)
- if debug:
- defs = defs + " " + "DEBUG=1"
- if arch in ('amd64', 'ia64'):
- defs = defs + " EXTRA_CFLAGS=/GS- EXTRA_LIBS=bufferoverflowU.lib"
- makeCommand = 'nmake /nologo -f _ssl.mak ' + defs + " " + make_flags
- print "Executing:", makeCommand
- sys.stdout.flush()
- rc = os.system(makeCommand)
- sys.exit(rc)
-
-if __name__=='__main__':
- main()
diff --git a/PC/VS7.1/bz2.vcproj b/PC/VS7.1/bz2.vcproj
deleted file mode 100644
index 0b005a1..0000000
--- a/PC/VS7.1/bz2.vcproj
+++ /dev/null
@@ -1,271 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="bz2"
- RootNamespace="bz2"
- SccProjectName="bz2"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\bz2"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\..\bzip2-1.0.3"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;WIN32;_WINDOWS"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="..\..\..\bzip2-1.0.3\libbz2.lib"
- OutputFile="./bz2_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="msvcrt,libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./bz2_d.pdb"
- SubSystem="2"
- BaseAddress="0x1D170000"
- ImportLibrary=".\./bz2_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- CommandLine="cd ..\..\..\bzip2-1.0.3
-nmake /nologo /f makefile.msc
-"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\bz2"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\..\bzip2-1.0.3"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="..\..\..\bzip2-1.0.3\libbz2.lib"
- OutputFile="./bz2.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./bz2.pdb"
- SubSystem="2"
- BaseAddress="0x1D170000"
- ImportLibrary=".\./bz2.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- CommandLine="cd ..\..\..\bzip2-1.0.3
-nmake /nologo /f makefile.msc lib
-"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\bz2"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\..\bzip2-1.0.3"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="..\..\..\bzip2-1.0.3\libbz2.lib"
- OutputFile="./bz2.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./bz2.pdb"
- SubSystem="2"
- BaseAddress="0x1D170000"
- ImportLibrary=".\./bz2.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- CommandLine="cd ..\..\..\bzip2-1.0.3
-nmake /nologo /f makefile.msc lib
-"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\bz2"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\..\bzip2-1.0.3"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="..\..\..\bzip2-1.0.3\libbz2.lib"
- OutputFile="./bz2.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./bz2.pdb"
- SubSystem="2"
- BaseAddress="0x1D170000"
- ImportLibrary=".\./bz2.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- CommandLine="cd ..\..\..\bzip2-1.0.3
-nmake /nologo /f makefile.msc lib
-"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\bz2module.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/db.build b/PC/VS7.1/db.build
deleted file mode 100644
index 6a87f74..0000000
--- a/PC/VS7.1/db.build
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0"?>
-<project>
- <target name="all" description="Build all targets.">
- <solution configuration="release">
- <projects>
- <include name="db_static.vcproj" />
- </projects>
- </solution>
- </target>
-</project>
diff --git a/PC/VS7.1/field3.py b/PC/VS7.1/field3.py
deleted file mode 100644
index 47f24ca..0000000
--- a/PC/VS7.1/field3.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# An absurd workaround for the lack of arithmetic in MS's resource compiler.
-# After building Python, run this, then paste the output into the appropriate
-# part of PC\python_nt.rc.
-# Example output:
-#
-# * For 2.3a0,
-# * PY_MICRO_VERSION = 0
-# * PY_RELEASE_LEVEL = 'alpha' = 0xA
-# * PY_RELEASE_SERIAL = 1
-# *
-# * and 0*1000 + 10*10 + 1 = 101.
-# */
-# #define FIELD3 101
-
-import sys
-
-major, minor, micro, level, serial = sys.version_info
-levelnum = {'alpha': 0xA,
- 'beta': 0xB,
- 'candidate': 0xC,
- 'final': 0xF,
- }[level]
-string = sys.version.split()[0] # like '2.3a0'
-
-print " * For %s," % string
-print " * PY_MICRO_VERSION = %d" % micro
-print " * PY_RELEASE_LEVEL = %r = %s" % (level, hex(levelnum))
-print " * PY_RELEASE_SERIAL = %d" % serial
-print " *"
-
-field3 = micro * 1000 + levelnum * 10 + serial
-
-print " * and %d*1000 + %d*10 + %d = %d" % (micro, levelnum, serial, field3)
-print " */"
-print "#define FIELD3", field3
diff --git a/PC/VS7.1/installer.bmp b/PC/VS7.1/installer.bmp
deleted file mode 100644
index 1875e19..0000000
--- a/PC/VS7.1/installer.bmp
+++ /dev/null
Binary files differ
diff --git a/PC/VS7.1/make_buildinfo.c b/PC/VS7.1/make_buildinfo.c
deleted file mode 100644
index 2aa2b66..0000000
--- a/PC/VS7.1/make_buildinfo.c
+++ /dev/null
@@ -1,92 +0,0 @@
-#include <windows.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-
-/* This file creates the getbuildinfo.o object, by first
- invoking subwcrev.exe (if found), and then invoking cl.exe.
- As a side effect, it might generate PC\VS7.1\getbuildinfo2.c
- also. If this isn't a subversion checkout, or subwcrev isn't
- found, it compiles ..\\..\\Modules\\getbuildinfo.c instead.
-
- Currently, subwcrev.exe is found from the registry entries
- of TortoiseSVN.
-
- No attempt is made to place getbuildinfo.o into the proper
- binary directory. This isn't necessary, as this tool is
- invoked as a pre-link step for pythoncore, so that overwrites
- any previous getbuildinfo.o.
-
-*/
-
-int make_buildinfo2()
-{
- struct _stat st;
- HKEY hTortoise;
- char command[500];
- DWORD type, size;
- if (_stat(".svn", &st) < 0)
- return 0;
- /* Allow suppression of subwcrev.exe invocation if a no_subwcrev file is present. */
- if (_stat("no_subwcrev", &st) == 0)
- return 0;
- if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS &&
- RegOpenKey(HKEY_CURRENT_USER, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS)
- /* Tortoise not installed */
- return 0;
- command[0] = '"'; /* quote the path to the executable */
- size = sizeof(command) - 1;
- if (RegQueryValueEx(hTortoise, "Directory", 0, &type, command+1, &size) != ERROR_SUCCESS ||
- type != REG_SZ)
- /* Registry corrupted */
- return 0;
- strcat(command, "bin\\subwcrev.exe");
- if (_stat(command+1, &st) < 0)
- /* subwcrev.exe not part of the release */
- return 0;
- strcat(command, "\" ..\\.. ..\\..\\Modules\\getbuildinfo.c getbuildinfo2.c");
- puts(command); fflush(stdout);
- if (system(command) < 0)
- return 0;
- return 1;
-}
-
-int main(int argc, char*argv[])
-{
- char command[500] = "cl.exe -c -D_WIN32 -DUSE_DL_EXPORT -D_WINDOWS -DWIN32 -D_WINDLL ";
- int do_unlink, result;
- if (argc != 2) {
- fprintf(stderr, "make_buildinfo $(ConfigurationName)\n");
- return EXIT_FAILURE;
- }
- if (strcmp(argv[1], "Release") == 0) {
- strcat(command, "-MD ");
- }
- else if (strcmp(argv[1], "Debug") == 0) {
- strcat(command, "-D_DEBUG -MDd ");
- }
- else if (strcmp(argv[1], "ReleaseItanium") == 0) {
- strcat(command, "-MD /USECL:MS_ITANIUM ");
- }
- else if (strcmp(argv[1], "ReleaseAMD64") == 0) {
- strcat(command, "-MD ");
- strcat(command, "-MD /USECL:MS_OPTERON ");
- }
- else {
- fprintf(stderr, "unsupported configuration %s\n", argv[1]);
- return EXIT_FAILURE;
- }
-
- if ((do_unlink = make_buildinfo2()))
- strcat(command, "getbuildinfo2.c -DSUBWCREV ");
- else
- strcat(command, "..\\..\\Modules\\getbuildinfo.c");
- strcat(command, " -Fogetbuildinfo.o -I..\\..\\Include -I..\\..\\PC");
- puts(command); fflush(stdout);
- result = system(command);
- if (do_unlink)
- unlink("getbuildinfo2.c");
- if (result < 0)
- return EXIT_FAILURE;
- return 0;
-}
diff --git a/PC/VS7.1/make_buildinfo.vcproj b/PC/VS7.1/make_buildinfo.vcproj
deleted file mode 100644
index d0c8a5d..0000000
--- a/PC/VS7.1/make_buildinfo.vcproj
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="windows-1250"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="make_buildinfo"
- ProjectGUID="{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="."
- IntermediateDirectory=".\x86-temp-release\make_buildinfo"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="5"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/make_buildinfo.exe"
- LinkIncremental="2"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/make_buildinfo.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="."
- IntermediateDirectory=".\x86-temp-release\make_buildinfo"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="4"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="$(OutDir)/make_buildinfo.exe"
- LinkIncremental="1"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath=".\make_buildinfo.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/make_versioninfo.vcproj b/PC/VS7.1/make_versioninfo.vcproj
deleted file mode 100644
index fffa4eb..0000000
--- a/PC/VS7.1/make_versioninfo.vcproj
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="make_versioninfo"
- RootNamespace="make_versioninfo"
- SccProjectName="make_versioninfo"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\make_versioninfo"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"
- CommandLine=".\make_versioninfo.exe &gt;..\..\PC\pythonnt_rc.h
-"
- Outputs="..\..\PC\pythonnt_rc.h"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile=".\./make_versioninfo.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./make_versioninfo.pdb"
- SubSystem="1"
- BaseAddress="0x1d000000"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="$(TargetFileName) &gt; ..\..\PC\python_nt.h"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\make_versioninfo"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- BrowseInformation="1"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"
- CommandLine=".\make_versioninfo_d.exe &gt;..\..\PC\pythonnt_rc_d.h
-"
- Outputs="..\..\PC\pythonnt_rc_d.h"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./make_versioninfo_d.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./make_versioninfo_d.pdb"
- SubSystem="1"
- BaseAddress="0x1d000000"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="$(TargetFileName) &gt; ..\..\PC\python_nt_d.h"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\PC\make_versioninfo.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/pcbuild.sln b/PC/VS7.1/pcbuild.sln
deleted file mode 100644
index 720f19c..0000000
--- a/PC/VS7.1/pcbuild.sln
+++ /dev/null
@@ -1,275 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcproj", "{324F66C2-44D0-4D50-B979-F9DAE7FD36DB}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcproj", "{8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}"
- ProjectSection(ProjectDependencies) = postProject
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058} = {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcproj", "{59CBF474-9E06-4C50-9142-C44A118BB447}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcproj", "{5B51DFF7-5DC0-41F8-8791-A4AB7114A151}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bz2", "bz2.vcproj", "{AC557788-6354-43F7-BE05-C9C8C59A344A}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_versioninfo", "make_versioninfo.vcproj", "{F0E0541E-F17D-430B-97C4-93ADF0DD284E}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyexpat", "pyexpat.vcproj", "{7E551393-3C43-47F8-9F3F-5BC368A6C487}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
- ProjectSection(ProjectDependencies) = postProject
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E} = {F0E0541E-F17D-430B-97C4-93ADF0DD284E}
- {C73F0EC1-358B-4177-940F-0846AC8B04CD} = {C73F0EC1-358B-4177-940F-0846AC8B04CD}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select", "select.vcproj", "{97239A56-DBC0-41D2-BC14-C87D9B97D63B}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicodedata", "unicodedata.vcproj", "{FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "w9xpopen", "w9xpopen.vcproj", "{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcproj", "{51F35FAE-FB92-4B2C-9187-1542C065AD77}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_elementtree", "_elementtree.vcproj", "{1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_buildinfo", "make_buildinfo.vcproj", "{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_msi", "_msi.vcproj", "{2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes", "_ctypes.vcproj", "{F22F40F4-D318-40DC-96B3-88DC81CE0894}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes_test", "_ctypes_test.vcproj", "{8CF334D9-4F82-42EB-97AF-83592C5AFD2F}"
- ProjectSection(ProjectDependencies) = postProject
- {F22F40F4-D318-40DC-96B3-88DC81CE0894} = {F22F40F4-D318-40DC-96B3-88DC81CE0894}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcproj", "{2FF0A312-22F9-4C34-B070-842916DE27A9}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- ReleaseAMD64 = ReleaseAMD64
- ReleaseItanium = ReleaseItanium
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.Debug.ActiveCfg = Debug|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.Debug.Build.0 = Debug|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.Release.ActiveCfg = Release|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.Release.Build.0 = Release|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {324F66C2-44D0-4D50-B979-F9DAE7FD36DB}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.Debug.ActiveCfg = Debug|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.Debug.Build.0 = Debug|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.Release.ActiveCfg = Release|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.Release.Build.0 = Release|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {8E85BA54-8A47-4C8B-B72E-8E17579CC6D7}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.Debug.ActiveCfg = Debug|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.Debug.Build.0 = Debug|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.Release.ActiveCfg = Release|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.Release.Build.0 = Release|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {59CBF474-9E06-4C50-9142-C44A118BB447}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.Debug.ActiveCfg = Debug|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.Debug.Build.0 = Debug|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.Release.ActiveCfg = Release|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.Release.Build.0 = Release|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {5B51DFF7-5DC0-41F8-8791-A4AB7114A151}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.Debug.ActiveCfg = Debug|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.Debug.Build.0 = Debug|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.Release.ActiveCfg = Release|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.Release.Build.0 = Release|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {AC557788-6354-43F7-BE05-C9C8C59A344A}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug.ActiveCfg = Debug|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug.Build.0 = Debug|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Release.ActiveCfg = Release|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Release.Build.0 = Release|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.ReleaseAMD64.ActiveCfg = Release|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.ReleaseAMD64.Build.0 = Release|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.ReleaseItanium.ActiveCfg = Release|Win32
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.ReleaseItanium.Build.0 = Release|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.Debug.ActiveCfg = Debug|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.Debug.Build.0 = Debug|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.Release.ActiveCfg = Release|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.Release.Build.0 = Release|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {7E551393-3C43-47F8-9F3F-5BC368A6C487}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug.ActiveCfg = Debug|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug.Build.0 = Debug|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release.ActiveCfg = Release|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release.Build.0 = Release|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug.ActiveCfg = Debug|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug.Build.0 = Debug|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release.ActiveCfg = Release|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release.Build.0 = Release|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug.ActiveCfg = Debug|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug.Build.0 = Debug|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release.ActiveCfg = Release|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release.Build.0 = Release|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.Debug.ActiveCfg = Debug|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.Debug.Build.0 = Debug|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.Release.ActiveCfg = Release|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.Release.Build.0 = Release|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {97239A56-DBC0-41D2-BC14-C87D9B97D63B}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.Debug.ActiveCfg = Debug|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.Debug.Build.0 = Debug|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.Release.ActiveCfg = Release|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.Release.Build.0 = Release|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {FA5FC7EB-C72F-415F-AE42-91DD605ABDDA}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug.ActiveCfg = Debug|Win32
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug.Build.0 = Debug|Win32
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release.ActiveCfg = Release|Win32
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release.Build.0 = Release|Win32
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.ReleaseAMD64.ActiveCfg = Release|Win32
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.ReleaseItanium.ActiveCfg = Release|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.Debug.ActiveCfg = Debug|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.Debug.Build.0 = Debug|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.Release.ActiveCfg = Release|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.Release.Build.0 = Release|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {51F35FAE-FB92-4B2C-9187-1542C065AD77}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.Debug.ActiveCfg = Debug|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.Debug.Build.0 = Debug|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.Release.ActiveCfg = Release|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.Release.Build.0 = Release|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {1966DDE2-4AB7-4E4E-ACC9-C121E4D37F8E}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug.ActiveCfg = Debug|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug.Build.0 = Debug|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Release.ActiveCfg = Release|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Release.Build.0 = Release|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.ReleaseAMD64.ActiveCfg = Release|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.ReleaseAMD64.Build.0 = Release|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.ReleaseItanium.ActiveCfg = Release|Win32
- {C73F0EC1-358B-4177-940F-0846AC8B04CD}.ReleaseItanium.Build.0 = Release|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.Debug.ActiveCfg = Debug|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.Debug.Build.0 = Debug|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.Release.ActiveCfg = Release|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.Release.Build.0 = Release|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {2C0BEFB9-70E2-4F80-AC5B-4AB8EE023574}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Debug.ActiveCfg = Debug|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Debug.Build.0 = Debug|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Release.ActiveCfg = Release|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Release.Build.0 = Release|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Debug.ActiveCfg = Debug|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Debug.Build.0 = Debug|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Release.ActiveCfg = Release|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Release.Build.0 = Release|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.Debug.ActiveCfg = Debug|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.Debug.Build.0 = Debug|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.Release.ActiveCfg = Release|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.Release.Build.0 = Release|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.ReleaseAMD64.Build.0 = ReleaseAMD64|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32
- {2FF0A312-22F9-4C34-B070-842916DE27A9}.ReleaseItanium.Build.0 = ReleaseItanium|Win32
- EndGlobalSection
- GlobalSection(SolutionItems) = postSolution
- ..\Modules\getbuildinfo.c = ..\Modules\getbuildinfo.c
- readme.txt = readme.txt
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/PC/VS7.1/pyexpat.vcproj b/PC/VS7.1/pyexpat.vcproj
deleted file mode 100644
index e0739fa..0000000
--- a/PC/VS7.1/pyexpat.vcproj
+++ /dev/null
@@ -1,263 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="pyexpat"
- SccProjectName="pyexpat"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\pyexpat"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;HAVE_EXPAT_H;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./pyexpat_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pyexpat_d.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./pyexpat_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\pyexpat"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./pyexpat.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pyexpat.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./pyexpat.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\pyexpat"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./pyexpat.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pyexpat.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./pyexpat.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\pyexpat"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC,..\..\Modules\expat"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./pyexpat.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pyexpat.pdb"
- SubSystem="2"
- BaseAddress="0x1D100000"
- ImportLibrary=".\./pyexpat.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\pyexpat.c">
- </File>
- <File
- RelativePath="..\..\Modules\expat\xmlparse.c">
- </File>
- <File
- RelativePath="..\..\Modules\expat\xmlrole.c">
- </File>
- <File
- RelativePath="..\..\Modules\expat\xmltok.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/python.build b/PC/VS7.1/python.build
deleted file mode 100644
index 171101d..0000000
--- a/PC/VS7.1/python.build
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<project>
- <target name="all" description="Build all targets.">
- <solution configuration="release">
- <projects>
- <include name="make_versioninfo.vcproj" />
- </projects>
- </solution>
- <exec program="make_versioninfo" output="pythonnt_rc.h" />
-
- <solution configuration="release" solutionfile="pcbuild.sln">
- <excludeprojects>
- <include name="_tkinter.vcproj" />
- <include name="bz2.vcproj" />
- <include name="_sqlite3.vcproj" />
- <include name="_ssl.vcproj" />
- </excludeprojects>
- </solution>
- </target>
-</project>
diff --git a/PC/VS7.1/python.iss b/PC/VS7.1/python.iss
deleted file mode 100644
index ca6a3c0..0000000
--- a/PC/VS7.1/python.iss
+++ /dev/null
@@ -1,341 +0,0 @@
-; Script generated by the Inno Setup Script Wizard.
-; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
-
-; This is the whole ball of wax for an Inno installer for Python.
-; To use, download Inno Setup from http://www.jrsoftware.org/isdl.htm/,
-; install it, and double-click on this file. That launches the Inno
-; script compiler. The GUI is extemely simple, and has only one button
-; you may not recognize instantly: click it. You're done. It builds
-; the installer into PCBuild/Python-2.2a1.exe. Size and speed of the
-; installer are competitive with the Wise installer; Inno uninstall
-; seems much quicker than Wise (but also feebler, and the uninstall
-; log is in some un(human)readable binary format).
-;
-; What's Done
-; -----------
-; All the usual Windows Python files are installed by this now.
-; All the usual Windows Python Start menu entries are created and
-; work fine.
-; .py, .pyw, .pyc and .pyo extensions are registered.
-; PROBLEM: Inno uninstall does not restore their previous registry
-; associations (if any). Wise did. This will make life
-; difficult for alpha (etc) testers.
-; The Python install is fully functional for "typical" uses.
-;
-; What's Not Done
-; ---------------
-; None of "Mark Hammond's" registry entries are written.
-; No installation of files is done into the system dir:
-; The MS DLLs aren't handled at all by this yet.
-; Python22.dll is unpacked into the main Python dir.
-;
-; Inno can't do different things on NT/2000 depending on whether the user
-; has Admin privileges, so I don't know how to "solve" either of those,
-; short of building two installers (one *requiring* Admin privs, the
-; other not doing anything that needs Admin privs).
-;
-; Inno has no concept of variables, so lots of lines in this file need
-; to be fiddled by hand across releases. Simplest way out: stick this
-; file in a giant triple-quoted r-string (note that backslashes are
-; required all over the place here -- forward slashes DON'T WORK in
-; Inno), and use %(yadda)s string interpolation to do substitutions; i.e.,
-; write a very simple Python program to *produce* this script.
-
-[Setup]
-AppName=Python and combined Win32 Extensions
-AppVerName=Python 2.2.2 and combined Win32 Extensions 150
-AppId=Python 2.2.2.150
-AppVersion=2.2.2.150
-AppCopyright=Python is Copyright © 2001 Python Software Foundation. Win32 Extensions are Copyright © 1996-2001 Greg Stein and Mark Hammond.
-
-; Default install dir; value of {app} later (unless user overrides).
-; {sd} = system root drive, probably "C:".
-DefaultDirName={sd}\Python22
-;DefaultDirName={pf}\Python
-
-; Start menu folder name; value of {group} later (unless user overrides).
-DefaultGroupName=Python 2.2
-
-; Point SourceDir to one above PCBuild = src.
-; means this script can run unchanged from anyone's CVS tree, no matter
-; what they called the top-level directories.
-SourceDir=.
-OutputDir=..
-OutputBaseFilename=Python-2.2.2-Win32-150-Setup
-
-AppPublisher=PythonLabs at Digital Creations
-AppPublisherURL=http://www.python.org
-AppSupportURL=http://www.python.org
-AppUpdatesURL=http://www.python.org
-
-AlwaysCreateUninstallIcon=true
-ChangesAssociations=true
-UninstallLogMode=new
-AllowNoIcons=true
-AdminPrivilegesRequired=true
-UninstallDisplayIcon={app}\pyc.ico
-WizardDebug=false
-
-; The fewer screens the better; leave these commented.
-
-Compression=bzip
-InfoBeforeFile=LICENSE.txt
-;InfoBeforeFile=Misc\NEWS
-
-; uncomment the following line if you want your installation to run on NT 3.51 too.
-; MinVersion=4,3.51
-
-[Types]
-Name: normal; Description: Select desired components; Flags: iscustom
-
-[Components]
-Name: main; Description: Python and Win32 Extensions; Types: normal
-Name: docs; Description: Python documentation (HTML); Types: normal
-Name: tk; Description: TCL/TK, tkinter, and Idle; Types: normal
-Name: tools; Description: Python utility scripts (Tools\); Types: normal
-Name: test; Description: Python test suite (Lib\test\); Types: normal
-
-[Tasks]
-Name: extensions; Description: Register file associations (.py, .pyw, .pyc, .pyo); Components: main; Check: IsAdminLoggedOn
-
-[Files]
-; Caution: Using forward slashes instead screws up in amazing ways.
-; Unknown: By the time Components (and other attrs) are added to these lines, they're
-; going to get awfully long. But don't see a way to continue logical lines across
-; physical lines.
-
-Source: LICENSE.txt; DestDir: {app}; CopyMode: alwaysoverwrite
-Source: README.txt; DestDir: {app}; CopyMode: alwaysoverwrite
-Source: News.txt; DestDir: {app}; CopyMode: alwaysoverwrite
-Source: *.ico; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
-
-Source: python.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
-Source: pythonw.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
-Source: w9xpopen.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
-
-
-Source: DLLs\tcl83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
-Source: DLLs\tk83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
-Source: tcl\*.*; DestDir: {app}\tcl; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
-
-Source: sysdir\python22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: sharedfile restartreplace
-Source: sysdir\PyWinTypes22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
-Source: sysdir\pythoncom22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
-
-Source: DLLs\_socket.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\_socket.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\_sre.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\_sre.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\_symtable.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\_symtable.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\_testcapi.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\_testcapi.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\_tkinter.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
-Source: libs\_tkinter.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: tk
-
-Source: DLLs\mmap.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\mmap.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\parser.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\parser.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\pyexpat.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\pyexpat.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\select.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\select.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\unicodedata.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\unicodedata.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\winreg.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\winreg.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\winsound.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\winsound.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\zlib.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-Source: libs\zlib.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: libs\python22.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
-
-Source: DLLs\expat.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
-
-
-
-Source: Lib\*.py; DestDir: {app}\Lib; CopyMode: alwaysoverwrite; Components: main
-Source: Lib\compiler\*.*; DestDir: {app}\Lib\compiler; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\distutils\*.*; DestDir: {app}\Lib\distutils; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\email\*.*; DestDir: {app}\Lib\email; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\encodings\*.*; DestDir: {app}\Lib\encodings; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\hotshot\*.*; DestDir: {app}\Lib\hotshot; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\lib-old\*.*; DestDir: {app}\Lib\lib-old; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\xml\*.*; DestDir: {app}\Lib\xml; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\hotshot\*.*; DestDir: {app}\Lib\hotshot; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\test\*.*; DestDir: {app}\Lib\test; CopyMode: alwaysoverwrite; Components: test; Flags: recursesubdirs
-Source: Lib\tkinter\*.py; DestDir: {app}\Lib\tkinter; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
-
-Source: Lib\site-packages\README.txt; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: main
-
-Source: Lib\site-packages\PyWin32.chm; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: docs
-Source: Lib\site-packages\win32\*.*; DestDir: {app}\Lib\site-packages\win32; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\site-packages\win32com\*.*; DestDir: {app}\Lib\site-packages\win32com; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-Source: Lib\site-packages\win32comext\*.*; DestDir: {app}\Lib\site-packages\win32comext; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
-
-Source: include\*.h; DestDir: {app}\include; CopyMode: alwaysoverwrite; Components: main
-
-Source: Tools\idle\*.*; DestDir: {app}\Tools\idle; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
-
-Source: Tools\pynche\*.*; DestDir: {app}\Tools\pynche; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
-Source: Tools\scripts\*.*; DestDir: {app}\Tools\Scripts; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
-Source: Tools\webchecker\*.*; DestDir: {app}\Tools\webchecker; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
-Source: Tools\versioncheck\*.*; DestDir: {app}\Tools\versioncheck; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
-
-Source: Doc\*.*; DestDir: {app}\Doc; CopyMode: alwaysoverwrite; Flags: recursesubdirs; Components: docs
-
-
-[Icons]
-Name: {group}\Python (command line); Filename: {app}\python.exe; WorkingDir: {app}; Components: main
-Name: {group}\Python Manuals; Filename: {app}\Doc\index.html; WorkingDir: {app}; Components: docs
-Name: {group}\Win32 Extensions Help; Filename: {app}\Lib\site-packages\PyWin32.chm; WorkingDir: {app}\Lib\site-packages; Components: docs
-Name: {group}\Module Docs; Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\Scripts\pydoc.pyw"""; Components: tools
-Name: {group}\IDLE (Python GUI); Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\idle\idle.pyw"""; Components: tools
-
-[Registry]
-; Register .py
-Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletevalue
-Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
-Tasks: extensions; Root: HKCR; Subkey: Python File; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletekey
-Tasks: extensions; Root: HKCR; Subkey: Python File\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
-Tasks: extensions; Root: HKCR; Subkey: Python File\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
-
-; Register .pyc
-Tasks: extensions; Root: HKCR; Subkey: .pyc; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
-Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile; ValueType: string; ValueName: ; ValueData: Compiled Python File; Flags: uninsdeletekey
-Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\pyc.ico
-Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
-
-; Register .pyo
-Tasks: extensions; Root: HKCR; Subkey: .pyo; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
-
-; Register .pyw
-Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: ; ValueData: Python NoConFile; Flags: uninsdeletevalue
-Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
-Tasks: extensions; Root: HKCR; Subkey: Python NoConFile; ValueType: string; ValueName: ; ValueData: Python File (no console); Flags: uninsdeletekey
-Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
-Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\pythonw.exe"" ""%1"" %*"
-
-
-; Python Registry Keys
-Root: HKLM; Subkey: SOFTWARE\Python; Flags: uninsdeletekeyifempty; Check: IsAdminLoggedOn
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore; Flags: uninsdeletekeyifempty
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2; Flags: uninsdeletekeyifempty
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath; ValueData: "{app}\Lib;{app}\DLLs"; Flags: uninsdeletekeyifempty
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32; ValueData: "{app}\lib\site-packages\win32;{app}\lib\site-packages\win32\lib"; Flags: uninsdeletekey
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32com; ValueData: C:\Python\lib\site-packages; Flags: uninsdeletekey
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules; Flags: uninsdeletekeyifempty
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pythoncom; ValueData: {sys}\pythoncom22.dll; Flags: uninsdeletekey
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pywintypes; ValueData: {sys}\PyWinTypes22.dll; Flags: uninsdeletekey
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath; ValueData: {app}; Flags: uninsdeletekeyifempty; ValueType: string
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath\InstallGroup; ValueData: {group}; Flags: uninsdeletekey
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help; Flags: uninsdeletekeyifempty
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Main Python Documentation; ValueType: string; ValueData: {app}\Doc\index.html; Flags: uninsdeletekey; Components: docs
-Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Python Win32 Documentation; ValueType: string; ValueData: {app}\lib\site-packages\PyWin32.chm; Flags: uninsdeletekey; Components: docs
-
-[_ISTool]
-EnableISX=true
-
-
-[Code]
-Program Setup;
-
-Function IsAdminNotLoggedOn(): Boolean;
-begin
- Result := Not IsAdminLoggedOn();
-end;
-
-begin
-end.
-
-
-
-
-[UninstallDelete]
-Name: {app}\Lib\compiler\*.pyc; Type: files
-Name: {app}\Lib\compiler\*.pyo; Type: files
-Name: {app}\Lib\compiler; Type: dirifempty
-Name: {app}\Lib\distutils\command\*.pyc; Type: files
-Name: {app}\Lib\distutils\command\*.pyo; Type: files
-Name: {app}\Lib\distutils\command; Type: dirifempty
-Name: {app}\Lib\distutils\*.pyc; Type: files
-Name: {app}\Lib\distutils\*.pyo; Type: files
-Name: {app}\Lib\distutils; Type: dirifempty
-Name: {app}\Lib\email\test\*.pyc; Type: files
-Name: {app}\Lib\email\test\*.pyo; Type: files
-Name: {app}\Lib\email\test; Type: dirifempty
-Name: {app}\Lib\email\*.pyc; Type: files
-Name: {app}\Lib\email\*.pyo; Type: files
-Name: {app}\Lib\email; Type: dirifempty
-Name: {app}\Lib\encodings\*.pyc; Type: files
-Name: {app}\Lib\encodings\*.pyo; Type: files
-Name: {app}\Lib\encodings; Type: dirifempty
-Name: {app}\Lib\hotshot\*.pyc; Type: files
-Name: {app}\Lib\hotshot\*.pyo; Type: files
-Name: {app}\Lib\hotshot; Type: dirifempty
-Name: {app}\Lib\lib-old\*.pyc; Type: files
-Name: {app}\Lib\lib-old\*.pyo; Type: files
-Name: {app}\Lib\lib-old; Type: dirifempty
-Name: {app}\Lib\tkinter\*.pyc; Type: files
-Name: {app}\Lib\tkinter\*.pyo; Type: files
-Name: {app}\Lib\tkinter; Type: dirifempty
-Name: {app}\Lib\test\*.pyc; Type: files
-Name: {app}\Lib\test\*.pyo; Type: files
-Name: {app}\Lib\test; Type: dirifempty
-Name: {app}\Lib\xml\dom\*.pyc; Type: files
-Name: {app}\Lib\xml\dom\*.pyo; Type: files
-Name: {app}\Lib\xml\dom; Type: dirifempty
-Name: {app}\Lib\xml\parsers\*.pyc; Type: files
-Name: {app}\Lib\xml\parsers\*.pyo; Type: files
-Name: {app}\Lib\xml\parsers; Type: dirifempty
-Name: {app}\Lib\xml\sax\*.pyc; Type: files
-Name: {app}\Lib\xml\sax\*.pyo; Type: files
-Name: {app}\Lib\xml\sax; Type: dirifempty
-Name: {app}\Lib\xml\*.pyc; Type: files
-Name: {app}\Lib\xml\*.pyo; Type: files
-Name: {app}\Lib\xml; Type: dirifempty
-
-Name: {app}\Lib\site-packages\win32; Type: filesandordirs
-Name: {app}\Lib\site-packages\win32com; Type: filesandordirs
-Name: {app}\Lib\site-packages\win32comext; Type: filesandordirs
-Name: {app}\Lib\site-packages\pythoncom.py*; Type: files
-Name: {app}\Lib\site-packages; Type: dirifempty
-
-Name: {app}\Lib\*.pyc; Type: files
-Name: {app}\Lib; Type: dirifempty
-
-Name: {app}\Tools\pynche\*.pyc; Type: files
-Name: {app}\Tools\pynche\*.pyo; Type: files
-Name: {app}\Tools\pynche; Type: dirifempty
-
-Name: {app}\Tools\idle\*.pyc; Type: files
-Name: {app}\Tools\idle\*.pyo; Type: files
-Name: {app}\Tools\idle; Type: dirifempty
-
-Name: {app}\Tools\scripts\*.pyc; Type: files
-Name: {app}\Tools\scripts\*.pyo; Type: files
-Name: {app}\Tools\scripts; Type: dirifempty
-
-Name: {app}\Tools\versioncheck\*.pyc; Type: files
-Name: {app}\Tools\versioncheck\*.pyo; Type: files
-Name: {app}\Tools\versioncheck; Type: dirifempty
-
-Name: {app}\Tools\webchecker\*.pyc; Type: files
-Name: {app}\Tools\webchecker\*.pyo; Type: files
-Name: {app}\Tools\webchecker; Type: dirifempty
-
-Name: {app}\Tools; Type: dirifempty
-
diff --git a/PC/VS7.1/python.vcproj b/PC/VS7.1/python.vcproj
deleted file mode 100644
index 80b4401..0000000
--- a/PC/VS7.1/python.vcproj
+++ /dev/null
@@ -1,274 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="python"
- SccProjectName="python"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\python"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile=".\./python.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python.pdb"
- SubSystem="1"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\python"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- BrowseInformation="1"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="odbccp32.lib"
- OutputFile="./python_d.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python_d.pdb"
- SubSystem="1"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\..\Include"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\ia64-temp-release\python"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK /VSEXTCOMP_VERBOSE"
- AdditionalDependencies="odbccp32.lib"
- OutputFile=".\./python.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python.pdb"
- SubSystem="1"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\python"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="odbccp32.lib"
- OutputFile=".\./python.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python.pdb"
- SubSystem="1"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\PC\pycon.ico">
- </File>
- <File
- RelativePath="..\..\Modules\python.c">
- </File>
- <File
- RelativePath="..\..\PC\python_exe.rc">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/python20.wse b/PC/VS7.1/python20.wse
deleted file mode 100644
index 2e7f6ad3..0000000
--- a/PC/VS7.1/python20.wse
+++ /dev/null
@@ -1,3117 +0,0 @@
-Document Type: WSE
-item: Global
- Version=9.0
- Title=Python 2.4a1
- Flags=00010100
- Languages=65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- Japanese Font Name=MS Gothic
- Japanese Font Size=10
- Start Gradient=0 255 0
- End Gradient=0 128 0
- Windows Flags=00000100000011010010010100001010
- Log Pathname=%MAINDIR%\INSTALL.LOG
- Message Font=MS Sans Serif
- Font Size=8
- Pages Modified=00010000011101000000000100000111
- Extra Pages=00000000000000000000000010110010
- Disk Filename=SETUP
- Patch Flags=0000000000001001
- Patch Threshold=85
- Patch Memory=4000
- MIF PDF Version=1.0
- MIF SMS Version=2.0
- EXE Filename=Python-2.4a1.exe
- Dialogs Version=8
- Version File=2.4a1
- Version Description=Python Programming Language
- Version Copyright=©2001-2007 Python Software Foundation
- Version Company=Python Software Foundation
- Crystal Format=10111100101100000010001001001001
- Step View=&All
- Variable Name1=_WISE_
- Variable Description1=WISE root directory
- Variable Default1=C:\Programme\Wise Installation System
- Variable Flags1=00001000
- Variable Name2=_TCLDIR_
- Variable Description2=The directory in which the Tcl/Tk installation
- Variable Description2=lives. This must be a sibling of the Python
- Variable Description2=directory.
- Variable Default2=tcl84
- Variable Flags2=00001000
- Variable Name3=_DOC_
- Variable Description3=The unpacked HTML doc directory.
- Variable Default3=..\html
- Variable Flags3=00001001
- Variable Name4=_SYS_
- Variable Description4=System directory (where to find MSVCRT.DLL)
- Variable Default4=C:\Windows\System
- Variable Values4=C:\Windows\System
- Variable Values4=C:\WINNT\System32
- Variable Values4=C:\Code\MSDLLs
- Variable Values4=C:\Windows\System32
- Variable Flags4=00000010
- Variable Name5=_PYMAJOR_
- Variable Description5=Python major version number; the 2 in 2.3.
- Variable Default5=2
- Variable Flags5=00001000
- Variable Name6=_PYMINOR_
- Variable Description6=Python minor version number; the 3 in 2.3
- Variable Default6=3
- Variable Flags6=00001000
- Variable Name7=_DOADMIN_
- Variable Description7=The initial value for %DOADMIN%.
- Variable Description7=When 0, we never try to write under HKLM,
- Variable Description7=and install the Python + MS runtime DLLs in
- Variable Description7=the Python directory instead of the system dir.
- Variable Default7=1
- Variable Values7=1
- Variable Values7=0
- Variable Flags7=00001010
- Variable Name8=_ALIASNAME_
- Variable Flags8=00001000
- Variable Name9=_ALIASPATH_
- Variable Flags9=00001000
- Variable Name10=_ALIASTYPE_
- Variable Flags10=00001000
-end
-item: Set Variable
- Variable=PYVER_STRING
- Value=2.3
-end
-item: Remark
-end
-item: Remark
- Text=When the version number changes, set the compiler
-end
-item: Remark
- Text=vrbls _PYMAJOR_ and _PYMINOR_.
-end
-item: Remark
- Text=Nothing in the script below should need fiddling then.
-end
-item: Remark
- Text=Other things that need fiddling:
-end
-item: Remark
- Text= PYVER_STRING above.
-end
-item: Remark
- Text= The "Title:" in the upper left corner of the GUI.
-end
-item: Remark
- Text= Build Settings and Version Resource on step 6 (Finish) of the Installation Expert
-end
-item: Remark
- Text= Be sure to select Steps->All or you may not see these!
-end
-item: Remark
-end
-item: Remark
- Text=When the version of Tcl/Tk changes, the compiler vrbl
-end
-item: Remark
- Text=_TCLDIR_ may also need to be changed.
-end
-item: Remark
-end
-item: Set Variable
- Variable=APPTITLE
- Value=Python %PYVER_STRING%
-end
-item: Remark
- Text=PY_VERSION should be major.minor only; used to create the registry key; must match MS_DLL_ID in python_nt.rc
-end
-item: Set Variable
- Variable=PY_VERSION
- Value=%_PYMAJOR_%.%_PYMINOR_%
-end
-item: Remark
- Text=GROUP is the Start menu group name; user can override.
-end
-item: Set Variable
- Variable=GROUP
- Value=Python %PY_VERSION%
- Flags=10000000
-end
-item: Remark
- Text=MAINDIR is the app directory; user can override.
-end
-item: Set Variable
- Variable=MAINDIR
- Value=Python%_PYMAJOR_%%_PYMINOR_%
-end
-item: Remark
-end
-item: Set Variable
- Variable=DOADMIN
- Value=%_DOADMIN_%
-end
-item: Remark
- Text=Give non-admin users a chance to abort.
-end
-item: Check Configuration
- Flags=10011111
-end
-item: Set Variable
- Variable=DOADMIN
- Value=0
-end
-item: Display Message
- Title=Doing non-admin install
- Text=The current login does not have Administrator Privileges on this machine. Python will install its registry information into the per-user area only for the current login, instead of into the per-machine area for every account on this machine. Some advanced uses of Python may not work as a result (for example, running a Python script as a service).
- Text=
- Text=If this is not what you want, please click Cancel to abort this installation, log on as an Administrator, and start the installation again.
- Flags=00001000
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=BEGIN WIZARD STUFF -----------------------------------------------------------------------------------------------------------------------------
-end
-item: Remark
- Text=Note from Tim: the "stop" on the next line is actually "pause".
-end
-item: Open/Close INSTALL.LOG
- Flags=00000001
-end
-item: Remark
- Text=If the destination system does not have a writable Windows\System directory, system files will be written to the Windows\ directory
-end
-item: Check if File/Dir Exists
- Pathname=%SYS%
- Flags=10000100
-end
-item: Set Variable
- Variable=SYS
- Value=%WIN%
-end
-item: End Block
-end
-item: Check Configuration
- Flags=10111011
-end
-item: Get Registry Key Value
- Variable=COMMON
- Key=SOFTWARE\Microsoft\Windows\CurrentVersion
- Default=C:\Program Files\Common Files
- Value Name=CommonFilesDir
- Flags=00000100
-end
-item: Get Registry Key Value
- Variable=PROGRAM_FILES
- Key=SOFTWARE\Microsoft\Windows\CurrentVersion
- Default=C:\Program Files
- Value Name=ProgramFilesDir
- Flags=00000100
-end
-item: Set Variable
- Variable=EXPLORER
- Value=1
-end
-item: End Block
-end
-item: Remark
- Text=Note from Tim: The Wizard hardcod "C:" at the start of the replacement text for MAINDIR.
-end
-item: Remark
- Text=That's not appropriate if the system drive doesn't happen to be C:.
-end
-item: Remark
- Text=I removed the "C:", and that did the right thing for two people who tested it on non-C: machines,
-end
-item: Remark
- Text=but it's unclear whether it will always do the right thing.
-end
-item: Set Variable
- Variable=MAINDIR
- Value=\%MAINDIR%
- Flags=00001100
-end
-item: Remark
- Text=BACKUP is the variable that holds the path that all backup files will be copied to when overwritten
-end
-item: Set Variable
- Variable=BACKUP
- Value=%MAINDIR%\BACKUP
- Flags=10000000
-end
-item: Remark
- Text=DOBACKUP determines if a backup will be performed. The possible values are A (do backup) or B (do not do backup)
-end
-item: Set Variable
- Variable=DOBACKUP
- Value=A
-end
-item: Remark
- Text=BRANDING determines if the installation will be branded with a name and company. By default, this is written to the INST directory (installation media).
-end
-item: Set Variable
- Variable=BRANDING
- Value=0
-end
-item: If/While Statement
- Variable=BRANDING
- Value=1
-end
-item: Read INI Value
- Variable=NAME
- Pathname=%INST%\CUSTDATA.INI
- Section=Registration
- Item=Name
-end
-item: Read INI Value
- Variable=COMPANY
- Pathname=%INST%\CUSTDATA.INI
- Section=Registration
- Item=Company
-end
-item: If/While Statement
- Variable=NAME
-end
-item: Set Variable
- Variable=DOBRAND
- Value=1
-end
-item: Get System Information
- Variable=NAME
- Flags=00000110
-end
-item: Get System Information
- Variable=COMPANY
- Flags=00000111
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
- Text=END WIZARD STUFF -----------------------------------------------------------------------------------------------------------------------------
-end
-item: Remark
-end
-item: Remark
- Text=Set vrbls for the "Advanced Options" subdialog of Components.
-end
-item: Set Variable
- Variable=SELECT_ADMIN
- Value=A
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=0
-end
-item: Set Variable
- Variable=SELECT_ADMIN
- Value=B
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=TASKS values:
-end
-item: Remark
- Text=A: Register file extensions
-end
-item: Remark
- Text=B: Create Start Menu shortcuts
-end
-item: Set Variable
- Variable=TASKS
- Value=AB
-end
-item: Remark
-end
-item: Remark
- Text=COMPONENTS values:
-end
-item: Remark
- Text=A: interpreter and libraries
-end
-item: Remark
- Text=B: Tcl/Tk
-end
-item: Remark
- Text=C: docs
-end
-item: Remark
- Text=D: tools
-end
-item: Remark
- Text=E: test suite
-end
-item: Set Variable
- Variable=COMPONENTS
- Value=ABCDE
-end
-item: Remark
-end
-item: Remark
- Text=March thru the user GUI.
-end
-item: Wizard Block
- Direction Variable=DIRECTION
- Display Variable=DISPLAY
- Bitmap Pathname=.\installer.bmp
- X Position=9
- Y Position=10
- Filler Color=11173759
- Dialog=Select Destination Directory
- Dialog=Backup Replaced Files
- Dialog=Select Components
- Dialog=Select Program Manager Group
- Variable=
- Variable=
- Variable=
- Variable=TASKS
- Value=
- Value=
- Value=
- Value=B
- Compare=0
- Compare=0
- Compare=0
- Compare=3
- Flags=00000011
-end
-item: If/While Statement
- Variable=DISPLAY
- Value=Start Installation
-end
-item: Set Variable
- Variable=SUMMARY
- Value=Install directory: %MAINDIR%%CRLF%
-end
-item: Remark
-end
-item: If/While Statement
- Variable=SELECT_ADMIN
- Value=A
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Doing admin install.%CRLF%
- Flags=00000001
-end
-item: Else Statement
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Doing non-admin install.%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: Remark
-end
-item: If/While Statement
- Variable=DOBACKUP
- Value=A
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Make backups, into %BACKUP%%CRLF%
- Flags=00000001
-end
-item: Else Statement
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Don't make backups.%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: Remark
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Components:%CRLF%
- Flags=00000001
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=A
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value= Python interpreter and libraries%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=B
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value= Tcl/Tk (Tkinter, IDLE, pydoc)%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=C
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value= Python documentation%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=D
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value= Tool and utility scripts%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=E
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value= Python test suite%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: Remark
-end
-item: If/While Statement
- Variable=TASKS
- Value=A
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Register file extensions.%CRLF%
- Flags=00000001
-end
-item: Else Statement
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Don't register file extensions.%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: Remark
-end
-item: If/While Statement
- Variable=TASKS
- Value=B
- Flags=00000010
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%Start Menu group: %GROUP%%CRLF%
- Flags=00000001
-end
-item: Else Statement
-end
-item: Set Variable
- Variable=SUMMARY
- Value=%CRLF%No Start Menu shortcuts.%CRLF%
- Flags=00000001
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
-end
-item: Custom Dialog Set
- Name=Select Destination Directory
- Display Variable=DISPLAY
- item: Dialog
- Title=%APPTITLE% Installation
- Title French=Installation de %APPTITLE%
- Title German=Installation von %APPTITLE%
- Title Spanish=Instalación de %APPTITLE%
- Title Italian=Installazione di %APPTITLE%
- Width=339
- Height=280
- Font Name=Helv
- Font Size=8
- item: Push Button
- Rectangle=188 234 244 253
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=&Next >
- Text French=&Suite >
- Text German=&Weiter >
- Text Spanish=&Siguiente >
- Text Italian=&Avanti >
- end
- item: Push Button
- Rectangle=264 234 320 253
- Action=3
- Create Flags=01010000000000010000000000000000
- Text=&Cancel
- Text French=&Annuler
- Text German=&Abbrechen
- Text Spanish=&Cancelar
- Text Italian=&Annulla
- end
- item: Static
- Rectangle=10 225 320 226
- Action=3
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Rectangle=108 11 323 33
- Create Flags=01010000000000000000000000000000
- Flags=0000000000000001
- Name=Times New Roman
- Font Style=-24 0 0 0 700 255 0 0 0 3 2 1 18
- Text=Select Destination Directory
- Text French=Sélectionner le répertoire de destination
- Text German=Zielverzeichnis wählen
- Text Spanish=Seleccione el directorio de destino
- Text Italian=Selezionare Directory di destinazione
- end
- item: Listbox
- Rectangle=108 58 321 219
- Variable=MAINDIR
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000100000010000000101000001
- Flags=0000110000001010
- Text=%MAINDIR%
- Text=
- end
- item: Static
- Rectangle=108 40 313 58
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000000000
- Text=Please select a directory for the %APPTITLE% files.
- end
- end
- item: Dialog
- Title=Select Destination Directory
- Title French=Sélectionner le répertoire de destination
- Title German=Zielverzeichnis wählen
- Title Spanish=Seleccione el directorio de destino
- Title Italian=Selezionare Directory di destinazione
- Width=276
- Height=216
- Font Name=Helv
- Font Size=8
- item: Listbox
- Rectangle=6 6 204 186
- Variable=MAINDIR
- Create Flags=01010000100000010000000101000000
- Flags=0000110000100010
- Text=%MAINDIR%
- Text French=%MAINDIR%
- Text German=%MAINDIR%
- Text Spanish=%MAINDIR%
- Text Italian=%MAINDIR%
- end
- item: Push Button
- Rectangle=209 8 265 26
- Create Flags=01010000000000010000000000000001
- Text=OK
- Text French=OK
- Text German=OK
- Text Spanish=Aceptar
- Text Italian=OK
- end
- item: Push Button
- Rectangle=209 31 265 50
- Variable=MAINDIR
- Value=%MAINDIR_SAVE%
- Create Flags=01010000000000010000000000000000
- Flags=0000000000000001
- Text=Cancel
- Text French=Annuler
- Text German=Abbrechen
- Text Spanish=Cancelar
- Text Italian=Annulla
- end
- end
-end
-item: Custom Dialog Set
- Name=Backup Replaced Files
- Display Variable=DISPLAY
- item: Dialog
- Title=%APPTITLE% Installation
- Title French=Fichiers de Sauvegarde Remplacés
- Title German=Sicherungskopie von ersetzten Dateien erstellen
- Title Portuguese=Ficheiros substituídos de segurança
- Title Spanish=Copias de seguridad de los archivos reemplazados
- Title Italian=Backup file sostituiti
- Title Danish=Sikkerhedskopiering af erstattede filer
- Title Dutch=Vervangen bestanden kopiëren
- Title Norwegian=Sikkerhetskopiere erstattede filer
- Title Swedish=Säkerhetskopiera utbytta filer
- Width=350
- Height=280
- Font Name=Helv
- Font Size=8
- item: Push Button
- Rectangle=188 234 244 251
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=&Next >
- Text French=&Suivant>
- Text German=&Weiter>
- Text Portuguese=&Próximo>
- Text Spanish=&Siguiente >
- Text Italian=&Avanti >
- Text Danish=&Næste>
- Text Dutch=&Volgende>
- Text Norwegian=&Neste>
- Text Swedish=&Nästa >
- end
- item: Push Button
- Rectangle=131 234 188 251
- Variable=DIRECTION
- Value=B
- Create Flags=01010000000000010000000000000000
- Text=< &Back
- Text French=<&Retour
- Text German=<&Zurück
- Text Portuguese=<&Retornar
- Text Spanish=<&Retroceder
- Text Italian=< &Indietro
- Text Danish=<&Tilbage
- Text Dutch=<&Terug
- Text Norwegian=<&Tilbake
- Text Swedish=< &Tillbaka
- end
- item: Push Button
- Rectangle=278 234 330 251
- Action=3
- Create Flags=01010000000000010000000000000000
- Text=Cancel
- Text French=Annuler
- Text German=Abbrechen
- Text Portuguese=Cancelar
- Text Spanish=Cancelar
- Text Italian=Annulla
- Text Danish=Annuller
- Text Dutch=Annuleren
- Text Norwegian=Avbryt
- Text Swedish=Avbryt
- end
- item: Static
- Rectangle=11 221 329 223
- Action=3
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Rectangle=108 46 320 98
- Create Flags=01010000000000000000000000000000
- Text=This installation program can create backup copies of all files replaced during the installation. These files will be used when the software is uninstalled and a rollback is requested. If backup copies are not created, you will only be able to uninstall the software and not roll the system back to a previous state.
- Text=
- Text=Do you want to create backups of replaced files?
- Text French=Le programme d'installation peut créer des copies de sauvegarde de tous les fichiers remplacés pendant l'installation. Ces fichiers sont utilisés au cas où le logiciel est désinstallé et que l'on procède à la reprise du système. Si les copies de sauvegarde ne sont pas créées, on ne pourra que désinstaller le logiciel sans reprendre le système à un état précédent. Voulez-vous créer une sauvegarde des fichiers remplacés ?
- Text German=Dieses Installationsprogramm kann Sicherungskopien von allen während der Installation ersetzten Dateien erstellen. Diese Dateien werden zur Rückgängigmachung der Installation und bei Anforderung eines Rollbacks verwendet. Ohne Sicherungskopien ist nur eine Rückgängigmachung der Installation möglich, nicht aber ein Rollback des Systems. Sicherungskopien der ersetzten Dateien erstellen?
- Text Portuguese=Este programa de instalação pode criar cópias de segurança de todos os ficheiros substituídos durante a instalação. Estes ficheiros serão utilizados quando o programa for desinstalado e for requisitada uma retomada. Se as cópias de segurança não forem criadas, só poderá desinstalar o programa e não pode retomar um estado anterior do sistema. Deseja criar cópias de segurança dos ficheiros substituídos?
- Text Spanish=Este programa de instalación puede crear copias de seguridad de todos los archivos reemplazados durante la instalación. Estos archivos se utilizarán cuando se desinstale el software y se solicite volver al estado anterior. Si no se crean copias de seguridad, únicamente podrá desinstalar el software y no podrá devolver el sistema al estado anterior. ¿Desea crear archivos de seguridad de los archivos reemplazados?
- Text Italian=Questo programma di installazione può creare copie di backup di tutti i file sostituiti durante l’installazione. Questi file saranno usati quando il software sarà disinstallato e sarà richiesto un ritorno allo stato precedente. Se non crei le copie di backup, potrai solo disinstallare il software, ma non potrai riportare il sistema allo stato precedente. Vuoi creare i file di backup dei file sostituiti?
- Text Danish=Dette installationsprogram kan oprette sikkerhedskopier af alle filer, som erstattes under installationen. Disse filer benyttes, når softwaren fjernes, og den tidligere systemkonfiguration genetableres. Hvis der ikke oprettes sikkerhedskopier, kan du kun fjerne den installerede software og ikke genetablere den tidligere systemkonfiguration. Vil du oprette sikkerhedskopier af filer, som erstattes?
- Text Dutch=Dit installatieprogramma kan kopieën maken van alle bestanden die tijdens de installatie worden vervangen. Deze worden dan gebruikt als de software-installatie ongedaan wordt gemaakt en u het systeem wilt laten terugkeren naar de oorspronkelijke staat. Als er geen back-up kopieën worden gemaakt, kunt u de software enkel verwijderen maar het systeem niet in de oorspronkelijke staat terugbrengen. Wilt u een back-up maken van de vervangen bestanden?
- Text Norwegian=Dette installasjonsprogrammet kan lage sikkerhetskopier av alle filer som blir erstattet under installasjonen. Disse filene vil tas i bruk når programvaren er avinstallert og det er behov for tilbakestilling. Hvis det ikke er laget sikkerhetskopier, kan du kun avinstallere programvaren og ikke stille systemet tilbake til tidligere status. Ønsker du å lage sikkerhetskopier av de filene som blir erstattet nå?
- Text Swedish=Installationsprogrammet kan skapa säkerhetskopior av alla filer som byts ut under installationen. Dessa filer kan sedan användas när programvaran avinstalleras och du begär rollback. Om du då inte har några säkerhetskopior kan du bara avinstallera programvaran, inte återskapa systemet i dess tidigare skick. Vill du göra säkerhetskopior av de ersatta filerna?
- end
- item: Radio Button
- Rectangle=141 106 265 136
- Variable=DOBACKUP
- Create Flags=01010000000000010000000000001001
- Text=&Yes, make backups
- Text=N&o, do not make backups
- Text=
- Text French=&Oui
- Text French=N&on
- Text French=
- Text German=&Ja
- Text German=N&ein
- Text German=
- Text Portuguese=&Sim
- Text Portuguese=Nã&o
- Text Portuguese=
- Text Spanish=&Sí
- Text Spanish=N&o
- Text Spanish=
- Text Italian=&Sì
- Text Italian=N&o
- Text Italian=
- Text Danish=&Ja
- Text Danish=&Nej
- Text Danish=
- Text Dutch=&Ja
- Text Dutch=N&ee
- Text Dutch=
- Text Norwegian=&Ja
- Text Norwegian=&Nei
- Text Norwegian=
- Text Swedish=&Ja
- Text Swedish=N&ej
- Text Swedish=
- end
- item: Static
- Control Name=BACK2
- Rectangle=108 173 320 208
- Action=1
- Create Flags=01010000000000000000000000000111
- Text=Backup File Destination Directory
- Text French=Répertoire de destination des fichiers de sauvegarde
- Text German=Zielverzeichnis für die Sicherungsdatei
- Text Portuguese=Directório de destino de ficheiro de segurança
- Text Spanish=Directorio de Destino de los Archivos de Seguridad
- Text Italian=Directory di destinazione dei file di backup
- Text Danish=Destinationsbibliotek til sikkerhedskopier
- Text Dutch=Doeldirectory backup-bestand
- Text Norwegian=Målkatalog for sikkerhetskopier
- Text Swedish=Katalog för säkerhetskopierade filer
- end
- item: Push Button
- Control Name=BACK3
- Rectangle=265 185 318 203
- Variable=BACKUP_SAVE
- Value=%BACKUP%
- Destination Dialog=1
- Action=2
- Create Flags=01010000000000010000000000000000
- Text=B&rowse...
- Text French=P&arcourir
- Text German=B&lättern...
- Text Portuguese=P&rocurar
- Text Spanish=V&isualizar...
- Text Italian=Sfoglia...
- Text Danish=&Gennemse...
- Text Dutch=B&laderen...
- Text Norwegian=Bla igjennom
- Text Swedish=&Bläddra
- end
- item: Static
- Control Name=BACK4
- Rectangle=129 188 254 200
- Destination Dialog=2
- Create Flags=01010000000000000000000000000000
- Text=%BACKUP%
- Text French=%BACKUP%
- Text German=%BACKUP%
- Text Portuguese=%BACKUP%
- Text Spanish=%BACKUP%
- Text Italian=%BACKUP%
- Text Danish=%BACKUP%
- Text Dutch=%BACKUP%
- Text Norwegian=%BACKUP%
- Text Swedish=%BACKUP%
- end
- item: Static
- Rectangle=108 11 323 36
- Create Flags=01010000000000000000000000000000
- Flags=0000000000000001
- Name=Times New Roman
- Font Style=-24 0 0 0 700 255 0 0 0 3 2 1 18
- Text=Backup Replaced Files
- Text French=Sélectionner les composants
- Text German=Komponenten auswählen
- Text Spanish=Seleccione componentes
- Text Italian=Selezionare i componenti
- end
- item: If/While Statement
- Variable=DOBACKUP
- Value=B
- end
- item: Set Control Attribute
- Control Name=BACK3
- Operation=1
- end
- item: Set Control Attribute
- Control Name=BACK4
- Operation=1
- end
- item: Else Statement
- end
- item: Set Control Attribute
- Control Name=BACK3
- end
- item: Set Control Attribute
- Control Name=BACK4
- end
- item: End Block
- end
- end
- item: Dialog
- Title=Select Destination Directory
- Title French=Choisissez le répertoire de destination
- Title German=Zielverzeichnis wählen
- Title Portuguese=Seleccionar Directório de Destino
- Title Spanish=Seleccione el Directorio de Destino
- Title Italian=Seleziona Directory di destinazione
- Title Danish=Vælg Destinationsbibliotek
- Title Dutch=Kies Doeldirectory
- Title Norwegian=Velg målkatalog
- Title Swedish=Välj destinationskalatog
- Width=276
- Height=216
- Font Name=Helv
- Font Size=8
- item: Listbox
- Rectangle=6 3 200 186
- Variable=BACKUP
- Create Flags=01010000100000010000000101000000
- Flags=0000110000100010
- Text=%BACKUP%
- Text=
- Text French=%BACKUP%
- Text French=
- Text German=%BACKUP%
- Text German=
- Text Portuguese=%BACKUP%
- Text Portuguese=
- Text Spanish=%BACKUP%
- Text Spanish=
- Text Italian=%BACKUP%
- Text Italian=
- Text Danish=%BACKUP%
- Text Danish=
- Text Dutch=%BACKUP%
- Text Dutch=
- Text Norwegian=%BACKUP%
- Text Norwegian=
- Text Swedish=%BACKUP%
- Text Swedish=
- end
- item: Push Button
- Rectangle=209 8 265 26
- Create Flags=01010000000000010000000000000001
- Text=OK
- Text French=OK
- Text German=OK
- Text Portuguese=OK
- Text Spanish=ACEPTAR
- Text Italian=OK
- Text Danish=OK
- Text Dutch=OK
- Text Norwegian=OK
- Text Swedish=OK
- end
- item: Push Button
- Rectangle=209 31 265 50
- Variable=BACKUP
- Value=%BACKUP_SAVE%
- Create Flags=01010000000000010000000000000000
- Flags=0000000000000001
- Text=Cancel
- Text French=Annuler
- Text German=Abbrechen
- Text Portuguese=Cancelar
- Text Spanish=Cancelar
- Text Italian=Annulla
- Text Danish=Slet
- Text Dutch=Annuleren
- Text Norwegian=Avbryt
- Text Swedish=Avbryt
- end
- end
-end
-item: Custom Dialog Set
- Name=Select Components
- Display Variable=DISPLAY
- item: Dialog
- Title=%APPTITLE% Installation
- Title French=Installation de %APPTITLE%
- Title German=Installation von %APPTITLE%
- Title Spanish=Instalación de %APPTITLE%
- Title Italian=Installazione di %APPTITLE%
- Width=339
- Height=280
- Font Name=Helv
- Font Size=8
- item: Push Button
- Rectangle=188 234 244 253
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=&Next >
- Text French=&Suite >
- Text German=&Weiter >
- Text Spanish=&Siguiente >
- Text Italian=&Avanti >
- end
- item: Push Button
- Rectangle=131 234 188 253
- Variable=DIRECTION
- Value=B
- Create Flags=01010000000000010000000000000000
- Text=< &Back
- Text French=< &Retour
- Text German=< &Zurück
- Text Spanish=< &Atrás
- Text Italian=< &Indietro
- end
- item: Push Button
- Rectangle=264 234 320 253
- Action=3
- Create Flags=01010000000000010000000000000000
- Text=&Cancel
- Text French=&Annuler
- Text German=&Abbrechen
- Text Spanish=&Cancelar
- Text Italian=&Annulla
- end
- item: Checkbox
- Rectangle=108 66 313 156
- Variable=COMPONENTS
- Create Flags=01010000000000010000000000000011
- Flags=0000000000000110
- Text=Python interpreter and libraries
- Text=Tcl/Tk (Tkinter, IDLE, pydoc)
- Text=Python HTML docs
- Text=Python utility scripts (Tools/)
- Text=Python test suite (Lib/test/)
- Text=
- Text French=Python interpreter, library and IDLE
- Text French=Python HTML docs
- Text French=Python utility scripts (Tools/)
- Text French=Python test suite (Lib/test/)
- Text French=
- Text German=Python interpreter, library and IDLE
- Text German=Python HTML docs
- Text German=Python utility scripts (Tools/)
- Text German=Python test suite (Lib/test/)
- Text German=
- Text Spanish=Python interpreter, library and IDLE
- Text Spanish=Python HTML docs
- Text Spanish=Python utility scripts (Tools/)
- Text Spanish=Python test suite (Lib/test/)
- Text Spanish=
- Text Italian=Python interpreter, library and IDLE
- Text Italian=Python HTML docs
- Text Italian=Python utility scripts (Tools/)
- Text Italian=Python test suite (Lib/test/)
- Text Italian=
- end
- item: Static
- Rectangle=108 45 320 63
- Create Flags=01010000000000000000000000000000
- Text=Choose which components to install by checking the boxes below.
- Text French=Choisissez les composants que vous voulez installer en cochant les cases ci-dessous.
- Text German=Wählen Sie die zu installierenden Komponenten, indem Sie in die entsprechenden Kästchen klicken.
- Text Spanish=Elija los componentes que desee instalar marcando los cuadros de abajo.
- Text Italian=Scegliere quali componenti installare selezionando le caselle sottostanti.
- end
- item: Push Button
- Rectangle=188 203 269 220
- Destination Dialog=1
- Action=2
- Enabled Color=00000000000000000000000011111111
- Create Flags=01010000000000010000000000000000
- Text=Advanced Options ...
- end
- item: Static
- Rectangle=10 225 320 226
- Action=3
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Rectangle=108 10 323 43
- Create Flags=01010000000000000000000000000000
- Flags=0000000000000001
- Name=Times New Roman
- Font Style=-24 0 0 0 700 255 0 0 0 3 2 1 18
- Text=Select Components
- Text French=Sélectionner les composants
- Text German=Komponenten auswählen
- Text Spanish=Seleccione componentes
- Text Italian=Selezionare i componenti
- end
- item: Static
- Rectangle=251 180 311 193
- Variable=COMPONENTS
- Value=MAINDIR
- Create Flags=01010000000000000000000000000010
- end
- item: Static
- Rectangle=251 168 311 179
- Variable=COMPONENTS
- Create Flags=01010000000000000000000000000010
- end
- item: Static
- Rectangle=123 168 234 181
- Create Flags=01010000000000000000000000000000
- Text=Disk Space Required:
- Text French=Espace disque requis :
- Text German=Notwendiger Speicherplatz:
- Text Spanish=Espacio requerido en el disco:
- Text Italian=Spazio su disco necessario:
- end
- item: Static
- Rectangle=123 180 234 193
- Create Flags=01010000000000000000000000000000
- Text=Disk Space Remaining:
- Text French=Espace disque disponible :
- Text German=Verbleibender Speicherplatz:
- Text Spanish=Espacio en disco disponible:
- Text Italian=Spazio su disco disponibile:
- end
- item: Static
- Rectangle=108 158 320 196
- Action=1
- Create Flags=01010000000000000000000000000111
- end
- item: If/While Statement
- Variable=DLG_EVENT_TYPE
- Value=VERIFY
- end
- item: Remark
- Text=If they're installing Tcl/Tk, Tools, or the test suite, doesn't make much sense unless they're installing Python too.
- end
- item: If/While Statement
- Variable=COMPONENTS
- Value=BDE
- Flags=00001010
- end
- item: If/While Statement
- Variable=COMPONENTS
- Value=A
- Flags=00000011
- end
- item: Display Message
- Title=Are you sure?
- Text=Installing Tcl/Tk, Tools or the test suite doesn't make much sense unless you install the Python interpreter and libraries too.
- Text=
- Text=Click Yes if that's really what you want.
- Flags=00101101
- end
- item: Remark
- Text=Nothing -- just proceed to the next dialog.
- end
- item: Else Statement
- end
- item: Remark
- Text=Return to the dialog.
- end
- item: Set Variable
- Variable=DLG_EVENT_TYPE
- end
- item: End Block
- end
- item: End Block
- end
- item: End Block
- end
- item: End Block
- end
- end
- item: Dialog
- Title=Advanced Options
- Width=339
- Height=213
- Font Name=Helv
- Font Size=8
- item: Radio Button
- Control Name=ADMIN2
- Rectangle=11 46 90 76
- Variable=SELECT_ADMIN
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000010000000000001001
- Text=Admin install
- Text=Non-Admin installl
- Text=
- end
- item: Push Button
- Rectangle=188 170 244 189
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=OK
- Text French=&Suite >
- Text German=&Weiter >
- Text Spanish=&Siguiente >
- Text Italian=&Avanti >
- end
- item: Static
- Rectangle=5 3 326 83
- Action=1
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Control Name=ADMIN1
- Rectangle=11 11 321 45
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000000000
- Text=By default, the install records settings in the per-machine area of the registry (HKLM), and installs the Python and C runtime DLLs to %SYS32%. Choose "Non-Admin install" if you would prefer settings made in the per-user registry (HKCU), and DLLs installed in %MAINDIR%.
- end
- item: Static
- Rectangle=5 90 326 157
- Action=1
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000000111
- end
- item: Checkbox
- Rectangle=11 121 243 151
- Variable=TASKS
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000010000000000000011
- Text=Register file extensions (.py, .pyw, .pyc, .pyo)
- Text=Create Start Menu shortcuts
- Text=
- end
- item: Static
- Rectangle=11 103 320 121
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000000000
- Text=Choose tasks to perform by checking the boxes below.
- end
- item: If/While Statement
- Variable=DLG_EVENT_TYPE
- Value=INIT
- end
- item: If/While Statement
- Variable=DOADMIN
- Value=1
- end
- item: Set Control Attribute
- Control Name=ADMIN2
- end
- item: Else Statement
- end
- item: Set Control Text
- Control Name=ADMIN1
- Control Text=This section is available only if logged in to an account with Administrator privileges.
- end
- item: Set Control Attribute
- Control Name=ADMIN2
- Operation=1
- end
- item: End Block
- end
- item: End Block
- end
- end
-end
-item: Custom Dialog Set
- Name=Select Program Manager Group
- Display Variable=DISPLAY
- item: Dialog
- Title=%APPTITLE% Installation
- Title French=Installation de %APPTITLE%
- Title German=Installation von %APPTITLE%
- Title Spanish=Instalación de %APPTITLE%
- Title Italian=Installazione di %APPTITLE%
- Width=339
- Height=280
- Font Name=Helv
- Font Size=8
- item: Push Button
- Rectangle=188 234 244 253
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=&Next >
- Text French=&Suite >
- Text German=&Weiter >
- Text Spanish=&Siguiente >
- Text Italian=&Avanti >
- end
- item: Push Button
- Rectangle=131 234 188 253
- Variable=DIRECTION
- Value=B
- Create Flags=01010000000000010000000000000000
- Flags=0000000000000001
- Text=< &Back
- Text French=< &Retour
- Text German=< &Zurück
- Text Spanish=< &Atrás
- Text Italian=< &Indietro
- end
- item: Push Button
- Rectangle=264 234 320 253
- Action=3
- Create Flags=01010000000000010000000000000000
- Text=&Cancel
- Text French=&Annuler
- Text German=&Abbrechen
- Text Spanish=&Cancelar
- Text Italian=&Annulla
- end
- item: Static
- Rectangle=10 225 320 226
- Action=3
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Rectangle=108 10 323 53
- Create Flags=01010000000000000000000000000000
- Flags=0000000000000001
- Name=Times New Roman
- Font Style=-24 0 0 0 700 255 0 0 0 3 2 1 18
- Text=Select Start Menu Group
- Text French=Sélectionner le groupe du Gestionnaire de programme
- Text German=Bestimmung der Programm-Managergruppe
- Text Spanish=Seleccione grupo del Administrador de programas
- Text Italian=Selezionare il gruppo ProgMan
- end
- item: Static
- Rectangle=108 35 320 65
- Create Flags=01010000000000000000000000000000
- Text=Enter the name of the Start Menu program group to which to add the %APPTITLE% icons:
- Text French=Entrez le nom du groupe du Gestionnaire de programme dans lequel vous souhaitez ajouter les icônes de %APPTITLE% :
- Text German=Geben Sie den Namen der Programmgruppe ein, der das Symbol %APPTITLE% hinzugefügt werden soll:
- Text Spanish=Escriba el nombre del grupo del Administrador de programas en el que desea agregar los iconos de %APPTITLE%:
- Text Italian=Inserire il nome del gruppo Program Manager per aggiungere le icone %APPTITLE% a:
- end
- item: Combobox
- Rectangle=108 56 320 219
- Variable=GROUP
- Create Flags=01010000001000010000001100000001
- Flags=0000000000000001
- Text=%GROUP%
- Text=
- Text French=%GROUP%
- Text German=%GROUP%
- Text Spanish=%GROUP%
- Text Italian=%GROUP%
- end
- end
-end
-item: Custom Dialog Set
- Name=Start Installation
- Display Variable=DISPLAY
- item: Dialog
- Title=%APPTITLE% Installation
- Title French=Installation de %APPTITLE%
- Title German=Installation von %APPTITLE%
- Title Spanish=Instalación de %APPTITLE%
- Title Italian=Installazione di %APPTITLE%
- Width=339
- Height=280
- Font Name=Helv
- Font Size=8
- item: Push Button
- Rectangle=188 234 244 253
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=&Next >
- Text French=&Suite >
- Text German=&Weiter >
- Text Spanish=&Siguiente >
- Text Italian=&Avanti >
- end
- item: Push Button
- Rectangle=131 234 188 253
- Variable=DIRECTION
- Value=B
- Create Flags=01010000000000010000000000000000
- Text=< &Back
- Text French=< &Retour
- Text German=< &Zurück
- Text Spanish=< &Atrás
- Text Italian=< &Indietro
- end
- item: Push Button
- Rectangle=264 234 320 253
- Action=3
- Create Flags=01010000000000010000000000000000
- Text=&Cancel
- Text French=&Annuler
- Text German=&Abbrechen
- Text Spanish=&Cancelar
- Text Italian=&Annulla
- end
- item: Static
- Rectangle=10 225 320 226
- Action=3
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Rectangle=108 10 323 53
- Create Flags=01010000000000000000000000000000
- Flags=0000000000000001
- Name=Times New Roman
- Font Style=-24 0 0 0 700 255 0 0 0 3 2 1 18
- Text=Ready to Install!
- Text French=Prêt à installer !
- Text German=Installationsbereit!
- Text Spanish=¡Preparado para la instalación!
- Text Italian=Pronto per l'installazione!
- end
- item: Static
- Rectangle=108 40 320 62
- Create Flags=01010000000000000000000000000000
- Text=Click the Next button to install %APPTITLE%, or the Back button to change choices:
- Text French=Vous êtes maintenant prêt à installer les fichiers %APPTITLE%.
- Text French=
- Text French=Cliquez sur le bouton Suite pour commencer l'installation ou sur le bouton Retour pour entrer les informations d'installation à nouveau.
- Text German=Sie können %APPTITLE% nun installieren.
- Text German=
- Text German=Klicken Sie auf "Weiter", um mit der Installation zu beginnen. Klicken Sie auf "Zurück", um die Installationsinformationen neu einzugeben.
- Text Spanish=Ya está listo para instalar %APPTITLE%.
- Text Spanish=
- Text Spanish=Presione el botón Siguiente para comenzar la instalación o presione Atrás para volver a ingresar la información para la instalación.
- Text Italian=Ora è possibile installare %APPTITLE%.
- Text Italian=
- Text Italian=Premere il pulsante Avanti per avviare l'installazione o il pulsante Indietro per reinserire le informazioni di installazione.
- end
- item: Editbox
- Rectangle=108 66 324 219
- Help Context=16711681
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000100000000001100011000100
- Text=%SUMMARY%
- end
- end
-end
-item: Remark
-end
-item: If/While Statement
- Variable=DISPLAY
- Value=Select Destination Directory
-end
-item: Remark
- Text=User may have changed MAINDIR, so reset BACKUP to match.
-end
-item: Set Variable
- Variable=BACKUP
- Value=%MAINDIR%\BACKUP
-end
-item: End Block
-end
-item: Remark
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=BEGIN WIZARD STUFF -----------------------------------------------------------------------------------------------------------------------------
-end
-item: Remark
- Text=When the BACKUP feature is enabled, the BACKUPDIR is initialized
-end
-item: If/While Statement
- Variable=DOBACKUP
- Value=A
-end
-item: Set Variable
- Variable=BACKUPDIR
- Value=%BACKUP%
-end
-item: End Block
-end
-item: Remark
- Text=The BRANDING information is written to the INI file on the installation media.
-end
-item: If/While Statement
- Variable=BRANDING
- Value=1
-end
-item: If/While Statement
- Variable=DOBRAND
- Value=1
-end
-item: Edit INI File
- Pathname=%INST%\CUSTDATA.INI
- Settings=[Registration]
- Settings=NAME=%NAME%
- Settings=COMPANY=%COMPANY%
- Settings=
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
- Text=Begin writing to the INSTALL.LOG
-end
-item: Open/Close INSTALL.LOG
-end
-item: Remark
- Text=Check free disk space calculates free disk space as well as component sizes.
-end
-item: Remark
- Text=It should be located before all Install File actions.
-end
-item: Check Disk Space
- Component=COMPONENTS
-end
-item: Remark
- Text=This include script allows uninstall support
-end
-item: Remark
- Text=Note from Tim: this is our own Uninstal.wse, a copy of Wise's except
-end
-item: Remark
- Text=it writes to HKCU (instead of HKLM) if the user doesn't have admin privs.
-end
-item: Include Script
- Pathname=.\Uninstal.wse
-end
-item: Remark
- Text=Note from Tim: these seeming no-ops actually convert to short filenames.
-end
-item: Set Variable
- Variable=COMMON
- Value=%COMMON%
- Flags=00010100
-end
-item: Set Variable
- Variable=MAINDIR
- Value=%MAINDIR%
- Flags=00010100
-end
-item: Remark
- Text=This IF/THEN/ELSE reads the correct registry entries for shortcut/icon placement
-end
-item: Check Configuration
- Flags=10111011
-end
-item: Get Registry Key Value
- Variable=STARTUPDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%WIN%\Start Menu\Programs\StartUp
- Value Name=StartUp
- Flags=00000010
-end
-item: Get Registry Key Value
- Variable=DESKTOPDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%WIN%\Desktop
- Value Name=Desktop
- Flags=00000010
-end
-item: Get Registry Key Value
- Variable=STARTMENUDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%WIN%\Start Menu
- Value Name=Start Menu
- Flags=00000010
-end
-item: Get Registry Key Value
- Variable=GROUPDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%WIN%\Start Menu\Programs
- Value Name=Programs
- Flags=00000010
-end
-item: Get Registry Key Value
- Variable=CSTARTUPDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%STARTUPDIR%
- Value Name=Common Startup
- Flags=00000100
-end
-item: Get Registry Key Value
- Variable=CDESKTOPDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%DESKTOPDIR%
- Value Name=Common Desktop
- Flags=00000100
-end
-item: Get Registry Key Value
- Variable=CSTARTMENUDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%STARTMENUDIR%
- Value Name=Common Start Menu
- Flags=00000100
-end
-item: Get Registry Key Value
- Variable=CGROUPDIR
- Key=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
- Default=%GROUPDIR%
- Value Name=Common Programs
- Flags=00000100
-end
-item: Else Statement
-end
-item: Remark
- Text=Note from Tim: the Wizard left this block empty!
-end
-item: Remark
- Text=Perhaps it's only relevant on Windows 3.1.
-end
-item: End Block
-end
-item: Remark
- Text=END WIZARD STUFF -----------------------------------------------------------------------------------------------------------------------------
-end
-item: Remark
-end
-item: If/While Statement
- Variable=SELECT_ADMIN
- Value=B
-end
-item: Remark
- Text=The user chose a non-admin install in "Advanced Options".
-end
-item: Remark
- Text=This should come after the include of Uninstal.wse above, because
-end
-item: Remark
- Text=writing uninstall info to HKCU is ineffective except under Win2K.
-end
-item: Set Variable
- Variable=DOADMIN
- Value=0
-end
-item: End Block
-end
-item: Remark
-end
-item: Set Variable
- Variable=CGROUP_SAVE
- Value=%GROUP%
-end
-item: If/While Statement
- Variable=TASKS
- Value=B
- Flags=00000010
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=1
-end
-item: Set Variable
- Variable=GROUP
- Value=%CGROUPDIR%\%GROUP%
-end
-item: Else Statement
-end
-item: Set Variable
- Variable=GROUP
- Value=%GROUPDIR%\%GROUP%
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=Long section to install files.
-end
-item: Remark
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=1
-end
-item: Set Variable
- Variable=DLLDEST
- Value=%SYS32%
-end
-item: Else Statement
-end
-item: Set Variable
- Variable=DLLDEST
- Value=%MAINDIR%
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=Install the license even if they deselect everything <wink>.
-end
-item: Install File
- Source=..\license
- Destination=%MAINDIR%\LICENSE.txt
- Flags=0000000000000010
-end
-item: Install File
- Source=..\readme
- Destination=%MAINDIR%\README.txt
- Flags=0000000000000010
-end
-item: Install File
- Source=..\misc\news
- Destination=%MAINDIR%\NEWS.txt
- Flags=0000000000000010
-end
-item: Remark
- Text=Icons -- always install so that the uninstaller can use them for its own display.
-end
-item: Install File
- Source=..\pc\pycon.ico
- Destination=%MAINDIR%\pycon.ico
- Flags=0000000010000010
-end
-item: Install File
- Source=..\pc\pyc.ico
- Destination=%MAINDIR%\pyc.ico
- Flags=0000000010000010
-end
-item: Install File
- Source=..\pc\py.ico
- Destination=%MAINDIR%\py.ico
- Flags=0000000010000010
-end
-item: Remark
-end
-item: Remark
- Text=These arrange to (recursively!) delete all .pyc and .pyo files at uninstall time.
-end
-item: Remark
- Text=This "does the right thing": any directories left empty at the end are removed.
-end
-item: Add Text to INSTALL.LOG
- Text=File Tree: %MAINDIR%\*.pyc
-end
-item: Add Text to INSTALL.LOG
- Text=File Tree: %MAINDIR%\*.pyo
-end
-item: Remark
-end
-item: Remark
- Text=A: interpreter and libraries
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=A
- Flags=00000010
-end
-item: Remark
- Text=Executables
-end
-item: Install File
- Source=.\python.exe
- Destination=%MAINDIR%\python.exe
- Flags=0000000000000010
-end
-item: Install File
- Source=.\pythonw.exe
- Destination=%MAINDIR%\pythonw.exe
- Flags=0000000000000010
-end
-item: Install File
- Source=.\w9xpopen.exe
- Destination=%MAINDIR%\w9xpopen.exe
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=Extension module DLLs (.pyd); keep in synch with libs directory next
-end
-item: Install File
- Source=.\winreg.pyd
- Destination=%MAINDIR%\DLLs\winreg.pyd
- Description=Extension modules
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_csv.pyd
- Destination=%MAINDIR%\DLLs\_csv.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_sre.pyd
- Destination=%MAINDIR%\DLLs\_sre.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_ssl.pyd
- Destination=%MAINDIR%\DLLs\_ssl.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_symtable.pyd
- Destination=%MAINDIR%\DLLs\_symtable.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_testcapi.pyd
- Destination=%MAINDIR%\DLLs\_testcapi.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_tkinter.pyd
- Destination=%MAINDIR%\DLLs\_tkinter.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_socket.pyd
- Destination=%MAINDIR%\DLLs\_socket.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\bz2.pyd
- Destination=%MAINDIR%\DLLs\bz2.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\datetime.pyd
- Destination=%MAINDIR%\DLLs\datetime.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\mmap.pyd
- Destination=%MAINDIR%\DLLs\mmap.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\parser.pyd
- Destination=%MAINDIR%\DLLs\parser.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\pyexpat.pyd
- Destination=%MAINDIR%\DLLs\pyexpat.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\select.pyd
- Destination=%MAINDIR%\DLLs\select.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\unicodedata.pyd
- Destination=%MAINDIR%\DLLs\unicodedata.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\winsound.pyd
- Destination=%MAINDIR%\DLLs\winsound.pyd
- Flags=0000000000000010
-end
-item: Install File
- Source=.\zlib.pyd
- Destination=%MAINDIR%\DLLs\zlib.pyd
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=Link libraries (.lib); keep in synch with DLLs above, except that the Python lib lives here.
-end
-item: Install File
- Source=.\winreg.lib
- Destination=%MAINDIR%\libs\winreg.lib
- Description=Link library files
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_csv.lib
- Destination=%MAINDIR%\libs\_csv.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_sre.lib
- Destination=%MAINDIR%\libs\_sre.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_ssl.lib
- Destination=%MAINDIR%\libs\_ssl.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_symtable.lib
- Destination=%MAINDIR%\libs\_symtable.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_testcapi.lib
- Destination=%MAINDIR%\libs\_testcapi.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_tkinter.lib
- Destination=%MAINDIR%\libs\_tkinter.lib
- Description=Extension modules
- Flags=0000000000000010
-end
-item: Install File
- Source=.\_socket.lib
- Destination=%MAINDIR%\libs\_socket.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\bz2.lib
- Destination=%MAINDIR%\libs\bz2.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\datetime.lib
- Destination=%MAINDIR%\libs\datetime.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\mmap.lib
- Destination=%MAINDIR%\libs\mmap.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\parser.lib
- Destination=%MAINDIR%\libs\parser.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\pyexpat.lib
- Destination=%MAINDIR%\libs\pyexpat.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\select.lib
- Destination=%MAINDIR%\libs\select.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\unicodedata.lib
- Destination=%MAINDIR%\libs\unicodedata.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\winsound.lib
- Destination=%MAINDIR%\libs\winsound.lib
- Flags=0000000000000010
-end
-item: Install File
- Source=.\zlib.lib
- Destination=%MAINDIR%\libs\zlib.lib
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=.\python%_pymajor_%%_pyminor_%.lib
- Destination=%MAINDIR%\libs\python%_PYMAJOR_%%_PYMINOR_%.lib
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=Main Python DLL
-end
-item: Remark
- Text=Tell Wise it's OK to delete the Python DLL at uninstall time,
-end
-item: Remark
- Text=despite that we (may) write it into a system directory.
-end
-item: Add Text to INSTALL.LOG
- Text=Non-System File:
-end
-item: Install File
- Source=.\python%_pymajor_%%_pyminor_%.dll
- Destination=%DLLDEST%\python%_PYMAJOR_%%_PYMINOR_%.dll
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=Libraries (Lib/)
-end
-item: Install File
- Source=..\lib\*.py
- Destination=%MAINDIR%\Lib
- Description=Library Modules
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\compiler\*.py
- Destination=%MAINDIR%\Lib\compiler
- Description=Python compiler written in Python
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\distutils\*.py
- Destination=%MAINDIR%\Lib\distutils
- Description=Distribution utility modules
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\distutils\readme
- Destination=%MAINDIR%\Lib\distutils\README.txt
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\distutils\command\*.py
- Destination=%MAINDIR%\Lib\distutils\command
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\distutils\command\wininst.exe
- Destination=%MAINDIR%\Lib\distutils\command\wininst.exe
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\distutils\command\command_template
- Destination=%MAINDIR%\Lib\distutils\command\command_template
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\email\*.py
- Destination=%MAINDIR%\Lib\email
- Description=Library email package
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\email\test\*.py
- Destination=%MAINDIR%\Lib\email\test
- Description=email tests
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\email\test\data\*.txt
- Destination=%MAINDIR%\Lib\email\test\data
- Description=email test data
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\email\test\data\*.gif
- Destination=%MAINDIR%\Lib\email\test\data
- Description=email test data
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\email\test\data\*.au
- Destination=%MAINDIR%\Lib\email\test\data
- Description=email test data
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\encodings\*.py
- Destination=%MAINDIR%\Lib\encodings
- Description=Unicode encoding tables
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\hotshot\*.py
- Destination=%MAINDIR%\Lib\hotshot
- Description=Fast Python profiler
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\lib-old\*.py
- Destination=%MAINDIR%\Lib\lib-old
- Description=Obsolete modules
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\tkinter\*.py
- Destination=%MAINDIR%\Lib\tkinter
- Description=Tkinter related library modules
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\logging\*.py
- Destination=%MAINDIR%\Lib\logging
- Description=Logging package
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\site-packages\readme
- Destination=%MAINDIR%\Lib\site-packages\README.txt
- Description=Site packages
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\xml\*.py
- Destination=%MAINDIR%\Lib\xml
- Description=XML support packages
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\xml\dom\*.py
- Destination=%MAINDIR%\Lib\xml\dom
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\xml\parsers\*.py
- Destination=%MAINDIR%\Lib\xml\parsers
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\xml\sax\*.py
- Destination=%MAINDIR%\Lib\xml\sax
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=C Include files
-end
-item: Install File
- Source=..\include\*.h
- Destination=%MAINDIR%\include
- Description=Header files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\pc\pyconfig.h
- Destination=%MAINDIR%\include\pyconfig.h
- Description=Header files (pyconfig.h)
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=Microsoft C runtime libraries
-end
-item: Install File
- Source=%_SYS_%\MSVCIRT.DLL
- Destination=%DLLDEST%\MSVCIRT.DLL
- Description=Visual C++ Runtime DLLs
- Flags=0000011000010011
-end
-item: Install File
- Source=%_SYS_%\MSVCRT.DLL
- Destination=%DLLDEST%\MSVCRT.DLL
- Description=Visual C++ Runtime DLLs
- Flags=0000011000010011
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=B: Tcl/Tk (Tkinter, IDLE, pydoc)
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=B
- Flags=00000010
-end
-item: Remark
- Text=Tcl/Tk
-end
-item: Install File
- Source=..\..\%_tcldir_%\bin\*.dll
- Destination=%MAINDIR%\DLLs
- Description=Tcl/Tk binaries and libraries
- Flags=0000000000000010
-end
-item: Install File
- Source=..\..\%_tcldir_%\lib\*.*
- Destination=%MAINDIR%\tcl
- Description=Tcl/Tk binaries and libraries
- Flags=0000000100000010
-end
-item: Remark
-end
-item: Remark
- Text=IDLE
-end
-item: Install File
- Source=..\Lib\idlelib\*.py
- Destination=%MAINDIR%\Lib\idlelib
- Description=Integrated DeveLopment Environment for Python
- Flags=0000000000000010
-end
-item: Install File
- Source=..\Lib\idlelib\*.txt
- Destination=%MAINDIR%\Lib\idlelib
- Description=Integrated DeveLopment Environment for Python
- Flags=0000000000000010
-end
-item: Install File
- Source=..\Lib\idlelib\*.def
- Destination=%MAINDIR%\Lib\idlelib
- Description=Integrated DeveLopment Environment for Python
- Flags=0000000000000010
-end
-item: Install File
- Source=..\Lib\idlelib\Icons\*
- Destination=%MAINDIR%\Lib\idlelib\Icons
- Description=Integrated DeveLopment Environment for Python
- Flags=0000000000000010
-end
-item: Install File
- Source=..\Tools\scripts\idle
- Destination=%MAINDIR%\Lib\idlelib\idle.pyw
- Description=IDLE bootstrap script
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Remark
- Text=Windows pydoc driver
-end
-item: Install File
- Source=..\tools\scripts\*.pyw
- Destination=%MAINDIR%\Tools\Scripts
- Description=Windows pydoc driver
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=C: docs
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=C
- Flags=00000010
-end
-item: Install File
- Source=%_DOC_%\*.*
- Destination=%MAINDIR%\Doc
- Description=Python Documentation (HTML)
- Flags=0000000100000010
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=D: tools
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=D
- Flags=00000010
-end
-item: Install File
- Source=..\tools\scripts\*.py
- Destination=%MAINDIR%\Tools\Scripts
- Description=Utility Scripts
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\scripts\*.doc
- Destination=%MAINDIR%\Tools\Scripts
- Description=Utility Scripts
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\scripts\readme
- Destination=%MAINDIR%\Tools\Scripts\README.txt
- Description=Utility Scripts
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\tools\webchecker\*.py
- Destination=%MAINDIR%\Tools\webchecker
- Description=Web checker tool
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\webchecker\readme
- Destination=%MAINDIR%\Tools\webchecker\README.txt
- Description=Web checker tool
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\tools\versioncheck\*.py
- Destination=%MAINDIR%\Tools\versioncheck
- Description=Version checker tool
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\versioncheck\readme
- Destination=%MAINDIR%\Tools\versioncheck\README.txt
- Description=Version checker tool
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\tools\pynche\*.py
- Destination=%MAINDIR%\Tools\pynche
- Description=pynche color editor
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\pynche\*.txt
- Destination=%MAINDIR%\Tools\pynche
- Description=pynche color editor
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\pynche\x\*.txt
- Destination=%MAINDIR%\Tools\pynche\X
- Description=pynche color editor - X files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\tools\pynche\readme
- Destination=%MAINDIR%\Tools\pynche\README.txt
- Description=pynche color editor - README
- Flags=0000000100000010
-end
-item: Install File
- Source=..\tools\pynche\pynche
- Destination=%MAINDIR%\Tools\pynche\pynche.py
- Description=pynche color editor - main
- Flags=0000000100000010
-end
-item: Install File
- Source=..\tools\pynche\pynche.pyw
- Destination=%MAINDIR%\Tools\pynche\pynche.pyw
- Description=pynche color editor - noconsole main
- Flags=0000000100000010
-end
-item: Remark
-end
-item: Install File
- Source=..\tools\i18n\*.py
- Destination=%MAINDIR%\Tools\i18n
- Description=Internationalization helpers
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=E: test suite
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=E
- Flags=00000010
-end
-item: Install File
- Source=..\lib\test\audiotest.au
- Destination=%MAINDIR%\Lib\test\audiotest.au
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.uue
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.py
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.xml
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.out
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.bz2
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.tar
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.gz
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Install File
- Source=..\lib\test\*.txt
- Destination=%MAINDIR%\Lib\test
- Description=Python Test files
- Flags=0000000000000010
-end
-item: Remark
-end
-item: Install File
- Source=..\lib\test\output\*.*
- Destination=%MAINDIR%\Lib\test\output
- Description=Python Test output files
- Flags=0000000000000010
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=DONE with file copying.
-end
-item: Remark
- Text=The rest is registry and Start Menu fiddling.
-end
-item: Remark
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=A
- Flags=00000010
-end
-item: If/While Statement
- Variable=TASKS
- Value=A
- Flags=00000010
-end
-item: Remark
- Text=Register file extensions. As usual, Admin privs get in the way, but with a twist:
-end
-item: Remark
- Text=You don't need admin privs to write to HKEY_CLASSES_ROOT *except* under Win2K.
-end
-item: Remark
- Text=On Win2K, a user without Admin privs has to register extensions under HKCU\Software\CLASSES instead.
-end
-item: Remark
- Text=But while you can *do* that under other flavors of Windows too, it has no useful effect except in Win2K.
-end
-item: Set Variable
- Variable=USE_HKCR
- Value=1
-end
-item: Check Configuration
- Flags=11110010
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=0
-end
-item: Set Variable
- Variable=USE_HKCR
- Value=0
-end
-item: End Block
-end
-item: End Block
-end
-item: If/While Statement
- Variable=USE_HKCR
- Value=1
-end
-item: Remark
- Text=File types.
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.File
- New Value=Python File
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.File\shell\open\command
- New Value=%MAINDIR%\python.exe "%%1" %%*
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.File\DefaultIcon
- New Value=%MAINDIR%\Py.ico
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.NoConFile
- New Value=Python File (no console)
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.NoConFile\shell\open\command
- New Value=%MAINDIR%\pythonw.exe "%%1" %%*
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.NoConFile\DefaultIcon
- New Value=%MAINDIR%\Py.ico
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.CompiledFile
- New Value=Compiled Python File
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.CompiledFile\shell\open\command
- New Value=%MAINDIR%\python.exe "%%1" %%*
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.CompiledFile\DefaultIcon
- New Value=%MAINDIR%\pyc.ico
-end
-item: Remark
-end
-item: Remark
- Text=File extensions.
-end
-item: Edit Registry
- Total Keys=1
- Key=.py
- New Value=Python.File
-end
-item: Edit Registry
- Total Keys=1
- Key=.py
- New Value=text/plain
- Value Name=Content Type
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=.pyw
- New Value=Python.NoConFile
-end
-item: Edit Registry
- Total Keys=1
- Key=.pyw
- New Value=text/plain
- Value Name=Content Type
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=.pyc
- New Value=Python.CompiledFile
-end
-item: Edit Registry
- Total Keys=1
- Key=.pyo
- New Value=Python.CompiledFile
-end
-item: Else Statement
-end
-item: Remark
- Text=File types.
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.File
- New Value=Python File
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.File\shell\open\command
- New Value=%MAINDIR%\python.exe "%%1" %%*
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.File\DefaultIcon
- New Value=%MAINDIR%\Py.ico
- Root=1
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.NoConFile
- New Value=Python File (no console)
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.NoConFile\shell\open\command
- New Value=%MAINDIR%\pythonw.exe "%%1" %%*
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.NoConFile\DefaultIcon
- New Value=%MAINDIR%\Py.ico
- Root=1
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.CompiledFile
- New Value=Compiled Python File
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.CompiledFile\shell\open\command
- New Value=%MAINDIR%\python.exe "%%1" %%*
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.CompiledFile\DefaultIcon
- New Value=%MAINDIR%\pyc.ico
- Root=1
-end
-item: Remark
-end
-item: Remark
- Text=File extensions.
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\.py
- New Value=Python.File
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\.py
- New Value=text/plain
- Value Name=Content Type
- Root=1
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\.pyw
- New Value=Python.NoConFile
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\.pyw
- New Value=text/plain
- Value Name=Content Type
- Root=1
-end
-item: Remark
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\.pyc
- New Value=Python.CompiledFile
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\.pyo
- New Value=Python.CompiledFile
- Root=1
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=If we're installing IDLE, also set an Edit context menu action to use IDLE, for .py and .pyw files.
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=B
- Flags=00000010
-end
-item: If/While Statement
- Variable=USE_HKCR
- Value=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.NoConFile\shell\Edit with IDLE\command
- New Value=%MAINDIR%\pythonw.exe %MAINDIR%\Lib\idlelib\idle.pyw -n -e "%%1"
-end
-item: Edit Registry
- Total Keys=1
- Key=Python.File\shell\Edit with IDLE\command
- New Value=%MAINDIR%\pythonw.exe %MAINDIR%\Lib\idlelib\idle.pyw -n -e "%%1"
-end
-item: Else Statement
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.NoConFile\shell\Edit with IDLE\command
- New Value=%MAINDIR%\pythonw.exe %MAINDIR%\Lib\idlelib\idle.pyw -n -e "%%1"
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\CLASSES\Python.File\shell\Edit with IDLE\command
- New Value=%MAINDIR%\pythonw.exe %MAINDIR%\Lib\idlelib\idle.pyw -n -e "%%1"
- Root=1
-end
-item: End Block
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=Register Python paths.
-end
-item: Remark
- Text=Write to HKLM for admin, else HKCU. Keep these blocks otherwise identical!
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\CurrentVersion
- Root=130
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\InstallPath
- New Value=%MAINDIR%
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\InstallPath\InstallGroup
- New Value=%CGROUP_SAVE%
- New Value=
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\PythonPath
- New Value=%MAINDIR%\Lib;%MAINDIR%\DLLs
- New Value=
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\Modules
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\App Paths\Python.exe
- New Value=%MAINDIR%\Python.exe
- Root=2
-end
-item: Else Statement
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\CurrentVersion
- Root=129
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\InstallPath
- New Value=%MAINDIR%
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\InstallPath\InstallGroup
- New Value=%CGROUP_SAVE%
- New Value=
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\PythonPath
- New Value=%MAINDIR%\Lib;%MAINDIR%\DLLs
- New Value=
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\Modules
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\App Paths\Python.exe
- New Value=%MAINDIR%\Python.exe
- Root=1
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=Registry fiddling for docs.
-end
-item: Remark
- Text=Write to HKLM for admin, else HKCU. Keep these blocks otherwise identical!
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=C
- Flags=00000010
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\Help\Main Python Documentation
- New Value=%MAINDIR%\Doc\index.html
- Root=2
-end
-item: Else Statement
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Python\PythonCore\%PY_VERSION%\Help\Main Python Documentation
- New Value=%MAINDIR%\Doc\index.html
- Root=1
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=Set the app publisher and URL entries for Win2K add/remove.
-end
-item: Remark
- Text=It doesn't hurt on other systems.
-end
-item: Remark
- Text=As usual, write to HKLM or HKCU depending on Admin privs.
-end
-item: Remark
- Text=CAUTION: If you set this info on the "Windows 2000" page (step 6) of the
-end
-item: Remark
- Text=Installation Expert, it only shows up in the "If" block below. Keep in synch!
-end
-item: If/While Statement
- Variable=DOADMIN
- Value=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=http://www.python.org/
- Value Name=HelpLink
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=PythonLabs at Zope Corporation
- Value Name=Publisher
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=http://www.python.org/
- Value Name=URLInfoAbout
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%PYVER_STRING%
- Value Name=DisplayVersion
- Root=2
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%MAINDIR%\py.ico,-0
- Value Name=DisplayIcon
- Root=2
-end
-item: Else Statement
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=http://www.python.org/
- Value Name=HelpLink
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=PythonLabs at Zope Corporation
- Value Name=Publisher
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=http://www.python.org/
- Value Name=URLInfoAbout
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%PYVER_STRING%
- Value Name=DisplayVersion
- Root=1
-end
-item: Edit Registry
- Total Keys=1
- Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
- New Value=%MAINDIR%\py.ico,-0
- Value Name=DisplayIcon
- Root=1
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=Populate Start Menu group
-end
-item: If/While Statement
- Variable=TASKS
- Value=B
- Flags=00000010
-end
-item: Remark
- Text=Shortcut to installer no matter what.
-end
-item: Create Shortcut
- Source=%MAINDIR%\unwise.exe
- Destination=%GROUP%\Uninstall Python.lnk
- Working Directory=%MAINDIR%
- Key Type=1536
- Flags=00000001
-end
-item: Remark
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=A
- Flags=00000010
-end
-item: Create Shortcut
- Source=%MAINDIR%\python.exe
- Destination=%GROUP%\Python (command line).lnk
- Working Directory=%MAINDIR%
- Icon Pathname=%MAINDIR%\pycon.ico
- Key Type=1536
- Flags=00000001
-end
-item: End Block
-end
-item: Remark
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=B
- Flags=00000010
-end
-item: Create Shortcut
- Source=%MAINDIR%\pythonw.exe
- Destination=%GROUP%\IDLE (Python GUI).lnk
- Command Options="%MAINDIR%\Lib\idlelib\idle.pyw"
- Working Directory=%MAINDIR%
- Key Type=1536
- Flags=00000001
-end
-item: Create Shortcut
- Source=%MAINDIR%\pythonw.exe
- Destination=%GROUP%\Module Docs.lnk
- Command Options="%MAINDIR%\Tools\Scripts\pydocgui.pyw"
- Working Directory=%MAINDIR%
- Key Type=1536
- Flags=00000001
-end
-item: End Block
-end
-item: Remark
-end
-item: If/While Statement
- Variable=COMPONENTS
- Value=C
- Flags=00000010
-end
-item: Create Shortcut
- Source=%MAINDIR%\Doc\index.html
- Destination=%GROUP%\Python Manuals.lnk
- Working Directory=%MAINDIR%
- Key Type=1536
- Flags=00000001
-end
-item: End Block
-end
-item: End Block
-end
-item: Remark
-end
-item: Remark
- Text=I don't think we need this, but have always done it.
-end
-item: Self-Register OCXs/DLLs
- Description=Updating System Configuration, Please Wait...
-end
-item: Remark
-end
-remarked item: Remark
- Text=Don't enable "Delete in-use files". Here's what happens:
-end
-remarked item: Remark
- Text=Install Python; uninstall Python; install Python again. Reboot the machine.
-end
-remarked item: Remark
- Text=Now UNWISE.EXE is missing. I think this is a Wise bug, but so it goes.
-end
-remarked item: Add Text to INSTALL.LOG
- Text=Delete in-use files: On
-end
-item: Remark
-end
-item: Wizard Block
- Direction Variable=DIRECTION
- Display Variable=DISPLAY
- Bitmap Pathname=.\installer.bmp
- X Position=9
- Y Position=10
- Filler Color=11173759
- Flags=00000011
-end
-item: Custom Dialog Set
- Name=Finished
- Display Variable=DISPLAY
- item: Dialog
- Title=%APPTITLE% Installation
- Title French=Installation de %APPTITLE%
- Title German=Installation von %APPTITLE%
- Title Spanish=Instalación de %APPTITLE%
- Title Italian=Installazione di %APPTITLE%
- Width=339
- Height=280
- Font Name=Helv
- Font Size=8
- item: Push Button
- Rectangle=188 234 244 253
- Variable=DIRECTION
- Value=N
- Create Flags=01010000000000010000000000000001
- Text=&Finish
- Text French=&Fin
- Text German=&Weiter
- Text Spanish=&Terminar
- Text Italian=&Fine
- end
- item: Push Button
- Rectangle=264 234 320 253
- Variable=DISABLED
- Value=!
- Action=3
- Create Flags=01010000000000010000000000000000
- Text=&Cancel
- Text French=&Annuler
- Text German=&Abbrechen
- Text Spanish=&Cancelar
- Text Italian=&Annulla
- end
- item: Static
- Rectangle=108 10 323 48
- Create Flags=01010000000000000000000000000000
- Flags=0000000000000001
- Name=Times New Roman
- Font Style=-24 0 0 0 700 255 0 0 0 3 2 1 18
- Text=Installation Completed!
- Text French=Installation terminée !
- Text German=Die Installation ist abgeschlossen!
- Text Spanish=¡Instalación terminada!
- Text Italian=Installazione completata!
- end
- item: Static
- Rectangle=108 44 320 82
- Create Flags=01010000000000000000000000000000
- Text=%APPTITLE% has been successfully installed.
- Text=
- Text=Press the Finish button to exit this installation.
- Text French=%APPTITLE% est maintenant installé.
- Text French=
- Text French=Cliquez sur le bouton Fin pour quitter l'installation.
- Text German=%APPTITLE% wurde erfolgreich installiert.
- Text German=
- Text German=Klicken Sie auf "Weiter", um die Installation zu beenden.
- Text Spanish=%APPTITLE% se ha instalado con éxito.
- Text Spanish=
- Text Spanish=Presione el botón Terminar para salir de esta instalación.
- Text Italian=L'installazione %APPTITLE% è stata portata a termine con successo.
- Text Italian=
- Text Italian=Premere il pulsante Fine per uscire dall'installazione.
- end
- item: Static
- Rectangle=10 225 320 226
- Action=3
- Create Flags=01010000000000000000000000000111
- end
- item: Static
- Rectangle=106 105 312 210
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000000000
- Text=Special Windows thanks to:
- Text=
- Text=Wise Solutions, for the use of InstallMaster 8.1.
- Text= http://www.wisesolutions.com/
- Text=
- Text=
- Text=LettError, Erik van Blokland, for the Python for Windows graphic.
- Text= http://www.letterror.com/
- Text=
- Text=
- Text=Mark Hammond, without whose years of freely shared Windows expertise, Python for Windows would still be Python for DOS.
- end
- item: Static
- Rectangle=106 95 312 96
- Action=3
- Enabled Color=00000000000000001111111111111111
- Create Flags=01010000000000000000000000001001
- end
- end
-end
-item: End Block
-end
-item: New Event
- Name=Cancel
-end
-item: Remark
- Text=This include script supports a rollback to preinstallation state if the user chooses to cancel before the installation is complete.
-end
-item: Include Script
- Pathname=%_WISE_%\INCLUDE\rollback.wse
-end
diff --git a/PC/VS7.1/pythoncore.vcproj b/PC/VS7.1/pythoncore.vcproj
deleted file mode 100644
index 05c4184..0000000
--- a/PC/VS7.1/pythoncore.vcproj
+++ /dev/null
@@ -1,826 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="pythoncore"
- ProjectGUID="{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA30}"
- RootNamespace="pythoncore"
- SccProjectName="pythoncore"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\pythoncore"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="/Zm200 "
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;USE_DL_EXPORT"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python33.dll"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python33.pdb"
- SubSystem="2"
- BaseAddress="0x1e000000"
- ImportLibrary=".\./python33.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="make_buildinfo.exe $(ConfigurationName)"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\..\Include"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\pythoncore"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="/Zm200 "
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;USE_DL_EXPORT;WIN32;_WINDOWS"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python33_d.dll"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python33_d.pdb"
- SubSystem="2"
- BaseAddress="0x1e000000"
- ImportLibrary=".\./python33_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="make_buildinfo.exe $(ConfigurationName)"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\..\Include"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\ia64-temp-release\pythoncore"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;USE_DL_EXPORT"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python33.dll"
- LinkIncremental="1"
- SuppressStartupBanner="FALSE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python33.pdb"
- SubSystem="2"
- BaseAddress="0x1e000000"
- ImportLibrary=".\./python33.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="make_buildinfo.exe $(ConfigurationName)"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\..\Include"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="./."
- IntermediateDirectory=".\amd64-temp-release\pythoncore"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions="/Zm200 /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS;USE_DL_EXPORT"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python33.dll"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python33.pdb"
- SubSystem="2"
- BaseAddress="0x1e000000"
- ImportLibrary=".\./python33.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="make_buildinfo.exe $(ConfigurationName)"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\..\Include"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="_io"
- Filter="">
- <File
- RelativePath="..\..\Modules\_io\fileio.c">
- </File>
- <File
- RelativePath="..\..\Modules\_io\bytesio.c">
- </File>
- <File
- RelativePath="..\..\Modules\_io\stringio.c">
- </File>
- <File
- RelativePath="..\..\Modules\_io\bufferedio.c">
- </File>
- <File
- RelativePath="..\..\Modules\_io\iobase.c">
- </File>
- <File
- RelativePath="..\..\Modules\_io\textio.c">
- </File>
- <File
- RelativePath="..\..\Modules\_io\_iomodule.c">
- </File>
- </Filter>
-
- <Filter
- Name="zlib"
- Filter="">
- <File
- RelativePath="..\..\Modules\zlib\adler32.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\compress.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\crc32.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\deflate.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\gzio.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\infback.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\inffast.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\inflate.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\inftrees.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\trees.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlib\uncompr.c">
- </File>
- <File
- RelativePath="..\..\Modules\zlibmodule.c">
- <FileConfiguration
- Name="Release|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Modules\zlib"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Modules\zlib"/>
- </FileConfiguration>
- <FileConfiguration
- Name="ReleaseItanium|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Modules\zlib"/>
- </FileConfiguration>
- <FileConfiguration
- Name="ReleaseAMD64|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Modules\zlib"/>
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\Modules\zlib\zutil.c">
- </File>
- </Filter>
- <File
- RelativePath="..\..\Modules\_bisectmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\_codecs_cn.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\_codecs_hk.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\_codecs_iso2022.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\_codecs_jp.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\_codecs_kr.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\_codecs_tw.c">
- </File>
- <File
- RelativePath="..\..\Modules\_codecsmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_collectionsmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_csv.c">
- </File>
- <File
- RelativePath="..\..\Modules\_datetimemodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_functoolsmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_heapqmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_json.c">
- </File>
- <File
- RelativePath="..\..\Modules\_localemodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_lsprof.c">
- </File>
- <File
- RelativePath="..\..\Modules\_math.c">
- </File>
- <File
- RelativePath="..\..\Modules\_pickle.c">
- </File>
- <File
- RelativePath="..\..\Modules\_randommodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\_sre.c">
- </File>
- <File
- RelativePath="..\..\Modules\_struct.c">
- </File>
- <File
- RelativePath="..\..\Pc\_subprocess.c">
- </File>
- <File
- RelativePath="..\..\Modules\_time.c">
- </File>
- <File
- RelativePath="..\..\Python\_warnings.c">
- </File>
- <File
- RelativePath="..\..\Modules\_weakref.c">
- </File>
- <File
- RelativePath="..\..\Objects\abstract.c">
- </File>
- <File
- RelativePath="..\..\Objects\accu.c">
- </File>
- <File
- RelativePath="..\..\Parser\acceler.c">
- </File>
- <File
- RelativePath="..\..\Modules\arraymodule.c">
- </File>
- <File
- RelativePath="..\..\Python\asdl.c">
- </File>
- <File
- RelativePath="..\..\Python\ast.c">
- </File>
- <File
- RelativePath="..\..\Modules\atexitmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\audioop.c">
- </File>
- <File
- RelativePath="..\..\Modules\binascii.c">
- </File>
- <File
- RelativePath="..\..\Parser\bitset.c">
- </File>
- <File
- RelativePath="..\..\Python\bltinmodule.c">
- </File>
- <File
- RelativePath="..\..\Objects\boolobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\bytes_methods.c">
- </File>
- <File
- RelativePath="..\..\Objects\bytearrayobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\bytesobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\capsule.c">
- </File>
- <File
- RelativePath="..\..\Objects\cellobject.c">
- </File>
- <File
- RelativePath="..\..\Python\ceval.c">
- </File>
- <File
- RelativePath="..\..\Objects\classobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\cmathmodule.c">
- </File>
- <File
- RelativePath="..\..\Python\codecs.c">
- </File>
- <File
- RelativePath="..\..\Objects\codeobject.c">
- </File>
- <File
- RelativePath="..\..\Python\compile.c">
- </File>
- <File
- RelativePath="..\..\Objects\complexobject.c">
- </File>
- <File
- RelativePath="..\..\PC\config.c">
- </File>
- <File
- RelativePath="..\..\Python\dynamic_annotations.c">
- </File>
- <File
- RelativePath="..\..\Objects\descrobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\dictobject.c">
- </File>
- <File
- RelativePath="..\..\PC\dl_nt.c">
- </File>
- <File
- RelativePath="..\..\Python\dtoa.c">
- </File>
- <File
- RelativePath="..\..\Python\dynload_win.c">
- </File>
- <File
- RelativePath="..\..\Objects\enumobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\errnomodule.c">
- </File>
- <File
- RelativePath="..\..\Python\errors.c">
- </File>
- <File
- RelativePath="..\..\Objects\exceptions.c">
- </File>
- <File
- RelativePath="..\..\Objects\fileobject.c">
- </File>
- <File
- RelativePath="..\..\Python\fileutils.c">
- </File>
- <File
- RelativePath="..\..\Parser\firstsets.c">
- </File>
- <File
- RelativePath="..\..\Objects\floatobject.c">
- </File>
- <File
- RelativePath="..\..\Python\formatter_unicode.c">
- </File>
- <File
- RelativePath="..\..\Objects\frameobject.c">
- </File>
- <File
- RelativePath="..\..\Python\formatter_unicode.c">
- </File>
- <File
- RelativePath="..\..\Python\frozen.c">
- </File>
- <File
- RelativePath="..\..\Objects\funcobject.c">
- </File>
- <File
- RelativePath="..\..\Python\future.c">
- </File>
- <File
- RelativePath="..\..\Modules\gcmodule.c">
- </File>
- <File
- RelativePath="..\..\Objects\genobject.c">
- </File>
- <File
- RelativePath="..\..\Python\getargs.c">
- </File>
- <File
- RelativePath="..\..\Python\getcompiler.c">
- </File>
- <File
- RelativePath="..\..\Python\getcopyright.c">
- </File>
- <File
- RelativePath="..\..\Python\getopt.c">
- </File>
- <File
- RelativePath="..\..\PC\getpathp.c">
- </File>
- <File
- RelativePath="..\..\Python\getplatform.c">
- </File>
- <File
- RelativePath="..\..\Python\getversion.c">
- </File>
- <File
- RelativePath="..\..\Python\graminit.c">
- </File>
- <File
- RelativePath="..\..\Parser\grammar.c">
- </File>
- <File
- RelativePath="..\..\Parser\grammar1.c">
- </File>
- <File
- RelativePath="..\..\Python\import.c">
- </File>
- <File
- RelativePath="..\..\Python\importdl.c">
- </File>
- <File
- RelativePath="..\..\Objects\iterobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\itertoolsmodule.c">
- </File>
- <File
- RelativePath="..\..\Parser\listnode.c">
- </File>
- <File
- RelativePath="..\..\Objects\listobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\longobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\main.c">
- </File>
- <File
- RelativePath="..\..\Python\marshal.c">
- </File>
- <File
- RelativePath="..\..\Modules\mathmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\md5module.c">
- </File>
- <File
- RelativePath="..\..\Parser\metagrammar.c">
- </File>
- <File
- RelativePath="..\..\Objects\memoryobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\methodobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\mmapmodule.c">
- </File>
- <File
- RelativePath="..\..\Python\modsupport.c">
- </File>
- <File
- RelativePath="..\..\Objects\moduleobject.c">
- </File>
- <File
- RelativePath="..\..\PC\msvcrtmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\cjkcodecs\multibytecodec.c">
- </File>
- <File
- RelativePath="..\..\Parser\myreadline.c">
- </File>
- <File
- RelativePath="..\..\Python\mysnprintf.c">
- </File>
- <File
- RelativePath="..\..\Python\mystrtoul.c">
- </File>
- <File
- RelativePath="..\..\Parser\node.c">
- </File>
- <File
- RelativePath="..\..\Objects\object.c">
- </File>
- <File
- RelativePath="..\..\Objects\obmalloc.c">
- </File>
- <File
- RelativePath="..\..\Modules\operator.c">
- </File>
- <File
- RelativePath="..\..\Parser\parser.c">
- </File>
- <File
- RelativePath="..\..\Modules\parsermodule.c">
- </File>
- <File
- RelativePath="..\..\Parser\parsetok.c">
- </File>
- <File
- RelativePath="..\..\Python\peephole.c">
- </File>
- <File
- RelativePath="..\..\Modules\posixmodule.c">
- </File>
- <File
- RelativePath="..\..\Python\pyarena.c">
- </File>
- <File
- RelativePath="..\..\Python\pyctype.c">
- </File>
- <File
- RelativePath="..\..\Python\pyfpe.c">
- </File>
- <File
- RelativePath="..\..\Python\pymath.c">
- </File>
- <File
- RelativePath="..\..\Python\pystate.c">
- </File>
- <File
- RelativePath="..\..\Python\pystrcmp.c"
- >
- </File>
- <File
- RelativePath="..\..\Python\pystrtod.c">
- </File>
- <File
- RelativePath="..\..\Python\pytime.c">
- </File>
- <File
- RelativePath="..\..\Python\Python-ast.c">
- </File>
- <File
- RelativePath="..\..\PC\python_nt.rc">
- </File>
- <File
- RelativePath="..\..\Python\pythonrun.c">
- </File>
- <File
- RelativePath="..\..\Python\random.c">
- </File>
- <File
- RelativePath="..\..\Objects\rangeobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\rotatingtree.c">
- </File>
- <File
- RelativePath="..\..\Objects\setobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\sha256module.c">
- </File>
- <File
- RelativePath="..\..\Modules\sha512module.c">
- </File>
- <File
- RelativePath="..\..\Modules\sha1module.c">
- </File>
- <File
- RelativePath="..\..\Modules\signalmodule.c">
- </File>
- <File
- RelativePath="..\..\Objects\sliceobject.c">
- </File>
- <File
- RelativePath="..\..\Python\structmember.c">
- </File>
- <File
- RelativePath="..\..\Objects\structseq.c">
- </File>
- <File
- RelativePath="..\..\Python\symtable.c">
- </File>
- <File
- RelativePath="..\..\Modules\symtablemodule.c">
- </File>
- <File
- RelativePath="..\..\Python\sysmodule.c">
- </File>
- <File
- RelativePath="..\..\Python\thread.c">
- </File>
- <File
- RelativePath="..\..\Modules\_threadmodule.c">
- </File>
- <File
- RelativePath="..\..\Modules\timemodule.c">
- </File>
- <File
- RelativePath="..\..\Parser\tokenizer.c">
- </File>
- <File
- RelativePath="..\..\Python\traceback.c">
- </File>
- <File
- RelativePath="..\..\Objects\tupleobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\typeobject.c">
- </File>
- <File
- RelativePath="..\..\Objects\unicodectype.c">
- </File>
- <File
- RelativePath="..\..\Objects\unicodeobject.c">
- </File>
- <File
- RelativePath="..\..\Pc\winreg.c">
- </File>
- <File
- RelativePath="..\..\Objects\weakrefobject.c">
- </File>
- <File
- RelativePath="..\..\Modules\xxsubtype.c">
- </File>
- <File
- RelativePath="..\..\Modules\zipimport.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/pythonw.vcproj b/PC/VS7.1/pythonw.vcproj
deleted file mode 100644
index 47d7f50..0000000
--- a/PC/VS7.1/pythonw.vcproj
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="pythonw"
- SccProjectName="pythonw"
- SccLocalPath="..\..\pc">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\pythonw"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./pythonw_d.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pythonw_d.pdb"
- SubSystem="2"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\pythonw"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile=".\./pythonw.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pythonw.pdb"
- SubSystem="2"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\ia64-temp-release\pythonw"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- OutputFile=".\./pythonw.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pythonw.pdb"
- SubSystem="2"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\pythonw"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- OutputFile=".\./pythonw.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./pythonw.pdb"
- SubSystem="2"
- StackReserveSize="2000000"
- BaseAddress="0x1d000000"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\PC\python_exe.rc">
- </File>
- <File
- RelativePath="..\..\PC\WinMain.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/readme.txt b/PC/VS7.1/readme.txt
deleted file mode 100644
index bfd8a70..0000000
--- a/PC/VS7.1/readme.txt
+++ /dev/null
@@ -1,337 +0,0 @@
-Building Python using VC++ 7.1
--------------------------------------
-This directory is used to build Python for Win32 platforms, e.g. Windows
-95, 98 and NT. It requires Microsoft Visual C++ 7.1
-(a.k.a. Visual Studio .NET 2003).
-(For other Windows platforms and compilers, see ../PC/readme.txt.)
-
-All you need to do is open the workspace "pcbuild.sln" in MSVC++, select
-the Debug or Release setting (using "Solution Configuration" from
-the "Standard" toolbar"), and build the projects.
-
-The proper order to build subprojects:
-
-1) pythoncore (this builds the main Python DLL and library files,
- python33.{dll, lib} in Release mode)
- NOTE: in previous releases, this subproject was
- named after the release number, e.g. python20.
-
-2) python (this builds the main Python executable,
- python.exe in Release mode)
-
-3) the other subprojects, as desired or needed (note: you probably don't
- want to build most of the other subprojects, unless you're building an
- entire Python distribution from scratch, or specifically making changes
- to the subsystems they implement, or are running a Python core buildbot
- test slave; see SUBPROJECTS below)
-
-When using the Debug setting, the output files have a _d added to
-their name: python33_d.dll, python_d.exe, parser_d.pyd, and so on.
-
-SUBPROJECTS
------------
-These subprojects should build out of the box. Subprojects other than the
-main ones (pythoncore, python, pythonw) generally build a DLL (renamed to
-.pyd) from a specific module so that users don't have to load the code
-supporting that module unless they import the module.
-
-pythoncore
- .dll and .lib
-python
- .exe
-pythonw
- pythonw.exe, a variant of python.exe that doesn't pop up a DOS box
-_socket
- socketmodule.c
-_testcapi
- tests of the Python C API, run via Lib/test/test_capi.py, and
- implemented by module Modules/_testcapimodule.c
-pyexpat
- Python wrapper for accelerated XML parsing, which incorporates stable
- code from the Expat project: http://sourceforge.net/projects/expat/
-select
- selectmodule.c
-unicodedata
- large tables of Unicode data
-winsound
- play sounds (typically .wav files) under Windows
-
-The following subprojects will generally NOT build out of the box. They
-wrap code Python doesn't control, and you'll need to download the base
-packages first and unpack them into siblings of PC's parent
-directory; for example, if this directory is ....\dist\trunk\PC\VS7.1,
-unpack into new subdirectories of dist\.
-
-_tkinter
- Python wrapper for the Tk windowing system. Requires building
- Tcl/Tk first. Following are instructions for Tcl/Tk 8.4.12.
-
- Get source
- ----------
- In the dist directory, run
- svn export http://svn.python.org/projects/external/tcl8.4.12
- svn export http://svn.python.org/projects/external/tk8.4.12
- svn export http://svn.python.org/projects/external/tix-8.4.0
-
- Build Tcl first (done here w/ MSVC 7.1 on Windows XP)
- ---------------
- Use "Start -> All Programs -> Microsoft Visual Studio .NET 2003
- -> Visual Studio .NET Tools -> Visual Studio .NET 2003 Command Prompt"
- to get a shell window with the correct environment settings
- cd dist\tcl8.4.12\win
- nmake -f makefile.vc
- nmake -f makefile.vc INSTALLDIR=..\..\tcltk install
-
- XXX Should we compile with OPTS=threads?
-
- Optional: run tests, via
- nmake -f makefile.vc test
-
- On WinXP Pro, wholly up to date as of 30-Aug-2004:
- all.tcl: Total 10678 Passed 9969 Skipped 709 Failed 0
- Sourced 129 Test Files.
-
- Build Tk
- --------
- cd dist\tk8.4.12\win
- nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12
- nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 INSTALLDIR=..\..\tcltk install
-
- XXX Should we compile with OPTS=threads?
-
- XXX Our installer copies a lot of stuff out of the Tcl/Tk install
- XXX directory. Is all of that really needed for Python use of Tcl/Tk?
-
- Optional: run tests, via
- nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 test
-
- On WinXP Pro, wholly up to date as of 30-Aug-2004:
- all.tcl: Total 8420 Passed 6826 Skipped 1581 Failed 13
- Sourced 91 Test Files.
- Files with failing tests: canvImg.test scrollbar.test textWind.test winWm.test
-
- Built Tix
- ---------
- cd dist\tix-8.4.0\win
- nmake -f python.mak
- nmake -f python.mak install
-
-bz2
- Python wrapper for the libbz2 compression library. Homepage
- http://sources.redhat.com/bzip2/
- Download the source from the python.org copy into the dist
- directory:
-
- svn export http://svn.python.org/projects/external/bzip2-1.0.3
-
- A custom pre-link step in the bz2 project settings should manage to
- build bzip2-1.0.3\libbz2.lib by magic before bz2.pyd (or bz2_d.pyd) is
- linked in VS7.1\.
- However, the bz2 project is not smart enough to remove anything under
- bzip2-1.0.3\ when you do a clean, so if you want to rebuild bzip2.lib
- you need to clean up bzip2-1.0.3\ by hand.
-
- The build step shouldn't yield any warnings or errors, and should end
- by displaying 6 blocks each terminated with
- FC: no differences encountered
-
- All of this managed to build bzip2-1.0.3\libbz2.lib, which the Python
- project links in.
-
-_sqlite3
- Python wrapper for SQLite library.
-
- Get the source code through
-
- svn export http://svn.python.org/projects/external/sqlite-source-3.3.4
-
- To use the extension module in a Python build tree, copy sqlite3.dll into
- the VS7.1 folder.
-
-_ssl
- Python wrapper for the secure sockets library.
-
- Get the source code through
-
- svn export http://svn.python.org/projects/external/openssl-0.9.8a
-
- Alternatively, get the latest version from http://www.openssl.org.
- You can (theoretically) use any version of OpenSSL you like - the
- build process will automatically select the latest version.
-
- You must also install ActivePerl from
- http://www.activestate.com/Products/ActivePerl/
- as this is used by the OpenSSL build process. Complain to them <wink>.
-
- The MSVC project simply invokes build_ssl.py to perform
- the build. This Python script locates and builds your OpenSSL
- installation, then invokes a simple makefile to build the final .pyd.
-
- build_ssl.py attempts to catch the most common errors (such as not
- being able to find OpenSSL sources, or not being able to find a Perl
- that works with OpenSSL) and give a reasonable error message.
- If you have a problem that doesn't seem to be handled correctly
- (eg, you know you have ActivePerl but we can't find it), please take
- a peek at build_ssl.py and suggest patches. Note that build_ssl.py
- should be able to be run directly from the command-line.
-
- build_ssl.py/MSVC isn't clever enough to clean OpenSSL - you must do
- this by hand.
-
-Building for Itanium
---------------------
-
-The project files support a ReleaseItanium configuration which creates
-Win64/Itanium binaries. For this to work, you need to install the Platform
-SDK, in particular the 64-bit support. This includes an Itanium compiler
-(future releases of the SDK likely include an AMD64 compiler as well).
-In addition, you need the Visual Studio plugin for external C compilers,
-from http://sf.net/projects/vsextcomp. The plugin will wrap cl.exe, to
-locate the proper target compiler, and convert compiler options
-accordingly. The project files require atleast version 0.9.
-
-Building for AMD64
-------------------
-
-The build process for the ReleaseAMD64 configuration is very similar
-to the Itanium configuration; make sure you use the latest version of
-vsextcomp.
-
-Building Python Using the free MS Toolkit Compiler
---------------------------------------------------
-
-The build process for Visual C++ can be used almost unchanged with the free MS
-Toolkit Compiler. This provides a way of building Python using freely
-available software.
-
-Note that Microsoft have withdrawn the free MS Toolkit Compiler, so this can
-no longer be considered a supported option. The instructions are still
-correct, but you need to already have a copy of the compiler in order to use
-them. Microsoft now supply Visual C++ 2008 Express Edition for free, but this
-is NOT compatible with Visual C++ 7.1 (it uses a different C runtime), and so
-cannot be used to build a version of Python compatible with the standard
-python.org build. If you are interested in using Visual C++ 2008 Express
-Edition, however, you should look at the PCBuild directory.
-
-Requirements
-
- To build Python, the following tools are required:
-
- * The Visual C++ Toolkit Compiler
- no longer available for download - see above
- * A recent Platform SDK
- from http://www.microsoft.com/downloads/details.aspx?FamilyID=484269e2-3b89-47e3-8eb7-1f2be6d7123a
- * The .NET 1.1 SDK
- from http://www.microsoft.com/downloads/details.aspx?FamilyID=9b3a2ca6-3647-4070-9f41-a333c6b9181d
-
- [Does anyone have better URLs for the last 2 of these?]
-
- The toolkit compiler is needed as it is an optimising compiler (the
- compiler supplied with the .NET SDK is a non-optimising version). The
- platform SDK is needed to provide the Windows header files and libraries
- (the Windows 2003 Server SP1 edition, typical install, is known to work -
- other configurations or versions are probably fine as well). The .NET 1.1
- SDK is needed because it contains a version of msvcrt.dll which links to
- the msvcr71.dll CRT. Note that the .NET 2.0 SDK is NOT acceptable, as it
- references msvcr80.dll.
-
- All of the above items should be installed as normal.
-
- If you intend to build the openssl (needed for the _ssl extension) you
- will need the C runtime sources installed as part of the platform SDK.
-
- In addition, you will need Nant, available from
- http://nant.sourceforge.net. The 0.85 release candidate 3 version is known
- to work. This is the latest released version at the time of writing. Later
- "nightly build" versions are known NOT to work - it is not clear at
- present whether future released versions will work.
-
-Setting up the environment
-
- Start a platform SDK "build environment window" from the start menu. The
- "Windows XP 32-bit retail" version is known to work.
-
- Add the following directories to your PATH:
- * The toolkit compiler directory
- * The SDK "Win64" binaries directory
- * The Nant directory
- Add to your INCLUDE environment variable:
- * The toolkit compiler INCLUDE directory
- Add to your LIB environment variable:
- * The toolkit compiler LIB directory
- * The .NET SDK Visual Studio 2003 VC7\lib directory
-
- The following commands should set things up as you need them:
-
- rem Set these values according to where you installed the software
- set TOOLKIT=C:\Program Files\Microsoft Visual C++ Toolkit 2003
- set SDK=C:\Program Files\Microsoft Platform SDK
- set NET=C:\Program Files\Microsoft Visual Studio .NET 2003
- set NANT=C:\Utils\Nant
-
- set PATH=%TOOLKIT%\bin;%PATH%;%SDK%\Bin\win64;%NANT%\bin
- set INCLUDE=%TOOLKIT%\include;%INCLUDE%
- set LIB=%TOOLKIT%\lib;%NET%\VC7\lib;%LIB%
-
- The "win64" directory from the SDK is added to supply executables such as
- "cvtres" and "lib", which are not available elsewhere. The versions in the
- "win64" directory are 32-bit programs, so they are fine to use here.
-
- That's it. To build Python (the core only, no binary extensions which
- depend on external libraries) you just need to issue the command
-
- nant -buildfile:python.build all
-
- from within the VS7.1 directory.
-
-Extension modules
-
- To build those extension modules which require external libraries
- (_tkinter, bz2, _sqlite3, _ssl) you can follow the instructions
- for the Visual Studio build above, with a few minor modifications. These
- instructions have only been tested using the sources in the Python
- subversion repository - building from original sources should work, but
- has not been tested.
-
- For each extension module you wish to build, you should remove the
- associated include line from the excludeprojects section of pc.build.
-
- The changes required are:
-
- _tkinter
- The tix makefile (tix-8.4.0\win\makefile.vc) must be modified to
- remove references to TOOLS32. The relevant lines should be changed to
- read:
- cc32 = cl.exe
- link32 = link.exe
- include32 =
- The remainder of the build instructions will work as given.
-
- bz2
- No changes are needed
-
- _sqlite3
- No changes are needed. However, in order for the tests to succeed, a
- copy of sqlite3.dll must be downloaded, and placed alongside
- python.exe.
-
- _ssl
- The documented build process works as written. However, it needs a
- copy of the file setargv.obj, which is not supplied in the platform
- SDK. However, the sources are available (in the crt source code). To
- build setargv.obj, proceed as follows:
-
- Copy setargv.c, cruntime.h and internal.h from %SDK%\src\crt to a
- temporary directory.
- Compile using "cl /c /I. /MD /D_CRTBLD setargv.c"
- Copy the resulting setargv.obj to somewhere on your LIB environment
- (%SDK%\lib is a reasonable place).
-
- With setargv.obj in place, the standard build process should work
- fine.
-
-YOUR OWN EXTENSION DLLs
------------------------
-If you want to create your own extension module DLL, there's an example
-with easy-to-follow instructions in ../PC/example/; read the file
-readme.txt there first.
diff --git a/PC/VS7.1/rmpyc.py b/PC/VS7.1/rmpyc.py
deleted file mode 100644
index 43c8576..0000000
--- a/PC/VS7.1/rmpyc.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Remove all the .pyc and .pyo files under ../Lib.
-
-
-def deltree(root):
- import os
- from os.path import join
-
- npyc = npyo = 0
- for root, dirs, files in os.walk(root):
- for name in files:
- delete = False
- if name.endswith('.pyc'):
- delete = True
- npyc += 1
- elif name.endswith('.pyo'):
- delete = True
- npyo += 1
-
- if delete:
- os.remove(join(root, name))
-
- return npyc, npyo
-
-npyc, npyo = deltree("../Lib")
-print npyc, ".pyc deleted,", npyo, ".pyo deleted"
diff --git a/PC/VS7.1/rt.bat b/PC/VS7.1/rt.bat
deleted file mode 100755
index a910a79..0000000
--- a/PC/VS7.1/rt.bat
+++ /dev/null
@@ -1,52 +0,0 @@
-@echo off
-rem Run Tests. Run the regression test suite.
-rem Usage: rt [-d] [-O] [-q] regrtest_args
-rem -d Run Debug build (python_d.exe). Else release build.
-rem -O Run python.exe or python_d.exe (see -d) with -O.
-rem -q "quick" -- normally the tests are run twice, the first time
-rem after deleting all the .py[co] files reachable from Lib/.
-rem -q runs the tests just once, and without deleting .py[co] files.
-rem All leading instances of these switches are shifted off, and
-rem whatever remains is passed to regrtest.py. For example,
-rem rt -O -d -x test_thread
-rem runs
-rem python_d -O ../../lib/test/regrtest.py -x test_thread
-rem twice, and
-rem rt -q -g test_binascii
-rem runs
-rem python_d ../../lib/test/regrtest.py -g test_binascii
-rem to generate the expected-output file for binascii quickly.
-rem
-rem Confusing: if you want to pass a comma-separated list, like
-rem -u network,largefile
-rem then you have to quote it on the rt line, like
-rem rt -u "network,largefile"
-
-setlocal
-
-set exe=python
-set qmode=
-set dashO=
-PATH %PATH%;%~dp0..\..\..\tcltk\bin
-
-:CheckOpts
-if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts
-if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts
-if "%1"=="-d" (set exe=python_d) & shift & goto CheckOpts
-
-set cmd=%exe% %dashO% -E ../../lib/test/regrtest.py %1 %2 %3 %4 %5 %6 %7 %8 %9
-if defined qmode goto Qmode
-
-echo Deleting .pyc/.pyo files ...
-%exe% rmpyc.py
-
-echo on
-%cmd%
-@echo off
-
-echo About to run again without deleting .pyc/.pyo first:
-pause
-
-:Qmode
-echo on
-%cmd%
diff --git a/PC/VS7.1/select.vcproj b/PC/VS7.1/select.vcproj
deleted file mode 100644
index 8252d45..0000000
--- a/PC/VS7.1/select.vcproj
+++ /dev/null
@@ -1,258 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="select"
- SccProjectName="select"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\select"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./select.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./select.pdb"
- SubSystem="2"
- BaseAddress="0x1D110000"
- ImportLibrary=".\./select.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\select"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;_DEBUG;WIN32;_WINDOWS"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./select_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc,msvcrt"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./select_d.pdb"
- SubSystem="2"
- BaseAddress="0x1D110000"
- ImportLibrary=".\./select_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\ia64-temp-release\select"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./select.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./select.pdb"
- SubSystem="2"
- BaseAddress="0x1D110000"
- ImportLibrary=".\./select.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\select"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;NDEBUG;WIN32;_WINDOWS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="./select.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- IgnoreDefaultLibraryNames="libc"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./select.pdb"
- SubSystem="2"
- BaseAddress="0x1D110000"
- ImportLibrary=".\./select.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\selectmodule.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/unicodedata.vcproj b/PC/VS7.1/unicodedata.vcproj
deleted file mode 100644
index 7f47f9b..0000000
--- a/PC/VS7.1/unicodedata.vcproj
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="unicodedata"
- SccProjectName="unicodedata"
- SccLocalPath="..">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\unicodedata"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./unicodedata.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./unicodedata.pdb"
- BaseAddress="0x1D120000"
- ImportLibrary=".\./unicodedata.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\unicodedata"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./unicodedata_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./unicodedata_d.pdb"
- BaseAddress="0x1D120000"
- ImportLibrary=".\./unicodedata_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\ia64-temp-release\unicodedata"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- OutputFile="./unicodedata.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./unicodedata.pdb"
- BaseAddress="0x1D120000"
- ImportLibrary=".\./unicodedata.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\unicodedata"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;MMAP_EXPORTS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- OutputFile="./unicodedata.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./unicodedata.pdb"
- BaseAddress="0x1D120000"
- ImportLibrary=".\./unicodedata.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\Modules\unicodedata.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/w9xpopen.vcproj b/PC/VS7.1/w9xpopen.vcproj
deleted file mode 100644
index b9f3b4e..0000000
--- a/PC/VS7.1/w9xpopen.vcproj
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="w9xpopen"
- SccProjectName=""
- SccLocalPath="">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\w9xpopen"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile="./w9xpopen_d.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./w9xpopen_d.pdb"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\w9xpopen"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- OutputFile=".\./w9xpopen.exe"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./w9xpopen.pdb"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\PC\w9xpopen.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS7.1/winsound.vcproj b/PC/VS7.1/winsound.vcproj
deleted file mode 100644
index bc4cf39..0000000
--- a/PC/VS7.1/winsound.vcproj
+++ /dev/null
@@ -1,251 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="winsound"
- SccProjectName="winsound"
- SccLocalPath="..\..\pc">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-debug\winsound"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;_DEBUG;_WINDOWS;_USRDLL;WINSOUND_EXPORTS"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="./winsound_d.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./winsound_d.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./winsound_d.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\x86-temp-release\winsound"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;WINSOUND_EXPORTS"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="./winsound.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./winsound.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./winsound.lib"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseItanium|Win32"
- OutputDirectory=".\."
- IntermediateDirectory=".\ia64-temp-release\winsound"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_ITANIUM /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;WINSOUND_EXPORTS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
- AdditionalDependencies="winmm.lib"
- OutputFile="./winsound.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./winsound.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./winsound.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="ReleaseAMD64|Win32"
- OutputDirectory="."
- IntermediateDirectory="amd64-temp-release\winsound"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /USECL:MS_OPTERON /GS-"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\Include,..\..\PC"
- PreprocessorDefinitions="Py_BUILD_CORE_MODULE;WIN32;NDEBUG;_WINDOWS;_USRDLL;WINSOUND_EXPORTS"
- StringPooling="TRUE"
- BasicRuntimeChecks="0"
- RuntimeLibrary="2"
- BufferSecurityCheck="FALSE"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
- AdditionalDependencies="winmm.lib"
- OutputFile="./winsound.pyd"
- LinkIncremental="1"
- SuppressStartupBanner="TRUE"
- ProgramDatabaseFile=".\./winsound.pdb"
- BaseAddress="0x1D160000"
- ImportLibrary=".\./winsound.lib"
- TargetMachine="0"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="..\..\PC\winsound.c">
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/PC/VS8.0/_ctypes.vcproj b/PC/VS8.0/_ctypes.vcproj
deleted file mode 100644